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)
--- /dev/null
+# -*- 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,),
+ ),
+ ]
+# 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)
--- /dev/null
+<html>
+<body>
+<h1>Associate</h1>
+<form method="post">
+{% csrf_token %}
+{{ form.as_p }}
+<input type="submit" value="Submit" />
+</form>
+</body>
+</html>
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)
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',
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'),