Skip to content
Extraits de code Groupes Projets
Valider f3bf27c2 rédigé par esj's avatar esj
Parcourir les fichiers

Le validateur en boucle ne pouvait pas s'appliquer sur les répertoires des...

Le validateur en boucle ne pouvait pas s'appliquer sur les répertoires des squelettes de l'espace privé à cause d'une sécurité trop stricte. Du coup:

	- la fonction surchargeable {{{public_composer}}} retourne en valeur le code compilé du squelette, plutôt qu'un résultat mal défini (ça aurait dû être fait depuis longtemps);

	- au passage, elle ne teste plus l'existence d'un fichier associé au squelette de suffixe {{{fonctions.php3}}}, seulement {{{_fonctions.php}}};

	- le validateur exploite directement ce résultat pour calculer la page, ce qui évite le contrôle de sécurité excessif induit par le {{{recuperer_page}}} sur soi-même antérieur (ça garantit aussi qu'on tombera bien sur ce squelette, et c'est plus rapide)

Cette extension du validateur a permis d'exécuter

{{{./?exec=valider_xml&var_url=../prive/formulaires&ext=html}}}

et de détecter des erreurs, certaines corrigées par les dépots suivants, mais d'autres posent problème:

	- le formulaire {{{menu_lang}}} n'a pas de {{{div}}} après {{{form}}} comme le veut XHTML strict, mais la rajouter l'empêche son AJAX de fonctionner (pas corrigé, à revoir);

	- les formulaires {{{editer_mot}}} et {{{editer_site}}} annoncent un {{{id}}} par un {{{label}}} mais celui-ci ne figure pas directement dans le formulaire, c'est une inclusion ou un filtre qui le donne, et le validateur croit bien faire en signalant l'absence, et il n'a pas vraiment tort sur le plan méthodologique; il faudrait les reconcevoir.

Pour le validateur lui-même, il reste encore à fournir une URL correcte pour la validation d'un unique squelette privé. Là aussi un peu de méthode ne ferait pas de mal:

	- ne pas utiliser le paramètre {{{action}}} dans un environnement de squelette privé, ça clashe avec le répertoire public {{{action}}}, car le validateur n'a pas cette notion d'espace;

	- indiquer qq part les types des arguments (id_* ==> nombre etc).

Un tâche à ouvrir, car ça prendra des mois.
parent f5557215
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -97,14 +97,11 @@ function valider_xml_ok($url, $req_ext)
function valider_resultats($res, $ext)
{
foreach($res as $k => $l) {
$n = preg_match_all(",(.*?)(\d+)(\D+(\d+)<br />),",
$n = intval(preg_match_all(",(.*?)(\d+)(\D+(\d+)<br />),",
$l[3],
$regs,
PREG_SET_ORDER);
if ($n = intval($n)) {
$x = trim(substr(textebrut($l[3]),0,16)) .' ...';
} else $x = '';
$res[$k][3] = $x;
$r,
PREG_SET_ORDER));
$res[$k][3] = !$n ? '' : ($r[0][1] . ($n==1? '': ' ...'));
$res[$k][4] = $l[0];
$res[$k][0] = $n;
}
......@@ -122,7 +119,7 @@ function valider_resultats($res, $ext)
$h = (strpos($ext,'php') ===false)
? ($appel . '&var_mode=debug&var_mode_affiche=validation')
: generer_url_ecrire('valider_xml', "var_url=" . urlencode($appel));
: generer_url_ecrire('valider_xml', "var_url=" . urlencode($appel));
$table .= "<tr class='$class'>"
. "<td style='text-align: right'>$nb</td>"
......@@ -139,7 +136,6 @@ function valider_resultats($res, $ext)
. "</th><th>"
. _T('message')
. "</th><th>Page</th><th>args"
. "</th></tr>"
. $table
. "</table>";
......@@ -171,7 +167,6 @@ function valider_script($transformer_xml, $f, $dir)
if (!$g = charger_fonction($script . '_args', $dir, true)) {
$res = 0 - $res;
} else {
unset($GLOBALS['xhtml_error']);
$args = array(1, 'id_article', 1);
$page2 = $transformer_xml($f=$g, $args);
$appel = 'id_article=1&type=id_article&id=1';
......@@ -191,32 +186,75 @@ function valider_pseudo_url($dir, $script, $args='')
return ($dir == 'exec')
? generer_url_ecrire($script, $args, false, true)
: ("./?$dir=$script" . ($args ? "&$args" : ''));
}
// On essaye de valider tout squelette meme sans Doctype
// a moins qu'un Content-Type dise clairement que ce n'est pas du XML
// Il faudrait fournir une autre DTD que XHTML si le Content-Type y aide.
// (en particulier les RSS; voir si tous les agregateurs acceptent le DOCTYPE)
// http://doc.spip.org/@valider_skel
function valider_skel($transformer_xml, $f, $dir)
function valider_skel($transformer_xml, $file, $dir)
{
if (!lire_fichier ($f, $skel)) return array('/', '/', $f,'');
if (!strpos($skel, 'DOCTYPE')) return array('/', 'DOCTYPE?', $f,'');
$compiler = charger_fonction('compiler', 'public');
$skel_code = $compiler($skel, 'tmp', 'html', $f);
preg_match_all('/(\S*)[$]Pile[[]0[]][[].(\w+).[]]/', $skel_code, $r, PREG_SET_ORDER);
$contexte= array();
foreach($r as $v) {
$val = strpos($v[1],'intval') === false
? 'article'
: 1;
if (!isset($contexte[$v[2]]) OR $val==1)
$contexte[$v[2]] = $val;
if (!lire_fichier ($file, $skel)) return array('/', '/', $file,'');
if (!strpos($skel, 'DOCTYPE')) {
preg_match(",Content[-]Type: *\w+/(\S)+,", $skel, $r);
if ($r[1] === 'css' OR $r[1] === 'plain')
return array('/', 'DOCTYPE?', $file,'');
}
include_spip('public/parametrer'); // pour la fct suivante
$skel_nom = calculer_nom_fonction_squel($skel);
include_spip('public/assembler'); // pour recuperer_fond
$composer = charger_fonction('composer', 'public', 'html', $file);
$skel_code = $composer($skel, $skel_nom, 'html', $file);
$contexte = valider_contexte($skel_code, $file);
$page = $skel_nom(array('cache'=>''), array($contexte));
$page = $transformer_xml($page['texte']);
$url = '';
unset($contexte['lang']);
foreach($contexte as $k => $v) $url .= '&' . $k . '=' . $v;
$skel = basename($f,'.html');
$url = generer_url_public($skel, substr($url,1));
$page = $transformer_xml(recuperer_page($url));
return array(strlen($page), $skel, $url);
// URL a l'ouest pour les squelettes internes, a revoir.
$script = basename($file,'.html');
$url = generer_url_public($script, substr($url,1));
return array(strlen($page), $script, $url);
}
// Analyser le code pour construire un contexte plausible complet
// i.e. ce qui est fourni par $Pile[0]
// en eliminant les exceptions venant surtout des Inclure
// Il faudrait trouver une typologie pour generer un contexte parfait:
// actuellement ca produit parfois des erreurs SQL a l'appel de $skel_nom
function valider_contexte($code, $file)
{
static $exceptions = array('action', 'browser_caret', 'doublons', 'lang');
preg_match_all('/(\S*)[$]Pile[[]0[]][[].(\w+).[]]/', $code, $r, PREG_SET_ORDER);
$args = array();
// evacuer les repetitions et les faux parametres
foreach($r as $v) {
list(,$f, $nom) = $v;
if (!in_array($nom, $exceptions))
@$args[$nom] .= $f;
}
$contexte= array(); // etudier l'ajout de:
// 'lang' => $GLOBALS['spip_lang'],
// 'date' => date('Y-m-d H:i:s'));
foreach ($args as $nom => $f) {
if (strpos($f,'intval') === false)
$val = 'id_article';
else {
// on suppose que arg numerique => primary-key d'une table
// chercher laquelle et prendre un numero existant
$val = 0;
$type = (strpos($nom, 'id_') === 0) ? substr($nom,3) : $nom;
$trouver_table = charger_fonction('trouver_table', 'base');
$table = $trouver_table(table_objet_sql($type));
if ($table)
$val = @sql_getfetsel($nom, $table['table'], '', '','',"0,1");
// porte de sortie si ca marche pas,
if (!$val) $val = 1;
}
$contexte[$nom] = $val;
}
return $contexte;
}
// http://doc.spip.org/@valider_dir
......@@ -226,11 +264,15 @@ function valider_dir($files, $ext, $dir)
$transformer_xml = charger_fonction('valider', 'xml');
$valideur = $ext=='html' ? 'valider_skel' : 'valider_script';
foreach($files as $f) {
spip_log("valider $f");
spip_log("val $f");
spip_timer('valider');
unset($GLOBALS['xhtml_error']);
$val = $valideur($transformer_xml, $f, $dir);
$val[]= isset($GLOBALS['xhtml_error']) ? $GLOBALS['xhtml_error'] : '';
$res[]= $val;
spip_log("validation de $f: ($val[0] octets) en "
. spip_timer('valider'),
'valider');
}
return valider_resultats($res, $ext);
}
......
......@@ -31,7 +31,7 @@ include_spip('public/interfaces');
# Toutefois pour 2. et 3. preferer la technique de la surcharge
// http://doc.spip.org/@public_composer_dist
function public_composer_dist($squelette, $nom, $gram, $source, $connect) {
function public_composer_dist($squelette, $nom, $gram, $source, $connect='') {
$phpfile = sous_repertoire(_DIR_SKELS,'',false,true) . $nom . '.php';
......@@ -41,14 +41,12 @@ function public_composer_dist($squelette, $nom, $gram, $source, $connect) {
array('critique' => 'oui', 'phpcheck' => 'oui')))
eval('?'.'>'.$contenu);
# spip_log($contenu, 'comp')
if (@file_exists($fonc = $squelette . '_fonctions'.'.php')
OR @file_exists($fonc = $squelette . '_fonctions'.'.php3')) {
if (@file_exists($fonc = $squelette . '_fonctions'.'.php'))
include_once $fonc;
}
// tester si le eval ci-dessus a mis le squelette en memoire
if (function_exists($nom)) return $nom;
if (function_exists($nom)) return $contenu;
// charger le source, si possible, et compiler
if (lire_fichier ($source, $skel)) {
......@@ -66,7 +64,7 @@ function public_composer_dist($squelette, $nom, $gram, $source, $connect) {
eval('?'.'>'.$skel_code);
if (function_exists($nom)) {
ecrire_fichier ($phpfile, $skel_code);
return $nom;
return $skel_code;
} else {
erreur_squelette(_T('zbug_erreur_compilation'), $source);
}
......
......@@ -276,7 +276,7 @@ function public_parametrer_dist($fond, $local='', $cache='', $connect='') {
// Interdit de nettoyer, faut assumer l'histoire.
$GLOBALS['contexte'] = calculer_contexte();
if (!$renommer_urls) {
// compatibilite < 1.9.3
// compatibilite <= 1.9.2
charger_generer_url();
if (function_exists('recuperer_parametres_url'))
$renommer_urls = 'recuperer_parametres_url';
......@@ -326,11 +326,6 @@ function public_parametrer_dist($fond, $local='', $cache='', $connect='') {
list($skel,$mime_type, $gram, $sourcefile) =
$styliser($fond, $id_rubrique_fond, $GLOBALS['spip_lang'], $connect);
// calcul du nom du squelette
$fonc = $mime_type
. (!$connect ? '' : preg_replace('/\W/',"_", $connect)) . '_'
. md5($GLOBALS['spip_version_code'].' * '.$skel);
$debug = (isset($GLOBALS['var_mode']) && ($GLOBALS['var_mode'] == 'debug'));
// sauver le nom de l'eventuel squelette en cours d'execution
// (recursion possible a cause des modeles)
......@@ -340,15 +335,17 @@ function public_parametrer_dist($fond, $local='', $cache='', $connect='') {
// charger le squelette en specifiant les langages cibles et source
// au cas il faudrait le compiler (source posterieure au resultat)
if (!function_exists($fonc)) {
$fonc = calculer_nom_fonction_squel($skel, $mime_type, $connect);
$composer = charger_fonction('composer', 'public');
if (!function_exists($fonc)) {
if ($debug) {
$GLOBALS['debug_objets']['contexte'][$sourcefile] = $local;
$GLOBALS['debug_objets']['courant'] = $fonc;
}
$fonc = $composer($skel, $fonc, $gram, $sourcefile, $connect);
$composer = charger_fonction('composer', 'public');
if (!$composer($skel, $fonc, $gram, $sourcefile, $connect))
$fonc = false;
}
// Appliquer le squelette compile' sur le contexte.
......@@ -374,15 +371,17 @@ function public_parametrer_dist($fond, $local='', $cache='', $connect='') {
$val = "'$val'";
$infos[] = $var.'='.$val;
}
spip_log("calcul ("
.($profile = spip_timer($a))
.") [$skel] "
$profile = spip_timer($a);
spip_log("calcul ($profile) [$skel] "
. join(', ', $infos)
.' ('.strlen($page['texte']).' octets)'
);
if ($debug)
$GLOBALS['debug_objets']['profile'][$sourcefile] = $profile;
.' ('.strlen($page['texte']).' octets)');
if ($debug) {
include_spip('public/debug');
debug_dumpfile (strlen($page['texte'])?$page['texte']:" ", $fonc, 'resultat');
$GLOBALS['debug_objets']['courant'] = $courant;
$GLOBALS['debug_objets']['profile'][$sourcefile] = $profile;
}
// Si #CACHE{} n'etait pas la, le mettre a $delais
if (!isset($page['entetes']['X-Spip-Cache']))
$page['entetes']['X-Spip-Cache'] = isset($GLOBALS['delais'])?$GLOBALS['delais']:36000;
......@@ -390,11 +389,6 @@ function public_parametrer_dist($fond, $local='', $cache='', $connect='') {
} else
$page = array();
if ($debug) {
include_spip('public/debug');
debug_dumpfile (strlen($page['texte'])?$page['texte']:" ", $fonc, 'resultat');
$GLOBALS['debug_objets']['courant'] = $courant;
}
$page['contexte'] = $local;
if ($select) lang_select();
......@@ -408,4 +402,11 @@ function public_parametrer_dist($fond, $local='', $cache='', $connect='') {
return $page;
}
// calcul du nom du squelette
function calculer_nom_fonction_squel($skel, $mime_type='html', $connect='')
{
return $mime_type
. (!$connect ? '' : preg_replace('/\W/',"_", $connect)) . '_'
. md5($GLOBALS['spip_version_code'] . ' * ' . $skel);
}
?>
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter