diff --git a/neuf_ldap/models.py b/neuf_ldap/models.py index 0158a08..c5fa2ea 100644 --- a/neuf_ldap/models.py +++ b/neuf_ldap/models.py @@ -41,7 +41,7 @@ class LdapUser(ldapdb.models.Model): shadowMin = CharField(db_column='shadowMin', default='8') shadowMax = CharField(db_column='shadowMax', default='999999') shadowWarning = CharField(db_column='shadowWarning', default='7') - shadowInactive = CharField(db_column='shadowInactive') + shadowInactive = CharField(db_column='shadowInactive') # FIXME what should this be? shadowExpire = CharField(db_column='shadowExpire', default='-1') shadowFlag = CharField(db_column='shadowFlag', default='0') diff --git a/neuf_ldap/utils.py b/neuf_ldap/utils.py index 3d23f30..6c63c31 100644 --- a/neuf_ldap/utils.py +++ b/neuf_ldap/utils.py @@ -4,12 +4,30 @@ from base64 import encodestring as encode from base64 import decodestring as decode import os.path + """ Ref: - http://www.openldap.org/faq/data/cache/347.html - http://www.openldap.org/doc/admin24/security.html """ +# TODO: Move this to settings file? +BASE_DN = "dc=neuf,dc=no" +KERBEROS_DN = "cn=krbcontainer,{}".format(BASE_DN) +AUTOMOUNT_DN = "ou=Automount,{}".format(BASE_DN) +USER_DN = "ou=People,{}".format(BASE_DN) +GROUP_DN = "ou=Groups,{}".format(BASE_DN) + +FILESERVER_HOST = "wii.neuf.no" +FILESERVER_HOME_PATH = "/fileserver/homes" + +UID_MIN = "10000" +UID_MAX = "100000" +GID_MIN = "9000" +GID_MAX = "9999" +USER_GID_MIN = "10000" +USER_GID_MAX = "100000" + def ldap_create(raw_password, hash_type='ssha'): # Generate a salted SHA1 hash @@ -37,4 +55,9 @@ def set_ldap_password(username, raw_password): user = LdapUser.objects.get(username=username) user.set_password(raw_password) except LdapUser.DoesNotExist: - pass \ No newline at end of file + pass + + +def create_ldap_user(user): + from neuf_ldap.models import LdapUser + u = LdapUser() \ No newline at end of file diff --git a/neuf_radius/utils.py b/neuf_radius/utils.py index 3e3740b..d95bd78 100644 --- a/neuf_radius/utils.py +++ b/neuf_radius/utils.py @@ -1,9 +1,10 @@ import hashlib + from neuf_radius.models import Radcheck def radius_create(raw_password): - # found in the wild. + # Found in the wild. nt_password = hashlib.new('md4', raw_password.encode('utf-16le')).hexdigest() return nt_password @@ -26,3 +27,6 @@ def set_radius_password(username, raw_password): radius_user.value = radius_create(raw_password) radius_user.save() + +def create_user(username, password): + set_radius_password(username, password) \ No newline at end of file diff --git a/neuf_userinfo/forms.py b/neuf_userinfo/forms.py index 0b43d15..fc80dee 100644 --- a/neuf_userinfo/forms.py +++ b/neuf_userinfo/forms.py @@ -1,8 +1,10 @@ # coding: utf-8 from __future__ import unicode_literals +from django.conf import settings from django.contrib.auth.forms import SetPasswordForm from django.contrib.auth.tokens import default_token_generator from django.contrib.sites.models import get_current_site +from django.core.exceptions import ValidationError from django.core.validators import MinLengthValidator from django import forms from django.template import loader @@ -16,7 +18,8 @@ from inside.utils import set_inside_password from neuf_kerberos.utils import set_kerberos_password from neuf_radius.utils import set_radius_password from neuf_ldap.utils import set_ldap_password -from neuf_userinfo.validators import PasswordValidator +from neuf_userinfo.utils import decrypt_rijndael +from neuf_userinfo.validators import PasswordValidator, UsernameValidator class NeufSetPasswordForm(SetPasswordForm): @@ -115,3 +118,29 @@ class NeufPasswordResetForm(forms.Form): else: html_email = None send_mail(subject, email, from_email, [user.email], html_message=html_email) + + +class NewUserForm(forms.Form): + username = forms.CharField(min_length=3, required=True) + firstname = forms.CharField(required=True) + lastname = forms.CharField(required=True) + email = forms.EmailField(required=True) + password = forms.CharField(min_length=8, required=True) + groups = forms.CharField(required=True) + + def clean_username(self): + username = self.cleaned_data['username'] + UsernameValidator(username) + + return username + + def clean_password(self): + raw_password = self.cleaned_data['password'] + password = decrypt_rijndael(settings.INSIDE_USERSYNC_ENC_KEY, raw_password) + PasswordValidator(password) + + return password + + def clean_groups(self): + groups = self.cleaned_data['groups'] + return groups.strip().split(',') diff --git a/neuf_userinfo/validators.py b/neuf_userinfo/validators.py index dcdc6c0..6fab7f2 100644 --- a/neuf_userinfo/validators.py +++ b/neuf_userinfo/validators.py @@ -4,3 +4,6 @@ import re # Passwords should not contain " password_re = re.compile(r'(?