Use a Form object for validation, misc fixes

This commit is contained in:
nikolark committed 2015-02-17 22:33:17 +01:00
1 parent 8b7119d931
commit d8f4d47ae4
6 files changed
+76 -27

No files matched your search

+1 -1
View File
@@ -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')
+24 -1
View File
@@ -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
pass
def create_ldap_user(user):
from neuf_ldap.models import LdapUser
u = LdapUser()
+5 -1
View File
@@ -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)
+30 -1
View File
@@ -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(',')
+3
View File
@@ -4,3 +4,6 @@ import re
# Passwords should not contain "
password_re = re.compile(r'(?<!\")', re.IGNORECASE)
PasswordValidator = RegexValidator(password_re, u'Enter a valid password')
username_re = re.compile(r'^[a-z][a-z0-9]*$') # TODO Length
UsernameValidator = RegexValidator(username_re, u'Enter a valid username')
+13 -23
View File
@@ -4,6 +4,7 @@ from django.contrib.auth.decorators import login_required, permission_required
from django.contrib.auth.forms import SetPasswordForm, AuthenticationForm
from django.contrib.auth import login, logout as auth_logout
from django.contrib.auth.tokens import default_token_generator
from django.core.exceptions import ValidationError
from django.core.urlresolvers import reverse
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from django.shortcuts import render_to_response, resolve_url, render
@@ -16,6 +17,7 @@ from django.views.generic import View
from inside.models import InsideUser
from neuf_ldap.models import LdapGroup, LdapUser
from neuf_userinfo.forms import NewUserForm
from neuf_userinfo.utils import decrypt_rijndael
@@ -121,7 +123,6 @@ def password_reset_confirm(request, uidb64=None, token=None,
class AddNewUserView(View):
ATTRS = ['username', 'firstname', 'lastname', 'email', 'password', 'groups']
def get(self, request):
"""
@@ -133,34 +134,23 @@ class AddNewUserView(View):
- Create homedir on wii
- Set RADIUS password
"""
if not self._validate_api_key(request.GET.get('api_key', '')):
return HttpResponse('Invalid api_key')
if not self._validate_attributes(request):
return HttpResponse('Missing at least one required attribute: '.format(', '.join(self.ATTRS)))
user_data = self._get_user(request.GET)
if not self.validate_api_key(request.GET.get('api_key', '')):
return JsonResponse({'errors': 'Invalid api_key'})
# TODO: you are here
form = NewUserForm(request.GET)
if not form.is_valid():
return JsonResponse({'errors': form.errors})
user = form.cleaned_data
# print "yey", user
# TODO you are still here
result = {'yousir': 'are a scholar!'}
return JsonResponse(result)
def _validate_api_key(self, api_key):
def validate_api_key(self, api_key):
if api_key == '' or api_key != settings.INSIDE_USERSYNC_API_KEY:
return False
return True
def _validate_attributes(self, request):
for a in self.ATTRS:
if a not in request.GET:
return False
return True
def _get_user(self, params):
user = {a: params[a] for a in self.ATTRS}
user['password'] = decrypt_rijndael(settings.INSIDE_USERSYNC_ENC_KEY, user['password'])
user['groups'] = user['groups'].strip().split(',')
return user
return True