]> git.0d.be Git - mandayejs.git/commitdiff
don't hardcode site or user details
authorFrédéric Péters <fpeters@entrouvert.com>
Sun, 22 Mar 2015 19:11:12 +0000 (20:11 +0100)
committerFrédéric Péters <fpeters@entrouvert.com>
Sun, 22 Mar 2015 19:11:12 +0000 (20:11 +0100)
mandayejs/mandaye/admin.py
mandayejs/mandaye/migrations/0001_initial.py [new file with mode: 0644]
mandayejs/mandaye/models.py
mandayejs/mandaye/templates/mandaye/associate.html [new file with mode: 0644]
mandayejs/mandaye/views.py
mandayejs/urls.py

index 8c38f3f3dad51e4585f3984282c2a4bec5349c1e..1639f7c87304819183d60ad6fb69fff3e2683519 100644 (file)
@@ -1,3 +1,9 @@
 from django.contrib import admin
 
-# Register your models here.
+from .models import Site
+
+
+class SiteAdmin(admin.ModelAdmin):
+    prepopulated_fields = {'slug': ('title',)}
+
+admin.site.register(Site, SiteAdmin)
diff --git a/mandayejs/mandaye/migrations/0001_initial.py b/mandayejs/mandaye/migrations/0001_initial.py
new file mode 100644 (file)
index 0000000..1b02b94
--- /dev/null
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import models, migrations
+from django.conf import settings
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Site',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('title', models.CharField(max_length=50, verbose_name='Title')),
+                ('slug', models.SlugField(verbose_name='Slug')),
+                ('domain', models.CharField(max_length=200, verbose_name='Domain')),
+                ('username_locator', models.CharField(max_length=200, verbose_name='Username Locator')),
+                ('password_locator', models.CharField(max_length=200, verbose_name='Password Locator')),
+                ('login_path', models.CharField(max_length=200, verbose_name='Login Path')),
+            ],
+            options={
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='UserCredentials',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('username', models.CharField(max_length=50, verbose_name='Username')),
+                ('password', models.CharField(max_length=50, verbose_name='Password')),
+                ('site', models.ForeignKey(to='mandaye.Site')),
+                ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
+            ],
+            options={
+            },
+            bases=(models.Model,),
+        ),
+    ]
index 71a836239075aa6e6e4ecb700e9c42c95c022d91..00eef813c387c30900e36679c1442316382521fb 100644 (file)
@@ -1,3 +1,39 @@
+# mandayejs - saml reverse proxy
+# Copyright (C) 2015  Entr'ouvert
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Affero General Public License as published
+# by the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
 from django.db import models
+from django.utils.translation import ugettext_lazy as _
+
+
+class Site(models.Model):
+    title = models.CharField(_('Title'), max_length=50)
+    slug = models.SlugField(_('Slug'))
+
+    domain = models.CharField(_('Domain'), max_length=200)
+    username_locator = models.CharField(_('Username Locator'), max_length=200)
+    password_locator = models.CharField(_('Password Locator'), max_length=200)
+    login_path = models.CharField(_('Login Path'), max_length=200)
+
+    def __unicode__(self):
+        return self.title
+
+
+class UserCredentials(models.Model):
+    user = models.ForeignKey('auth.User')
+    site = models.ForeignKey(Site)
 
-# Create your models here.
+    username = models.CharField(_('Username'), max_length=50)
+    password = models.CharField(_('Password'), max_length=50)
diff --git a/mandayejs/mandaye/templates/mandaye/associate.html b/mandayejs/mandaye/templates/mandaye/associate.html
new file mode 100644 (file)
index 0000000..05ba859
--- /dev/null
@@ -0,0 +1,10 @@
+<html>
+<body>
+<h1>Associate</h1>
+<form method="post">
+{% csrf_token %}
+{{ form.as_p }}
+<input type="submit" value="Submit" />
+</form>
+</body>
+</html>
index ff1e0260ea8ded24f0efcd455176b448315abd9e..b01f534ceb67b3562c397c01c57fc1285a0eac4f 100644 (file)
@@ -23,9 +23,15 @@ from django.conf import settings
 from django.contrib.auth import views as auth_views
 from django.contrib.auth import logout as auth_logout
 from django.contrib.auth.decorators import login_required
+from django.forms import PasswordInput
+from django.forms import models as model_forms
 from django.http import HttpResponseRedirect
+from django.shortcuts import get_object_or_404, render, resolve_url
+from django.template import RequestContext
 from django.views.generic.base import TemplateView
 
+from .models import Site, UserCredentials
+
 
 def login(request, *args, **kwargs):
     return auth_views.login(request, *args, **kwargs)
@@ -41,25 +47,48 @@ class Panel(TemplateView):
 panel = Panel.as_view()
 
 
-class PostLogin(TemplateView):
-    template_name = 'mandaye/post-login.html'
+@login_required
+def post_login(request, *args, **kwargs):
+    site = get_object_or_404(Site, domain=request.get_host())
+    try:
+        credentials = UserCredentials.objects.get(
+                site=site,
+                user=request.user)
+    except UserCredentials.DoesNotExist:
+        return HttpResponseRedirect(resolve_url('associate'))
+
+    context = {}
+    context['address'] = request.build_absolute_uri(site.login_path)
+    return render(request, 'mandaye/post-login.html', context)
+
 
-    def get_context_data(self, **kwargs):
-        context = super(PostLogin, self).get_context_data(**kwargs)
-        context['address'] = self.request.build_absolute_uri('/login'),
-        return context
+@login_required
+def associate(request, *args, **kwargs):
+    form_class = model_forms.modelform_factory(UserCredentials,
+            fields=('username', 'password'),
+            widgets={'password': PasswordInput()})
+    if request.POST:
+        credentials = UserCredentials()
+        credentials.site = get_object_or_404(Site, domain=request.get_host())
+        credentials.user = request.user
+        form = form_class(request.POST,  instance=credentials)
+    else:
+        form = form_class()
+    if not form.is_valid():
+        return render(request, 'mandaye/associate.html', {'form': form})
+    credentials.save()
+    return HttpResponseRedirect(resolve_url('post-login'))
 
-post_login = login_required(PostLogin.as_view())
 
 def post_login_do(request, *args, **kwargs):
-    # XXX: this should come from both configuration (address and locators) and
-    # user database (credentials)
+    site = get_object_or_404(Site, domain=request.get_host())
+    credentials = get_object_or_404(UserCredentials, site=site, user=request.user)
     login_info = {
-            'username_locator': '#username',
-            'username_value': settings.MANDAYE_USERNAME,
-            'password_locator': '#password',
-            'password_value': settings.MANDAYE_PASSWORD,
-            'address': request.build_absolute_uri('/login'),
+            'username_locator': site.username_locator,
+            'username_value': credentials.username,
+            'password_locator': site.password_locator,
+            'password_value': credentials.password,
+            'address': request.build_absolute_uri(site.login_path),
             'cookies': [],
     }
     phantom = subprocess.Popen(['/usr/bin/phantomjs',
index e25b1083d75b8b52555e79d8f68da2379b1aa514..229ab0d6d3aa88af6ae48adcdd37189af1558dbd 100644 (file)
@@ -21,6 +21,7 @@ urlpatterns = patterns('',
     url(r'^_mandaye/panel$', 'mandayejs.mandaye.views.panel', name='panel'),
     url(r'^_mandaye/login/$', 'mandayejs.mandaye.views.login', name='auth_login'),
     url(r'^_mandaye/logout/$', 'mandayejs.mandaye.views.logout', name='auth_logout'),
+    url(r'^_mandaye/associate/$', 'mandayejs.mandaye.views.associate', name='associate'),
     url(r'^_mandaye/post-login/$', 'mandayejs.mandaye.views.post_login', name='post-login'),
     url(r'^_mandaye/post-login-do/$', 'mandayejs.mandaye.views.post_login_do', name='post-login-do'),