LDAP Hash
authorPA Parent <paparent@paparent.me>
Tue, 18 Oct 2011 19:14:28 +0000 (15:14 -0400)
committerPA Parent <paparent@paparent.me>
Tue, 18 Oct 2011 19:14:28 +0000 (15:14 -0400)
auf_savoirs_en_partage/chercheurs/utils.py
auf_savoirs_en_partage/chercheurs/views.py

index 21c9a76..2baef3d 100644 (file)
@@ -1,6 +1,10 @@
-# coding: utf-8
+# -*- coding: utf-8 -*-
 
+import base64
+import hashlib
+import os
 import re
+
 from django.utils.encoding import smart_str
 from django.contrib.auth.models import User
 
@@ -102,10 +106,15 @@ def export(queryset, type):
     return exportateur(headers, data, type, filename='chercheurs.%s' % type)
 
 def create_ldap_hash(password):
-    import hashlib, struct, random, base64
-
-    salt = struct.pack('L', random.randint(0, 2**32 - 1))
+    salt = os.urandom(4)
     raw_hash = hashlib.sha1(password.encode('utf-8') + salt).digest()
     ldap_hash = '{SSHA}' + base64.b64encode(raw_hash + salt)
 
     return ldap_hash
+
+def check_ldap_hash(ldap_hash, password):
+    hash_salt = base64.b64decode(ldap_hash[6:])
+    hash = hash_salt[:-4]
+    salt = hash_salt[-4:]
+    test = hashlib.sha1(password.encode('utf-8') + salt).digest()
+    return test == hash
index 7131a05..1b8066c 100644 (file)
@@ -1,8 +1,10 @@
 # -*- encoding: utf-8 -*-
+import re
+
 from chercheurs.decorators import chercheur_required
 from chercheurs.forms import ChercheurSearchForm, SetPasswordForm, ChercheurFormGroup, AuthenticationForm, GroupeSearchForm, MessageForm
 from chercheurs.models import Chercheur, Groupe, Message, AdhesionGroupe, AuthLDAP
-from chercheurs.utils import get_django_user_for_email, create_ldap_hash
+from chercheurs.utils import get_django_user_for_email, create_ldap_hash, check_ldap_hash
 from datamaster_modeles.models import Etablissement, Region
 from django.conf import settings
 from django.shortcuts import render_to_response
@@ -120,8 +122,7 @@ def password_change(request, template_name='registration/password_change_form.ht
             username = request.user.email
             authldap, created = AuthLDAP.objects.get_or_create(username=username)
             password = form.cleaned_data.get('new_password1')
-            ldap_hash = create_ldap_hash(password)
-            authldap.ldap_hash = ldap_hash
+            authldap.ldap_hash = create_ldap_hash(password)
             authldap.save()
 
             return HttpResponseRedirect(post_change_redirect)
@@ -217,11 +218,10 @@ def login(request, template_name='registration/login.html', redirect_field_name=
             
             # Mot de passe pour LDAP
             username = form.cleaned_data.get('username')
+            password = form.cleaned_data.get('password')
             authldap, created = AuthLDAP.objects.get_or_create(username=username)
-            if created:
-                password = form.cleaned_data.get('password')
-                ldap_hash = create_ldap_hash(password)
-                authldap.ldap_hash = ldap_hash
+            if created or not check_ldap_hash(authldap.ldap_hash, password):
+                authldap.ldap_hash = create_ldap_hash(password)
                 authldap.save()
 
             # Okay, security checks complete. Log the user in.