From 83198b6bf6c47865a96b9b8cf35b012bdd62ca88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre-Elliott=20B=C3=A9cue?= Date: Mon, 4 Mar 2013 21:23:29 +0100 Subject: [PATCH] =?UTF-8?q?[attributs]=20On=20v=C3=A9rifie=20via=20le=20se?= =?UTF-8?q?rveur=20smtp=20que=20les=20adresses=20mail=20sont=20libres.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit C'est bien plus efficace, car les alias hardcodés dans /etc/postfix/aliases sont compris dans ce test là. --- attributs.py | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/attributs.py b/attributs.py index 472a62d..d50f516 100644 --- a/attributs.py +++ b/attributs.py @@ -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