c8bc343d8e023aca545983d719a15627a66d101a
[lhc/web/www.git] / www / ecrire / inc / cookie.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2017 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 /**
14 * Gestion des cookies
15 *
16 * @package SPIP\Core\Cookies
17 **/
18
19 if (!defined('_ECRIRE_INC_VERSION')) {
20 return;
21 }
22
23
24 /**
25 * Place un cookie (préfixé) sur le poste client
26 *
27 * @global cookie_prefix Préfixe de cookie défini
28 * @link http://fr.php.net/setcookie
29 *
30 * @param string $name
31 * Nom du cookie
32 * @param string $value
33 * Valeur à stocker
34 * @param int $expire
35 * Date d'expiration du cookie (timestamp)
36 * @param string $path
37 * Chemin sur lequel le cookie sera disponible
38 * @param string $domain
39 * Domaine à partir duquel le cookie est disponible
40 * @param bool $secure
41 * cookie sécurisé ou non ?
42 * @return bool
43 * true si le cookie a été posé, false sinon.
44 **/
45 function spip_setcookie($name = '', $value = '', $expire = 0, $path = 'AUTO', $domain = '', $secure = '') {
46 // liste des cookies en httponly (a passer en define si besoin)
47 $httponly = in_array($name, explode(' ', 'spip_session'));
48
49 $name = preg_replace('/^spip_/', $GLOBALS['cookie_prefix'] . '_', $name);
50 if ($path == 'AUTO') {
51 $path = defined('_COOKIE_PATH') ? _COOKIE_PATH : preg_replace(',^\w+://[^/]*,', '', url_de_base());
52 }
53 if (!$domain and defined('_COOKIE_DOMAIN')) {
54 $domain = _COOKIE_DOMAIN;
55 }
56
57 #spip_log("cookie('$name', '$value', '$expire', '$path', '$domain', '$secure', '$httponly'");
58
59 $a =
60 $httponly ?
61 @setcookie($name, $value, $expire, $path, $domain, $secure, $httponly)
62 : ($secure ?
63 @setcookie($name, $value, $expire, $path, $domain, $secure)
64 : ($domain ?
65 @setcookie($name, $value, $expire, $path, $domain)
66 : ($path ?
67 @setcookie($name, $value, $expire, $path)
68 : ($expire ?
69 @setcookie($name, $value, $expire)
70 :
71 @setcookie($name, $value)
72 ))));
73
74 spip_cookie_envoye(true);
75
76 return $a;
77 }
78
79 /**
80 * Teste si un cookie a déjà été envoyé ou pas
81 *
82 * Permet par exemple à `redirige_par_entete()` de savoir le type de
83 * redirection à appliquer (serveur ou navigateur)
84 *
85 * @see redirige_par_entete()
86 *
87 * @param bool|string $set
88 * true pour déclarer les cookies comme envoyés
89 * @return bool
90 **/
91 function spip_cookie_envoye($set = '') {
92 static $envoye = false;
93 if ($set) {
94 $envoye = true;
95 }
96
97 return $envoye;
98 }
99
100 /**
101 * Adapte le tableau PHP `$_COOKIE` pour prendre en compte le préfixe
102 * des cookies de SPIP
103 *
104 * Si le préfixe des cookies de SPIP est différent de `spip_` alors
105 * la fonction modifie les `$_COOKIE` ayant le préfixe spécifique
106 * pour remettre le préfixe `spip_` à la place.
107 *
108 * Ainsi les appels dans le code n'ont pas besoin de gérer le préfixe,
109 * ils appellent simplement `$_COOKIE['spip_xx']` qui sera forcément
110 * la bonne donnée.
111 *
112 * @param string $cookie_prefix
113 * Préfixe des cookies de SPIP
114 **/
115 function recuperer_cookies_spip($cookie_prefix) {
116 $prefix_long = strlen($cookie_prefix);
117
118 foreach ($_COOKIE as $name => $value) {
119 if (substr($name, 0, 5) == 'spip_' && substr($name, 0, $prefix_long) != $cookie_prefix) {
120 unset($_COOKIE[$name]);
121 unset($GLOBALS[$name]);
122 }
123 }
124 foreach ($_COOKIE as $name => $value) {
125 if (substr($name, 0, $prefix_long) == $cookie_prefix) {
126 $spipname = preg_replace('/^' . $cookie_prefix . '_/', 'spip_', $name);
127 $_COOKIE[$spipname] = $value;
128 $GLOBALS[$spipname] = $value;
129 }
130 }
131
132 }
133
134
135 /**
136 * Teste si javascript est supporté par le navigateur et pose un cookie en conséquence
137 *
138 * Si la valeur d'environnement `js` arrive avec la valeur
139 *
140 * - `-1` c'est un appel via une balise `<noscript>`.
141 * - `1` c'est un appel via javascript
142 *
143 * Inscrit le résultat dans le cookie `spip_accepte_ajax`
144 *
145 * @see html_tests_js()
146 * @uses spip_setcookie()
147 *
148 **/
149 function exec_test_ajax_dist() {
150 switch (_request('js')) {
151 // on est appele par <noscript>
152 case -1:
153 spip_setcookie('spip_accepte_ajax', -1);
154 include_spip('inc/headers');
155 redirige_par_entete(chemin_image('puce-orange-anim.gif'));
156 break;
157
158 // ou par ajax
159 case 1:
160 default:
161 spip_setcookie('spip_accepte_ajax', 1);
162 break;
163 }
164 }