This repository has been archived on 2026-10-23. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
neuf-userinfo/main/forms.py
T
2014-08-04 13:45:37 +02:00

96 lines
3.7 KiB
Python

# coding: utf-8
from django.contrib.auth.forms import SetPasswordForm, PasswordResetForm
from django.contrib.auth.tokens import default_token_generator
from django.contrib.sites.models import get_current_site
from django.core.validators import MinLengthValidator
from django import forms
from django.template import loader
from django.utils.encoding import force_bytes
from django.utils.http import urlsafe_base64_encode
from django.utils.translation import ugettext as _
import sys
from models import *
from validators import PasswordValidator
import utils
class LDAPSetPasswordForm(SetPasswordForm):
def save(self, commit=True):
# set kerberos password
set_krb5 = utils.set_kerberos_password(self.user.username, self.cleaned_data['new_password1'])
# set radius password
set_radius = utils.set_radius_password(self.user.username, self.cleaned_data['new_password1'])
# set inside password
set_inside = utils.set_inside_password(self.user.username, self.cleaned_data['new_password1'])
# Lookup the Ldap user with the identical username (1-to-1).
self.user = LdapUser.objects.get(username=self.user.username)
# set ldap password
self.user.set_password(self.cleaned_data['new_password1'])
if commit:
self.user.save()
# TODO: Log the result of the above.
return self.user
def clean_new_password1(self):
raw_password = self.cleaned_data.get('new_password1')
# Validation here
MinLengthValidator(8)(raw_password)
PasswordValidator(raw_password)
return raw_password
class LDAPPasswordChangeForm(LDAPSetPasswordForm):
pass
class LDAPPasswordResetForm(PasswordResetForm):
def clean_email(self):
email = self.cleaned_data["email"].lower()
self.users_cache = LdapUser.objects.filter(email=email)
if len(self.users_cache) == 0:
raise forms.ValidationError(_("That e-mail address doesn't have an associated user account. Are you sure you've registered?"))
return email
def save(self, domain_override=None,
subject_template_name='registration/password_reset_subject.txt',
email_template_name='registration/password_reset_email.html',
use_https=False, token_generator=default_token_generator,
from_email=None, request=None):
"""
Generates a one-use only link for resetting password and sends to the user.
Note: this is the same form as django.contrib.auth.forms.PasswordResetForm
with some changes for LDAP-lookup.
"""
from django.core.mail import send_mail
for user in self.users_cache:
if not domain_override:
current_site = get_current_site(request)
site_name = current_site.name
domain = current_site.domain
else:
site_name = domain = domain_override
c = {
'email': user.email,
'domain': domain,
'site_name': site_name,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'user': user,
'token': token_generator.make_token(user),
'protocol': 'https' if use_https else 'http',
}
subject = loader.render_to_string(subject_template_name, c)
# Email subject *must not* contain newlines
subject = ''.join(subject.splitlines())
email = loader.render_to_string(email_template_name, c)
if sys.version_info < (2, 6, 6):
# Workaround for http://bugs.python.org/issue1368247 ?
email = email.encode('utf-8')
send_mail(subject, email, from_email, [user.email])