From: Ludovic CHEVALIER Date: Tue, 18 Oct 2016 07:51:47 +0000 (+0200) Subject: [SPIP] v3.0.22-->v3.0.24 X-Git-Tag: v3.3.0~83 X-Git-Url: http://git.cyclocoop.org/?p=lhc%2Fweb%2Fwww.git;a=commitdiff_plain;h=0ba825df2a03dc7a895ddf43aecb2f47bcd9da4d [SPIP] v3.0.22-->v3.0.24 --- diff --git a/www/CHANGELOG.txt b/www/CHANGELOG.txt index 21cb3c4f..3d94700d 100644 --- a/www/CHANGELOG.txt +++ b/www/CHANGELOG.txt @@ -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 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 ------------------------------------------------------------- diff --git a/www/config/ecran_securite.php b/www/config/ecran_securite.php index 0bd8e65f..826d3c31 100644 --- a/www/config/ecran_securite.php +++ b/www/config/ecran_securite.php @@ -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 */ diff --git a/www/ecrire/action/inscrire_auteur.php b/www/ecrire/action/inscrire_auteur.php index afaba99f..ed1f9598 100644 --- a/www/ecrire/action/inscrire_auteur.php +++ b/www/ecrire/action/inscrire_auteur.php @@ -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 +} diff --git a/www/ecrire/action/instituer_langue_objet.php b/www/ecrire/action/instituer_langue_objet.php index e7ad0a6b..4b497512 100644 --- a/www/ecrire/action/instituer_langue_objet.php +++ b/www/ecrire/action/instituer_langue_objet.php @@ -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; diff --git a/www/ecrire/exec/valider_xml.php b/www/ecrire/exec/valider_xml.php index 621ae262..b6a8fbef 100644 --- a/www/ecrire/exec/valider_xml.php +++ b/www/ecrire/exec/valider_xml.php @@ -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 = '

' . _T('spip_conforme_dtd') . '

'; + $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 = '

' . _T('spip_conforme_dtd') . '

'; + } + $res = + "
" . $err . "
" . + "
" . $texte . '
'; + $bandeau = "".$url_aff.""; } - $res = - "
" . $err . "
" . - "
" . $texte . '
'; - $bandeau = "$url"; } } @@ -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('', "$jq", $debut); - $onfocus = ''; - $onfocus = generer_form_ecrire('valider_xml', $onfocus, " method='get'"); + include_spip('inc/securiser_action'); + $token = calculer_cle_action("valider_xml"); + $texte = ''; + $texte .= ''; + $texte .= ''; + $texte .= ''; + $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 = "$self"; - echo "

", $titre, '
', $bandeau, '

', - "
", $onfocus, "
", + echo "

", $titre, " $bandeau", '

', + "
", $texte, "
", $res, + "

$self

", 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 .= "" . "$nb" . "$texte" diff --git a/www/ecrire/inc/auth.php b/www/ecrire/inc/auth.php index 4f59f2d7..c4b6f205 100644 --- a/www/ecrire/inc/auth.php +++ b/www/ecrire/inc/auth.php @@ -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; } /** diff --git a/www/ecrire/inc/distant.php b/www/ecrire/inc/distant.php index 5b94a060..a5fd6c6e 100644 --- a/www/ecrire/inc/distant.php +++ b/www/ecrire/inc/distant.php @@ -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)){ diff --git a/www/ecrire/inc/filtres.php b/www/ecrire/inc/filtres.php index 5223d098..4568351f 100644 --- a/www/ecrire/inc/filtres.php +++ b/www/ecrire/inc/filtres.php @@ -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 "
\n$emboite
\n"; } diff --git a/www/ecrire/inc/lang.php b/www/ecrire/inc/lang.php index edf2247f..208338af 100644 --- a/www/ecrire/inc/lang.php +++ b/www/ecrire/inc/lang.php @@ -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); } } diff --git a/www/ecrire/inc/minipres.php b/www/ecrire/inc/minipres.php index 73629b84..63249d5b 100644 --- a/www/ecrire/inc/minipres.php +++ b/www/ecrire/inc/minipres.php @@ -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') ); diff --git a/www/ecrire/inc/modifier.php b/www/ecrire/inc/modifier.php index f8153690..872a4779 100644 --- a/www/ecrire/inc/modifier.php +++ b/www/ecrire/inc/modifier.php @@ -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 diff --git a/www/ecrire/inc/pipelines.php b/www/ecrire/inc/pipelines.php index c2045597..1b3a83a5 100644 --- a/www/ecrire/inc/pipelines.php +++ b/www/ecrire/inc/pipelines.php @@ -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); } diff --git a/www/ecrire/inc/rechercher.php b/www/ecrire/inc/rechercher.php index 3e361054..f5ecc4b9 100644 --- a/www/ecrire/inc/rechercher.php +++ b/www/ecrire/inc/rechercher.php @@ -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']; diff --git a/www/ecrire/inc/traduire.php b/www/ecrire/inc/traduire.php index 57cbe333..861bce1a 100644 --- a/www/ecrire/inc/traduire.php +++ b/www/ecrire/inc/traduire.php @@ -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 : ''); } } diff --git a/www/ecrire/inc/utils.php b/www/ecrire/inc/utils.php index 01ed0c14..80ff11d2 100644 --- a/www/ecrire/inc/utils.php +++ b/www/ecrire/inc/utils.php @@ -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'=> ''.spip_htmlentities($d).''))); + _T('fichier_introuvable', array('fichier'=> ''.spip_htmlentities($d).'')), + 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); diff --git a/www/ecrire/inc_version.php b/www/ecrire/inc_version.php index d491833f..9d44b13d 100644 --- a/www/ecrire/inc_version.php +++ b/www/ecrire/inc_version.php @@ -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; diff --git a/www/ecrire/index.php b/www/ecrire/index.php index bdddab24..d3c650a4 100644 --- a/www/ecrire/index.php +++ b/www/ecrire/index.php @@ -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 diff --git a/www/ecrire/paquet.xml b/www/ecrire/paquet.xml index 87f5e339..52a21391 100644 --- a/www/ecrire/paquet.xml +++ b/www/ecrire/paquet.xml @@ -1,14 +1,14 @@ +> SPIP @@ -49,6 +49,7 @@ + diff --git a/www/ecrire/public/aiguiller.php b/www/ecrire/public/aiguiller.php index 8b3bc506..d34c6867 100644 --- a/www/ecrire/public/aiguiller.php +++ b/www/ecrire/public/aiguiller.php @@ -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']."/"; diff --git a/www/ecrire/public/compiler.php b/www/ecrire/public/compiler.php index 576545bd..362000af 100644 --- a/www/ecrire/public/compiler.php +++ b/www/ecrire/public/compiler.php @@ -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)"; diff --git a/www/ecrire/public/parametrer.php b/www/ecrire/public/parametrer.php index 07a69cb5..fe609410 100644 --- a/www/ecrire/public/parametrer.php +++ b/www/ecrire/public/parametrer.php @@ -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) diff --git a/www/ecrire/req/mysql.php b/www/ecrire/req/mysql.php index 736108e8..89d66fae 100644 --- a/www/ecrire/req/mysql.php +++ b/www/ecrire/req/mysql.php @@ -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); diff --git a/www/plugins-dist/forum/formulaires/inc-forum_previsu.html b/www/plugins-dist/forum/formulaires/inc-forum_previsu.html index df1572e6..8f487440 100644 --- a/www/plugins-dist/forum/formulaires/inc-forum_previsu.html +++ b/www/plugins-dist/forum/formulaires/inc-forum_previsu.html @@ -27,7 +27,11 @@
\ No newline at end of file diff --git a/www/plugins-dist/forum/inc/email_notification_forum.php b/www/plugins-dist/forum/inc/email_notification_forum.php index 6794c011..d5253aa9 100644 --- a/www/plugins-dist/forum/inc/email_notification_forum.php +++ b/www/plugins-dist/forum/inc/email_notification_forum.php @@ -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 .... { diff --git a/www/plugins-dist/forum/paquet.xml b/www/plugins-dist/forum/paquet.xml index 0a43aa0d..796c750d 100644 --- a/www/plugins-dist/forum/paquet.xml +++ b/www/plugins-dist/forum/paquet.xml @@ -1,7 +1,7 @@ $source)); + } include_spip('inc/distant'); if (is_array($a = renseigner_source_distante($source))) { diff --git a/www/plugins-dist/medias/action/copier_local.php b/www/plugins-dist/medias/action/copier_local.php index dd82788f..b1bf543b 100644 --- a/www/plugins-dist/medias/action/copier_local.php +++ b/www/plugins-dist/medias/action/copier_local.php @@ -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)); } diff --git a/www/plugins-dist/medias/action/editer_document.php b/www/plugins-dist/medias/action/editer_document.php index a83b355d..6ed20fa0 100644 --- a/www/plugins-dist/medias/action/editer_document.php +++ b/www/plugins-dist/medias/action/editer_document.php @@ -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); diff --git a/www/plugins-dist/medias/formulaires/editer_document.php b/www/plugins-dist/medias/formulaires/editer_document.php index 61c2e839..a6f7ce35 100644 --- a/www/plugins-dist/medias/formulaires/editer_document.php +++ b/www/plugins-dist/medias/formulaires/editer_document.php @@ -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"); diff --git a/www/plugins-dist/medias/formulaires/joindre_document.php b/www/plugins-dist/medias/formulaires/joindre_document.php index aa9aee11..8869e1c7 100644 --- a/www/plugins-dist/medias/formulaires/joindre_document.php +++ b/www/plugins-dist/medias/formulaires/joindre_document.php @@ -122,8 +122,11 @@ function formulaires_joindre_document_verifier_dist($id_document='new',$id_objet AND !_request('joindre_zip') AND $contenu_zip = joindre_verifier_zip($files)){ list($fichiers,$erreurs,$tmp_zip) = $contenu_zip; - if ($fichiers) - $erreurs['lister_contenu_archive'] = recuperer_fond("formulaires/inc-lister_archive_jointe",array('chemin_zip'=>$tmp_zip,'liste_fichiers_zip'=>$fichiers,'erreurs_fichier_zip'=>$erreurs)); + if ($fichiers){ + // on passe le md5 du fichier uniquement, on le retrouvera dans zip_to_clean de la session + $token_zip = md5($tmp_zip); + $erreurs['lister_contenu_archive'] = recuperer_fond("formulaires/inc-lister_archive_jointe",array('chemin_zip'=>$token_zip,'liste_fichiers_zip'=>$fichiers,'erreurs_fichier_zip'=>$erreurs)); + } else $erreurs['message_erreur'] = _T('medias:erreur_aucun_fichier'); } diff --git a/www/plugins-dist/medias/inc/joindre_document.php b/www/plugins-dist/medias/inc/joindre_document.php index 8cbbffd0..3cca88ca 100644 --- a/www/plugins-dist/medias/inc/joindre_document.php +++ b/www/plugins-dist/medias/inc/joindre_document.php @@ -114,7 +114,13 @@ function joindre_trouver_fichier_envoye(){ return $files; } } - elseif (_request('joindre_zip') AND $path = _request('chemin_zip')){ + elseif (_request('joindre_zip') and $token_zip = _request('chemin_zip')) { + + $zip_to_clean = (isset($GLOBALS['visiteur_session']['zip_to_clean']) ? unserialize($GLOBALS['visiteur_session']['zip_to_clean']) : array()); + if (!$zip_to_clean or !isset($zip_to_clean[$token_zip]) or !$path = $zip_to_clean[$token_zip]){ + return _T('avis_operation_impossible'); + } + include_spip('inc/documents'); //pour creer_repertoire_documents define('_tmp_zip', $path); define('_tmp_dir', creer_repertoire_documents(md5($path.$GLOBALS['visiteur_session']['id_auteur']))); @@ -214,10 +220,14 @@ function joindre_verifier_zip($files){ // Est-ce qu'on sait le lire ? include_spip('inc/pclzip'); if ($zip - AND $archive = new PclZip($zip) - AND $contenu = joindre_decrire_contenu_zip($archive) - AND rename($zip, $tmp = _DIR_TMP.basename($zip)) - ){ + AND $archive = new PclZip($zip) + AND $contenu = joindre_decrire_contenu_zip($archive) + AND $tmp = sous_repertoire(_DIR_TMP,"zip") + AND rename($zip, $tmp = $tmp.basename($zip)) + ){ + $zip_to_clean = (isset($GLOBALS['visiteur_session']['zip_to_clean'])?unserialize($GLOBALS['visiteur_session']['zip_to_clean']):array()); + $zip_to_clean[md5($tmp)] = $tmp; + session_set('zip_to_clean',serialize($zip_to_clean)); $contenu[] = $tmp; return $contenu; } diff --git a/www/plugins-dist/medias/medias_fonctions.php b/www/plugins-dist/medias/medias_fonctions.php index a327514a..586dbc34 100644 --- a/www/plugins-dist/medias/medias_fonctions.php +++ b/www/plugins-dist/medias/medias_fonctions.php @@ -17,6 +17,19 @@ 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 diff --git a/www/plugins-dist/medias/paquet.xml b/www/plugins-dist/medias/paquet.xml index 5f1523fe..1a2846e8 100644 --- a/www/plugins-dist/medias/paquet.xml +++ b/www/plugins-dist/medias/paquet.xml @@ -1,7 +1,7 @@ -#PIPELINE{afficher_contenu_objet,#ARRAY{args,#ARRAY{type,document,id_objet,#ID_DOCUMENT},data,''}} \ No newline at end of file + +#PIPELINE{afficher_contenu_objet,#ARRAY{args,#ARRAY{type,document,id_objet,#ID_DOCUMENT},data,''}} diff --git a/www/plugins-dist/sites/inc/syndic.php b/www/plugins-dist/sites/inc/syndic.php index f7bbc63c..e84886fd 100644 --- a/www/plugins-dist/sites/inc/syndic.php +++ b/www/plugins-dist/sites/inc/syndic.php @@ -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(',,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, '<') !== false) { + if (strpos($x, '<') !== 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); } } diff --git a/www/plugins-dist/sites/paquet.xml b/www/plugins-dist/sites/paquet.xml index c34ec289..e797ba46 100644 --- a/www/plugins-dist/sites/paquet.xml +++ b/www/plugins-dist/sites/paquet.xml @@ -1,7 +1,7 @@ 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"); diff --git a/www/squelettes-dist/inc-rss-item.html b/www/squelettes-dist/inc-rss-item.html index 6339881b..f7dc407c 100644 --- a/www/squelettes-dist/inc-rss-item.html +++ b/www/squelettes-dist/inc-rss-item.html @@ -1,7 +1,7 @@ [(#TITRE|supprimer_tags|texte_backend)] - [(#URL_ARTICLE|url_absolue|texte_backend)] + [(#URL_ARTICLE|url_absolue)] [(#URL_ARTICLE|url_absolue|texte_backend)] [(#DATE|date_iso)] text/html @@ -21,10 +21,10 @@ sous forme de "microformats" ]- -[<a href="[(#URL_RUBRIQUE|url_absolue|texte_backend)]" rel="directory">(#TITRE|supprimer_tags|texte_backend)</a>] +[<a href="[(#URL_RUBRIQUE|url_absolue)]" rel="directory">(#TITRE|supprimer_tags|texte_backend)</a>] / -[<a href="[(#URL_MOT|url_absolue|texte_backend)]" rel="tag">(#TITRE|texte_backend)</a>] +[<a href="[(#URL_MOT|url_absolue)]" rel="tag">(#TITRE|texte_backend)</a>] @@ -37,7 +37,7 @@ ][<div class='rss_chapo'>(#CHAPO|texte_backend)</div> ][<div class='rss_texte'>(#TEXTE| image_reduire{500,0}|texte_backend)</div> - ][<div class="hyperlien"><:voir_en_ligne|html2unicode:> : <a href="(#URL_SITE|texte_backend)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]}|texte_backend)]</a></div> + ][<div class="hyperlien"><:voir_en_ligne|html2unicode:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]}|texte_backend)]</a></div> ][<hr /> <div class='rss_notes'>(#NOTES|texte_backend)</div> ][<div class='rss_ps'>(#PS|texte_backend)</div>] @@ -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. ] [ - ] + ] diff --git a/www/svn.revision b/www/svn.revision index dc0e7c85..83d4ee62 100644 --- a/www/svn.revision +++ b/www/svn.revision @@ -1,10 +1,10 @@ -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 -svn://trac.rezo.net/spip/tags/spip-3.0.22 -22914 -2016-03-10 15:00:32 +0100 +svn://trac.rezo.net/spip/tags/spip-3.0.24 +23212 +2016-09-30 23:13:21 +0200 \ No newline at end of file