[chgpass] gest_crans_lc utilisait une fonction de chgpass

This commit is contained in:
Pierre-Elliott Bécue 2014-04-14 09:22:40 +02:00
parent 9e25812e62
commit f9646ab6ca
2 changed files with 42 additions and 17 deletions

View file

@ -6,6 +6,9 @@ Script de changement de mots de passe LDAP
* Change le mot de passe de l'utilisateur donné en
argument.
Auteur : Pierre-Elliott Bécue <becue@crans.org>
Licence : GPLv3
"""
import gestion.config as config
@ -24,23 +27,27 @@ encoding = "UTF-8"
ldap = lc_ldap.shortcuts.lc_ldap_admin()
current_user = os.getenv("SUDO_USER") or os.getenv("USER") or os.getenv("LOGNAME") or getpass.getuser()
def check_password(password, no_cracklib=False):
def check_password(password, no_cracklib=False, dialog=False):
"""
Teste le mot de passe.
* Tests custom + cracklib (sauf si no_cracklib)
"""
problem = False
msg = ""
try:
password.decode('ascii')
except UnicodeDecodeError:
affich_tools.cprint(u'Le mot de passe ne doit contenir que des caractères ascii.', "rouge")
return False
problem = True
if not dialog:
affich_tools.cprint(u'Le mot de passe ne doit contenir que des caractères ascii.', "rouge")
else:
msg += affich_tools.coul(u'Le mot de passe ne doit contenir que des caractères ascii.\n', "rouge", dialog=dialog)
# Nounou mode
if no_cracklib:
if len(password) >= config.password.root_min_len:
return True
else:
problem = False
upp = 0
low = 0
oth = 0
@ -59,22 +66,37 @@ def check_password(password, no_cracklib=False):
# Recherche de manque de caractères
if cif < config.password.min_cif:
affich_tools.cprint(u'Le mot de passe doit contenir plus de chiffres.', "rouge")
if not dialog:
affich_tools.cprint(u'Le mot de passe doit contenir plus de chiffres.', "rouge")
else:
msg += affich_tools.coul(u'Le mot de passe doit contenir plus de chiffres.\n', "rouge", dialog=dialog)
problem = True
if upp < config.password.min_upp:
affich_tools.cprint(u'Le mot de passe doit contenir plus de majuscules.', "rouge")
if not dialog:
affich_tools.cprint(u'Le mot de passe doit contenir plus de majuscules.', "rouge")
else:
msg += affich_tools.coul(u'Le mot de passe doit contenir plus de majuscules.\n', "rouge", dialog=dialog)
problem = True
if low < config.password.min_low:
affich_tools.cprint(u'Le mot de passe doit contenir plus de minuscules.', "rouge")
if not dialog:
affich_tools.cprint(u'Le mot de passe doit contenir plus de minuscules.', "rouge")
else:
msg += affich_tools.coul(u'Le mot de passe doit contenir plus de minuscules.\n', "rouge", dialog=dialog)
problem = True
if oth < config.password.min_oth:
affich_tools.cprint(u'Le mot de passe doit contenir plus de caractères qui ne sont ni des chiffres, ni des majuscules, ni des minuscules.', "rouge")
if not dialog:
affich_tools.cprint(u'Le mot de passe doit contenir plus de caractères qui ne sont ni des chiffres, ni des majuscules, ni des minuscules.', "rouge")
else:
msg += affich_tools.coul(u'Le mot de passe doit contenir plus de caractères qui ne sont ni des chiffres, ni des majuscules, ni des minuscules.\n', "rouge", dialog=dialog)
problem = True
# Scores sur la longueur
longueur = config.password.upp_value*upp + config.password.low_value*low + config.password.cif_value*cif + config.password.oth_value*oth
if longueur < config.password.min_len:
affich_tools.cprint(u'Le mot de passe devrait être plus long, ou plus difficile.')
if not dialog:
affich_tools.cprint(u'Le mot de passe devrait être plus long, ou plus difficile.', "rouge")
else:
msg += affich_tools.coul(u'Le mot de passe devrait être plus long, ou plus difficile.\n', "rouge", dialog=dialog)
problem = True
if not problem:
@ -82,14 +104,17 @@ def check_password(password, no_cracklib=False):
# Le mot vient-il du dico (à améliorer, on voudrait pouvoir préciser
# la rigueur du test) ?
password = cracklib.VeryFascistCheck(password)
return True
return True, ""
except ValueError as e:
affich_tools.cprint(str(e).decode(), "rouge")
return False
if not dialog:
affich_tools.cprint(str(e).decode(), "rouge")
else:
msg += affich_tools.coul(str(e).decode(), "rouge", dialog=dialog)
return False, msg
else:
return False
return False, msg
return False
return False, msg
def change_password(arguments):
"""
@ -139,7 +164,7 @@ CTRL+D ou CTRL+C provoquent un abandon.""" % (config.password.min_len, config.pa
try:
while True:
mdp = getpass.getpass("Nouveau mot de passe: ")
if check_password(mdp, arguments.no_cracklib):
if check_password(mdp, arguments.no_cracklib)[0]:
mdp2 = getpass.getpass("Retaper le mot de passe: ")
if mdp != mdp2:
affich_tools.cprint(u"Les deux mots de passe diffèrent.", "rouge")