diff --git a/attributs.py b/attributs.py index 37dcb83..e250737 100644 --- a/attributs.py +++ b/attributs.py @@ -756,25 +756,30 @@ class mail(rightProtectedAttr): attr = self.__class__.__name__ if str(self) in liste_exclue: return - if attr in ["mailAlias", "canonicalAlias", 'mail']: + if attr in ["mailAlias", "canonicalAlias", 'mail', 'mailExt']: mail = str(self) - # On commence par vérifier auprès du serveur SMTP - # si l'adresse email est prise sur le réseau. Cela permet - # de tester aussi les adresses statiquement écrites dans - # aliases.db. - try: - smtp = smtplib.SMTP(smtpserv) - smtp.putcmd("vrfy", mail) - res = smtp.getreply()[0] in [250, 252] - smtp.close() - except: - raise ValueError('Serveur de mail injoignable') - # Si le SMTP n'est pas joignable, on joue à la roulette - # russe en demandant à LDAP, sans vérifier les aliases - # statiques… - check = self.conn.search(u'mail=%s' % mail) - if len(check) >= 1: - res = True + + _, domain = mail.split('@') + if domain in config.dns.mail_crans: + # On commence par vérifier auprès du serveur SMTP + # si l'adresse email est prise sur le réseau. Cela permet + # de tester aussi les adresses statiquement écrites dans + # aliases.db. + try: + smtp = smtplib.SMTP(smtpserv) + smtp.putcmd("vrfy", mail) + res = smtp.getreply()[0] in [250, 252] + smtp.close() + except: + print 'Serveur de mail injoignable' + + check = self.conn.search( + u'(|(mail=%(mail)s)(mailAlias=%(mail)s)(canonicalAlias=%(mail)s)(mailExt=%(mail)s))' % { + 'mail': mail, + } + ) + if len(check) >= 1: + res = True if res: raise ValueError("Le mail %s est déjà pris." % (str(self))) @@ -1614,6 +1619,7 @@ class gpgMail(mail): 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)