[attributs] On vérifie via le serveur smtp que les adresses mail sont libres.

C'est bien plus efficace, car les alias hardcodés dans /etc/postfix/aliases sont compris dans ce test là.
This commit is contained in:
Pierre-Elliott Bécue 2013-03-04 21:23:29 +01:00
parent c31735913e
commit 83198b6bf6

View file

@ -43,6 +43,10 @@ from crans_utils import format_tel, format_mac, mailexist, validate_name, ip4_of
sys.path.append("/usr/scripts/gestion")
import config
import annuaires_pg
import smtplib
### SMTP
smtpserv = "smtp.crans.org"
### Les droits
# en cas de typo, l'appel d'une variable plante, on préfèrera donc les utiliser en lieu et place
@ -119,7 +123,9 @@ class Attr(object):
self.validate(ldif)
def parse_value(self, val, ldif):
"""Transforme l'attribut pour travailler avec notre validateur"""
"""Transforme l'attribut pour travailler avec notre validateur
Le ldif est en dépendance car à certains endroits, il peut servir
(par exemple, pour l'ipv6, ou l'ipv4..."""
self.value = val
def __str__(self):
@ -135,6 +141,10 @@ class Attr(object):
vérifie déjà que ce qu'on a rentré est parsable"""
if not self.__class__.__name__ in CRANS_ATTRIBUTES:
raise ValueError('Attribut %s inconnu' % self.__class__.__name__)
# On utilise un ldif parce qu'il faut avoir un contexte
# pour savoir si l'attribut qu'on est en train de créer
# est légitime.
own_values = ldif.get(self.__class__.__name__, [])
self._check_cardinality(own_values)
self._check_uniqueness()
@ -282,7 +292,6 @@ class tel(Attr):
if len(self.value) == 0:
raise ValueError("Numéro de téléphone invalide (%r)" % val)
class yearAttr(intAttr):
singlevalue = False
optional= True
@ -317,13 +326,22 @@ class mail(Attr):
def _check_uniqueness(self):
attr = self.__class__.__name__
if attr in ["mailAlias", "canonicalAlias", 'mail']:
res = self.conn.search('(|(mail=%s)(mailAlias=%s)(canonicalAlias=%s))' % ((str(self),)*3))
mail = str(self).split('@', 1)[0]
try:
smtp = smtplib.SMTP(smtpserv)
smtp.putcmd("vrfy", mail)
res = smtp.getreply()[0] in [250, 252]
smtp.close()
except:
raise ValueError(u'Serveur de mail injoignable')
if res:
raise ValueError("Mail déjà existant", [r.dn for r in res])
raise ValueError("Le mail %s est déjà pris." % (str(self)))
def parse_value(self, mail, ldif):
if not re.match('^[-_.0-9A-Za-z]+@([A-Za-z0-9]{1}[A-Za-z0-9-_]+[.])+[a-z]{2,6}$', mail):
raise ValueError("Adresse mail invalide (%s)" % ldif)
raise ValueError("Adresse mail invalide (%s)" % mail)
self.value = mail