Skip to content
Snippets Groups Projects
Commit d7f52fea authored by Christian Dresen's avatar Christian Dresen
Browse files

[WarpAuth] Send activation link feature

parent 64a64de8
No related branches found
No related tags found
No related merge requests found
...@@ -52,5 +52,6 @@ ...@@ -52,5 +52,6 @@
</form> </form>
</div> </div>
<a class="btn" href="/reset_password">{% trans "Forgot Password?" %}</a><br> <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 %} {% endblock %}
\ No newline at end of file
from django.contrib import admin from django.contrib import admin
# Register your models here. # Register your models here.
from warpauth.models import PasswordResetToken, LdapUser from warpauth.models import PasswordResetToken, LdapUser, ActivationToken
@admin.register(PasswordResetToken) @admin.register(PasswordResetToken)
class PasswordResetTokenAdmin(admin.ModelAdmin): class PasswordResetTokenAdmin(admin.ModelAdmin):
pass pass
@admin.register(ActivationToken)
class ActivationTokenAdmin(admin.ModelAdmin):
pass
@admin.register(LdapUser) @admin.register(LdapUser)
class LdapUserAdmin(admin.ModelAdmin): class LdapUserAdmin(admin.ModelAdmin):
pass pass
\ No newline at end of file
...@@ -12,6 +12,17 @@ class PasswordResetToken(models.Model): ...@@ -12,6 +12,17 @@ class PasswordResetToken(models.Model):
def __str__(self): def __str__(self):
return self.hash 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 # LDAP
...@@ -42,7 +53,7 @@ class LdapUserForm(ModelForm): ...@@ -42,7 +53,7 @@ class LdapUserForm(ModelForm):
class LdapGroup(ldapdb.models.Model): class LdapGroup(ldapdb.models.Model):
base_dn = "ou=groups,dc=nodomain,dc=org" base_dn = "ou=groups,dc=warpzone,dc=ms"
object_classes = ['posixGroup'] object_classes = ['posixGroup']
gid = IntegerField(db_column='gidNumber', unique=True) gid = IntegerField(db_column='gidNumber', unique=True)
......
{% 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 %}
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
{% endif %} {% endif %}
<label for="inputUser">{% trans "Username" %}</label> <label for="inputUser">{% trans "Username" %}</label>
<input name="username" type="user" id="inputUser" class="form-control" placeholder="{% trans "Username" %}" required autofocus><br> <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> <input name="email" type="email" id="inputEmail" class="form-control" placeholder="{% trans "Email" %}" required><br>
<label for="inputPassword">{% trans "Password" %}</label> <label for="inputPassword">{% trans "Password" %}</label>
<input name="password" type="password" id="inputPassword" class="form-control" placeholder="{% trans "Password" %}" required><br> <input name="password" type="password" id="inputPassword" class="form-control" placeholder="{% trans "Password" %}" required><br>
......
{% 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 %}
...@@ -9,10 +9,12 @@ from warpauth.views import login, reset_password, profile, register ...@@ -9,10 +9,12 @@ from warpauth.views import login, reset_password, profile, register
urlpatterns = [ urlpatterns = [
# Authentication Pages # Authentication Pages
url(r'', include('two_factor.urls', 'two_factor')), url(r'', include('two_factor.urls', 'two_factor')),
url(r'^logout/$', login.logout_view, name='logout'), url(r'^account/logout/$', login.logout_view, name='logout'),
url(r'^register/$', register.register, name='register'), url(r'^account/registration/$', register.register, name='register'),
url(r'^reset_password/$', reset_password.gen_token, name='reset_password'), 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'^reset_password/(?P<reset_hash>\w+)/$', reset_password.change_password, name='index'),
url(r'^profile/$', profile.index, name='index'), url(r'^profile/$', profile.index, name='index'),
......
import re import re
import hashlib
import os
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django import forms from django import forms
from django.shortcuts import render from django.shortcuts import render
from django.http import HttpResponse from django.http import HttpResponse
from warpauth.ldap_connector import LDAPConnector from warpauth.ldap_connector import LDAPConnector
from warpauth.models import LdapUser from warpauth.models import LdapUser, ActivationToken, LdapGroup
from warpauth.util import * 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): def register(request):
pages['success'] = False pages['success'] = False
pages['error'] = False pages['error'] = False
...@@ -43,8 +53,47 @@ def register(request): ...@@ -43,8 +53,47 @@ def register(request):
user.save() user.save()
ldap_connector = LDAPConnector() ldap_connector = LDAPConnector()
ldap_connector.change_user_password(user.build_dn(), None, request.POST["password"], True) 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: else:
pages['error'] = "username_not_available" 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))
...@@ -69,9 +69,9 @@ INSTALLED_APPS = ( ...@@ -69,9 +69,9 @@ INSTALLED_APPS = (
'warpauth', 'warpauth',
'warpfood', 'warpfood',
# WARPPAY # WARPPAY
# 'rest_framework', # 'rest_framework',
# 'rest_framework.authtoken', # 'rest_framework.authtoken',
# 'warppay' # 'warppay'
) )
MIDDLEWARE_CLASSES = ( MIDDLEWARE_CLASSES = (
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment