From d31e44b954b8e1e5afac77122160b5f5ac1eef90 Mon Sep 17 00:00:00 2001 From: "Committo,Ergo:sum" <esj@rezo.net> Date: Fri, 18 Jan 2008 08:41:58 +0000 Subject: [PATCH] Introduction du filtre d'incrustation ''filtre_text_html''. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Il incruste le corps d'une page Html après retrait des scripts (sécurité) en mettant devant une balise Style dont le contenu est celui des balises Style trouvées dans l'en-tête ainsi que le contenu des feuilles de styles reférencées. Evidememnt ces références doivent être en URL absolues dans le document pour pouvoir être trouvées. En conséquence, pour donner l'exemple, les pages de l'espace privé de SPIP ont leur balise Link en URL absolue. A noter que SafeHtml traite différemment les balises Script dans l'en-tête et celles dans le corps. --- ecrire/inc/boutons.php | 6 +++--- ecrire/inc/couleurs.php | 2 +- ecrire/inc/filtres.php | 24 ++++++++++++++++++++++++ ecrire/inc/presentation.php | 16 ++++++++-------- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/ecrire/inc/boutons.php b/ecrire/inc/boutons.php index 0c572c2613..8603971936 100644 --- a/ecrire/inc/boutons.php +++ b/ecrire/inc/boutons.php @@ -566,14 +566,14 @@ function bandeau_double_rangee($rubrique, $sous_rubrique, $largeur) . "</ul></div>\n" . "</div>" //script to show the submenus in IE6, not supporting :hover on li elements - . "<script type='text/javascript'>\n" - . "var boutons_admin = jQuery('#bandeau-principal li.boutons_admin');\n" + . '<script type="text/javascript"><!--' + . "\nvar boutons_admin = jQuery('#bandeau-principal li.boutons_admin');\n" . "if(jQuery.browser.msie) boutons_admin.hover(\n" . "function(){jQuery(this).addClass('sfhover')},\n" . "function(){jQuery(this).removeClass('sfhover')}\n" . ");\n" . "boutons_admin.one('mouseover',decaleSousMenu);\n" - . "</script>\n"; + . "// --></script>\n"; } diff --git a/ecrire/inc/couleurs.php b/ecrire/inc/couleurs.php index e9dbee142e..307473366a 100644 --- a/ecrire/inc/couleurs.php +++ b/ecrire/inc/couleurs.php @@ -108,7 +108,7 @@ onblur="changestyle(\'bandeauinterface\');"'; return '<span id="selecteur_couleur">' . $bloc . "</span>\n" - . "<script type='text/javascript'><!-- + . '<script type="text/javascript"><!--' . " $('#selecteur_couleur a') .click(function(){ $('head>link#cssprivee') diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php index a0e5fd5368..0e53759957 100644 --- a/ecrire/inc/filtres.php +++ b/ecrire/inc/filtres.php @@ -53,6 +53,30 @@ function filtre_text_csv_dist($t) "|\n"); } +// Incrustation de HTML, si on est capable de le securiser +// sinon, afficher le source +function filtre_text_html_dist($t) +{ + if (!preg_match(',<head>(.*?)</head>.*<body[^>]*>(.*)</body>,is', $t, $r)) + return filtre_text_txt_dist($t); + + list(,$h,$t) = $r; + $style = ''; + // recuperer les styles internes + if (preg_match_all(',<style>([^>]*)</style>,is', $h, $r, PREG_PATTERN_ORDER)) + $style = join("\n",$r[1]); + // ... et externes + if (preg_match_all(',<link[^>]*text/css[^>]*>,is', $h, $r, PREG_PATTERN_ORDER)) + foreach($r[0] as $l) { + preg_match("/href='([^']*)'/", str_replace('"',"'",$l), $m); + $style .= "\n/* $l */\n" + . str_replace('<','',recuperer_page($m[1])); + } + // Pourquoi SafeHtml transforme-t-il en texte les scripts dans Body ? + $t = safehtml(preg_replace(',<script.*?</script>,is','',$t)); + return (!$style ? '' : "\n<style>$style</style>") . $t; +} + // http://doc.spip.org/@filtre_audio_x_pn_realaudio function filtre_audio_x_pn_realaudio($id) { diff --git a/ecrire/inc/presentation.php b/ecrire/inc/presentation.php index 61592df711..d73dd0cab0 100644 --- a/ecrire/inc/presentation.php +++ b/ecrire/inc/presentation.php @@ -787,12 +787,12 @@ function envoi_link($nom_site_spip, $minipres=false) { // CSS de secours en cas de non fonct de la suivante $res = '<link rel="stylesheet" type="text/css" href="' - . find_in_path('style_prive_defaut.css') + . url_absolue(find_in_path('style_prive_defaut.css')) . '" />' . "\n" // CSS calendrier . '<link rel="stylesheet" type="text/css" href="' - . find_in_path('agenda.css') .'" />' . "\n" + . url_absolue(find_in_path('agenda.css')) .'" />' . "\n" // CSS espace prive : la vraie . '<link rel="stylesheet" type="text/css" href="' @@ -804,25 +804,25 @@ function envoi_link($nom_site_spip, $minipres=false) { // CSS imprimante (masque des trucs, a completer) . '<link rel="stylesheet" type="text/css" href="' - . find_in_path('spip_style.css') + . url_absolue(find_in_path('spip_style.css')) . '" media="all" />' . "\n" // CSS imprimante (masque des trucs, a completer) . '<link rel="stylesheet" type="text/css" href="' - . find_in_path('spip_style_print.css') + . url_absolue(find_in_path('spip_style_print.css')) . '" media="print" />' . "\n" // CSS "visible au chargement" differente selon js actif ou non . '<link rel="stylesheet" type="text/css" href="' - . find_in_path('spip_style_' - . (_SPIP_AJAX ? 'invisible' : 'visible') - . '.css') + . url_absolue(find_in_path('spip_style_' + . (_SPIP_AJAX ? 'invisible' : 'visible') + . '.css')) .'" />' . "\n" // CSS optionelle minipres . ($minipres?'<link rel="stylesheet" type="text/css" href="' - . find_in_path('minipres.css').'" />' . "\n":"") + . url_absolue(find_in_path('minipres.css')).'" />' . "\n":"") // favicon.ico . '<link rel="shortcut icon" href="' -- GitLab