diff --git a/www/web/templates/two_factor/core/login.html b/www/web/templates/two_factor/core/login.html index d545b977a12c108ec6f81646d0a48e2dc1dfaa4f..0d36ba517b2f3dbdbdcf4cb3e8057091b125c751 100644 --- a/www/web/templates/two_factor/core/login.html +++ b/www/web/templates/two_factor/core/login.html @@ -52,5 +52,6 @@ </form> </div> <a class="btn" href="/reset_password">{% trans "Forgot Password?" %}</a><br> -<a class="btn" href="/register">{% trans "Register" %}</a> +<a class="btn" href="/account/registration/">{% trans "Register" %}</a><br> +<a class="btn" href="/account/registration/resend">{% trans "Resend Activation Link" %}</a> {% endblock %} \ No newline at end of file diff --git a/www/web/warpauth/admin.py b/www/web/warpauth/admin.py index 52146bcf70acf8edccd27d683178ec3531ca0762..f0e80bb17c435ac50335e496b09f9ad789cc9dff 100644 --- a/www/web/warpauth/admin.py +++ b/www/web/warpauth/admin.py @@ -1,13 +1,17 @@ from django.contrib import admin # Register your models here. -from warpauth.models import PasswordResetToken, LdapUser +from warpauth.models import PasswordResetToken, LdapUser, ActivationToken @admin.register(PasswordResetToken) class PasswordResetTokenAdmin(admin.ModelAdmin): pass +@admin.register(ActivationToken) +class ActivationTokenAdmin(admin.ModelAdmin): + pass + @admin.register(LdapUser) class LdapUserAdmin(admin.ModelAdmin): pass \ No newline at end of file diff --git a/www/web/warpauth/models.py b/www/web/warpauth/models.py index 18108bdf30dc15ce0f26473aaabffa1774885201..2d1096947077d94c883a567c040c4479377ebc3d 100644 --- a/www/web/warpauth/models.py +++ b/www/web/warpauth/models.py @@ -12,6 +12,17 @@ class PasswordResetToken(models.Model): def __str__(self): return self.hash + +class ActivationToken(models.Model): + user = models.CharField(max_length=100) + email = models.CharField(max_length=100) + token = models.CharField(max_length=100) + created = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return self.token + + # LDAP @@ -42,7 +53,7 @@ class LdapUserForm(ModelForm): class LdapGroup(ldapdb.models.Model): - base_dn = "ou=groups,dc=nodomain,dc=org" + base_dn = "ou=groups,dc=warpzone,dc=ms" object_classes = ['posixGroup'] gid = IntegerField(db_column='gidNumber', unique=True) diff --git a/www/web/warpauth/templates/warpauth/register/activate.html b/www/web/warpauth/templates/warpauth/register/activate.html new file mode 100644 index 0000000000000000000000000000000000000000..9a8eddb0b6efb251daab27422cae69d90dc0fadd --- /dev/null +++ b/www/web/warpauth/templates/warpauth/register/activate.html @@ -0,0 +1,23 @@ +{% extends "base.html" %} +{% load i18n %} +{% block title %}{% trans "Activation" %}{% endblock %} + +{% block content %} + {% if token_error %} + <div class="alert alert-danger"> + {% blocktrans %} + The Token you have provided is invalid. + {% endblocktrans %} + </div> + <br> + <a class="btn" href="/">{% trans "Back" %}</a> + {% else %} + <div class="alert alert-success"> + {% blocktrans %} + Your Account was successfully activated. + {% endblocktrans %} + </div> + <br> + <a class="btn" href="/">{% trans "Ok" %}</a> + {% endif %} +{% endblock %} diff --git a/www/web/warpauth/templates/warpauth/register.html b/www/web/warpauth/templates/warpauth/register/register.html similarity index 97% rename from www/web/warpauth/templates/warpauth/register.html rename to www/web/warpauth/templates/warpauth/register/register.html index 8d6e6d5af579aa6fcab3350e250b351e271599ce..ef7f4f0f0b78365a23162690e331bd40dd2dd430 100644 --- a/www/web/warpauth/templates/warpauth/register.html +++ b/www/web/warpauth/templates/warpauth/register/register.html @@ -36,7 +36,7 @@ {% 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> + <label for="inputEmail">{% 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> diff --git a/www/web/warpauth/templates/warpauth/register/resend_token.html b/www/web/warpauth/templates/warpauth/register/resend_token.html new file mode 100644 index 0000000000000000000000000000000000000000..584d19ef620ffcfe36574eb95058b14c17c4247e --- /dev/null +++ b/www/web/warpauth/templates/warpauth/register/resend_token.html @@ -0,0 +1,28 @@ +{% extends "base.html" %} +{% load i18n %} +{% block title %}{% trans "Registration" %}{% endblock %} +{% block content %} + {% if error %} + <div class="alert alert-danger"> + {% blocktrans %} + Error processing your request. Please contact the administrator. + {% endblocktrans %} + </div> + {% elif success %} + <div class="alert alert-success"> + {% blocktrans %} + Email resended + {% endblocktrans %} + </div> + {% endif %} + <form class="form" style="max-width: 330px; margin: 0 auto; padding: 40px"> + {% csrf_token %} + <h2 class="form">{% trans "Resend token" %}</h2> + <br> + <label for="inputUser">{% trans "Username" %}</label> + <input name="username" type="user" id="inputUser" class="form-control" placeholder="{% trans "Username" %}" required autofocus><br> + <label for="inputEmail">{% trans "Email" %}</label> + <input name="email" type="email" id="inputEmail" class="form-control" placeholder="{% trans "Email" %}" required><br> + <button class="btn btn-lg btn-primary btn-block" type="submit" formmethod="post" class="btn btn-default">{% trans "Resend" %}</button> + </form> +{% endblock %} diff --git a/www/web/warpauth/urls.py b/www/web/warpauth/urls.py index 2e38924105deaacac97628aa30395f110d255fdf..4c294b47194c29431b5448e26287a44469e03dcb 100644 --- a/www/web/warpauth/urls.py +++ b/www/web/warpauth/urls.py @@ -9,10 +9,12 @@ from warpauth.views import login, reset_password, profile, register urlpatterns = [ # Authentication Pages url(r'', include('two_factor.urls', 'two_factor')), - url(r'^logout/$', login.logout_view, name='logout'), - url(r'^register/$', register.register, name='register'), - url(r'^reset_password/$', reset_password.gen_token, name='reset_password'), + url(r'^account/logout/$', login.logout_view, name='logout'), + url(r'^account/registration/$', register.register, name='register'), + url(r'^account/registration/activate/(?P<token>\w+)/$', register.activate, name='activate'), + url(r'^account/registration/resend/$', register.resend_token, name='resend_token'), + url(r'^reset_password/$', reset_password.gen_token, name='reset_password'), url(r'^reset_password/(?P<reset_hash>\w+)/$', reset_password.change_password, name='index'), url(r'^profile/$', profile.index, name='index'), diff --git a/www/web/warpauth/views/register.py b/www/web/warpauth/views/register.py index 4f851ef7b7864e7670144a25be8cea515b542d16..708885c20d7dc2475075c07281cf3f8773fe3f86 100644 --- a/www/web/warpauth/views/register.py +++ b/www/web/warpauth/views/register.py @@ -1,12 +1,22 @@ import re +import hashlib +import os 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.models import LdapUser, ActivationToken, LdapGroup from warpauth.util import * +from django.utils.translation import ugettext as _ +from django.core.exceptions import ObjectDoesNotExist + +def send_token(token): + email_content = _("https://infra.warpzone.ms/activate/%(token)s") % {'token': token.token } + ret = send_email(token.email, _("Your registration for WarpInfra"), email_content ) + return ret + def register(request): pages['success'] = False pages['error'] = False @@ -43,8 +53,47 @@ def register(request): user.save() ldap_connector = LDAPConnector() ldap_connector.change_user_password(user.build_dn(), None, request.POST["password"], True) - pages['success'] = True + token = ActivationToken() + token.user = username + token.email = email + token.token = hashlib.sha1(os.urandom(128)).hexdigest() + token.save() + ret = send_token(token) + if not ret: + pages["error"] = "Error while sending the email. Please contact the administrator." + else: + pages['success'] = True else: pages['error'] = "username_not_available" - return HttpResponse(render(request, 'warpauth/register.html', pages)) + return HttpResponse(render(request, 'warpauth/register/register.html', pages)) + + +def activate(request, token=None): + pages["token_error"] = False + try: + activation_token = ActivationToken.objects.get(token=token) + group = LdapGroup.objects.filter(name="active").get() + group.members.append(activation_token.user) + group.save() + activation_token.delete() + except ObjectDoesNotExist: + pages["token_error"] = True + + return HttpResponse(render(request, 'warpauth/register/activate.html', pages)) + +def resend_token(request): + pages["error"] = False + pages["success"] = False + if request.method == "POST": + try: + token = ActivationToken.objects.get(user=request.POST["username"]) + if token.email == request.POST["email"]: + ret = send_token(token) + if not ret: + pages["error"] = True + pages["success"] = True + except ObjectDoesNotExist: + pages["error"] = True + + return HttpResponse(render(request, 'warpauth/register/resend_token.html', pages)) diff --git a/www/web/warpzone/settings.py b/www/web/warpzone/settings.py index 82d9c3fdf8ef3a2c00030d07e29709aaa752a061..18260803d4579b4dc19ca877b2f8a35fb19c713b 100644 --- a/www/web/warpzone/settings.py +++ b/www/web/warpzone/settings.py @@ -69,9 +69,9 @@ INSTALLED_APPS = ( 'warpauth', 'warpfood', # WARPPAY -# 'rest_framework', -# 'rest_framework.authtoken', -# 'warppay' + # 'rest_framework', + # 'rest_framework.authtoken', + # 'warppay' ) MIDDLEWARE_CLASSES = (