Bug #16456
lien de desinscription éronné pour plusieurs destinataires
0%
Description
Le lien de desinscription est éronné pour tous les destinataires sauf le premier.
Files
Associated revisions
History
Updated by Serghei Mihai over 7 years ago
- File 0001-fix-unsubscription-link-computation-for-each-destina.patch 0001-fix-unsubscription-link-computation-for-each-destina.patch added
- Status changed from Nouveau to En cours
- Patch proposed changed from No to Yes
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 ?
Updated by Serghei Mihai over 7 years ago
- File 0001-fix-unsubscription-link-computation-for-each-destina.patch 0001-fix-unsubscription-link-computation-for-each-destina.patch added
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.
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(...)
Updated by Serghei Mihai over 7 years ago
- File 0001-fix-unsubscription-link-computation-for-each-destina.patch 0001-fix-unsubscription-link-computation-for-each-destina.patch added
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.
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.
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)
fix unsubscription link computation for each destination (#16456)