Skip to content
Extraits de code Groupes Projets
Valider 5c21d893 rédigé par cerdic's avatar cerdic Validation de marcimat
Parcourir les fichiers

fix: collecter correctement les arguments des formulaires insérés dans un...

fix: collecter correctement les arguments des formulaires insérés dans un modèle + généralisation du traitement des balise dynamiques dans un modèle

Refs: #5016
parent 996e174b
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -12,6 +12,7 @@
### Changed
- #5016 Généralisation du traitement des balises dynamiques dans un modèle
- #5272 Compatibilité avec PHP 8.2
- #5025 Prise en charge de l'utf8 pour le filtre `|match` en appliquant par défaut le modificateur u (PCRE_UTF8)
- spip-team/securite#4835 utiliser json_decode au lieu de serialize pour _oups dans le formulaire d'edition de liens
......@@ -25,6 +26,7 @@
### Fixed
- #5016 Collecte des arguments sur les formulaires dans un modèle
- #5274 Homogénéiser les labels des listes
### Removed
......
......@@ -134,19 +134,6 @@ function balise_FORMULAIRE__dist($p) {
// sinon renvoyer un code php dynamique
$p = calculer_balise_dynamique($p, $p->nom_champ, []);
if (
!test_espace_prive()
and !empty($p->descr['sourcefile'])
and $f = $p->descr['sourcefile']
and basename(dirname($f)) === 'modeles'
) {
// un modele est toujours inséré en texte dans son contenant
// donc si on est dans le public avec un cache on va perdre le dynamisme
// et on risque de mettre en cache les valeurs pre-remplies du formulaire
// on injecte donc le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
$p->code = "'<'.'?php echo (" . texte_script($p->code) . "); ?'.'>'";
// dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave)
}
return $p;
}
......
......@@ -450,7 +450,7 @@ define('_SPIP_EXTRA_VERSION', '-dev');
# define('_DEV_VERSION_SPIP_COMPAT', '4.1.99');
// version des signatures de fonctions PHP
// (= date de leur derniere modif cassant la compatibilite et/ou necessitant un recalcul des squelettes)
$spip_version_code = 2022_04_13;
$spip_version_code = 2022_08_23;
// version de la base SQL (= Date + numero incremental a 2 chiffres YYYYMMDDXX)
$spip_version_base = 2022_02_23_02;
......
......@@ -363,6 +363,31 @@ function argumenter_squelette($v) {
}
}
/**
* Fonction proxy pour retarder le calcul d'un formulaire si on est au depart dans un modele
*
* un modele est toujours inséré en texte dans son contenant
* donc si on est dans le public avec un cache on va perdre le dynamisme
* et on risque de mettre en cache les valeurs pre-remplies du formulaire
* on passe donc par une fonction proxy qui si besoin va collecter les arguments
* et injecter le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
* (dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave))
*
* @see calculer_balise_dynamique()
*
* @param ...$args
* @return string
*/
function executer_balise_dynamique_dans_un_modele(...$args) {
if (test_espace_prive()) {
return executer_balise_dynamique(...$args);
}
else {
$str_args = base64_encode(serialize($args));
return "<?" . "php \$_zargs=unserialize(base64_decode('$str_args'));echo executer_balise_dynamique(...\$_zargs); ?".">\n";
}
}
/**
* Calcule et retourne le code PHP retourné par l'exécution d'une balise
......
......@@ -570,6 +570,10 @@ define('CODE_EXECUTER_BALISE', "executer_balise_dynamique('%s',
array(%s%s),
array(%s%s))");
define('CODE_EXECUTER_BALISE_MODELE', "executer_balise_dynamique_dans_un_modele('%s',
array(%s%s),
array(%s%s))");
/**
* Calcule le code PHP d'exécution d'une balise SPIP dynamique
......@@ -591,6 +595,7 @@ define('CODE_EXECUTER_BALISE', "executer_balise_dynamique('%s',
* @see executer_balise_dynamique()
* Code PHP produit qui chargera les fonctions de la balise dynamique à l'exécution,
* appelée avec les arguments calculés.
* @see executer_balise_dynamique_dans_un_modele()
* @param Champ $p
* AST au niveau de la balise
* @param string $nom
......@@ -625,8 +630,22 @@ function calculer_balise_dynamique($p, $nom, $l, $supp = []) {
}
$collecte = collecter_balise_dynamique($l, $p, $nom);
$dans_un_modele = false;
if (!empty($p->descr['sourcefile'])
and $f = $p->descr['sourcefile']
and basename(dirname($f)) === 'modeles'
) {
$dans_un_modele = true;
}
// un modele est toujours inséré en texte dans son contenant
// donc si on est dans le public avec un cache on va perdre le dynamisme
// et on risque de mettre en cache les valeurs pre-remplies du formulaire
// on passe donc par une fonction proxy qui si besoin va collecter les arguments
// et injecter le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
// (dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave))
$p->code = sprintf(
CODE_EXECUTER_BALISE,
$dans_un_modele ? CODE_EXECUTER_BALISE_MODELE : CODE_EXECUTER_BALISE,
$nom,
join(',', $collecte),
($collecte ? $param : substr($param, 1)), # virer la virgule
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter