Detabification
darcs-hash:20050713164732-d1718-a088706b964f7df05b12ae105745b84d3106e7b6.gz
This commit is contained in:
parent
c82362cdfd
commit
f5b44212ff
1 changed files with 117 additions and 117 deletions
|
@ -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 <login>" % sys.argv[0].split('/')[-1].split('.')[0]
|
||||
print "Changement du mot de passe du compte choisi."
|
||||
sys.exit(255)
|
||||
print "%s <login>" % 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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue