diff --git a/ecrire/balise/logo_.php b/ecrire/balise/logo_.php index 3dfc267bd12d3d7558972244a1fde88340f787a9..5b36ca3f15c467310f6108f54c86f509ebc9acd8 100644 --- a/ecrire/balise/logo_.php +++ b/ecrire/balise/logo_.php @@ -116,20 +116,19 @@ function balise_LOGO__dist ($p) { $code_lien = "''"; $code_lien .= ", '". $align . "'"; } - - if ($p->id_boucle AND $p->boucles[$p->id_boucle]->sql_serveur) { - $p->code = "''"; - spip_log("Logo distant indisponible"); - // cas des documents - } elseif ($type_objet == 'DOCUMENT') { + $connect = $p->id_boucle ?$p->boucles[$p->id_boucle]->sql_serveur :''; + if ($type_objet == 'DOCUMENT') { $p->code = "calcule_logo_document($_id_objet, '" . $p->descr['documents'] . '\', $doublons, '. intval($flag_fichier).", $code_lien, '". // #LOGO_DOCUMENT{x,y} donne la taille maxi texte_script($params) - ."')"; + ."'," . _q($connect) .")"; } - else { + elseif ($connect) { + $p->code = "''"; + spip_log("Les logos distants ne sont pas prevus"); + } else { $p->code = "affiche_logos(calcule_logo('$id_objet', '" . (($suite_logo == '_SURVOL') ? 'off' : (($suite_logo == '_NORMAL') ? 'on' : 'ON')) . diff --git a/ecrire/inc/texte.php b/ecrire/inc/texte.php index e3f77ee944c87f7670f152054514f3f198268507..abdb9540069e27d6f0f85352bacdcf3bd92b9b4b 100644 --- a/ecrire/inc/texte.php +++ b/ecrire/inc/texte.php @@ -289,6 +289,24 @@ function echappe_retour($letexte, $source='', $filtre = "") { return $letexte; } +// Reinserer le javascript de confiance (venant des modeles) + +function echappe_retour_modeles($letexte) +{ + $letexte = echappe_retour($letexte); + + // Dans l'espace prive, securiser ici + if (!_DIR_RESTREINT) + $letexte = interdire_scripts($letexte); + + // Reinserer les echappements des modeles + + if (defined('_PROTEGE_JS_MODELES')) + $letexte = echappe_retour($letexte,"javascript"._PROTEGE_JS_MODELES); + + return trim($letexte); +} + // http://doc.spip.org/@nettoyer_raccourcis_typo function nettoyer_raccourcis_typo($texte){ $texte = pipeline('nettoyer_raccourcis_typo',$texte); @@ -297,7 +315,7 @@ function nettoyer_raccourcis_typo($texte){ foreach ($regs as $reg) { list ($titre,,)= traiter_raccourci_lien_atts($reg[1]); $titre = calculer_url($reg[3], $titre, 'titre'); - $titre = typo(supprimer_tags($titre)); + $titre = corriger_typo(supprimer_tags($titre)); $texte = str_replace($reg[0], $titre, $texte); } @@ -500,7 +518,7 @@ function safehtml($t) { // avec protection prealable des balises HTML et SPIP // http://doc.spip.org/@typo -function typo($letexte, $echapper=true) { +function typo($letexte, $echapper=true, $connect='') { // Plus vite ! if (!$letexte) return $letexte; @@ -512,9 +530,10 @@ function typo($letexte, $echapper=true) { // // Installer les modeles, notamment images et documents ; // - // NOTE : dans propre() ceci s'execute avant les tableaux a cause du "|", - // et apres les liens a cause du traitement de [<imgXX|right>->URL] - $letexte = traiter_modeles($mem = $letexte, false, $echapper ? 'TYPO' : ''); + // NOTE : propre() l'a deja fait + // sauf pour les textes renvoyes par calculer_url() + + $letexte = traiter_modeles($mem = $letexte, false, $echapper ? 'TYPO' : '', $connect); if ($letexte != $mem) $echapper = true; unset($mem); @@ -524,8 +543,9 @@ function typo($letexte, $echapper=true) { if ($echapper) $letexte = echappe_retour($letexte, 'TYPO'); - // l'espace prive securise ici - $letexte = interdire_scripts($letexte); + // Dans l'espace prive, securiser ici + if (!_DIR_RESTREINT) + $letexte = interdire_scripts($letexte); return $letexte; } @@ -1025,7 +1045,7 @@ function traiter_modeles($texte, $doublons=false, $echap='', $connect='') { $texte .= preg_replace(',[|][^|=]*,s',' ',$regs[4]); # version normale else { - $modele = inclure_modele($regs[2], $regs[3], $regs[4], $lien, $connect); + $modele = inclure_modele($regs[2], $regs[3], $regs[4], $lien, $connect); // le remplacer dans le texte if ($modele !== false) { @@ -1167,21 +1187,19 @@ function traiter_raccourci_glossaire($letexte) // Regexp des raccouris, aussi utilisee pour la fusion de sauvegarde Spip define('_RACCOURCI_LIEN', ",\[([^][]*)->(>?)([^]]*)\],msS"); -// http://doc.spip.org/@traiter_raccourcis_propre -function traiter_raccourcis_propre($letexte) +function expanser_liens($letexte, $connect='') { $inserts = array(); if (preg_match_all(_RACCOURCI_LIEN, $letexte, $matches, PREG_SET_ORDER)) { $i = 0; foreach ($matches as $regs) { - $inserts[++$i] = traiter_raccourci_lien($regs); + $inserts[++$i] = traiter_raccourci_lien($regs, $connect); $letexte = str_replace($regs[0], "@@SPIP_ECHAPPE_LIEN_$i@@", $letexte); } } - $letexte = typo($letexte, /* echap deja fait, accelerer */ false); - + $letexte = corriger_typo(traiter_modeles($letexte, false, false, $connect)); foreach ($inserts as $i => $insert) { $letexte = str_replace("@@SPIP_ECHAPPE_LIEN_$i@@", $insert, $letexte); } @@ -1195,9 +1213,9 @@ function traiter_raccourcis_propre($letexte) // 1=>texte (ou texte|hreflang ou texte|bulle ou texte|bulle{hreflang}) // 2=>double fleche (historiquement, liens ouvrants) // 3=>url -// +// A terme, il faudrait tenir compte de $connect // http://doc.spip.org/@traiter_raccourci_lien -function traiter_raccourci_lien($regs) { +function traiter_raccourci_lien($regs, $connect='') { list(,$texte, ,$url) = $regs; list($texte, $bulle, $hlang) = traiter_raccourci_lien_atts($texte); @@ -1209,8 +1227,14 @@ function traiter_raccourci_lien($regs) { $hlang = $lang; $lang = ($hlang ? ' hreflang="'.$hlang.'"' : '') . $bulle; - # ici bien passer le lien pour traiter [<doc3>->url] - return typo("<a href=\"$lien\" class=\"$class\"$lang>$texte</a>"); + # Penser au cas [<imgXX|right>->URL] + # ceci s'execute heureusement avant les tableaux et leur "|". + # Attention, le texte initial est deja echappe mais pas forcement + # celui retourne par calculer_url. + + $texte = typo($texte, true, $connect); + + return "<a href=\"$lien\" class=\"$class\"$lang>$texte</a>"; } // Repere dans la partie texte d'un raccourci [texte->...] @@ -1288,7 +1312,7 @@ function traiter_poesie($letexte) return $letexte; } -// Nettoie un texte, traite les raccourcis spip, la typo, etc. +// Nettoie un texte, traite les raccourcis autre qu'URL, la typo, etc. // http://doc.spip.org/@traiter_raccourcis function traiter_raccourcis($letexte) { @@ -1296,24 +1320,19 @@ function traiter_raccourcis($letexte) { // Appeler les fonctions de pre_traitement $letexte = pipeline('pre_propre', $letexte); - // old style - if (function_exists('avant_propre')) - $letexte = avant_propre($letexte); - $letexte = traiter_raccourcis_propre($letexte); $letexte = traiter_poesie($letexte); // Harmoniser les retours chariot $letexte = preg_replace(",\r\n?,S", "\n", $letexte); // Recuperer les paragraphes HTML - $letexte = preg_replace(",<p[>[:space:]],iS", "\n\n\\0", $letexte); - $letexte = preg_replace(",</p[>[:space:]],iS", "\\0\n\n", $letexte); + $letexte = preg_replace(',<p[>]\s,iS', "\n\n\\0", $letexte); + $letexte = preg_replace(',</p[>]\s,iS', "\\0\n\n", $letexte); $letexte = traiter_raccourci_glossaire($letexte); $letexte = traiter_raccourci_ancre($letexte); - list($letexte, $mes_notes) = traite_raccourci_notes($letexte); // A present on introduit des attributs class_spip* @@ -1372,9 +1391,6 @@ function traiter_raccourcis($letexte) { // Appeler les fonctions de post-traitement $letexte = pipeline('post_propre', $letexte); - // old style - if (function_exists('apres_propre')) - $letexte = apres_propre($letexte); if ($mes_notes) traiter_les_notes($mes_notes); @@ -1411,7 +1427,7 @@ function traite_raccourci_notes($letexte) $num_note = false; // note auto ou pas ? - if (preg_match(",^ *<([^>]*)>,", $note_texte, $regs)){ + if (preg_match(",^<([^>]*)>,", $note_texte, $regs)){ $num_note = $regs[1]; $note_texte = str_replace($regs[0], "", $note_texte); } else { @@ -1481,30 +1497,11 @@ function traiter_les_notes($mes_notes) { // Filtre a appliquer aux champs du type #TEXTE* // http://doc.spip.org/@propre -function propre($letexte) { - if (!$letexte) return $letexte; - - // Echapper les <a href>, <html>...< /html>, <code>...< /code> - $letexte = echappe_html($letexte); - - // Traiter le texte - $letexte = traiter_raccourcis($letexte); - - // Reinserer les echappements - $letexte = echappe_retour($letexte); - - // Vider les espaces superflus - $letexte = trim($letexte); +function propre($t, $connect='') { - // Dans l'espace prive, securiser ici - if (!_DIR_RESTREINT) - $letexte = interdire_scripts($letexte); - - // Reinserer le javascript de confiance (venant des modeles) - if (defined('_PROTEGE_JS_MODELES')) - $letexte = echappe_retour($letexte,"javascript"._PROTEGE_JS_MODELES); - - return $letexte; + return !$t ? '' : + echappe_retour_modeles( + traiter_raccourcis( + expanser_liens(echappe_html($t),$connect))); } - ?> diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php index f8046fb2f1b68a040caa48bcab74833df1ee4870..17f642b5c738e8d46ba3ea93eed346667623eecc 100644 --- a/ecrire/public/balises.php +++ b/ecrire/public/balises.php @@ -422,7 +422,15 @@ function balise_LANG_dist ($p) { return $p; } - +function balise_CHAPO_dist ($p) { + $_chapo = champ_sql('chapo', $p); + if ((!$p->etoile) OR (strpos($_chapo, '$Pile[$SP') === false)) + $p->code = $_chapo; + else + $p->code = "nettoyer_chapo($_chapo)"; + $p->interdire_scripts = false; + return $p; +} // #LESAUTEURS // les auteurs d'un article (ou d'un article syndique) // http://www.spip.net/fr_article902.html diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php index 9d6f13dd9afc18af899a2e55c4b3200a493fba92..6b179b3c5e0728d3ccc02f0238c6d0d9d6060287 100644 --- a/ecrire/public/compiler.php +++ b/ecrire/public/compiler.php @@ -250,6 +250,8 @@ function calculer_boucle_nonrec($id_boucle, &$boucles) { } else { $corps = $init . ' + $connect = ' . + _q($boucle->sql_serveur) . '; // RESULTATS while ($Pile[$SP] = @sql_fetch($result,"' . diff --git a/ecrire/public/composer.php b/ecrire/public/composer.php index 0ac1523c5e93950d46169f7c75a8677e08c8310e..556e5b068686971df6aeba36e0575d3cb1189613 100644 --- a/ecrire/public/composer.php +++ b/ecrire/public/composer.php @@ -352,31 +352,31 @@ function lister_objets_avec_logos ($type) { // fonction appelee par la balise #LOGO_DOCUMENT // http://doc.spip.org/@calcule_logo_document -function calcule_logo_document($id_document, $doubdoc, &$doublons, $flag_fichier, $lien, $align, $params) { +function calcule_logo_document($id_document, $doubdoc, &$doublons, $flag_fichier, $lien, $align, $params, $connect='') { include_spip('inc/documents'); if (!$id_document) return ''; if ($doubdoc) $doublons["documents"] .= ','.$id_document; - if (!($row = sql_select(array('extension', 'id_vignette', 'fichier', 'mode'), array('spip_documents'), array("id_document = $id_document")))) + if (!($row = sql_fetsel(array('extension', 'id_vignette', 'fichier', 'mode'), array('spip_documents'), array("id_document = $id_document"), '','','','','','','',$connect))) { // pas de document. Ne devrait pas arriver + spip_log("Erreur du compilateur doc $id_document inconnu"); return ''; + } - $row = sql_fetch($row); $extension = $row['extension']; $id_vignette = $row['id_vignette']; $fichier = get_spip_doc($row['fichier']); $mode = $row['mode']; // Y a t il une vignette personnalisee ? + // Ca va echouer si c'est en mode distant. A revoir. if ($id_vignette) { - if ($res = sql_select(array('fichier'), - array('spip_documents'), - array("id_document = $id_vignette"))) { - $vignette = sql_fetch($res); - if (@file_exists(get_spip_doc($vignette['fichier']))) - $logo = generer_url_document($id_vignette); - } + $vignette = sql_fetsel(array('fichier'), + array('spip_documents'), + array("id_document = $id_vignette"), '','','','','','','',$connect); + if (@file_exists(get_spip_doc($vignette['fichier']))) + $logo = generer_url_document($id_vignette); } else if ($mode == 'vignette') { $logo = generer_url_document($id_document); if (!@file_exists($logo)) diff --git a/ecrire/public/interfaces.php b/ecrire/public/interfaces.php index ce958f729b6e7ef02bd97a46215c9ee462d05100..c59a23839e1b705ffcdc9f1e64eed28360228226 100644 --- a/ecrire/public/interfaces.php +++ b/ecrire/public/interfaces.php @@ -272,36 +272,40 @@ $exceptions_des_jointures['petition'] = array('spip_petitions', 'texte'); $exceptions_des_jointures['id_signature']= array('spip_signatures', 'id_signature'); global $table_des_traitements; -$table_des_traitements['BIO'][]= 'propre(%s)'; -$table_des_traitements['CHAPO'][]= 'propre(nettoyer_chapo(%s))'; + +define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect)'); +define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect)'); + +$table_des_traitements['BIO'][]= _TRAITEMENT_RACCOURCIS; +$table_des_traitements['CHAPO'][]= _TRAITEMENT_RACCOURCIS; $table_des_traitements['DATE'][]= 'vider_date(%s)'; $table_des_traitements['DATE_MODIF'][]= 'vider_date(%s)'; $table_des_traitements['DATE_NOUVEAUTES'][]= 'vider_date(%s)'; $table_des_traitements['DATE_REDAC'][]= 'vider_date(%s)'; -$table_des_traitements['DESCRIPTIF'][]= 'propre(%s)'; +$table_des_traitements['DESCRIPTIF'][]= _TRAITEMENT_RACCOURCIS; $table_des_traitements['FICHIER']['documents']= 'get_spip_doc(%s)'; -$table_des_traitements['LIEN_TITRE'][]= 'typo(%s)'; +$table_des_traitements['LIEN_TITRE'][]= _TRAITEMENT_TYPO; $table_des_traitements['LIEN_URL'][]= 'vider_url(%s)'; -$table_des_traitements['MESSAGE'][]= 'propre(%s)'; -$table_des_traitements['NOM_SITE_SPIP'][]= 'typo(%s)'; +$table_des_traitements['MESSAGE'][]= _TRAITEMENT_RACCOURCIS; +$table_des_traitements['NOM_SITE_SPIP'][]= _TRAITEMENT_TYPO; $table_des_traitements['NOM_SITE'][]= '%s'; # construire_titre_lien -> typo -$table_des_traitements['NOM'][]= 'typo(%s)'; +$table_des_traitements['NOM'][]= _TRAITEMENT_TYPO; $table_des_traitements['PARAMETRES_FORUM'][]= 'htmlspecialchars(%s)'; -$table_des_traitements['PS'][]= 'propre(%s)'; -$table_des_traitements['SOURCE'][]= 'typo(%s)'; -$table_des_traitements['SOUSTITRE'][]= 'typo(%s)'; -$table_des_traitements['SURTITRE'][]= 'typo(%s)'; +$table_des_traitements['PS'][]= _TRAITEMENT_RACCOURCIS; +$table_des_traitements['SOURCE'][]= _TRAITEMENT_TYPO; +$table_des_traitements['SOUSTITRE'][]= _TRAITEMENT_TYPO; +$table_des_traitements['SURTITRE'][]= _TRAITEMENT_TYPO; $table_des_traitements['TAGS'][]= '%s'; -$table_des_traitements['TEXTE'][]= 'propre(%s)'; -$table_des_traitements['TITRE'][]= 'typo(%s)'; -$table_des_traitements['TYPE'][]= 'typo(%s)'; +$table_des_traitements['TEXTE'][]= _TRAITEMENT_RACCOURCIS; +$table_des_traitements['TITRE'][]= _TRAITEMENT_TYPO; +$table_des_traitements['TYPE'][]= _TRAITEMENT_TYPO; $table_des_traitements['URL_ARTICLE'][]= 'vider_url(%s)'; $table_des_traitements['URL_BREVE'][]= 'vider_url(%s)'; $table_des_traitements['URL_DOCUMENT'][]= 'vider_url(%s)'; $table_des_traitements['URL_FORUM'][]= 'vider_url(%s)'; $table_des_traitements['URL_MOT'][]= 'vider_url(%s)'; $table_des_traitements['URL_RUBRIQUE'][]= 'vider_url(%s)'; -$table_des_traitements['DESCRIPTIF_SITE_SPIP'][]= 'propre(%s)'; +$table_des_traitements['DESCRIPTIF_SITE_SPIP'][]= _TRAITEMENT_RACCOURCIS; $table_des_traitements['URL_SITE'][]= 'calculer_url(%s)'; $table_des_traitements['URL_SOURCE'][]= 'vider_url(%s)'; $table_des_traitements['URL_SYNDIC'][]= 'vider_url(%s)'; @@ -309,7 +313,7 @@ $table_des_traitements['ENV'][]= 'entites_html(%s,true)'; // Articles syndiques : passage des donnees telles quelles, sans traitement typo -// A noter, dans applique_filtres la securite et compliance XHTML de ces champs +// A noter, dans applique_filtres la securite et conformite XHTML de ces champs // est assuree par safehtml() foreach(array('TITRE','DESCRIPTIF','SOURCE') as $balise) if (!isset($table_des_traitements[$balise]['syndic_articles'])) diff --git a/ecrire/public/references.php b/ecrire/public/references.php index 1074042841382ece3f11235092f9f8efdc91dc97..490d7c9bb188eaa5e43a9141fdc6cffb94673a6c 100644 --- a/ecrire/public/references.php +++ b/ecrire/public/references.php @@ -314,7 +314,7 @@ function balise_distante_interdite($p) { // // Traitements standard de divers champs -// definis par $table_des_traitements, cf. inc-compilo-api.php3 +// definis par $table_des_traitements, cf. ecrire/public/interfaces // // http://doc.spip.org/@champs_traitements function champs_traitements ($p) { @@ -335,21 +335,15 @@ function champs_traitements ($p) { if (!$ps) return $p->code; - // Si une boucle sous-jacente (?) traite les documents, on insere ici - // une fonction de remplissage du tableau des doublons -- mais seulement - // si on rencontre le filtre propre (qui traite les - // raccourcis <docXX> qui nous interessent) + // Si une boucle documents est presente dans le squelette, + // on insere une fonction de remplissage du tableau des doublons + // dans les filtres propre() ou typo() + // (qui traitent les raccourcis <docXX> referencant les docs) if (isset($p->descr['documents']) - AND preg_match(',propre,', $ps)) + AND ((strpos($ps,'propre') !== false) + OR (strpos($ps,'typo') !== false))) $ps = 'traiter_doublons_documents($doublons, '.$ps.')'; - // De meme, en cas de sql_serveur, on supprime les < IMGnnn > tant - // qu'on ne rapatrie pas les documents distants joints.. - // il faudrait aussi corriger les raccourcis d'URL locales - if ($p->id_boucle AND $p->boucles[$p->id_boucle]->sql_serveur) - $p->code = 'supprime_img(' . $p->code . ')'; - - // Passer |safehtml sur les boucles "sensibles" // sauf sur les champs dont on est surs switch ($p->type_requete) {