Skip to content
Snippets Groups Projects
Forked from infrastruktur / warpinfra
20 commits behind the upstream repository.
register.py 4.24 KiB
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, ActivationToken, LdapGroup
from warpauth.util import *
from django.utils.translation import ugettext as _
from django.core.exceptions import ObjectDoesNotExist
from warpzone.settings import INSTANCE_NAME
from django.shortcuts import redirect

def send_token(token):
    email_content = _("https://infra.warpzone.ms/account/registration/activate/%(token)s") % {'token': token.token }
    ret = send_email(token.email, _("Your registration for WarpInfra"), email_content )
    return ret


def register(request):
    page_context['success'] = False
    if "INTERN" in INSTANCE_NAME:
        return redirect('http://infra.warpzone.ms/account/registration/')

    if request.method == "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:
            page_context["error"] = _("err_invalid_email_format")

        page_context["error"] = ""

        if username == "" or email == "" or password == "" or password2 == "":
            page_context['error'] = _("err_fill_all_fields")
        elif not re.search(r'^\w+$', username):
            page_context['error'] = _("err_invalid_username")
        elif password != password2:
            page_context['error'] = _("err_passwords_not_matching")
        elif not page_context["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 = username
                user.email = email
                user.uidNumber = "513"
                user.gidNumber = "100"
                user.homeDirectory = "/dev/null"
                user.save()
                ldap_connector = LDAPConnector()
                ldap_connector.change_user_password(user.build_dn(), None, request.POST["password"], 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:
                    page_context["error"] = _("err_sending_mail") #Error while sending the email. Please contact the administrator.
                else:
                    page_context['success'] = True
            else:
                page_context['error'] = _("err_username_not_available")

    return HttpResponse(render(request, 'warpauth/register/register.html', page_context))


def activate(request, token=None):
    if "INTERN" in INSTANCE_NAME:
        return redirect('http://infra.warpzone.ms/account/registration/')
    try:
        activation_token = ActivationToken.objects.get(token=token)
        group = LdapGroup.objects.filter(name="active").get()
        group.members.append("uid="+str(activation_token.user)+",ou=users,dc=warpzone,dc=ms")
        group.save()
        activation_token.delete()
    except ObjectDoesNotExist:
        page_context["error"] = _("err_token_invalid")

    return HttpResponse(render(request, 'warpauth/register/activate.html', page_context))

def resend_token(request):
    if "INTERN" in INSTANCE_NAME:
        return redirect('http://infra.warpzone.ms/account/registration/')
    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:
                    page_context["error"] = _("err_processing_request")
                page_context["success"] = True
        except ObjectDoesNotExist:
            page_context["error"] = _("err_processing_request")
            
    return HttpResponse(render(request, 'warpauth/register/resend_token.html', page_context))