[gestion/chgpass] Test de validité du mot de passe dans une fonction externe.

Ce script appel ldappasswd avec os.system en passant les mots de passes ldap et
mot de passe de l'utilisateur sur le ligne de commande, donc visible sur zamok
en faisant juste un ps uaxf. Ça serait bien de changer ça…
This commit is contained in:
Valentin Samir 2014-03-15 22:50:56 +01:00
parent a575c7f07b
commit edc1086cc2

View file

@ -18,10 +18,11 @@ Copyright (C) Frédéric Pauget
Licence : GPLv2
"""
import subprocess
import getpass, commands, os, sys, base64, syslog
from user_tests import getuser, isadm
from affich_tools import cprint
from affich_tools import cprint, coul
import secrets_new as secrets
try:
ldap_password = secrets.get("ldap_password")
@ -51,37 +52,24 @@ def chgpass(dn, mdp = None) :
else :
cprint(u'Changement effectué avec succès', u'vert')
def promptpass(dn):
cprint(u"""Le nouveau mot de passe doit comporter au minimum 6 caractères.
Il ne doit pas être basé sur un mot du dictionnaire.""", 'jaune')
print u"Il est conseillé d'utiliser une combinaison de minuscules, majuscules,\nde chiffres et d'au moins un caractère spécial."
print u"Le mot de passe tapé ne sera pas écrit à l'écran."
print u"Taper Ctrl-D pour abandonner"
try :
while 1 :
mdp = getpass.getpass('Nouveau mot de passe : ')
def checkpass(mdp, dialog=False, longueur=8):
### Test du mdp
## 1 - Longueur
if len(mdp) < 6 :
cprint(u'Mot de passe trop court', 'rouge')
continue
if len(mdp) < longueur :
return False, coul(u'Mot de passe trop court, il doit faire au moins %s caractères de long' % longueur, 'rouge', dialog=dialog)
## 2 - Empeche les mots de passe non ASCII
try:
mdp = mdp.encode('ascii')
except (UnicodeEncodeError, UnicodeDecodeError):
cprint(u'Les accents ou caractères bizarres ne sont pas autorisés (mais #!@*&%{}| le sont !)',
'rouge')
continue
return False, coul(u'Les accents ou caractères bizarres ne sont pas autorisés (mais #!@*&%{}| le sont !)',
'rouge', dialog=dialog)
## 2bis - On évite une attaque de type injection de code shell
if "'" in mdp:
cprint(u'Les accents ou caractères bizarres ne sont pas autorisés (mais #!@*&%{}| le sont !)',
'rouge')
continue
return False, coul(u'Les accents ou caractères bizarres ne sont pas autorisés (mais #!@*&%{}| le sont !)',
'rouge', dialog=dialog)
## 3 - assez de caractères de types différents ?
chiffres = 0
@ -98,20 +86,38 @@ Il ne doit pas être basé sur un mot du dictionnaire.""", 'jaune')
if majuscules < 3 : majuscules += 1
else :
autres += 4
if len(mdp) < 16 - minuscules - majuscules - chiffres - autres or \
(not majuscules and not minuscules) :
cprint(u'Mot de passe trop simple.', 'rouge')
continue
if (not majuscules and not minuscules):
return False, coul(u'Mot de passe sans majuscules et sans miniscules. Mélangez des deux ?')
if len(mdp) < 16 - minuscules - majuscules - chiffres - autres:
return False, coul(u'Mot de passe trop simple. Ajoutez des chiffres ou des caractères parmis #!@*&%{}| ou mélangez des majuscules/minuscules ?', 'rouge', dialog=dialog)
## 4 - Cracklib
test = commands.getoutput("echo '%s' | /usr/sbin/cracklib-check" % mdp)
if test.split(':')[-1].lower() != ' ok' :
p = subprocess.Popen(['/usr/sbin/cracklib-check'], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
(test, err) = p.communicate(input=mdp)
if test.split(':')[-1].lower().strip() != 'ok' :
commentaire = {
' it does not contain enough DIFFERENT characters': u'Il y a trop de caractères identiques.' ,
' it is based on a dictionary word': u'Le mot de passe est basé sur un mot du dictionnaire' ,
' it is too simplistic/systematic': u'Le mot de passe est trop simple/répétitif'
}.get(test.split(':')[-1],test.split(':')[-1])
cprint(commentaire, 'rouge')
return False, coul(commentaire, 'rouge')
return True, ""
def promptpass(dn):
cprint(u"""Le nouveau mot de passe doit comporter au minimum 6 caractères.
Il ne doit pas être basé sur un mot du dictionnaire.""", 'jaune')
print u"Il est conseillé d'utiliser une combinaison de minuscules, majuscules,\nde chiffres et d'au moins un caractère spécial."
print u"Le mot de passe tapé ne sera pas écrit à l'écran."
print u"Taper Ctrl-D pour abandonner"
try :
while 1 :
mdp = getpass.getpass('Nouveau mot de passe : ')
(good, txt) = checkpass(mdp)
if not good:
print txt
continue
### On redemande le mot de passe