diff --git a/attributs.py b/attributs.py index 18cee40..c1d5225 100644 --- a/attributs.py +++ b/attributs.py @@ -115,7 +115,7 @@ class Attr(object): """Vérifie l'unicité dans la base de la valeur (mailAlias, chbre, etc...)""" pass - + def _check_values(self, values): """Vérifie que les valeurs sont valides (typiquement chbre)""" pass diff --git a/lc_ldap.py b/lc_ldap.py index d04d9de..a171a79 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -56,28 +56,21 @@ def is_actif(sanction): fin = int(bl_fin) return debut < now and fin > now -def uldif_to_ldif(uldif): - ## XXX - Kill - """Prend en argument un dico ldif, et vérifie que toutes les - valeurs sont bien des unicodes, les converti alors en chaînes - utf-8, renvoie un ldif""" - ldif = {} - for attr, vals in uldif.items(): - ldif[attr] = [ unicode.encode(val, 'utf-8') for val in vals ] - return ldif - def ldif_to_uldif(ldif): - ## XXX - Kill - 'Prend en argument un dico ldif, et décode toutes les chaînes en utf-8' uldif = {} for attr, vals in ldif.items(): uldif[attr] = [ unicode(val, 'utf-8') for val in vals ] return uldif -def ldif_to_cldif(ldif): +def ldif_to_cldif(ldif, check_ctxt = True): + """Transforme un dictionnaire renvoyé par python-ldap, en + un dictionnaire dont les valeurs sont des instances de Attr + Lorsqu'on récupère le ldif de la base ldap, on n'a pas besoin + de faire de tests... + """ cldif = {} for attr, vals in ldif.items(): - cldif[attr] = [ attrify(val, attr, ldif) for val in vals] + cldif[attr] = [ attrify(val, attr, ldif, check_ctxt = check_ctxt) for val in vals] return cldif def cldif_to_ldif(cldif): @@ -186,10 +179,10 @@ class lc_ldap(ldap.ldapobject.LDAPObject): """Crée une nouvelle facture""" raise NotImplementedError() - def _create_entity(self, dn, ldif): + def _create_entity(self, dn, uldif): '''Crée une nouvelle entité ldap en dn, avec attributs ldif: uniquement en unicode''' - cldif = ldif_to_cldif(ldif) + cldif = ldif_to_cldif(uldif) #lock = CransLock(self) for item in ['aid', 'uid', 'chbre', 'mailAlias', 'canonicalAlias', 'fid', 'cid', 'mid', 'macAddress', 'host', 'hostAlias' ]: @@ -247,8 +240,8 @@ class CransLdapObject(object): self.conn = conn if ldif: + # Vous précisez un ldif, l'objet est 'ro' self.dn = dn - # /!\ attention, on a pas un uldif (rapidité...) self.attrs = ldif self.__class__ = eval(self.attrs['objectClass'][0]) elif dn == base_dn: @@ -259,11 +252,23 @@ class CransLdapObject(object): if not res: raise ValueError ('objet inexistant: %s' % dn) self.dn, self.attrs = res[0] + + self.attrs = ldif_to_uldif(self.attrs) if mode in ['w', 'rw']: - self.attrs = ldif_to_cldif(self.attrs) - else: - self.attrs = ldif_to_uldif(self.attrs) - self.__class__ = eval(self.attrs['objectClass'][0]) + self.attrs = ldif_to_cldif(self.attrs, check_ctxt = False) + + ### Vérification que `λv. str(Attr(v))` est bien une projection + oldif = res[0][1] + nldif = cldif_to_ldif(self.attrs) + + for attr, vals in oldif: + if nldif[attr] != vals: + for v in nldif[attr]: + vals.remove(v) if v in vals + nvals = [nldif[attr][v.index(v)] for v in vals ] + raise EnvironmentError("λv. str(Attr(v)) n'est peut-être pas une projection:", attr, nvals, vals) + + self.__class__ = eval(str(self.attrs['objectClass'][0]) # self._modifs = copy.deepcopy(self.attrs) def save(self): @@ -313,8 +318,6 @@ class CransLdapObject(object): # On attrify new_vals = [ attrify(val, attr, self._modifs) for val in new_vals ] - # XXX - Manque un sanity check - # Si ça passe, on effectue les modifications old_vals = [ str(val) for val in self.attrs.get(attr, []) ] new_vals = [ str(val) for val in new_vals ] @@ -325,7 +328,6 @@ class CransLdapObject(object): """Modifie l'attribut attr ayant la valeur oldVal en newVal. Si l'attribut attr n'a qu'une seule valeur, il n'est pas nécessaire de préciser oldVal.""" - new_val = attrify(new_val, attr, self._modifs) new_vals = self.attrs.get(attr, [])[:] if old_val: # and oldVal in attrs: new_vals = [ val for val in new_vals if str(val) != str(old_val) ]