Project

General

Profile

Bug #16456

lien de desinscription éronné pour plusieurs destinataires

Added by Serghei Mihai over 7 years ago. Updated over 7 years ago.

Status:
Fermé
Priority:
Haut
Assignee:
Target version:
-
Start date:
23 May 2017
Due date:
% Done:

0%

Estimated time:
Patch proposed:
Yes
Planning:

Description

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


Files

Associated revisions

Revision 23c19695 (diff)
Added by Serghei Mihai over 7 years ago

fix unsubscription link computation for each destination (#16456)

History

#2

Updated by Serghei Mihai over 7 years ago

#3

Updated by Frédéric Péters (de retour le 9/12) over 7 years ago

            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

Updated by Serghei Mihai over 7 years ago

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

Updated by Frédéric Péters (de retour le 9/12) over 7 years ago

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

Updated by Serghei Mihai over 7 years ago

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

Updated by Frédéric Péters (de retour le 9/12) over 7 years ago

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

Updated by Serghei Mihai over 7 years ago

  • Status changed from En cours to 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

Updated by Serghei Mihai over 7 years ago

  • Status changed from Résolu (à déployer) to Fermé

Also available in: Atom PDF