[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:
parent
0c157efaae
commit
8ef8ba04a0
1 changed files with 40 additions and 23 deletions
63
attributs.py
63
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]")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue