[lc_ldap] création de compte, bon realm pour fil

This commit is contained in:
Antoine Durand-Gasselin 2010-10-17 18:39:34 +02:00
parent 51dcdc4847
commit 514915b1be
3 changed files with 79 additions and 3 deletions

View file

@ -104,7 +104,7 @@ class Attr(object):
"""Vérifie l'unicité dans la base de la valeur (mailAlias, chbre,
etc...)"""
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)))
if attr in [ "mailAlias", "canonicalAlias"]:
assert not self.conn.search('|(mailAlias=%s)(canonicalAlias=%s)' % ((str(self),)*2))

View file

@ -46,7 +46,13 @@ def ip_of_mid(mid):
def strip_accents(a):
""" Supression des accents de la chaîne fournie"""
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):
"""Vérifie si une adresse mail existe ou non grace à la commande

View file

@ -33,6 +33,7 @@
from __future__ import with_statement
import os, sys, ldap, re, netaddr, datetime, copy, time
from ldap.modlist import addModlist, modifyModlist
from Levenshtein import jaro
sys.path.append('/usr/scripts/gestion')
import config, crans_utils
@ -161,6 +162,9 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
else: raise ValueError("Realm inconnu: %s" % realm)
if realm == 'fil':
plage = xrange(256, 2047)
else:
plage = xrange( *(config.mid[realm]))
mid = uldif.setdefault('mid', [ unicode(self._find_id('mid', plage)) ])
uldif['ipHostNumber'] = [ unicode(crans_utils.ip_of_mid(int (mid[0]))) ]
@ -571,6 +575,72 @@ class adherent(proprio):
mfields = proprio.mfields + ['carteEtudiant', 'mailAlias', 'droits' ]
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):
ufields = ['cid', 'responsable']
mfields = ['imprimeurClub']