Projet

Général

Profil

Bug #16456

lien de desinscription éronné pour plusieurs destinataires

Ajouté par Serghei Mihai il y a presque 7 ans. Mis à jour il y a presque 7 ans.

Statut:
Fermé
Priorité:
Haut
Assigné à:
Version cible:
-
Début:
23 mai 2017
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Le lien de desinscription est éronné pour tous les destinataires sauf le premier.


Fichiers

Révisions associées

Révision 23c19695 (diff)
Ajouté par Serghei Mihai il y a presque 7 ans

fix unsubscription link computation for each destination (#16456)

Historique

#2

Mis à jour par Serghei Mihai il y a presque 7 ans

#3

Mis à jour par Frédéric Péters il y a presque 7 ans

            print "token: %s" % unsubscribe_token

print de debug.

Sur le chunk en question, sans ouvrir le code au-delà, ça sonne quand même curieux d'avoir la génération du jeton de désabonnement derrière un "if category_id" (il est systématiquement posé, il n'y aurait pas besoin de l'avoir en paramètre optionnel, et puis il le serait même, il y aurait pas de mal à créer le unsubscribe_token pour des messages où il ne serait pas utilisé.

Pourquoi ne pas garder toutes les opérations en un coup, et seulement faire un .replace() sur le message.html ?

#4

Mis à jour par Serghei Mihai il y a presque 7 ans

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

Sur le chunk en question, sans ouvrir le code au-delà, ça sonne quand même curieux d'avoir la génération du jeton de désabonnement derrière un "if category_id" (il est systématiquement posé, il n'y aurait pas besoin de l'avoir en paramètre optionnel, et puis il le serait même, il y aurait pas de mal à créer le unsubscribe_token pour des messages où il ne serait pas utilisé.

Tu as raison, j'ai du me tromper quelque part.

Pourquoi ne pas garder toutes les opérations en un coup, et seulement faire un .replace() sur le message.html ?

Le problème est bien ce .replace() sur le message.html: à la première iteration il remplace bien le ##UNSUBSCRIBE_LINK_PLACEHOLDER## présent dans le HTML, mais aux iterations suivantes ce placeholder est remplacé par le premier lien de desabonnement et donc le remplacement ne se fait plus. Tous les autres destinataires reçoivent le lien de desabonnement du premier destinataire.

#5

Mis à jour par Frédéric Péters il y a presque 7 ans

Le problème est bien ce .replace() sur le message.html: à la première iteration il remplace bien le ##UNSUBSCRIBE_LINK_PLACEHOLDER## présent dans le HTML, mais aux iterations suivantes ce placeholder est remplacé par le premier lien de desabonnement et donc le remplacement ne se fait plus. Tous les autres destinataires reçoivent le lien de desabonnement du premier destinataire.

Oui, j'ai bien compris.

orig_html = message.html
for whatever:
    message.html = orig_html.replace(...)
#6

Mis à jour par Serghei Mihai il y a presque 7 ans

Oui,

Et cela nécessite la modification du backend stockant les mails de test car sinon la liste mail.outbox contient le même objet Message plusieurs fois.

#7

Mis à jour par Frédéric Péters il y a presque 7 ans

N'y pensons pas pour le moment mais la transformation texte elle pourrait avoir lieu une seule fois aussi, il me semble.

Sans doute que le code dans tests/conftest.py est nécessaire mais je n'aurais pas fait l'effort, j'aurais sans doute simplement en début d'itération fait un message = copy.copy(orig_message) pour éviter cette complication dans les tests.

Et au final, en zappant le changement de signature faisant suite à mon commentaire, et en prenant le test sans la modif au conftests.py, ça aurait été :

@@ -14,6 +14,7 @@
 # You should have received a copy of the GNU Affero General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.

+import copy
 import os
 import logging
 import urlparse
@@ -51,7 +52,10 @@ def send_email(title, content, destinations, category_id=None):
     message.transformer.apply_to_images(func=transform_image_src)
     message.transformer.load_and_transform(images_inline=True)
     message.transformer.save()
+    orig_message = message
+
     for dest in destinations:
+        message = copy.copy(orig_message)
         if category_id:
             unsubscribe_token = signing.dumps({'category': category_id,
                                                'identifier': dest})

Bref. Il me semble que ça corrige, ack pour le patch en l'état, mais n'hésitons pas à faire simple quand on peut.

#8

Mis à jour par Serghei Mihai il y a presque 7 ans

  • Statut changé de En cours à Résolu (à déployer)

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

N'y pensons pas pour le moment mais la transformation texte elle pourrait avoir lieu une seule fois aussi, il me semble.

Oui, je fais ça dans un ticket à part.

Sans doute que le code dans tests/conftest.py est nécessaire mais je n'aurais pas fait l'effort, j'aurais sans doute simplement en début d'itération fait un message = copy.copy(orig_message) pour éviter cette complication dans les tests.

Je préfère compliquer le code du test que le code qui tourne. Ici j'aurais eu autant de copie d'objets que de messages envoyés alors que c'est inutile à mon avis.

commit 23c19695b1c4f465d5849b45fe28c664d7c339d5
Author: Serghei Mihai <smihai@entrouvert.com>
Date:   Tue May 23 12:00:35 2017 +0200

    fix unsubscription link computation for each destination (#16456)
#9

Mis à jour par Serghei Mihai il y a presque 7 ans

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF