diff --git a/attributs.py b/attributs.py index 238b867..0a4baae 100644 --- a/attributs.py +++ b/attributs.py @@ -167,7 +167,7 @@ class AttrsDict(dict): def items(self): return [(key, self[key]) for key in self] - + def to_ldif(self): """ Transforme le dico en ldif valide au sens openldap. @@ -252,9 +252,9 @@ class Attr(object): 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. - + Cette classe n'est jamais instanciée. - + """ _classes = {} @@ -266,16 +266,16 @@ class AttributeFactory(object): @classmethod def get(cls, name, fallback=Attr): """Retourne la classe qui a ``name`` pour ``ldap_name``. - + Si elle n'existe pas, renvoie :py:class:`Attr` (peut être override en précisant ``fallback``) - + """ return cls._classes.get(name, fallback) def crans_attribute(classe): """Pour décorer les classes permettant d'instancier des attributs LDAP, afin de les enregistrer dans :py:class:`AttributeFactory`. - + """ AttributeFactory.register(classe.ldap_name, classe) return classe @@ -286,7 +286,7 @@ class objectClass(Attr): optional = False legend = "entité" ldap_name = "objectClass" - + """ Personne ne doit modifier de classe """ can_modify = [] @@ -475,7 +475,7 @@ class mail(Attr): if not re.match(u'^[-_.0-9A-Za-z]+@([A-Za-z0-9]{1}[A-Za-z0-9-_]+[.])+[a-z]{2,6}$', mail): raise ValueError("%s invalide %r" % (self.legend, mail)) self.value = mail - + @crans_attribute class canonicalAlias(mail): @@ -532,7 +532,7 @@ class contourneGreylist(boolAttr): category = 'mail' can_modify = [soi] ldap_name = "contourneGreylist" - + def __unicode__(self): return u"OK" @@ -609,14 +609,14 @@ class solde(Attr): #if not (float(solde) >= config.impression.decouvert and float(solde) <= 1024.): # raise ValueError("Solde invalide: %r" % solde) self.value = float(solde) - + def __unicode__(self): return u"%.2f" % self.value class dnsAttr(Attr): category = 'dns' ldap_name = "dnsAttr" - + def parse_value(self, val): val = val.lower() names = val.split('.') @@ -736,16 +736,16 @@ class rid(Attr): def parse_value(self, rid): rid = int(rid) - + # On veut éviter les rid qui recoupent les ipv4 finissant par # .0 ou .255 plages = [itertools.chain(*[xrange(plage[0], plage[1]+1) for plage in value]) for (key, value) in config.rid_primaires.iteritems() if ('v6' not in key) and ('special' not in key)] - + for plage in plages: if rid in plage: if rid % 256 == 0 or rid % 256 == 255: rid = -1 - break + break else: continue else: @@ -821,7 +821,7 @@ class portAttr(Attr): legend = u'Ouverture de port' category = 'firewall' can_modify = [nounou] - + def parse_value(self, port): if ":" in port: a,b = port.split(":", 1) @@ -904,7 +904,7 @@ class cid(intAttr): def parse_value(self, val): self.value = int(val) - + @crans_attribute class responsable(Attr): singlevalue = True @@ -936,7 +936,7 @@ class responsable(Attr): raise ValueError("get_respo: L'adherent %s n'existe pas ou plus" % (self.__value)) self._value = res return res - + def parse_value(self, resp): self.__value = resp @@ -1068,7 +1068,7 @@ class charteMA(Attr): can_modify = [nounou, bureau] category = 'perso' ldap_name = "charteMA" - + def parse_value(self, charteSignee): if charteSignee.upper() not in [u"TRUE", u"FALSE"]: raise ValueError("La charte MA est soit TRUE ou FALSE, pas %r" % charteSignee) @@ -1097,7 +1097,7 @@ class loginShell(Attr): legend = "Le shell de l'adherent" can_modify = [soi, nounou, cableur] ldap_name = "loginShell" - + def parse_value(self, shell): #with open('/etc/shells') as f: # shells = [ l.strip() for l in f.readlines() if not l.startswith('#') ] @@ -1152,7 +1152,7 @@ class gecos(Attr): legend = "Le gecos" category = 'id' ldap_name = "gecos" - + @crans_attribute class userPassword(Attr): singlevalue = True @@ -1160,7 +1160,7 @@ class userPassword(Attr): legend = "Le mot de passe" category = '' ldap_name = "userPassword" - + @crans_attribute class sshFingerprint(Attr): singlevalue = False @@ -1168,7 +1168,7 @@ class sshFingerprint(Attr): legend = "Clef ssh de la machine" can_modify = [parent, nounou] ldap_name = "sshFingerprint" - + @crans_attribute class gpgFingerprint(Attr): singlevalue = False @@ -1178,6 +1178,23 @@ class gpgFingerprint(Attr): can_modify = [soi, nounou] ldap_name = "gpgFingerprint" +@crans_attribute +class gpgMail(mail): + """Attribut servant à stocker un mail allant de paire avec + l'un des uid dans la clef gpg pointée par gpgFingerprint""" + singlevalue = False + optional = True + unique = True + legend = "Mail associé à une clef gpg" + can_modify = [soi, nounou] + ldap_name = "gpgMail" + def check_uniqueness(self, liste_exclue): + super(mail, self).check_uniqueness(liste_exclue) + + def parse_value(self, mail): + mail = mail.lower + super(gpgMail, self).parse_value(mail) + @crans_attribute class cn(Attr): singlevalue = True @@ -1210,7 +1227,7 @@ class controle(Attr): can_modify = [tresorier, nounou] category = 'perso' ldap_name = "controle" - + def parse_value(self, ctrl): if ctrl not in [u"", u"c", u"p", u"cp", u"pc"]: raise ValueError("Contrôle peut prendre les valeurs [c][p]")