[objets] Création et suppression de compte crans
This commit is contained in:
parent
23369476ef
commit
241f55154e
1 changed files with 108 additions and 58 deletions
166
objets.py
166
objets.py
|
@ -44,6 +44,7 @@ import re
|
|||
import datetime
|
||||
import time
|
||||
import ldap
|
||||
import random
|
||||
import traceback
|
||||
from ldap.modlist import addModlist, modifyModlist
|
||||
|
||||
|
@ -686,6 +687,113 @@ class proprio(CransLdapObject):
|
|||
self.attribs = self.attribs + crans_account_attribs
|
||||
self.full = True
|
||||
|
||||
def delete_compte(self, mail):
|
||||
# Je pense qu'en pratique cette vérification ne sert à rien puisqu'on se fera jetter à la tentative de modification
|
||||
# de userPassword, mail, homeDirectory, canonicalAlias, etc…
|
||||
if not self.may_be(variables.deleted, self.conn.droits + self.conn._check_parent(self.dn) + self.conn._check_self(self.dn)):
|
||||
raise EnvironmentError("Vous n'avez pas le droit de supprimer %s et donc vous ne pouvez supprimer son compte." % self.dn)
|
||||
if not u'cransAccount' in self['objectClass']:
|
||||
raise EnvironmentError("L'adhérent n'a pas de compte crans")
|
||||
else:
|
||||
self['userPassword'] = []
|
||||
self['mail'] = mail
|
||||
self['homeDirectory'] = []
|
||||
self['canonicalAlias'] = []
|
||||
self['cn'] = []
|
||||
self['loginShell'] = []
|
||||
self['uidNumber'] = []
|
||||
self['gidNumber'] = []
|
||||
self['gecos'] = []
|
||||
self['shadowExpire' ]=[]
|
||||
self['uid' ]=[]
|
||||
self._modifs['objectClass'] = [u'adherent']
|
||||
self.attribs = list(set(self.attribs).difference(crans_account_attribs))
|
||||
self.full = False
|
||||
|
||||
|
||||
def compte(self, login = None, uidNumber=0, hash_pass = '', shell=config.login_shell):
|
||||
u"""Renvoie le nom du compte crans. S'il n'existe pas, et que login
|
||||
est précisé, le crée."""
|
||||
|
||||
if u'posixAccount' in self['objectClass']:
|
||||
return self.attrs['uid'][0]
|
||||
|
||||
elif login:
|
||||
fn = crans_utils.strip_accents(unicode(self.attrs['prenom'][0]).capitalize())
|
||||
ln = crans_utils.strip_accents(unicode(self.attrs['nom'][0]).capitalize())
|
||||
login = crans_utils.strip_spaces(crans_utils.strip_accents(login), by=u'-').lower()
|
||||
if not re.match('^[a-z][-a-z]{1,15}$', login):
|
||||
raise ValueError("Le login a entre 2 et 16 lettres, il peut contenir (pas au début) des - ")
|
||||
if crans_utils.mailexist(login):
|
||||
raise ValueError("Login existant ou correspondant à un alias mail.")
|
||||
|
||||
home = u'/home/' + login
|
||||
if os.path.exists(home):
|
||||
raise ValueError('Création du compte impossible : home existant')
|
||||
|
||||
if os.path.exists("/var/mail/" + login):
|
||||
raise ValueError('Création du compte impossible : /var/mail/%s existant' % str(login))
|
||||
|
||||
if not self.full:
|
||||
self.attribs = self.attribs + crans_account_attribs
|
||||
self.full = True
|
||||
self['uid' ] = [login]
|
||||
self['homeDirectory'] = [home]
|
||||
self['mail'] = [login + u"@crans.org"]
|
||||
calias = crans_utils.strip_spaces(fn) + u'.' + crans_utils.strip_spaces(ln) + '@crans.org'
|
||||
if crans_utils.mailexist(calias):
|
||||
calias = login
|
||||
self['canonicalAlias'] = [calias]
|
||||
self._modifs['objectClass'] = [u'adherent', u'cransAccount', u'posixAccount', u'shadowAccount']
|
||||
self['cn'] = [ fn + u' ' + ln ]
|
||||
self['loginShell'] = [unicode(shell)]
|
||||
self['userPassword'] = [unicode(hash_pass)]
|
||||
|
||||
if uidNumber:
|
||||
if self.conn.search(u'(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(u'(uidNumber=%s)' % uidNumber):
|
||||
break
|
||||
if not len(pool_uid):
|
||||
raise ValueError("Plus d'uid disponibles !")
|
||||
|
||||
self['uidNumber'] = [unicode(uidNumber)]
|
||||
self['gidNumber'] = [unicode(config.gid)]
|
||||
self['gecos'] = [unicode(self._modifs['cn'][0]) + u',,,']
|
||||
|
||||
else:
|
||||
raise EnvironmentError("L'adhérent n'a pas de compte crans")
|
||||
|
||||
def may_be(self, what, liste):
|
||||
"""Teste si liste peut faire ce qui est dans what, pour
|
||||
what élément de {create, delete, modify}.
|
||||
On passe une liste de droits plutôt que l'objet car il faut ajouter
|
||||
les droits soi et parent.
|
||||
Retourne un booléen
|
||||
"""
|
||||
# On ne peut supprimer un objet que si on a au moins autant de droit que lui
|
||||
if what == variables.deleted:
|
||||
modifiables = set()
|
||||
for i in liste:
|
||||
if i in attributs.DROITS_SUPERVISEUR:
|
||||
modifiables = modifiables.union(attributs.DROITS_SUPERVISEUR[i])
|
||||
modifiables = list(modifiables)
|
||||
|
||||
for droit in self.get('droits', []):
|
||||
if droit not in modifiables:
|
||||
return False
|
||||
# Notez qu'en pratique, ça ne sert à rien puisque can_be_by[variables.deleted]
|
||||
# ne contient que nounou et bureau. Ça va juste empêcher le bureau de supprimer
|
||||
# des nounous
|
||||
|
||||
return super(proprio, self).may_be(what, liste)
|
||||
|
||||
|
||||
def sursis_carte(self):
|
||||
for h in self['historique'][::-1]:
|
||||
x = re.match("(.*),.* : .*(paiement\+%s|inscription).*" % (config.ann_scol,), h.value)
|
||||
|
@ -993,64 +1101,6 @@ class adherent(proprio):
|
|||
self._imprimeur_clubs = self.conn.search(u'imprimeurClub=%s' % self['aid'][0], scope = 1, mode=self.mode)
|
||||
return self._imprimeur_clubs
|
||||
|
||||
def compte(self, login = None, uidNumber=0, hash_pass = '', shell=config.login_shell):
|
||||
u"""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['objectClass']:
|
||||
return self.attrs['uid'][0]
|
||||
|
||||
elif login:
|
||||
fn = crans_utils.strip_accents(unicode(self.attrs['prenom'][0]).capitalize())
|
||||
ln = crans_utils.strip_accents(unicode(self.attrs['nom'][0]).capitalize())
|
||||
login = crans_utils.strip_accents(login).lower()
|
||||
if not re.match('^[a-z][-a-z]{1,15}$', login):
|
||||
raise ValueError("Le login a entre 2 et 16 lettres, il peut contenir (pas au début) des - ")
|
||||
if crans_utils.mailexist(login):
|
||||
raise ValueError("Login existant ou correspondant à un alias mail.")
|
||||
|
||||
home = u'/home/' + login
|
||||
if os.path.exists(home):
|
||||
raise ValueError('Création du compte impossible : home existant')
|
||||
|
||||
if os.path.exists("/var/mail/" + login):
|
||||
raise ValueError('Création du compte impossible : /var/mail/%s existant' % login)
|
||||
|
||||
if not self.full:
|
||||
self.attribs = self.attribs + crans_account_attribs
|
||||
self.full = True
|
||||
self['homeDirectory'] = [home]
|
||||
self['mail'] = [login + u"@crans.org"]
|
||||
self['uid' ] = [login]
|
||||
calias = crans_utils.strip_spaces(fn) + u'.' + crans_utils.strip_spaces(ln)
|
||||
if crans_utils.mailexist(calias):
|
||||
calias = login
|
||||
self['canonicalAlias'] = [calias]
|
||||
self['objectClass'] = [u'adherent', u'cransAccount', u'posixAccount', u'shadowAccount']
|
||||
self['cn'] = [ fn + u' ' + ln ]
|
||||
self['loginShell'] = [unicode(shell)]
|
||||
self['userPassword'] = [unicode(hash_pass)]
|
||||
|
||||
if uidNumber:
|
||||
if self.conn.search(u'(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(u'(uidNumber=%s)' % uidNumber):
|
||||
break
|
||||
if not len(pool_uid):
|
||||
raise ValueError("Plus d'uid disponibles !")
|
||||
|
||||
self['uidNumber'] = [unicode(uidNumber)]
|
||||
self['gidNumber'] = [unicode(config.gid)]
|
||||
self['gecos'] = [self._modifs['cn'][0] + u',,,']
|
||||
|
||||
#self.save()
|
||||
else:
|
||||
raise EnvironmentError("L'adhérent n'a pas de compte crans")
|
||||
|
||||
def delete(self, comm="", login=None):
|
||||
clubs = self.conn.search(u"(|(responsable=%s)(imprimeurClub=%s))" % (self['aid'][0], self['aid'][0]))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue