Projet

Général

Profil

Development #58846

Création de doublons de compte par double-clic

Ajouté par Valentin Deniaud il y a plus de 2 ans. Mis à jour il y a plus de 2 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
22 novembre 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

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.


Fichiers

Révisions associées

Révision 93b36314 (diff)
Ajouté par Valentin Deniaud il y a plus de 2 ans

views: prevent race condition during registration (#58846)

Historique

#3

Mis à jour par Valentin Deniaud il y a plus de 2 ans

  • Assigné à mis à Valentin Deniaud
#4

Mis à jour par Valentin Deniaud il y a plus de 2 ans

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

Mis à jour par Thomas Noël il y a plus de 2 ans

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

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

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

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

  • Statut changé de Solution proposée à En cours
#9

Mis à jour par Valentin Deniaud il y a plus de 2 ans

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

Mis à jour par Thomas Noël il y a plus de 2 ans

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

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

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

Mis à jour par Valentin Deniaud il y a plus de 2 ans

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

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

  • Statut changé de Solution proposée à Solution validée
#14

Mis à jour par Valentin Deniaud il y a plus de 2 ans

  • Statut changé de Solution validée à 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

Mis à jour par Frédéric Péters il y a plus de 2 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF