[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):
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]")