[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:
parent
c31735913e
commit
83198b6bf6
1 changed files with 23 additions and 5 deletions
28
attributs.py
28
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
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue