Project

General

Profile

Development #34950

Le mot de passe utilisateur est mis à jour avec l'API get_or_create

Added by Nicolas Roche 2 months ago. Updated 16 days ago.

Status:
Solution déployée
Priority:
Normal
Category:
API
Target version:
-
Start date:
18 Jul 2019
Due date:
% Done:

0%

Patch proposed:
Yes
Planning:
No

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

0001-api-prevent-password-change-on-get_or_create-34950.patch View (6.83 KB) Benjamin Dauvergne, 12 Aug 2019 11:44 AM

Associated revisions

Revision d79de5ec (diff)
Added by Benjamin Dauvergne about 1 month ago

api: prevent password change on get_or_create (#34950)

History

#1 Updated by Nicolas Roche 2 months ago

  • Tracker changed from Support to Bug
  • Subject changed from Le mot de passe utilisateur est mis à jour avec get_or_create to Le mot de passe utilisateur est mis à jour avec l'API get_or_create

#3 Updated by Nicolas Roche 2 months ago

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.

#4 Updated by Benjamin Dauvergne about 1 month ago

  • Assignee set to Benjamin Dauvergne

#5 Updated by Benjamin Dauvergne about 1 month ago

#6 Updated by Nicolas Roche about 1 month ago

  • Status changed from Solution proposée to 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 !

#7 Updated by Benjamin Dauvergne about 1 month ago

  • Status changed from Solution validée to 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)

#8 Updated by Frédéric Péters 16 days ago

  • Status changed from Résolu (à déployer) to Solution déployée

Also available in: Atom PDF