From f5b44212ff8767c5b86742c12331f052b9904d36 Mon Sep 17 00:00:00 2001 From: bernat Date: Wed, 13 Jul 2005 18:47:32 +0200 Subject: [PATCH] Detabification darcs-hash:20050713164732-d1718-a088706b964f7df05b12ae105745b84d3106e7b6.gz --- gestion/chgpass.py | 234 ++++++++++++++++++++++----------------------- 1 file changed, 117 insertions(+), 117 deletions(-) diff --git a/gestion/chgpass.py b/gestion/chgpass.py index 0b530128..806865f4 100755 --- a/gestion/chgpass.py +++ b/gestion/chgpass.py @@ -6,11 +6,11 @@ Script de changement de mots de passe LDAP Utilisation : * cas 1 : sans arguements par un utlisateur lambda : - changement de son propre mdp + changement de son propre mdp * cas 2 : avec argument par un utilisateur ayant accès total à la base LDAP (respbats) mais PAS ROOT : - changement du mdp de l'adhérent fourni en argument, - impossibilité de modifier le mdp d'un compte privilégié + changement du mdp de l'adhérent fourni en argument, + impossibilité de modifier le mdp d'un compte privilégié * cas 3 : lancé par root : possibilité de modifier tous les mots de passe LDAP @@ -38,148 +38,148 @@ Il ne doit pas print "Taper Ctrl-D pour abandonner" try : - while 1 : - mdp = getpass.getpass('Nouveau mot de passe : ') - - ### Test du mdp - ## 1 - Longueur - if len(mdp) < 6 : - cprint('Mot de passe trop court','rouge') - continue - - ## 2 - assez de caractères de types différents ? - chiffres = 0 - majuscules = 0 - minuscules = 0 - autres = 0 - for c in mdp[:] : - if c.isdigit() : - # Un chiffre rapporte 1.5 point avec un maximum de 5 - if chiffres < 4.5 : chiffres += 1.5 - elif c.islower() : - if minuscules < 3 : minuscules += 1 - elif c.isupper() : - if majuscules < 3 : majuscules += 1 - else : - autres += 4 - if len(mdp) < 16 - minuscules - majuscules - chiffres - autres or \ - (not majuscules and not minuscules) : - cprint('Mot de passe trop simple.','rouge') - continue - - ## 3 - Cracklib - test = commands.getoutput("echo '%s' | /usr/sbin/crack_testlib" % mdp) - if test.split(':')[-1] != ' ok' : - commentaire = { - ' it does not contain enough DIFFERENT characters' : 'Il y a trop de caractères identiques.' , - ' it is based on a dictionary word' : 'Le mot de passe est basé sur un mot du dictionnaire' - }.get(test.split(':')[-1],test.split(':')[-1]) - cprint(commentaire,'rouge') - continue - - ### On redemande le mot de passe - mdp1 = getpass.getpass('Retaper mot de passe : ') - if mdp != mdp1 : - cprint('Les deux mots de passe entrés sont différents, réesayer','rouge') - continue - - break - - # Changement mdp - if os.system("/usr/bin/ldappasswd -H '%s' -x -D '%s' -w '%s' '%s' -s '%s' > /dev/null" % (uri, ldap_auth_dn, ldap_password, dn, mdp) ): - cprint('Erreur lors du changement de mot de passe','rouge') - else : - cprint('Changement effectué avec succès','vert') - + while 1 : + mdp = getpass.getpass('Nouveau mot de passe : ') + + ### Test du mdp + ## 1 - Longueur + if len(mdp) < 6 : + cprint('Mot de passe trop court','rouge') + continue + + ## 2 - assez de caractères de types différents ? + chiffres = 0 + majuscules = 0 + minuscules = 0 + autres = 0 + for c in mdp[:] : + if c.isdigit() : + # Un chiffre rapporte 1.5 point avec un maximum de 5 + if chiffres < 4.5 : chiffres += 1.5 + elif c.islower() : + if minuscules < 3 : minuscules += 1 + elif c.isupper() : + if majuscules < 3 : majuscules += 1 + else : + autres += 4 + if len(mdp) < 16 - minuscules - majuscules - chiffres - autres or \ + (not majuscules and not minuscules) : + cprint('Mot de passe trop simple.','rouge') + continue + + ## 3 - Cracklib + test = commands.getoutput("echo '%s' | /usr/sbin/crack_testlib" % mdp) + if test.split(':')[-1] != ' ok' : + commentaire = { + ' it does not contain enough DIFFERENT characters' : 'Il y a trop de caractères identiques.' , + ' it is based on a dictionary word' : 'Le mot de passe est basé sur un mot du dictionnaire' + }.get(test.split(':')[-1],test.split(':')[-1]) + cprint(commentaire,'rouge') + continue + + ### On redemande le mot de passe + mdp1 = getpass.getpass('Retaper mot de passe : ') + if mdp != mdp1 : + cprint('Les deux mots de passe entrés sont différents, réesayer','rouge') + continue + + break + + # Changement mdp + if os.system("/usr/bin/ldappasswd -H '%s' -x -D '%s' -w '%s' '%s' -s '%s' > /dev/null" % (uri, ldap_auth_dn, ldap_password, dn, mdp) ): + cprint('Erreur lors du changement de mot de passe','rouge') + else : + cprint('Changement effectué avec succès','vert') + except KeyboardInterrupt : - cprint('\nAbandon','rouge') - pass + cprint('\nAbandon','rouge') + pass except EOFError : - # Un Ctrl-D - cprint('\nAbandon','rouge') - pass + # Un Ctrl-D + cprint('\nAbandon','rouge') + pass if __name__ == '__main__' : sys.stdout.write('\r \r') # Pour esthétique lors de l'utilisation par sudo if len(sys.argv) == 1 : - # Changement de son mot de passe - login = getuser() - self_mode = True - + # Changement de son mot de passe + login = getuser() + self_mode = True + elif '-h' in sys.argv or '--help' in sys.argv or len(sys.argv) != 2 : - print "%s " % sys.argv[0].split('/')[-1].split('.')[0] - print "Changement du mot de passe du compte choisi." - sys.exit(255) + print "%s " % sys.argv[0].split('/')[-1].split('.')[0] + print "Changement du mot de passe du compte choisi." + sys.exit(255) else : - # Changement du mot de passe par un câbleur ou une nounou - login = sys.argv[1] - self_mode = False - for c in login[:] : - if not c.isalnum() and not c=='-' : - cprint('Login incorrect','rouge') - sys.exit(1) + # Changement du mot de passe par un câbleur ou une nounou + login = sys.argv[1] + self_mode = False + for c in login[:] : + if not c.isalnum() and not c=='-' : + cprint('Login incorrect','rouge') + sys.exit(1) - if getuser() == login : - cprint('Utiliser passwd pour changer son propre mot de passe','rouge') - sys.exit(2) - + if getuser() == login : + cprint('Utiliser passwd pour changer son propre mot de passe','rouge') + sys.exit(2) + if self_mode : - s = commands.getoutput('sudo -u respbats ldap_whoami') + s = commands.getoutput('sudo -u respbats ldap_whoami') else : - s = commands.getoutput("/usr/bin/ldapsearch -x -LLL '(&(objectClass=posixAccount)(uid=%s))' dn nom prenom droits" % login).strip() + s = commands.getoutput("/usr/bin/ldapsearch -x -LLL '(&(objectClass=posixAccount)(uid=%s))' dn nom prenom droits" % login).strip() if not s : - cprint('Login non trouvé dans la base LDAP','rouge') - sys.exit(3) + cprint('Login non trouvé dans la base LDAP','rouge') + sys.exit(3) # Ca a l'air bon if s.find('\n\n') != -1 : - # Plusieurs trouvé : pas normal - cprint('Erreur lors de la recherche du login : plusieurs occurences !','rouge') - sys.exit(4) - + # Plusieurs trouvé : pas normal + cprint('Erreur lors de la recherche du login : plusieurs occurences !','rouge') + sys.exit(4) + s = s.split('\n') try : - dn = s[0].split()[1] - if len(s) == 2 or not s[2] : - cprint("Changement du mot de passe du club %s " % ( s[1].split()[1] ),'vert') - else : - cprint("Changement du mot de passe de %s %s " % ( s[2].split()[1], s[1].split()[1] ),'vert') + dn = s[0].split()[1] + if len(s) == 2 or not s[2] : + cprint("Changement du mot de passe du club %s " % ( s[1].split()[1] ),'vert') + else : + cprint("Changement du mot de passe de %s %s " % ( s[2].split()[1], s[1].split()[1] ),'vert') except : - cprint('Erreur lors de la recherche du login','rouge') - sys.exit(5) + cprint('Erreur lors de la recherche du login','rouge') + sys.exit(5) if self_mode : - # Il faut vérifier l'ancien mot de passe - ldap_auth_dn = dn - ldap_password = getpass.getpass('Mot de passe actuel : ') - s = commands.getoutput("/usr/bin/ldapwhoami -H '%s' -x -D '%s' -w '%s'" % ( uri, ldap_auth_dn, ldap_password ) ).strip() - try : - resultat = s.split(':')[1].strip() - except : - cprint("Erreur lors de l'authentification",'rouge') - sys.exit(7) - if resultat != dn : - cprint({ 'Invalid credentials (49)' : 'Mot de passe invalide' }.get(resultat,resultat),'rouge') - sys.exit(8) + # Il faut vérifier l'ancien mot de passe + ldap_auth_dn = dn + ldap_password = getpass.getpass('Mot de passe actuel : ') + s = commands.getoutput("/usr/bin/ldapwhoami -H '%s' -x -D '%s' -w '%s'" % ( uri, ldap_auth_dn, ldap_password ) ).strip() + try : + resultat = s.split(':')[1].strip() + except : + cprint("Erreur lors de l'authentification",'rouge') + sys.exit(7) + if resultat != dn : + cprint({ 'Invalid credentials (49)' : 'Mot de passe invalide' }.get(resultat,resultat),'rouge') + sys.exit(8) elif len(s) > 3 and os.getuid()!=0 : - # Adhérent avec droits et on est pas root - From = 'roots@crans.org' - To = 'roots@crans.org' - mail = """From: Root <%s> + # Adhérent avec droits et on est pas root + From = 'roots@crans.org' + To = 'roots@crans.org' + mail = """From: Root <%s> To: %s Subject: Tentative de changement de mot de passe ! Tentative de changement du mot de passe de %s par %s. """ % ( From, To , login, os.getlogin() ) - # Envoi mail - import smtplib - conn = smtplib.SMTP('localhost') - conn.sendmail(From, To , mail ) - conn.quit() - cprint('Impossible de changer le mot de passe de cet adhérent : compte privilégié','rouge') - sys.exit(6) + # Envoi mail + import smtplib + conn = smtplib.SMTP('localhost') + conn.sendmail(From, To , mail ) + conn.quit() + cprint('Impossible de changer le mot de passe de cet adhérent : compte privilégié','rouge') + sys.exit(6) # Finalement ! chgpass(dn)