Closed brunob closed 2 years ago
Après quelques tests, je vois que le formulaire poster_message comporte la même valeur pour le champ hidden formulaire_action_sign
dans pour le même post affiché dans deux fenêtres utilisant un compte différent, ce qui génère le logo suivant Pub:ERREUR: signature ajax form incorrecte : poster_message (formulaire signe mais ne correspond pas a la session)
qui semble bien justifié.
Il semble donc y avoir un problème de cache avec ce formulaire, ce qui entre en conflit avec le nouveau système de jeton de formulaire introduit par SPIP 3.2.12 et qui expliquerait que l'ajout d'un #CACHE{0}
dans le squelette du formulaire fixe le bug. Avant d'appliquer ce patch tout bête, j'aimerais mieux comprendre le bug, à suivre...
PS : les squelettes qui affichent ce formulaire passent par la fonction microcache
, c'est une piste à suivre.
En regardant en détail ce qui se passe dans le cache, depuis la page d'un message dans le même cas de figure que cité plus haut (page affichée par deux comptes différents dans deux fenêtre distinctes) :
formulaire_action_sign
dans tmp/cacheformulaire_action_sign
Donc, une noisette contenant le formulaire et mise en cache par microcache fait que le formulaire en question comporte la même valeur de jeton dans le hidden formulaire_action_sign
, ce qui génère l'erreur quand on tente de poster le formulaire (sauf pour l'auteur qui a généré la mise en cache). Ça explique pourquoi ça fonctionne bien quand on relcalcule la page...
Et pour confirmer que ça vient bien de microcache, si dans https://github.com/seenthis/seenthis_squelettes/blob/master/message.html#L22 je remplace [(#ID_ME|microcache{noisettes/message/afficher_message})]
par <INCLURE{fond=noisettes/message/afficher_message,id=#ID_ME}>
alors on a bien un jeton différent pour chaque fichier de cache du formulaire.
Pour palier à ce cas de figure, il faudrait que https://git.spip.net/spip/spip/commit/fea5b5b4507cc9c0b9e91bbfbf34fe40b0bea805 utilise l'argument => nope, pas mieux$att
de securiser_action()
?
c'est surtout qu'un formulaire doit toujours être dynamique et jamais jamais mis en cache en commun, et donc c'est un problème du squelette appelant (ou de l'un de ses parents) ou du système de cache propre à ST, de garder ça "statiquement" non ? C'est comme avoir un form dans un squelette inclus par #INCLURE statique, ça doit être interdit normalement…
Patch de base proposé, comme je le disais sur IRC :
ça ne me choque pas des masses d'ajouter un cache à 0 dans le form, il contient déjà :
HTTP_HEADER{"Cache-Control: no-store, no-cache, must-revalidate"}
HTTP_HEADER{"Pragma: no-cache"}
Grml, il semble que ça ne règle pas le bug, après plusieurs vidanges de cache, les gens remonte encore l'erreur, et cette fois je vois plein de Pub:ERREUR: signature ajax form incorrecte : poster_message (formulaire non signe mais on a une session)
dans formulaires.log :(
Ha ben wala... @Fil disait il y a 9 ans :
cela dit, pourquoi un formulaire se trouve-t-il en microcache... https://git.spip.net/spip-contrib-extensions/seenthis_microcache/commit/f3c3949b23f56cc7334ddd599e68985335616063
Il est bien là le bug !
Et ici aussi il est mention de problème avec microcache et les formulaires https://github.com/seenthis/seenthis_squelettes/commit/6ee1f7f7453384bcf716f76e124b2af876a7968d#diff-be92c1d33270d515e882f1234bba9136d4040b0756ce8c16613acb01ec9c8370
Bref, on n'a pas sorti le cul des ronces...
Après avoir retourné le problème dans tous les sens, je ne vois qu'une solution, charger le formulaire en ajax comme on le fait déjà pour le formulaire modifier_me cf https://github.com/seenthis/seenthis_squelettes/blob/master/noisettes/message/afficher_un_message.html#L41
Signalé ici https://seenthis.net/messages/941656#message941753
Suite au passage en 3.2.12 le formulaire poster_message génère une erreur, le plus souvent lors d'un post de commentaire, cf les logs :
Cela semble aussi impacter le formulaire de login, qu'on surcharge ici https://github.com/seenthis/seenthis_squelettes/tree/master/formulaires cf le log :
En attendant, pour permettre aux gens d'utiliser le site je suis revenu avant le commit https://git.spip.net/spip/spip/commit/fea5b5b4507cc9c0b9e91bbfbf34fe40b0bea805 sur SPIP et ça règle le bug.
J'ai testé en local et je reproduis le bug, si j'ajoute un
#CACHE{0}
au formulaire poster_message, je peux poster des commentaires sans problèmes avec deux comptes différents sur la même page.Concernant le formulaire de login, je ne reproduis pas en local.