Projet

Général

Profil

Bug #19217

crash UnicodeDecodeError SQL sur champ mot de passe avec des accents

Ajouté par Thomas Noël il y a plus de 6 ans. Mis à jour il y a environ 5 ans.

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

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Exception:
  type = '<type 'exceptions.UnicodeDecodeError'>', value = ''ascii' codec can't decode byte 0xc3 in position 2: ordinal
not in range(128)'

Stack trace (most recent call first):
  File "/usr/lib/python2.7/dist-packages/wcs/sql.py", line 986, in get_sql_dict_from_data
   984                 if field.key in ('ranked-items', 'password'):
   985                     # turn {'poire': 2, 'abricot': 1, 'pomme': 3} into an array
>  986                     value = [[x, unicode(y).encode('utf-8')] for x, y in value.items()]
   987                 elif sql_type == 'varchar':
   988                     assert isinstance(value, basestring)

  locals:
     sql_type = 'text[][]'
     sql_dict = {'f5': 'hackettclap'}
     formdef = <FormDef "..." id:68>
     self = <Form-Truc- ... n\xc2\xb068-
168" id:168>
     value = {'sha1': 'a0631d3b4de71dc66f2cc1f12a58ef3c03989f9e', 'cleartext': 'xxx\xc3\xa8xxx', 'md5': 'b022c50fdcd786d58e857578809186e6'}
     field = <wcs.fields.PasswordField object at 0x7f4af3921b90>
     y = 'xxx\xc3\xa8xxx'
     x = 'cleartext'
     data = {'10': '1', '10_structured': {'date': '05/10/2017', 'text': 'test fonctionnement - 05/10/2017', 'evenement':
'test fonctionnement', 'id': '1'}, 'future_tracking_code': '....', '10_display': 'test fonctionnement - 05/10/2017',
'5': 'hackettclap', '7': 'login@gmail', '6': {'sha1': 'a0631d3b4de71dc66f2cc1f12a58ef3c03989f9e',
'cleartext': 'xxx\xc3\xa8xxx', 'md5': 'b022c50fdcd786d58e857578809186e6'}, 'draft_formdata_id': 168}

Fichiers

Révisions associées

Révision d8603449 (diff)
Ajouté par Frédéric Péters il y a environ 5 ans

misc: don't crash storing unicode passwords for logged users (#19217)

Historique

#1

Mis à jour par Frédéric Péters il y a environ 6 ans

  • Priorité changé de Normal à Haut
#2

Mis à jour par Frédéric Péters il y a environ 5 ans

Pas compris jusqu'au bout, j'arrive à reproduire uniquement en étant d'abord loggué, et je n'arrive pas à produire un jeu de test exposant l'erreur.

#3

Mis à jour par Frédéric Péters il y a environ 5 ans

(adaptation pour que ça continue à fonctionner avec les champs "éléments classés", qui utilisent des entiers).

#5

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

  • Assigné à mis à Benjamin Dauvergne
#6

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

En fait le problème n'apparait qu'avec .enabled_tracking_code qui provoque la sauvegarde d'un draft qui n'utilise pas formdef.get_data(form) mais sauve directement le contenu soumi (hors le widget PasswordField fait des manips via json.loads/dumps et donc on se retrouve avec de l'unicode en plein milieu).

En ajoutant ces modifications, le bug se produit (et en virant ta correction):

diff --git a/tests/test_form_pages.py b/tests/test_form_pages.py
index dd097407..d6aee513 100644
--- a/tests/test_form_pages.py
+++ b/tests/test_form_pages.py
@@ -1774,6 +1774,7 @@ def test_form_direct_draft_access(pub):

 def form_password_field_submit(app, password):
     formdef = create_formdef()
+    formdef.enable_tracking_codes = True
     formdef.fields = [fields.PasswordField(id='0', label='password',
         formats=['sha1', 'md5', 'cleartext'])]
     formdef.store()
@@ -1801,7 +1802,7 @@ def form_password_field_submit(app, password):
 def test_form_password_field_submit(pub):
     user = create_user(pub)
     form_password_field_submit(get_app(pub), 'foobar')
-    form_password_field_submit(get_app(pub), 'foobar\u00eb')
+    form_password_field_submit(get_app(pub), '\xe2\x80\xa2\t83003706')
     form_password_field_submit(login(get_app(pub), username='foo', password='foo'), 'foobar\u00eb')

 def test_form_multi_page_formdef_count_condition(pub):

Me semble qu'il y aurait tout de même à voir du coté de save_draft() et de PasswordField (le premier parce que je ne comprends pas très bien pourquoi ça ne passe pas par formde.get_data(form) pour remplir formdata.data et le deuxième pour qu'il ne produise pas d'unicode au milieu d'un monde en `str`).

Nouveau patch avec mes modifications aux tests et virant un print trainant.

#7

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

  • Assigné à Benjamin Dauvergne supprimé

Et aussi ta chaîne ne provoque pas de trace UnicodeDecodeError, j'ai repris celle du bug initial:

>>> unicode('foobar\u00eb')
u'foobar\\u00eb'

#8

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

  • Assigné à mis à Frédéric Péters
#9

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

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

N'ayant pas modifié le cœur de la correction je valide.

#10

Mis à jour par Frédéric Péters il y a environ 5 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit d86034497a8975aeb897433c8093678681593e91
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Mon Dec 31 10:14:43 2018 +0100

    misc: don't crash storing unicode passwords for logged users (#19217)
#11

Mis à jour par Frédéric Péters il y a environ 5 ans

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

Formats disponibles : Atom PDF