diff --git a/gestion/chgpass.py b/gestion/chgpass.py index 07a6a82c..9fc72dc1 100755 --- a/gestion/chgpass.py +++ b/gestion/chgpass.py @@ -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 +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") diff --git a/gestion/gest_crans_lc.py b/gestion/gest_crans_lc.py index ef3ee569..c8e85b91 100755 --- a/gestion/gest_crans_lc.py +++ b/gestion/gest_crans_lc.py @@ -30,7 +30,7 @@ from OpenSSL import crypto, SSL from gestion.cert_utils import createCertRequest from gestion.affich_tools import get_screen_size, coul -from gestion.chgpass import checkpass +from gestion.chgpass import check_password import gestion.config as config import gestion.config.factures @@ -2344,7 +2344,7 @@ les valeurs valident sont : def proprio_compte_password(self, proprio, cont, return_obj=False): """Permet de changer le mot de passe d'un compte crans""" def test_password(password, self_cont): - (good, msg) = checkpass(password, dialog=True) + (good, msg) = check_password(password, dialog=True) if not good: self.dialog.msgbox( msg,