diff --git a/dist/backend.html b/dist/backend.html index 8af2239c667630a2182a5b773df02469474d4472..ffba0bfd13d408cc6e7043db99c0e906d91e5695 100644 --- a/dist/backend.html +++ b/dist/backend.html @@ -24,14 +24,26 @@ <date>#DATE</date> + + [<description>(#INTRODUCTION|texte_backend)</description>] + + <B_mots> + <dc:subject><BOUCLE_mots(MOTS){id_article}{" "}>[(#TITRE|former_tag)]</BOUCLE_mots></dc:subject> + </B_mots> + [(#REM) - Il est possible de mettre le texte integral de l'article dans le backend - en remplacant *INTRODUCTION par *CHAPO et *TEXTE etc., a filtrer avec - "liens_absolus". + Lorsque ce fichier backend est appele avec un parametre ?full=1, + il diffuse aussi le texte integral de l'article, ce qui permet une + syndication plus riche. +] +[(#ENV{full}|?{' ',''}) + <content:encoded>[(#LOGO_ARTICLE|right||html_backend) + ][<div class='rss_chapo'>(#CHAPO|html_backend)</div> + ][<div class='rss_texte'>(#TEXTE|html_backend)</div> + ][<hr /> + <div class='rss_notes'>(#NOTES|html_backend)</div> + ]</content:encoded> ] - -<description>[(#LOGO_ARTICLE|right||liens_absolus|texte_backend) -][(#INTRODUCTION|texte_backend)]</description> <author><BOUCLE_auteurs(AUTEURS){id_article}{", "}>[(#NOM|texte_backend)]</BOUCLE_auteurs></author> <dc:date>[(#DATE|date_iso)]</dc:date> <dc:format>text/html</dc:format> diff --git a/dist/site.html b/dist/site.html index a6f3fc84d99523db1be0e52cf5617fe504fd3bb2..d69439dbd6db79ed3ac0187b3d9d9263d6b36f47 100644 --- a/dist/site.html +++ b/dist/site.html @@ -70,9 +70,10 @@ <div class="liste-articles"> <BOUCLE_articles(SYNDIC_ARTICLES) {id_syndic} {par date}{inverse}{0,10}> - <h2><a href="#URL_ARTICLE" [title="(#DESCRIPTIF|couper{400}|textebrut|entites_html)"]>#TITRE</a></h2> + <h2><a href="#URL_ARTICLE">#TITRE</a></h2> <div class="detail"> [(#DATE|nom_jour)] [(#DATE|affdate)] + [: (#DESCRIPTIF)] [— <em>(#TAGS)</em>] </div> <br /> </BOUCLE_articles> diff --git a/ecrire/inc_controle_forum.php b/ecrire/inc_controle_forum.php index c98d530dbfc32145c0c1987d2ddac03e7949b28b..e7e5f37dd6353fd8227a2a8e31cc8a21f9b49fb8 100644 --- a/ecrire/inc_controle_forum.php +++ b/ecrire/inc_controle_forum.php @@ -114,7 +114,7 @@ function controle_un_forum($row, $rappel) { $forum_id_breve = $row['id_breve']; $forum_date_heure = $row['date_heure']; $forum_titre = echapper_tags($row['titre']); - $forum_texte = echapper_tags($row['texte']); + $forum_texte = $row['texte']; $forum_auteur = echapper_tags($row['auteur']); $forum_email_auteur = echapper_tags($row['email_auteur']); $forum_nom_site = echapper_tags($row['nom_site']); @@ -152,17 +152,22 @@ function controle_un_forum($row, $rappel) { "</span>"; if ($forum_auteur) { if ($forum_email_auteur) - $forum_auteur="<a href='mailto:$forum_email_auteur?SUBJECT=".rawurlencode($forum_titre)."'>$forum_auteur</A>"; - $controle .= "<span class='arial2'> / <B>$forum_auteur</B></span>"; + $forum_auteur="<a href='mailto:" + .htmlspecialchars($forum_email_auteur) + ."?subject=".rawurlencode($forum_titre)."'>".$forum_auteur + ."</A>"; + $controle .= safehtml("<span class='arial2'> / <b>$forum_auteur</b></span>"); } $controle .= boutons_controle_forum($id_forum, $forum_stat, $forum_id_auteur, "$type=$valeur", $forum_ip); - $controle .= "\n<br />$avant<B>$pref <A HREF='$url'>$titre</A></B>" . - "<P align='justify'>".propre($forum_texte); + $suite = "\n<br />$avant<b>$pref + <a href='$url'>$titre</a></b>" . justifier(propre($forum_texte)); if (strlen($forum_url_site) > 10 AND strlen($forum_nom_site) > 3) - $controle .= "\n<div align='left' class='serif'><B><A HREF='$forum_url_site'>$forum_nom_site</A></B></div>"; + $suite .= "\n<div align='left' class='serif'><B><A HREF='$forum_url_site'>$forum_nom_site</A></B></div>"; + + $controle .= safehtml($suite); if (lire_meta("mots_cles_forums") == "oui") { $query_mots = "SELECT * FROM spip_mots AS mots, spip_mots_forum AS lien WHERE lien.id_forum = '$id_forum' AND lien.id_mot = mots.id_mot"; diff --git a/ecrire/inc_filtres.php3 b/ecrire/inc_filtres.php3 index dc79218ed940bbd89e7563e7cb84e76a27a2a1a9..6b3b2385d263252083576bda5ad609b8c293e540 100644 --- a/ecrire/inc_filtres.php3 +++ b/ecrire/inc_filtres.php3 @@ -1443,4 +1443,21 @@ function email_valide($adresses) { return $adresse; } +// Filtrer les champs de tags (a developper) +// Un champ de tags c'est un ensemble de mots separes par des espaces +// On pourrait les envoyer vers les mots-cles correspondants dans la base, +// ou vers les tags del.icio.us/flickr correspondants, etc... +// ici essai avec del.icio.us +function traiter_tags($tags) { + $tags = explode(' ', supprimer_tags($tags)); + foreach($tags as $tag) + $l .= " <a href='http://del.icio.us/tag/$tag'>$tag</a>"; + return trim($l); +} + +// former un tag a parti d'un titre de mot-cle +function former_tag($mot) { + return str_replace(' ', '_', trim(supprimer_tags(typo($mot)))); +} + ?> diff --git a/ecrire/inc_majbase.php3 b/ecrire/inc_majbase.php3 index 47e43f6b6b60f6a3453aa8e04112ee3be489d372..dabefa5d1be4c732840fb050490c85b470dbd89c 100644 --- a/ecrire/inc_majbase.php3 +++ b/ecrire/inc_majbase.php3 @@ -1063,6 +1063,17 @@ function maj_base() { maj_version(1.901); } + // Syndication : ajout de source, url_source, tags + if ($version_installee < 1.902) { + spip_query("ALTER TABLE spip_syndic_articles + ADD url_source TINYTEXT DEFAULT '' NOT NULL"); + spip_query("ALTER TABLE spip_syndic_articles + ADD source TINYTEXT DEFAULT '' NOT NULL"); + spip_query("ALTER TABLE spip_syndic_articles + ADD tags TEXT DEFAULT '' NOT NULL"); + maj_version(1.902); + } + return true; } diff --git a/ecrire/inc_presentation.php3 b/ecrire/inc_presentation.php3 index fd327becfb6a46fbeb8e235a978245cd7f4a29bf..c93002032d750811e6500bdaee90ef1e540a43a9 100644 --- a/ecrire/inc_presentation.php3 +++ b/ecrire/inc_presentation.php3 @@ -1768,7 +1768,7 @@ function afficher_forum($request, $adresse_retour, $controle_id_article = 0) { if ($controle_id_article) echo boutons_controle_forum($id_forum, $statut, $id_auteur, "id_article=$controle_id_article", $ip); - echo justifier(propre($texte)); + echo safehtml(justifier(propre($texte))); if (strlen($url_site) > 10 AND $nom_site) { echo "<div align='left' class='verdana2'><b><a href='$url_site'>$nom_site</a></b></div>"; diff --git a/ecrire/inc_serialbase.php3 b/ecrire/inc_serialbase.php3 index cdf3dea87813b079f909890b1af092111c0cbc43..d62e5dbd24388d95d154814d3b5896cdc2a509dc 100644 --- a/ecrire/inc_serialbase.php3 +++ b/ecrire/inc_serialbase.php3 @@ -274,7 +274,10 @@ $spip_syndic_articles = array( "maj" => "TIMESTAMP", "statut" => "VARCHAR(10) NOT NULL", "descriptif" => "blob NOT NULL", - "lang" => "VARCHAR(10) DEFAULT '' NOT NULL"); + "lang" => "VARCHAR(10) DEFAULT '' NOT NULL", + "url_source" => "TINYTEXT DEFAULT '' NOT NULL", + "source" => "TINYTEXT DEFAULT '' NOT NULL", + "tags" => "TEXT DEFAULT '' NOT NULL"); $spip_syndic_articles_key = array( "PRIMARY KEY" => "id_syndic_article", diff --git a/ecrire/inc_sites.php3 b/ecrire/inc_sites.php3 index 71a3a7a9c0095b32f3a6e5cae4fb733e7b334996..a4bb50885b937a4e940b14485864d331c2c61d29 100644 --- a/ecrire/inc_sites.php3 +++ b/ecrire/inc_sites.php3 @@ -476,13 +476,15 @@ function analyser_backend($rss) { } } - // chercher un auteur dans le fil au cas ou les entry n'en auraient pas + // chercher auteur/lang dans le fil au cas ou les items n'en auraient pas list($channel_head) = preg_split($syndic_regexp['item'], $rss, 2); if (ereg($syndic_regexp['author1'],$channel_head,$mat)) { if (ereg($syndic_regexp['author2'],$mat[1],$match)) $les_auteurs_du_site = $match[1]; } - + if (preg_match(',<((dc:|[^>]*xml:)lang(uage)?)>([^<>]+)</\1>,i', + $channel_head, $match)) + $langue_du_site = $match[4]; $items = array(); if (preg_match_all($syndic_regexp['item'],$rss,$r, PREG_SET_ORDER)) @@ -573,6 +575,34 @@ function analyser_backend($rss) { AND $lastbuilddate < time()) $data['lastbuilddate'] = $lastbuilddate; + // lang + if (preg_match(',<((dc:|[^>]*xml:)lang(uage)?)>([^<>]+)</\1>,i', + $item, $match)) + $data['lang'] = trim($match[4]); + else + $data['lang'] = trim($langue_du_site); + + // source et url_source (pas trouve d'exemple en ligne !!) + # <source url="http://www.truc.net/music/uatsap.mp3" length="19917" /> + # <source url="http://www.truc.net/rss">Site source</source> + if (preg_match(',(<source[^>]*>)(([^<>]+)</source>)?,i', + $item, $match)) { + $data['source'] = trim($match[3]); + include_ecrire('inc_filtres.php3'); + $data['url_source'] = trim(extraire_attribut($match[1], 'url')); + } + + // tags + # a partir de "<dc:subject>", (del.icio.us) + # ou <media:category> (flickr) + # ou <itunes:category> (apple) + if (preg_match_all( + ',<([a-z]+:)?(subject|category|keywords)[^>]*>([^<>]+),i', + $item, $matches, PREG_SET_ORDER)) + foreach ($matches as $match) + $data['tags'] .= ' '.trim($match[3]); + $data['tags'] = trim($data['tags']); + // Attraper les URLs des pieces jointes <enclosure> if (preg_match_all(',<enclosure[[:space:]][^<>]+>,i', $item, $preg_enclosures, PREG_SET_ORDER)) { @@ -618,30 +648,29 @@ function inserer_article_syndique ($data, $now_id_syndic, $statut, $url_site, $r $desc = couper(trim(textebrut($desc)), 300); } else { // mode "full syndication" - // 1. choisir le contenu pertinent + // choisir le contenu pertinent + // & refaire les liens relatifs $desc = strlen($data['content']) ? $data['content'] : $data['descriptif']; - // 2. refaire les liens relatifs $desc = liens_absolus($desc, $le_lien); - // 3. securiser (XSS et XHTML) - $desc = safehtml($desc); - // 4. eviter propre() - if (strlen($desc)) $desc = "<html>$desc</html>"; } - // Mise a jour du contenu (titre,auteurs,description) + // Mettre a jour la date si lastbuilddate + $update_date = $data['lastbuilddate'] ? + "date = FROM_UNIXTIME(".$data['lastbuilddate'].")," : ''; + + // Mise a jour du contenu (titre,auteurs,description,date?,source...) spip_query ("UPDATE spip_syndic_articles SET titre='".addslashes($data['titre'])."', + ".$update_date." lesauteurs='".addslashes($data['lesauteurs'])."', - descriptif='".addslashes($desc)."' + descriptif='".addslashes($desc)."', + lang='".addslashes(substr($data['lang'],0,10))."', + source='".addslashes(substr($data['source'],0,255))."', + url_source='".addslashes(substr($data['url_source'],0,255))."', + tags='".addslashes($data['tags'])."' WHERE id_syndic='$now_id_syndic' AND url='".addslashes($le_lien)."'"); - // Mettre a jour la date si lastbuilddate - if ($data['lastbuilddate']) - spip_query("UPDATE spip_syndic_articles - SET date = FROM_UNIXTIME(".$data['lastbuilddate'].") - WHERE id_syndic='$now_id_syndic' AND url='".addslashes($le_lien)."'"); - // Inserer les enclosures if ($data['enclosures']) { traiter_les_enclosures_rss($data['enclosures'], @@ -923,7 +952,7 @@ function afficher_syndic_articles($titre_table, $requete, $afficher_site = false $date=$row["date"]; $lesauteurs=typo($row["lesauteurs"]); $statut=$row["statut"]; - $descriptif=propre($row["descriptif"]); + $descriptif=safehtml($row["descriptif"]); if ($statut=='publie') { @@ -966,7 +995,25 @@ function afficher_syndic_articles($titre_table, $requete, $afficher_site = false } } - if (strlen($descriptif) > 0) $s .= "<div class='arial1'>$descriptif</div>"; + // descriptif + if (strlen($descriptif) > 0) + $s .= "<div class='arial1'>".safehtml($descriptif)."</div>"; + + // tags + if (strlen($row['tags'])) + $s .= "<div style='float:$spip_lang_right;'><em>" + .traiter_tags($row['tags']) . '</em></div>'; + + // source + if (strlen($row['url_source'])) + $s .= "<div style='float:$spip_lang_right;'>" + . propre("[".$row['source']."->".$row['url_source']."]") + . "</div>"; + else if (strlen($row['source'])) + $s .= "<div style='float:$spip_lang_right;'>" + . typo($row['source']) + . "</div>"; + $vals[] = $s; // $my_sites cache les resultats des requetes sur les sites diff --git a/ecrire/inc_version.php3 b/ecrire/inc_version.php3 index 0d33a4cec16bb6bdfc0097dcb85076946b5bc45c..e936d8f37550ee54a28ebcda772d95d2476c1f10 100644 --- a/ecrire/inc_version.php3 +++ b/ecrire/inc_version.php3 @@ -379,7 +379,7 @@ define_once('_AUTH_USER_FILE', '.htpasswd'); // (utilise pour les modifs de la base de donnees) // version de la base -$spip_version = 1.901; +$spip_version = 1.902; // version de spip $spip_version_affichee = "1.9 alpha"; diff --git a/ecrire/sites.php3 b/ecrire/sites.php3 index f8c83b31a3109227ba129304cebc4af60a775e00..bf8d61e0d35d4b09f6b6cd2d09f81b6e8c754b1d 100644 --- a/ecrire/sites.php3 +++ b/ecrire/sites.php3 @@ -360,8 +360,8 @@ if ($flag_administrable) { echo "<select name='nouveau_statut' size=1 class='fondl'>\n"; - echo my_sel("publie",_T('info_statut_site_2'),$statut); echo my_sel("prop",_T('info_statut_site_3'),$statut); + echo my_sel("publie",_T('info_statut_site_2'),$statut); echo my_sel("refuse",_T('info_statut_site_4'),$statut); echo "</select>\n"; diff --git a/formulaires/inc-formulaire_forum.php3 b/formulaires/inc-formulaire_forum.php3 index e02d62e639b2c9ef4006c71bf47ba1b51c8bddb0..6c2b98465069e21031b239917fad45bfa4566663 100644 --- a/formulaires/inc-formulaire_forum.php3 +++ b/formulaires/inc-formulaire_forum.php3 @@ -168,13 +168,13 @@ function balise_FORMULAIRE_FORUM_dyn($titre, $table, $forums_publics, $id_rubriq 'formulaire_forum_previsu', 0, array( - 'titre' => interdire_scripts(typo($titre)), - 'email_auteur' => $email_auteur, - 'auteur' => interdire_scripts(typo($auteur)), - 'texte' => propre($texte), - 'url_site' => $url_site, + 'titre' => safehtml(typo($titre)), + 'email_auteur' => safehtml($email_auteur), + 'auteur' => safehtml(typo($auteur)), + 'texte' => safehtml(propre($texte)), + 'url_site' => safehtml($url_site), 'nom_site_forum' => - interdire_scripts(typo($nom_site_forum)), + safehtml(typo($nom_site_forum)), 'mots_forum' => $mots_forum, 'erreur' => $erreur, 'bouton' => $bouton diff --git a/inc-compilo-api.php3 b/inc-compilo-api.php3 index 915ba21fbecd1f01571fe790edeba2d5cc342547..a789730a9b3a243b5b304d49d67e2310c6f4a254 100644 --- a/inc-compilo-api.php3 +++ b/inc-compilo-api.php3 @@ -263,14 +263,16 @@ $table_des_traitements['DATE_REDAC'][]= 'vider_date(%s)'; $table_des_traitements['DESCRIPTIF'][]= 'traiter_raccourcis(%s)'; $table_des_traitements['LIEN_TITRE'][]= 'typo(%s)'; $table_des_traitements['LIEN_URL'][]= 'htmlspecialchars(vider_url(%s))'; -$table_des_traitements['MESSAGE'][]= 'traiter_raccourcis(%s)'; +$table_des_traitements['MESSAGE'][]= 'safehtml(traiter_raccourcis(%s))'; $table_des_traitements['NOM_SITE_SPIP'][]= 'typo(%s)'; $table_des_traitements['NOM_SITE'][]= 'typo(%s)'; $table_des_traitements['NOM'][]= 'typo(%s)'; $table_des_traitements['PARAMETRES_FORUM'][]= 'htmlspecialchars(lang_parametres_forum(%s))'; $table_des_traitements['PS'][]= 'traiter_raccourcis(%s)'; +$table_des_traitements['SOURCE'][]= 'typo(%s)'; $table_des_traitements['SOUSTITRE'][]= 'typo(%s)'; $table_des_traitements['SURTITRE'][]= 'typo(%s)'; +$table_des_traitements['TAGS'][]= 'traiter_tags(%s)'; $table_des_traitements['TEXTE'][]= 'traiter_raccourcis(%s)'; $table_des_traitements['TITRE'][]= 'typo(%s)'; $table_des_traitements['TYPE'][]= 'typo(%s)'; @@ -282,7 +284,21 @@ $table_des_traitements['URL_MOT'][]= 'htmlspecialchars(vider_url(%s))'; $table_des_traitements['URL_RUBRIQUE'][]= 'htmlspecialchars(vider_url(%s))'; $table_des_traitements['URL_SITE_SPIP'][]= 'htmlspecialchars(vider_url(%s))'; $table_des_traitements['URL_SITE'][]= 'htmlspecialchars(calculer_url(%s))'; +$table_des_traitements['URL_SOURCE'][]= 'htmlspecialchars(vider_url(%s))'; $table_des_traitements['URL_SYNDIC'][]= 'htmlspecialchars(vider_url(%s))'; $table_des_traitements['ENV'][]= 'entites_html(%s)'; + +// Securite supplementaire pour certaines tables + +// Articles syndiques : remplacer les filtres par safehtml() +foreach(array('TITRE','DESCRIPTIF','SOURCE') as $balise) + if (!isset($table_des_traitements[$balise]['syndic_articles'])) + $table_des_traitements[$balise]['syndic_articles'] = 'safehtml(%s)'; + +// Forums : ajouter safehtml aux filtres existants +foreach(array('TITRE','TEXTE','AUTEUR','EMAIL_AUTEUR','NOM_SITE') as $balise) + if (!isset($table_des_traitements[$balise]['forum'])) + $table_des_traitements[$balise]['forum'] = 'safehtml(%s)'; + ?>