Skip to content
Validations sur la source (26)
SPIP-Core v3.2.7 -> v3.2.8 (29 septembre 2020)
----------------------------------------------
a5cda7ff8 | cedric | 2020-09-17 | Si une page preview est visualisee dans un element embed on sandbox l'element et on redirige sur la home pour eviter t..
6c2e56441 | marcimat | 2020-09-28 | On intègre plugins-dist.json à la place de .gitsvnextmodules pour lister les plugins-dist. Report de 7306ba9a sans big..
10718d144 | marcimat | 2020-09-08 | Lorsqu’un champ date contient un souligné, tel que "date_modif_manuelle", permettre d’utiliser les critères {age_modif..
85e8576b4 | nicod_ | 2020-09-11 | issue_4549 (!58)
f868732de | cedric | 2020-09-11 | #4494 : masquer les cookies sensible de le phpinfo
eaa08a27c | cedric | 2020-09-11 | Ajouter des logs sur le genie optimiser, dans un log dedie, c'est bien le moins qu'on puisse faire pour savoir un peu ..
978cec0d5 | cedric | 2020-09-11 | Complement a 52764a1611 : permettre d'utiliser une vue aussi pour une table de liens, en declarant les cles dans table..
8158f8b6f | cedric | 2020-09-02 | Fix petit cas tordu sur trouver_table() quand on l'utilise sur une vue qui est un filtre d'une table reelle : sql_show..
6418ceb40 | cedric | 2020-05-27 | cot cot cot...
e593f2fbb | cedric | 2020-05-27 | _oups donc (aka un base64_encode ca fait pas de mal)
6b5de38ac | cedric | 2020-05-19 | Divers petites sanitization et une balise manquante #4494
f6cfbce16 | rastapopoulos | 2020-06-24 | Corriger un bug présent dans plusieurs navigateurs, qui fait que ça agrandit tous les fieldsets dès qu'il y a un éléme..
925abdf1d | bruno | 2020-06-23 | API modifier : passer l'éventuelle la liste de champs fixe au pipeline pre_edition
319b9acbf | bruno | 2020-06-19 | corriger le filtre singuler_ou_pluriel quand la valeur est 0
44ebe4927 | bruno | 2020-06-16 | Améliorer le filtre singulier_ou_pluriel pour prendre en compte les valeurs non entières (!41)
bd9957b0b | marcimat | 2020-06-05 | Sanitiser les préférences utilisateurs. (g0uz)
ae4267eba | cedric | 2020-06-05 | n'enregistrer que les preferences licites (g0uZ)
0880b517b | cedric | 2020-05-29 | Fix petite salade autour de la suppression des resultats de recherche trop vieux : - on utilise le champ maj comme ind..
f6e3627c5 | maieul | 2019-09-19 | filtre |balise_svg > supprimer l'entête XML + effacer pour gagner un peu de place les commentaires XML
f02e933cc | cedric | 2020-03-11 | class grostitre manquante dans l'echafaudage
db97552ff | cedric | 2020-02-10 | Permettre de preciser le #SELF utilise par la pagination dans l'appel de la balise pagination, ce qui permet de nettoy..
adda869ce | cedric | 2020-01-22 | Fix : utiliser propre sur les nom de plugin est dangereux, car certains plugins peuvent enrichir avec un lien et comme..
f7a93668f | ben.spip | 2019-12-12 | SPIP 3.2.7
d3c2db6b9 | ben.spip | 2019-12-12 | la 3.2.6 est stable (realet)
a306385cc | ben.spip | 2019-12-12 | SPIP 3.2.6
SPIP-plugins-dist v3.2.7 -> v3.2.8 (29 septembre 2020)
------------------------------------------------------
aide | fe76f13 | spip.franck | 2020-01-01 | Bonne année "aide" de spip 3.2
archiviste | 94be628 | spip.franck | 2020-01-01 | Bonne année "archives" de spip 3.2
breves | 7f4e2ac | spip.franck | 2020-01-01 | Bonne Année "breves" de spip 3.2
compresseur | 4785c1a | cedric | 2020-06-04 | Tentative de fix de l'inflation du repertoire local/cache-css : tenir compte des timestamps des fichiers a concatener ..
compresseur | 2372cf3 | spip.franck | 2020-01-01 | Bonne Année "compresseur" de spip 3.2
dump | 0955b05 | spip.franck | 2020-01-01 | Bonne Année "dump" de spip 3.2
filtres_images | 190bf90 | spip.franck | 2020-01-01 | Bonne année "filtres_images" de spip 3.2
forum | 2e18f59 | spip.franck | 2020-01-01 | Bonne année "forum" de spip 3.2
medias | bc5a517 | cedric | 2020-06-05 | Utilisation des fonctions de sanitization sur galerie et _galerie en lien avec #4494 du core
medias | a4484ea | spip.franck | 2020-01-02 | ajout du cartouche spip avec accord de cerdic (spip 3.2)
medias | fa3c5b3 | spip.franck | 2020-01-01 | Bonne année "medias" de spip 3.2
mots | 012f539 | spip.franck | 2020-01-01 | Bonne année "mots" de spip 3.2
organiseur | 4a30bd8 | marcimat | 2020-09-23 | FullCalendar 3.10.2 (c’est vieux, mais des bugs en moins) et Moment 2.29 + Correction sur les rendez vous dont le cale..
organiseur | 53a76b0 | marcimat | 2020-09-23 | Notice PHP en moins.
organiseur | aa7eb97 | spip.franck | 2020-01-01 | Bonne année "organiseur" de spip 3.2
petitions | 1f40e1b | spip.franck | 2020-01-01 | Bonne année "petitions" de spip 3.2
porte_plume | 57cae2a | cedric | 2020-08-25 | Deux constantes pour piloter une desactivation partielle ou totale du porte_plume : * `define('_PORTE_PLUME_INSERER_AU..
revisions | 44d7df8 | spip.franck | 2020-01-01 | Bonne année "revisions" de spip 3.2
safehtml | c404945 | spip.franck | 2020-01-01 | Bonne année "safehtml" de spip 3.2
sites | 0f362a7 | spip.franck | 2020-01-01 | Bonne année "sites" de spip 3.2
squelettes_par_rubrique | 4a70c9f | spip.franck | 2020-01-01 | Bonne année "squelettes_par_rubrique" de spip 3.2
statistiques | d64d037 | spip.franck | 2020-01-01 | Bonne année "statistiques" de spip 3.2
svp | dcaf67b | cedric | 2020-03-31 | Support des logos au format svg en provenance de l'empaqueteur, meme si le paquet.xml reference un png + support de la..
svp | 0e1d905 | spip.franck | 2020-01-01 | Bonne année "svp" de spip 3.2
svp | 9f8caf6 | eric | 2019-12-23 | Utiliser le logo SVG ou PNG si il existe en se servant de la nouvelle balise incluse par Smart-Paquets. Compatible ave..
textwheel | 77f1aac | cyrille | 2020-06-11 | éviter un warning lorsqu'il y a une ligne de cellules vides dans un table
textwheel | 578a21f | cyrille | 2020-06-11 | éviter un warning lorsqu'il y a une ligne de cellules vides dans un table
textwheel | 216519a | spip.franck | 2020-01-01 | Bonne année "textwheel" de spip 3.2
urls_etendues | b74a272 | spip.franck | 2020-01-01 | Bonne année "urls_etendues" de spip 3.2
vertebres | d84a81e | spip.franck | 2020-01-01 | Bonne année "vertebres" de spip 3.2
squelettes-dist | ea695c1 | spip.franck | 2020-01-01 | Bonne Année "dist" de spip 3.2
SPIP-Core spip-3.2.6 -> spip-3.2.7 12 décembre 2019
-------------------------------------------------------------
r24471 | ben | (jeu. 12 déc. 2019) | la 3.2.6 est stable (realet)
SPIP-Core spip-3.2.5 -> spip-3.2.6 10 décembre 2019
-------------------------------------------------------------
r24399 | cedric | (lun. 16 sept. 2019) | Mise a jour de l'ecran de securite
r24403 | ben | (lun. 16 sept. 2019) | SPIP 3.2.5
r24411 | marcimat | (mar. 17 sept. 2019) | Fix #4381 : coquille de priorités d’opérateurs sur un test (Équipement).
r24420 | cedric | (mar. 24 sept. 2019) | 2 constantes _SPIP_VERSION_ID et _SPIP_EXTRA_VERSION pour faciliter les tests de version dans les plugins
r24421 | cedric | (mar. 24 sept. 2019) | coherence du paquet.xml avec inc_version
r24431 | cedric | (ven. 22 nov. 2019) | Fix opcache invalidation sur les mutus qui n'ont pas la fonction opcache_invalidate() (Jean Marie)
r24440 | bruno | (mer. 04 déc. 2019) | des fichiers CACHEDIR.TAG fonctionnelsretour sur https://core.spip.net/projects/spip/repository/revisions/23514ref https://core.spip.net/issues/2346 & https://bford.info/cachedir/
r24448 | cedric | (mer. 04 déc. 2019) | Feu les temps modernes
SPIP-plugins-dist spip-3.2.5 -> spip-3.2.6 10 décembre 2019
-------------------------------------------------------------
r117876 | cedric | (mar. 17 sept. 2019) | Report de r117577 et 117578 : Dans le formulaire d'oubli de mot de passe, ne pas dire si l'email est inscrit sur le site ou non, toujours afficher le meme resultat ​https://core.spip.net/issues/4171
r117892 | marcimat | (mer. 18 sept. 2019) | Ticket #4383 : Bien prendre en compte les nécessite / utilise des paquets.xml qui ont une balise `<spip>` intégrée. [report de r117891]
r118163 | Cerdic | (mer. 16 oct. 2019) | Reparer le formulaire de saisie d'un nouveau mot de passe qui ne marchait plus avec les navigateur bases sur webkit/blink : ceux-ci croient reconnaitre le formulaire de login, et preremplissent avec les identifiants enregistres. Du coup faute de mieux ils mettaient le login dans le champ nobot, declenchant un fort peu avenant 'Rien a faire ici' pour les utilisateurs
r118195 | Cerdic | (ven. 18 oct. 2019) | Trop de n attire l'attention (dd)
r118593 | marcimat | (mer. 13 nov. 2019) | Report de r118592 : Ne pas transmettre le paramètre "objet" aux listes d’objets dont on a trouvé le squelette, c’est contre productif, particulièrement lorsque ce paramètre peut servir à autre chose, comme dans le plugin albums.
r118900 | marcimat | (mer. 04 déc. 2019) | Rétablir l’ordre un minimum ; on ne tolère aucune manifestation en chaîne. (Alexis Z)
r118901 | marcimat | (mer. 04 déc. 2019) | Version 2.20.31
SPIP-Core spip-3.2.4 -> spip-3.2.5 16 septembre 2019
-------------------------------------------------------------
......
......@@ -211,6 +211,7 @@ function objet_trouver_liens($objets_source, $objets_lies, $cond = null) {
* @return int
*/
function objet_optimiser_liens($objets_source, $objets_lies) {
spip_log("objet_optimiser_liens : ".json_encode($objets_source) . ', ' . json_encode($objets_lies), 'genie'._LOG_DEBUG);
return objet_traiter_liaisons('lien_optimise', $objets_source, $objets_lies);
}
......@@ -652,8 +653,10 @@ function lien_optimise($objet_source, $primary, $table_lien, $id, $objets) {
array("$primary=" . $row['id'], "id_objet=" . $row['id_objet'], "objet=" . sql_quote($type)));
if ($e != false) {
$dels += $e;
spip_log("Entree " . $row['id'] . "/" . $row['id_objet'] . "/$type supprimee dans la table $table_lien",
_LOG_INFO_IMPORTANTE);
spip_log(
"lien_optimise: Entree " . $row['id'] . "/" . $row['id_objet'] . "/$type supprimee dans la table $table_lien",
'genie'._LOG_INFO_IMPORTANTE
);
}
}
}
......
......@@ -152,7 +152,7 @@ function base_trouver_table_dist($nom, $serveur = '', $table_spip = true) {
$desc = sql_showtable($nom_sql, $table_spip, $serveur);
if (!$desc or !$desc['field']) {
if (!$fdesc) {
spip_log("trouver_table: table inconnue '$serveur' '$nom'", _LOG_INFO_IMPORTANTE);
spip_log("trouver_table: table inconnue '$serveur' '$nom'", 'base' . _LOG_INFO_IMPORTANTE);
return null;
}
......@@ -162,6 +162,12 @@ function base_trouver_table_dist($nom, $serveur = '', $table_spip = true) {
$desc['exist'] = false;
} else {
$desc['exist'] = true;
// gerer le cas des cles vides (echec de l'analyse sur une vue par exemple)
// pour recuperer la declaration de lister_tables_objets_sql() si il y en a une
if (! $desc['key']) {
spip_log("trouver_table: table sans cle '$serveur' '$nom'", 'base');
unset($desc['key']);
}
}
$desc['table'] = $desc['table_sql'] = $nom_sql;
......@@ -171,6 +177,13 @@ function base_trouver_table_dist($nom, $serveur = '', $table_spip = true) {
// en lui passant les infos connues
// $desc est prioritaire pour la description de la table
$desc = array_merge(lister_tables_objets_sql($nom_sql, $desc), $desc);
// s'assurer qu'on a toujours un 'key'
if (!isset($desc['key']) && !empty($fdesc['key'])){
$desc['key'] = $fdesc['key'];
}
if (! isset($desc['key'])) {
$desc['key'] = array();
}
// si tables_objets_sql est bien fini d'init, on peut cacher
$connexion['tables'][$nom_sql] = $desc;
......
......@@ -84,15 +84,16 @@ function optimiser_base_une_table() {
$tables[] = array_shift($row);
}
spip_log("optimiser_base_une_table ".json_encode($tables), 'genie'._LOG_DEBUG);
if ($tables) {
$table_op = intval(lire_config('optimiser_table', 0) + 1) % sizeof($tables);
ecrire_config('optimiser_table', $table_op);
$q = $tables[$table_op];
spip_log("debut d'optimisation de la table $q");
spip_log("optimiser_base_une_table : debut d'optimisation de la table $q", 'genie'._LOG_DEBUG);
if (sql_optimize($q)) {
spip_log("fin d'optimisation de la table $q");
spip_log("optimiser_base_une_table : fin d'optimisation de la table $q", 'genie'._LOG_DEBUG);
} else {
spip_log("Pas d'optimiseur necessaire");
spip_log("optimiser_base_une_table : Pas d'optimiseur necessaire", 'genie'._LOG_DEBUG);
}
}
}
......@@ -128,7 +129,7 @@ function optimiser_sansref($table, $id, $sel, $and = '') {
if ($in) {
sql_delete($table, sql_in($id, array_keys($in)) . ($and ? " AND $and" : ''));
spip_log("Numeros des entrees $id supprimees dans la table $table: " . implode(', ', array_keys($in)));
spip_log("optimiser_sansref: Numeros des entrees $id supprimees dans la table $table: " . implode(', ', array_keys($in)), 'genie'._LOG_DEBUG);
}
return count($in);
......@@ -220,7 +221,6 @@ function optimiser_base_disparus($attente = 86400) {
'data' => $n
));
if (!$n) {
spip_log("Optimisation des tables: aucun lien mort");
}
spip_log("optimiser_base_disparus : {$n} lien(s) mort(s)", 'genie'._LOG_DEBUG);
}
......@@ -157,16 +157,14 @@ function init_body($rubrique = 'accueil', $sous_rubrique = 'accueil', $id_rubriq
* @return string Classes CSS (séparées par des espaces)
*/
function init_body_class() {
$GLOBALS['spip_display'] = isset($GLOBALS['visiteur_session']['prefs']['display'])
? $GLOBALS['visiteur_session']['prefs']['display']
: 2;
$spip_display_navigation = isset($GLOBALS['visiteur_session']['prefs']['display_navigation'])
? $GLOBALS['visiteur_session']['prefs']['display_navigation']
: 'navigation_avec_icones';
$spip_display_outils = isset($GLOBALS['visiteur_session']['prefs']['display_outils'])
? ($GLOBALS['visiteur_session']['prefs']['display_outils'] ? 'navigation_avec_outils' : 'navigation_sans_outils')
$prefs = isset($GLOBALS['visiteur_session']['prefs']) ? $GLOBALS['visiteur_session']['prefs'] : array();
$GLOBALS['spip_display'] = isset($prefs['display']) ? (int) $prefs['display'] : 2;
$spip_display_navigation = isset($prefs['display_navigation']) ? spip_sanitize_classname($prefs['display_navigation']) : 'navigation_avec_icones';
$spip_display_outils = isset($prefs['display_outils'])
? ($prefs['display_outils'] ? 'navigation_avec_outils' : 'navigation_sans_outils')
: 'navigation_avec_outils';
$GLOBALS['spip_ecran'] = isset($_COOKIE['spip_ecran']) ? $_COOKIE['spip_ecran'] : "etroit";
$GLOBALS['spip_ecran'] = isset($_COOKIE['spip_ecran']) ? spip_sanitize_classname($_COOKIE['spip_ecran']) : "etroit";
$display_class = array(
0 => 'icones_img_texte'
......@@ -176,7 +174,8 @@ function init_body_class() {
3 => 'icones_img'
);
return $GLOBALS['spip_ecran'] . " $spip_display_navigation $spip_display_outils " . $display_class[$GLOBALS['spip_display']];
$classes = $GLOBALS['spip_ecran'] . " $spip_display_navigation $spip_display_outils " . $display_class[$GLOBALS['spip_display']];
return spip_sanitize_classname($classes);
}
......
......@@ -352,6 +352,17 @@ function filtre_setenv(&$Pile, $val, $key, $continue = null) {
return $continue ? $val : '';
}
/**
* @param array $Pile
* @param array|string $keys
* @return string
*/
function filtre_sanitize_env(&$Pile, $keys) {
$Pile[0] = spip_sanitize_from_request($Pile[0], $keys);
return '';
}
/**
* Filtre `debug` qui affiche un debug de la valeur en entrée
*
......@@ -2789,9 +2800,10 @@ function filtre_pagination_dist(
return $ancres[$ancre];
}
$self = (empty($env['self']) ? self() : $env['self']);
$pagination = array(
'debut' => $debut,
'url' => parametre_url(self(), 'fragment', ''), // nettoyer l'id ahah eventuel
'url' => parametre_url($self, 'fragment', ''), // nettoyer l'id ahah eventuel
'total' => $total,
'position' => intval($position),
'pas' => $pas,
......@@ -3438,6 +3450,10 @@ function filtre_balise_svg_dist($img, $alt = "", $class = "") {
}
$balise_svg = $match[0];
$balise_svg_source = $balise_svg;
// entete XML à supprimer
$svg = preg_replace(',^\s*<\?xml[^>]*\?' . '>,', '', $svg);
// IE est toujours mon ami
$balise_svg = inserer_attribut($balise_svg, 'focusable', 'false');
if ($class) {
......@@ -3880,20 +3896,20 @@ function lien_ou_expose($url, $libelle = null, $on = false, $class = "", $title
*
* @param int $nb : le nombre
* @param string $chaine_un : l'item de langue si $nb vaut un
* @param string $chaine_plusieurs : l'item de lanque si $nb > 1
* @param string $chaine_plusieurs : l'item de lanque si $nb >= 2
* @param string $var : La variable à remplacer par $nb dans l'item de langue (facultatif, défaut "nb")
* @param array $vars : Les autres variables nécessaires aux chaines de langues (facultatif)
* @return string : la chaine de langue finale en utilisant la fonction _T()
*/
function singulier_ou_pluriel($nb, $chaine_un, $chaine_plusieurs, $var = 'nb', $vars = array()) {
if (!$nb = intval($nb)) {
if (!is_numeric($nb) or $nb == 0) {
return "";
}
if (!is_array($vars)) {
return "";
}
$vars[$var] = $nb;
if ($nb > 1) {
if ($nb >= 2) {
return _T($chaine_plusieurs, $vars);
} else {
return _T($chaine_un, $vars);
......
......@@ -160,6 +160,7 @@ function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur
'spip_table_objet' => $spip_table_objet,
'type' => $objet,
'id_objet' => $id_objet,
'data' => isset($options['data']) ? $options['data'] : null,
'champs' => isset($options['champs']) ? $options['champs'] : array(), // [doc] c'est quoi ?
'serveur' => $serveur,
'action' => isset($options['action']) ? $options['action'] : 'modifier'
......
......@@ -207,6 +207,12 @@ function f_admin($texte) {
$pos = strlen($texte);
}
$texte = substr_replace($texte, $x, $pos, 0);
// pas de preview en fenetre enfant
$x = "<script type='text/javascript'>const frameEl = window.frameElement;if (frameEl) {frameEl.sandbox='sandbox';window.location.href='".addslashes($GLOBALS['meta']['adresse_site'])."';}</script>";
if (!$pos = stripos($texte, '<head') or !$pos = strpos($texte, '>', $pos)) {
$pos = -1;
}
$texte = substr_replace($texte, $x, $pos+1, 0);
}
if (isset($GLOBALS['affiche_boutons_admin']) and $GLOBALS['affiche_boutons_admin']) {
......
......@@ -50,7 +50,7 @@ function precharger_objet($type, $id_objet, $id_rubrique = 0, $lier_trad = 0, $c
// si l'objet existe deja, on retourne simplement ses valeurs
if (is_numeric($id_objet)) {
return sql_fetsel("*", $table, "$_id_objet=$id_objet");
return sql_fetsel("*", $table, "$_id_objet=".intval($id_objet));
}
// ici, on demande une creation.
......@@ -133,7 +133,7 @@ function precharger_traduction_objet($type, $id_objet, $id_rubrique = 0, $lier_t
$_id_objet = id_table_objet($table);
// Recuperer les donnees de l'objet original
$row = sql_fetsel("*", $table, "$_id_objet=$lier_trad");
$row = sql_fetsel("*", $table, "$_id_objet=".intval($lier_trad));
if ($row) {
include_spip('inc/filtres');
$row[$champ_titre] = filtrer_entites(objet_T($type, 'info_nouvelle_traduction')) . ' ' . $row[$champ_titre];
......@@ -172,12 +172,12 @@ function precharger_traduction_objet($type, $id_objet, $id_rubrique = 0, $lier_t
$id_parent = 0;
} else {
// on cherche une rubrique soeur dans la bonne langue
$row_rub = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=$id_rubrique");
$row_rub = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=".intval($id_rubrique));
$id_parent = $row_rub['id_parent'];
}
$row_rub = sql_fetsel("id_rubrique", "spip_rubriques",
"lang='" . $GLOBALS['spip_lang'] . "' AND id_parent=$id_parent");
"lang='" . $GLOBALS['spip_lang'] . "' AND id_parent=".intval($id_parent));
if ($row_rub) {
$row['id_rubrique'] = $row_rub['id_rubrique'];
}
......
......@@ -77,14 +77,14 @@ function inc_prepare_recherche_dist(
$rechercher = false;
$where_resultat_recent = sql_date_proche('maj', (0 - ($delai_fraicheur + 100)), " SECOND");
if (!isset($cache[$serveur][$table][$recherche])) {
$hash_serv = ($serveur ? substr(md5($serveur), 0, 16) : '');
$hash = substr(md5($recherche . $table), 0, 16);
$where = "(resultats.recherche='$hash' AND resultats.table_objet=" . sql_quote($table) . " AND resultats.serveur='$hash_serv')";
$row = sql_fetsel('UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(resultats.maj) AS fraicheur', 'spip_resultats AS resultats',
$where, '', 'fraicheur DESC', '0,1');
$row = sql_fetsel('recherche', 'spip_resultats AS resultats',
$where . " AND $where_resultat_recent", '', '', '0,1');
if (!$row
or ($row['fraicheur'] > $delai_fraicheur)
or (defined('_VAR_MODE') and _VAR_MODE == 'recalcul')
) {
$rechercher = true;
......@@ -122,8 +122,9 @@ function inc_prepare_recherche_dist(
// pas de AS resultats dans un delete (mysql)
$whered = str_replace(array("resultats.recherche", "resultats.table_objet", "resultats.serveur"),
array("recherche", "table_objet", "serveur"), $where);
sql_delete('spip_resultats',
'NOT(' . sql_date_proche('maj', (0 - ($delai_fraicheur + 100)), " SECOND") . ") OR ($whered)");
"NOT($where_resultat_recent) OR ($whered)");
// inserer les resultats dans la table de cache des resultats
if (count($points)) {
......
......@@ -446,6 +446,43 @@ function set_request($var, $val = null, $c = false) {
return false; # n'affecte pas $c
}
/**
* Sanitizer une valeur *SI* elle provient du GET ou POST
* Utile dans les squelettes pour les valeurs qu'on attrape dans le env,
* dont on veut permettre à un squelette de confiance appelant de fournir une valeur complexe
* mais qui doit etre nettoyee si elle provient de l'URL
*
* On peut sanitizer
* - une valeur simple : `$where = spip_sanitize_from_request($value, 'where')`
* - un tableau en partie : `$env = spip_sanitize_from_request($env, ['key1','key2'])`
* - un tableau complet : `$env = spip_sanitize_from_request($env, '*')`
*
* @param string|array $value
* @param string|array $key
* @param string $sanitize_function
* @return array|mixed|string
*/
function spip_sanitize_from_request($value, $key, $sanitize_function='entites_html') {
if (is_array($value)) {
if ($key=='*') {
$key = array_keys($value);
}
if (!is_array($key)) {
$key = [$key];
}
foreach ($key as $k) {
if (!empty($value[$k])) {
$value[$k] = spip_sanitize_from_request($value[$k], $k, $sanitize_function);
}
}
return $value;
}
// si la valeur vient des GET ou POST on la sanitize
if (!empty($value) and $value == _request($key)) {
$value = $sanitize_function($value);
}
return $value;
}
/**
* Tester si une URL est absolue
......@@ -3125,7 +3162,18 @@ function exec_info_dist() {
include_spip('inc/autoriser');
if (autoriser('webmestre')) {
$cookies_masques = ['spip_session', 'PHPSESSID'];
$cookies_backup = [];
foreach ($cookies_masques as $k) {
if (!empty($_COOKIE[$k])) {
$cookies_backup[$k] = $_COOKIE[$k];
$_COOKIE[$k] = '******************************';
}
}
phpinfo();
foreach ($cookies_backup as $k => $v) {
$_COOKIE[$k] = $v;
}
} else {
include_spip('inc/filtres');
sinon_interdire_acces();
......@@ -3585,4 +3633,21 @@ if (PHP_VERSION_ID < 50500) {
}
}
}
/**
* Nettoie une chaine pour servir comme classes CSS.
*
* @note
* les classes CSS acceptent théoriquement tous les caractères sauf NUL.
* Ici, on limite (enlève) les caractères autres qu’alphanumérique, espace, - + _ @
*
* @param string|string[] $classes
* @return string|string[]
*/
function spip_sanitize_classname($classes) {
if (is_array($classes)) {
return array_map('spip_sanitize_classname', $classes);
}
return preg_replace("/[^ 0-9a-z_\-+@]/i", "", $classes);
}
\ No newline at end of file
......@@ -372,9 +372,11 @@ $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.6-dev";
define('_SPIP_VERSION_ID', 30206);
define('_SPIP_EXTRA_VERSION', '-dev');
// le _SPIP_VERSION_ID est un nombre entier représentant le numéro de version (2 chiffres pour chaque 03 + 02 + 06 = 30206
// le _SPIP_EXTRA_VERSION sert à repérer les version dev, beta etc. Pour une version stable il est vide.
$spip_version_branche = "3.2.8";
define('_SPIP_VERSION_ID', 30208);
define('_SPIP_EXTRA_VERSION', '');
// cette version dev accepte tous les plugins compatible avec la version ci-dessous
// a supprimer en phase beta/rc/release
......
......@@ -147,9 +147,9 @@ elseif (!preg_match(',^[a-z4_][0-9a-z_-]*$,i', $exec)) {
// compatibilite ascendante : obsolete, ne plus utiliser
$GLOBALS['spip_display'] = isset($GLOBALS['visiteur_session']['prefs']['display'])
? $GLOBALS['visiteur_session']['prefs']['display']
? (int) $GLOBALS['visiteur_session']['prefs']['display']
: 0;
$GLOBALS['spip_ecran'] = isset($_COOKIE['spip_ecran']) ? $_COOKIE['spip_ecran'] : "etroit";
$GLOBALS['spip_ecran'] = isset($_COOKIE['spip_ecran']) ? preg_replace('/[^a-z0-9]/i', '', $_COOKIE['spip_ecran']) : "etroit";
// si la langue est specifiee par cookie et ne correspond pas
// (elle a ete changee dans une autre session, et on retombe sur un vieux cookie)
......
<paquet
prefix="spip"
categorie="outil"
version="3.2.6"
etat="dev"
version="3.2.8"
etat="stable"
compatibilite="];["
schema="23375"
documentation="https://www.spip.net"
......
......@@ -137,9 +137,9 @@ function plugin_nom($info, $dir_plugins, $plug_file) {
$dir = "$dir_plugins$plug_file";
// Si dtd paquet, on traite le nom soit par son item de langue soit par sa valeur immediate a l'index "nom"
if ($info['dtd'] == "paquet") {
$nom = PtoBR(plugin_propre("{$prefix}_nom", "$dir/lang/paquet-$prefix"));
$nom = plugin_typo("{$prefix}_nom", "$dir/lang/paquet-$prefix");
if (!$nom) {
$nom = PtoBR(propre($info['nom']));
$nom = typo($info['nom']);
}
} else {
$nom = typo(attribut_html($info['nom']));
......@@ -221,7 +221,7 @@ function plugin_etat_en_clair($etat) {
}
// http://code.spip.net/@plugin_propre
function plugin_propre($texte, $module = '') {
function plugin_propre($texte, $module = '',$propre='propre') {
// retirer le retour a la racine du module, car le find_in_path se fait depuis la racine
if (_DIR_RACINE and strncmp($module, _DIR_RACINE, strlen(_DIR_RACINE)) == 0) {
$module = substr($module, strlen(_DIR_RACINE));
......@@ -230,7 +230,11 @@ function plugin_propre($texte, $module = '') {
$texte = _T(($module ? "$module:" : '') . $texte, array(), array('force' => false));
}
return propre($texte);
return $propre($texte);
}
function plugin_typo($texte, $module = '') {
return plugin_propre($texte, $module, 'typo');
}
......
......@@ -15,6 +15,13 @@ if (!defined('_ECRIRE_INC_VERSION')) {
}
function securiser_redirect_action($redirect) {
// cas d'un double urlencode : si un urldecode de l'url n'est pas secure, on retient ca comme redirect
if (strpos($redirect, '%') !== false) {
$r2 = urldecode($redirect);
if (($r3 = securiser_redirect_action($r2)) !== $r2) {
return $r3;
}
}
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
......
......@@ -1728,6 +1728,19 @@ function balise_REM_dist($p) {
return $p;
}
/**
* Une balise #NULL quand on a besoin de passer un argument null sur l'appel d'un filtre ou formulaire
* (evite un #EVAL{null})
* @param $p
* @return mixed
*/
function balise_NULL_dist($p) {
$p->code = "null";
$p->interdire_scripts = false;
return $p;
}
/**
* Compile la balise `#HTTP_HEADER` envoyant des entêtes de retour HTTP
......
......@@ -1563,11 +1563,11 @@ function critere_where_dist($idb, &$boucles, $crit) {
if (isset($crit->param[0])) {
$_where = calculer_liste($crit->param[0], array(), $boucles, $boucle->id_parent);
} else {
$_where = '@$Pile[0]["where"]';
$_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
}
if ($crit->cond) {
$_where = "(($_where) ? ($_where) : '')";
$_where = "((\$zzw = $_where) ? \$zzw : '')";
}
if ($crit->not) {
......@@ -2412,7 +2412,7 @@ function calculer_vieux_in($params) {
* - nom de la colonne de date (si le calcul n'est pas relatif)
**/
function calculer_critere_infixe_date($idb, &$boucles, $col) {
if (!preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z]+)?$,", $col, $regs)) {
if (!preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,", $col, $regs)) {
return '';
}
......
......@@ -129,6 +129,7 @@ function chrono_requete($temps) {
foreach ($temps as $k => $v) {
$titre = strip_tags($v[2]);
$href = quote_amp($GLOBALS['REQUEST_URI']) . "#req$i";
$href = str_replace("\\'", '&#39;', $href);
if (!isset($t[$v[2]])) {
$t[$v[2]] = array();
......
......@@ -1543,12 +1543,13 @@ function spip_mysql_quote($v, $type = '') {
* Expression SQL
**/
function spip_mysql_date_proche($champ, $interval, $unite) {
$use_now = ( ($champ === 'maj' or strpos($champ, '.maj')) ? true : false );
return '('
. $champ
. (($interval <= 0) ? '>' : '<')
. (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD')
. '('
. sql_quote(date('Y-m-d H:i:s'))
. ($use_now ? 'NOW()' : sql_quote(date('Y-m-d H:i:s')))
. ', INTERVAL '
. (($interval > 0) ? $interval : (0 - $interval))
. ' '
......