[SPIP] v3.0.22-->v3.0.24
authorLudovic CHEVALIER <ludovic.chevalier@heureux-cyclage.org>
Tue, 18 Oct 2016 07:51:47 +0000 (09:51 +0200)
committerLudovic CHEVALIER <ludovic.chevalier@heureux-cyclage.org>
Tue, 18 Oct 2016 07:51:47 +0000 (09:51 +0200)
41 files changed:
www/CHANGELOG.txt
www/config/ecran_securite.php
www/ecrire/action/inscrire_auteur.php
www/ecrire/action/instituer_langue_objet.php
www/ecrire/exec/valider_xml.php
www/ecrire/inc/auth.php
www/ecrire/inc/distant.php
www/ecrire/inc/filtres.php
www/ecrire/inc/lang.php
www/ecrire/inc/minipres.php
www/ecrire/inc/modifier.php
www/ecrire/inc/pipelines.php
www/ecrire/inc/rechercher.php
www/ecrire/inc/traduire.php
www/ecrire/inc/utils.php
www/ecrire/inc_version.php
www/ecrire/index.php
www/ecrire/paquet.xml
www/ecrire/public/aiguiller.php
www/ecrire/public/compiler.php
www/ecrire/public/parametrer.php
www/ecrire/req/mysql.php
www/plugins-dist/forum/formulaires/inc-forum_previsu.html
www/plugins-dist/forum/inc/email_notification_forum.php
www/plugins-dist/forum/paquet.xml
www/plugins-dist/medias/action/ajouter_documents.php
www/plugins-dist/medias/action/copier_local.php
www/plugins-dist/medias/action/editer_document.php
www/plugins-dist/medias/formulaires/editer_document.php
www/plugins-dist/medias/formulaires/joindre_document.php
www/plugins-dist/medias/inc/joindre_document.php
www/plugins-dist/medias/medias_fonctions.php
www/plugins-dist/medias/paquet.xml
www/plugins-dist/medias/prive/squelettes/contenu/document_edit.html
www/plugins-dist/sites/inc/syndic.php
www/plugins-dist/sites/paquet.xml
www/prive/formulaires/editer_auteur.php
www/prive/themes/spip/forms.css.html
www/squelettes-dist/formulaires/oubli.php
www/squelettes-dist/inc-rss-item.html
www/svn.revision

index 21cb3c4..3d94700 100644 (file)
@@ -1,4 +1,73 @@
 
+SPIP-Core spip-3.0.23 -> spip-3.0.24  30 septembre 2016
+-------------------------------------------------------------
+
+r23176 | b_b       |  (lun. 26 sept. 2016) | report de r23174Depuis FF 49, la couleur #4444 est considérée valide, ce qui rend les labels du privé bien plus clairs que #666 qui était appliqué avant (ou sous chromium). On passe donc en #444, pour être certain d'avoir un contraste suffisant.Remarque : la couleur appliquée aux labels n'est jamais la même suivant la structure du formulaire (444, 666, 777, etc). Il serait inétréssant d'homogénéiser tout ça.
+r23178 | b_b       |  (mar. 27 sept. 2016) | Fix #3831 : report de r23141 et r23148
+r23183 | cedric    |  (mar. 27 sept. 2016) | Report de r23179 : ne pas afficher l'url brute venant de la request (Nicolas CHATELAIN)
+r23184 | cedric    |  (mar. 27 sept. 2016) | Report de r23180 : pas d'url absolue dans var_url (Nicolas CHATELAIN)
+r23191 | cedric    |  (mar. 27 sept. 2016) | Report de r23185 : Eviter aussi les urls absolues windows c:\xxx et supprimer le onfocus obsolete au profit d'un placholder innofensif (Nicolas Chatelain)
+r23192 | cedric    |  (mar. 27 sept. 2016) | Report de r23186 : echapper les guillemets dans les noms de fichier pour ne pas generer du code invalide (Nicolas Chatelain)
+r23193 | cedric    |  (mar. 27 sept. 2016) | Report de r23187 : proteger des var_url fantaisistes sur le validateur_xml
+r23196 | cedric    |  (mar. 27 sept. 2016) | Report de r23194 : proteger HTTP_REFERER et var_recherche qui seront utilisee dans le surlignage JS (Rastapopoulos)
+r23199 | cedric    |  (mar. 27 sept. 2016) | Report de r23197 : proteger les commentaires de debug des slow queries
+r23202 | cedric    |  (mer. 28 sept. 2016) | Report de r23200 : - ?exec=valider_xml n'est executable que par les webmestres- var_url ne doit pas contenir de ../../ ni de ..\..\ (windows)- elle ne lance une action que si on a un var_token qui correspond soit a la signature de l'action en POST soit a la signature de l'action+var_url en GET. Ceci evite de faire lancer le validateur par un lien malveillant fourni a un webmstre d'un site auquel on a pas acces (CSRF)(Nicolas Chatelain)
+r23208 | cedric    |  (ven. 30 sept. 2016) | Report de r23206 : verification plus generique pour prendre en compte le cas windows
+
+SPIP-plugins-dist spip-3.0.23 -> spip-3.0.24  30 septembre 2016
+-------------------------------------------------------------
+
+r99661 | cedric    |  (mar. 27 sept. 2016) | Report de r85602 : Fix http://core.spip.org/issues/2938 : quand on met un zip dans tmp/ le memoriser dans la session pour le nettoyer au hit suivant si ce n'est pas un $_POST (ie si on a abandonne l'upload/deballage). Au passage on met les zip dans un sous dossier tmp/zip/ plutot que directement dans tmp/
+r99662 | cedric    |  (mar. 27 sept. 2016) | Report de r99659 : Complement a r85602 : utiliser la variable de session et ne passer qu'un md5 du chemin du zip dans le formulaire
+
+
+SPIP-Core spip-3.0.22 -> spip-3.0.23  23 septembre 2016
+-------------------------------------------------------------
+
+r22923 | cedric    |  (ven. 11 mars 2016) | version : ici on est en 3.0.23-dev
+r22924 | cedric    |  (ven. 11 mars 2016) | oups commit par erreur dans r22923
+r22930 | fil       |  (dim. 13 mars 2016) | report de r22929 : le robot facebook est mechant mais il est aussi bete, il faut donc le laisser faire son travail + mise a jour de la version de l'écran
+r22941 | cedric    |  (jeu. 17 mars 2016) | define('_CALCUL_PROFILER',300) permet de loger dans le profiler les calculs de squelette qui prennent plus de 300ms(a eclaircir : quand une boucle est lente et prends plusieurs secondes, cela n'affecte pas le temps calcule ici)
+r22948 | cedric    |  (jeu. 17 mars 2016) | Report de r22946 : un pipeline auth_administrer permet de personaliser le retour des differentes fonctions d'auth (par exemple pour renforcer la verification du mot de passe, quand flux['args']['fonction']=='verifier_pass'
+r22950 | cedric    |  (jeu. 17 mars 2016) | Report de r22055 : Permettre de choisir une langue par defaut autre que le francais -- utile pour les sites a destination d'un public non francophone, et qui utilise des plugins partiellement traduits -- clot #3292
+r22951 | cedric    |  (jeu. 17 mars 2016) | Report de r22062 : Il manquait des elements pour que le parametrage de la langue par defaut soit operationnel
+r22983 | b_b       |  (mer. 13 avril 2016) | report de r22981ne plus limiter la longueur maxi des logins dans test_login()
+r23015 | denisb    |  (lun. 23 mai 2016) | ecrire/inc/utils.php : on affecte une vraie valeur à $prefs. report de r23013
+r23025 | b_b       |  (lun. 06 juin 2016) | report de r23023complément à r20876 : pas de data dans le champ url_site
+r23032 | cedric    |  (sam. 11 juin 2016) | Report de r23030 : Bugfix erreur SQL sur langue_choisie, notamment lors de la syndication :il faut verifier l'existence du champ qui n'est pas systematique avec un champ lang+ prendre un argument $serveur en plus par coherence+ reports precedents sur les appels de calculer_langues_rubriques()
+r23038 | cedric    |  (lun. 13 juin 2016) | Report de r23036 : fixer le bug d'inclusion introduit par r23030
+r23059 | cedric    |  (sam. 25 juin 2016) | Report de r23057 : recuperer_infos_distantes() renvoyait a tort un tableau avec pour seul argument un mime_type vide quand le document n'existait pas, pouvant laisser croire a son existence. On sort explicitement avec false dans ce cas, comme prevu. Et on essaye meme pas de recuperer l'URL si la source fournie n'en est pas une
+r23062 | cedric    |  (lun. 27 juin 2016) | Report de r23060 : suite de r23023 et r20876 : soyons carrement restrictif sur ce qu'on attend
+r23065 | cedric    |  (lun. 27 juin 2016) | Report de r23063 : Sanitizer/controler les entree fournies a valider_xml_ok (Thomas Chauchefoin)
+r23068 | cedric    |  (lun. 27 juin 2016) | Report de r23066 : passer entites_html sur les id ajax par precaution (Guillaume Fahrer)
+r23071 | cedric    |  (lun. 27 juin 2016) | Report de r23069 : quand on faisait recherche=/ cela etait considere a tort comme une regexp (Thomas Chauchefoin)
+r23079 | cedric    |  (mar. 28 juin 2016) | Report de r23077 : report de r23049 sans le bug : si la request string contient le protocole et le host, il faut les depiler (cf test http://zone.spip.org/trac/spip-zone/changeset/98585)
+r23100 | cedric    |  (mer. 06 juil. 2016) | Report de r23098 : tester_url_absolue() n'accepte pas le protocole file:// car on est sur le web
+r23105 | cedric    |  (jeu. 07 juil. 2016) | Report de r23103 : completer r23098 : exclure tous les protocoles qui ne sont pas des URL mais que php accepte dans ses fonctions de lecture (guy)
+r23108 | cedric    |  (jeu. 07 juil. 2016) | Report de r23106 : suite de 23103 : la casse qui peut tout casser
+r23111 | marcimat  |  (jeu. 07 juil. 2016) | Report de r23109 : Compléter r23103 : retirer le protocole 'zip' également, et phpdoc plus à jour.
+r23153 | cedric    |  (ven. 09 sept. 2016) | Report de r23151 : Eviter d'accepter n'importe quoi dans les redirect de l'espace prive (Tim Coen)
+r23156 | cedric    |  (mar. 13 sept. 2016) | Report de r23154 : Quand un charger_fonction echoue renvoyer un 404 (et inliner les css si jamais on cherhcait un /truc.api/ pour que le rendu soit bon)
+r23158 | marcimat  |  (lun. 19 sept. 2016) | Parenthèse en trop dans r23154 (RealET)
+r23167 | cedric    |  (jeu. 22 sept. 2016) | Report de r23165 : le modele de mail utilise lors de l'inscription est modifiable via le tableau options de inscrire_auteur()
+
+SPIP-plugins-dist spip-3.0.22 -> spip-3.0.23  23 septembre 2016
+-------------------------------------------------------------
+
+r96125 | b_b       |  (lun. 21 mars 2016) | report de r93291il ne faut pas faire une alerte si c'est le form de forum en dessous de la previsu qu'on submit a nouveaucf https://core.spip.net/issues/3515
+r96640 | Nicod     |  (ven. 15 avril 2016) | report de r96638Générer des urls publiques dans les notifications de forums publics.
+r97979 | Yohann    |  (mar. 24 mai 2016) | Ajout d’une fonction aux statistiques pour désactiver les referers. Des fois, on en a pas besoin, et ça prend de la place (beaucoup !) dans les tables SQL.
+r98016 | Francky   |  (mar. 24 mai 2016) | Il y a eu une coquille dans le dernier commit, la version passait de 0.4.36 à 0.4.4Je change le donc le z pour lui mettre 37
+r98068 | cedric    |  (jeu. 26 mai 2016) | Certains flux RSS publient l'integralite de leur contenus (par exemple http://www.lelotenaction.org/pages/do/rss.xml) ce qui produit inevitablement un timeout lors de l'analyse et de la syndication.On optimise les fonctions cdata_echappe et cdata_echappe_retour, et on limite la syndication aux 1000 premiers items, surchargeable par la constante _SYNDICATION_MAX_ITEMS
+r98104 | Yohann    |  (dim. 29 mai 2016) | On revert r97979 de la branche de maintenance.
+r98274 | rasta     |  (jeu. 09 juin 2016) | Backport de [98272] : Correction de bug : il manquait <!--affiche_milieu--> pour les documents, ce qui empêchait par exemple l'inseration des traductions ou autre ajout de ce genre.
+r98562 | cedric    |  (sam. 25 juin 2016) | Report de r98560 : plusieurs petits bugs sur les documents distants mal formates qui pourraient exister en base par des operations peu avouables, on teste systematiquement que le fichier ressemble bien a une URL avant de s'y fier
+r98605 | cedric    |  (mer. 29 juin 2016) | fix r96640 qui annoncait reporter r96638 mais avait reporte le true en false
+r99156 | b_b       |  (dim. 14 août 2016) | report de r99153revert de r86810Ref la kermesse de ​​https://core.spip.net/issues/3368
+r99434 | cedric    |  (ven. 09 sept. 2016) | Report de r99431 : l'URL de rappel de mot de passe doit etre une URL safe, on la force sur l'adresse_site parametree dans la configuration du site
+
+
+
 SPIP-Core spip-3.0.21 -> spip-3.0.22  10 mars 2016
 -------------------------------------------------------------
 
index 0bd8e65..826d3c3 100644 (file)
@@ -5,7 +5,7 @@
  * ------------------
  */
 
-define('_ECRAN_SECURITE', '1.2.4'); // 2016-03-10
+define('_ECRAN_SECURITE', '1.2.7'); // 2016-09-30
 
 /*
  * Documentation : http://www.spip.net/fr_article4200.html
@@ -38,7 +38,7 @@ if (!defined('_IS_BOT'))
            // MSIE 6.0 est un botnet 99,9% du temps, on traite donc ce USER_AGENT comme un bot
            . 'MSIE 6\.0|'
            // UA plus cibles
-           . '80legs|accoona|AltaVista|ASPSeek|Baidu|Charlotte|EC2LinkFinder|eStyle|facebook|flipboard|hootsuite|FunWebProducts|Google|Genieo|INA dlweb|InfegyAtlas|Java VM|LiteFinder|Lycos|MetaURI|Moreover|Rambler|Scooter|ScrubbyBloglines|Yahoo|Yeti'
+           . '80legs|accoona|AltaVista|ASPSeek|Baidu|Charlotte|EC2LinkFinder|eStyle|flipboard|hootsuite|FunWebProducts|Google|Genieo|INA dlweb|InfegyAtlas|Java VM|LiteFinder|Lycos|MetaURI|Moreover|Rambler|Scooter|ScrubbyBloglines|Yahoo|Yeti'
            . ',i', (string) $_SERVER['HTTP_USER_AGENT'])
        );
 
@@ -210,6 +210,18 @@ if (isset($_POST['tmp_lkojfghx3']))
 if (isset($_REQUEST['transformer_xml']))
        $ecran_securite_raison = "transformer_xml";
 
+/*
+ * Outils XML mal sécurisés again
+ */
+if (isset($_REQUEST['var_url']) and $_REQUEST['var_url'] and isset($_REQUEST['exec']) and $_REQUEST['exec']=='valider_xml'){
+       $url = trim($_REQUEST['var_url']);
+       if (strncmp($url,'/',1)==0
+         or (($p=strpos($url,'..'))!==false AND strpos($url,'..',$p+3)!==false)
+               or (strpos($url,'://')!==false or strpos($url,':\\')!==false)) {
+               $ecran_securite_raison = 'URL interdite pour var_url';
+       }
+}
+
 /*
  * Sauvegarde mal securisée < 2.0.9
  */
index afaba99..ed1f959 100644 (file)
@@ -26,6 +26,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
  *   id : id_rubrique fournit en second arg de #FORMULAIRE_INSCRIPTION
  *   from : email de l'envoyeur pour l'envoi du mail d'inscription
  *   force_nouveau : forcer le statut nouveau sur l'auteur inscrit, meme si il existait deja en base
+ *   modele_mail : squelette de mail a utiliser
  * @return array|string
  */
 function action_inscrire_auteur_dist($statut, $mail_complet, $nom, $options = array()){
@@ -177,13 +178,6 @@ function test_login($nom, $mail) {
        if (strlen($login_base) < 3)
                $login_base = 'user';
 
-       // eviter aussi qu'il soit trop long (essayer d'attraper le prenom)
-       if (strlen($login_base) > 10) {
-               $login_base = preg_replace("/^(.{4,}(_.{1,7})?)_.*/",
-                       '\1', $login_base);
-               $login_base = substr($login_base, 0,13);
-       }
-
        $login = $login_base;
 
        for ($i = 1; ; $i++) {
@@ -217,8 +211,12 @@ function envoyer_inscription_dist($desc, $nom, $mode, $options=array()) {
        $contexte['url_confirm'] = parametre_url($contexte['url_confirm'],'email',$desc['email']);
        $contexte['url_confirm'] = parametre_url($contexte['url_confirm'],'jeton',$desc['jeton']);
 
-       $message = recuperer_fond('modeles/mail_inscription',$contexte);
-       $from = (isset($options['from'])?$options['from']:null);
+       $modele_mail = 'modeles/mail_inscription';
+       if (isset($options['modele_mail']) and $options['modele_mail']){
+               $modele_mail = $options['modele_mail'];
+       }
+       $message = recuperer_fond($modele_mail, $contexte);
+       $from = (isset($options['from']) ? $options['from'] : null);
        $head = null;
        return array("", $message,$from,$head);
 }
@@ -337,4 +335,4 @@ function auteur_verifier_jeton($jeton){
  */
 function auteur_effacer_jeton($id_auteur){
        return sql_updateq("spip_auteurs", array("cookie_oubli" => ''), "id_auteur=" . intval($id_auteur));
-}
\ No newline at end of file
+}
index e7ad0a6..4b49751 100644 (file)
@@ -18,25 +18,45 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
  * @param int $id
  * @param int $id_rubrique
  * @param string $changer_lang
+ * @param string $serveur
  * @return string
  */
-function action_instituer_langue_objet_dist($objet,$id, $id_rubrique, $changer_lang) {
+function action_instituer_langue_objet_dist($objet, $id, $id_rubrique, $changer_lang, $serveur='') {
        if ($changer_lang) {
                $table_objet_sql = table_objet_sql($objet);
                $id_table_objet = id_table_objet($objet);
-
+               $trouver_table = charger_fonction('trouver_table', 'base');
+               $desc = $trouver_table($table_objet_sql, $serveur);
+               
+               $set = array();
+               if (isset($desc['field']['langue_choisie'])){
+                       $set['langue_choisie'] = 'oui';
+               }
+               
                if ($changer_lang != "herit") {
-                       sql_updateq($table_objet_sql, array('lang'=>$changer_lang, 'langue_choisie'=>'oui'), "$id_table_objet=".intval($id));
-                       include_spip('inc/rubriques');
-                       $langues = calculer_langues_utilisees();
+                       $set['lang'] = $changer_lang;
+                       sql_updateq($table_objet_sql, $set, "$id_table_objet=" . intval($id),'',$serveur);
+                       include_spip('inc/rubriques'); // pour calculer_langues_rubriques et calculer_langues_utilisees
+                       if ($table_objet_sql == 'spip_rubriques') {
+                               calculer_langues_rubriques();
+                       }
+                       $langues = calculer_langues_utilisees($serveur);
                        ecrire_meta('langues_utilisees', $langues);
                }
                else {
                        $langue_parent = sql_getfetsel("lang", "spip_rubriques", "id_rubrique=" . intval($id_rubrique));
                        if (!$langue_parent)
                                $langue_parent = $GLOBALS['meta']['langue_site'];
-                       sql_updateq($table_objet_sql, array('lang'=>$langue_parent, 'langue_choisie'=>'non'), "$id_table_objet=".intval($id));
                        $changer_lang = $langue_parent;
+                       $set['lang'] = $changer_lang;
+                       if (isset($set['langue_choisie'])){
+                               $set['langue_choisie'] = 'non';
+                       }
+                       sql_updateq($table_objet_sql, $set, "$id_table_objet=" . intval($id),'',$serveur);
+                       if ($table_objet_sql == 'spip_rubriques') {
+                               include_spip('inc/rubriques');
+                               calculer_langues_rubriques();
+                       }
                }
        }
        return $changer_lang;
index 621ae26..b6a8fbe 100644 (file)
@@ -27,23 +27,60 @@ include_spip('public/debusquer');
 // http://doc.spip.org/@exec_valider_xml_dist
 function exec_valider_xml_dist()
 {
-       if (!autoriser('sauvegarder')) {
+       if (!autoriser('webmestre')) {
                include_spip('inc/minipres');
                echo minipres();
-       } else valider_xml_ok(_request('var_url'), _request('ext'), intval(_request('limit')), _request('recur'));
+       } else {
+               $erreur = "";
+               // verifier que les var de l'URL sont conformes avant d'appeler la fonction
+               $url = trim(_request('var_url'));
+               if (strncmp($url,'/',1)==0) $erreur = 'Chemin absolu interdit pour var_url';
+               // on a pas le droit de remonter plus de 1 fois dans le path (pas 2 occurences de ../ ou ..\ (win))
+               if (($p=strpos($url,'..'))!==false AND strpos($url,'..',$p+3)!==false) $erreur = 'Interdit de remonter en dehors de la racine';
+               if (strpos($url,'://')!==false or strpos($url,':\\')!==false) $erreur = 'URL absolue interdite pour var_url';
+
+               $ext = trim(_request('ext'));
+               $ext = ltrim($ext,'.'); // precaution
+               if (preg_match('/\W/',$ext)) $erreur = 'Extension invalide';
+
+               // en GET var_url doit etre signee, en POST seule l'action est signee
+               // CSRF safe
+               $process = true;
+               if ($url){
+                       include_spip('inc/securiser_action');
+                       if ($_SERVER["REQUEST_METHOD"]=='POST'){
+                               if (!$token = _request('var_token')
+                                 or !verifier_cle_action("valider_xml",$token)){
+                                       $process = false;
+                               }
+                       }
+                       if ($_SERVER["REQUEST_METHOD"]!='POST'){
+                               if (!$token = _request('var_token')
+                                 or !verifier_cle_action("valider_xml&var_url=$url",$token)){
+                                       $process = false;
+                               }
+                       }
+               }
+
+               if ($erreur){
+                       include_spip('inc/minipres');
+                       echo minipres($erreur);
+               }
+               else {
+                       valider_xml_ok($url, $ext, intval(_request('limit')), _request('recur'), $process);
+               }
+       }
 }
 
 // http://doc.spip.org/@valider_xml_ok
-function valider_xml_ok($url, $req_ext, $limit, $rec)
-{
+function valider_xml_ok($url, $req_ext, $limit, $rec, $process = true) {
        $url = urldecode($url);
        $rec = !$rec ? false : array();
        if (!$limit) $limit = 200;
        $titre = _T('analyse_xml');
        if (!$url) {
-               $url_aff = 'http://';
-               $onfocus = "this.value='';";
-               $texte = $bandeau = $err = '';
+               $url_aff = '';
+               $bandeau = $err = '';
        } else {
                include_spip('inc/distant');
 
@@ -78,24 +115,28 @@ function valider_xml_ok($url, $req_ext, $limit, $rec)
                                }
                        } else { $dir = 'exec'; $script = $url; $args = true;}
 
-                       $transformer_xml = charger_fonction('valider', 'xml');
-                       $onfocus = "this.value='" . addslashes($url) . "';";
-                       if (preg_match(',^[a-z][0-9a-z_]*$,i', $url)) {
-                               $res = $transformer_xml(charger_fonction($url, $dir), $args);
-                               $url_aff = valider_pseudo_url($dir, $script);
-                       } else {
-                               $res = $transformer_xml(recuperer_page($url));
-                               $url_aff = entites_html($url);
-                       }
-                       list($texte, $err) = emboite_texte($res);
-                       if (!$err) {
-                               $err = '<h3>' . _T('spip_conforme_dtd') . '</h3>';
+                       $url_aff = entites_html($url);
+                       $bandeau = "";
+                       $res = "";
+                       if ($process) {
+                               $transformer_xml = charger_fonction('valider', 'xml');
+                               if (preg_match(',^[a-z][0-9a-z_]*$,i', $url)) {
+                                       $res = $transformer_xml(charger_fonction($url, $dir), $args);
+                                       $url_aff = valider_pseudo_url($dir, $script);
+                               } else {
+                                       $res = $transformer_xml(recuperer_page($url));
+                                       $url_aff = entites_html($url);
+                               }
+                               list($texte, $err) = emboite_texte($res);
+                               if (!$err) {
+                                       $err = '<h3>' . _T('spip_conforme_dtd') . '</h3>';
+                               }
+                               $res =
+                                       "<div style='text-align: center'>" . $err . "</div>" .
+                                       "<div style='margin: 10px; text-align: left'>" . $texte . '</div>';
+                               $bandeau = "<a href='$url_aff'>".$url_aff."</a>";
                        }
 
-                       $res =
-                       "<div style='text-align: center'>" . $err . "</div>" .
-                       "<div style='margin: 10px; text-align: left'>" . $texte . '</div>';
-                       $bandeau = "<a href='$url_aff'>$url</a>";
                }
        }
 
@@ -103,19 +144,34 @@ function valider_xml_ok($url, $req_ext, $limit, $rec)
        $debut = $commencer_page($titre);
        $jq = http_script("", 'jquery.js');
        
+
        echo str_replace('<head>', "<head>$jq", $debut);
-       $onfocus = '<input type="text" size="70" value="' .$url_aff .'" name="var_url" id="var_url" onfocus="'.$onfocus . '" />';
-       $onfocus = generer_form_ecrire('valider_xml', $onfocus, " method='get'");
+       include_spip('inc/securiser_action');
+       $token = calculer_cle_action("valider_xml");
+       $texte = '<input type="text" size="70" value="' . $url_aff . '" name="var_url" id="var_url" placeholder="http://" />';
+       $texte .= '<input type="hidden" value="' . $token . '" name="var_token" />';
+       $texte .= '<input type="hidden" value="' . $req_ext . '" name="ext" />';
+       $texte .= '<input type="submit" value="Go" />';
+       $texte = generer_form_ecrire('valider_xml', $texte, " method='post'");
+
+       $self = generer_url_ecrire('valider_xml');
+       $self = parametre_url($self, 'var_url', $url);
+       $self = parametre_url($self, 'ext', $req_ext);
+       $self = parametre_url($self, 'limit', $limit);
+       $self = parametre_url($self, 'rec', $rec);
+       $self = "<a href='$self'>$self</a>";
 
-       echo "<h1>", $titre, '<br>', $bandeau, '</h1>',
-         "<div style='text-align: center'>", $onfocus, "</div>",
+       echo "<h1 class='grostitre'>", $titre, " <small>$bandeau</small>", '</h1>',
+         "<div style='text-align: center'>", $texte, "</div>",
          $res,
+         "<br /><br /><p><small>$self</small></p>",
          fin_page();
 }
 
 // http://doc.spip.org/@valider_resultats
 function valider_resultats($res, $mode)
 {
+       include_spip('inc/securiser_action');
        $i = $j = 0;
        $table = '';
        rsort($res);
@@ -132,10 +188,14 @@ function valider_resultats($res, $mode)
                  ($erreurs[0][0] . ' ' . _T('ligne') . ' ' .
                   $erreurs[0][1] .($nb==1? '': '  ...'));
                if ($err) $j++;
-               $h = $mode
-               ? ($appel . '&var_mode=debug&var_mode_affiche=validation')
-               : generer_url_ecrire('valider_xml', "var_url=" . urlencode($appel));
-               
+               if ($mode) {
+                       $h = $appel . '&var_mode=debug&var_mode_affiche=validation';
+               }
+               else {
+                       $h = generer_url_ecrire('valider_xml', "var_url=" . urlencode($appel));
+                       $h = parametre_url($h,'var_token', calculer_cle_action("valider_xml&var_url=$appel"));
+               }
+
                $table .= "<tr class='$class'>"
                . "<td style='text-align: right'>$nb</td>"
                . "<td style='text-align: right$color'>$texte</td>"
index 4f59f2d..c4b6f20 100644 (file)
@@ -325,9 +325,18 @@ function auth_administrer($fonction,$args,$defaut=false){
        if ($auth = charger_fonction($auth_methode,'auth',true)
                AND function_exists($f="auth_{$auth_methode}_$fonction")
        )
-               return call_user_func_array($f, $args);
+               $res = call_user_func_array($f, $args);
        else
-               return $defaut;
+               $res = $defaut;
+       $res = pipeline('auth_administrer',array(
+               'args' => array(
+                       'fonction' => $fonction,
+                       'methode' => $auth_methode,
+                       'args' => $args
+               ),
+               'data' => $res
+       ));
+       return $res;
 }
 
 /**
index 5b94a06..a5fd6c6 100644 (file)
@@ -506,6 +506,11 @@ function fichier_copie_locale($source){
 // http://doc.spip.org/@recuperer_infos_distantes
 function recuperer_infos_distantes($source, $max = 0, $charger_si_petite_image = true){
 
+       // pas la peine de perdre son temps
+       if (!tester_url_absolue($source)) {
+               return false;
+       }
+       
        # charger les alias des types mime
        include_spip('base/typedoc');
        global $mime_alias;
@@ -584,6 +589,11 @@ function recuperer_infos_distantes($source, $max = 0, $charger_si_petite_image =
                $a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE);
        }
 
+       // si on a rien trouve pas la peine d'insister
+       if (!$a) {
+               return false;
+       }
+
        // S'il s'agit d'une image pas trop grosse ou d'un fichier html, on va aller
        // recharger le document en GET et recuperer des donnees supplementaires...
        if (preg_match(',^image/(jpeg|gif|png|swf),', $mime_type)){
index 5223d09..4568351 100644 (file)
@@ -2569,8 +2569,10 @@ function encoder_contexte_ajax($c,$form='', $emboite=NULL, $ajaxid='') {
        $r = self();
        $r = ' data-origin="'.$r.'"';
        $class = 'ajaxbloc';
-       if ($ajaxid AND is_string($ajaxid)){
-               $class .= ' ajax-id-'.$ajaxid;
+       if ($ajaxid and is_string($ajaxid)) {
+               // ajaxid est normalement conforme a un nom de classe css
+               // on ne verifie pas la conformite, mais on passe entites_html par dessus par precaution
+               $class .= ' ajax-id-' . entites_html($ajaxid);
        }
        return "<div class='$class' "."data-ajax-env='$env'$r>\n$emboite</div><!--ajaxbloc-->\n";
 }
index edf2247..208338a 100644 (file)
@@ -419,8 +419,8 @@ function init_langues() {
        if (!isset($GLOBALS['meta']['langue_site'])) {
                // Initialisation : le francais si dispo, sinon la premiere langue trouvee
                $GLOBALS['meta']['langue_site'] = $tout =
-               (!$all_langs OR (strpos(',fr,',",$all_langs,")!==false))
-                 ? 'fr' :  substr($all_langs,0,strpos($all_langs,','));
+               (!$all_langs OR (strpos(','._LANGUE_PAR_DEFAUT.',',",$all_langs,")!==false))
+                 ? _LANGUE_PAR_DEFAUT :  substr($all_langs,0,strpos($all_langs,','));
                ecrire_meta('langue_site', $tout);
        }
 }
index 73629b8..63249d5 100644 (file)
@@ -123,6 +123,10 @@ function minipres($titre='', $corps="", $onload='', $all_inline = false)
                $statut = isset($GLOBALS['visiteur_session']['statut']) ? $GLOBALS['visiteur_session']['statut'] : '';
                $nom    = isset($GLOBALS['visiteur_session']['nom']) ? $GLOBALS['visiteur_session']['nom'] : '';
 
+               if ($statut != '0minirezo') {
+                       $titre = _T('info_acces_interdit');
+               }
+
                $corps = generer_form_ecrire('accueil', '','',
                                                $statut ? _T('public:accueil_site') : _T('public:lien_connecter')
                );
index f815369..872a477 100644 (file)
@@ -192,8 +192,8 @@ function objet_modifier_champs($objet, $id_objet, $options, $c=null, $serveur=''
                                        $parent = ($objet=='rubrique')?'id_parent':'id_rubrique';
                                        $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=".intval($id_objet));
                                }
-                               $instituer_langue_objet = charger_fonction('instituer_langue_objet','action');
-                               $champs['lang'] = $instituer_langue_objet($objet,$id_objet, $id_rubrique, $changer_lang);
+                               $instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action');
+                               $champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur);
                        }
                        // on laisse 'lang' dans $champs,
                        // ca permet de passer dans le pipeline post_edition et de journaliser
index c204559..1b3a83a 100644 (file)
@@ -82,6 +82,13 @@ function f_surligne ($texte) {
               OR !isset($_SERVER['HTTP_REFERER'])))
                return $texte;
        include_spip('inc/surligne');
+       if (isset($_SERVER['HTTP_REFERER'])) {
+               $_SERVER['HTTP_REFERER'] = preg_replace(',[^\w\,/#&;-]+,', ' ', $_SERVER['HTTP_REFERER']);
+       }
+       if ($rech){
+               $rech = preg_replace(',[^\w\,/#&;-]+,', ' ', $rech);
+       }
+
        return surligner_mots($texte, $rech);
 }
 
index 3e36105..f5ecc4b 100644 (file)
@@ -72,7 +72,7 @@ function expression_recherche($recherche, $options) {
        $recherche = trim($recherche);
 
        $is_preg = false;
-       if (substr($recherche,0,1)=='/' AND substr($recherche,-1,1)=='/'){
+       if (substr($recherche, 0, 1) == '/' and substr($recherche, -1, 1) == '/' and strlen($recherche) > 2) {
                // c'est une preg
                $recherche_trans = translitteration($recherche);
                $preg = $recherche_trans.$options['preg_flags'];
index 57cbe33..861bce1 100644 (file)
@@ -69,7 +69,7 @@ function charger_langue($lang, $module = 'spip') {
                // var liee a la langue
                $l = $GLOBALS['meta']['langue_site'];
                if (!$fichiers_lang = chercher_module_lang($module, $l))
-                       $fichiers_lang = chercher_module_lang($module, 'fr');
+                       $fichiers_lang = chercher_module_lang($module, _LANGUE_PAR_DEFAUT);
 
                if ($fichiers_lang) {
                        $GLOBALS['idx_lang']='i18n_'.$module.'_' .$l;
@@ -167,14 +167,14 @@ function inc_traduire_dist($ori, $lang) {
        // on essaie d'abord la langue du site, puis a defaut la langue fr
        $langue_retenue = $lang;
        if (!strlen($text)
-       AND $lang !== 'fr') {
+       AND $lang !== _LANGUE_PAR_DEFAUT) {
                if ($lang !== $GLOBALS['meta']['langue_site']) {
                        $text = inc_traduire_dist($ori, $GLOBALS['meta']['langue_site']);
                        $langue_retenue = (!strlen($text) ? $GLOBALS['meta']['langue_site'] : '');
                }
                else {
-                       $text = inc_traduire_dist($ori, 'fr');
-                       $langue_retenue = (!strlen($text) ? 'fr' : '');
+                       $text = inc_traduire_dist($ori, _LANGUE_PAR_DEFAUT);
+                       $langue_retenue = (!strlen($text) ? _LANGUE_PAR_DEFAUT : '');
                }
        }
 
index 01ed0c1..80ff11d 100644 (file)
@@ -45,7 +45,9 @@ function charger_fonction($nom, $dossier='exec', $continue=false) {
 
        if (!preg_match(',^\w+$,', $f)){
                if ($continue) return false; //appel interne, on passe
-               die(spip_htmlspecialchars($nom)." pas autorise");
+               include_spip('inc/minipres');
+               echo minipres();
+               exit;
        }
 
        // passer en minuscules (cf les balises de formulaires)
@@ -66,7 +68,8 @@ function charger_fonction($nom, $dossier='exec', $continue=false) {
 
        include_spip('inc/minipres');
        echo minipres(_T('forum_titre_erreur'),
-                _T('fichier_introuvable', array('fichier'=> '<b>'.spip_htmlentities($d).'</b>')));
+                _T('fichier_introuvable', array('fichier'=> '<b>'.spip_htmlentities($d).'</b>')),
+               array('all_inline'=>true,'status'=>404));
        exit;
 }
 
@@ -271,12 +274,27 @@ function set_request($var, $val = NULL, $c=false) {
 
 
 /**
- * Tester si une url est absolue
- * @param  $url
+ * Tester si une URL est absolue
+ * 
+ * On est sur le web, on exclut certains protocoles, 
+ * notamment 'file://', 'php://' et d'autres…
+
+ * @param string $url
  * @return bool
  */
-function tester_url_absolue($url){
-       return preg_match(";^([a-z]+:)?//;Uims",trim($url))?true:false;
+function tester_url_absolue($url) {
+       $url = trim($url);
+       if (preg_match(";^([a-z]{3,7}:)?//;Uims", $url, $m)) {
+               if (
+                       isset($m[1])
+                       and $p = strtolower(rtrim($m[1], ':'))
+                       and in_array($p, array('file', 'php', 'zlib', 'glob', 'phar', 'ssh2', 'rar', 'ogg', 'expect', 'zip'))
+                 ) {
+                       return false;
+               }
+               return true;
+       }
+       return false;
 }
 
 /**
@@ -872,7 +890,7 @@ function lister_themes_prives(){
                $themes = array(_SPIP_THEME_PRIVE);
                // lors d'une installation neuve, prefs n'est pas definie.
                if (isset($GLOBALS['visiteur_session']['prefs'])) {
-                       $prefs = isset($GLOBALS['visiteur_session']['prefs']);
+                       $prefs = $GLOBALS['visiteur_session']['prefs'];
                } else {
                        $prefs = array();
                }
@@ -1296,6 +1314,16 @@ function url_de_($http,$host,$request,$prof=0){
        $prof = max($prof,0);
 
        $myself = ltrim($request,'/');
+       // vieux mode HTTP qui envoie après le nom de la methode l'URL compléte
+       // protocole, "://", nom du serveur avant le path dans _SERVER["REQUEST_URI"]
+       if (strpos($myself,'://') !== false) {
+               $myself = explode('://',$myself);
+               array_shift($myself);
+               $myself = implode('://',$myself);
+               $myself = explode('/',$myself);
+               array_shift($myself);
+               $myself = implode('/',$myself);
+       }
        # supprimer la chaine de GET
        list($myself) = explode('?', $myself);
        $url = join('/', array_slice(explode('/', $myself), 0, -1-$prof)).'/';
@@ -1583,6 +1611,9 @@ function spip_initialisation_core($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) {
                #if (!defined('_SPIP_LOCK_MODE')) define('_SPIP_LOCK_MODE',2); // utiliser le nfslock de spip mais link() est tres souvent interdite
        }
 
+       // Langue par defaut
+       if (!defined('_LANGUE_PAR_DEFAUT')) define('_LANGUE_PAR_DEFAUT','fr');
+
        // PHP_VERSION_ID dispo depuis PHP 5.2.7
        if (!defined('PHP_VERSION_ID')) {
           $version = explode('.',PHP_VERSION);
index d491833..9d44b13 100644 (file)
@@ -296,7 +296,7 @@ $liste_des_authentifications = array(
 // pour specifier les versions de SPIP necessaires
 // 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 = "3.0.22";
+$spip_version_branche = "3.0.24";
 // 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 = 17873;
index bdddab2..d3c650a 100644 (file)
@@ -65,6 +65,14 @@ if (_request('action') OR _request('var_ajax') OR _request('formulaire_action'))
          traiter_formulaires_dynamiques())
          exit; // le hit est fini !
 }
+// securiser les redirect du back-office
+if (_request('redirect')) {
+       if (!function_exists('securiser_redirect_action')){
+               include_spip('public/aiguiller');
+       }
+       set_request('redirect',securiser_redirect_action(_request('redirect')));
+}
+
 
 //
 // Gestion d'une page normale de l'espace prive
index 87f5e33..52a2139 100644 (file)
@@ -1,14 +1,14 @@
 <paquet
        prefix="spip"
        categorie="outil"
-       version="3.0.22"
+       version="3.0.24"
        etat="stable"
        compatibilite="];["
        schema="19268"
        documentation="http://www.spip.net"
        demonstration="http://demo.spip.net"
        developpement="http://core.spip.org/projects/spip/"
->
+>      
 
        <nom>SPIP</nom>
        <!-- Système de publication pour l'Internet -->
@@ -49,6 +49,7 @@
        <pipeline nom="affiche_formulaire_login" action="auth_formulaire_login" inclure="inc/pipelines.php" />
        <pipeline nom="alertes_auteur" action="" />
        <pipeline nom="arbo_creer_chaine_url" action="" />
+       <pipeline nom="auth_administrer" action="" />
        <pipeline nom="autoriser" action="" />
        <pipeline nom="base_admin_repair" action="" />
        <pipeline nom="boite_infos" action="f_boite_infos" inclure="inc/pipelines_ecrire.php" />
index 8b3bc50..d34c686 100644 (file)
@@ -12,8 +12,9 @@
 
 if (!defined('_ECRIRE_INC_VERSION')) return;
 
-function securiser_redirect_action($redirect){
-       if (tester_url_absolue($redirect) AND !defined('_AUTORISER_ACTION_ABS_REDIRECT')){
+function securiser_redirect_action($redirect) {
+       if ((tester_url_absolue($redirect) or preg_match(',^\w+:,',trim($redirect)))
+               and !defined('_AUTORISER_ACTION_ABS_REDIRECT')) {
                // si l'url est une url du site, on la laisse passer sans rien faire
                // c'est encore le plus simple
                $base = $GLOBALS['meta']['adresse_site']."/";
index 576545b..362000a 100644 (file)
@@ -140,7 +140,7 @@ function calculer_inclure($p, &$boucles, $id_boucle) {
        $_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true);
        if (is_string($p->texte)) {
                $fichier = $p->texte;
-               $code = "\"$fichier\"";
+               $code = "\"".str_replace('"','\"',$fichier)."\"";
 
        } else {
                $code = calculer_liste($p->texte, $p->descr, $boucles, $id_boucle);
@@ -184,7 +184,7 @@ function calculer_inclure($p, &$boucles, $id_boucle) {
        }
 
        // s'il y a une extension .php, ce n'est pas un squelette
-       if (preg_match('/^.+[.]php$/s', $fichier)) {
+       if ($fichier and preg_match('/^.+[.]php$/s', $fichier)) {
                $code = sandbox_composer_inclure_php($fichier, $p, $contexte);
        } else  {
                $_options[] = "\"compil\"=>array($compil)";
index 07a69cb..fe60941 100644 (file)
@@ -143,6 +143,12 @@ function public_parametrer_dist($fond, $contexte='', $cache='', $connect='')  {
                        . join(', ', $infos)
                        .' ('.strlen($page['texte']).' octets)');
 
+               if (defined('_CALCUL_PROFILER') AND intval($profile)>_CALCUL_PROFILER){
+                       spip_log("calcul ($profile) [$skel] "
+                               . join(', ', $infos)
+                               .' ('.strlen($page['texte']).' octets) | '.$_SERVER['REQUEST_URI'],"profiler"._LOG_AVERTISSEMENT);
+               }
+
                if ($debug) {
                // si c'est ce que demande le debusqueur, lui passer la main
                        $t = strlen($page['texte']) ? $page['texte'] : " ";
@@ -158,7 +164,7 @@ function public_parametrer_dist($fond, $contexte='', $cache='', $connect='')  {
                // Si #CACHE{} n'etait pas la, le mettre a $delais
                if (!isset($page['entetes']['X-Spip-Cache'])){
                        // Dans l'espace prive ou dans un modeles/ on pose un cache 0 par defaut
-                       // si aucun #CACHE{} spécifié
+                       // si aucun #CACHE{} specifie
                        // le contexte implicite qui conditionne le cache assure qu'on retombe pas sur le meme
                        // entre public et prive
                        if (test_espace_prive() OR strncmp($fond,'modeles/',8)==0)
index 736108e..89d66fa 100644 (file)
@@ -185,10 +185,10 @@ function spip_mysql_query($query, $serveur='',$requeter=true) {
        if (defined('_DEBUG_SLOW_QUERIES') AND _DEBUG_SLOW_QUERIES){
                if(isset($GLOBALS['debug']['aucasou'])){
                        list(,$id,, $infos) = $GLOBALS['debug']['aucasou'];
-                       $debug .= " BOUCLE$id @ ".$infos[0] ." | ";
+                       $debug .= "BOUCLE$id @ ".$infos[0] ." | ";
                }
-               $debug .= " " . $_SERVER['REQUEST_URI'].' + '.$GLOBALS['ip'];
-               $debug = ' /*'.str_replace('*/','@/',$debug).' */';
+               $debug .= $_SERVER['REQUEST_URI'].' + '.$GLOBALS['ip'];
+               $debug = ' /* '. mysql_real_escape_string(str_replace('*/','@/',$debug)). ' */';
        }
 
        $r = $link ? mysql_query($query.$debug, $link) : mysql_query($query.$debug);
index df1572e..8f48744 100644 (file)
 <br class="clear" />
 <script type="text/javascript">/*<![CDATA[*/
 if (window.jQuery){ jQuery(function(){
-       jQuery(window).unload(function() { alert('<:forum:forum_attention_message_non_poste|texte_script:>');jQuery(window).unbind();});
-       jQuery(window).on('beforeunload', function(){           jQuery(window).unbind();return '<:forum:forum_attention_message_non_poste|texte_script:>';      });
+       var confirm_quit = true;
+       jQuery(window).unload(function() { if (confirm_quit) alert('<:forum:forum_attention_message_non_poste|texte_script:>');jQuery(window).unbind();});
+       jQuery(window).on('beforeunload', function(e){ jQuery(window).unbind();if (!confirm_quit) return;e.returnValue='<:forum:forum_attention_message_non_poste|texte_script:>';return e.returnValue; });
+       jQuery('fieldset.previsu').closest('form').next('form').bind('submit',function(){
+               confirm_quit=false;
+       });
 });}
 /*]]>*/</script>
\ No newline at end of file
index 6794c01..d5253aa 100644 (file)
@@ -42,7 +42,7 @@ function inc_email_notification_forum_dist ($t, $email, $contexte=array()) {
                }
                else if ($t['statut'] == 'publie') # forum publie
                {
-                       $url = generer_url_entite($id_forum, 'forum');
+                       $url = generer_url_entite($id_forum, 'forum', '', 'forum'.$id_forum, true);
                }
                else #  forum modere, spam, poubelle direct ....
                {
index 0a43aa0..796c750 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="forum"
        categorie="communication"
-       version="1.8.41"
+       version="1.8.43"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/forum-32.png"
index 1356a45..c42752f 100644 (file)
@@ -94,6 +94,7 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
 
        include_spip('inc/modifier');
        if (isset($file['distant']) AND $file['distant'] AND !in_array($mode,array('choix','auto','image','document'))) {
+               spip_log("document distant $source accepte sans verification, mode=$mode","medias"._LOG_INFO_IMPORTANTE);
                include_spip('inc/distant');
                $file['tmp_name'] = _DIR_RACINE . copie_locale($source);
                $source = $file['tmp_name'];
@@ -104,6 +105,9 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
        // via une requete HEAD pour savoir si la ressource existe (non 404), si le
        // content-type est connu, et si possible recuperer la taille, voire plus.
        if (isset($file['distant']) AND $file['distant']) {
+               if (!tester_url_absolue($source)){
+                       return _T('medias:erreur_chemin_distant', array('nom' => $source));
+               }
                include_spip('inc/distant');
                if (is_array($a = renseigner_source_distante($source))) {
 
index dd82788..b1bf543 100644 (file)
@@ -54,26 +54,34 @@ function action_copier_local_post($id_document) {
        $row = sql_fetsel("mode,fichier, descriptif, credits", "spip_documents", "id_document=$id_document");
        $source = $row['fichier'];
 
-       include_spip('inc/distant'); // pour 'copie_locale'
-       $fichier = copie_locale($source);
-       if ($fichier) {
-               $fichier = _DIR_RACINE . $fichier;
-               $files[] = array('tmp_name'=>$fichier,'name'=>basename($fichier));
-               $ajouter_documents = charger_fonction('ajouter_documents','action');
-               spip_log("convertit doc $id_document en local: $source => $fichier");
-               $liste = array();
-               $ajouter_documents($id_document,$files,'',0,$row['mode'],$liste);
-
-               spip_unlink($fichier);
-               
-               // ajouter l'origine du document aux credits
-               include_spip('action/editer_document');
-               document_modifier($id_document,array('credits'=>($row['credits']?$row['credits'].', ':'').$source));
-               return true;
-               
+       // si la source est bien un fichier distant
+       // sinon c'est une donnee moisie, on ne fait rien
+       if (tester_url_absolue($source)){
+       
+               include_spip('inc/distant'); // pour 'copie_locale'
+               $fichier = copie_locale($source);
+               if ($fichier) {
+                       $fichier = _DIR_RACINE . $fichier;
+                       $files[] = array('tmp_name'=>$fichier,'name'=>basename($fichier));
+                       $ajouter_documents = charger_fonction('ajouter_documents','action');
+                       spip_log("convertit doc $id_document en local: $source => $fichier");
+                       $liste = array();
+                       $ajouter_documents($id_document,$files,'',0,$row['mode'],$liste);
+       
+                       spip_unlink($fichier);
+                       
+                       // ajouter l'origine du document aux credits
+                       include_spip('action/editer_document');
+                       document_modifier($id_document,array('credits'=>($row['credits']?$row['credits'].', ':'').$source));
+                       return true;
+                       
+               } else {
+                       spip_log("echec copie locale $source");
+               }
        } else {
-               spip_log("echec copie locale $source");
+               spip_log("echec copie locale $source n'est pas une URL distante", "medias" . _LOG_ERREUR);
        }
+               
        return _T('medias:erreur_copie_fichier',array('nom'=>$source));
 }
 
index a83b355..6ed20fa 100644 (file)
@@ -126,6 +126,7 @@ function document_modifier($id_document, $set=false) {
        if ($champs['fichier'] // un plugin a pu interdire la modif du fichier en virant le champ
         AND $ancien_fichier // on avait bien note le nom du fichier avant la modif
         AND $ancien_fichier!==$champs['fichier'] // et il a ete modifie
+        AND !tester_url_absolue($ancien_fichier)
         AND @file_exists($f = get_spip_doc($ancien_fichier)))
                spip_unlink($f);
 
index 61c2e83..a6f7ce3 100644 (file)
@@ -154,6 +154,7 @@ function formulaires_editer_document_traiter_dist($id_document='new', $id_parent
                else {
                        // liberer le nom de l'ancien fichier pour permettre le remplacement par un fichier du meme nom
                        if ($ancien_fichier = sql_getfetsel('fichier','spip_documents','id_document='.intval($id_document))
+                               AND !tester_url_absolue($ancien_fichier)
                                AND @file_exists($rename = get_spip_doc($ancien_fichier))){
                                @rename($rename,"$rename--.old");
 
index aa9aee1..8869e1c 100644 (file)
@@ -122,8 +122,11 @@ function formulaires_joindre_document_verifier_dist($id_document='new',$id_objet
                                        AND !_request('joindre_zip')\r
                                        AND $contenu_zip = joindre_verifier_zip($files)){\r
                                        list($fichiers,$erreurs,$tmp_zip) = $contenu_zip;\r
-                                       if ($fichiers)\r
-                                               $erreurs['lister_contenu_archive'] = recuperer_fond("formulaires/inc-lister_archive_jointe",array('chemin_zip'=>$tmp_zip,'liste_fichiers_zip'=>$fichiers,'erreurs_fichier_zip'=>$erreurs));\r
+                                       if ($fichiers){\r
+                                               // on passe le md5 du fichier uniquement, on le retrouvera dans zip_to_clean de la session\r
+                                               $token_zip = md5($tmp_zip);\r
+                                               $erreurs['lister_contenu_archive'] = recuperer_fond("formulaires/inc-lister_archive_jointe",array('chemin_zip'=>$token_zip,'liste_fichiers_zip'=>$fichiers,'erreurs_fichier_zip'=>$erreurs));\r
+                                       }\r
                                        else\r
                                                $erreurs['message_erreur'] = _T('medias:erreur_aucun_fichier'); \r
                                }\r
index 8cbbffd..3cca88c 100644 (file)
@@ -114,7 +114,13 @@ function joindre_trouver_fichier_envoye(){
                  return $files;\r
                }\r
        }\r
-       elseif (_request('joindre_zip') AND $path = _request('chemin_zip')){\r
+       elseif (_request('joindre_zip') and $token_zip = _request('chemin_zip')) {\r
+\r
+               $zip_to_clean = (isset($GLOBALS['visiteur_session']['zip_to_clean']) ? unserialize($GLOBALS['visiteur_session']['zip_to_clean']) : array());\r
+               if (!$zip_to_clean or !isset($zip_to_clean[$token_zip]) or !$path = $zip_to_clean[$token_zip]){\r
+                       return _T('avis_operation_impossible');\r
+               }\r
+\r
                include_spip('inc/documents'); //pour creer_repertoire_documents\r
                define('_tmp_zip', $path);\r
                define('_tmp_dir', creer_repertoire_documents(md5($path.$GLOBALS['visiteur_session']['id_auteur'])));\r
@@ -214,10 +220,14 @@ function joindre_verifier_zip($files){
                // Est-ce qu'on sait le lire ?\r
                include_spip('inc/pclzip');\r
                if ($zip\r
-                AND $archive = new PclZip($zip)\r
-                AND $contenu = joindre_decrire_contenu_zip($archive)\r
-                AND rename($zip, $tmp = _DIR_TMP.basename($zip))\r
-                ){\r
+                       AND $archive = new PclZip($zip)\r
+                 AND $contenu = joindre_decrire_contenu_zip($archive)\r
+                       AND $tmp = sous_repertoire(_DIR_TMP,"zip")\r
+                 AND rename($zip, $tmp = $tmp.basename($zip))\r
+                 ){\r
+                       $zip_to_clean = (isset($GLOBALS['visiteur_session']['zip_to_clean'])?unserialize($GLOBALS['visiteur_session']['zip_to_clean']):array());\r
+                       $zip_to_clean[md5($tmp)] = $tmp;\r
+                       session_set('zip_to_clean',serialize($zip_to_clean));\r
                        $contenu[] = $tmp;\r
                        return $contenu;\r
                 }\r
index a327514..586dbc3 100644 (file)
 
 if (!defined('_ECRIRE_INC_VERSION')) return;
 
+// nettoyer les zip abandonnes par l'utilisateur
+if (isset($GLOBALS['visiteur_session']['zip_to_clean'])
+  AND test_espace_prive()
+  AND $_SERVER['REQUEST_METHOD']!=='POST'){
+       $zip_to_clean = unserialize($GLOBALS['visiteur_session']['zip_to_clean']);
+       if ($zip_to_clean){
+               foreach ($zip_to_clean as $zip){
+                       if (@file_exists($zip))
+                               @unlink($zip);
+               }
+       }
+       session_set('zip_to_clean');
+}
 
 /**
  * Afficher la puce de statut pour les documents
index 5f1523f..1a2846e 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="medias"
        categorie="multimedia"
-       version="2.7.66"
+       version="2.7.70"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/portfolio-32.png"
index 5d710ae..528938d 100644 (file)
@@ -29,4 +29,5 @@ jQuery(function(){
                onAjaxLoad(reload_chemin);
 });
 </script>
-#PIPELINE{afficher_contenu_objet,#ARRAY{args,#ARRAY{type,document,id_objet,#ID_DOCUMENT},data,''}}
\ No newline at end of file
+<!--affiche_milieu-->
+#PIPELINE{afficher_contenu_objet,#ARRAY{args,#ARRAY{type,document,id_objet,#ID_DOCUMENT},data,''}}
index f7bbc63..e84886f 100644 (file)
@@ -73,8 +73,13 @@ function analyser_backend($rss, $url_syndic='') {
 
        if (!count($items)) return _T('sites:avis_echec_syndication_01');
 
+       if (!defined('_SYNDICATION_MAX_ITEMS')) define('_SYNDICATION_MAX_ITEMS',1000);
+       $nb_items = 0;
        foreach ($items as $item) {
                $data = array();
+               if ($nb_items++>_SYNDICATION_MAX_ITEMS){
+                       break;
+               }
 
                // URL (semi-obligatoire, sert de cle)
 
@@ -451,9 +456,14 @@ function cdata_echappe(&$rss, &$echappe_cdata) {
        if (preg_match_all(',<!\[CDATA\[(.*)]]>,Uims', $rss,
        $regs, PREG_SET_ORDER)) {
                foreach ($regs as $n => $reg) {
-                       if (preg_match(',[<>],', $reg[1])) {
-                               $echappe_cdata[$n] = $reg[1];
-                               $rss = str_replace($reg[0], "@@@SPIP_CDATA$n@@@", $rss);
+                       if (strpos($reg[1],'<')!==false
+                         or strpos($reg[1],'>')!==false) {
+                               // verifier que la chaine est encore dans le flux, car on peut avoir X fois la meme
+                               // inutile de (sur)peupler le tableau avec des substitutions identiques
+                               if (strpos($rss,$reg[0])!==false){
+                                       $echappe_cdata["@@@SPIP_CDATA$n@@@"] = $reg[1];
+                                       $rss = str_replace($reg[0], "@@@SPIP_CDATA$n@@@", $rss);
+                               }
                        } else
                                $rss = str_replace($reg[0], $reg[1], $rss);
                }
@@ -464,11 +474,11 @@ function cdata_echappe(&$rss, &$echappe_cdata) {
 // http://code.spip.net/@cdata_echappe_retour
 function cdata_echappe_retour(&$x, &$echappe_cdata) {
        if (is_string($x)) {
-               if (strpos($x, '@@@SPIP_CDATA') !== false
-               OR strpos($x, '&lt;') !== false) {
+               if (strpos($x, '&lt;') !== false){
                        $x = filtrer_entites($x);
-                       foreach ($echappe_cdata as $n => $e)
-                               $x = str_replace("@@@SPIP_CDATA$n@@@", $e, $x);
+               }
+               if (strpos($x, '@@@SPIP_CDATA') !== false){
+                       $x = str_replace( array_keys($echappe_cdata), array_values($echappe_cdata), $x);
                }
        }
 
index c34ec28..e797ba4 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="sites"
        categorie="edition"
-       version="1.7.19"
+       version="1.7.20"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/site-32.png"
index 321f2fc..5e1b343 100644 (file)
@@ -98,7 +98,7 @@ function formulaires_editer_auteur_verifier_dist($id_auteur='new', $retour='', $
                }
        }
 
-       if (preg_match(",^\s*javascript,i", _request('url_site'))) {
+       if ($url = _request('url_site') and !tester_url_absolue($url)) {
                $erreurs['url_site'] = _T('info_url_site_pas_conforme');
        }
 
index 4e8d250..33ebde8 100644 (file)
@@ -70,7 +70,7 @@ h3.titrem {position:relative;}
 
 .formulaire_spip li label,
 .formulaire_spip li.gauche label {
-       color: #4444;
+       color: #444;
        width: 114px;
        float:#ENV{left};
        margin-#ENV{left}:-130px;
index 32ec208..7a9fe30 100644 (file)
@@ -28,10 +28,12 @@ function message_oubli($email, $param)
                include_spip('action/inscrire_auteur');
                $cookie = auteur_attribuer_jeton($r[1]['id_auteur']);
 
+               // l'url_reset doit etre une URL de confiance, on force donc un url_absolue sur adresse_site
+               include_spip('inc/filtres');
                $msg = recuperer_fond(
                        "modeles/mail_oubli",
                        array(
-                               'url_reset'=>generer_url_public('spip_pass',"$param=$cookie", true, false)
+                               'url_reset' => url_absolue(generer_url_public('spip_pass', "$param=$cookie"),$GLOBALS['meta']['adresse_site'])
                        )
                );
                include_spip("inc/notifications");
index 6339881..f7dc407 100644 (file)
@@ -1,7 +1,7 @@
 <BOUCLE_un_article(ARTICLES){id_article}>
        <item[ xml:lang="(#LANG)"]>
                <title>[(#TITRE|supprimer_tags|texte_backend)]</title>
-               <link>[(#URL_ARTICLE|url_absolue|texte_backend)]</link>
+               <link>[(#URL_ARTICLE|url_absolue)]</link>
                [<guid isPermaLink="true">(#URL_ARTICLE|url_absolue|texte_backend)</guid>]
                [<dc:date>(#DATE|date_iso)</dc:date>]
                <dc:format>text/html</dc:format>
        sous forme de "microformats"
 
 ]<BOUCLE_rubrique_mf(RUBRIQUES){id_rubrique}>-
-[&lt;a href="[(#URL_RUBRIQUE|url_absolue|texte_backend)]" rel="directory"&gt;(#TITRE|supprimer_tags|texte_backend)&lt;/a&gt;]
+[&lt;a href="[(#URL_RUBRIQUE|url_absolue)]" rel="directory"&gt;(#TITRE|supprimer_tags|texte_backend)&lt;/a&gt;]
 </BOUCLE_rubrique_mf><B_mots_mf>
 / <BOUCLE_mots_mf(MOTS){id_article}{", "}>
-[&lt;a href="[(#URL_MOT|url_absolue|texte_backend)]" rel="tag"&gt;(#TITRE|texte_backend)&lt;/a&gt;]</BOUCLE_mots_mf>
+[&lt;a href="[(#URL_MOT|url_absolue)]" rel="tag"&gt;(#TITRE|texte_backend)&lt;/a&gt;]</BOUCLE_mots_mf>
 
                </description>
 
@@ -37,7 +37,7 @@
                ][&lt;div class='rss_chapo'&gt;(#CHAPO|texte_backend)&lt;/div&gt;
                ][&lt;div class='rss_texte'&gt;(#TEXTE|
                        image_reduire{500,0}|texte_backend)&lt;/div&gt;
-               ][&lt;div class="hyperlien"&gt;<:voir_en_ligne|html2unicode:> : &lt;a href="(#URL_SITE|texte_backend)" class="spip_out"&gt;[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]}|texte_backend)]&lt;/a&gt;&lt;/div&gt;
+               ][&lt;div class="hyperlien"&gt;<:voir_en_ligne|html2unicode:> : &lt;a href="(#URL_SITE)" class="spip_out"&gt;[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]}|texte_backend)]&lt;/a&gt;&lt;/div&gt;
                ][&lt;hr /&gt;
                &lt;div class='rss_notes'&gt;(#NOTES|texte_backend)&lt;/div&gt;
                ][&lt;div class='rss_ps'&gt;(#PS|texte_backend)&lt;/div&gt;]
@@ -48,7 +48,7 @@
        Le bloc qui suit diffuse l'adresse des documents associes aux articles ;
        ajouter par ex. {extension=mp3} pour limiter a un certain type de document.
 ]              <BOUCLE_documents(DOCUMENTS){id_article}{mode=document}{doublons}>[
-               <enclosure url="(#URL_DOCUMENT|url_absolue|texte_backend|unique)"[ length="(#TAILLE)"][ type="(#MIME_TYPE)"] />]
+               <enclosure url="(#URL_DOCUMENT|url_absolue|unique)"[ length="(#TAILLE)"][ type="(#MIME_TYPE)"] />]
                </BOUCLE_documents>
 
        </item>
index dc0e7c8..83d4ee6 100644 (file)
@@ -1,10 +1,10 @@
 <svn_revision>
 <text_version>
-Origine: svn://trac.rezo.net/spip/tags/spip-3.0.22
-Revision: 22914
-Dernier commit: 2016-03-10 15:00:32 +0100 
+Origine: svn://trac.rezo.net/spip/tags/spip-3.0.24
+Revision: 23212
+Dernier commit: 2016-09-30 23:13:21 +0200 
 </text_version>
-<origine>svn://trac.rezo.net/spip/tags/spip-3.0.22</origine>
-<revision>22914</revision>
-<commit>2016-03-10 15:00:32 +0100 </commit>
+<origine>svn://trac.rezo.net/spip/tags/spip-3.0.24</origine>
+<revision>23212</revision>
+<commit>2016-09-30 23:13:21 +0200 </commit>
 </svn_revision>
\ No newline at end of file