Projet

Général

Profil

Development #48133

SMTPRecipientsRefused: {'blabla&@gmail.com': (550, b'restricted characters in address')}

Ajouté par Sentry Io il y a plus de 3 ans. Mis à jour il y a plus de 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
29 octobre 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

https://sentry.entrouvert.org/entrouvert/publik/issues/5862/

SMTPRecipientsRefused: {'cabinetdentaire06&@gmail.com': (550, b'restricted characters in address')}
...
  File "authentic2/cbv.py", line 38, in dispatch
    return super(ValidateCSRFMixin, self).dispatch(*args, **kwargs)
  File "authentic2/views.py", line 815, in dispatch
    return super(BaseRegistrationView, self).dispatch(request, *args, **kwargs)
  File "django/views/generic/base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "django/views/generic/edit.py", line 183, in post
    return self.form_valid(form)
  File "authentic2/cbv.py", line 46, in form_valid
    return super(ValidateCSRFMixin, self).form_valid(*args, **kwargs)
  File "authentic2/views.py", line 864, in form_valid
    ou=self.ou, **self.token)
  File "authentic2/utils/__init__.py", line 757, in send_registration_mail
    legacy_html_body_templates=['registration/activation_email.html'])
  File "authentic2/utils/__init__.py", line 666, in send_templated_mail
    html_message=html_body, **kwargs)
  File "django/core/mail/__init__.py", line 62, in send_mail
    return mail.send()
  File "django/core/mail/message.py", line 348, in send
    return self.get_connection(fail_silently).send_messages([self])
  File "django/core/mail/backends/smtp.py", line 111, in send_messages
    sent = self._send(message)
  File "django/core/mail/backends/smtp.py", line 127, in _send
    self.connection.sendmail(from_email, recipients, message.as_bytes(linesep='\r\n'))
  File "smtplib.py", line 881, in sendmail
    raise SMTPRecipientsRefused(senderrs)

Une adresse avec un & dans la partie locale est acceptée mais ça foire quand c'est passé au SMTP.


Fichiers

Révisions associées

Révision f89842ff (diff)
Ajouté par Benjamin Dauvergne il y a plus de 3 ans

misc: add more checks on email address localpart (#48133)

Historique

#1

Mis à jour par Frédéric Péters il y a plus de 3 ans

  • Projet changé de Suivi des traces à Authentic 2
#2

Mis à jour par Benjamin Dauvergne il y a plus de 3 ans

Une rapide recherche me laisse à penser que bien que ce soit très peu commun, voir ici certainement une erreur, c'est parfaitement valide et exim4 serait un peu trop tatillon.

Est-ce qu'on vise surtout le fait de bien remonter l'erreur SMTP jusqu'à l'utilisateur sans tracer ou autre chose (et dans ce cas là ce serait plutôt un ticket sysadmin) ?

#3

Mis à jour par Frédéric Péters il y a plus de 3 ans

Ma position c'est que bien que légal d'un point de vue RFC, ça va dans 100% des cas être une typo et qu'il faudrait remonter à l'usager qu'il s'est trompé.

#4

Mis à jour par Benjamin Dauvergne il y a plus de 3 ans

Frédéric Péters a écrit :

Ma position c'est que bien que légal d'un point de vue RFC, ça va dans 100% des cas être une typo et qu'il faudrait remonter à l'usager qu'il s'est trompé.

Bon ce serait plus simple de décider de ce qu'on accepte, ^[a-zA-Z0-9.+]+$ pour la partie user ?

#5

Mis à jour par Frédéric Péters il y a plus de 3 ans

Regarder ce qu'exim accepte ?

  # The second rule applies to all other domains, and its default is
  # considerably less strict.

  # The default value of CHECK_RCPT_REMOTE_LOCALPARTS is defined in
  # main/01_exim4-config_listmacrosdefs:
  # CHECK_RCPT_REMOTE_LOCALPARTS = ^[./|] : ^.*[@%!`#&?] : ^.*/\\.\\./

  # It allows local users to send outgoing messages to sites
  # that use slashes and vertical bars in their local parts. It blocks
  # local parts that begin with a dot, slash, or vertical bar, but allows
  # these characters within the local part. However, the sequence /../ is
  # barred. The use of some other non-alphanumeric characters is blocked.
  # Single quotes might probably be dangerous as well, but they're
  # allowed by the default regexps to avoid rejecting mails to Ireland.
  # The motivation here is to prevent local users (or local users' malware)
  # from mounting certain kinds of attack on remote sites.
#6

Mis à jour par Thomas Noël il y a plus de 3 ans

Mon avis c'est que si on veut "contrôler" on n'y arrivera pas, il faut javascripter le truc comme pour le contrôle des domaines ("attention, votre adresse ne semble pas valable, vérifiez-là bien" quand la partie gauche contient des trucs étranges, mais bon j'ai pas vraiment de regex à fournir)

Et pour la 500 que se tape l'usager qui veut quand même valider la page, je pense comme vous : remonter SMTP jusqu'à l'utilisateur (SMTPRecipientsRefused) sans tracer.

#7

Mis à jour par Frédéric Péters il y a plus de 3 ans

je pense comme vous : remonter SMTP jusqu'à l'utilisateur (SMTPRecipientsRefused) sans tracer

Sûr ok "sans tracer" mais ma position est plutôt de détecter en amont, en ayant au niveau de la validation les mêmes restrictions que dans exim.

#8

Mis à jour par Thomas Noël il y a plus de 3 ans

Frédéric Péters a écrit :

je pense comme vous : remonter SMTP jusqu'à l'utilisateur (SMTPRecipientsRefused) sans tracer

Sûr ok "sans tracer" mais ma position est plutôt de détecter en amont, en ayant au niveau de la validation les mêmes restrictions que dans exim.

C'est ce que je propose, mais comme pour les domaines, le faire plutôt en javascript (je ne vois pas comment autrement, sauf des choses que je n'aime pas)

#9

Mis à jour par Benjamin Dauvergne il y a plus de 3 ans

Bon je pense quand même qu'une première mesure serait d'intercepter les SMTPError dans form_valid(), il n'y a pas que les adresses mal-formés qui font ce genre d'erreurs, on verra plus tard pour la regexp qui plaît à tout le monde.

#10

Mis à jour par Frédéric Péters il y a plus de 3 ans

C'est ce que je propose, mais comme pour les domaines, le faire plutôt en javascript (je ne vois pas comment autrement, sauf des choses que je n'aime pas)

Il y a déjà de la validation, côté serveur, il s'agirait "juste" de l'étendre :

--- a/src/authentic2/validators.py
+++ b/src/authentic2/validators.py
@@ -82,6 +82,7 @@ class EmailValidator(object):
         DjangoEmailValidator()(value)

         localpart, hostname = value.split('@', 1)
+        # ici vérifier localpart
         if app_settings.A2_VALIDATE_EMAIL_DOMAIN:
             mxs = self.query_mxs(hostname)
             if not mxs:
#11

Mis à jour par Benjamin Dauvergne il y a plus de 3 ans

  • Assigné à mis à Benjamin Dauvergne
#12

Mis à jour par Benjamin Dauvergne il y a plus de 3 ans

#13

Mis à jour par Valentin Deniaud il y a plus de 3 ans

  • Statut changé de Solution proposée à Solution validée
#14

Mis à jour par Benjamin Dauvergne il y a plus de 3 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit f89842ffab3ec4aa0526ca0ce53583c45874613e
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Sun Nov 1 00:35:06 2020 +0100

    misc: add more checks on email address localpart (#48133)
#15

Mis à jour par Frédéric Péters il y a plus de 3 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF