Detabification

darcs-hash:20050713164732-d1718-a088706b964f7df05b12ae105745b84d3106e7b6.gz
This commit is contained in:
bernat 2005-07-13 18:47:32 +02:00
parent c82362cdfd
commit f5b44212ff

View file

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