Bug #13562
systempayv2: problème d'encodage des prénoms/noms
0%
Description
Internal Server Error: /lingo/pay
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 111, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python2.7/dist-packages/django/views/generic/base.py", line 69, in view
return self.dispatch(request, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/django/views/generic/base.py", line 87, in dispatch
return handler(request, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/django/db/transaction.py", line 394, in inner
return func(*args, **kwargs)
File "/usr/lib/python2.7/dist-packages/combo/apps/lingo/views.py", line 333, in post
last_name=request.user.last_name)
File "/usr/lib/python2.7/dist-packages/eopayment/__init__.py", line 105, in request
return self.backend.request(amount, **kwargs)
File "/usr/lib/python2.7/dist-packages/eopayment/systempayv2.py", line 335, in request
check_vads(fields)
File "/usr/lib/python2.7/dist-packages/eopayment/systempayv2.py", line 189, in check_vads
if name in kwargs and not parameter.check_value(kwargs[name]):
File "/usr/lib/python2.7/dist-packages/eopayment/systempayv2.py", line 61, in check_value
if self.max_length and len(str(value)) > self.max_length:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xef' in position 3: ordinal not in range(128)
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Serghei Mihai il y a plus de 7 ans
- Fichier 0001-systempayv2-handle-properly-unicode-params-13562.patch ajouté
- Statut changé de Nouveau à En cours
- Patch proposed changé de Non à Oui
Mis à jour par Serghei Mihai il y a plus de 7 ans
- Fichier
0001-systempayv2-handle-properly-unicode-params-13562.patchsupprimé
Mis à jour par Serghei Mihai il y a plus de 7 ans
Mis à jour par Benjamin Dauvergne il y a plus de 7 ans
Ça gère à la fois de l'UTF-8 et de l'unicode en entrée des APIs comme le #12456 ?
Mis à jour par Serghei Mihai il y a plus de 7 ans
Pour ne pas me planter sur la longueur du paramétre.
Mis à jour par Serghei Mihai il y a plus de 7 ans
Benjamin Dauvergne a écrit :
Ça gère à la fois de l'UTF-8 et de l'unicode en entrée des APIs comme le #12456 ?
Tu dois parler d'un autre ticket, j'imagine
Mis à jour par Benjamin Dauvergne il y a plus de 7 ans
Oui dsl mais je pointais déjà ce ticket dans un mail, #12546.
Mis à jour par Benjamin Dauvergne il y a plus de 7 ans
Normaliser != encoder... faut choisir, si ça doit sortir en UTF-8 et que la longueur est en nombre d'octets et pas de codepoints il faut mesurer la chaîne encodée, pas normalisé. Tu pourrais expliciter l'objectif ? Pour moi l'objectif c'est de pouvoir passer indifféremment de l'UTF-8 ou de l'unicode en entrée de l'API (à l'exclusion des query string qui sont toujours des octets en UTF-8) et que ça marche.
Mis à jour par Benjamin Dauvergne il y a plus de 7 ans
Et manipuler en unicode à l'intérieur de la lib.
Mis à jour par Serghei Mihai il y a plus de 7 ans
- Fichier 0001-systempayv2-handle-properly-unicode-params-13562.patch 0001-systempayv2-handle-properly-unicode-params-13562.patch ajouté
Ça doit sortir en UTF-8, d'après la doc: https://payzen.eu/wp-content/uploads/integration/Guide_d_implementation_formulaire_paiement_V2_Payzen_V2.9f.pdf
Patch à jour.
Mis à jour par Benjamin Dauvergne il y a plus de 7 ans
Ok ça sort en UTF-8 ça n'a aucun rapport avec ce qui est fait là, là c'est la validation que la donnée correspond au format attendu, pour la longueur il faut savoir si la contrainte est en codepoint ou en octets, est-ce écrit dans la doc ?
Mis à jour par Serghei Mihai il y a plus de 7 ans
Pas de spécification précise là-dessus. Mais de la phrase: "Tous les paramètres ci-dessous contenant des caractères spéciaux devront être encodés et transmis à la plateforme de paiement en UTF-8." je déduis qu'il s'agit d'une contrainte en octets.
Mis à jour par Benjamin Dauvergne il y a plus de 7 ans
Et donc len(force_text(value)) > self.max_length
c'est ok pour toi ? Ça mesure bien en octets ?
Mis à jour par Serghei Mihai il y a plus de 7 ans
- Fichier 0001-systempayv2-handle-properly-unicode-params-13562.patch 0001-systempayv2-handle-properly-unicode-params-13562.patch ajouté
Misère!
Le patch proposé dans #12546 fait déjà ce boulot. Je viens de l'intégrer.
Mis à jour par Benjamin Dauvergne il y a plus de 7 ans
Si tu ne lis pas les commentaires que je fais... t'es mainteneur faut relire tous les tickets :)
Mis à jour par Serghei Mihai il y a plus de 7 ans
- Fichier 0001-systempayv2-handle-properly-unicode-params-13562.patch 0001-systempayv2-handle-properly-unicode-params-13562.patch ajouté
Alors c'est mieux de traiter tous les paramètres en entrée comme unicode et passer en utf-8 uniquement lors de la vérification de la signature.
Test mis à jour et testé en vrai sur Payzen. Les prénom/nom avec accents remontent dans Payzen.
Mis à jour par Serghei Mihai il y a plus de 7 ans
- Lié à Development #13592: gérer les paramètres en entrée de l'API en unicode ajouté
Mis à jour par Benjamin Dauvergne il y a plus de 7 ans
À mon avis c'est pas bon vu que tu ne sais pas si value est de l'unicode ou pas quand tu mesures, mais bon allons y, ack.
Mis à jour par Serghei Mihai il y a plus de 7 ans
J'ai l'impression que si, request
transforme tous ses paramètres en entrée en unicode et appele check_value
Mis à jour par Benjamin Dauvergne il y a plus de 7 ans
Justement il utilise unicode qui va exploser sur de l'UTF-8 au lieu de force_text, la fonction unicode()
il ne faudrait plus s'en servir, c'est l'objet de l'autre ticket que tu as ouvert (mais où les choses ne me semblent pas partir dans ce sens donc je vais faire un commentaire). Ack pour celui-ci.
Mis à jour par Benjamin Dauvergne il y a plus de 7 ans
Et pour répondre à ta réponse si les value sont de l'unicode len(value)
va renvoyer une réponse en codepoint (caractère unicode) et pas en octets comme l'attend systempayv2 (je crois).
Mis à jour par Serghei Mihai il y a plus de 7 ans
- Statut changé de En cours à Résolu (à déployer)
Ok. J'ai poussé.
commit 09f2ec7e3de738c8cc489196c63a64fecabc7777 Author: Serghei Mihai <smihai@entrouvert.com> Date: Wed Oct 12 10:59:58 2016 +0200 systempayv2: handle properly unicode params (#13562)
Mis à jour par Serghei Mihai il y a plus de 7 ans
Je viens de tester un paiement vers Payzen avec un prénom en unicode de 63 caractères.
Ça passe dans Payzen. Donc la longueur est calculée en codepoints, on a fait une fausse hypothèse.
Mis à jour par Benjamin Dauvergne il y a plus de 7 ans
Ok mais donc le code est bon là, il mesure en codepoints (il mesure selon le format d'entrée dans la chaîne, maintenant il faut s'assurer que c'est toujours de l'unicode, c'est l'objet de l'autre ticket).
systempayv2: handle properly unicode params (#13562)