Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: freeze-exception
Please unblock package spip, it's a minor release that will fix a security issue, and a few bugs. The attached debdiff is pretty thin: most of the changes, in the security screen file, are due to rewritten comments. unblock spip/2.1.16-1 -- System Information: Debian Release: 6.0.5 APT prefers stable-updates APT policy: (500, 'stable-updates'), (500, 'proposed-updates'), (500, 'stable'), (150, 'testing'), (120, 'unstable'), (110, 'experimental') Architecture: i386 (i686) Kernel: Linux 2.6.32-5-686 (SMP w/1 CPU core) Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash
diff -Nru spip-2.1.15/debian/changelog spip-2.1.16/debian/changelog --- spip-2.1.15/debian/changelog 2012-06-12 19:17:13.000000000 -0400 +++ spip-2.1.16/debian/changelog 2012-07-04 08:46:23.000000000 -0400 @@ -1,3 +1,13 @@ +spip (2.1.16-1) unstable; urgency=high + + * New upstream version: + - fixes PHP injection (Closes: #680118); + - fixes growing session directory; + - fixes PHP 5.4 compatibility. + * Update security screen file to 1.1.3. + + -- David Prévot <taf...@debian.org> Wed, 04 Jul 2012 08:42:01 -0400 + spip (2.1.15-1) unstable; urgency=high * New upstream version, fixes cross site scripting. diff -Nru spip-2.1.15/debian/patches/fix_displayed_version.patch spip-2.1.16/debian/patches/fix_displayed_version.patch --- spip-2.1.15/debian/patches/fix_displayed_version.patch 2012-06-12 17:55:50.000000000 -0400 +++ spip-2.1.16/debian/patches/fix_displayed_version.patch 2012-07-04 08:30:47.000000000 -0400 @@ -2,7 +2,7 @@ Make it obvious it's a Debian (patched) version Forwarded: not-needed Author: David Prévot <taf...@debian.org> -Last-Update: 2012-06-12 +Last-Update: 2012-07-04 --- a/ecrire/inc_version.php +++ b/ecrire/inc_version.php @@ -423,7 +423,7 @@ @@ -10,7 +10,7 @@ // 1.xxyy : xx00 versions stables publiees, xxyy versions de dev // (ce qui marche pour yy ne marchera pas forcement sur une version plus ancienne) -$spip_version_affichee = "$spip_version_branche"; -+$spip_version_affichee = "2.1.15-1 (Debian)"; ++$spip_version_affichee = "2.1.16-1 (Debian)"; // ** Securite ** $visiteur_session = $auteur_session = $connect_statut = $connect_toutes_rubriques = $hash_recherche = $hash_recherche_strict = $ldap_present =''; diff -Nru spip-2.1.15/debian/security/ecran_securite.php spip-2.1.16/debian/security/ecran_securite.php --- spip-2.1.15/debian/security/ecran_securite.php 2012-06-12 17:06:39.000000000 -0400 +++ spip-2.1.16/debian/security/ecran_securite.php 2012-07-04 08:31:30.000000000 -0400 @@ -5,21 +5,20 @@ * ------------------ */ -define('_ECRAN_SECURITE', '1.1.2'); // 12 juin 2012 +define('_ECRAN_SECURITE', '1.1.3'); // 3 juillet 2012 /* * Documentation : http://www.spip.net/fr_article4200.html - * */ /* - * test utilisateur + * Test utilisateur */ if (isset($_GET['test_ecran_securite'])) $ecran_securite_raison = 'test '._ECRAN_SECURITE; /* - * detecteur de robot d'indexation + * Détecteur de robot d'indexation */ if (!defined('_IS_BOT')) define('_IS_BOT', @@ -28,10 +27,11 @@ (string) $_SERVER['HTTP_USER_AGENT']) ); -/* - interdit de passer une variable id_article (ou id_xxx) qui ne - * soit pas numerique (ce qui bloque l'exploitation de divers trous - * de securite, dont celui de toutes les versions < 1.8.2f) - * (sauf pour id_table, qui n'est pas numerique jusqu'a [5743]) +/* + * Interdit de passer une variable id_article (ou id_xxx) qui ne + * soit pas numérique (ce qui bloque l'exploitation de divers trous + * de sécurité, dont celui de toutes les versions < 1.8.2f) + * (sauf pour id_table, qui n'est pas numérique jusqu'à [5743]) */ foreach ($_GET as $var => $val) if ($_GET[$var] AND strncmp($var,"id_",3)==0 AND $var!='id_table') @@ -43,15 +43,14 @@ if ($GLOBALS[$var] AND strncmp($var,"id_",3)==0 AND $var!='id_table') $GLOBALS[$var] = is_array($GLOBALS[$var])?@array_map('intval',$GLOBALS[$var]):intval($GLOBALS[$var]); - -/* - interdit la variable $cjpeg_command, qui etait utilisee sans - * precaution dans certaines versions de dev (1.8b2 -> 1.8b5) - * +/* + * Interdit la variable $cjpeg_command, qui était utilisée sans + * précaution dans certaines versions de dev (1.8b2 -> 1.8b5) */ $cjpeg_command=''; -/* - controle de quelques variables (XSS) - * +/* + * Contrôle de quelques variables (XSS) */ foreach(array('lang', 'var_recherche', 'aide', 'var_lang_r', 'lang_r', 'var_ajax_ancre') as $var) { if (isset($_GET[$var])) @@ -60,15 +59,15 @@ $_REQUEST[$var] = $GLOBALS[$var] = $_POST[$var] = preg_replace(',[^\w\,/#&;-]+,',' ',(string)$_POST[$var]); } -/* - filtre l'acces a spip_acces_doc (injection SQL en 1.8.2x) - * +/* + * Filtre l'accès à spip_acces_doc (injection SQL en 1.8.2x) */ if (preg_match(',^(.*/)?spip_acces_doc\.,', (string)$_SERVER['REQUEST_URI'])) { $file = addslashes((string)$_GET['file']); } /* - * - agenda joue a l'injection php + * Agenda joue à l'injection php */ if (isset($_REQUEST['partie_cal']) AND $_REQUEST['partie_cal'] !== htmlentities((string)$_REQUEST['partie_cal'])) @@ -78,7 +77,7 @@ $ecran_securite_raison = "echelle"; /* - * - espace prive + * Espace privé */ if (isset($_REQUEST['exec']) AND !preg_match(',^[\w-]+$,', (string)$_REQUEST['exec'])) @@ -107,8 +106,8 @@ } } -/* - bloque les requetes contenant %00 (manipulation d'include) - * +/* + * Bloque les requêtes contenant %00 (manipulation d'include) */ if (strpos( @get_magic_quotes_gpc() ? @@ -117,22 +116,23 @@ ) !== false) $ecran_securite_raison = "%00"; -/* - bloque les requetes fond=formulaire_ - * +/* + * Bloque les requêtes fond=formulaire_ */ if (isset($_REQUEST['fond']) AND preg_match(',^formulaire_,i', $_REQUEST['fond'])) $ecran_securite_raison = "fond=formulaire_"; -/* - bloque les requetes du type ?GLOBALS[type_urls]=toto (bug vieux php) - * +/* + * Bloque les requêtes du type ?GLOBALS[type_urls]=toto (bug vieux php) */ if (isset($_REQUEST['GLOBALS'])) $ecran_securite_raison = "GLOBALS[GLOBALS]"; -/* - bloque les requetes des bots sur: - * les agenda - * les paginations entremelees +/* + * Bloque les requêtes des bots sur: + * les agenda + * les paginations entremélées */ if (_IS_BOT AND ( (isset($_REQUEST['echelle']) AND isset($_REQUEST['partie_cal']) AND isset($_REQUEST['type'])) @@ -162,27 +162,29 @@ if (isset($_REQUEST[$var]) AND is_array($_REQUEST[$var])) $ecran_securite_raison = "xss ".$var; -/* Parade antivirale contre un cheval de troie */ -if(!function_exists('tmp_lkojfghx')){ -function tmp_lkojfghx(){} -function tmp_lkojfghx2($a=0,$b=0,$c=0,$d=0){ - // si jamais on est arrive ici sur une erreur php - // et qu'un autre gestionnaire d'erreur est defini, l'appeller - if($b&&$GLOBALS['tmp_xhgfjokl']) - call_user_func($GLOBALS['tmp_xhgfjokl'],$a,$b,$c,$d); -} +/* + * Parade antivirale contre un cheval de troie + */ +if (!function_exists('tmp_lkojfghx')) { + function tmp_lkojfghx() {} + function tmp_lkojfghx2($a=0, $b=0, $c=0, $d=0) { + // si jamais on est arrivé ici sur une erreur php + // et qu'un autre gestionnaire d'erreur est défini, l'appeller + if ($b&&$GLOBALS['tmp_xhgfjokl']) + call_user_func($GLOBALS['tmp_xhgfjokl'],$a,$b,$c,$d); + } } if (isset($_POST['tmp_lkojfghx3'])) $ecran_securite_raison = "gumblar"; /* - * Outils XML mal securises < 2.0.9 + * Outils XML mal sécurisés < 2.0.9 */ if (isset($_REQUEST['transformer_xml'])) $ecran_securite_raison = "transformer_xml"; /* - * Sauvegarde mal securisee < 2.0.9 + * Sauvegarde mal securisée < 2.0.9 */ if (isset($_REQUEST['nom_sauvegarde']) AND strstr((string)$_REQUEST['nom_sauvegarde'], '/')) @@ -194,14 +196,15 @@ /* * op permet des inclusions arbitraires ; - * on verifie 'page' pour ne pas bloquer ... drupal + * on vérifie 'page' pour ne pas bloquer ... drupal */ if (isset($_REQUEST['op']) AND isset($_REQUEST['page']) AND $_REQUEST['op'] !== preg_replace('/[^\-\w]/', '', $_REQUEST['op'])) $ecran_securite_raison = 'op'; - -/* Forms & Table ne se mefiait pas assez des uploads de fichiers */ +/* + * Forms & Table ne se méfiait pas assez des uploads de fichiers + */ if (count($_FILES)){ foreach($_FILES as $k=>$v){ if (preg_match(',^fichier_\d+$,',$k) @@ -210,16 +213,22 @@ } } -/* reinstall=oui un peu trop permissif */ +/* + * reinstall=oui un peu trop permissif + */ if (isset($_REQUEST['reinstall']) AND $_REQUEST['reinstall'] == 'oui') $ecran_securite_raison = 'reinstall=oui'; -/* echappement xss referer */ +/* + * Échappement xss referer + */ if (isset($_SERVER['HTTP_REFERER'])) $_SERVER['HTTP_REFERER'] = strtr($_SERVER['HTTP_REFERER'], '<>"\'', '[]##'); -/* Reinjection des cles en html dans l'admin r19561 */ +/* + * Réinjection des clés en html dans l'admin r19561 + */ if (strpos($_SERVER['REQUEST_URI'],"ecrire/")!==false){ $zzzz=implode("",array_keys($_REQUEST)); if (strlen($zzzz)!=strcspn($zzzz,'<>"\'')) @@ -227,6 +236,21 @@ } /* + * Injection par connect + */ +if (isset($_REQUEST['connect']) + AND + // cas qui permettent de sortir d'un commentaire PHP + (strpos($_REQUEST['connect'], "?".">")!==false + OR strpos($_REQUEST['connect'], "\n")!==false + OR strpos($_REQUEST['connect'], "\r")!==false) + ) { + $_REQUEST['connect'] = str_replace(array("?".">", "\r", "\n"), "", $_REQUEST['connect']); + if (isset($_GET['connect'])) $_GET['connect'] = $_REQUEST['connect']; + if (isset($_POST['connect'])) $_POST['connect'] = $_REQUEST['connect']; +} + +/* * S'il y a une raison de mourir, mourons */ if (isset($ecran_securite_raison)) { @@ -237,15 +261,15 @@ header("Content-Type: text/html"); die("<html><title>Error 403: Forbidden</title><body><h1>Error 403</h1><p>You are not authorized to view this page ($ecran_securite_raison)</p></body></html>"); } + /* - * Fin securite + * Fin sécurité */ /* - * Bloque les bots quand le load deborde - * + * Bloque les bots quand le load déborde */ if (!defined('_ECRAN_SECURITE_LOAD')) define('_ECRAN_SECURITE_LOAD', 4); diff -Nru spip-2.1.15/ecrire/base/connect_sql.php spip-2.1.16/ecrire/base/connect_sql.php --- spip-2.1.15/ecrire/base/connect_sql.php 2012-06-12 10:32:34.000000000 -0400 +++ spip-2.1.16/ecrire/base/connect_sql.php 2012-07-03 11:31:38.000000000 -0400 @@ -60,11 +60,7 @@ if (!isset($GLOBALS['db_ok'])) { // fera mieux la prochaine fois if ($install) return false; - if ($f AND $readable) - spip_log("spip_connect: fichier de connexion '$f' OK."); - else - spip_log("spip_connect: fichier de connexion '$f' non trouve"); - spip_log("spip_connect: echec connexion ou serveur $index mal defini dans '$f'."); + spip_log("spip_connect: serveur $index mal defini dans '$f'. spip_connect_version: " . @$GLOBALS['spip_connect_version']); // ne plus reessayer si ce n'est pas l'install return $connexions[$index]=false; } diff -Nru spip-2.1.15/ecrire/exec/auteurs.php spip-2.1.16/ecrire/exec/auteurs.php --- spip-2.1.15/ecrire/exec/auteurs.php 2012-06-12 10:32:30.000000000 -0400 +++ spip-2.1.16/ecrire/exec/auteurs.php 2012-07-03 11:31:37.000000000 -0400 @@ -56,7 +56,11 @@ lettres_d_auteurs(requete_auteurs($tri, $statut, $recherche), $debut, MAX_AUTEURS_PAR_PAGE, $tri); - $recherche = auteurs_tranches(afficher_n_auteurs($auteurs), $debut, $lettre, $tri, $statut, MAX_AUTEURS_PAR_PAGE, $nombre_auteurs,$cherche); + + $arg = ($statut ? ("&statut=" .urlencode($statut)) : '') + . ($cherche ? ("&recherche=" . urlencode($cherche)) : ''); + + $recherche = auteurs_tranches(afficher_n_auteurs($auteurs), $debut, $lettre, $tri, $statut, MAX_AUTEURS_PAR_PAGE, $nombre_auteurs, $arg); if ($cherche){ $cherche = htmlspecialchars($cherche); @@ -80,7 +84,7 @@ $visiteurs ? _T('info_visiteurs') : _T('info_auteurs'), "auteurs","redacteurs"); - echo bandeau_auteurs($tri, $visiteurs); + echo bandeau_auteurs($visiteurs); echo $trouve, "<div class='nettoyeur'></div>"; @@ -91,9 +95,9 @@ } // http://doc.spip.org/@bandeau_auteurs -function bandeau_auteurs($tri, $visiteurs) +function bandeau_auteurs($visiteurs) { - global $connect_id_auteur, $connect_statut, $connect_toutes_rubriques; + global $connect_id_auteur; $ret = debut_gauche("auteurs",true) . debut_boite_info(true); @@ -102,16 +106,16 @@ else $ret .= "\n<p class='arial1'>"._T('info_gauche_auteurs'). '</p>'; - if ($connect_statut == '0minirezo') + if (autoriser('voir', 'auteur')) $ret .= "\n<p class='arial1'>". _T('info_gauche_auteurs_exterieurs') . '</p>'; $ret .= fin_boite_info(true); $ret .= pipeline('affiche_gauche',array('args'=>array('exec'=>'auteurs'),'data'=>'')); - if ($connect_statut == '0minirezo') { + if (autoriser('voir', 'auteur')) { - if ($connect_toutes_rubriques) + if (autoriser('creer', 'auteur')) $res = icone_horizontale(_T('icone_creer_nouvel_auteur'), generer_url_ecrire("auteur_infos", 'new=oui'), "auteur-24.gif", "creer.gif", false); else $res = ''; @@ -174,13 +178,10 @@ } // http://doc.spip.org/@auteurs_tranches -function auteurs_tranches($auteurs, $debut, $lettre, $tri, $statut, $max_par_page, $nombre_auteurs, $cherche='') +function auteurs_tranches($auteurs, $debut, $lettre, $tri, $statut, $max_par_page, $nombre_auteurs, $arg='') { global $spip_lang_right; - $arg = ($statut ? ("&statut=" .urlencode($statut)) : '') - . ($cherche ? ("&recherche=" . urlencode($cherche)) : ''); - $res ="\n<tr class='titrem'>" . "\n<th style='width: 20px'>"; @@ -292,37 +293,40 @@ // http://doc.spip.org/@requete_auteurs function requete_auteurs($tri, $statut, $recherche=NULL) { - global $connect_statut, $spip_lang, $connect_id_auteur; + global $connect_id_auteur; - // - // Construire la requete - // - // si on n'est pas minirezo, ignorer les auteurs sans article // sauf les admins, toujours visibles. // limiter les statuts affiches - if ($connect_statut == '0minirezo') { + if (autoriser('voir', 'auteur')) { if ($statut[0]=='!') { $statut = substr($statut,1); $not = "NOT"; } else $not = ''; $visit = !statut_min_redac($statut); $statut = preg_split('/\W+/', $statut); - $sql_visible = sql_in("aut.statut", $statut, $not); + $where = sql_in("aut.statut", $statut, $not); } else { - $sql_visible = "( + $where = "( aut.statut = '0minirezo' OR aut.id_auteur=$connect_id_auteur OR " . sql_in('art.statut', array('prop', 'publie')) . ')'; $visit = false; } + if ($recherche) $where .= " AND $recherche" ; + return requete_auteurs_tri($tri, $where, $visit); +} + +function requete_auteurs_tri($tri, $where, $visit=false) +{ + global $spip_lang; $sql_sel = ''; $join = $visit ? "" : - (strpos($sql_visible,'art.statut')?("LEFT JOIN spip_auteurs_articles AS lien ON aut.id_auteur=lien.id_auteur" . " LEFT JOIN spip_articles AS art ON (lien.id_article = art.id_article)"):""); + (strpos($where,'art.statut')?("LEFT JOIN spip_auteurs_articles AS lien ON aut.id_auteur=lien.id_auteur" . " LEFT JOIN spip_articles AS art ON (lien.id_article = art.id_article)"):""); // tri switch ($tri) { @@ -332,7 +336,7 @@ $join = $visit ? "LEFT JOIN spip_forum AS lien ON aut.id_auteur=lien.id_auteur" : ("LEFT JOIN spip_auteurs_articles AS lien ON aut.id_auteur=lien.id_auteur" - . (strpos($sql_visible,'art.statut')?" LEFT JOIN spip_articles AS art ON (lien.id_article = art.id_article)":"")); + . (strpos($where,'art.statut')?" LEFT JOIN spip_articles AS art ON (lien.id_article = art.id_article)":"")); break; case 'site': @@ -361,9 +365,7 @@ "UPPER(aut.nom) AS unom", $sql_sel),array('',null)), 'FROM' => "spip_auteurs AS aut $join", - 'WHERE' => $sql_visible . ($recherche - ? " AND $recherche" - : ''), + 'WHERE' => $where, 'GROUP BY' => "aut.statut, aut.nom_site, aut.nom, aut.id_auteur", 'ORDER BY' => $sql_order); } diff -Nru spip-2.1.15/ecrire/inc/autoriser.php spip-2.1.16/ecrire/inc/autoriser.php --- spip-2.1.15/ecrire/inc/autoriser.php 2012-06-12 10:32:34.000000000 -0400 +++ spip-2.1.16/ecrire/inc/autoriser.php 2012-07-03 11:31:38.000000000 -0400 @@ -356,6 +356,12 @@ AND !$qui['restreint']; } +function autoriser_auteur_creer_dist($faire, $type, $id, $qui, $opt) { + return + $qui['statut'] == '0minirezo' + AND !$qui['restreint']; +} + // Autoriser a modifier un groupe de mots $id // y compris en ajoutant/modifiant les mots lui appartenant // http://doc.spip.org/@autoriser_groupemots_modifier_dist diff -Nru spip-2.1.15/ecrire/inc/drapeau_edition.php spip-2.1.16/ecrire/inc/drapeau_edition.php --- spip-2.1.15/ecrire/inc/drapeau_edition.php 2012-06-12 10:32:34.000000000 -0400 +++ spip-2.1.16/ecrire/inc/drapeau_edition.php 2012-07-03 11:31:38.000000000 -0400 @@ -69,7 +69,7 @@ // http://doc.spip.org/@signale_edition function signale_edition ($id, $auteur, $type='article') { $edition = lire_tableau_edition(); - if ($id_a = $auteur['id_auteur']) + if (isset($auteur['id_auteur']) and $id_a = $auteur['id_auteur']) $nom = $auteur['nom']; else $nom = $id_a = $GLOBALS['ip']; diff -Nru spip-2.1.15/ecrire/inc/lien.php spip-2.1.16/ecrire/inc/lien.php --- spip-2.1.15/ecrire/inc/lien.php 2012-06-12 10:32:34.000000000 -0400 +++ spip-2.1.16/ecrire/inc/lien.php 2012-07-03 11:31:38.000000000 -0400 @@ -54,7 +54,13 @@ $class = "spip_mail"; elseif (preg_match('/^<html>/',$texte)) # cf traiter_lien_explicite $class = "spip_url spip_out"; - elseif (!$class) $class = "spip_out"; # si pas spip_in|spip_glossaire + elseif (!$class) { + # spip_out sur les URLs externes + if (preg_match(',^\w+://,iS', $lien) + AND strncasecmp($lien, url_de_base(), strlen(url_de_base())) + ) + $class = "spip_out"; # si pas spip_in|spip_glossaire + } // Si l'objet n'est pas de la langue courante, on ajoute hreflang if (!$hlang AND $lang!==$GLOBALS['spip_lang']) diff -Nru spip-2.1.15/ecrire/inc/session.php spip-2.1.16/ecrire/inc/session.php --- spip-2.1.15/ecrire/inc/session.php 2012-06-12 10:32:34.000000000 -0400 +++ spip-2.1.16/ecrire/inc/session.php 2012-07-03 11:31:38.000000000 -0400 @@ -103,6 +103,10 @@ time() + $duree ); spip_log("ajoute session $fichier_session cookie $duree"); + + // purger au passage les vieux fichiers de session + supprimer_sessions(-1); + return $_COOKIE['spip_session']; } } @@ -147,7 +151,7 @@ $GLOBALS['visiteur_session'] = $sauve; // si c'est le meme, rafraichir les valeurs - if ($auteur['id_auteur'] == $sauve['id_auteur']) + if (isset($sauve['id_auteur']) and $auteur['id_auteur'] == $sauve['id_auteur']) verifier_session(); } diff -Nru spip-2.1.15/ecrire/inc_version.php spip-2.1.16/ecrire/inc_version.php --- spip-2.1.15/ecrire/inc_version.php 2012-06-12 10:32:39.000000000 -0400 +++ spip-2.1.16/ecrire/inc_version.php 2012-07-03 11:31:38.000000000 -0400 @@ -410,7 +410,7 @@ // numero de branche, utilise par les plugins // pour specifier les versions de SPIP necessaire // il faut s'en tenir a un nombre de decimales fixe ex : 2.0.0, 2.0.0-dev, 2.0.0-beta, 2.0.0-beta2 -$spip_version_branche = "2.1.15"; +$spip_version_branche = "2.1.16"; // version des signatures de fonctions PHP // (= numero SVN de leur derniere modif cassant la compatibilite et/ou necessitant un recalcul des squelettes) $spip_version_code = 15375; diff -Nru spip-2.1.15/ecrire/public/compiler.php spip-2.1.16/ecrire/public/compiler.php --- spip-2.1.15/ecrire/public/compiler.php 2012-06-12 10:32:39.000000000 -0400 +++ spip-2.1.16/ecrire/public/compiler.php 2012-07-03 11:31:38.000000000 -0400 @@ -969,6 +969,8 @@ $secondes = spip_timer('calcul_skel'); spip_log("COMPIL ($secondes) [$sourcefile] $nom.php"); + // $connect n'est pas sûr : on nettoie + $connect = preg_replace(',[^\w],', '', $connect); // Assimiler la fct principale a une boucle anonyme, c'est plus simple $code = new Boucle; diff -Nru spip-2.1.15/svn.revision spip-2.1.16/svn.revision --- spip-2.1.15/svn.revision 2012-06-12 09:40:48.000000000 -0400 +++ spip-2.1.16/svn.revision 2012-07-03 11:11:27.000000000 -0400 @@ -1,10 +1,10 @@ <svn_revision> <text_version> -Origine: svn://trac.rezo.net/spip/tags/spip-2.1.15 -Revision: 19579 -Dernier commit: 2012-06-12 15:40:48 +0200 +Origine: svn://trac.rezo.net/spip/tags/spip-2.1.16 +Revision: 19678 +Dernier commit: 2012-07-03 17:11:27 +0200 </text_version> -<origine>svn://trac.rezo.net/spip/tags/spip-2.1.15</origine> -<revision>19579</revision> -<commit>2012-06-12 15:40:48 +0200 </commit> +<origine>svn://trac.rezo.net/spip/tags/spip-2.1.16</origine> +<revision>19678</revision> +<commit>2012-07-03 17:11:27 +0200 </commit> </svn_revision> \ Pas de fin de ligne à la fin du fichier.