Completed
Push — master ( 8cc67b...607ad1 )
by cam
04:24
created

cookie.php ➔ spip_setcookie()   F

Complexity

Conditions 19
Paths 2040

Size

Total Lines 58

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 19
nc 2040
nop 3
dl 0
loc 58
rs 0.3499
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/***************************************************************************\
4
 *  SPIP, Systeme de publication pour l'internet                           *
5
 *                                                                         *
6
 *  Copyright (c) 2001-2019                                                *
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 array $options
35
 *     Tableau clé => valeur de l’option
36
 *     - expires = 0 : Date d'expiration du cookie (timestamp)
37
 *     - path = 'AUTO' : Chemin sur lequel le cookie sera disponible
38
 *     - domain = '' : Domaine à partir duquel le cookie est disponible
39
 *     - secure = false : cookie sécurisé ou non ?
40
 *     - samesite = 'Lax' : valeur samesite (Lax, Strict ou None)
41
 * @return bool
42
 *     true si le cookie a été posé, false sinon.
43
 * 
44
 * @note Anciens paramètres (à la place de $options) (pour rétrocompatibilité)
45
 *   param int $expire
46
 *     Date d'expiration du cookie (timestamp)
47
 *   param string $path
48
 *     Chemin sur lequel le cookie sera disponible
49
 *   param string $domain
50
 *     Domaine à partir duquel le cookie est disponible
51
 *   param bool $secure
52
 *     cookie sécurisé ou non ?
53
 **/
54
function spip_setcookie($name = '', $value = '', $options = []) {
55
	static $to_secure_list = ['spip_session'];
56
57
	if (!is_array($options)) {
58
		// anciens paramètres :
59
		# spip_setcookie($name = '', $value = '', $expire = 0, $path = 'AUTO', $domain = '', $secure = '')
60
		$opt = func_get_args();
61
		$opt = array_slice($opt, 2);
62
		$options = []; # /!\ après le func_get_args (sinon $opt[0] référence la nouvelle valeur de $options !);
63
		if (isset($opt[0])) {
64
			$options['expires'] = $opt[0];
65
		}
66
		if (isset($opt[1])) {
67
			$options['path'] = $opt[1];
68
		}
69
		if (isset($opt[2])) {
70
			$options['domain'] = $opt[2];
71
		}
72
		if (isset($opt[3])) {
73
			$options['secure'] = $opt[3];
74
		}
75
	}
76
77
	$name = preg_replace('/^spip_/', $GLOBALS['cookie_prefix'] . '_', $name);
78
79
	// expires
80
	if (!isset($options['expires'])) {
81
		$options['expires'] = 0;
82
	}
83
	if (!isset($options['path']) or $options['path'] === 'AUTO') {
84
		if (defined('_COOKIE_PATH')) {
85
			$options['path'] = _COOKIE_PATH;
86
		} else {
87
			$options['path'] = preg_replace(',^\w+://[^/]*,', '', url_de_base());
88
		}
89
	}
90
	if (empty($options['domain']) and defined('_COOKIE_DOMAIN') and _COOKIE_DOMAIN) {
91
		$options['domain'] = _COOKIE_DOMAIN;
92
	}
93
	if (in_array($name, $to_secure_list)) {
94
		if (empty($options['secure']) and defined('_COOKIE_SECURE') and _COOKIE_SECURE) {
95
			$options['secure'] = true;
96
		}
97
		if (empty($options['httponly'])) {
98
			$options['httponly'] = true;
99
		}
100
	}
101
	if (empty($options['samesite'])) {
102
		$options['samesite'] = 'Lax';
103
	}
104
105
	#spip_log("cookie('$name', '$value', " . json_encode($options, true) . ")", "cookies");
106
	$a = @setcookie($name, $value, $options);
107
108
	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...
109
110
	return $a;
111
}
112
113
/**
114
 * Teste si un cookie a déjà été envoyé ou pas
115
 *
116
 * Permet par exemple à `redirige_par_entete()` de savoir le type de
117
 * redirection à appliquer (serveur ou navigateur)
118
 *
119
 * @see redirige_par_entete()
120
 *
121
 * @param bool|string $set
122
 *     true pour déclarer les cookies comme envoyés
123
 * @return bool
124
 **/
125
function spip_cookie_envoye($set = '') {
126
	static $envoye = false;
127
	if ($set) {
128
		$envoye = true;
129
	}
130
131
	return $envoye;
132
}
133
134
/**
135
 * Adapte le tableau PHP `$_COOKIE` pour prendre en compte le préfixe
136
 * des cookies de SPIP
137
 *
138
 * Si le préfixe des cookies de SPIP est différent de `spip_` alors
139
 * la fonction modifie les `$_COOKIE` ayant le préfixe spécifique
140
 * pour remettre le préfixe `spip_` à la place.
141
 *
142
 * Ainsi les appels dans le code n'ont pas besoin de gérer le préfixe,
143
 * ils appellent simplement `$_COOKIE['spip_xx']` qui sera forcément
144
 * la bonne donnée.
145
 *
146
 * @param string $cookie_prefix
147
 *     Préfixe des cookies de SPIP
148
 **/
149
function recuperer_cookies_spip($cookie_prefix) {
150
	$prefix_long = strlen($cookie_prefix);
151
152
	foreach ($_COOKIE as $name => $value) {
153
		if (substr($name, 0, 5) == 'spip_' && substr($name, 0, $prefix_long) != $cookie_prefix) {
154
			unset($_COOKIE[$name]);
155
			unset($GLOBALS[$name]);
156
		}
157
	}
158
	foreach ($_COOKIE as $name => $value) {
159
		if (substr($name, 0, $prefix_long) == $cookie_prefix) {
160
			$spipname = preg_replace('/^' . $cookie_prefix . '_/', 'spip_', $name);
161
			$_COOKIE[$spipname] = $value;
162
			$GLOBALS[$spipname] = $value;
163
		}
164
	}
165
166
}
167
168
169
/**
170
 * Teste si javascript est supporté par le navigateur et pose un cookie en conséquence
171
 *
172
 * Si la valeur d'environnement `js` arrive avec la valeur
173
 *
174
 * - `-1` c'est un appel via une balise `<noscript>`.
175
 * - `1` c'est un appel via javascript
176
 *
177
 * Inscrit le résultat dans le cookie `spip_accepte_ajax`
178
 *
179
 * @see  html_tests_js()
180
 * @uses spip_setcookie()
181
 *
182
 **/
183
function exec_test_ajax_dist() {
184
	switch (_request('js')) {
185
		// on est appele par <noscript>
186
		case -1:
187
			spip_setcookie('spip_accepte_ajax', -1);
188
			include_spip('inc/headers');
189
			redirige_par_entete(chemin_image('puce-orange-anim.gif'));
190
			break;
191
192
		// ou par ajax
193
		case 1:
194
		default:
195
			spip_setcookie('spip_accepte_ajax', 1);
196
			break;
197
	}
198
}
199