Development #34950
Le mot de passe utilisateur est mis à jour avec l'API get_or_create
Début:
18 juillet 2019
Echéance:
% réalisé:
0%
Temps estimé:
Patch proposed:
Oui
Planning:
Non
Description
Je m'en suis rendu compte en passant le mot de passe dans le payload,
mais c'est également le cas dans le test ci-dessous.
def test_api_users_get_or_create_keep_password(settings, app, admin): app.authorization = ('Basic', (admin.username, admin.username)) payload = { 'email': 'john.doe@example.net', 'first_name': 'John', 'last_name': 'Doe', } resp = app.post_json('/api/users/?get_or_create=email', params=payload, status=201) id = resp.json['id'] assert User.objects.get(id=id).first_name == 'John' assert User.objects.get(id=id).last_name == 'Doe' password = User.objects.get(id=id).password # check password does not change resp = app.post_json('/api/users/?get_or_create=email', params=payload, status=201) assert User.objects.get(id=id).password == password
Fichiers
Révisions associées
Historique
Mis à jour par Nicolas Roche il y a presque 5 ans
- Tracker changé de Support à Bug
- Sujet changé de Le mot de passe utilisateur est mis à jour avec get_or_create à Le mot de passe utilisateur est mis à jour avec l'API get_or_create
Mis à jour par Nicolas Roche il y a presque 5 ans
Je précise le ticket car je n'ai pas était clair.
Le test ci-dessus échoue : le md5 du mot de passe est mis à jour.
Mon test initial (qui échoue aussi) était le suivant :
def test_api_users_get_or_create_update_password(settings, app, admin): app.authorization = ('Basic', (admin.username, admin.username)) payload = { 'email': 'john.doe@example.net', 'first_name': 'John', 'last_name': 'Doe' } resp = app.post_json('/api/users/?get_or_create=email', params=payload, status=201) id = resp.json['id'] assert User.objects.get(id=id).first_name == 'John' assert User.objects.get(id=id).last_name == 'Doe' password = User.objects.get(id=id).password # check password does not change payload['password'] = 'SeCrEt' resp = app.post_json('/api/users/?get_or_create=email', params=payload, status=201) assert User.objects.get(id=id).password == password # <-- échoue ici
Je l'ai écrit car je me suis rendu compte qu'en ré-utilisant get_or_create pour #34464,
je devais utiliser le nouveau mot de passe inscrit dans le payload pour me connecter.
Au cas ou cela puisse aider, voici un cas qui fonctionne :
def test_api_users_get_or_create_ici_cest_bon(settings, app, admin): app.authorization = ('Basic', (admin.username, admin.username)) payload = { 'email': 'john.doe@example.net', 'first_name': 'John', 'last_name': 'Doe', 'password': 'SeCrEt' } resp = app.post_json('/api/users/?get_or_create=email', params=payload, status=201) id = resp.json['id'] assert User.objects.get(id=id).first_name == 'John' assert User.objects.get(id=id).last_name == 'Doe' password = User.objects.get(id=id).password # check password does not change resp = app.post_json('/api/users/?get_or_create=email', params=payload, status=201) assert User.objects.get(id=id).password == password # <-- ok
Ça me donne l'impression que le champ est ajouté par get_or_create
s'il n'existait pas.
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
- Fichier 0001-api-prevent-password-change-on-get_or_create-34950.patch 0001-api-prevent-password-change-on-get_or_create-34950.patch ajouté
- Tracker changé de Bug à Development
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Mis à jour par Nicolas Roche il y a plus de 4 ans
- Statut changé de Solution proposée à Solution validée
J'observe bien le bon comportement attendu :
il n'y a pas de mise à jour du mot de passe sur le second get_or_create (même si un nouveau mot de passe est passé).
Merci !
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit d79de5eca4450caee514089ee2df3ffd43f27d14 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Mon Aug 12 11:27:15 2019 +0200 api: prevent password change on get_or_create (#34950)
Mis à jour par Frédéric Péters il y a plus de 4 ans
- Statut changé de Résolu (à déployer) à Solution déployée
api: prevent password change on get_or_create (#34950)