Server : Apache System : Linux webd348.cluster026.gra.hosting.ovh.net 5.15.148-ovh-vps-grsec-zfs-classid #1 SMP Thu Feb 8 09:41:04 UTC 2024 x86_64 User : hednacluml ( 122243) PHP Version : 8.3.9 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl Directory : /home/hednacluml/infant/ecrire/inc/ |
<?php /***************************************************************************\ * SPIP, Système de publication pour l'internet * * * * Copyright © avec tendresse depuis 2001 * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribué sous licence GNU/GPL. * \***************************************************************************/ /** * Gestion des cookies * * @package SPIP\Core\Cookies **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Place un cookie (préfixé) sur le poste client * * @global string cookie_prefix Préfixe de cookie défini * @link http://fr.php.net/setcookie * * @param string $name * Nom du cookie * @param string $value * Valeur à stocker * @param array{expires: int, path: string, domain: string, secure: bool, samesite: string} $options * Tableau clé => valeur de l’option * - expires = 0 : Date d'expiration du cookie (timestamp) * - path = 'AUTO' : Chemin sur lequel le cookie sera disponible * - domain = '' : Domaine à partir duquel le cookie est disponible * - secure = false : cookie sécurisé ou non ? * - samesite = 'Lax' : valeur samesite (Lax, Strict ou None) * @return bool * true si le cookie a été posé, false sinon. * * @note La signature changera en SPIP 5.0 pour reprendre la même signature que PHP. * @note Anciens paramètres (SPIP < 4.0) (à la place de $options) (pour rétrocompatibilité) * param int $expire * Date d'expiration du cookie (timestamp) * param string $path * Chemin sur lequel le cookie sera disponible * param string $domain * Domaine à partir duquel le cookie est disponible * param bool $secure * cookie sécurisé ou non ? **/ function spip_setcookie($name = '', $value = '', $options = []) { static $to_secure_list = ['spip_session']; /** @deprecated _COOKIE_SECURE_LIST: Will be deprecated in 5.0 (Use option `'httponly' => true`) */ if (defined('_COOKIE_SECURE_LIST') and is_array(constant('_COOKIE_SECURE_LIST'))) { $to_secure_list = array_merge($to_secure_list, constant('_COOKIE_SECURE_LIST')); } if (!is_array($options)) { // anciens paramètres : # spip_setcookie($name = '', $value = '', $expire = 0, $path = 'AUTO', $domain = '', $secure = '') $opt = func_get_args(); $opt = array_slice($opt, 2); $options = []; # /!\ après le func_get_args (sinon $opt[0] référence la nouvelle valeur de $options !); if (isset($opt[0])) { $options['expires'] = $opt[0]; } if (isset($opt[1])) { $options['path'] = $opt[1]; } if (isset($opt[2])) { $options['domain'] = $opt[2]; } if (isset($opt[3])) { $options['secure'] = $opt[3]; } if (isset($opt[4])) { $options['httponly'] = $opt[4]; } } // expires $options['expires'] ??= 0; if (!isset($options['path']) || $options['path'] === 'AUTO') { $options['path'] = defined('_COOKIE_PATH') ? constant('_COOKIE_PATH') : preg_replace(',^\w+://[^/]*,', '', url_de_base()); } if (empty($options['domain']) && defined('_COOKIE_DOMAIN') && constant('_COOKIE_DOMAIN')) { $options['domain'] = constant('_COOKIE_DOMAIN'); } $options['secure'] ??= false; $options['secure'] = ($options['secure'] ?: ($_SERVER['HTTPS'] ?? false)); if (defined('_COOKIE_SECURE') && constant('_COOKIE_SECURE')) { /** @deprecated Will be deprecated in 5.0 (Use option `'secure' => true`; automatic in HTTPS) */ $options['secure'] = true; } $options['httponly'] ??= false; $options['samesite'] = ($options['samesite'] ?? 'Lax') ?: 'Lax'; if (in_array($name, $to_secure_list)) { $options['httponly'] = true; } // 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); spip_cookie_envoye(true); return $a; } /** * Teste si un cookie a déjà été envoyé ou pas * * Permet par exemple à `redirige_par_entete()` de savoir le type de * redirection à appliquer (serveur ou navigateur) * * @see redirige_par_entete() * * @param bool|string $set * true pour déclarer les cookies comme envoyés * @return bool **/ function spip_cookie_envoye($set = '') { static $envoye = false; if ($set) { $envoye = true; } return $envoye; } /** * Adapte le tableau PHP `$_COOKIE` pour prendre en compte le préfixe * des cookies de SPIP * * Si le préfixe des cookies de SPIP est différent de `spip_` alors * la fonction modifie les `$_COOKIE` ayant le préfixe spécifique * pour remettre le préfixe `spip_` à la place. * * Ainsi les appels dans le code n'ont pas besoin de gérer le préfixe, * ils appellent simplement `$_COOKIE['spip_xx']` qui sera forcément * la bonne donnée. * * @param string $cookie_prefix * Préfixe des cookies de SPIP **/ function recuperer_cookies_spip($cookie_prefix) { $prefix_long = strlen($cookie_prefix); foreach ($_COOKIE as $name => $value) { if (substr($name, 0, 5) == 'spip_' && substr($name, 0, $prefix_long) != $cookie_prefix) { unset($_COOKIE[$name]); unset($GLOBALS[$name]); } } foreach ($_COOKIE as $name => $value) { if (substr($name, 0, $prefix_long) == $cookie_prefix) { $spipname = preg_replace('/^' . $cookie_prefix . '_/', 'spip_', $name); $_COOKIE[$spipname] = $value; $GLOBALS[$spipname] = $value; } } } /** * Teste si javascript est supporté par le navigateur et pose un cookie en conséquence * * Si la valeur d'environnement `js` arrive avec la valeur * * - `-1` c'est un appel via une balise `<noscript>`. * - `1` c'est un appel via javascript * * Inscrit le résultat dans le cookie `spip_accepte_ajax` * * @see html_tests_js() * @uses spip_setcookie() * **/ function exec_test_ajax_dist() { switch (_request('js')) { // on est appele par <noscript> case -1: spip_setcookie('spip_accepte_ajax', -1); include_spip('inc/headers'); redirige_par_entete(chemin_image('erreur-xx.svg')); break; // ou par ajax case 1: default: spip_setcookie('spip_accepte_ajax', 1); break; } }