[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:
parent
a575c7f07b
commit
edc1086cc2
1 changed files with 56 additions and 50 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue