[spip-dev] Problème avec #URL_ACTION_AUTEUR

Hello,

Pour le plugin Boussole, j’ai eu besoin de créer une action sans argument qui redirige en fin de traitement sur la page en cours.

J’ai donc créé un bouton d’action pour faire :

[(#BOUTON_ACTION{
<:boussole:bouton_actualiser_caches:>,
#URL_ACTION_AUTEUR{serveur_actualiser_caches, ‘’, #SELF},
‘’, ‘’, ‘’})]

Ensuite, dans l’action j’ai :

  1. sécurisé l’action en faisant :
    $securiser_action = charger_fonction(‘securiser_action’, ‘inc’);
    $securiser_action();

  2. vérifié les autorisation

  3. lancé le traitement sur les caches

  4. rien d’autre, je n’ai pas choisi de faire une redirection par défaut

Bizarrement, j’ai d’abord récupéré systématiquement un accès interdit.

J’ai supprimé la sécurisation pour tester et là pas de souci le traitement a bien été effectué mais pas de redirection, donc pas de rafraissimenent de la page.

J’ai donc regardé le code généré par le form et je me suis aperçu que l’attribut action du form était incorrect, l’url de redirection étant affectée au paramètre arg et non redirect.

En effet, en regardant le code de la fonction balise_url

function balise_URL_ACTION_AUTEUR_dist($p) {
$p->descr[‘session’] = true;

$p->code = interprete_argument_balise(1,$p);
$args = interprete_argument_balise(2,$p);
if ($args != “’’” && $args!==NULL)
$p->code .= “,”.$args;
$redirect = interprete_argument_balise(3,$p);
if ($redirect != “’’” && $redirect!==NULL)
$p->code .= “,”.$redirect;

$p->code = “generer_action_auteur(” . $p->code . “)”;
$p->interdire_scripts = false;
return $p;
}

on voit que si l’argument 2 est vide on ne met pas de virgule donc si l’argument 3 est non vide il devient automatiquement l’argument 2 ce qui est erroné.

En enlevant le test if ($args != “’’” && $args!==NULL) tout fonctionne à nouveau, la sécurisation et la redirection.

Est ce que mon analyse est bonne parce que j’ai jamais trop senti les actions ? Si oui, est ce la bonne correction ?

Oui effectivement, c’est un bug, j’étais tombé dessus aussi il n’y a pas si longtemps, et je l’ai honteusement contourné au lieu de le traquer.

Mais attention, si tu enlèves le test ça va planter dans le cars $args===NULL
Il faut sans doute virer le test et ajouter un
if ($args===NULL) $args = “’’”;

Cédric

Yop,

J’ai mis un argument à l’action, même si sans utilité ^^

Ok, pareil :p.

Mais tu le traites en sécu au début de l’action ou même pas ?

* Eric tapuscrivait, le 12/08/2013 14:56:

Comment as-tu fait d'ailleurs car je vais devoir le faire aussi proprement
que possible car le plugin fonctionne à partir de 3.0.0 ?

C'est une question que je me pose depuis un certains temps :
Même si un plugin fonctionne avec une ancienne version d'une branche de SPIP, est-ce que ce n'est pas de notre responsabilité de créateurs de plugins que d'exiger la version la plus récente de la branche en question pour "pousser" les utilisateurs à avoir une version de SPIP sans trous de sécurité connus.