Project

General

Profile

Développement #58846

Création de doublons de compte par double-clic

Added by Valentin Deniaud about 3 years ago. Updated about 3 years ago.

Status:
Fermé
Priority:
Normal
Category:
-
Target version:
-
Start date:
22 November 2021
Due date:
% Done:

0%

Estimated time:
Patch proposed:
Yes
Planning:
No

Description

Il est possible de soumettre plusieurs fois le formulaire de création de compte et se faisant de créer plusieurs fois le même compte.


Files

Associated revisions

Revision 93b36314 (diff)
Added by Valentin Deniaud about 3 years ago

views: prevent race condition during registration (#58846)

History

#3

Updated by Valentin Deniaud about 3 years ago

  • Assignee set to Valentin Deniaud
#4

Updated by Valentin Deniaud about 3 years ago

Avant même de s'intéresser au double clic, il faut se demander pourquoi le mécanisme de jeton d'inscription n'a pas permis d'éviter la création multiple des comptes, alors qu'il devrait justement servir à ça.

En fait c'est parce qu'on vérifie sa présence en début de requête sans le supprimer, bien obligé de faire comme ça parce qu'il faut qu'il reste valable en cas d'erreur de validation, par exemple. Par contre, on le supprime juste après avoir créé l'utilisateur, c'est ça qui ne va pas.

Patch qui remonte de deux lignes la suppression pour la mettre avant le super().form_valid(form) qui crée l'utilisateur, et on vérifie qu'un jeton a bien été supprimé avant de l'appeler.

(je peux ajouter le même JS que dans wcs en plus si c'est jugé nécessaire)

#6

Updated by Thomas Noël (congés → 5 décembre) about 3 years ago

Mon avis de profane :
  • mettre un petit commentaire qui explicite que super().form_valid() est le moment qui créé effectivement le compte (et qu'on veut donc éviter de rejouer)
  • on ne devrait pas envoyer vers registration_success en cas de détection de rejeu, parce que cette fonction contient des actions (mail, hook) qu'on ne veut pas rejouer non plus
  • à la place, afficher un message sibyllin "Votre compte est déjà créé"
  • malheureusement en cas de double-clic c'est ce dernier message qui va s'afficher : pour l'éviter, avoir du css/js pour éviter le double-clic
#7

Updated by Benjamin Dauvergne about 3 years ago

Ok avec Thomas, mais tu peux oublier son point 4, c'est tellement rare qu'avoir "juste" un message différent dans ce cas n'est pas bien grave, un double clique c'est un rejeu.

#8

Updated by Benjamin Dauvergne about 3 years ago

  • Status changed from Solution proposée to En cours
#9

Updated by Valentin Deniaud about 3 years ago

Oui l'important c'est surtout d'avoir le else: et de ne pas envoyer plusieurs fois le mail.

J'ai fait le patch mais du coup le comportement c'est :
  • Double clic
  • La réponse de la création de compte envoyée par registration_success est zappée
  • À la place on redirige l'utilisateur vers la page de login qui lui affiche « Votre compte est déjà créé »

Mais l'usager n'a rien demandé, il vient juste de se créer un compte. Est-ce qu'on ne pourrait pas plutôt faire un effort pour masquer le schmilblick, c'est à dire tenter une réponse normale en loggant l'utilisateur et en affichant le message de « Vous avez bien créé votre compte » classique ? (la seule différence serait faire attention à ne pas appeler 2 fois le hook et l'envoi d'email)

#10

Updated by Thomas Noël (congés → 5 décembre) about 3 years ago

Valentin Deniaud a écrit :

Mais l'usager n'a rien demandé, il vient juste de se créer un compte. Est-ce qu'on ne pourrait pas plutôt faire un effort pour masquer le schmilblick, c'est à dire tenter une réponse normale en loggant l'utilisateur et en affichant le message de « Vous avez bien créé votre compte » classique ? (la seule différence serait faire attention à ne pas appeler 2 fois le hook et l'envoi d'email)

Tout à fait d'accord avec ça.

#11

Updated by Benjamin Dauvergne about 3 years ago

Valentin Deniaud a écrit :

Mais l'usager n'a rien demandé, il vient juste de se créer un compte. Est-ce qu'on ne pourrait pas plutôt faire un effort pour masquer le schmilblick, c'est à dire tenter une réponse normale en loggant l'utilisateur et en affichant le message de « Vous avez bien créé votre compte » classique ? (la seule différence serait faire attention à ne pas appeler 2 fois le hook et l'envoi d'email)

Oui si le message ne sert à rien, ne pas l'afficher :) Je suis d'accord aussi.

#12

Updated by Valentin Deniaud about 3 years ago

Voilà, découpage de registration_success pour pouvoir appeler séparément envoi d'email/hook et login/redirection.

Valentin Deniaud a écrit :

tenter une réponse normale en loggant l'utilisateur

Ça nécessite un petit bout pour choper l'utilisateur qui vient d'être créé par la première requête dans la deuxième, ça ajoute un cas d'erreur si on ne le trouve pas mais ça ne devrait jamais arriver. En tout cas c'est testé.

#13

Updated by Benjamin Dauvergne about 3 years ago

  • Status changed from Solution proposée to Solution validée
#14

Updated by Valentin Deniaud about 3 years ago

  • Status changed from Solution validée to Résolu (à déployer)
commit 34363573e6ac2dfcb99d433a704412d99b963932
Author: Valentin Deniaud <vdeniaud@entrouvert.com>
Date:   Wed Nov 24 12:09:05 2021 +0100

    views: prevent race condition during registration (#58846)
#15

Updated by Frédéric Péters about 3 years ago

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

Also available in: Atom PDF