Archived
Use a Form object for validation, misc fixes
This commit is contained in:
1 parent
8b7119d931
commit
d8f4d47ae4
6 files changed
+76
-27
No files matched your search
+1
-1
@@ -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
@@ -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()
|
||||
@@ -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
@@ -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(',')
|
||||
@@ -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
@@ -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
|
||||
Reference in new issue
Block a user