From 2e9b1f434478209b3644c3b3a43a25968d9720d2 Mon Sep 17 00:00:00 2001 From: Christian Dresen <c.dresen@fh-muenster.de> Date: Sun, 10 Jan 2016 01:34:02 +0100 Subject: [PATCH] Register and Personal Data --- web/warpauth/models.py | 15 +++++- web/warpauth/templates/warpauth/login.html | 37 ++++++++------- .../warpauth/profile/information.html | 15 +++++- web/warpauth/templates/warpauth/register.html | 47 +++++++++++++++++++ web/warpauth/urls.py | 7 ++- web/warpauth/views/login.py | 2 - web/warpauth/views/profile.py | 41 +++++++++++++++- web/warpauth/views/register.py | 45 ++++++++++++++++++ web/warpzone/settings.py | 1 - 9 files changed, 183 insertions(+), 27 deletions(-) create mode 100644 web/warpauth/templates/warpauth/register.html create mode 100644 web/warpauth/views/register.py diff --git a/web/warpauth/models.py b/web/warpauth/models.py index 5d7b8d0..0c96461 100644 --- a/web/warpauth/models.py +++ b/web/warpauth/models.py @@ -1,6 +1,7 @@ from django.db import models from ldapdb.models.fields import CharField, IntegerField, ListField import ldapdb.models +from django.forms import ModelForm class PasswordResetToken(models.Model): @@ -13,11 +14,15 @@ class PasswordResetToken(models.Model): class LdapUser(ldapdb.models.Model): - base_dn = "ou=user,dc=warpzone,dc=ms" - object_classes = ['posixAccount', 'shadowAccount', 'uidObject', 'account'] + base_dn = "ou=people,dc=warpzone,dc=ms" + object_classes = ['person', 'organizationalPerson', 'inetOrgPerson'] uid = CharField(db_column='uid', unique=True, primary_key=True) + first_name = CharField(db_column='givenName', max_length=200) + last_name = CharField(db_column='sn', max_length=200) email = CharField(db_column='description', max_length=200) + cn = CharField(db_column='cn', max_length=200) + def __str__(self): return self.uid @@ -26,6 +31,12 @@ class LdapUser(ldapdb.models.Model): return self.uid +class LdapUserForm(ModelForm): + class Meta: + model = LdapUser + fields = ['first_name', 'last_name', 'email'] + + class LdapGroup(ldapdb.models.Model): base_dn = "ou=groups,dc=nodomain,dc=org" object_classes = ['posixGroup'] diff --git a/web/warpauth/templates/warpauth/login.html b/web/warpauth/templates/warpauth/login.html index 2c0fc07..55ec5c1 100644 --- a/web/warpauth/templates/warpauth/login.html +++ b/web/warpauth/templates/warpauth/login.html @@ -2,22 +2,25 @@ {% load i18n %} {% block content %} - <form class="form-signin" style="max-width: 330px; margin: 0 auto; padding: 40px"> - {% csrf_token %} - <h2 class="form-signin-heading">{% trans "Please sign in" %}</h2> - <label for="inputUser">{% trans "Username" %}</label> - <input name="username" type="user" id="inputUser" class="form-control" placeholder="{% trans "Username" %}" required autofocus> - <label for="inputPassword" style="padding-top:10px;">{% trans "Password" %}</label> - <input name="password" type="password" id="inputPassword" class="form-control" placeholder="{% trans "Password" %}" required> - {% if fail == True %} - <div class="alert alert-warning alert-dismissible" role="alert"> - <strong>{% trans "Invalid email or password." %}</strong> - </div> - {% else %} - <br> - {% endif %} - <button class="btn btn-lg btn-primary btn-block" type="submit" formmethod="post" class="btn btn-default">{% trans "Sign in" %}</button> - <a class="btn" href="/reset_password">{% trans "Forgot Password?" %}</a> - </form> + <form class="form-signin" style="max-width: 330px; margin: 0 auto; padding: 40px"> + {% csrf_token %} + <h2 class="form-signin-heading">{% trans "Please sign in" %}</h2> + <label for="inputUser">{% trans "Username" %}</label> + <input name="username" type="user" id="inputUser" class="form-control" placeholder="{% trans "Username" %}" required autofocus> + + <label for="inputPassword" style="padding-top:10px;">{% trans "Password" %}</label> + <input name="password" type="password" id="inputPassword" class="form-control" placeholder="{% trans "Password" %}" required> + {% if fail == True %} + <div class="alert alert-warning alert-dismissible" role="alert"> + <strong>{% trans "Invalid email or password." %}</strong> + </div> + {% else %} + <br> + {% endif %} + <button class="btn btn-lg btn-primary btn-block" type="submit" formmethod="post" class="btn btn-default">{% trans "Sign in" %}</button> + <a class="btn" href="/reset_password">{% trans "Forgot Password?" %}</a><br> + <a class="btn" href="/register">{% trans "Register" %}</a> + </form> + {% endblock %} diff --git a/web/warpauth/templates/warpauth/profile/information.html b/web/warpauth/templates/warpauth/profile/information.html index 99627ce..438dc5e 100644 --- a/web/warpauth/templates/warpauth/profile/information.html +++ b/web/warpauth/templates/warpauth/profile/information.html @@ -1,9 +1,22 @@ {% load i18n %} - +{% load bootstrap %} <div> <br/> <p class="lead">{% trans "Groups" %}</p><p /> + <div class="panel panel-default"> + <div class="panel-body"> + <form class="form-horizontal" action="/profile/change_information/" method="POST" role="form"> + {{ ldap_user_form | bootstrap_horizontal }} + <div class="form-group"> + <div class="col-sm-offset-2 col-sm-10"> + {% csrf_token %} + <button style="float: left" type="submit" formmethod="post" class="btn btn-primary">{% trans "Submit" %}</button> + </div> + </div> + </form> + </div> + </div> <div class="panel panel-default"> <div class="panel-body"> <table class="table"> diff --git a/web/warpauth/templates/warpauth/register.html b/web/warpauth/templates/warpauth/register.html new file mode 100644 index 0000000..7a75ec9 --- /dev/null +++ b/web/warpauth/templates/warpauth/register.html @@ -0,0 +1,47 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block content %} + {% if success %} + <div class="alert alert-success"> + {% blocktrans %} + User successfully created. Please wait for your activation. + {% endblocktrans %} + </div> + <br> + <a class="btn" href="/">{% trans "Back" %}</a> + {% else %} + + <form class="form" style="max-width: 330px; margin: 0 auto; padding: 40px"> + {% csrf_token %} + <h2 class="form">{% trans "Please register" %}</h2> + {% if error %} + <div class="alert alert-warning alert-dismissible" role="alert"> + <strong> + {% if error == "username_not_available" %} + {% trans "This username is not available" %} + {% elif error == "passwords_did_not_match" %} + {% trans "The passwords did not match" %} + {% elif error == "invalid_email" %} + {% trans "The Email adress is invalid." %} + {% elif error == "fill_all_fields" %} + {% trans "Please fill all fields." %} + {% endif %} + </strong> + </div> + {% else %} + <br> + {% endif %} + <label for="inputUser">{% trans "Username" %}</label> + <input name="username" type="user" id="inputUser" class="form-control" placeholder="{% trans "Username" %}" required autofocus><br> + <label for="inputUser">{% trans "Email" %}</label> + <input name="email" type="email" id="inputEmail" class="form-control" placeholder="{% trans "Email" %}" required><br> + <label for="inputPassword">{% trans "Password" %}</label> + <input name="password" type="password" id="inputPassword" class="form-control" placeholder="{% trans "Password" %}" required><br> + <label for="inputPassword2">{% trans "Confirm" %}</label> + <input name="password2" type="password" id="inputPassword2" class="form-control" placeholder="{% trans "Confirm" %}" required><br> + <button class="btn btn-lg btn-primary btn-block" type="submit" formmethod="post" class="btn btn-default">{% trans "Register" %}</button> + + </form> + {% endif %} +{% endblock %} diff --git a/web/warpauth/urls.py b/web/warpauth/urls.py index 43e8545..1bec8ca 100644 --- a/web/warpauth/urls.py +++ b/web/warpauth/urls.py @@ -1,6 +1,6 @@ from django.conf.urls import url -from warpauth.views import main, login, reset_password, profile -from warpauth.views.admin import dashboard +from warpauth.views import login, reset_password, profile, register + # # Definition of all available URLS for accessing Functions integrated in WarpAuth # @@ -10,11 +10,14 @@ urlpatterns = [ # Authentication Pages url(r'^login/$', login.login_view, name='index'), url(r'^logout/$', login.logout_view, name='index'), + url(r'^register/$', register.register, name='index'), url(r'^reset_password/$', reset_password.gen_token, name='index'), url(r'^reset_password/(?P<reset_hash>\w+)/$', reset_password.change_password, name='index'), url(r'^profile/$', profile.index, name='index'), url(r'^profile/change_password/$', profile.change_password, name='change_password'), + url(r'^profile/change_information/$', profile.change_information, name='change_information'), + ] diff --git a/web/warpauth/views/login.py b/web/warpauth/views/login.py index 7bc07bc..42841b2 100644 --- a/web/warpauth/views/login.py +++ b/web/warpauth/views/login.py @@ -33,5 +33,3 @@ def login_view(request): def logout_view(request): logout(request) return redirect('/login/') - - diff --git a/web/warpauth/views/profile.py b/web/warpauth/views/profile.py index a68bdf7..6dbc13a 100644 --- a/web/warpauth/views/profile.py +++ b/web/warpauth/views/profile.py @@ -1,9 +1,11 @@ +from django.core.exceptions import ValidationError +from django import forms from django.shortcuts import render from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotAllowed, HttpResponseNotFound from django.shortcuts import redirect from django.contrib.auth.decorators import login_required from warpauth.ldap_connector import LDAPConnector -from warpauth.models import LdapUser +from warpauth.models import LdapUser, LdapUserForm from warpauth.util import * @@ -17,16 +19,51 @@ def index(request): pages["error"] = "" pages["success"] = False pages['ldap_groups'] = request.user.ldap_user.group_names + pages['ldap_user_form'] = LdapUserForm(instance=LdapUser.objects.get(uid=str(request.user))) return HttpResponse(render(request, 'warpauth/profile.html', pages)) +@login_required(login_url='/login/', redirect_field_name=None) +def change_information(request): + pages["error"] = "" + if request.method != 'POST': + return redirect("/profile") + + user = LdapUser.objects.get(uid=str(request.user)) + first_name = request.POST["first_name"] + last_name = request.POST["last_name"] + email = request.POST["email"] + + f = forms.EmailField() + try: + f.clean(email) + except ValidationError as e: + pages["error"] = "Invalid Email" + return redirect("/profile") + cn = first_name + " " + last_name + cn = cn.strip() + if first_name == "": + first_name = "None" + if last_name == "": + last_name = "None" + if cn == "": + cn = "None" + user.first_name = first_name + user.last_name = last_name + user.cn = cn + user.email = email + user.save() + + return redirect("/profile") + + @login_required(login_url='/login/', redirect_field_name=None) def change_password(request): pages["error"] = "" pages["success"] = False if request.method != 'POST': - redirect("/") + return redirect("/") if "old_pw" not in request.POST or "new_pw" not in request.POST or "new_pw_confirm" not in request.POST: pages["error"] = "Please fill in all fields" diff --git a/web/warpauth/views/register.py b/web/warpauth/views/register.py new file mode 100644 index 0000000..c5d8431 --- /dev/null +++ b/web/warpauth/views/register.py @@ -0,0 +1,45 @@ +from django.core.exceptions import ValidationError +from django import forms +from django.shortcuts import render +from django.http import HttpResponse +from warpauth.ldap_connector import LDAPConnector +from warpauth.models import LdapUser +from warpauth.util import * + +def register(request): + pages['success'] = False + pages['error'] = False + + if request.method == "POST": + print(request.POST) + username = request.POST['username'] + password = request.POST['password'] + password2 = request.POST['password2'] + email = request.POST['email'] + f = forms.EmailField() + try: + f.clean(email) + except ValidationError as e: + pages["error"] = "invalid_email" + + if username == "" or email == "" or password == "" or password2 == "": + pages['error'] = "fill_all_fields" + elif password != password2: + pages['error'] = "passwords_did_not_match" + elif not pages["error"]: + u = LdapUser.objects.filter(uid=username) + if u.count() == 0: + user = LdapUser() + user.uid = username + user.first_name = "None" + user.last_name = "None" + user.cn = "None" + user.email = email + user.save() + ldap_connector = LDAPConnector() + ldap_connector.change_user_password(user.build_dn(), None, request.POST["password"], True) + pages['success'] = True + else: + pages['error'] = "username_not_available" + + return HttpResponse(render(request, 'warpauth/register.html', pages)) diff --git a/web/warpzone/settings.py b/web/warpzone/settings.py index fdbc999..1cc6017 100644 --- a/web/warpzone/settings.py +++ b/web/warpzone/settings.py @@ -103,7 +103,6 @@ DATABASES = { }, 'ldap': { 'ENGINE': 'ldapdb.backends.ldap', - #'NAME': 'ldap://s1.dyhost.de/', 'NAME': 'ldap://ldap/', 'USER': 'cn=admin,dc=warpzone,dc=ms', 'PASSWORD': '12345', -- GitLab