[attributs] On ajoute un attribut gpgMail spécifique

* On ne peut pas utiliser mailExt, car on souhaite que cet attribut ne
 soit pas en conflit avec les autres attributs de mails (oui, on accepte
 la redondance)
This commit is contained in:
Pierre-Elliott Bécue 2014-01-29 00:37:11 +01:00
parent 0c157efaae
commit 8ef8ba04a0

View file

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