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

Validation XML hors pages de l'espace privé: la Regexp du Doctype accepte que...

Validation XML hors pages de l'espace privé: la Regexp du Doctype accepte que celui-ci soit précédé de commentaires et Processing Instruction (<?xml etc) en nombre quelconque. De plus, en cas de Doctype absent ou mal écrit, le validateur prendra celui  de l'espace privé, savoir le XHTML1.0 transitionnal à ce jour. Entre autres, ca dispense de mettre un Doctype complet (avec l'URL de la DTD) dans ses squelettes si on le souhaite.
parent e1e67688
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -106,13 +106,13 @@ function balise_FORMULAIRE_ADMIN_dyn($float='', $debug='') { ...@@ -106,13 +106,13 @@ function balise_FORMULAIRE_ADMIN_dyn($float='', $debug='') {
!$var_preview !$var_preview
) )
) ? parametre_url(self(),'var_mode', 'debug', '&'): ''; ) ? parametre_url(self(),'var_mode', 'debug', '&'): '';
$analyser = !$xhtml ? "" : $analyser = !$xhtml ? "" :
(($xhtml === 'sax') ? (($xhtml === 'sax') ?
(parametre_url(self(), 'var_mode', 'debug', '&') (parametre_url(self(), 'var_mode', 'debug', '&')
.'&var_mode_affiche=validation') : .'&var_mode_affiche=validation') :
('http://validator.w3.org/check?uri=' ('http://validator.w3.org/check?uri='
. rawurlencode("http://" . $_SERVER['HTTP_HOST'] . nettoyer_uri()))); . rawurlencode("http://" . $_SERVER['HTTP_HOST'] . nettoyer_uri())));
// hack - ne pas avoir la rubrique si un autre bouton est deja present // hack - ne pas avoir la rubrique si un autre bouton est deja present
if ($id_article OR $id_breve) unset ($id_rubrique); if ($id_article OR $id_breve) unset ($id_rubrique);
...@@ -175,9 +175,9 @@ function balise_FORMULAIRE_ADMIN_dyn($float='', $debug='') { ...@@ -175,9 +175,9 @@ function balise_FORMULAIRE_ADMIN_dyn($float='', $debug='') {
$env['use_cache'] = ' *'; $env['use_cache'] = ' *';
if ($analyser) if ($analyser)
$env['analyser'] = $analyser; $env['analyser'] = $analyser;
if (isset($GLOBALS['xhtml_error'])) if (isset($GLOBALS['xhtml_error']) AND $GLOBALS['xhtml_error']) {
$env['xhtml_error'] = $GLOBALS['xhtml_error']; $env['xhtml_error'] = count($GLOBALS['xhtml_error']);
}
foreach (array('article','rubrique','auteur','breve','mot','syndic'=>'site') foreach (array('article','rubrique','auteur','breve','mot','syndic'=>'site')
as $id => $obj) { as $id => $obj) {
if (is_int($id)) $id = $obj; if (is_int($id)) $id = $obj;
......
...@@ -225,18 +225,24 @@ function sax_bug($data) ...@@ -225,18 +225,24 @@ function sax_bug($data)
$doctype = ""; $doctype = "";
$r = analyser_doctype($data); $r = analyser_doctype($data);
if ($r) { if (!$r) {
list ($doctype, $topelement, $avail, $grammaire, $rotlvl) = $r; $data = _MESSAGE_DOCTYPE . _DOCTYPE_ECRIRE
. preg_replace(_REGEXP_DOCTYPE, '', $data);
$r = analyser_doctype($data);
}
list($doctype, $topelement, $avail, $grammaire, $rotlvl) = $r;
//$data = str_replace('DOCTYPE','doctype',$doctype).substr($data,strlen($doctype)); //$data = str_replace('DOCTYPE','doctype',$doctype).substr($data,strlen($doctype));
$file = _DIR_CACHE_XML . preg_replace('/[^\w.]/','_', $rotlvl) . '.gz'; $file = _DIR_CACHE_XML . preg_replace('/[^\w.]/','_', $rotlvl) . '.gz';
if (lire_fichier($file, $r))
if (lire_fichier($file, $r)) {
$phraseur_xml->dtc = unserialize($r); $phraseur_xml->dtc = unserialize($r);
else { } else {
include_spip('xml/analyser_dtd'); include_spip('xml/analyser_dtd');
$phraseur_xml->dtc = charger_dtd($grammaire, $avail); $phraseur_xml->dtc = charger_dtd($grammaire, $avail);
if (($avail == 'PUBLIC' ) AND $phraseur_xml->dtc) if (($avail == 'PUBLIC' ) AND $phraseur_xml->dtc)
ecrire_fichier($file, serialize($phraseur_xml->dtc), true); ecrire_fichier($file, serialize($phraseur_xml->dtc), true);
}
} }
if ($phraseur_xml->dtc) { if ($phraseur_xml->dtc) {
...@@ -258,7 +264,7 @@ function analyser_doctype($data) ...@@ -258,7 +264,7 @@ function analyser_doctype($data)
if (!preg_match(_REGEXP_DOCTYPE, $data, $r)) if (!preg_match(_REGEXP_DOCTYPE, $data, $r))
return array(); return array();
list($doctype,,$topelement, $avail,$suite) = $r; list($doctype,$pi,$co,$pico, $topelement, $avail,$suite) = $r;
if (!preg_match('/^"([^"]*)"\s*(.*)$/', $suite, $r)) if (!preg_match('/^"([^"]*)"\s*(.*)$/', $suite, $r))
if (!preg_match("/^'([^']*)'\s*(.*)$/", $suite, $r)) if (!preg_match("/^'([^']*)'\s*(.*)$/", $suite, $r))
...@@ -266,15 +272,18 @@ function analyser_doctype($data) ...@@ -266,15 +272,18 @@ function analyser_doctype($data)
list(,$rotlvl, $suite) = $r; list(,$rotlvl, $suite) = $r;
if (!$suite) { if (!$suite) {
if ($avail != 'SYSTEM') return array();
$grammaire = $rotlvl; $grammaire = $rotlvl;
$rotlvl = ''; $rotlvl = '';
} else { } else {
if (!preg_match('/^"([^"]*)"\s*$/', $suite, $r)) if (!preg_match('/^"([^"]*)"\s*$/', $suite, $r))
if (!preg_match("/^'([^']*)'\s*$/", $suite, $r)) if (!preg_match("/^'([^']*)'\s*$/", $suite, $r))
return array(); return array();
$grammaire = $r[1]; $grammaire = $r[1];
} }
return array($doctype, $topelement, $avail, $grammaire, $rotlvl);
return array(substr($doctype,strlen($pico)), $topelement, $avail, $grammaire, $rotlvl);
} }
?> ?>
...@@ -283,12 +283,12 @@ function phraserTout($phraseur, $data) ...@@ -283,12 +283,12 @@ function phraserTout($phraseur, $data)
{ {
xml_parsestring($phraseur, $data); xml_parsestring($phraseur, $data);
if (!$this->dtc) { if (!$this->dtc OR preg_match(',^' . _MESSAGE_DOCTYPE . ',', $data)) {
$GLOBALS['xhtml_error'] = 'DOCTYPE ? 0 0<br />'; $GLOBALS['xhtml_error'] .= 'DOCTYPE ? 0 0<br />';
$this->err = array('DOCTYPE ? 0 0<br />'); $this->err[]= ('DOCTYPE ? 0 0<br />');
} else { } else {
$valider_passe2 = charger_fonction('valider_passe2', 'inc'); $valider_passe2 = charger_fonction('valider_passe2', 'inc');
$valider_passe2($this); $valider_passe2($this);
} }
return !$this->err ? $this->res : join('<br />', $this->err) . '<br />'; return !$this->err ? $this->res : join('<br />', $this->err) . '<br />';
} }
......
...@@ -75,15 +75,17 @@ function analyser_dtd($loc, $avail, &$dtc) ...@@ -75,15 +75,17 @@ function analyser_dtd($loc, $avail, &$dtc)
} }
if (!$dtd) { if (!$dtd) {
spip_log("DTD $loc inaccessible"); spip_log("DTD '$loc' inaccessible");
return false; return false;
} } else spip_log("analyse de la DTD $loc ");
while ($dtd) { while ($dtd) {
if ($dtd[0] != '<') if ($dtd[0] != '<')
$r = analyser_dtd_lexeme($dtd, $dtc, $loc); $r = analyser_dtd_lexeme($dtd, $dtc, $loc);
elseif ($dtd[1] != '!') elseif ($dtd[1] != '!')
$r = analyser_dtd_pi($dtd, $dtc, $loc); $r = analyser_dtd_pi($dtd, $dtc, $loc);
elseif ($dtd[2] == '[')
$r = analyser_dtd_data($dtd, $dtc, $loc);
else switch ($dtd[3]) { else switch ($dtd[3]) {
case '%' : $r = analyser_dtd_data($dtd, $dtc, $loc); break; case '%' : $r = analyser_dtd_data($dtd, $dtc, $loc); break;
case 'T' : $r = analyser_dtd_attlist($dtd, $dtc, $loc);break; case 'T' : $r = analyser_dtd_attlist($dtd, $dtc, $loc);break;
...@@ -92,15 +94,13 @@ function analyser_dtd($loc, $avail, &$dtc) ...@@ -92,15 +94,13 @@ function analyser_dtd($loc, $avail, &$dtc)
case 'O' : $r = analyser_dtd_notation($dtd, $dtc, $loc);break; case 'O' : $r = analyser_dtd_notation($dtd, $dtc, $loc);break;
case '-' : $r = analyser_dtd_comment($dtd, $dtc, $loc); break; case '-' : $r = analyser_dtd_comment($dtd, $dtc, $loc); break;
default: $r = -1; default: $r = -1;
} }
if (!is_string($r)) { if (!is_string($r)) {
spip_log("erreur $r dans la DTD " . substr($dtd,0,80) . "....."); spip_log("erreur $r dans la DTD " . substr($dtd,0,80) . ".....");
return false; return false;
} }
$dtd = $r; $dtd = $r;
}
}
return true; return true;
} }
...@@ -141,8 +141,8 @@ function analyser_dtd_lexeme($dtd, &$dtc, $grammaire){ ...@@ -141,8 +141,8 @@ function analyser_dtd_lexeme($dtd, &$dtc, $grammaire){
// http://doc.spip.org/@analyser_dtd_data // http://doc.spip.org/@analyser_dtd_data
function analyser_dtd_data($dtd, &$dtc, $grammaire){ function analyser_dtd_data($dtd, &$dtc, $grammaire){
if (!preg_match('/^<!\[%([^;]*);\s*\[\s*(.*?)\]\]>\s*(.*)$/s',$dtd, $m)) if (!preg_match('/^<!\[\s*%\s*([^;]*);\s*\[\s*(.*?)\]\]>\s*(.*)$/s',$dtd, $m))
return -6; return -11;
if ($dtc->macros[$m[1]] == 'INCLUDE') if ($dtc->macros[$m[1]] == 'INCLUDE')
$retour = $m[2] . $m[3]; $retour = $m[2] . $m[3];
else $retour = $m[3]; else $retour = $m[3];
...@@ -163,7 +163,7 @@ function analyser_dtd_entity($dtd, &$dtc, $grammaire) ...@@ -163,7 +163,7 @@ function analyser_dtd_entity($dtd, &$dtc, $grammaire)
if (!preg_match(_REGEXP_ENTITY_DECL, $dtd, $m)) if (!preg_match(_REGEXP_ENTITY_DECL, $dtd, $m))
return -2; return -2;
list($t, $term, $nom, $type, $val, $q, $alt, $dtd) = $m; list($t, $term, $nom, $type, $val, $q, $c, $alt, $dtd) = $m;
if (isset($dtc->macros[$nom]) AND $dtc->macros[$nom]) if (isset($dtc->macros[$nom]) AND $dtc->macros[$nom])
return $dtd; return $dtd;
......
...@@ -15,7 +15,9 @@ if (!defined("_ECRIRE_INC_VERSION")) return; ...@@ -15,7 +15,9 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/sax'); include_spip('inc/sax');
define('_REGEXP_DOCTYPE', define('_REGEXP_DOCTYPE',
'/^\s*(<[?][^>]*>\s*)?<!DOCTYPE\s+(\w+)\s+(\w+)\s*([^>]*)>\s*/'); '/^((<[?][^>]*>)*\s*(<!--.*?-->)*)*<!DOCTYPE\s+(\w+)\s+(\w+)\s*([^>]*)>\s*/');
define('_MESSAGE_DOCTYPE', '<!-- SPIP CORRIGE -->');
define('_SUB_REGEXP_SYMBOL', '[A-Za-z_][\w_:.-]*'); define('_SUB_REGEXP_SYMBOL', '[A-Za-z_][\w_:.-]*');
...@@ -25,7 +27,7 @@ define('_REGEXP_ENTITY_USE', '/%(' . _SUB_REGEXP_SYMBOL . ');/'); ...@@ -25,7 +27,7 @@ define('_REGEXP_ENTITY_USE', '/%(' . _SUB_REGEXP_SYMBOL . ');/');
define('_REGEXP_ENTITY_DEF', '/^%(' . _SUB_REGEXP_SYMBOL . ');/'); define('_REGEXP_ENTITY_DEF', '/^%(' . _SUB_REGEXP_SYMBOL . ');/');
define('_REGEXP_ENTITY_DECL', '/^<!ENTITY\s+(%?)\s*(' . define('_REGEXP_ENTITY_DECL', '/^<!ENTITY\s+(%?)\s*(' .
_SUB_REGEXP_SYMBOL . _SUB_REGEXP_SYMBOL .
';?)\s+(PUBLIC|SYSTEM|INCLUDE|IGNORE)?\s*"([^"]*)"\s*("([^"]*)")?\s*>\s*(.*)$/s'); ';?)\s+(PUBLIC|SYSTEM|INCLUDE|IGNORE|CDATA)?\s*"([^"]*)"\s*(--.*?--)?("([^"]*)")?\s*>\s*(.*)$/s');
// Document Type Compilation // Document Type Compilation
......
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