Completed
Push — master ( 1a3b2f...b50fb4 )
by cam
09:59
created

cookie.php ➔ recuperer_cookies_spip()   A

Complexity

Conditions 6
Paths 9

Size

Total Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
nc 9
nop 1
dl 0
loc 18
rs 9.0444
c 0
b 0
f 0
1
<?php
2
3
/***************************************************************************\
4
 *  SPIP, Systeme de publication pour l'internet                           *
5
 *                                                                         *
6
 *  Copyright (c) 2001-2018                                                *
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
0 ignored issues
show
Documentation introduced by
Should the type for parameter $secure not be string|boolean?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
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);
0 ignored issues
show
Unused Code introduced by
The call to the function spip_cookie_envoye() seems unnecessary as the function has no side-effects.
Loading history...
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
}
165