[lc_ldap] création de compte, bon realm pour fil
This commit is contained in:
parent
51dcdc4847
commit
514915b1be
3 changed files with 79 additions and 3 deletions
|
@ -104,7 +104,7 @@ class Attr(object):
|
||||||
"""Vérifie l'unicité dans la base de la valeur (mailAlias, chbre,
|
"""Vérifie l'unicité dans la base de la valeur (mailAlias, chbre,
|
||||||
etc...)"""
|
etc...)"""
|
||||||
attr = self.__class__.__name__
|
attr = self.__class__.__name__
|
||||||
if attr in [ "mid", "uid", "cid", "fid"]: #... etc
|
if attr in [ "mid", "uid", "cid", "fid", "aid"]: #... etc
|
||||||
assert not self.conn.search('%s=%s' % (attr, str(self)))
|
assert not self.conn.search('%s=%s' % (attr, str(self)))
|
||||||
if attr in [ "mailAlias", "canonicalAlias"]:
|
if attr in [ "mailAlias", "canonicalAlias"]:
|
||||||
assert not self.conn.search('|(mailAlias=%s)(canonicalAlias=%s)' % ((str(self),)*2))
|
assert not self.conn.search('|(mailAlias=%s)(canonicalAlias=%s)' % ((str(self),)*2))
|
||||||
|
|
|
@ -46,7 +46,13 @@ def ip_of_mid(mid):
|
||||||
def strip_accents(a):
|
def strip_accents(a):
|
||||||
""" Supression des accents de la chaîne fournie"""
|
""" Supression des accents de la chaîne fournie"""
|
||||||
res = normalize('NFKD', a).encode('ASCII', 'ignore')
|
res = normalize('NFKD', a).encode('ASCII', 'ignore')
|
||||||
return res.replace(' ', '_').replace("'", '')
|
return res
|
||||||
|
|
||||||
|
def strip_spaces(a):
|
||||||
|
""" Suppression des espaces et des apostrophes"""
|
||||||
|
res = a.copy()
|
||||||
|
res.replace(' ', '_').replace("'", '')
|
||||||
|
return res
|
||||||
|
|
||||||
def mailexist(mail):
|
def mailexist(mail):
|
||||||
"""Vérifie si une adresse mail existe ou non grace à la commande
|
"""Vérifie si une adresse mail existe ou non grace à la commande
|
||||||
|
|
70
lc_ldap.py
70
lc_ldap.py
|
@ -33,6 +33,7 @@
|
||||||
from __future__ import with_statement
|
from __future__ import with_statement
|
||||||
import os, sys, ldap, re, netaddr, datetime, copy, time
|
import os, sys, ldap, re, netaddr, datetime, copy, time
|
||||||
from ldap.modlist import addModlist, modifyModlist
|
from ldap.modlist import addModlist, modifyModlist
|
||||||
|
from Levenshtein import jaro
|
||||||
sys.path.append('/usr/scripts/gestion')
|
sys.path.append('/usr/scripts/gestion')
|
||||||
|
|
||||||
import config, crans_utils
|
import config, crans_utils
|
||||||
|
@ -161,6 +162,9 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
|
||||||
|
|
||||||
else: raise ValueError("Realm inconnu: %s" % realm)
|
else: raise ValueError("Realm inconnu: %s" % realm)
|
||||||
|
|
||||||
|
if realm == 'fil':
|
||||||
|
plage = xrange(256, 2047)
|
||||||
|
else:
|
||||||
plage = xrange( *(config.mid[realm]))
|
plage = xrange( *(config.mid[realm]))
|
||||||
mid = uldif.setdefault('mid', [ unicode(self._find_id('mid', plage)) ])
|
mid = uldif.setdefault('mid', [ unicode(self._find_id('mid', plage)) ])
|
||||||
uldif['ipHostNumber'] = [ unicode(crans_utils.ip_of_mid(int (mid[0]))) ]
|
uldif['ipHostNumber'] = [ unicode(crans_utils.ip_of_mid(int (mid[0]))) ]
|
||||||
|
@ -571,6 +575,72 @@ class adherent(proprio):
|
||||||
mfields = proprio.mfields + ['carteEtudiant', 'mailAlias', 'droits' ]
|
mfields = proprio.mfields + ['carteEtudiant', 'mailAlias', 'droits' ]
|
||||||
xfields = ['etudes', 'postalAddress']
|
xfields = ['etudes', 'postalAddress']
|
||||||
|
|
||||||
|
def compte(self,login = None, uidNumber=0, hash_pass = '', shell=config.login_shell):
|
||||||
|
"""Renvoie le nom du compte crans, s'il n'existe pas, et que uid
|
||||||
|
est précisé, le crée"""
|
||||||
|
|
||||||
|
if u'posixAccount' in self.attrs['objectClass']:
|
||||||
|
return self.attrs['uid'][0]
|
||||||
|
elif login:
|
||||||
|
nom = strip_accents(self.attrs['nom'][0]).lower()
|
||||||
|
login = strip_accents(login).lower()
|
||||||
|
if jaro(nom, login) < 0.75:
|
||||||
|
raise ValueError("L'uid est trop différent du nom (%s -> %s)" % (uid, self.attrs['nom'][0]))
|
||||||
|
if not re.match('[a-z][-a-z]{1,15}'):
|
||||||
|
raise ValueError("Seules les lettres non accentuées et le - sont acceptés pour le login")
|
||||||
|
if mailexist(login):
|
||||||
|
raise ValueError(u"Login existant ou correspondant à un alias mail.", 1)
|
||||||
|
|
||||||
|
home = '/home/' + login
|
||||||
|
if os.path.exists(home):
|
||||||
|
raise ValueError(u'Création du compte impossible : home existant', 1)
|
||||||
|
|
||||||
|
if os.path.exists("/var/mail/" + login):
|
||||||
|
raise ValueError(u'Création du compte impossible : /var/mail/%s existant' % login, 1)
|
||||||
|
|
||||||
|
self._modifs['homeDirectory'] = [home]
|
||||||
|
self._modifs['mail'] = [login]
|
||||||
|
self._modifs['uid' ] = [login]
|
||||||
|
fn = strip_accents(self.attrs['prenom'].capitalize())
|
||||||
|
ln = strip_accents(self.attrs['nom'].capitalize()))
|
||||||
|
calias = strip_spaces(fn) + '.' + strip_spaces(ln)
|
||||||
|
if mailexists(calias):
|
||||||
|
calias = login
|
||||||
|
self._modifs['canonicalAlias'] = [calias]
|
||||||
|
self._modifs['objectClass'] = ['adherent', 'cransAccount', 'posixAccount', 'shadowAccount']
|
||||||
|
self._modifs['cn'] = fn + ' ' + ln
|
||||||
|
self._modifs['loginShell'] = [ shel]
|
||||||
|
self._modifs['userPassword'] = [hash_pass]
|
||||||
|
|
||||||
|
if uidNumber:
|
||||||
|
if self.conn.search('(uidNumber=%s)' % uidNumber):
|
||||||
|
raise ValueError(u'uidNumber pris')
|
||||||
|
else:
|
||||||
|
pool_uid = range(1001, 9999)
|
||||||
|
random.shuffle(pool_uid)
|
||||||
|
while len(pool_uid) > 0:
|
||||||
|
uidNumber = pool_uid.pop() # On choisit un uid
|
||||||
|
if not self.conn.search('(uidNumber=%s)' % uidNumber):
|
||||||
|
break
|
||||||
|
if not len(pool_uid):
|
||||||
|
raise ValueError(u"Plus d'uid disponibles !")
|
||||||
|
|
||||||
|
## try:
|
||||||
|
## self.lock('uidNumber', str(uidNumber))
|
||||||
|
## except:
|
||||||
|
## # Quelqu'un nous a piqué l'uid que l'on venait de choisir !
|
||||||
|
## return self.compte(login, uidNumber, hash_pass, shell)
|
||||||
|
|
||||||
|
self._modifs['uidNumber'] = [str(uidNumber)]
|
||||||
|
self._modifs['gidNumber'] = [str(config.gid)]
|
||||||
|
self._modifs['gecos'] = cn + ',,,'
|
||||||
|
|
||||||
|
self.save()
|
||||||
|
|
||||||
|
else:
|
||||||
|
raise EnvironmentError("L'adhérent n'a pas de compte crans")
|
||||||
|
|
||||||
|
|
||||||
class club(proprio):
|
class club(proprio):
|
||||||
ufields = ['cid', 'responsable']
|
ufields = ['cid', 'responsable']
|
||||||
mfields = ['imprimeurClub']
|
mfields = ['imprimeurClub']
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue