diff -Nru spip-4.0.4/CHANGELOG.txt spip-4.0.7.1/CHANGELOG.txt --- spip-4.0.4/CHANGELOG.txt 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/CHANGELOG.txt 2022-05-20 16:44:42.000000000 +0100 @@ -1,3 +1,81 @@ +SPIP-Core v4.0.6 -> v4.0.7 (2022-05-20) +--------------------------------------- + +3263834e6 | marcimat | 2022-05-20 | Coding standard +24e66e71e | cedric | 2022-05-06 | Issue #5095 : Ne pas casser une meta serializee quand un utilisateur saisit un emoji dans un formulaire de configuration +ea0820f20 | bruno | 2022-05-18 | Fix #5183 éviter de générer des icones trop grandes dans la liste des articles syndiqués +a5e7bf2b3 | cedric | 2022-04-28 | Permettre de debug les erreurs sur les liens ajax : le fallback redirige vers l'URL, mais du coup on ne peut plus voir.. +1c2c59065 | cedric | 2022-04-28 | coquille sur l'option, qui est bien expires avec un s comme l'entete http qu'on envoie +1f3a1ad01 | bruno | 2022-04-20 | éviter des warnings sur exec=info en PHP 8 +d39740cec | claffont | 2022-04-20 | Suppression de l'argument `formulaire_action_sign` dans l'url ACTION Ticket #5155 +eb4170130 | cedric | 2022-04-13 | Incrementer spip_version_code pour recompiler les squelettes +1e16d6a72 | cedric | 2022-04-13 | Securiser le retour de nettoyer_titre_email quand il est utilisé dans un squelette (Louka) https://git.spip.net/spip-t.. +bf099935b | cedric | 2022-04-13 | Masquer aussi les cookies sensibles dans $_SERVER['HTTP_COOKIE'] et $_ENV['HTTP_COOKIE'] (suite de #54 et https://git... +ae3d98849 | cedric | 2022-04-13 | echapper sel_db avant de la reinserer dans une hidden (mais c'est assez theorique car si on arrive la c'est qu'on a re.. +2629de6f0 | cedric | 2022-04-13 | securiser HTTP_HOST et REQUEST_URI dans url_de_base() https://git.spip.net/spip-team/securite/issues/3728 +52d18a543 | cedric | 2022-04-13 | Reconnaitre les cookies secure *meme* si on utilise un cookie_prefix + permettre d'etendre la liste par defaut via la .. +410a57406 | cedric | 2022-04-13 | Utiliser \b plutot que \s pour etre plus robuste sur la regexp de _PROTEGE_BLOCS https://git.spip.net/spip-team/securi.. +843ed3a52 | cedric | 2022-04-13 | securiser la construction de la regexp dans parametre_url https://git.spip.net/spip-team/securite/issues/3702 +91b9a9f5e | cedric | 2022-04-13 | securiser l'affichage de erreur quand il arrive de l'url https://git.spip.net/spip-team/securite/issues/3698 +7108815fb | cedric | 2022-04-13 | Securiser l'usage des var_mode_xx dans le debuggueur https://git.spip.net/spip-team/securite/issues/3602 +707669e9d | cedric | 2022-04-13 | spip_htmlspecialchars() sur tous les affichages de variable dans le html + filtrer $adresse_ldap https://git.spip.net/.. +9828ab4ba | cedric | 2022-04-13 | ne pas accepter un test_dir avec des .. dedans lors du test des repertoires en ecriture https://git.spip.net/spip-team.. + +SPIP-plugins-dist v4.0.6 -> v4.0.7 (2022-05-20) +----------------------------------------------- + +Images | 0c33dae | eric | 2022-02-18 | Ticket #4682 Correction warning sur image_aplatir. Tester le retour de la fonction avant de l'utiliser +MediaBox | 29762b9 | cedric | 2022-04-22 | Fix #4859 : prise en charge de l'option overlayClose qui n'avait pas été implémentée au passage à lity +Mots | a04faa9 | bruno | 2022-05-18 | Fix #4797 réparer la mise à jour depuis un vieux SPIP vers la version 4 +SVP | 6752c89 | cedric | 2022-04-13 | Echapper l'url dans le html affiche https://git.spip.net/spip-team/securite/issues/3733 + + + +SPIP-Core v4.0.5 -> v4.0.6 (01 avril 2022) +------------------------------------------ + +12d62612e | bruno | 2022-03-06 | éviter que les paginations débordent sur petit écran +599a27b2e | rastapopoulos | 2022-03-06 | Fix #5076 : réparer la fonction buguée en n'utilisant jamais les clés raccourcis qui sont non fiables, mais les autres.. +688c1ec1b | cedric | 2022-03-21 | Un peu de JS pour eviter les doubles clic sur un bouton action qui lance une action longue : lorsqu'un form.bouton_act.. +0c00bd3f3 | marcimat | 2022-03-20 | Ticket #5089 : ce bout de code renvoyait toujours false étrangement en PHP <= 7.4 car le in_array() sur ob_get_status(.. +ac226860e | marcimat | 2022-03-20 | Éviter une arobase +935cab989 | marcimat | 2022-03-20 | Éviter un arobase qui cachait un warning dont on peut se passer : aucune fonction decompiler_xx n’attend 4 paramètres ! +dd82d246d | marcimat | 2022-03-20 | Phpdoc de types de retour dans cette fonction public_debusquer_dist() qui fait un peu... tout... +e34def7f1 | marcimat | 2022-03-20 | Notice php en moins +8a9b5b134 | bruno | 2022-03-10 | Réparer le critère compteur_articles_filtres & sa balise #COMPTEUR_ARTICLE +3b43cb577 | bruno | 2022-03-08 | Réparer le lien Afficher tout dans les paginations des boites de sous-rubriques +4c6577cb1 | erational | 2022-03-11 | Fix #5090 : afficher les logos auteurs et visiteurs de la même façon +95d903ac6 | bruno | 2022-03-08 | bugfix pagination des boites qui listent les sous-rubriques + +SPIP-plugins-dist v4.0.5 -> v4.0.6 (01 avril 2022) +-------------------------------------------------- + +forum | a1660e4 | jluc | 2022-03-27 | Les #NOTES doivent aussi passer par texte_backend et liens_absolus - fixes #4755 +squelettes-dist | 790c850 | bruno | 2022-03-06 | éviter que les paginations débordent sur petit écran + + +SPIP-Core v4.0.4 -> v4.0.5 (04 Mars 2022) +------------------------------------------ + +f2b7ed208 | eric | 2022-02-19 | Un return manquant et pas grand chose semblait dépeuplé depuis des lustres... +fd89189c0 | eric | 2022-02-19 | Eviter un warning en ajoutant un include manquant +dab74847d | marcimat | 2022-02-17 | Coquille dans 9f830f05724 (g0uZ). Report de 3bf1a5daf +23a6c14c0 | marcimat | 2022-02-11 | Ticket #5032 : ini_set peut être désactivé sur les hébergements web. +cdad6a93d | cedric | 2022-02-03 | Fix #5021 et #5022 : - mieux decouper les chaines y compris dans le cas des simples quote echappes par sqlite - echapp.. + + +SPIP-plugins-dist v4.0.4 -> v4.0.5 (04 Mars 2022) +-------------------------------------------------- + +compresseur | bbb1e25 | bruno | 2022-03-03 | Include manquant dans minifier() +dump | ebd158c | marcimat | 2022-02-11 | Ticket spip/spip#5032 : vérifier la présence de ini_set pour PHP 8 +medias | f1b85e3 | marcimat | 2022-02-22 | Déprécier et sécuriser l’insertion d’une galerie dans le formulaires d’ajout de document. Ce mode n’est plus utilisé d.. +mots | c793d38 | bitbucket | 2022-02-11 | un point d'interrogation pour le id_groupe qui permet d'afficher les groupes que l'on souhaite dans un formulaire d'as.. +svp | 0060015 | marcimat | 2022-02-11 | Ticket spip/spip#5032 : vérifier la présence de ini_set pour PHP 8 +squelettes-dist | 9967ec1 | marcimat | 2022-02-24 | Report de 8505e7c0ed9118ee31 qui était dans la dist, et non reporté du squelette neodist + + + SPIP-Core v4.0.3 -> v4.0.4 (02 Février 2022) --------------------------------------------- diff -Nru spip-4.0.4/debian/changelog spip-4.0.7.1/debian/changelog --- spip-4.0.4/debian/changelog 2022-02-05 13:45:17.000000000 +0000 +++ spip-4.0.7.1/debian/changelog 2022-05-31 21:58:49.000000000 +0100 @@ -1,3 +1,10 @@ +spip (4.0.7.1-0ubuntu0.1) jammy-security; urgency=medium + + * New upstream maintenance and security release, that fixes CVE-2022-26846 and + CVE-2022-26847 (LP: #1971185). + + -- Luís Infante da Câmara Tue, 31 May 2022 21:58:49 +0100 + spip (4.0.4-1) unstable; urgency=medium [ Matthieu Marcillaud ] diff -Nru spip-4.0.4/debian/source/lintian-overrides spip-4.0.7.1/debian/source/lintian-overrides --- spip-4.0.4/debian/source/lintian-overrides 2022-02-05 13:30:48.000000000 +0000 +++ spip-4.0.7.1/debian/source/lintian-overrides 2022-05-31 21:58:49.000000000 +0100 @@ -3,3 +3,16 @@ source-contains-prebuilt-javascript-object prive/javascript/login-sha-min.js source-contains-prebuilt-javascript-object plugins-dist/compresseur/lib/jQl/jQl.min.js source-contains-prebuilt-javascript-object plugins-dist/medias/javascript/mejs-init.min.js + +source-is-missing plugins-dist/compagnon/prive/javascript/jquery.twinkle.js +source-is-missing plugins-dist/medias/lib/mejs/mediaelement-and-player.js +source-is-missing plugins-dist/medias/lib/mejs/mediaelement.js +source-is-missing plugins-dist/medias/lib/mejs/renderers/dailymotion.js +source-is-missing plugins-dist/medias/lib/mejs/renderers/facebook.js +source-is-missing plugins-dist/medias/lib/mejs/renderers/soundcloud.js +source-is-missing plugins-dist/medias/lib/mejs/renderers/twitch.js +source-is-missing plugins-dist/medias/lib/mejs/renderers/vimeo.js +source-is-missing plugins-dist/plan/lib/jstree/dist/jstree.js +source-is-missing plugins-dist/statistiques/lib/d3/d3.js +source-is-missing prive/javascript/sha256.js +source-is-missing prive/lib/bootstrap/js/dropdown.js diff -Nru spip-4.0.4/ecrire/action/editer_logo.php spip-4.0.7.1/ecrire/action/editer_logo.php --- spip-4.0.4/ecrire/action/editer_logo.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/action/editer_logo.php 2022-05-20 16:44:42.000000000 +0100 @@ -182,7 +182,7 @@ $filescheck[$short] = $file; } // trouver ceux deja migres - $deja = sql_allfetsel('fichier', 'spip_documents', sql_in('fichier', array_keys($filescheck))." AND mode LIKE 'logo%'"); + $deja = sql_allfetsel('fichier', 'spip_documents', sql_in('fichier', array_keys($filescheck)) . " AND mode LIKE 'logo%'"); if (count($deja)) { $deja = array_column($deja, 'fichier'); $restant = array_diff(array_keys($filescheck), $deja); @@ -201,7 +201,7 @@ } } - spip_log("logo_migrer_en_base $objet $mode : " . count($files) ." logos restant", "maj" . _LOG_INFO_IMPORTANTE); + spip_log("logo_migrer_en_base $objet $mode : " . count($files) . ' logos restant', 'maj' . _LOG_INFO_IMPORTANTE); $deja = []; foreach ($files as $file) { diff -Nru spip-4.0.4/ecrire/balise/formulaire_.php spip-4.0.7.1/ecrire/balise/formulaire_.php --- spip-4.0.4/ecrire/balise/formulaire_.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/balise/formulaire_.php 2022-05-20 16:44:42.000000000 +0100 @@ -137,15 +137,17 @@ // sinon renvoyer un code php dynamique $p = calculer_balise_dynamique($p, $p->nom_champ, []); - if (!test_espace_prive() - and !empty($p->descr['sourcefile']) - and $f = $p->descr['sourcefile'] - and basename(dirname($f)) === 'modeles') { + if ( + !test_espace_prive() + and !empty($p->descr['sourcefile']) + and $f = $p->descr['sourcefile'] + and basename(dirname($f)) === 'modeles' + ) { // un modele est toujours inséré en texte dans son contenant // donc si on est dans le public avec un cache on va perdre le dynamisme // et on risque de mettre en cache les valeurs pre-remplies du formulaire // on injecte donc le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction - $p->code = "'<'.'?php echo (".texte_script($p->code)."); ?'.'>'"; + $p->code = "'<'.'?php echo (" . texte_script($p->code) . "); ?'.'>'"; // dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave) } return $p; @@ -263,6 +265,7 @@ // nettoyer l'url $action = parametre_url($action, 'formulaire_action', ''); $action = parametre_url($action, 'formulaire_action_args', ''); + $action = parametre_url($action, 'formulaire_action_sign', ''); } /** diff -Nru spip-4.0.4/ecrire/base/connect_sql.php spip-4.0.7.1/ecrire/base/connect_sql.php --- spip-4.0.4/ecrire/base/connect_sql.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/base/connect_sql.php 2022-05-20 16:44:42.000000000 +0100 @@ -399,14 +399,14 @@ * @param string $query * @return array */ -function query_echappe_textes($query, $uniqid=null) { +function query_echappe_textes($query, $uniqid = null) { static $codeEchappements = null; if (is_null($codeEchappements)) { if (is_null($uniqid)) { $uniqid = uniqid(); } $uniqid = substr(md5($uniqid), 0, 4); - $codeEchappements = ["\\\\" => "\x1@#{$uniqid}#@\x1", "\\'" => "\x2@#{$uniqid}#@\x2", '\\"' => "\x3@#{$uniqid}#@\x3"]; + $codeEchappements = ['\\\\' => "\x1@#{$uniqid}#@\x1", "\\'" => "\x2@#{$uniqid}#@\x2", '\\"' => "\x3@#{$uniqid}#@\x3", '%' => "\x4@#{$uniqid}#@\x4"]; } if ($query === null) { return $codeEchappements; @@ -422,38 +422,47 @@ $query_echappees = str_replace(array_keys($codeEchappements), array_values($codeEchappements), $query); if (preg_match_all("/('[^']*')|(\"[^\"]*\")/S", $query_echappees, $textes)) { - $textes = reset($textes); // indice 0 du match - switch (count($textes)) { - case 0: - $replace = []; - break; - case 1: - $replace = ['%1$s']; - break; - case 2: - $replace = ['%1$s', '%2$s']; - break; - case 3: - $replace = ['%1$s', '%2$s', '%3$s']; - break; - case 4: - $replace = ['%1$s', '%2$s', '%3$s', '%4$s']; - break; - case 5: - $replace = ['%1$s', '%2$s', '%3$s', '%4$s', '%5$s']; - break; - default: - $replace = range(1, count($textes)); - $replace = '%' . implode('$s,%', $replace) . '$s'; - $replace = explode(',', $replace); - break; + $textes = reset($textes); + + $parts = []; + $currentpos = 0; + $k = 0; + while (count($textes)) { + $part = array_shift($textes); + $nextpos = strpos($query_echappees, $part, $currentpos); + // si besoin recoller ensemble les doubles '' de sqlite (echappement des ') + while (count($textes) and substr($part, -1) === "'") { + $next = reset($textes); + if ( + strpos($next, "'") === 0 + and strpos($query_echappees, $part . $next, $currentpos) === $nextpos + ) { + $part .= array_shift($textes); + } + else { + break; + } + } + $k++; + $parts[$k] = [ + 'texte' => $part, + 'position' => $nextpos, + 'placeholder' => '%' . $k . '$s', + ]; + $currentpos = $nextpos + strlen($part); + } + + // et on replace les parts une par une en commencant par la fin + while ($k > 0) { + $query_echappees = substr_replace($query_echappees, $parts[$k]['placeholder'], $parts[$k]['position'], strlen($parts[$k]['texte'])); + $k--; } - $query_echappees = str_replace($textes, $replace, $query_echappees); + $textes = array_column($parts, 'texte'); } else { $textes = []; } - // si il reste des quotes simples ou doubles, c'est qu'on s'est emmelles les pinceaux + // si il reste des quotes simples ou doubles, c'est qu'on s'est emmelle les pinceaux // dans le doute on ne touche a rien if (strpbrk($query_echappees, "'\"") !== false) { return [$query, []]; @@ -476,7 +485,9 @@ // recuperer les codes echappements $codeEchappements = query_echappe_textes(null); - $query = sprintf($query, ...$textes); + if (!empty($textes)) { + $query = sprintf($query, ...$textes); + } $query = str_replace(array_values($codeEchappements), array_keys($codeEchappements), $query); diff -Nru spip-4.0.4/ecrire/base/upgrade.php spip-4.0.7.1/ecrire/base/upgrade.php --- spip-4.0.4/ecrire/base/upgrade.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/base/upgrade.php 2022-05-20 16:44:42.000000000 +0100 @@ -291,7 +291,9 @@ return; } include_spip('inc/minipres'); - @ini_set('zlib.output_compression', '0'); // pour permettre l'affichage au fur et a mesure + if (function_exists('ini_set')) { + @ini_set('zlib.output_compression', '0'); // pour permettre l'affichage au fur et a mesure + } $timeout = _UPGRADE_TIME_OUT * 2; $titre = _T('titre_page_upgrade'); $balise_img = charger_filtre('balise_img'); diff -Nru spip-4.0.4/ecrire/exec/admin_plugin.php spip-4.0.7.1/ecrire/exec/admin_plugin.php --- spip-4.0.4/ecrire/exec/admin_plugin.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/exec/admin_plugin.php 2022-05-20 16:44:42.000000000 +0100 @@ -117,7 +117,7 @@ // message d'erreur au retour d'une operation if ($erreur) { - echo "
$erreur
"; + echo "
" . spip_htmlspecialchars($erreur) . '
'; } if ($erreur_activation) { echo "
$erreur_activation
"; diff -Nru spip-4.0.4/ecrire/inc/charsets.php spip-4.0.7.1/ecrire/inc/charsets.php --- spip-4.0.4/ecrire/inc/charsets.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/inc/charsets.php 2022-05-20 16:44:42.000000000 +0100 @@ -1099,7 +1099,7 @@ if ($length) { return substr($c, $start, $length); } else { - substr($c, $start); + return substr($c, $start); } } diff -Nru spip-4.0.4/ecrire/inc/config.php spip-4.0.7.1/ecrire/inc/config.php --- spip-4.0.4/ecrire/inc/config.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/inc/config.php 2022-05-20 16:44:42.000000000 +0100 @@ -211,6 +211,7 @@ } } + $has_planes = false; // si on a affaire a un sous caiser // il faut ecrire au bon endroit sans perdre les autres sous casier freres if ($c = $sous_casier) { @@ -247,6 +248,26 @@ } } // dans tous les autres cas, on ecrase else { + if ( + defined('_MYSQL_NOPLANES') + and _MYSQL_NOPLANES + and !empty($GLOBALS['meta']['charset_sql_connexion']) + and $GLOBALS['meta']['charset_sql_connexion'] == 'utf8' + ) { + // detecter si la valeur qu'on veut ecrire a des planes + // @see utf8_noplanes + $serialized_store = (is_string($store) ? $store : serialize($store)); + // un preg_match rapide pour voir si ca vaut le coup de lancer utf8_noplanes + if (preg_match(',[\xF0-\xF4],ms', $serialized_store)) { + if (!function_exists('utf8_noplanes')) { + include_spip('inc/charsets'); + } + if ($serialized_store !== utf8_noplanes($serialized_store)) { + $has_planes = true; + } + } + } + $sc = $store; } @@ -269,9 +290,26 @@ // si ce n'est pas une chaine // il faut serializer if (!is_string($store)) { - $store = serialize($store); + $serialized_store = serialize($store); + ecrire_meta($casier, $serialized_store, null, $table); + // et dans ce cas il faut verifier que l'ecriture en base a bien eu lieu a l'identique si il y a des planes dans la chaine + // car sinon ca casse le serialize PHP - par exemple si on est en mysql utf8 (non mb4) + if ($has_planes) { + $check_store = sql_getfetsel('valeur', 'spip_' . $table, 'nom=' . sql_quote($casier)); + if ($check_store !== $serialized_store) { + array_walk_recursive($store, function (&$value, $key) { + if (is_string($value)) { + $value = utf8_noplanes($value); + } + }); + $serialized_store = serialize($store); + ecrire_meta($casier, $serialized_store, null, $table); + } + } + } + else { + ecrire_meta($casier, $store, null, $table); } - ecrire_meta($casier, $store, null, $table); } // verifier que lire_config($cfg)==$store ? diff -Nru spip-4.0.4/ecrire/inc/cookie.php spip-4.0.7.1/ecrire/inc/cookie.php --- spip-4.0.4/ecrire/inc/cookie.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/inc/cookie.php 2022-05-20 16:44:42.000000000 +0100 @@ -53,6 +53,9 @@ **/ function spip_setcookie($name = '', $value = '', $options = []) { static $to_secure_list = ['spip_session']; + if (defined('_COOKIE_SECURE_LIST') and is_array(_COOKIE_SECURE_LIST)) { + $to_secure_list = array_merge($to_secure_list, _COOKIE_SECURE_LIST); + } if (!is_array($options)) { // anciens paramètres : @@ -74,8 +77,6 @@ } } - $name = preg_replace('/^spip_/', $GLOBALS['cookie_prefix'] . '_', $name); - // expires if (!isset($options['expires'])) { $options['expires'] = 0; @@ -102,6 +103,11 @@ $options['samesite'] = 'Lax'; } + // in fine renommer le prefixe si besoin + if (strpos($name, 'spip_') === 0) { + $name = $GLOBALS['cookie_prefix'] . '_' . substr($name, 5); + } + #spip_log("cookie('$name', '$value', " . json_encode($options, true) . ")", "cookies"); $a = @setcookie($name, $value, $options); diff -Nru spip-4.0.4/ecrire/inc/distant.php spip-4.0.7.1/ecrire/inc/distant.php --- spip-4.0.4/ecrire/inc/distant.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/inc/distant.php 2022-05-20 16:44:42.000000000 +0100 @@ -126,8 +126,10 @@ } // si on retrouve l'extension - if (!empty($res['headers']) - and $extension = distant_trouver_extension_selon_headers($source, $res['headers'])) { + if ( + !empty($res['headers']) + and $extension = distant_trouver_extension_selon_headers($source, $res['headers']) + ) { if ($sanitizer = charger_fonction($extension, 'sanitizer', true)) { $sanitizer($localrac); } @@ -215,7 +217,7 @@ foreach ($records as $record) { // il faut que le TTL soit suffisant afin d'etre certain que le copie_locale eventuel qui suit // se fasse sur la meme IP - if ($record['ttl']<10) { + if ($record['ttl'] < 10) { $ip = false; break; } diff -Nru spip-4.0.4/ecrire/inc/documents.php spip-4.0.7.1/ecrire/inc/documents.php --- spip-4.0.4/ecrire/inc/documents.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/inc/documents.php 2022-05-20 16:44:42.000000000 +0100 @@ -141,24 +141,26 @@ $dir = creer_repertoire_documents($subdir ? $subdir : $ext); $dest = preg_replace('/<[^>]*>/', '', basename($orig)); - $dest = preg_replace('/\.([^.]+)$/','', $dest); + $dest = preg_replace('/\.([^.]+)$/', '', $dest); $dest = translitteration($dest); - $dest = preg_replace('/[^.=\w-]+/','_', $dest); + $dest = preg_replace('/[^.=\w-]+/', '_', $dest); // ne pas accepter de noms de la forme -r90.jpg qui sont reserves // pour les images transformees par rotation (action/documenter) $dest = preg_replace(',-r(90|180|270)$,', '', $dest); - while (preg_match(",\.(\w+)$,", $dest, $m)) { - if (!function_exists('verifier_upload_autorise') - or !$r = verifier_upload_autorise($dest) - or $r['autozip']) { + while (preg_match(',\.(\w+)$,', $dest, $m)) { + if ( + !function_exists('verifier_upload_autorise') + or !$r = verifier_upload_autorise($dest) + or $r['autozip'] + ) { $dest = substr($dest, 0, -strlen($m[0])) . '_' . $m[1]; break; } else { $dest = substr($dest, 0, -strlen($m[0])); - $ext = $m[1] . "." . $ext; + $ext = $m[1] . '.' . $ext; } } @@ -370,4 +372,4 @@ } return $ext; -} \ No newline at end of file +} diff -Nru spip-4.0.4/ecrire/inc/editer.php spip-4.0.7.1/ecrire/inc/editer.php --- spip-4.0.4/ecrire/inc/editer.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/inc/editer.php 2022-05-20 16:44:42.000000000 +0100 @@ -333,12 +333,12 @@ include_spip('inc/autoriser'); if (intval($id)) { if (!autoriser('modifier', $type, intval($id))) { - $valeurs['editable'] = ''; + $contexte['editable'] = ''; } } else { if (!autoriser('creer', $type, 0, null, ['id_parent' => $id_parent])) { - $valeurs['editable'] = ''; + $contexte['editable'] = ''; } } diff -Nru spip-4.0.4/ecrire/inc/filtres_ecrire.php spip-4.0.7.1/ecrire/inc/filtres_ecrire.php --- spip-4.0.4/ecrire/inc/filtres_ecrire.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/inc/filtres_ecrire.php 2022-05-20 16:44:42.000000000 +0100 @@ -598,7 +598,12 @@ asort($l); $l = array_keys($l); } else { - $l = array_column($res, $objet_source); + // Si les liens qu'on cherche sont ceux de la table de lien, l'info est dans la clé de l'objet + // Sinon c'est dans "id_objet" + $l = array_column( + $res, + $objet_source == $objet_lien ? id_table_objet($objet_source) : 'id_objet' + ); } return $l; } diff -Nru spip-4.0.4/ecrire/inc/filtres_images_lib_mini.php spip-4.0.7.1/ecrire/inc/filtres_images_lib_mini.php --- spip-4.0.4/ecrire/inc/filtres_images_lib_mini.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/inc/filtres_images_lib_mini.php 2022-05-20 16:44:42.000000000 +0100 @@ -342,8 +342,10 @@ if (!$fichier) { return ''; } - if ($extension = _image_trouver_extension($fichier) - and $sanitizer = charger_fonction($extension, 'sanitizer', true)) { + if ( + $extension = _image_trouver_extension($fichier) + and $sanitizer = charger_fonction($extension, 'sanitizer', true) + ) { $sanitizer($fichier); } } else { @@ -1871,7 +1873,6 @@ * Class phpthumb_functions */ class phpthumb_functions { - /** * Retourne la couleur d'un pixel dans une image * diff -Nru spip-4.0.4/ecrire/inc/filtres.php spip-4.0.7.1/ecrire/inc/filtres.php --- spip-4.0.4/ecrire/inc/filtres.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/inc/filtres.php 2022-05-20 16:44:42.000000000 +0100 @@ -207,7 +207,7 @@ * Masque la version de SPIP si la globale spip_header_silencieux le demande. * * @global spip_header_silencieux permet de rendre le header minimal pour raisons de securité - * + * * @param string $version * @return void */ @@ -2406,7 +2406,9 @@ . http_img_pack( 'attachment-16.png', $t, - 'title="' . attribut_html($t) . '"' + '', + $t, + ['utiliser_suffixe_size' => true] ) . '', $tag @@ -3726,9 +3728,11 @@ $img_file = ($fichier ? _DIR_RACINE . $fichier : $img_file); } - if (!$img_file + if ( + !$img_file or !file_exists($img_file) - or !$svg = file_get_contents($img_file)) { + or !$svg = file_get_contents($img_file) + ) { return ''; } } @@ -5237,7 +5241,13 @@ function filtre_nettoyer_titre_email_dist($titre) { include_spip('inc/envoyer_mail'); - return nettoyer_titre_email($titre); + $titre = nettoyer_titre_email($titre); + // on est dans un squelette : securiser le retour + if (strpos($titre, '<') !== false) { + $titre = interdire_scripts($titre); + } + + return $titre; } /** diff -Nru spip-4.0.4/ecrire/inc/invalideur.php spip-4.0.7.1/ecrire/inc/invalideur.php --- spip-4.0.4/ecrire/inc/invalideur.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/inc/invalideur.php 2022-05-20 16:44:42.000000000 +0100 @@ -145,7 +145,7 @@ // sur certains sites on veut absolument garder certains caches référencés dans un CDN // on peut donc inhiber la purge de ces répertoires pour eviter tout probleme - if (file_exists(rtrim($dir,'/') . '/inhib_purger_repertoire.txt')) { + if (file_exists(rtrim($dir, '/') . '/inhib_purger_repertoire.txt')) { return 0; } diff -Nru spip-4.0.4/ecrire/inc/livrer_fichier.php spip-4.0.7.1/ecrire/inc/livrer_fichier.php --- spip-4.0.4/ecrire/inc/livrer_fichier.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/inc/livrer_fichier.php 2022-05-20 16:44:42.000000000 +0100 @@ -42,8 +42,8 @@ 'range' => null ]; $options = array_merge($defaut, $options); - if (is_numeric($options['expire']) and $options['expire'] > 0) { - $options['expire'] = gmdate('D, d M Y H:i:s', time() + $options['expires']) . ' GMT'; + if (is_numeric($options['expires']) and $options['expires'] > 0) { + $options['expires'] = gmdate('D, d M Y H:i:s', time() + $options['expires']) . ' GMT'; } if (is_null($options) and isset($_SERVER['HTTP_RANGE'])) { diff -Nru spip-4.0.4/ecrire/inc/notifications.php spip-4.0.7.1/ecrire/inc/notifications.php --- spip-4.0.4/ecrire/inc/notifications.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/inc/notifications.php 2022-05-20 16:44:42.000000000 +0100 @@ -57,6 +57,7 @@ */ function notifications_nettoyer_emails(&$emails, $exclure = []) { // filtrer et unifier + include_spip('inc/filtres'); $emails = array_unique(array_filter(array_map('email_valide', array_map('trim', $emails)))); if ($exclure and count($exclure)) { // nettoyer les exclusions d'abord diff -Nru spip-4.0.4/ecrire/inc/presenter_enfants.php spip-4.0.7.1/ecrire/inc/presenter_enfants.php --- spip-4.0.4/ecrire/inc/presenter_enfants.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/inc/presenter_enfants.php 2022-05-20 16:44:42.000000000 +0100 @@ -46,7 +46,7 @@ 'id_parent=' . intval($collection), '', '0+titre,titre', - "$debut,$limite" + $debut == -1 ? '' : "$debut,$limite" ); while ($row = sql_fetch($result)) { $id_rubrique = $row['id_rubrique']; @@ -130,14 +130,14 @@ if ($nb > $limite) { $debut = _request('debut_rubrique' . $collection2) ? _request('debut_rubrique' . $collection2) : $debut; $pagination = chercher_filtre('pagination'); - $pagination = '

' . $pagination( + $pagination = '

'; $limite = $debut + $limite; } @@ -147,7 +147,7 @@ 'id_parent=' . intval($collection2), '', '0+titre,titre', - "$debut,$limite" + $debut == -1 ? '' : "$debut,$limite" ); while ($row = sql_fetch($result)) { @@ -204,9 +204,9 @@ if ($nb > $limite) { $debut = _request('debut_rubrique' . $id_rubrique) ? _request('debut_rubrique' . $id_rubrique) : $debut; $pagination = chercher_filtre('pagination'); - $pagination = '

' . + $pagination = '

'; } $les_enfants = enfant_rub($id_rubrique, $debut, $limite); diff -Nru spip-4.0.4/ecrire/inc/texte_mini.php spip-4.0.7.1/ecrire/inc/texte_mini.php --- spip-4.0.4/ecrire/inc/texte_mini.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/inc/texte_mini.php 2022-05-20 16:44:42.000000000 +0100 @@ -187,7 +187,7 @@ return $regs[0]; } -define('_PROTEGE_BLOCS', ',<(html|pre|code|cadre|frame|script|style)(\s[^>]*)?>(.*),UimsS'); +define('_PROTEGE_BLOCS', ',<(html|pre|code|cadre|frame|script|style)(\b[^>]*)?>(.*),UimsS'); /** * pour $source voir commentaire infra (echappe_retour) @@ -216,13 +216,15 @@ // si le texte recu est long PCRE risque d'exploser, on // fait donc un mic-mac pour augmenter pcre.backtrack_limit - if (($len = strlen($letexte)) > 100000) { - if (!$old = @ini_get('pcre.backtrack_limit')) { - $old = 100000; - } - if ($len > $old) { - $a = @ini_set('pcre.backtrack_limit', $len); - spip_log("ini_set pcre.backtrack_limit=$len ($old)"); + if (function_exists('ini_set')) { + if (($len = strlen($letexte)) > 100000) { + if (!$old = @ini_get('pcre.backtrack_limit')) { + $old = 100000; + } + if ($len > $old) { + @ini_set('pcre.backtrack_limit', $len); + spip_log("ini_set pcre.backtrack_limit=$len ($old)"); + } } } @@ -236,8 +238,10 @@ $echap = $regs[0]; } // sinon les traiter selon le cas else { - if (function_exists($f = $callback_prefix . 'traiter_echap_' . strtolower($regs[1])) - or function_exists($f = $f . '_dist')) { + if ( + function_exists($f = $callback_prefix . 'traiter_echap_' . strtolower($regs[1])) + or function_exists($f = $f . '_dist') + ) { $echap = $f($regs); } } diff -Nru spip-4.0.4/ecrire/inc/utils.php spip-4.0.7.1/ecrire/inc/utils.php --- spip-4.0.4/ecrire/inc/utils.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/inc/utils.php 2022-05-20 16:44:42.000000000 +0100 @@ -587,7 +587,12 @@ $a = './'; } - $regexp = ',^(' . str_replace('[]', '\[\]', $c) . '[[]?[]]?)(=.*)?$,'; + // preparer la regexp de maniere securisee + $regexp = explode('|', $c); + foreach ($regexp as $r => $e) { + $regexp[$r] = str_replace('[]', '\[\]', preg_replace(',[^\w\d\[\]-],', '', $e)); + } + $regexp = ',^(' . implode('|', $regexp) . '[[]?[]]?)(=.*)?$,'; $ajouts = array_flip(explode('|', $c)); $u = is_array($v) ? $v : rawurlencode($v); $testv = (is_array($v) ? count($v) : strlen($v)); @@ -1997,7 +2002,11 @@ } // note : HTTP_HOST contient le :port si necessaire - $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : null; + if ($host = (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : null)) { + // Filtrer $host pour proteger d'attaques d'entete HTTP + $host = (filter_var($host, FILTER_SANITIZE_URL) ?: null); + } + // si on n'a pas trouvé d'hôte du tout, en dernier recours on utilise adresse_site comme fallback if (is_null($host) and isset($GLOBALS['meta']['adresse_site'])) { $host = $GLOBALS['meta']['adresse_site']; @@ -2039,6 +2048,9 @@ } } + // Et nettoyer l'url + $GLOBALS['REQUEST_URI'] = (filter_var($GLOBALS['REQUEST_URI'], FILTER_SANITIZE_URL) ?: ''); + $url[$profondeur] = url_de_($http, $host, $GLOBALS['REQUEST_URI'], $profondeur); return $url[$profondeur]; @@ -2844,7 +2856,9 @@ $memory *= 1024; } if ($memory < _MEMORY_LIMIT_MIN * 1024 * 1024) { - @ini_set('memory_limit', $m = _MEMORY_LIMIT_MIN . 'M'); + if (function_exists('ini_set')) { + @ini_set('memory_limit', $m = _MEMORY_LIMIT_MIN . 'M'); + } if (trim(ini_get('memory_limit')) != $m) { if (!defined('_INTERDIRE_COMPACTE_HEAD_ECRIRE')) { define('_INTERDIRE_COMPACTE_HEAD_ECRIRE', true); @@ -3212,16 +3226,27 @@ if (autoriser('phpinfos')) { $cookies_masques = ['spip_session', 'PHPSESSID']; $cookies_backup = []; + $server_backup = ['HTTP_COOKIE' => $_SERVER['HTTP_COOKIE'] ?? []]; + $env_backup = ['HTTP_COOKIE' => $_ENV['HTTP_COOKIE'] ?? []]; + $mask = '******************************'; foreach ($cookies_masques as $k) { if (!empty($_COOKIE[$k])) { $cookies_backup[$k] = $_COOKIE[$k]; - $_COOKIE[$k] = '******************************'; + $_SERVER['HTTP_COOKIE'] = str_replace("$k=" . $_COOKIE[$k], "$k=$mask", $_SERVER['HTTP_COOKIE'] ?? []); + $_ENV['HTTP_COOKIE'] = str_replace("$k=" . $_COOKIE[$k], "$k=$mask", $_ENV['HTTP_COOKIE'] ?? []); + $_COOKIE[$k] = $mask; } } phpinfo(); foreach ($cookies_backup as $k => $v) { $_COOKIE[$k] = $v; } + foreach ($server_backup as $k => $v) { + $_SERVER[$k] = $v; + } + foreach ($env_backup as $k => $v) { + $_ENV[$k] = $v; + } } else { include_spip('inc/filtres'); sinon_interdire_acces(); diff -Nru spip-4.0.4/ecrire/inc_version.php spip-4.0.7.1/ecrire/inc_version.php --- spip-4.0.4/ecrire/inc_version.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/inc_version.php 2022-05-20 16:44:42.000000000 +0100 @@ -440,8 +440,8 @@ // 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 = '4.0.4'; -define('_SPIP_VERSION_ID', 40004); +$spip_version_branche = '4.0.7'; +define('_SPIP_VERSION_ID', 40007); define('_SPIP_EXTRA_VERSION', ''); // cette version dev accepte tous les plugins compatible avec la version ci-dessous @@ -449,7 +449,7 @@ #define('_DEV_VERSION_SPIP_COMPAT',"3.2.99"); // version des signatures de fonctions PHP // (= date de leur derniere modif cassant la compatibilite et/ou necessitant un recalcul des squelettes) -$spip_version_code = 20211117; +$spip_version_code = 20220413; // version de la base SQL (= Date + numero incremental a 2 chiffres YYYYMMDDXX) $spip_version_base = 2021021800; diff -Nru spip-4.0.4/ecrire/install/etape_3.php spip-4.0.7.1/ecrire/install/etape_3.php --- spip-4.0.4/ecrire/install/etape_3.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/install/etape_3.php 2022-05-20 16:44:42.000000000 +0100 @@ -370,7 +370,7 @@ $hidden = predef_ou_cache($adresse_db, $login_db, $pass_db, $server_db) . (defined('_INSTALL_NAME_DB') ? '' - : "\n"); + : "\n'); $auteur_obligatoire = ($ldap_present ? 0 : !sql_countsel('spip_auteurs', '', '', '', $server_db)); diff -Nru spip-4.0.4/ecrire/install/etape_chmod.php spip-4.0.7.1/ecrire/install/etape_chmod.php --- spip-4.0.4/ecrire/install/etape_chmod.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/install/etape_chmod.php 2022-05-20 16:44:42.000000000 +0100 @@ -76,7 +76,7 @@ $test_dir = _request('test_dir'); $chmod = 0; - if ($test_dir) { + if ($test_dir and strpos($test_dir, '..') === false) { if (substr($test_dir, -1) !== '/') { $test_dir .= '/'; } diff -Nru spip-4.0.4/ecrire/install/etape_ldap2.php spip-4.0.7.1/ecrire/install/etape_ldap2.php --- spip-4.0.4/ecrire/install/etape_ldap2.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/install/etape_ldap2.php 2022-05-20 16:44:42.000000000 +0100 @@ -41,8 +41,15 @@ $tls = true; } } + else { + $tls_ldap == 'non'; + } + + // Verifions que l'adresse demandee est valide + $adresse_ldap = filter_var($adresse_ldap, FILTER_SANITIZE_URL) ?: ''; + $ldap_link = ldap_connect($adresse_ldap, $port_ldap); - $erreur = "ldap_connect($adresse_ldap, $port_ldap)"; + $erreur = 'ldap_connect(' . spip_htmlspecialchars($adresse_ldap) . ', ' . spip_htmlspecialchars($port_ldap) . ')'; if ($ldap_link) { if (!ldap_set_option($ldap_link, LDAP_OPT_PROTOCOL_VERSION, $protocole_ldap)) { @@ -51,13 +58,19 @@ } if ($tls === true) { if (!ldap_start_tls($ldap_link)) { - $erreur = "ldap_start_tls($ldap_link) $adresse_ldap, $port_ldap"; + $erreur = 'ldap_start_tls(' . spip_htmlspecialchars($ldap_link) + . ' ' . spip_htmlspecialchars($adresse_ldap) + . ', ' . spip_htmlspecialchars($port_ldap) . ')'; $ldap_link = false; } } if ($ldap_link) { $ldap_link = ldap_bind($ldap_link, $login_ldap, $pass_ldap); - $erreur = "ldap_bind('$ldap_link', '$login_ldap', '$pass_ldap'): $adresse_ldap, $port_ldap"; + $erreur = "ldap_bind('" . spip_htmlspecialchars($ldap_link) + . "', '" . spip_htmlspecialchars($login_ldap) + . "', '" . spip_htmlspecialchars($pass_ldap) + . "'): " . spip_htmlspecialchars($adresse_ldap) + . ', ' . spip_htmlspecialchars($port_ldap); } } @@ -68,12 +81,12 @@ ), _T('info_connexion_ldap_ok'); echo generer_form_ecrire('install', ( "\n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n" - . "\n" + . "\n' + . "\n' + . "\n' + . "\n' + . "\n' + . "\n' . bouton_suivant())); } else { echo info_etape(_T('titre_connexion_ldap')), info_progression_etape(1, 'etape_ldap', 'install/', true), diff -Nru spip-4.0.4/ecrire/iterateur/sql.php spip-4.0.7.1/ecrire/iterateur/sql.php --- spip-4.0.4/ecrire/iterateur/sql.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/iterateur/sql.php 2022-05-20 16:44:42.000000000 +0100 @@ -27,7 +27,6 @@ * Permet d'itérer sur des données en base de données */ class IterateurSQL implements Iterator { - /** * ressource sql * diff -Nru spip-4.0.4/ecrire/paquet.xml spip-4.0.7.1/ecrire/paquet.xml --- spip-4.0.4/ecrire/paquet.xml 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/paquet.xml 2022-05-20 16:44:42.000000000 +0100 @@ -1,7 +1,7 @@ : ' . nl2br(entites_html($valeur)) + $res .= "\n" . nl2br((string) entites_html($nom)) + . ': ' . nl2br((string) entites_html($valeur)) . "\n"; } @@ -830,7 +820,7 @@ html_lang_attributes() . "\n" . ('SPIP ' . $GLOBALS['spip_version_affichee'] . ' ' . - _T('admin_debug') . ' ' . $titre . ' (' . + _T('admin_debug') . ' ' . spip_htmlspecialchars($titre) . ' (' . supprimer_tags(corriger_typo($GLOBALS['meta']['nom_site']))) . ")\n" . "type) ) { - $r = $d($p, $fmt, (0 - $prof), @$v[$k + 1]); + $r = $d($p, $fmt, (0 - $prof)); $res2[] = [$p->type, $r]; } else { spip_log("critere $i / $k mal forme"); diff -Nru spip-4.0.4/ecrire/public/interfaces.php spip-4.0.7.1/ecrire/public/interfaces.php --- spip-4.0.4/ecrire/public/interfaces.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/public/interfaces.php 2022-05-20 16:44:42.000000000 +0100 @@ -975,9 +975,9 @@ if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) { define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))'); } - $GLOBALS['table_des_traitements']['BIO'][] = 'safehtml('._TRAITEMENT_RACCOURCIS.')'; + $GLOBALS['table_des_traitements']['BIO'][] = 'safehtml(' . _TRAITEMENT_RACCOURCIS . ')'; $GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)'; - $GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml('. _TRAITEMENT_TYPO_SANS_NUMERO.')'; + $GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(' . _TRAITEMENT_TYPO_SANS_NUMERO . ')'; $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS; $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)'; $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)'; diff -Nru spip-4.0.4/ecrire/public/iterateur.php spip-4.0.7.1/ecrire/public/iterateur.php --- spip-4.0.4/ecrire/public/iterateur.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/public/iterateur.php 2022-05-20 16:44:42.000000000 +0100 @@ -258,7 +258,7 @@ // Creer la fonction de filtrage sur $this if ($this->filtre) { if ($filtres = $this->assembler_filtres($this->filtre)) { - $filtres = 'return ' . $filtres.';'; + $filtres = 'return ' . $filtres . ';'; $this->func_filtre = function () use ($filtres) { return eval($filtres); }; @@ -295,7 +295,7 @@ return null; } - return "(" . implode( ") $operateur (", $filtres_string) . ")"; + return '(' . implode(") $operateur (", $filtres_string) . ')'; } /** diff -Nru spip-4.0.4/ecrire/public/jointures.php spip-4.0.7.1/ecrire/public/jointures.php --- spip-4.0.4/ecrire/public/jointures.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/public/jointures.php 2022-05-20 16:44:42.000000000 +0100 @@ -242,9 +242,11 @@ * @return bool */ function nogroupby_if($depart, $arrivee, $col) { - if (empty($arrivee['key']['PRIMARY KEY']) - or !($pk = $arrivee['key']['PRIMARY KEY']) - or empty($depart['key']['PRIMARY KEY'])) { + if ( + empty($arrivee['key']['PRIMARY KEY']) + or !($pk = $arrivee['key']['PRIMARY KEY']) + or empty($depart['key']['PRIMARY KEY']) + ) { return false; } $id_primary = $depart['key']['PRIMARY KEY']; diff -Nru spip-4.0.4/ecrire/public/parametrer.php spip-4.0.7.1/ecrire/public/parametrer.php --- spip-4.0.4/ecrire/public/parametrer.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/public/parametrer.php 2022-05-20 16:44:42.000000000 +0100 @@ -60,7 +60,7 @@ // sauver le nom de l'eventuel squelette en cours d'execution // (recursion possible a cause des modeles) if ($debug) { - $courant = @$GLOBALS['debug_objets']['courant']; + $courant = $GLOBALS['debug_objets']['courant'] ?? null; $GLOBALS['debug_objets']['contexte'][$sourcefile] = $contexte; } diff -Nru spip-4.0.4/ecrire/xml/indenter.php spip-4.0.7.1/ecrire/xml/indenter.php --- spip-4.0.4/ecrire/xml/indenter.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/xml/indenter.php 2022-05-20 16:44:42.000000000 +0100 @@ -15,7 +15,6 @@ } class IndenteurXML { - // https://code.spip.net/@debutElement public function debutElement($phraseur, $name, $attrs) { xml_debutElement($this, $name, $attrs); diff -Nru spip-4.0.4/ecrire/xml/valider.php spip-4.0.7.1/ecrire/xml/valider.php --- spip-4.0.4/ecrire/xml/valider.php 2022-02-02 14:21:08.000000000 +0000 +++ spip-4.0.7.1/ecrire/xml/valider.php 2022-05-20 16:44:42.000000000 +0100 @@ -22,7 +22,6 @@ * on a les memes methodes et variables que l'indenteur **/ class ValidateurXML { - // https://code.spip.net/@validerElement public function validerElement($phraseur, $name, $attrs) { if (!($p = isset($this->dtc->elements[$name]))) { diff -Nru spip-4.0.4/plugins-dist/compresseur/compresseur_fonctions.php spip-4.0.7.1/plugins-dist/compresseur/compresseur_fonctions.php --- spip-4.0.4/plugins-dist/compresseur/compresseur_fonctions.php 2022-02-02 14:21:10.000000000 +0000 +++ spip-4.0.7.1/plugins-dist/compresseur/compresseur_fonctions.php 2022-05-20 16:44:42.000000000 +0100 @@ -44,6 +44,7 @@ and strpos($source, '}') === false ) { $maybe_file = true; + include_spip('inc/filtres'); $source = supprimer_timestamp($source); } if (!$format and preg_match(',\.(js|css)$,', $source, $r)) { diff -Nru spip-4.0.4/plugins-dist/compresseur/paquet.xml spip-4.0.7.1/plugins-dist/compresseur/paquet.xml --- spip-4.0.4/plugins-dist/compresseur/paquet.xml 2022-02-02 14:21:10.000000000 +0000 +++ spip-4.0.7.1/plugins-dist/compresseur/paquet.xml 2022-05-20 16:44:42.000000000 +0100 @@ -1,7 +1,7 @@ '; [(#AUTEUR|texte_backend)][ <(#EMAIL_AUTEUR|texte_backend)>] - [ (#TEXTE|liens_absolus|texte_backend)]#NOTES + [ (#TEXTE|liens_absolus|texte_backend)][ (#NOTES|liens_absolus|texte_backend)] ] [(#AUTEUR|texte_backend)][ <(#EMAIL_AUTEUR|texte_backend)>] - [ (#TEXTE|liens_absolus|texte_backend)]#NOTES + [ (#TEXTE|liens_absolus|texte_backend)][ (#NOTES|liens_absolus|texte_backend)] '; [(#AUTEUR|texte_backend)][ <(#EMAIL_AUTEUR|texte_backend)>] - [ (#TEXTE|liens_absolus|texte_backend)]#NOTES + [ (#TEXTE|liens_absolus|texte_backend)][ (#NOTES|liens_absolus|texte_backend)] '; [(#AUTEUR|texte_backend)][ <(#EMAIL_AUTEUR|texte_backend)>] - [ (#TEXTE|liens_absolus|texte_backend)]#NOTES + [ (#TEXTE|liens_absolus|texte_backend)][ (#NOTES|liens_absolus|texte_backend)] '; [(#AUTEUR|texte_backend)][ <(#EMAIL_AUTEUR|texte_backend)>] - [ (#TEXTE|liens_absolus|texte_backend)]#NOTES + [ (#TEXTE|liens_absolus|texte_backend)][ (#NOTES|liens_absolus|texte_backend)] '; [(#AUTEUR|texte_backend)][ <(#EMAIL_AUTEUR|texte_backend)>] - [ (#TEXTE|liens_absolus|texte_backend)]#NOTES + [ (#TEXTE|liens_absolus|texte_backend)][ (#NOTES|liens_absolus|texte_backend)] ' - + '
' + + '
' + '' + '
' + '' @@ -541,4 +541,4 @@ // on écrase la config juste une fois initConfig(); -})(jQuery); \ No newline at end of file +})(jQuery); diff -Nru spip-4.0.4/plugins-dist/mediabox/paquet.xml spip-4.0.7.1/plugins-dist/mediabox/paquet.xml --- spip-4.0.4/plugins-dist/mediabox/paquet.xml 2022-02-02 14:21:12.000000000 +0000 +++ spip-4.0.7.1/plugins-dist/mediabox/paquet.xml 2022-05-20 16:44:42.000000000 +0100 @@ -1,8 +1,8 @@
] -[(#ENV{_galerie,''}|oui) - [(#INCLURE{fond=#ENV{_galerie}|spip_sanitize_from_request{_galerie,vide}, env, ajax})] +[(#REM) @deprecated 4.0 - SPIP 4.1 ] +[(#ENV{_galerie,''}|joindre_document_galerie_valide|oui) + [(#INCLURE{fond=#ENV{_galerie}, env, ajax})] ] diff -Nru spip-4.0.4/plugins-dist/medias/formulaires/joindre_document.php spip-4.0.7.1/plugins-dist/medias/formulaires/joindre_document.php --- spip-4.0.4/plugins-dist/medias/formulaires/joindre_document.php 2022-02-02 14:21:12.000000000 +0000 +++ spip-4.0.7.1/plugins-dist/medias/formulaires/joindre_document.php 2022-05-20 16:44:42.000000000 +0100 @@ -51,6 +51,21 @@ } /** + * Indique si une galerie demandée est valide + * + * @deprecated 4.0 (SPIP 4.1) L’inclusion de galerie est déprécié (non utilisé depuis SPIP 3.0). Préferez ajax_reload() après upload. + * @global array medias_deprecated_liste_galeries Liste de chemins de fichiers depuis la racine SPIP autorisés. + * @param string|null $galerie Le fichier de galerie désiré + */ +function joindre_document_galerie_valide(?string $galerie): bool { + $galeries = []; + if (isset($GLOBALS['medias_deprecated_liste_galeries']) and is_array($GLOBALS['medias_deprecated_liste_galeries'])) { + $galeries = $GLOBALS['medias_deprecated_liste_galeries']; + } + return in_array($galerie, $galeries); +} + +/** * Chargement du formulaire * * @param int|string $id_document @@ -62,6 +77,7 @@ * @param string $mode * Le mode du document (auto,choix,document,image,vignette...), par défaut auto * @param string $galerie + * Deprecated 4.0 (SPIP 4.1) * Passer optionnellement une galerie jointe au form, plus utilise nativement, * on prefere la mise a jour apres upload par ajaxReload('documents') * @param bool|string $proposer_media @@ -130,7 +146,8 @@ // On ne propose le FTP que si on a des choses a afficher $valeurs['proposer_ftp'] = ($valeurs['_options_upload_ftp'] or $valeurs['_dir_upload_ftp']); - if ($galerie) { + /** @deprecated 4.0 (SPIP 4.1). Utiliser ajaxReload('documents') après upload */ + if ($galerie and joindre_document_galerie_valide($galerie)) { # passer optionnellement une galerie jointe au form # plus utilise nativement, on prefere la mise a jour # apres upload par ajaxReload('documents') @@ -161,6 +178,7 @@ * @param string $mode * Le mode du document (auto,choix,document,image,vignette...), par défaut auto * @param string $galerie + * Deprecated 4.0 (SPIP 4.1) * Passer optionnellement une galerie jointe au form, plus utilise nativement, * on prefere la mise a jour apres upload par ajaxReload('documents') * @param bool|string $proposer_media @@ -261,6 +279,7 @@ * @param string $mode * Le mode du document (auto,choix,document,image,vignette...), par défaut auto * @param string $galerie + * Deprecated 4.0 (SPIP 4.1) * Passer optionnellement une galerie jointe au form, plus utilise nativement, * on prefere la mise a jour apres upload par ajaxReload('documents') * @param bool|string $proposer_media diff -Nru spip-4.0.4/plugins-dist/medias/paquet.xml spip-4.0.7.1/plugins-dist/medias/paquet.xml --- spip-4.0.4/plugins-dist/medias/paquet.xml 2022-02-02 14:21:12.000000000 +0000 +++ spip-4.0.7.1/plugins-dist/medias/paquet.xml 2022-05-20 16:44:42.000000000 +0100 @@ -1,7 +1,7 @@
- #SET{total,#TOTAL_BOUCLE}[ (#GET{total}|!={0}|et{#AUTORISER{afficherselecteurmots,groupemots,#ID_GROUPE,'',#ARRAY{objet,#ENV{objet},id_objet,#ENV{id_objet},comite,#COMITE,minirezo,#MINIREZO}}})
diff -Nru spip-4.0.4/plugins-dist/svp/action/actionner.php spip-4.0.7.1/plugins-dist/svp/action/actionner.php --- spip-4.0.4/plugins-dist/svp/action/actionner.php 2022-02-02 14:21:16.000000000 +0000 +++ spip-4.0.7.1/plugins-dist/svp/action/actionner.php 2022-05-20 16:44:42.000000000 +0100 @@ -49,8 +49,9 @@ include_spip('inc/config'); if (lire_config('svp/mode_pas_a_pas') == 'oui') { include_spip('inc/minipres'); + include_spip('inc/filtres'); $pres = $actionneur->presenter_actions(); - $btn = "[ Action Suivante ]"; + $btn = "[ Action Suivante ]"; $styles = "