[SPIP] ~v3.2.3-->v3.2.4
authorLudovic CHEVALIER <ludovic.chevalier@heureux-cyclage.org>
Fri, 10 May 2019 09:15:24 +0000 (11:15 +0200)
committerLudovic CHEVALIER <ludovic.chevalier@heureux-cyclage.org>
Fri, 10 May 2019 09:15:24 +0000 (11:15 +0200)
20 files changed:
www/CHANGELOG.TXT
www/config/ecran_securite.php
www/ecrire/action/editer_liens.php
www/ecrire/inc/filtres_images_lib_mini.php
www/ecrire/inc/filtres_mini.php
www/ecrire/inc/plugin.php
www/ecrire/inc/session.php
www/ecrire/inc_version.php
www/ecrire/paquet.xml
www/ecrire/plugins/installer.php
www/ecrire/req/sqlite_generique.php
www/plugins-dist/compresseur/inc/compresseur_minifier.php
www/plugins-dist/compresseur/paquet.xml
www/plugins-dist/forum/paquet.xml
www/plugins-dist/forum/prive/objets/liste/forums.html
www/plugins-dist/forum/prive/squelettes/contenu/controler_forum.html
www/plugins-dist/statistiques/engines-list.txt
www/plugins-dist/statistiques/paquet.xml
www/prive/formulaires/editer_auteur.php
www/svn.revision

index c3839e3..c5f6a04 100644 (file)
@@ -1,3 +1,36 @@
+
+SPIP-Core spip-3.2.3 -> spip-3.2.4  08 avril 2019
+-------------------------------------------------------------
+
+r24221 | Cerdic |  (mar. 12 févr. 2019) | Ecran de securite :* les id_ exceptions dans une variable et on ajoute id_parent et id_article_pdf qui posent parfois problemes* bloquer les paginations croisees dans les calendrier egalement pour les bots (sur certains squelettes genere des tonnes de requetes)* envoyer une 429 Too Many Requests plutot qu'une 503 cf https://webmasters.stackexchange.com/questions/65674/should-i-return-a-429-or-503-status-code-to-a-bot et c'est mieux pour le referencement et GoogleBot qui a tendance a penser que 503 vient d'un serveur mal gere
+r24224 | Cerdic |  (mar. 12 févr. 2019) | Retour a une liste complete de bots telle qu'elle etait sur la version non incremente de la zone, et on incremente
+r24228 | Cerdic |  (mer. 20 févr. 2019) | Fix : quand on essaye d'activer un plugin qui n'est pas compatible avec la version de SPIP, il faut remonter une erreur d'activationOn modifie pour cela les fonctions* plugin_valide_resume() pour qu'elle renvoie le prefixe du plugin accepte ou la description short du plugin refuse pour incompatibilite ou erreur* liste_plugin_valides() pour qu'elle renvoie en plus la liste des plugins invalides qu'on voulait* plugins_erreurs() pour gerer le cas xml en erreur ou incompatibilite avec la version de SPIP* plugin_message_incompatibilite() pour generer un message d'erreur approprie quand il s'agit de SPIP et pas d'un pluginAucune rupture de compat, ce ne sont que des ajouts : du code qui utilisait les anciennes signatures de fonction continue a fonctionner sans probleme(Dans l'interface on ne peut pas cocher un plugin non compatible avec la version de SPIP, mais en spip-cli on peut le faire et ca echouait silencieusement)
+r24229 | Cerdic |  (mer. 20 févr. 2019) | oups, il faut un array ici (complete aba087b3a)
+r24234 | marcimat  |  (jeu. 21 févr. 2019) | Coquille ici (déjà corrigée en dev.)
+r24235 | marcimat  |  (jeu. 21 févr. 2019) | Reports de r24105 et r24233 :- Ticket #3962 : générer des jpgs progressifs- Ticket #4177 : Lorsqu’une image est déjà présente (dans IMG/) avec une extension ne correspondant pas réellement à son contenu, la librairie GD récente de traitement d’image génère une erreur fatale.On évite ce petit souci en vérifiant le contenu de l’image (via le mime type retourné par getimagesize).
+r24237 | Cerdic |  (ven. 22 févr. 2019) | Fix la langue de mail d'envoi des identifiants : il faut prendre celle de l'auteur ou a defaut celle du site, mais pas celle de l'admin
+r24257 | Cerdic |  (mer. 13 mars 2019) | Attention au cas ou * en second argument de l'appel de la fonction objet_trouver_lien(), ce qui se produit malheureusement dans la fonction objet_dupliquer_liens()
+r24258 | Cerdic |  (mer. 13 mars 2019) | respecter les arguments  et  dans objet_dupliquer_liens(), y compris quand ca concerne un lien qui part de l'objet source
+r24271 | marcimat |  (lun. 08 avril 2019) | Report de r24140 : Ticket #4204 : Compatibilité PHP 7.3. La librairie PCRE passe en v2, et est moins tolérante.Le caractère -, indiqué dans un bloc de caractères `[ - ]`, pour ne pas être pris pour une déclaration d’intervalle (comme `[a-z]`), doit être soit échappé avec \ soit être en tête ou en fin de la structure.(Francky)
+r24275 | Cerdic |  (lun. 08 avril 2019) | utiliser var_export qui fait le job plus surement
+r24276 | Cerdic |  (lun. 08 avril 2019) | sanitizer var_memotri avant de l'utiliser (G0uz)
+r24277 | Cerdic |  (lun. 08 avril 2019) | v1.3.11 (securiser var_memotri)
+
+
+SPIP-plugins-dist spip-3.2.3 -> spip-3.2.4  08 avril 2019
+-------------------------------------------------------------
+
+r113589 | e.longuemare |  (jeu. 24 janv. 2019) | Regroupement des référants : correction pour matcher Twitter avec les urls courtes de tyoe t.co et non Qwant - report de r113588
+r113735 | cedric    |  (lun. 04 févr. 2019) | Report de r113734 : oups en voulant conserver les commentaires important commencant par un \! on avait introduit un bug sur les commentaires vides
+r113878 | cedric    |  (mar. 12 févr. 2019) | Report de r113877 : Fix https://core.spip.net/issues/4282 casse par r87494 qui avait renomme par erreur la boucle _forum en _forums (JLuc)
+r113884 | cedric    |  (mar. 12 févr. 2019) | Report de r113883 : une indirection manquante signalee dans https://core.spip.net/issues/4282 (JLuc)
+r114014 | cedric    |  (ven. 22 févr. 2019) | Report de r114013 : Envoyer des mails en from d'un inconnu c'est de l'usurpation d'identite et ca peut vous conduire au commissariat, en plus d'etre vu comme un SPAM par beaucoup de fournisseur de mail. On laisse donc le from par defaut du site, mais un mets un Reply-To a l'envoyeur et l'email de l'envoyeur suppose (mais pas verifie) en signature du message. C'est plus robuste et moins sujet a litige
+r114612 | bruno     |  (ven. 22 mars 2019) | report à l'arrache de r114572 pour sauver les stats de tonton sur plugin.spip :)
+r114613 | eric      |  (ven. 22 mars 2019) | Il manquait la mise à jour de la fonction svp_compter qui était dans un commit précédent à celui qui a été mergé.
+r114666 | bruno    |  (jeu. 28 mars 2019) | version 2.1.8 : report de r114665ne pas afficher le lien "Modifier" au survol si pas autorisé fix #4307
+
+
+
 SPIP-Core spip-3.2.2 -> spip-3.2.3  21 janvier 2019
 -------------------------------------------------------------
 Oups : problème de génération du zip 
@@ -122,4 +155,4 @@ r112456 | b_b       |  (ven. 16 nov. 2018) | version 1.8.3 : report de r112455
 r113162 | Francky   |  (dim. 30 déc. 2018) | Mise à jour de la lib getid en version 1.9.16, nous étions en 1.9.14https://github.com/JamesHeinrich/getID3/blob/master/changelog.txt
 r113165 | Francky   |  (dim. 30 déc. 2018) | Oubli de faire un z+1 pour la peine
 r113345 | Francky   |  (mer. 09 janv. 2019) | Le futur, c'est aussi maintenant ici :-)
-r113382 | Francky   |  (sam. 12 janv. 2019) | restait un bonne année à faire en spip 3.2
\ No newline at end of file
+r113382 | Francky   |  (sam. 12 janv. 2019) | restait un bonne année à faire en spip 3.2
index d33df61..d6c6cea 100644 (file)
@@ -5,7 +5,7 @@
  * ------------------
  */
 
-define('_ECRAN_SECURITE', '1.3.8'); // 2018-10-31
+define('_ECRAN_SECURITE', '1.3.11'); // 2019-04-08
 
 /*
  * Documentation : http://www.spip.net/fr_article4200.html
@@ -39,6 +39,9 @@ if (!defined('_IS_BOT')){
                        'bot',
                        'slurp',
                        'crawler',
+                       'crwlr',
+                       'java',
+                       'monitoring',
                        'spider',
                        'webvac',
                        'yandex',
@@ -49,17 +52,22 @@ if (!defined('_IS_BOT')){
                        'a6-indexer',
                        'aboundex',
                        'accoona',
+                       'acrylicapps',
                        'addthis',
                        'adressendeutschland',
                        'alexa',
                        'altavista',
                        'analyticsseo',
+                       'antennapod',
+                       'arachnys',
                        'archive',
+                       'argclrint',
                        'aspseek',
                        'baidu',
                        'begunadvertising',
-                       'bingpreview',
+                       'bing',
                        'bloglines',
+                       'buck',
                        'browsershots',
                        'bubing',
                        'butterfly',
@@ -71,9 +79,13 @@ if (!defined('_IS_BOT')){
                        'crowsnest',
                        'dataminr',
                        'daumoa',
+                       'dlvr\.it',
                        'dlweb',
+                       'drupal',
                        'ec2linkfinder',
+                       'eset\.com',
                        'estyle',
+                       'exalead',
                        'ezooms',
                        'facebookexternalhit',
                        'facebookplatform',
@@ -85,6 +97,7 @@ if (!defined('_IS_BOT')){
                        'flipboardproxy',
                        'genieo',
                        'google',
+                       'go-http-client',
                        'grapeshot',
                        'hatena-useragent',
                        'head',
@@ -95,46 +108,69 @@ if (!defined('_IS_BOT')){
                        'iltrovatore-setaccio',
                        'immediatenet',
                        'ina',
+                       'inoreader',
                        'infegyatlas',
                        'infohelfer',
                        'instapaper',
                        'jabse',
                        'james',
+                       'jersey',
                        'kumkie',
                        'linkdex',
                        'linkfluence',
                        'linkwalker',
                        'litefinder',
                        'loadimpactpageanalyzer',
+                       'ltx71',
                        'luminate',
                        'lycos',
                        'lycosa',
                        'mediapartners-google',
                        'msai',
+                       'myapp',
+                       'nativehost',
                        'najdi',
                        'netcraftsurveyagent',
                        'netestate',
                        'netseer',
+                       'netnewswire',
+                       'newspaper',
+                       'newsblur',
                        'nuhk',
+                       'nuzzel',
+                       'okhttp',
+                       'otmedia',
                        'owlin',
+                       'owncloud',
                        'panscient',
+                       'paper\.li',
                        'parsijoo',
+                       'protopage',
                        'plukkie',
                        'proximic',
+                       'pubsub',
+                       'python',
                        'qirina',
+                       'qoshe',
                        'qualidator',
+                       'qwantify',
                        'rambler',
                        'readability',
+                       'ruby',
                        'sbsearch',
+                       'scoop\.it',
                        'scooter',
+                       'scoutjet',
                        'scrapy',
                        'scrubby',
                        'scrubbybloglines',
                        'shareaholic',
                        'shopwiki',
+                       'simplepie',
                        'sistrix',
                        'sitechecker',
                        'siteexplorer',
+                       'snapshot',
                        'sogou',
                        'special_archiver',
                        'speedy',
@@ -146,24 +182,31 @@ if (!defined('_IS_BOT')){
                        'superdownloads',
                        'svenska-webbsido',
                        'teoma',
+                       'the knowledge AI',
                        'thumbshots',
                        'tineye',
+                       'traackr',
                        'trendiction',
+                       'trendsmap',
                        'tweetedtimes',
                        'tweetmeme',
+                       'universalfeedparser',
                        'uaslinkchecker',
                        'undrip',
                        'unwindfetchor',
+                       'upday',
                        'vedma',
                        'vkshare',
                        'vm',
                        'wch',
                        'webalta',
                        'webcookies',
+                       'webparser',
                        'webthumbnail',
                        'wesee',
                        'wise-guys',
                        'woko',
+                       'wordpress',
                        'wotbox',
                        'y!j-bri',
                        'y!j-bro',
@@ -172,6 +215,7 @@ if (!defined('_IS_BOT')){
                        'yahoo',
                        'yahoo!',
                        'yahooysmcm',
+                       'ymobactus',
                        'yats',
                        'yeti',
                        'zeerch'
@@ -184,7 +228,8 @@ if (!defined('_IS_BOT_FRIEND')){
                isset($_SERVER['HTTP_USER_AGENT'])
                and preg_match(',' . implode ('|', array(
                        'facebookexternalhit',
-                       'flipboardproxy'
+                       'flipboardproxy',
+                       'wordpress'
                )) . ',i',
                (string)$_SERVER['HTTP_USER_AGENT'])
        );
@@ -197,17 +242,18 @@ if (!defined('_IS_BOT_FRIEND')){
  * (sauf pour id_table, qui n'est pas numérique jusqu'à [5743])
  * (id_base est une variable de la config des widgets de WordPress)
  */
+$_exceptions = array('id_table','id_base','id_parent','id_article_pdf');
 foreach ($_GET as $var => $val)
        if ($_GET[$var] and strncmp($var, "id_", 3) == 0
-       and !in_array($var, array('id_table', 'id_base')))
+               and !in_array($var, $_exceptions))
                $_GET[$var] = is_array($_GET[$var])?@array_map('intval', $_GET[$var]):intval($_GET[$var]);
 foreach ($_POST as $var => $val)
        if ($_POST[$var] and strncmp($var, "id_", 3) == 0
-       and !in_array($var, array('id_table', 'id_base')))
+               and !in_array($var, $_exceptions))
                $_POST[$var] = is_array($_POST[$var])?@array_map('intval', $_POST[$var]):intval($_POST[$var]);
 foreach ($GLOBALS as $var => $val)
        if ($GLOBALS[$var] and strncmp($var, "id_", 3) == 0
-       and !in_array($var, array('id_table', 'id_base')))
+               and !in_array($var, $_exceptions))
                $GLOBALS[$var] = is_array($GLOBALS[$var])?@array_map('intval', $GLOBALS[$var]):intval($GLOBALS[$var]);
 
 /*
@@ -321,6 +367,8 @@ if (isset($_REQUEST['GLOBALS']))
 if (_IS_BOT and (
        (isset($_REQUEST['echelle']) and isset($_REQUEST['partie_cal']) and isset($_REQUEST['type']))
        or (strpos((string)$_SERVER['REQUEST_URI'], 'debut_') and preg_match(',[?&]debut_.*&debut_,', (string)$_SERVER['REQUEST_URI']))
+               or (isset($_REQUEST['calendrier_annee']) and strpos((string)$_SERVER['REQUEST_URI'], 'debut_') )
+               or (isset($_REQUEST['calendrier_annee']) and preg_match(',[?&]calendrier_annee=.*&calendrier_annee=,', (string)$_SERVER['REQUEST_URI']))
 )
 )
        $ecran_securite_raison = "robot agenda/double pagination";
@@ -443,7 +491,7 @@ if (isset($_SERVER['HTTP_X_FORWARDED_HOST']))
 /*
  * Réinjection des clés en html dans l'admin r19561
  */
-if (strpos($_SERVER['REQUEST_URI'], "ecrire/") !== false){
+if (strpos($_SERVER['REQUEST_URI'], "ecrire/") !== false or isset($_REQUEST['var_memotri'])){
        $zzzz = implode("", array_keys($_REQUEST));
        if (strlen($zzzz) != strcspn($zzzz, '<>"\''))
                $ecran_securite_raison = 'Cle incorrecte en $_REQUEST';
@@ -520,11 +568,12 @@ if (
        and $load > _ECRAN_SECURITE_LOAD // eviter l'evaluation suivante si de toute facon le load est inferieur a la limite
        and rand(0, $load * $load) > _ECRAN_SECURITE_LOAD * _ECRAN_SECURITE_LOAD
 ) {
-       header("HTTP/1.0 503 Service Unavailable");
+       //https://webmasters.stackexchange.com/questions/65674/should-i-return-a-429-or-503-status-code-to-a-bot
+       header("HTTP/1.0 429 Too Many Requests");
        header("Retry-After: 300");
        header("Expires: Wed, 11 Jan 1984 05:00:00 GMT");
        header("Cache-Control: no-cache, must-revalidate");
        header("Pragma: no-cache");
        header("Content-Type: text/html");
-       die("<html><title>Status 503: Site temporarily unavailable</title><body><h1>Status 503</h1><p>Site temporarily unavailable (load average $load)</p></body></html>");
+       die("<html><title>Status 429: Too Many Requests</title><body><h1>Status 429</h1><p>Too Many Requests (try again soon)</p></body></html>");
 }
index 3b33fbd..623ce8c 100644 (file)
@@ -247,7 +247,12 @@ function objet_dupliquer_liens($objet, $id_source, $id_cible, $types = null, $ex
                                foreach ($liens as $lien) {
                                        $n++;
                                        if ($infos['type'] == $objet) {
-                                               objet_associer(array($objet => $id_cible), array($lien['objet'] => $lien[$lien['objet']]), $lien);
+                                               if (
+                                                       (is_null($types) or in_array($lien['objet'], $types))
+                                                       and (is_null($exclure_types) or !in_array($lien['objet'], $exclure_types))
+                                               ) {
+                                                       objet_associer(array($objet => $id_cible), array($lien['objet'] => $lien[$lien['objet']]), $lien);
+                                               }
                                        } else {
                                                objet_associer(array($infos['type'] => $lien[$infos['type']]), array($objet => $id_cible), $lien);
                                        }
@@ -802,7 +807,7 @@ function lien_find($objet_source, $primary, $table_lien, $id, $objets, $cond = n
                // ajouter les entrees objet_source et objet cible par convenance
                foreach ($liens as $l) {
                        $l[$objet_source] = $l[$primary];
-                       $l[$objet] = $l['id_objet'];
+                       $l[$l['objet']] = $l['id_objet'];
                        $trouve[] = $l;
                }
        }
index c2c5251..d93acc1 100644 (file)
@@ -180,15 +180,11 @@ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_cr
                $fichier = $source;
        }
 
-       $terminaison = $terminaison_dest = "";
-       if (preg_match(",\.(gif|jpe?g|png)($|[?]),i", $fichier, $regs)) {
-               $terminaison = strtolower($regs[1]);
-               $terminaison_dest = $terminaison;
-
-               if ($terminaison == "gif") {
-                       $terminaison_dest = "png";
-               }
+       $terminaison_dest = "";
+       if ($terminaison = _image_trouver_extension($fichier)) {
+               $terminaison_dest = ($terminaison == 'gif') ? 'png' : $terminaison;
        }
+
        if ($forcer_format !== false) {
                $terminaison_dest = $forcer_format;
        }
@@ -197,11 +193,6 @@ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_cr
                return false;
        }
 
-       $term_fonction = $terminaison;
-       if ($term_fonction == "jpg") {
-               $term_fonction = "jpeg";
-       }
-
        $nom_fichier = substr($fichier, 0, strlen($fichier) - (strlen($terminaison) + 1));
        $fichier_dest = $nom_fichier;
        if (($find_in_path and $f = find_in_path($fichier) and $fichier = $f)
@@ -314,7 +305,7 @@ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_cr
                        "images" . _LOG_DEBUG);
        }
 
-       // TODO: si une image png est nommee .jpg, le reconnaitre avec le bon $f
+       $term_fonction = _image_trouver_extension_pertinente($fichier);
        $ret["fonction_imagecreatefrom"] = "_imagecreatefrom" . $term_fonction;
        $ret["fichier"] = $fichier;
        $ret["fonction_image"] = "_image_image" . $terminaison_dest;
@@ -357,6 +348,74 @@ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_cr
        return $ret;
 }
 
+/**
+ * Retourne la terminaison d’un fichier image
+ * @param string $path
+ * @return string
+ */
+function _image_trouver_extension($path) {
+       if (preg_match(",\.(gif|jpe?g|png)($|[?]),i", $path, $regs)) {
+               $terminaison = strtolower($regs[1]);
+               return $terminaison;
+       }
+       return '';
+}
+
+/**
+ * Tente de trouver le véritable type d’une image,
+ * même si une image est d’extension .jpg alors que son contenu est autre chose (gif ou png)
+ *
+ * @param string $path
+ * @return string Extension, dans le format attendu par les fonctions 'gd' ('jpeg' pour les .jpg par exemple)
+ */
+function _image_trouver_extension_pertinente($path) {
+       $path = supprimer_timestamp($path);
+       $terminaison = _image_trouver_extension($path);
+       if ($terminaison == 'jpg') {
+               $terminaison = 'jpeg';
+       }
+
+       if (!file_exists($path)) {
+               return $terminaison;
+       }
+
+       if (!$info = @getimagesize($path)) {
+               return $terminaison;
+       }
+
+       $mime = image_type_to_mime_type($info[2]);
+
+       switch (strtolower($mime)) {
+               case 'image/png':
+               case 'image/x-png':
+                       $_terminaison = 'png';
+                       break;
+
+               case 'image/jpg':
+               case 'image/jpeg':
+               case 'image/pjpeg':
+                       $_terminaison = 'jpeg';
+                       break;
+
+               case 'image/gif':
+                       $_terminaison = 'gif';
+                       break;
+
+               case 'image/webp':
+               case 'image/x-webp':
+                       $_terminaison = 'webp';
+                       break;
+
+               default:
+                       $_terminaison = '';
+       }
+       if ($_terminaison !== $terminaison) {
+               spip_log("Mauvaise extension du fichier : $path . Son type mime est : $mime", "images." . _LOG_INFO_IMPORTANTE);
+               $terminaison = $_terminaison;
+       }
+       return $terminaison;
+}
+
 /**
  * Crée une image depuis un fichier ou une URL
  *
@@ -517,6 +576,10 @@ function _image_imagejpg($img, $fichier, $qualite = _IMG_GD_QUALITE) {
                return false;
        }
        $tmp = $fichier . ".tmp";
+
+       // Enable interlancing
+       imageinterlace($img, true);
+
        $ret = imagejpeg($img, $tmp, $qualite);
 
        if (file_exists($tmp)) {
index fff7142..5872d59 100644 (file)
@@ -84,6 +84,7 @@ function suivre_lien($url, $lien) {
 
        # lien relatif, il faut verifier l'url de base
        # commencer par virer la chaine de get de l'url de base
+       $dir = '/';
        if (preg_match(';^((?:[a-z]{3,7}:)?//[^/]+)(/.*?/?)?([^/#?]*)([?][^#]*)?(#.*)?$;S', $url, $regs)) {
                $debut = $regs[1];
                $dir = !strlen($regs[2]) ? '/' : $regs[2];
index 3c122ff..417cb9f 100644 (file)
@@ -269,6 +269,7 @@ function liste_plugin_valides($liste_plug, $force = false) {
                )
        );
 
+       $invalides = array();
        foreach ($liste_ext as $plug) {
                if (isset($infos['_DIR_PLUGINS_DIST'][$plug])) {
                        plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_DIST');
@@ -276,7 +277,10 @@ function liste_plugin_valides($liste_plug, $force = false) {
        }
        foreach ($liste_plug as $plug) {
                if (isset($infos['_DIR_PLUGINS'][$plug])) {
-                       plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS');
+                       $r = plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS');
+                       if (is_array($r)) {
+                               $invalides = array_merge($invalides, $r);
+                       }
                }
        }
 
@@ -284,14 +288,20 @@ function liste_plugin_valides($liste_plug, $force = false) {
                $infos['_DIR_PLUGINS_SUPPL'] = $get_infos($liste_plug, false, _DIR_PLUGINS_SUPPL);
                foreach ($liste_plug as $plug) {
                        if (isset($infos['_DIR_PLUGINS_SUPPL'][$plug])) {
-                               plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_SUPPL');
+                               $r = plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_SUPPL');
+                               if (is_array($r)) {
+                                       $invalides = array_merge($invalides, $r);
+                               }
                        }
                }
        }
 
        plugin_fixer_procure($liste_non_classee, $infos);
 
-       return array($infos, $liste_non_classee);
+       // les plugins qui sont dans $liste_non_classee ne sont pas invalides (on a trouve un autre version valide)
+       $invalides = array_diff_key($invalides, $liste_non_classee);
+
+       return array($infos, $liste_non_classee, $invalides);
 }
 
 /**
@@ -306,27 +316,34 @@ function liste_plugin_valides($liste_plug, $force = false) {
  * @param string $plug
  * @param array $infos
  * @param string $dir_type
+ * @return string|array
+ *   string prefixe dans $liste si on a accepte le plugin
+ *   array description short si on ne le retient pas (pour memorisation dans une table des erreurs)
  */
 function plugin_valide_resume(&$liste, $plug, $infos, $dir_type) {
        $i = $infos[$dir_type][$plug];
+       $p = strtoupper($i['prefix']);
+       $short_desc = array(
+               'nom' => $i['nom'],
+               'etat' => $i['etat'],
+               'version' => $i['version'],
+               'dir' => $plug,
+               'dir_type' => $dir_type
+       );
        if (isset($i['erreur']) and $i['erreur']) {
-               return;
+               $short_desc['erreur'] = $i['erreur'];
+               return array($p=>$short_desc);
        }
        if (!plugin_version_compatible($i['compatibilite'], $GLOBALS['spip_version_branche'], 'spip')) {
-               return;
+               return array($p=>$short_desc);
        }
-       $p = strtoupper($i['prefix']);
        if (!isset($liste[$p])
                or spip_version_compare($i['version'], $liste[$p]['version'], '>')
        ) {
-               $liste[$p] = array(
-                       'nom' => $i['nom'],
-                       'etat' => $i['etat'],
-                       'version' => $i['version'],
-                       'dir' => $plug,
-                       'dir_type' => $dir_type
-               );
+               $liste[$p] = $short_desc;
        }
+       // ok le plugin etait deja dans la liste ou on a choisi une version plus recente
+       return $p;
 }
 
 /**
@@ -534,7 +551,13 @@ function plugins_erreurs($liste_non_classee, $liste, $infos, $msg = array()) {
 
                $plug = constant($dir_type) . $plug;
                if (!isset($msg[$p])) {
-                       if (!$msg[$p] = plugin_necessite($k['necessite'], $liste, 'necessite')) {
+                       if (isset($resume['erreur']) and $resume['erreur']) {
+                               $msg[$p] = array($resume['erreur']);
+                       }
+                       elseif (!plugin_version_compatible($k['compatibilite'], $GLOBALS['spip_version_branche'], 'spip')) {
+                               $msg[$p] = array(plugin_message_incompatibilite($k['compatibilite'], $GLOBALS['spip_version_branche'], 'SPIP', 'necessite'));
+                       }
+                       elseif (!$msg[$p] = plugin_necessite($k['necessite'], $liste, 'necessite')) {
                                $msg[$p] = plugin_necessite($k['utilise'], $liste, 'utilise');
                        }
                } else {
@@ -663,7 +686,9 @@ function plugin_message_incompatibilite($intervalle, $version, $nom, $balise) {
        // prendre en compte les erreurs de dépendances à PHP
        // ou à une extension PHP avec des messages d'erreurs dédiés.
        $type = 'plugin';
-       if ($nom === 'PHP') {
+       if ($nom === 'SPIP') {
+               $type = 'spip';
+       } elseif ($nom === 'PHP') {
                $type = 'php';
        } elseif (strncmp($nom, 'PHP:', 4) === 0) {
                $type = 'extension_php';
@@ -807,11 +832,11 @@ function ecrire_plugin_actifs($plugin, $pipe_recherche = false, $operation = 'ra
        // pour ne pas rater l'ajout ou la suppression d'un fichier fonctions/options/administrations
        // pourra etre evite quand on ne supportera plus les plugin.xml
        // en deplacant la detection de ces fichiers dans la compilation ci dessous
-       list($infos, $liste) = liste_plugin_valides($plugin, true);
+       list($infos, $liste, $invalides) = liste_plugin_valides($plugin, true);
        // trouver l'ordre d'activation
        list($plugin_valides, $ordre, $reste) = plugin_trier($infos, $liste);
-       if ($reste) {
-               plugins_erreurs($reste, $liste, $infos);
+       if ($invalides or $reste) {
+               plugins_erreurs(array_merge($invalides, $reste), $liste, $infos);
        }
 
        // Ignorer les plugins necessitant une lib absente
index d637db2..0ad5c9e 100644 (file)
@@ -624,7 +624,7 @@ function ecrire_fichier_session($fichier, $auteur) {
        // enregistrer les autres donnees du visiteur
        $texte = "<" . "?php\n";
        foreach ($auteur as $var => $val) {
-               $texte .= '$GLOBALS[\'visiteur_session\'][\'' . $var . '\'] = '
+               $texte .= '$GLOBALS[\'visiteur_session\'][' . var_export($var, true) . '] = '
                        . var_export($val, true) . ";\n";
        }
        $texte .= "?" . ">\n";
index 16a2497..f6de654 100644 (file)
@@ -372,7 +372,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.2.3";
+$spip_version_branche = "3.2.4";
 // cette version dev accepte tous les plugins compatible avec la version ci-dessous
 // a supprimer en phase beta/rc/release
 #define('_DEV_VERSION_SPIP_COMPAT',"3.1.3");
@@ -499,7 +499,10 @@ if (isset($_REQUEST['var_memotri'])
        if (!function_exists('session_set')) {
                include_spip('inc/session');
        }
-       session_set($t, _request($t));
+       $t = preg_replace(",\W,","_", $t);
+       if ($v = _request($t)) {
+               session_set($t, $v);
+       }
 }
 
 /**
index c9bfbca..1df17ef 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="spip"
        categorie="outil"
-       version="3.2.3"
+       version="3.2.4"
        etat="stable"
        compatibilite="];["
        schema="23375"
index 9c4be41..2bcf2f6 100644 (file)
@@ -164,8 +164,8 @@ function spip_plugin_install($action, $infos, $version_cible) {
  *    Avec operateur : bool.
  **/
 function spip_version_compare($v1, $v2, $op = null) {
-       $v1 = strtolower(preg_replace(',([0-9])[\s-.]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v1));
-       $v2 = strtolower(preg_replace(',([0-9])[\s-.]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v2));
+       $v1 = strtolower(preg_replace(',([0-9])[\s.-]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v1));
+       $v2 = strtolower(preg_replace(',([0-9])[\s.-]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v2));
        $v1 = str_replace('rc', 'RC', $v1); // certaines versions de PHP ne comprennent RC qu'en majuscule
        $v2 = str_replace('rc', 'RC', $v2); // certaines versions de PHP ne comprennent RC qu'en majuscule
 
index 47a861c..7f9e2a0 100644 (file)
@@ -2674,7 +2674,7 @@ function _sqlite_requete_create(
                        $ifnotexists = ' IF NOT EXISTS';
                } else {
                        /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
-                       $a = spip_sqlite_showtable($table, $serveur);
+                       $a = spip_sqlite_showtable($nom, $serveur);
                        if (isset($a['key']['KEY ' . $nom])) {
                                return true;
                        }
index aaf35c1..568540b 100644 (file)
@@ -64,7 +64,7 @@ function minifier_css($contenu, $options = '') {
                // nettoyer la css de tout ce qui sert pas
                // pas de commentaires
                // https://core.spip.net/issues/3987 sauf les commentaires important commençant par un ! qui sont en general des credits
-               $contenu = preg_replace(",/\*[^!].*\*/,Ums", "", $contenu);
+               $contenu = preg_replace(",/\*(\*|[^!].*\*)/,Ums", "", $contenu);
                $contenu = preg_replace(",\s//[^\n]*\n,Ums", "", $contenu);
                // espaces autour des retour lignes
                $contenu = str_replace("\r\n", "\n", $contenu);
index 4bedc0f..ae94115 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="compresseur"
        categorie="performance"
-       version="1.12.7"
+       version="1.12.8"
        etat="stable"
        compatibilite="[3.2.0;3.2.*]"
        logo="images/compresseur-32.png"
index 0f8ee4d..ebc962d 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="forum"
        categorie="communication"
-       version="1.11.5"
+       version="1.11.7"
        etat="stable"
        compatibilite="[3.2.0;3.2.*]"
        logo="prive/themes/spip/images/forum-32.png"
index 967e13b..7ec759f 100644 (file)
@@ -30,7 +30,7 @@
                                                        href='[(#ID_AUTEUR|generer_url_entite{auteur})]'>#MODELE{auteur_nom,id_auteur}</a>][(#ID_AUTEUR|non)#AUTEUR]</td>
                        <td class='date secondaire'>[(#DATE_HEURE|affdate_jourcourt)]</td>
                        <td class='id'>[(#AUTORISER{modererforum,#OBJET,#ID_OBJET}|?{
-                               <a href="[(#URL_ECRIRE{controler_forum,debut_forum=#ID_FORUM})]">#ID_FORUM</a>,
+                               <a href="[(#URL_ECRIRE{controler_forum,debut_forum=@#ID_FORUM})]">#ID_FORUM</a>,
                                #ID_FORUM
                        })]</td>
                </tr>
index d4ac3d4..91c8926 100644 (file)
        #FORMULAIRE_RECHERCHE_ECRIRE{#GET{self},ajax}
        [<h2><:resultats_recherche:> &#171;&nbsp;(#ENV{recherche})&nbsp;&#187;</h2>]
 
-<B_forums>
+<B_forum>
        <h3>[(#GRAND_TOTAL|singulier_ou_pluriel{forum:info_1_message_forum,forum:info_nb_messages_forum}|sinon{<:forum:aucun_message_forum:>})]</h3>
        <div class="clear"></div>
 
        [<p class='pagination'>(#PAGINATION{prive})</p>]
        <ul class='liste-items forums'>
-               <BOUCLE_forums(FORUMS){id_forum?}{id_thread?}{id_objet?}{id_secteur?}{objet?}{id_auteur?}{auteur?}{email_auteur?}{ip?}{!par id_forum}{pagination #ENV{nb,10}}{statut?}{statut LIKE #GET{prive}}{statut !LIKE #GET{public}}{texte LIKE #GET{vide}}{recherche?}>
+               <BOUCLE_forum(FORUMS){id_forum?}{id_thread?}{id_objet?}{id_secteur?}{objet?}{id_auteur?}{auteur?}{email_auteur?}{ip?}{!par id_forum}{pagination #ENV{nb,10}}{statut?}{statut LIKE #GET{prive}}{statut !LIKE #GET{public}}{texte LIKE #GET{vide}}{recherche?}>
                        <li class="item forum[ (#EXPOSE)] statut_#STATUT[ (#COMPTEUR_BOUCLE|alterner{'','odd'})]" id='forum#ID_FORUM' data-id='#ID_FORUM'
                                                        onclick="jQuery(this).toggleClass('hover');">
                        [(#INCLURE{fond=prive/modeles/forum, id_forum, self})]
                        </li>
-               </BOUCLE_forums>
+               </BOUCLE_forum>
        </ul>
        [<p class='pagination'>(#PAGINATION{prive})</p>]
-</B_forums>
+</B_forum>
 
        <h3><:forum:aucun_message_forum:></h3>
 
-<//B_forums>
+<//B_forum>
index 85254ae..dd4487f 100644 (file)
@@ -40,7 +40,7 @@ facebook\.com
 
 [Twitter]
 rien=
-t\.co
+^t\.co
 twitter\.com
 
 [Mastodon]
index 18da9b3..92070fd 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="stats"
        categorie="statistique"
-       version="1.1.10"
+       version="1.1.11"
        etat="stable"
        compatibilite="[3.2.0;3.2.*]"
        logo="prive/themes/spip/images/statistique-32.png"
@@ -32,4 +32,4 @@
        <onglet nom="stats_referers" titre="statistiques:titre_liens_entrants" parent="statistiques" icone="images/referers-24.png" action="stats_referers" />
        <onglet nom="stats_repartition" titre="statistiques:icone_repartition_visites" parent="statistiques" icone="images/repartition-24.png" action="stats_repartition" />
        <onglet nom="stats_lang" titre="statistiques:onglet_repartition_lang" parent="statistiques" icone="images/langue-24.png" action="stats_lang" />
-</paquet>
\ No newline at end of file
+</paquet>
index 4101f0a..bd4efd2 100644 (file)
@@ -434,9 +434,21 @@ function auteur_regenerer_identifiants($id_auteur, $notifier=true, $contexte = a
                        );
                        // on merge avec les champs fournit en appel, qui sont passes au modele de notification donc
                        $contexte = array_merge($contexte, $c);
+                       // si pas de langue explicitement demandee, prendre celle de l'auteur si on la connait, ou a defaut celle du site
+                       // plutot que celle de l'admin qui vient de cliquer sur le bouton
+                       if (!isset($contexte['lang']) or !$contexte['lang']) {
+                               if (isset($row['lang']) and $row['lang']) {
+                                       $contexte['lang'] = $row['lang'];
+                               }
+                               else {
+                                       $contexte['lang'] = $GLOBALS['meta']['langue_site'];
+                               }
+                       }
+                       lang_select($contexte['lang']);
                        $message = recuperer_fond($fond, $contexte);
                        include_spip("inc/notifications");
                        notifications_envoyer_mails($row['email'],$message);
+                       lang_select();
 
                        return $row['email'];
                }
@@ -446,4 +458,4 @@ function auteur_regenerer_identifiants($id_auteur, $notifier=true, $contexte = a
        }
 
        return '';
-}
\ No newline at end of file
+}
index 63358a1..87e6d25 100644 (file)
@@ -1,10 +1,10 @@
 <svn_revision>
 <text_version>
-Origine: svn://trac.rezo.net/spip/tags/spip-3.2.3
-Revision: 24211
-Dernier commit: 2019-01-21 15:10:02 +0100 
+Origine: svn://trac.rezo.net/spip/tags/spip-3.2.4
+Revision: 24285
+Dernier commit: 2019-04-08 14:28:14 +0200 
 </text_version>
-<origine>svn://trac.rezo.net/spip/tags/spip-3.2.3</origine>
-<revision>24211</revision>
-<commit>2019-01-21 15:10:02 +0100 </commit>
+<origine>svn://trac.rezo.net/spip/tags/spip-3.2.4</origine>
+<revision>24285</revision>
+<commit>2019-04-08 14:28:14 +0200 </commit>
 </svn_revision>
\ No newline at end of file