diff --git a/attributs.py b/attributs.py index 4a6241b..07ea102 100644 --- a/attributs.py +++ b/attributs.py @@ -116,7 +116,6 @@ class OptionalError(EnvironmentError): """Erreur levée si on essaye de créer un objet sans fournir un attribut obligatoire.""" pass - def attrify(val, attr, conn, Parent=None): """Transforme un n'importe quoi en :py:class:`Attr`. @@ -353,7 +352,6 @@ class Attr(object): """ return not set(liste_droits).isdisjoint(self.can_modify) - class AttributeFactory(object): """Utilisée pour enregistrer toutes les classes servant à instancier un attribut LDAP. Elle sert à les récupérer à partir de leur nom LDAP. @@ -385,6 +383,25 @@ def crans_attribute(classe): AttributeFactory.register(classe.ldap_name, classe) return classe +class rightProtectedAttr(Attr): + __slots__ = () + + def is_modifiable(self, liste_droits): + """ + On permet la modification à un utilisateur + """ + if not soi in liste_droits: + modifiables = set() + for i in liste_droits: + if i in DROITS_SUPERVISEUR: + modifiables = modifiables.union(DROITS_SUPERVISEUR[i]) + modifiables = list(modifiables) + + for droit in self.parent.get('droits', []): + if droit not in modifiables and droit in TOUS_DROITS: + return False + return super(rightProtectedAttr, self).is_modifiable(liste_droits) + @crans_attribute class objectClass(Attr): __slots__ = () @@ -408,7 +425,6 @@ class objectClass(Attr): else: self.value = unicode(val) - class intAttr(Attr): __slots__ = () python_type = int @@ -681,7 +697,6 @@ class debutAdhesion(generalizedTimeFormat): can_modify = [cableur, nounou] ldap_name = 'debutAdhesion' - @crans_attribute class finAdhesion(generalizedTimeFormat): __slots__ = () @@ -707,7 +722,7 @@ class finConnexion(generalizedTimeFormat): ldap_name = 'finConnexion' @crans_attribute -class mail(Attr): +class mail(rightProtectedAttr): __slots__ = () singlevalue = False optional = False @@ -717,23 +732,6 @@ class mail(Attr): category = 'mail' ldap_name = "mail" - def is_modifiable(self, liste_droits): - """ - Une adresse mail n'est modifiable que si on a au moins autant de droits - que la personne à qui est l'adresse mail - """ - modifiables = set() - for i in liste_droits: - if i in DROITS_SUPERVISEUR: - modifiables = modifiables.union(DROITS_SUPERVISEUR[i]) - modifiables = list(modifiables) - - for droit in self.parent.get('droits', []): - if droit not in modifiables and droit in TOUS_DROITS: - return False - return super(mail, self).is_modifiable(liste_droits) - - def check_uniqueness(self, liste_exclue): attr = self.__class__.__name__ if str(self) in liste_exclue: @@ -761,7 +759,6 @@ class mail(Attr): raise ValueError("%s invalide %r" % (self.legend, mail)) self.value = mail - @crans_attribute class canonicalAlias(mail): __slots__ = () @@ -886,7 +883,7 @@ class droits(Attr): modifiables = modifiables.union(DROITS_SUPERVISEUR[i]) modifiables = list(modifiables) - return self.value in modifiables and super(droits, self).is_modifiable(liste_droits) + return (nounou in liste_droits or self.value in modifiables) and super(droits, self).is_modifiable(liste_droits) @crans_attribute class solde(floatAttr): @@ -971,7 +968,6 @@ class macAddress(Attr): else: self.value = format_mac(mac) - def __unicode__(self): return unicode(self.value).lower() @@ -1204,7 +1200,6 @@ class exempt(Attr): def __unicode__(self): return unicode(self.value) - @crans_attribute class nombrePrises(intAttr): __slots__ = () @@ -1435,7 +1430,7 @@ class charteMA(boolAttr): ldap_name = "charteMA" @crans_attribute -class homeDirectory(Attr): +class homeDirectory(rightProtectedAttr): __slots__ = () singlevalue=True optional = True @@ -1444,22 +1439,6 @@ class homeDirectory(Attr): legend="Le chemin du home de l'adhérent" ldap_name = "homeDirectory" - def is_modifiable(self, liste_droits): - """ - Une adresse mail n'est modifiable que si on a au moins autant de droits - que la personne à qui est l'adresse mail - """ - modifiables = set() - for i in liste_droits: - if i in DROITS_SUPERVISEUR: - modifiables = modifiables.union(DROITS_SUPERVISEUR[i]) - modifiables = list(modifiables) - - for droit in self.parent.get('droits', []): - if droit not in modifiables and droit in TOUS_DROITS: - return False - return super(homeDirectory, self).is_modifiable(liste_droits) - @crans_attribute class loginShell(Attr): __slots__ = () @@ -1506,32 +1485,16 @@ class gecos(Attr): ldap_name = "gecos" @crans_attribute -class userPassword(Attr): +class userPassword(rightProtectedAttr): __slots__ = () singlevalue = False optional = True legend = "Le mot de passe" category = '' ldap_name = "userPassword" - can_modify = [nounou, bureau, cableur] + can_modify = [nounou, bureau, cableur, soi] historique = "info" - def is_modifiable(self, liste_droits): - """ - Le mot de passe n'est modifiable que si on a au moins autant de droits - que la personne à qui est le mot de passe - """ - modifiables = set() - for i in liste_droits: - if i in DROITS_SUPERVISEUR: - modifiables = modifiables.union(DROITS_SUPERVISEUR[i]) - modifiables = list(modifiables) - - for droit in self.parent.get('droits', []): - if droit not in modifiables and droit in TOUS_DROITS: - return False - return super(userPassword, self).is_modifiable(liste_droits) - @crans_attribute class sshFingerprint(Attr): __slots__ = () @@ -1930,7 +1893,6 @@ class xid(intAttr): can_modify = [] legend = "Identifiant du certificat" - @crans_attribute class hostCert(dnsAttr): __slots__ = () diff --git a/objets.py b/objets.py index a3f155e..3760143 100644 --- a/objets.py +++ b/objets.py @@ -673,7 +673,6 @@ class CransLdapObject(object): if not mixed_attrs[0].is_modifiable(self.conn.droits + self.conn._check_parent(self.dn) + self.conn._check_self(self.dn)): raise EnvironmentError("Vous ne pouvez pas modifier l'attribut %r de l'objet %r." % (attr, self)) - # On ajoute des locks sur les nouvelles valeurs locked = [] try: