Projet

Général

Profil

Development #34950

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

Ajouté par Nicolas Roche il y a presque 5 ans. Mis à jour il y a plus de 4 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
API
Version cible:
-
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

Révision d79de5ec (diff)
Ajouté par Benjamin Dauvergne il y a plus de 4 ans

api: prevent password change on get_or_create (#34950)

Historique

#1

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
#3

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.

#4

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

  • Assigné à mis à Benjamin Dauvergne
#5

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

#6

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 !

#7

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)
#8

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

Formats disponibles : Atom PDF