Bug #19217
crash UnicodeDecodeError SQL sur champ mot de passe avec des accents
0%
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
Historique
Mis à jour par Frédéric Péters il y a environ 5 ans
- Fichier 0001-misc-don-t-crash-storing-unicode-passwords-for-logge.patch 0001-misc-don-t-crash-storing-unicode-passwords-for-logge.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
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.
Mis à jour par Frédéric Péters il y a environ 5 ans
- Fichier 0001-misc-don-t-crash-storing-unicode-passwords-for-logge.patch 0001-misc-don-t-crash-storing-unicode-passwords-for-logge.patch ajouté
(adaptation pour que ça continue à fonctionner avec les champs "éléments classés", qui utilisent des entiers).
Mis à jour par Benjamin Dauvergne il y a environ 5 ans
- Fichier 0001-misc-don-t-crash-storing-unicode-passwords-for-logge.patch 0001-misc-don-t-crash-storing-unicode-passwords-for-logge.patch ajouté
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.
Mis à jour par Benjamin Dauvergne il y a environ 5 ans
- Assigné à
Benjamin Dauvergnesupprimé
Et aussi ta chaîne ne provoque pas de trace UnicodeDecodeError, j'ai repris celle du bug initial:
>>> unicode('foobar\u00eb') u'foobar\\u00eb'
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.
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)
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
misc: don't crash storing unicode passwords for logged users (#19217)