[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 datetime
|
||||||
import time
|
import time
|
||||||
import ldap
|
import ldap
|
||||||
|
import random
|
||||||
import traceback
|
import traceback
|
||||||
from ldap.modlist import addModlist, modifyModlist
|
from ldap.modlist import addModlist, modifyModlist
|
||||||
|
|
||||||
|
@ -686,6 +687,113 @@ class proprio(CransLdapObject):
|
||||||
self.attribs = self.attribs + crans_account_attribs
|
self.attribs = self.attribs + crans_account_attribs
|
||||||
self.full = True
|
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):
|
def sursis_carte(self):
|
||||||
for h in self['historique'][::-1]:
|
for h in self['historique'][::-1]:
|
||||||
x = re.match("(.*),.* : .*(paiement\+%s|inscription).*" % (config.ann_scol,), h.value)
|
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)
|
self._imprimeur_clubs = self.conn.search(u'imprimeurClub=%s' % self['aid'][0], scope = 1, mode=self.mode)
|
||||||
return self._imprimeur_clubs
|
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):
|
def delete(self, comm="", login=None):
|
||||||
clubs = self.conn.search(u"(|(responsable=%s)(imprimeurClub=%s))" % (self['aid'][0], self['aid'][0]))
|
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