diff --git a/gestion/chgpass.py b/gestion/chgpass.py index 1f5cc2b3..368d0fc4 100755 --- a/gestion/chgpass.py +++ b/gestion/chgpass.py @@ -125,11 +125,19 @@ def check_password(password, no_cracklib=False, dialog=False): return False, msg @lc_ldap.shortcuts.with_ldap_conn(retries=2, delay=5, constructor=lc_ldap.shortcuts.lc_ldap_admin) -def change_password(arguments, ldap): +def change_password(ldap, login=None, verbose=False, no_cracklib=False, **args): """ Change le mot de passe en fonction des arguments """ - with ldap.search(u"(uid=%s)" % (arguments.user.decode(encoding),), mode="w")[0] as user: + if login is None: + login = current_user + if type(login) == str: + login = login.decode(encoding) + login = lc_ldap.crans_utils.escape(login) + query = ldap.search(u"(uid=%s)" % login, mode="w") + if not query: + affich_tools.cprint('Utilisateur introuvable', "rouge") + with query[0] as user: # Test pour vérifier que l'utilisateur courant peut modifier le mdp de user try: user['userPassword'] = [lc_ldap.crans_utils.hash_password("test").decode('ascii')] @@ -145,7 +153,7 @@ def change_password(arguments, ldap): Subject: Tentative de changement de mot de passe ! Tentative de changement du mot de passe de %s par %s. - """ % (From, To , sys.argv[1], current_user) + """ % (From, To , login.encode(encoding), current_user) # Envoi mail conn = smtplib.SMTP('localhost') @@ -154,26 +162,49 @@ def change_password(arguments, ldap): sys.exit(1) # On peut modifier le MDP - affich_tools.cprint("Changement du mot de passe de %s %s." % (user['prenom'][0], user['nom'][0]), "vert") + affich_tools.cprint("Changement du mot de passe de %s %s." % + (user['prenom'][0], user['nom'][0]), + "vert") # Règles du jeu - if arguments.verbose: + # (J'ai perdu) + if verbose: affich_tools.cprint(u"""Règles : Longueur standard : %s, root : %s, Minimums : chiffres : %s, minuscules : %s, majuscules : %s, autres : %s, Scores de longueur : chiffres : %s, minuscules : %s, majuscules : %s, autres : %s, -Cracklib : %s.""" % (config.password.min_len, config.password.root_min_len, config.password.min_cif, config.password.min_low, config.password.min_upp, config.password.min_oth, config.password.cif_value, config.password.low_value, config.password.upp_value, config.password.oth_value, "Oui" * (not arguments.no_cracklib) + "Non" * (arguments.no_cracklib)), 'jaune') +Cracklib : %s.""" % ( + config.password.min_len, + config.password.root_min_len, + config.password.min_cif, + config.password.min_low, + config.password.min_upp, + config.password.min_oth, + config.password.cif_value, + config.password.low_value, + config.password.upp_value, + config.password.oth_value, + "Oui" * (not no_cracklib) + "Non" * (no_cracklib) + ), + 'jaune') else: affich_tools.cprint(u"""Le nouveau mot de passe doit comporter au minimum %s caractères. Il ne doit pas être basé sur un mot du dictionnaire. Il doit contenir %s chiffre(s), %s minuscule(s), %s majuscule(s) et au moins %s autre(s) caractère(s). -CTRL+D ou CTRL+C provoquent un abandon.""" % (config.password.min_len, config.password.min_cif, config.password.min_low, config.password.min_upp, config.password.min_oth), 'jaune') +CTRL+D ou CTRL+C provoquent un abandon.""" % + ( + config.password.min_len, + config.password.min_cif, + config.password.min_low, + config.password.min_upp, + config.password.min_oth + ), 'jaune') try: while True: mdp = getpass.getpass("Nouveau mot de passe: ") - if check_password(mdp, arguments.no_cracklib)[0]: + if check_password(mdp, 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") @@ -195,11 +226,23 @@ CTRL+D ou CTRL+C provoquent un abandon.""" % (config.password.min_len, config.pa affich_tools.cprint(u"Mot de passe de %s changé." % (user['uid'][0]), "vert") if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Recherche dans la base des adhérents", add_help=False) - parser.add_argument('-h', '--help', help="Affiche ce message et quitte.", action="store_true") - parser.add_argument('-n', '--no-cracklib', help="Permet de contourner les règles de choix du mot de passe (réservé aux nounous).", action="store_true") - parser.add_argument('-v', '--verbose', help="Permet de contourner les règles de choix du mot de passe (réservé aux nounous).", action="store_true") - parser.add_argument('user', type=str, nargs="?", help="L'utilisateur dont on veut changer le mot de passe.") + parser = argparse.ArgumentParser( + description="Recherche dans la base des adhérents", + add_help=False) + parser.add_argument('-h', '--help', + help="Affiche ce message et quitte.", + action="store_true") + parser.add_argument('-n', '--no-cracklib', + help="Permet de contourner les règles de choix du mot de passe" + + "(réservé aux nounous).", + action="store_true") + parser.add_argument('-v', '--verbose', + help="Permet de contourner les règles de choix du mot de passe" + + "(réservé aux nounous).", + action="store_true") + parser.add_argument('login', type=str, nargs="?", + help="L'utilisateur dont on veut changer le mot de passe.") + args = parser.parse_args() if args.help: @@ -208,4 +251,4 @@ if __name__ == "__main__": if args.no_cracklib: if not lc_ldap.attributs.nounou in ldap.droits: args.no_cracklib = False - change_password(args) + change_password(**vars(args))