Completed
Push — master ( 72d0e2...cf43de )
by cam
01:25
created
ecrire/src/Chiffrer/SpipCles.php 2 patches
Indentation   +167 added lines, -167 removed lines patch added patch discarded remove patch
@@ -14,171 +14,171 @@
 block discarded – undo
14 14
 
15 15
 /** Gestion des clés d’authentification / chiffrement de SPIP */
16 16
 final class SpipCles {
17
-	private static array $instances = [];
18
-
19
-	private string $file = _DIR_ETC . 'cles.php';
20
-	private Cles $cles;
21
-
22
-	public static function instance(string $file = ''): self {
23
-		if (empty(self::$instances[$file])) {
24
-			self::$instances[$file] = new self($file);
25
-		}
26
-		return self::$instances[$file];
27
-	}
28
-
29
-	/**
30
-	 * Retourne le secret du site (shorthand)
31
-	 * @uses self::getSecretSite()
32
-	 */
33
-	public static function secret_du_site(): ?string {
34
-		return (self::instance())->getSecretSite();
35
-	}
36
-
37
-	private function __construct(string $file = '') {
38
-		if ($file) {
39
-			$this->file = $file;
40
-		}
41
-		$this->cles = new Cles($this->read());
42
-	}
43
-
44
-	/**
45
-	 * Renvoyer le secret du site
46
-	 *
47
-	 * Le secret du site doit rester aussi secret que possible, et est eternel
48
-	 * On ne doit pas l'exporter
49
-	 *
50
-	 * Le secret est partagé entre une clé disque et une clé bdd
51
-	 *
52
-	 * @return string
53
-	 */
54
-	public function getSecretSite(bool $autoInit = true): ?string {
55
-		$key = $this->getKey('secret_du_site', $autoInit);
56
-		$meta = $this->getMetaKey('secret_du_site', $autoInit);
57
-		// conserve la même longeur.
58
-		return $key ^ $meta;
59
-	}
60
-
61
-	/** Renvoyer le secret des authentifications */
62
-	public function getSecretAuth(bool $autoInit = false): ?string {
63
-		return $this->getKey('secret_des_auth', $autoInit);
64
-	}
65
-	public function save(): bool {
66
-		return ecrire_fichier_securise($this->file, $this->cles->toJson());
67
-	}
68
-
69
-	/**
70
-	 * Fournir une sauvegarde chiffree des cles (a l'aide d'une autre clé, comme le pass d'un auteur)
71
-	 *
72
-	 * @param string $withKey Clé de chiffrage de la sauvegarde
73
-	 * @return string Contenu de la sauvegarde chiffrée générée
74
-	 */
75
-	public function backup(
76
-		#[\SensitiveParameter]
77
-		string $withKey
78
-	): string {
79
-		if (count($this->cles)) {
80
-			return Chiffrement::chiffrer($this->cles->toJson(), $withKey);
81
-		}
82
-		return '';
83
-	}
84
-
85
-	/**
86
-	 * Restaurer les cles manquantes depuis une sauvegarde chiffree des cles
87
-	 * (si la sauvegarde est bien valide)
88
-	 *
89
-	 * @param string $backup Sauvegarde chiffrée (générée par backup())
90
-	 * @param int $id_auteur
91
-	 * @param string $pass
92
-	 * @return void
93
-	 */
94
-	public function restore(
95
-		string $backup,
96
-		#[\SensitiveParameter]
97
-		string $password_clair,
98
-		#[\SensitiveParameter]
99
-		string $password_hash,
100
-		int $id_auteur
101
-	): bool {
102
-		if (empty($backup)) {
103
-			return false;
104
-		}
105
-
106
-		$sauvegarde = Chiffrement::dechiffrer($backup, $password_clair);
107
-		$json = json_decode($sauvegarde, true);
108
-		if (!$json) {
109
-			return false;
110
-		}
111
-
112
-		// cela semble une sauvegarde valide
113
-		$cles_potentielles = array_map('base64_decode', $json);
114
-
115
-		// il faut faire une double verif sur secret_des_auth
116
-		// pour s'assurer qu'elle permet bien de decrypter le pass de l'auteur qui fournit la sauvegarde
117
-		// et par extension tous les passwords
118
-		if (!empty($cles_potentielles['secret_des_auth'])) {
119
-			if (!Password::verifier($password_clair, $password_hash, $cles_potentielles['secret_des_auth'])) {
120
-				spip_log("Restauration de la cle `secret_des_auth` par id_auteur $id_auteur erronnee, on ignore", 'chiffrer' . _LOG_INFO_IMPORTANTE);
121
-				unset($cles_potentielles['secret_des_auth']);
122
-			}
123
-		}
124
-
125
-		// on merge les cles pour recuperer les cles manquantes
126
-		$restauration = false;
127
-		foreach ($cles_potentielles as $name => $key) {
128
-			if (!$this->cles->has($name)) {
129
-				$this->cles->set($name, $key);
130
-				spip_log("Restauration de la cle $name par id_auteur $id_auteur", 'chiffrer' . _LOG_INFO_IMPORTANTE);
131
-				$restauration = true;
132
-			}
133
-		}
134
-		return $restauration;
135
-	}
136
-
137
-	private function getKey(string $name, bool $autoInit): ?string {
138
-		if ($this->cles->has($name)) {
139
-			return $this->cles->get($name);
140
-		}
141
-		if ($autoInit) {
142
-			$this->cles->generate($name);
143
-			// si l'ecriture de fichier a bien marche on peut utiliser la cle
144
-			if ($this->save()) {
145
-				return $this->cles->get($name);
146
-			}
147
-			// sinon loger et annule la cle generee car il ne faut pas l'utiliser
148
-			spip_log('Echec ecriture du fichier cle ' . $this->file . " ; impossible de generer une cle $name", 'chiffrer' . _LOG_ERREUR);
149
-			$this->cles->delete($name);
150
-		}
151
-		return null;
152
-	}
153
-
154
-	private function getMetaKey(string $name, bool $autoInit = true): ?string {
155
-		if (!isset($GLOBALS['meta'][$name])) {
156
-			include_spip('base/abstract_sql');
157
-			$GLOBALS['meta'][$name] = sql_getfetsel('valeur', 'spip_meta', 'nom = ' . sql_quote($name, '', 'string'));
158
-		}
159
-		$key = base64_decode($GLOBALS['meta'][$name] ?? '');
160
-		if (strlen($key) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
161
-			return $key;
162
-		}
163
-		if (!$autoInit) {
164
-			return null;
165
-		}
166
-		$key = Chiffrement::keygen();
167
-		ecrire_meta($name, base64_encode($key), 'non');
168
-		lire_metas(); // au cas ou ecrire_meta() ne fonctionne pas
169
-
170
-		return $key;
171
-	}
172
-
173
-	private function read(): array {
174
-		lire_fichier_securise($this->file, $json);
175
-		if (
176
-			$json
177
-			and $json = \json_decode($json, true)
178
-			and is_array($json)
179
-		) {
180
-			return array_map('base64_decode', $json);
181
-		}
182
-		return [];
183
-	}
17
+    private static array $instances = [];
18
+
19
+    private string $file = _DIR_ETC . 'cles.php';
20
+    private Cles $cles;
21
+
22
+    public static function instance(string $file = ''): self {
23
+        if (empty(self::$instances[$file])) {
24
+            self::$instances[$file] = new self($file);
25
+        }
26
+        return self::$instances[$file];
27
+    }
28
+
29
+    /**
30
+     * Retourne le secret du site (shorthand)
31
+     * @uses self::getSecretSite()
32
+     */
33
+    public static function secret_du_site(): ?string {
34
+        return (self::instance())->getSecretSite();
35
+    }
36
+
37
+    private function __construct(string $file = '') {
38
+        if ($file) {
39
+            $this->file = $file;
40
+        }
41
+        $this->cles = new Cles($this->read());
42
+    }
43
+
44
+    /**
45
+     * Renvoyer le secret du site
46
+     *
47
+     * Le secret du site doit rester aussi secret que possible, et est eternel
48
+     * On ne doit pas l'exporter
49
+     *
50
+     * Le secret est partagé entre une clé disque et une clé bdd
51
+     *
52
+     * @return string
53
+     */
54
+    public function getSecretSite(bool $autoInit = true): ?string {
55
+        $key = $this->getKey('secret_du_site', $autoInit);
56
+        $meta = $this->getMetaKey('secret_du_site', $autoInit);
57
+        // conserve la même longeur.
58
+        return $key ^ $meta;
59
+    }
60
+
61
+    /** Renvoyer le secret des authentifications */
62
+    public function getSecretAuth(bool $autoInit = false): ?string {
63
+        return $this->getKey('secret_des_auth', $autoInit);
64
+    }
65
+    public function save(): bool {
66
+        return ecrire_fichier_securise($this->file, $this->cles->toJson());
67
+    }
68
+
69
+    /**
70
+     * Fournir une sauvegarde chiffree des cles (a l'aide d'une autre clé, comme le pass d'un auteur)
71
+     *
72
+     * @param string $withKey Clé de chiffrage de la sauvegarde
73
+     * @return string Contenu de la sauvegarde chiffrée générée
74
+     */
75
+    public function backup(
76
+        #[\SensitiveParameter]
77
+        string $withKey
78
+    ): string {
79
+        if (count($this->cles)) {
80
+            return Chiffrement::chiffrer($this->cles->toJson(), $withKey);
81
+        }
82
+        return '';
83
+    }
84
+
85
+    /**
86
+     * Restaurer les cles manquantes depuis une sauvegarde chiffree des cles
87
+     * (si la sauvegarde est bien valide)
88
+     *
89
+     * @param string $backup Sauvegarde chiffrée (générée par backup())
90
+     * @param int $id_auteur
91
+     * @param string $pass
92
+     * @return void
93
+     */
94
+    public function restore(
95
+        string $backup,
96
+        #[\SensitiveParameter]
97
+        string $password_clair,
98
+        #[\SensitiveParameter]
99
+        string $password_hash,
100
+        int $id_auteur
101
+    ): bool {
102
+        if (empty($backup)) {
103
+            return false;
104
+        }
105
+
106
+        $sauvegarde = Chiffrement::dechiffrer($backup, $password_clair);
107
+        $json = json_decode($sauvegarde, true);
108
+        if (!$json) {
109
+            return false;
110
+        }
111
+
112
+        // cela semble une sauvegarde valide
113
+        $cles_potentielles = array_map('base64_decode', $json);
114
+
115
+        // il faut faire une double verif sur secret_des_auth
116
+        // pour s'assurer qu'elle permet bien de decrypter le pass de l'auteur qui fournit la sauvegarde
117
+        // et par extension tous les passwords
118
+        if (!empty($cles_potentielles['secret_des_auth'])) {
119
+            if (!Password::verifier($password_clair, $password_hash, $cles_potentielles['secret_des_auth'])) {
120
+                spip_log("Restauration de la cle `secret_des_auth` par id_auteur $id_auteur erronnee, on ignore", 'chiffrer' . _LOG_INFO_IMPORTANTE);
121
+                unset($cles_potentielles['secret_des_auth']);
122
+            }
123
+        }
124
+
125
+        // on merge les cles pour recuperer les cles manquantes
126
+        $restauration = false;
127
+        foreach ($cles_potentielles as $name => $key) {
128
+            if (!$this->cles->has($name)) {
129
+                $this->cles->set($name, $key);
130
+                spip_log("Restauration de la cle $name par id_auteur $id_auteur", 'chiffrer' . _LOG_INFO_IMPORTANTE);
131
+                $restauration = true;
132
+            }
133
+        }
134
+        return $restauration;
135
+    }
136
+
137
+    private function getKey(string $name, bool $autoInit): ?string {
138
+        if ($this->cles->has($name)) {
139
+            return $this->cles->get($name);
140
+        }
141
+        if ($autoInit) {
142
+            $this->cles->generate($name);
143
+            // si l'ecriture de fichier a bien marche on peut utiliser la cle
144
+            if ($this->save()) {
145
+                return $this->cles->get($name);
146
+            }
147
+            // sinon loger et annule la cle generee car il ne faut pas l'utiliser
148
+            spip_log('Echec ecriture du fichier cle ' . $this->file . " ; impossible de generer une cle $name", 'chiffrer' . _LOG_ERREUR);
149
+            $this->cles->delete($name);
150
+        }
151
+        return null;
152
+    }
153
+
154
+    private function getMetaKey(string $name, bool $autoInit = true): ?string {
155
+        if (!isset($GLOBALS['meta'][$name])) {
156
+            include_spip('base/abstract_sql');
157
+            $GLOBALS['meta'][$name] = sql_getfetsel('valeur', 'spip_meta', 'nom = ' . sql_quote($name, '', 'string'));
158
+        }
159
+        $key = base64_decode($GLOBALS['meta'][$name] ?? '');
160
+        if (strlen($key) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
161
+            return $key;
162
+        }
163
+        if (!$autoInit) {
164
+            return null;
165
+        }
166
+        $key = Chiffrement::keygen();
167
+        ecrire_meta($name, base64_encode($key), 'non');
168
+        lire_metas(); // au cas ou ecrire_meta() ne fonctionne pas
169
+
170
+        return $key;
171
+    }
172
+
173
+    private function read(): array {
174
+        lire_fichier_securise($this->file, $json);
175
+        if (
176
+            $json
177
+            and $json = \json_decode($json, true)
178
+            and is_array($json)
179
+        ) {
180
+            return array_map('base64_decode', $json);
181
+        }
182
+        return [];
183
+    }
184 184
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
 final class SpipCles {
17 17
 	private static array $instances = [];
18 18
 
19
-	private string $file = _DIR_ETC . 'cles.php';
19
+	private string $file = _DIR_ETC.'cles.php';
20 20
 	private Cles $cles;
21 21
 
22 22
 	public static function instance(string $file = ''): self {
@@ -117,7 +117,7 @@  discard block
 block discarded – undo
117 117
 		// et par extension tous les passwords
118 118
 		if (!empty($cles_potentielles['secret_des_auth'])) {
119 119
 			if (!Password::verifier($password_clair, $password_hash, $cles_potentielles['secret_des_auth'])) {
120
-				spip_log("Restauration de la cle `secret_des_auth` par id_auteur $id_auteur erronnee, on ignore", 'chiffrer' . _LOG_INFO_IMPORTANTE);
120
+				spip_log("Restauration de la cle `secret_des_auth` par id_auteur $id_auteur erronnee, on ignore", 'chiffrer'._LOG_INFO_IMPORTANTE);
121 121
 				unset($cles_potentielles['secret_des_auth']);
122 122
 			}
123 123
 		}
@@ -127,7 +127,7 @@  discard block
 block discarded – undo
127 127
 		foreach ($cles_potentielles as $name => $key) {
128 128
 			if (!$this->cles->has($name)) {
129 129
 				$this->cles->set($name, $key);
130
-				spip_log("Restauration de la cle $name par id_auteur $id_auteur", 'chiffrer' . _LOG_INFO_IMPORTANTE);
130
+				spip_log("Restauration de la cle $name par id_auteur $id_auteur", 'chiffrer'._LOG_INFO_IMPORTANTE);
131 131
 				$restauration = true;
132 132
 			}
133 133
 		}
@@ -145,7 +145,7 @@  discard block
 block discarded – undo
145 145
 				return $this->cles->get($name);
146 146
 			}
147 147
 			// sinon loger et annule la cle generee car il ne faut pas l'utiliser
148
-			spip_log('Echec ecriture du fichier cle ' . $this->file . " ; impossible de generer une cle $name", 'chiffrer' . _LOG_ERREUR);
148
+			spip_log('Echec ecriture du fichier cle '.$this->file." ; impossible de generer une cle $name", 'chiffrer'._LOG_ERREUR);
149 149
 			$this->cles->delete($name);
150 150
 		}
151 151
 		return null;
@@ -154,7 +154,7 @@  discard block
 block discarded – undo
154 154
 	private function getMetaKey(string $name, bool $autoInit = true): ?string {
155 155
 		if (!isset($GLOBALS['meta'][$name])) {
156 156
 			include_spip('base/abstract_sql');
157
-			$GLOBALS['meta'][$name] = sql_getfetsel('valeur', 'spip_meta', 'nom = ' . sql_quote($name, '', 'string'));
157
+			$GLOBALS['meta'][$name] = sql_getfetsel('valeur', 'spip_meta', 'nom = '.sql_quote($name, '', 'string'));
158 158
 		}
159 159
 		$key = base64_decode($GLOBALS['meta'][$name] ?? '');
160 160
 		if (strlen($key) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
Please login to merge, or discard this patch.
ecrire/inc/modifier.php 2 patches
Spacing   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -113,7 +113,7 @@  discard block
 block discarded – undo
113 113
 
114 114
 	// Appels incomplets (sans $c)
115 115
 	if (!is_array($c)) {
116
-		spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c');
116
+		spip_log('erreur appel objet_modifier_champs('.$objet.'), manque $c');
117 117
 
118 118
 		return _T('erreur_technique_enregistrement_impossible');
119 119
 	}
@@ -140,7 +140,7 @@  discard block
 block discarded – undo
140 140
 	// N'accepter que les champs qui existent dans la table
141 141
 	$champs = array_intersect_key($c, $desc['field']);
142 142
 	// et dont la valeur n'est pas null
143
-	$champs = array_filter($champs, static function ($var) {
143
+	$champs = array_filter($champs, static function($var) {
144 144
 		return $var !== null;
145 145
 	});
146 146
 	// TODO: ici aussi on peut valider les contenus
@@ -150,7 +150,7 @@  discard block
 block discarded – undo
150 150
 	$champs = array_map('corriger_caracteres', $champs);
151 151
 
152 152
 	// On récupère l'état avant toute modification
153
-	$row = sql_fetsel('*', $spip_table_objet, $id_table_objet . '=' . $id_objet);
153
+	$row = sql_fetsel('*', $spip_table_objet, $id_table_objet.'='.$id_objet);
154 154
 
155 155
 	// Envoyer aux plugins
156 156
 	$champs = pipeline(
@@ -205,7 +205,7 @@  discard block
 block discarded – undo
205 205
 				$id_rubrique = 0;
206 206
 				if (isset($desc['field']['id_rubrique'])) {
207 207
 					$parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique';
208
-					$id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet));
208
+					$id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=".intval($id_objet));
209 209
 				}
210 210
 				$instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action');
211 211
 				$champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur);
@@ -227,13 +227,13 @@  discard block
 block discarded – undo
227 227
 		}
228 228
 
229 229
 		// allez on commit la modif
230
-		sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), [], $serveur);
230
+		sql_updateq($spip_table_objet, $champs, "$id_table_objet=".intval($id_objet), [], $serveur);
231 231
 
232 232
 		// on verifie si elle est bien passee
233 233
 		$moof = sql_fetsel(
234 234
 			array_keys($champs),
235 235
 			$spip_table_objet,
236
-			"$id_table_objet=" . intval($id_objet),
236
+			"$id_table_objet=".intval($id_objet),
237 237
 			[],
238 238
 			[],
239 239
 			'',
@@ -269,13 +269,13 @@  discard block
 block discarded – undo
269 269
 			// c'est un cas exceptionnel
270 270
 			if (count($liste)) {
271 271
 				spip_log(
272
-					"Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true),
273
-					'modifier.' . _LOG_CRITIQUE
272
+					"Erreur enregistrement en base $objet/$id_objet champs :".var_export($conflits, true),
273
+					'modifier.'._LOG_CRITIQUE
274 274
 				);
275 275
 
276 276
 				return _T(
277 277
 					'erreur_technique_enregistrement_champs',
278
-					['champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"]
278
+					['champs' => "<i>'".implode("'</i>,<i>'", $liste)."'</i>"]
279 279
 				);
280 280
 			}
281 281
 		}
@@ -317,18 +317,18 @@  discard block
 block discarded – undo
317 317
 	include_spip('inc/filtres_mini');
318 318
 	$qui = '';
319 319
 	if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
320
-		$qui .= ' #id_auteur:' . $GLOBALS['visiteur_session']['id_auteur'] . '#';
320
+		$qui .= ' #id_auteur:'.$GLOBALS['visiteur_session']['id_auteur'].'#';
321 321
 	}
322 322
 	if (!empty($GLOBALS['visiteur_session']['nom'])) {
323
-		$qui .= ' #nom:' . $GLOBALS['visiteur_session']['nom'] . '#';
323
+		$qui .= ' #nom:'.$GLOBALS['visiteur_session']['nom'].'#';
324 324
 	}
325 325
 	if ($qui == '') {
326
-		$qui = '#ip:' . $GLOBALS['ip'] . '#';
326
+		$qui = '#ip:'.$GLOBALS['ip'].'#';
327 327
 	}
328
-	journal(_L($qui . ' a édité ' . $objet . ' ' . $id_objet . ' (' . join(
328
+	journal(_L($qui.' a édité '.$objet.' '.$id_objet.' ('.join(
329 329
 		'+',
330 330
 		array_diff(array_keys($champs), ['date_modif'])
331
-	) . ')'), [
331
+	).')'), [
332 332
 		'faire' => 'modifier',
333 333
 		'quoi' => $objet,
334 334
 		'id' => $id_objet
Please login to merge, or discard this patch.
Indentation   +280 added lines, -280 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -39,28 +39,28 @@  discard block
 block discarded – undo
39 39
  *     Tableau des champs et valeurs collectées
40 40
  */
41 41
 function collecter_requests($include_list, $exclude_list = [], $set = null, $tous = false) {
42
-	$c = $set;
43
-	if (!$c) {
44
-		$c = [];
45
-		foreach ($include_list as $champ) {
46
-			// on ne collecte que les champs reellement envoyes par defaut.
47
-			// le cas d'un envoi de valeur NULL peut du coup poser probleme.
48
-			$val = _request($champ);
49
-			if ($tous or $val !== null) {
50
-				$c[$champ] = $val;
51
-			}
52
-		}
53
-		// on ajoute toujours la lang en saisie possible
54
-		// meme si pas prevu au depart pour l'objet concerne
55
-		if ($l = _request('changer_lang')) {
56
-			$c['lang'] = $l;
57
-		}
58
-	}
59
-	foreach ($exclude_list as $champ) {
60
-		unset($c[$champ]);
61
-	}
62
-
63
-	return $c;
42
+    $c = $set;
43
+    if (!$c) {
44
+        $c = [];
45
+        foreach ($include_list as $champ) {
46
+            // on ne collecte que les champs reellement envoyes par defaut.
47
+            // le cas d'un envoi de valeur NULL peut du coup poser probleme.
48
+            $val = _request($champ);
49
+            if ($tous or $val !== null) {
50
+                $c[$champ] = $val;
51
+            }
52
+        }
53
+        // on ajoute toujours la lang en saisie possible
54
+        // meme si pas prevu au depart pour l'objet concerne
55
+        if ($l = _request('changer_lang')) {
56
+            $c['lang'] = $l;
57
+        }
58
+    }
59
+    foreach ($exclude_list as $champ) {
60
+        unset($c[$champ]);
61
+    }
62
+
63
+    return $c;
64 64
 }
65 65
 
66 66
 /**
@@ -97,262 +97,262 @@  discard block
 block discarded – undo
97 97
  *     - chaîne : texte d'un message d'erreur
98 98
  */
99 99
 function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur = '') {
100
-	if (!$id_objet = intval($id_objet)) {
101
-		spip_log('Erreur $id_objet non defini', 'warn');
102
-
103
-		return _T('erreur_technique_enregistrement_impossible');
104
-	}
105
-
106
-	include_spip('inc/filtres');
107
-
108
-	$table_objet = table_objet($objet, $serveur);
109
-	$spip_table_objet = table_objet_sql($objet, $serveur);
110
-	$id_table_objet = id_table_objet($objet, $serveur);
111
-	$trouver_table = charger_fonction('trouver_table', 'base');
112
-	$desc = $trouver_table($spip_table_objet, $serveur);
113
-
114
-	// Appels incomplets (sans $c)
115
-	if (!is_array($c)) {
116
-		spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c');
117
-
118
-		return _T('erreur_technique_enregistrement_impossible');
119
-	}
120
-
121
-	// Securite : certaines variables ne sont jamais acceptees ici
122
-	// car elles ne relevent pas de autoriser(xxx, modifier) ;
123
-	// il faut passer par instituer_XX()
124
-	// TODO: faut-il passer ces variables interdites
125
-	// dans un fichier de description separe ?
126
-	unset($c['statut']);
127
-	unset($c['id_parent']);
128
-	unset($c['id_rubrique']);
129
-	unset($c['id_secteur']);
130
-
131
-	// Gerer les champs non vides
132
-	if (isset($options['nonvide']) and is_array($options['nonvide'])) {
133
-		foreach ($options['nonvide'] as $champ => $sinon) {
134
-			if (isset($c[$champ]) and $c[$champ] === '') {
135
-				$c[$champ] = $sinon;
136
-			}
137
-		}
138
-	}
139
-
140
-	// N'accepter que les champs qui existent dans la table
141
-	$champs = array_intersect_key($c, $desc['field']);
142
-	// et dont la valeur n'est pas null
143
-	$champs = array_filter($champs, static function ($var) {
144
-		return $var !== null;
145
-	});
146
-	// TODO: ici aussi on peut valider les contenus
147
-	// en fonction du type
148
-
149
-	// Nettoyer les valeurs
150
-	$champs = array_map('corriger_caracteres', $champs);
151
-
152
-	// On récupère l'état avant toute modification
153
-	$row = sql_fetsel('*', $spip_table_objet, $id_table_objet . '=' . $id_objet);
154
-
155
-	// Envoyer aux plugins
156
-	$champs = pipeline(
157
-		'pre_edition',
158
-		[
159
-			'args' => [
160
-				'table' => $spip_table_objet, // compatibilite
161
-				'table_objet' => $table_objet,
162
-				'spip_table_objet' => $spip_table_objet,
163
-				'desc' => $desc,
164
-				'type' => $objet,
165
-				'id_objet' => $id_objet,
166
-				'data' => $options['data'] ?? null,
167
-				'champs' => $options['champs'] ?? [], // [doc] c'est quoi ?
168
-				'champs_anciens' => $row, // état du contenu avant modif
169
-				'serveur' => $serveur,
170
-				'action' => $options['action'] ?? 'modifier'
171
-			],
172
-			'data' => $champs
173
-		]
174
-	);
175
-
176
-	if (!$champs) {
177
-		return false;
178
-	}
179
-
180
-
181
-	// marquer le fait que l'objet est travaille par toto a telle date
182
-	include_spip('inc/config');
183
-	if (lire_config('articles_modif', 'non') !== 'non') {
184
-		include_spip('inc/drapeau_edition');
185
-		signale_edition($id_objet, $GLOBALS['visiteur_session'], $objet);
186
-	}
187
-
188
-	// Verifier si les mises a jour sont pertinentes, datees, en conflit etc
189
-	include_spip('inc/editer');
190
-	if (!isset($options['data']) or is_null($options['data'])) {
191
-		$options['data'] = &$_POST;
192
-	}
193
-	$conflits = controler_md5($champs, $options['data'], $objet, $id_objet, $serveur);
194
-	// cas hypothetique : normalement inc/editer verifie en amont le conflit edition
195
-	// et gere l'interface
196
-	// ici on ne renvoie donc qu'un messsage d'erreur, au cas ou on y arrive quand meme
197
-	if ($conflits) {
198
-		return _T('titre_conflit_edition');
199
-	}
200
-
201
-	if ($champs) {
202
-		// cas particulier de la langue : passer par instituer_langue_objet
203
-		if (isset($champs['lang'])) {
204
-			if ($changer_lang = $champs['lang']) {
205
-				$id_rubrique = 0;
206
-				if (isset($desc['field']['id_rubrique'])) {
207
-					$parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique';
208
-					$id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet));
209
-				}
210
-				$instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action');
211
-				$champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur);
212
-			}
213
-			// on laisse 'lang' dans $champs,
214
-			// ca permet de passer dans le pipeline post_edition et de journaliser
215
-			// et ca ne gene pas qu'on refasse un sql_updateq dessus apres l'avoir
216
-			// deja pris en compte
217
-		}
218
-
219
-		// la modif peut avoir lieu
220
-
221
-		// faut-il ajouter date_modif ?
222
-		if (
223
-			!empty($options['date_modif'])
224
-			and !isset($champs[$options['date_modif']])
225
-		) {
226
-			$champs[$options['date_modif']] = date('Y-m-d H:i:s');
227
-		}
228
-
229
-		// allez on commit la modif
230
-		sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), [], $serveur);
231
-
232
-		// on verifie si elle est bien passee
233
-		$moof = sql_fetsel(
234
-			array_keys($champs),
235
-			$spip_table_objet,
236
-			"$id_table_objet=" . intval($id_objet),
237
-			[],
238
-			[],
239
-			'',
240
-			[],
241
-			$serveur
242
-		);
243
-		// si difference entre les champs, reperer les champs mal enregistres
244
-		if ($moof != $champs) {
245
-			$liste = [];
246
-			foreach ($moof as $k => $v) {
247
-				if (
248
-					$v !== $champs[$k]
249
-					// ne pas alerter si le champ est numerique est que les valeurs sont equivalentes
250
-					and (!is_numeric($v) or intval($v) !== intval($champs[$k]))
251
-					// ne pas alerter si le champ est date, qu'on a envoye une valeur vide et qu'on recupere une date nulle
252
-					and (strlen($champs[$k]) or !in_array($v, ['0000-00-00 00:00:00', '0000-00-00']))
253
-				) {
254
-					$liste[] = $k;
255
-					$conflits[$k]['post'] = $champs[$k];
256
-					$conflits[$k]['save'] = $v;
257
-
258
-					// cas specifique MySQL+emoji : si l'un est la
259
-					// conversion utf8_noplanes de l'autre alors c'est OK
260
-					if (defined('_MYSQL_NOPLANES') && _MYSQL_NOPLANES) {
261
-						include_spip('inc/charsets');
262
-						if ($v == utf8_noplanes($champs[$k])) {
263
-							array_pop($liste);
264
-						}
265
-					}
266
-				}
267
-			}
268
-			// si un champ n'a pas ete correctement enregistre, loger et retourner une erreur
269
-			// c'est un cas exceptionnel
270
-			if (count($liste)) {
271
-				spip_log(
272
-					"Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true),
273
-					'modifier.' . _LOG_CRITIQUE
274
-				);
275
-
276
-				return _T(
277
-					'erreur_technique_enregistrement_champs',
278
-					['champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"]
279
-				);
280
-			}
281
-		}
282
-
283
-		// Invalider les caches
284
-		if (isset($options['invalideur']) and $options['invalideur']) {
285
-			include_spip('inc/invalideur');
286
-			if (is_array($options['invalideur'])) {
287
-				array_map('suivre_invalideur', $options['invalideur']);
288
-			} else {
289
-				suivre_invalideur($options['invalideur']);
290
-			}
291
-		}
292
-
293
-		// Notifications, gestion des revisions...
294
-		// en standard, appelle |nouvelle_revision ci-dessous
295
-		pipeline(
296
-			'post_edition',
297
-			[
298
-				'args' => [
299
-					'table' => $spip_table_objet,
300
-					'table_objet' => $table_objet,
301
-					'spip_table_objet' => $spip_table_objet,
302
-					'desc' => $desc,
303
-					'type' => $objet,
304
-					'id_objet' => $id_objet,
305
-					'champs' => $options['champs'] ?? [], // [doc] kesako ?
306
-					'champs_anciens' => $row, // état du contenu avant modif
307
-					'serveur' => $serveur,
308
-					'action' => $options['action'] ?? 'modifier'
309
-				],
310
-				'data' => $champs
311
-			]
312
-		);
313
-	}
100
+    if (!$id_objet = intval($id_objet)) {
101
+        spip_log('Erreur $id_objet non defini', 'warn');
102
+
103
+        return _T('erreur_technique_enregistrement_impossible');
104
+    }
105
+
106
+    include_spip('inc/filtres');
107
+
108
+    $table_objet = table_objet($objet, $serveur);
109
+    $spip_table_objet = table_objet_sql($objet, $serveur);
110
+    $id_table_objet = id_table_objet($objet, $serveur);
111
+    $trouver_table = charger_fonction('trouver_table', 'base');
112
+    $desc = $trouver_table($spip_table_objet, $serveur);
113
+
114
+    // Appels incomplets (sans $c)
115
+    if (!is_array($c)) {
116
+        spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c');
117
+
118
+        return _T('erreur_technique_enregistrement_impossible');
119
+    }
120
+
121
+    // Securite : certaines variables ne sont jamais acceptees ici
122
+    // car elles ne relevent pas de autoriser(xxx, modifier) ;
123
+    // il faut passer par instituer_XX()
124
+    // TODO: faut-il passer ces variables interdites
125
+    // dans un fichier de description separe ?
126
+    unset($c['statut']);
127
+    unset($c['id_parent']);
128
+    unset($c['id_rubrique']);
129
+    unset($c['id_secteur']);
130
+
131
+    // Gerer les champs non vides
132
+    if (isset($options['nonvide']) and is_array($options['nonvide'])) {
133
+        foreach ($options['nonvide'] as $champ => $sinon) {
134
+            if (isset($c[$champ]) and $c[$champ] === '') {
135
+                $c[$champ] = $sinon;
136
+            }
137
+        }
138
+    }
139
+
140
+    // N'accepter que les champs qui existent dans la table
141
+    $champs = array_intersect_key($c, $desc['field']);
142
+    // et dont la valeur n'est pas null
143
+    $champs = array_filter($champs, static function ($var) {
144
+        return $var !== null;
145
+    });
146
+    // TODO: ici aussi on peut valider les contenus
147
+    // en fonction du type
148
+
149
+    // Nettoyer les valeurs
150
+    $champs = array_map('corriger_caracteres', $champs);
151
+
152
+    // On récupère l'état avant toute modification
153
+    $row = sql_fetsel('*', $spip_table_objet, $id_table_objet . '=' . $id_objet);
154
+
155
+    // Envoyer aux plugins
156
+    $champs = pipeline(
157
+        'pre_edition',
158
+        [
159
+            'args' => [
160
+                'table' => $spip_table_objet, // compatibilite
161
+                'table_objet' => $table_objet,
162
+                'spip_table_objet' => $spip_table_objet,
163
+                'desc' => $desc,
164
+                'type' => $objet,
165
+                'id_objet' => $id_objet,
166
+                'data' => $options['data'] ?? null,
167
+                'champs' => $options['champs'] ?? [], // [doc] c'est quoi ?
168
+                'champs_anciens' => $row, // état du contenu avant modif
169
+                'serveur' => $serveur,
170
+                'action' => $options['action'] ?? 'modifier'
171
+            ],
172
+            'data' => $champs
173
+        ]
174
+    );
175
+
176
+    if (!$champs) {
177
+        return false;
178
+    }
179
+
180
+
181
+    // marquer le fait que l'objet est travaille par toto a telle date
182
+    include_spip('inc/config');
183
+    if (lire_config('articles_modif', 'non') !== 'non') {
184
+        include_spip('inc/drapeau_edition');
185
+        signale_edition($id_objet, $GLOBALS['visiteur_session'], $objet);
186
+    }
187
+
188
+    // Verifier si les mises a jour sont pertinentes, datees, en conflit etc
189
+    include_spip('inc/editer');
190
+    if (!isset($options['data']) or is_null($options['data'])) {
191
+        $options['data'] = &$_POST;
192
+    }
193
+    $conflits = controler_md5($champs, $options['data'], $objet, $id_objet, $serveur);
194
+    // cas hypothetique : normalement inc/editer verifie en amont le conflit edition
195
+    // et gere l'interface
196
+    // ici on ne renvoie donc qu'un messsage d'erreur, au cas ou on y arrive quand meme
197
+    if ($conflits) {
198
+        return _T('titre_conflit_edition');
199
+    }
200
+
201
+    if ($champs) {
202
+        // cas particulier de la langue : passer par instituer_langue_objet
203
+        if (isset($champs['lang'])) {
204
+            if ($changer_lang = $champs['lang']) {
205
+                $id_rubrique = 0;
206
+                if (isset($desc['field']['id_rubrique'])) {
207
+                    $parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique';
208
+                    $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet));
209
+                }
210
+                $instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action');
211
+                $champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur);
212
+            }
213
+            // on laisse 'lang' dans $champs,
214
+            // ca permet de passer dans le pipeline post_edition et de journaliser
215
+            // et ca ne gene pas qu'on refasse un sql_updateq dessus apres l'avoir
216
+            // deja pris en compte
217
+        }
218
+
219
+        // la modif peut avoir lieu
220
+
221
+        // faut-il ajouter date_modif ?
222
+        if (
223
+            !empty($options['date_modif'])
224
+            and !isset($champs[$options['date_modif']])
225
+        ) {
226
+            $champs[$options['date_modif']] = date('Y-m-d H:i:s');
227
+        }
228
+
229
+        // allez on commit la modif
230
+        sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), [], $serveur);
231
+
232
+        // on verifie si elle est bien passee
233
+        $moof = sql_fetsel(
234
+            array_keys($champs),
235
+            $spip_table_objet,
236
+            "$id_table_objet=" . intval($id_objet),
237
+            [],
238
+            [],
239
+            '',
240
+            [],
241
+            $serveur
242
+        );
243
+        // si difference entre les champs, reperer les champs mal enregistres
244
+        if ($moof != $champs) {
245
+            $liste = [];
246
+            foreach ($moof as $k => $v) {
247
+                if (
248
+                    $v !== $champs[$k]
249
+                    // ne pas alerter si le champ est numerique est que les valeurs sont equivalentes
250
+                    and (!is_numeric($v) or intval($v) !== intval($champs[$k]))
251
+                    // ne pas alerter si le champ est date, qu'on a envoye une valeur vide et qu'on recupere une date nulle
252
+                    and (strlen($champs[$k]) or !in_array($v, ['0000-00-00 00:00:00', '0000-00-00']))
253
+                ) {
254
+                    $liste[] = $k;
255
+                    $conflits[$k]['post'] = $champs[$k];
256
+                    $conflits[$k]['save'] = $v;
257
+
258
+                    // cas specifique MySQL+emoji : si l'un est la
259
+                    // conversion utf8_noplanes de l'autre alors c'est OK
260
+                    if (defined('_MYSQL_NOPLANES') && _MYSQL_NOPLANES) {
261
+                        include_spip('inc/charsets');
262
+                        if ($v == utf8_noplanes($champs[$k])) {
263
+                            array_pop($liste);
264
+                        }
265
+                    }
266
+                }
267
+            }
268
+            // si un champ n'a pas ete correctement enregistre, loger et retourner une erreur
269
+            // c'est un cas exceptionnel
270
+            if (count($liste)) {
271
+                spip_log(
272
+                    "Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true),
273
+                    'modifier.' . _LOG_CRITIQUE
274
+                );
275
+
276
+                return _T(
277
+                    'erreur_technique_enregistrement_champs',
278
+                    ['champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"]
279
+                );
280
+            }
281
+        }
282
+
283
+        // Invalider les caches
284
+        if (isset($options['invalideur']) and $options['invalideur']) {
285
+            include_spip('inc/invalideur');
286
+            if (is_array($options['invalideur'])) {
287
+                array_map('suivre_invalideur', $options['invalideur']);
288
+            } else {
289
+                suivre_invalideur($options['invalideur']);
290
+            }
291
+        }
292
+
293
+        // Notifications, gestion des revisions...
294
+        // en standard, appelle |nouvelle_revision ci-dessous
295
+        pipeline(
296
+            'post_edition',
297
+            [
298
+                'args' => [
299
+                    'table' => $spip_table_objet,
300
+                    'table_objet' => $table_objet,
301
+                    'spip_table_objet' => $spip_table_objet,
302
+                    'desc' => $desc,
303
+                    'type' => $objet,
304
+                    'id_objet' => $id_objet,
305
+                    'champs' => $options['champs'] ?? [], // [doc] kesako ?
306
+                    'champs_anciens' => $row, // état du contenu avant modif
307
+                    'serveur' => $serveur,
308
+                    'action' => $options['action'] ?? 'modifier'
309
+                ],
310
+                'data' => $champs
311
+            ]
312
+        );
313
+    }
314 314
 	
315
-	// Appeler une notification
316
-	if ($notifications = charger_fonction('notifications', 'inc')) {
317
-		$notifications(
318
-			"{$objet}_modifier",
319
-			$id_objet,
320
-			[
321
-				'champs' => $champs,
322
-			]
323
-		);
324
-		$notifications(
325
-			'objet_modifier',
326
-			$id_objet,
327
-			[
328
-				'objet' => $objet,
329
-				'id_objet' => $id_objet,
330
-				'champs' => $champs,
331
-			]
332
-		);
333
-	}
334
-
335
-	// journaliser l'affaire
336
-	// message a affiner :-)
337
-	include_spip('inc/filtres_mini');
338
-	$qui = '';
339
-	if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
340
-		$qui .= ' #id_auteur:' . $GLOBALS['visiteur_session']['id_auteur'] . '#';
341
-	}
342
-	if (!empty($GLOBALS['visiteur_session']['nom'])) {
343
-		$qui .= ' #nom:' . $GLOBALS['visiteur_session']['nom'] . '#';
344
-	}
345
-	if ($qui == '') {
346
-		$qui = '#ip:' . $GLOBALS['ip'] . '#';
347
-	}
348
-	journal(_L($qui . ' a édité ' . $objet . ' ' . $id_objet . ' (' . join(
349
-		'+',
350
-		array_diff(array_keys($champs), ['date_modif'])
351
-	) . ')'), [
352
-		'faire' => 'modifier',
353
-		'quoi' => $objet,
354
-		'id' => $id_objet
355
-	]);
356
-
357
-	return '';
315
+    // Appeler une notification
316
+    if ($notifications = charger_fonction('notifications', 'inc')) {
317
+        $notifications(
318
+            "{$objet}_modifier",
319
+            $id_objet,
320
+            [
321
+                'champs' => $champs,
322
+            ]
323
+        );
324
+        $notifications(
325
+            'objet_modifier',
326
+            $id_objet,
327
+            [
328
+                'objet' => $objet,
329
+                'id_objet' => $id_objet,
330
+                'champs' => $champs,
331
+            ]
332
+        );
333
+    }
334
+
335
+    // journaliser l'affaire
336
+    // message a affiner :-)
337
+    include_spip('inc/filtres_mini');
338
+    $qui = '';
339
+    if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
340
+        $qui .= ' #id_auteur:' . $GLOBALS['visiteur_session']['id_auteur'] . '#';
341
+    }
342
+    if (!empty($GLOBALS['visiteur_session']['nom'])) {
343
+        $qui .= ' #nom:' . $GLOBALS['visiteur_session']['nom'] . '#';
344
+    }
345
+    if ($qui == '') {
346
+        $qui = '#ip:' . $GLOBALS['ip'] . '#';
347
+    }
348
+    journal(_L($qui . ' a édité ' . $objet . ' ' . $id_objet . ' (' . join(
349
+        '+',
350
+        array_diff(array_keys($champs), ['date_modif'])
351
+    ) . ')'), [
352
+        'faire' => 'modifier',
353
+        'quoi' => $objet,
354
+        'id' => $id_objet
355
+    ]);
356
+
357
+    return '';
358 358
 }
Please login to merge, or discard this patch.
ecrire/auth/spip.php 3 patches
Spacing   +34 added lines, -34 removed lines patch added patch discarded remove patch
@@ -49,7 +49,7 @@  discard block
 block discarded – undo
49 49
 		$row = sql_fetsel(
50 50
 			'*',
51 51
 			'spip_auteurs',
52
-			'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'",
52
+			'login='.sql_quote($login, $serveur, 'text')." AND statut<>'5poubelle'",
53 53
 			'',
54 54
 			'',
55 55
 			'',
@@ -77,20 +77,20 @@  discard block
 block discarded – undo
77 77
 		// legacy = md5 ou sha256
78 78
 		case 32:
79 79
 			// tres anciens mots de passe encodes en md5(alea.pass)
80
-			$hash = md5($row['alea_actuel'] . $pass);
80
+			$hash = md5($row['alea_actuel'].$pass);
81 81
 			$methode = 'md5';
82 82
 		case 64:
83 83
 			if (empty($hash)) {
84 84
 				// anciens mots de passe encodes en sha256(alea.pass)
85 85
 				include_spip('auth/sha256.inc');
86
-				$hash = spip_sha256($row['alea_actuel'] . $pass);
86
+				$hash = spip_sha256($row['alea_actuel'].$pass);
87 87
 				$methode = 'sha256';
88 88
 			}
89 89
 			if ($row['pass'] === $hash) {
90
-				spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via $methode", 'auth' . _LOG_DEBUG);
90
+				spip_log("validation du mot de passe pour l'auteur #".$row['id_auteur']." $login via $methode", 'auth'._LOG_DEBUG);
91 91
 				// ce n'est pas cense arriver, mais si jamais c'est un backup inutilisable, il faut le nettoyer pour ne pas bloquer la creation d'une nouvelle cle d'auth
92 92
 				if (!empty($row['backup_cles'])) {
93
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
93
+					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur='.intval($row['id_auteur']));
94 94
 				}
95 95
 				break;
96 96
 			}
@@ -108,19 +108,19 @@  discard block
 block discarded – undo
108 108
 				and !empty($row['backup_cles'])
109 109
 			) {
110 110
 				if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
111
-					spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
111
+					spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #'.$row['id_auteur'], 'auth'._LOG_INFO_IMPORTANTE);
112 112
 					if ($cles->save()) {
113 113
 						$secret = $cles->getSecretAuth();
114 114
 					}
115 115
 					else {
116
-						spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
116
+						spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth'._LOG_ERREUR);
117 117
 						// et on echoue car on ne veut pas que la situation reste telle quelle
118
-						raler_fichier(_DIR_ETC . 'cles.php');
118
+						raler_fichier(_DIR_ETC.'cles.php');
119 119
 					}
120 120
 				}
121 121
 				else {
122
-					spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR);
123
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
122
+					spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #'.$row['id_auteur']." n'est pas valide", 'auth'._LOG_ERREUR);
123
+					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur='.intval($row['id_auteur']));
124 124
 				}
125 125
 			}
126 126
 
@@ -128,7 +128,7 @@  discard block
 block discarded – undo
128 128
 				unset($row);
129 129
 			}
130 130
 			else {
131
-				spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG);
131
+				spip_log("validation du mot de passe pour l'auteur #".$row['id_auteur']." $login via Password::verifier", 'auth'._LOG_DEBUG);
132 132
 			}
133 133
 			break;
134 134
 	}
@@ -175,7 +175,7 @@  discard block
 block discarded – undo
175 175
 			@sql_update(
176 176
 				'spip_auteurs',
177 177
 				$set,
178
-				'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote(
178
+				'id_auteur='.intval($row['id_auteur']).' AND pass='.sql_quote(
179 179
 					$row['pass'],
180 180
 					$serveur,
181 181
 					'text'
@@ -223,24 +223,24 @@  discard block
 block discarded – undo
223 223
 
224 224
 	// si force, on ne verifie pas la presence d'un backup chez un webmestre
225 225
 	if ($force) {
226
-		spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE);
226
+		spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth'._LOG_INFO_IMPORTANTE);
227 227
 		$secret = $cles->getSecretAuth(true);
228 228
 		return true;
229 229
 	}
230 230
 
231
-	$has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''");
231
+	$has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut='.sql_quote('0minirezo').' AND webmestre='.sql_quote('oui')." AND backup_cles!=''");
232 232
 	$has_backup = array_column($has_backup, 'id_auteur');
233 233
 	if (empty($has_backup)) {
234
-		spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE);
234
+		spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth'._LOG_INFO_IMPORTANTE);
235 235
 		if ($secret = $cles->getSecretAuth(true)) {
236 236
 			return true;
237 237
 		}
238
-		spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
238
+		spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth'._LOG_ERREUR);
239 239
 		// et on echoue car on ne veut pas que la situation reste telle quelle
240
-		raler_fichier(_DIR_ETC . 'cles.php');
240
+		raler_fichier(_DIR_ETC.'cles.php');
241 241
 	}
242 242
 	else {
243
-		spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR);
243
+		spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #'.implode(', #', $has_backup).' doit se connecter pour restaurer son backup des cles', 'auth'._LOG_ERREUR);
244 244
 	}
245 245
 	return false;
246 246
 }
@@ -257,8 +257,8 @@  discard block
 block discarded – undo
257 257
 	$flux['data'] .=
258 258
 		  '<script type="text/javascript">/*<![CDATA[*/'
259 259
 		. "$js\n"
260
-		. "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "',"
261
-		. "'page_auteur': '" . generer_url_public('informer_auteur') . "',"
260
+		. "var login_info={'login':'".$flux['args']['contexte']['var_login']."',"
261
+		. "'page_auteur': '".generer_url_public('informer_auteur')."',"
262 262
 		. "'informe_auteur_en_cours':false,"
263 263
 		. "'attente_informe':0};"
264 264
 		. "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});"
@@ -301,7 +301,7 @@  discard block
 block discarded – undo
301 301
 		} else {
302 302
 			$n = sql_countsel(
303 303
 				'spip_auteurs',
304
-				'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'",
304
+				'login='.sql_quote($new_login).' AND id_auteur!='.intval($id_auteur)." AND statut!='5poubelle'",
305 305
 				'',
306 306
 				'',
307 307
 				$serveur
@@ -329,7 +329,7 @@  discard block
 block discarded – undo
329 329
 	}
330 330
 	if (
331 331
 		!$id_auteur = intval($id_auteur)
332
-		or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
332
+		or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur='.intval($id_auteur), '', '', '', '', $serveur)
333 333
 	) {
334 334
 		return false;
335 335
 	}
@@ -344,7 +344,7 @@  discard block
 block discarded – undo
344 344
 		$anciens = sql_allfetsel(
345 345
 			'id_auteur',
346 346
 			'spip_auteurs',
347
-			'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'",
347
+			'login='.sql_quote($new_login, $serveur, 'text')." AND statut='5poubelle'",
348 348
 			'',
349 349
 			'',
350 350
 			'',
@@ -378,8 +378,8 @@  discard block
 block discarded – undo
378 378
 		$r = sql_getfetsel(
379 379
 			'login',
380 380
 			'spip_auteurs',
381
-			"statut<>'5poubelle'" .
382
-			' AND (length(pass)>0)' .
381
+			"statut<>'5poubelle'".
382
+			' AND (length(pass)>0)'.
383 383
 			" AND (login=$l)",
384 384
 			'',
385 385
 			'',
@@ -398,8 +398,8 @@  discard block
 block discarded – undo
398 398
 		return sql_getfetsel(
399 399
 			'login',
400 400
 			'spip_auteurs',
401
-			"statut<>'5poubelle'" .
402
-			' AND (length(pass)>0)' .
401
+			"statut<>'5poubelle'".
402
+			' AND (length(pass)>0)'.
403 403
 			" AND (login<>'' AND (nom=$l OR email=$l))",
404 404
 			'',
405 405
 			'',
@@ -468,7 +468,7 @@  discard block
 block discarded – undo
468 468
 
469 469
 	if (
470 470
 		!$id_auteur = intval($id_auteur)
471
-		or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
471
+		or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur='.intval($id_auteur), '', '', '', '', $serveur)
472 472
 	) {
473 473
 		return false;
474 474
 	}
@@ -529,8 +529,8 @@  discard block
 block discarded – undo
529 529
 		or isset($champs['statut'])
530 530
 		or (isset($options['all']) and $options['all'])
531 531
 	) {
532
-		$htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
533
-		$htpasswd = _DIR_TMP . _AUTH_USER_FILE;
532
+		$htaccess = _DIR_RESTREINT._ACCESS_FILE_NAME;
533
+		$htpasswd = _DIR_TMP._AUTH_USER_FILE;
534 534
 
535 535
 		// Cette variable de configuration peut etre posee par un plugin
536 536
 		// par exemple acces_restreint ;
@@ -540,7 +540,7 @@  discard block
 block discarded – undo
540 540
 			and !@file_exists($htaccess)
541 541
 		) {
542 542
 			spip_unlink($htpasswd);
543
-			spip_unlink($htpasswd . '-admin');
543
+			spip_unlink($htpasswd.'-admin');
544 544
 
545 545
 			return;
546 546
 		}
@@ -558,16 +558,16 @@  discard block
 block discarded – undo
558 558
 		);
559 559
 		while ($t = sql_fetch($s)) {
560 560
 			if (strlen($t['login']) and strlen($t['htpass'])) {
561
-				$p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
561
+				$p1 .= $t['login'].':'.$t['htpass']."\n";
562 562
 				if ($t['statut'] == '0minirezo') {
563
-					$p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
563
+					$p2 .= $t['login'].':'.$t['htpass']."\n";
564 564
 				}
565 565
 			}
566 566
 		}
567 567
 		sql_free($s);
568 568
 		if ($p1) {
569 569
 			ecrire_fichier($htpasswd, $p1);
570
-			ecrire_fichier($htpasswd . '-admin', $p2);
570
+			ecrire_fichier($htpasswd.'-admin', $p2);
571 571
 			spip_log("Ecriture de $htpasswd et $htpasswd-admin");
572 572
 		}
573 573
 	}
Please login to merge, or discard this patch.
Braces   +5 added lines, -10 removed lines patch added patch discarded remove patch
@@ -111,14 +111,12 @@  discard block
 block discarded – undo
111 111
 					spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
112 112
 					if ($cles->save()) {
113 113
 						$secret = $cles->getSecretAuth();
114
-					}
115
-					else {
114
+					} else {
116 115
 						spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
117 116
 						// et on echoue car on ne veut pas que la situation reste telle quelle
118 117
 						raler_fichier(_DIR_ETC . 'cles.php');
119 118
 					}
120
-				}
121
-				else {
119
+				} else {
122 120
 					spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR);
123 121
 					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
124 122
 				}
@@ -126,8 +124,7 @@  discard block
 block discarded – undo
126 124
 
127 125
 			if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) {
128 126
 				unset($row);
129
-			}
130
-			else {
127
+			} else {
131 128
 				spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG);
132 129
 			}
133 130
 			break;
@@ -238,8 +235,7 @@  discard block
 block discarded – undo
238 235
 		spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
239 236
 		// et on echoue car on ne veut pas que la situation reste telle quelle
240 237
 		raler_fichier(_DIR_ETC . 'cles.php');
241
-	}
242
-	else {
238
+	} else {
243 239
 		spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR);
244 240
 	}
245 241
 	return false;
@@ -479,8 +475,7 @@  discard block
 block discarded – undo
479 475
 	if (!$secret) {
480 476
 		if (auth_spip_initialiser_secret()) {
481 477
 			$secret = $cles->getSecretAuth();
482
-		}
483
-		else {
478
+		} else {
484 479
 			return false;
485 480
 		}
486 481
 	}
Please login to merge, or discard this patch.
Indentation   +409 added lines, -409 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
 use Spip\Chiffrer\SpipCles;
19 19
 
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 /**
@@ -33,169 +33,169 @@  discard block
 block discarded – undo
33 33
  */
34 34
 function auth_spip_dist($login, #[\SensitiveParameter] $pass, $serveur = '', $phpauth = false) {
35 35
 
36
-	// retrouver le login
37
-	$login = auth_spip_retrouver_login($login);
38
-	// login inconnu, n'allons pas plus loin
39
-	if (!$login) {
40
-		return [];
41
-	}
42
-
43
-	$md5pass = '';
44
-	$shapass = $shanext = '';
45
-	$auteur_peut_sauver_cles = false;
46
-
47
-	if ($pass) {
48
-		$row = sql_fetsel(
49
-			'*',
50
-			'spip_auteurs',
51
-			'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'",
52
-			'',
53
-			'',
54
-			'',
55
-			'',
56
-			$serveur
57
-		);
58
-
59
-		// lever un flag si cet auteur peut sauver les cles
60
-		if ($row['statut'] === '0minirezo' and $row['webmestre'] === 'oui' and isset($row['backup_cles'])) {
61
-			$auteur_peut_sauver_cles = true;
62
-		}
63
-	}
64
-
65
-	// login inexistant ou mot de passe vide
66
-	if (!$pass or !$row) {
67
-		return [];
68
-	}
69
-
70
-	$cles = SpipCles::instance();
71
-	$secret = $cles->getSecretAuth();
72
-
73
-	$hash = null;
74
-	switch (strlen($row['pass'])) {
75
-		// legacy = md5 ou sha256
76
-		case 32:
77
-			// tres anciens mots de passe encodes en md5(alea.pass)
78
-			$hash = md5($row['alea_actuel'] . $pass);
79
-			$methode = 'md5';
80
-		case 64:
81
-			if (empty($hash)) {
82
-				// anciens mots de passe encodes en sha256(alea.pass)
83
-				include_spip('auth/sha256.inc');
84
-				$hash = spip_sha256($row['alea_actuel'] . $pass);
85
-				$methode = 'sha256';
86
-			}
87
-			if ($row['pass'] === $hash) {
88
-				spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via $methode", 'auth' . _LOG_DEBUG);
89
-				// ce n'est pas cense arriver, mais si jamais c'est un backup inutilisable, il faut le nettoyer pour ne pas bloquer la creation d'une nouvelle cle d'auth
90
-				if (!empty($row['backup_cles'])) {
91
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
92
-				}
93
-				break;
94
-			}
95
-
96
-		// on teste la methode par defaut, au cas ou ce serait un pass moderne qui a la malchance d'etre en 64char de long
97
-
98
-		case 60:
99
-		case 98:
100
-		default:
101
-			// doit-on restaurer un backup des cles ?
102
-			// si on a le bon pass on peut decoder le backup, retrouver la cle, et du coup valider le pass
103
-			if (
104
-				!$secret
105
-				and $auteur_peut_sauver_cles
106
-				and !empty($row['backup_cles'])
107
-			) {
108
-				if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
109
-					spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
110
-					if ($cles->save()) {
111
-						$secret = $cles->getSecretAuth();
112
-					}
113
-					else {
114
-						spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
115
-						// et on echoue car on ne veut pas que la situation reste telle quelle
116
-						raler_fichier(_DIR_ETC . 'cles.php');
117
-					}
118
-				}
119
-				else {
120
-					spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR);
121
-					sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
122
-				}
123
-			}
124
-
125
-			if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) {
126
-				unset($row);
127
-			}
128
-			else {
129
-				spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG);
130
-			}
131
-			break;
132
-	}
133
-
134
-	// Migration depuis ancienne version : si on a pas encore de cle
135
-	// ET si c'est le login d'un auteur qui peut sauver la cle
136
-	// créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php)
137
-	// si c'est un auteur normal, on ne fait rien, il garde son ancien pass hashé en sha256 en attendant le login d'un webmestre
138
-	if (!$secret and $auteur_peut_sauver_cles) {
139
-		if (auth_spip_initialiser_secret()) {
140
-			$secret = $cles->getSecretAuth();
141
-		}
142
-	}
143
-
144
-	// login/mot de passe incorrect
145
-	if (empty($row)) {
146
-		return [];
147
-	}
148
-
149
-	// fait tourner le codage du pass dans la base
150
-	// sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action()
151
-	if (!$phpauth and $secret) {
152
-		include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess
153
-		$pass_hash_next = Password::hacher($pass, $secret);
154
-		if ($pass_hash_next) {
155
-			$set = [
156
-				'alea_actuel' => 'alea_futur', // @deprecated 4.1
157
-				'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1
158
-				'pass' => sql_quote($pass_hash_next, $serveur, 'text'),
159
-			];
160
-
161
-			// regenerer un htpass si on a active/desactive le plugin htpasswd
162
-			// et/ou que l'algo a change - pour etre certain de toujours utiliser le bon algo
163
-			$htpass = generer_htpass($pass);
164
-			if (strlen($htpass) !== strlen($row['htpass'])) {
165
-				$set['htpass'] = sql_quote($htpass, $serveur, 'text');
166
-			}
167
-
168
-			// a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre)
169
-			if ($auteur_peut_sauver_cles) {
170
-				$set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text');
171
-			}
172
-
173
-			@sql_update(
174
-				'spip_auteurs',
175
-				$set,
176
-				'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote(
177
-					$row['pass'],
178
-					$serveur,
179
-					'text'
180
-				),
181
-				[],
182
-				$serveur
183
-			);
184
-
185
-			// si on a change le htpass car changement d'algo, regenerer les fichiers htpasswd
186
-			if (isset($set['htpass'])) {
187
-				ecrire_acces();
188
-			}
189
-		}
190
-
191
-		// En profiter pour verifier la securite de tmp/
192
-		// Si elle ne fonctionne pas a l'installation, prevenir
193
-		if (!verifier_htaccess(_DIR_TMP) and defined('_ECRIRE_INSTALL')) {
194
-			return false;
195
-		}
196
-	}
197
-
198
-	return $row;
36
+    // retrouver le login
37
+    $login = auth_spip_retrouver_login($login);
38
+    // login inconnu, n'allons pas plus loin
39
+    if (!$login) {
40
+        return [];
41
+    }
42
+
43
+    $md5pass = '';
44
+    $shapass = $shanext = '';
45
+    $auteur_peut_sauver_cles = false;
46
+
47
+    if ($pass) {
48
+        $row = sql_fetsel(
49
+            '*',
50
+            'spip_auteurs',
51
+            'login=' . sql_quote($login, $serveur, 'text') . " AND statut<>'5poubelle'",
52
+            '',
53
+            '',
54
+            '',
55
+            '',
56
+            $serveur
57
+        );
58
+
59
+        // lever un flag si cet auteur peut sauver les cles
60
+        if ($row['statut'] === '0minirezo' and $row['webmestre'] === 'oui' and isset($row['backup_cles'])) {
61
+            $auteur_peut_sauver_cles = true;
62
+        }
63
+    }
64
+
65
+    // login inexistant ou mot de passe vide
66
+    if (!$pass or !$row) {
67
+        return [];
68
+    }
69
+
70
+    $cles = SpipCles::instance();
71
+    $secret = $cles->getSecretAuth();
72
+
73
+    $hash = null;
74
+    switch (strlen($row['pass'])) {
75
+        // legacy = md5 ou sha256
76
+        case 32:
77
+            // tres anciens mots de passe encodes en md5(alea.pass)
78
+            $hash = md5($row['alea_actuel'] . $pass);
79
+            $methode = 'md5';
80
+        case 64:
81
+            if (empty($hash)) {
82
+                // anciens mots de passe encodes en sha256(alea.pass)
83
+                include_spip('auth/sha256.inc');
84
+                $hash = spip_sha256($row['alea_actuel'] . $pass);
85
+                $methode = 'sha256';
86
+            }
87
+            if ($row['pass'] === $hash) {
88
+                spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via $methode", 'auth' . _LOG_DEBUG);
89
+                // ce n'est pas cense arriver, mais si jamais c'est un backup inutilisable, il faut le nettoyer pour ne pas bloquer la creation d'une nouvelle cle d'auth
90
+                if (!empty($row['backup_cles'])) {
91
+                    sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
92
+                }
93
+                break;
94
+            }
95
+
96
+        // on teste la methode par defaut, au cas ou ce serait un pass moderne qui a la malchance d'etre en 64char de long
97
+
98
+        case 60:
99
+        case 98:
100
+        default:
101
+            // doit-on restaurer un backup des cles ?
102
+            // si on a le bon pass on peut decoder le backup, retrouver la cle, et du coup valider le pass
103
+            if (
104
+                !$secret
105
+                and $auteur_peut_sauver_cles
106
+                and !empty($row['backup_cles'])
107
+            ) {
108
+                if ($cles->restore($row['backup_cles'], $pass, $row['pass'], $row['id_auteur'])) {
109
+                    spip_log('Les cles secretes ont ete restaurées avec le backup du webmestre #' . $row['id_auteur'], 'auth' . _LOG_INFO_IMPORTANTE);
110
+                    if ($cles->save()) {
111
+                        $secret = $cles->getSecretAuth();
112
+                    }
113
+                    else {
114
+                        spip_log("Echec restauration des cles : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
115
+                        // et on echoue car on ne veut pas que la situation reste telle quelle
116
+                        raler_fichier(_DIR_ETC . 'cles.php');
117
+                    }
118
+                }
119
+                else {
120
+                    spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) mais le backup du webmestre #' . $row['id_auteur'] . " n'est pas valide", 'auth' . _LOG_ERREUR);
121
+                    sql_updateq('spip_auteurs', ['backup_cles' => ''], 'id_auteur=' . intval($row['id_auteur']));
122
+                }
123
+            }
124
+
125
+            if (!$secret or !Password::verifier($pass, $row['pass'], $secret)) {
126
+                unset($row);
127
+            }
128
+            else {
129
+                spip_log("validation du mot de passe pour l'auteur #" . $row['id_auteur'] . " $login via Password::verifier", 'auth' . _LOG_DEBUG);
130
+            }
131
+            break;
132
+    }
133
+
134
+    // Migration depuis ancienne version : si on a pas encore de cle
135
+    // ET si c'est le login d'un auteur qui peut sauver la cle
136
+    // créer la clé (en s'assurant bien que personne n'a de backup d'un precedent fichier cle.php)
137
+    // si c'est un auteur normal, on ne fait rien, il garde son ancien pass hashé en sha256 en attendant le login d'un webmestre
138
+    if (!$secret and $auteur_peut_sauver_cles) {
139
+        if (auth_spip_initialiser_secret()) {
140
+            $secret = $cles->getSecretAuth();
141
+        }
142
+    }
143
+
144
+    // login/mot de passe incorrect
145
+    if (empty($row)) {
146
+        return [];
147
+    }
148
+
149
+    // fait tourner le codage du pass dans la base
150
+    // sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action()
151
+    if (!$phpauth and $secret) {
152
+        include_spip('inc/acces'); // pour creer_uniqid et verifier_htaccess
153
+        $pass_hash_next = Password::hacher($pass, $secret);
154
+        if ($pass_hash_next) {
155
+            $set = [
156
+                'alea_actuel' => 'alea_futur', // @deprecated 4.1
157
+                'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text'), // @deprecated 4.1
158
+                'pass' => sql_quote($pass_hash_next, $serveur, 'text'),
159
+            ];
160
+
161
+            // regenerer un htpass si on a active/desactive le plugin htpasswd
162
+            // et/ou que l'algo a change - pour etre certain de toujours utiliser le bon algo
163
+            $htpass = generer_htpass($pass);
164
+            if (strlen($htpass) !== strlen($row['htpass'])) {
165
+                $set['htpass'] = sql_quote($htpass, $serveur, 'text');
166
+            }
167
+
168
+            // a chaque login de webmestre : sauvegarde chiffree des clés du site (avec les pass du webmestre)
169
+            if ($auteur_peut_sauver_cles) {
170
+                $set['backup_cles'] = sql_quote($cles->backup($pass), $serveur, 'text');
171
+            }
172
+
173
+            @sql_update(
174
+                'spip_auteurs',
175
+                $set,
176
+                'id_auteur=' . intval($row['id_auteur']) . ' AND pass=' . sql_quote(
177
+                    $row['pass'],
178
+                    $serveur,
179
+                    'text'
180
+                ),
181
+                [],
182
+                $serveur
183
+            );
184
+
185
+            // si on a change le htpass car changement d'algo, regenerer les fichiers htpasswd
186
+            if (isset($set['htpass'])) {
187
+                ecrire_acces();
188
+            }
189
+        }
190
+
191
+        // En profiter pour verifier la securite de tmp/
192
+        // Si elle ne fonctionne pas a l'installation, prevenir
193
+        if (!verifier_htaccess(_DIR_TMP) and defined('_ECRIRE_INSTALL')) {
194
+            return false;
195
+        }
196
+    }
197
+
198
+    return $row;
199 199
 }
200 200
 
201 201
 /**
@@ -210,36 +210,36 @@  discard block
 block discarded – undo
210 210
  * @return bool
211 211
  */
212 212
 function auth_spip_initialiser_secret(bool $force = false): bool {
213
-	$cles = SpipCles::instance();
214
-	$secret = $cles->getSecretAuth();
215
-
216
-	// on ne fait rien si on a un secret dispo
217
-	if ($secret) {
218
-		return false;
219
-	}
220
-
221
-	// si force, on ne verifie pas la presence d'un backup chez un webmestre
222
-	if ($force) {
223
-		spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE);
224
-		$secret = $cles->getSecretAuth(true);
225
-		return true;
226
-	}
227
-
228
-	$has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''");
229
-	$has_backup = array_column($has_backup, 'id_auteur');
230
-	if (empty($has_backup)) {
231
-		spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE);
232
-		if ($secret = $cles->getSecretAuth(true)) {
233
-			return true;
234
-		}
235
-		spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
236
-		// et on echoue car on ne veut pas que la situation reste telle quelle
237
-		raler_fichier(_DIR_ETC . 'cles.php');
238
-	}
239
-	else {
240
-		spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR);
241
-	}
242
-	return false;
213
+    $cles = SpipCles::instance();
214
+    $secret = $cles->getSecretAuth();
215
+
216
+    // on ne fait rien si on a un secret dispo
217
+    if ($secret) {
218
+        return false;
219
+    }
220
+
221
+    // si force, on ne verifie pas la presence d'un backup chez un webmestre
222
+    if ($force) {
223
+        spip_log('Pas de cle secrete disponible, on regenere une nouvelle cle forcee - tous les mots de passe sont invalides', 'auth' . _LOG_INFO_IMPORTANTE);
224
+        $secret = $cles->getSecretAuth(true);
225
+        return true;
226
+    }
227
+
228
+    $has_backup = sql_allfetsel('id_auteur', 'spip_auteurs', 'statut=' . sql_quote('0minirezo') . ' AND webmestre=' . sql_quote('oui') . " AND backup_cles!=''");
229
+    $has_backup = array_column($has_backup, 'id_auteur');
230
+    if (empty($has_backup)) {
231
+        spip_log("Pas de cle secrete disponible, et aucun webmestre n'a de backup, on regenere une nouvelle cle - tous les mots de passe sont invalides", 'auth' . _LOG_INFO_IMPORTANTE);
232
+        if ($secret = $cles->getSecretAuth(true)) {
233
+            return true;
234
+        }
235
+        spip_log("Echec generation d'une nouvelle cle : verifier les droits d'ecriture ?", 'auth' . _LOG_ERREUR);
236
+        // et on echoue car on ne veut pas que la situation reste telle quelle
237
+        raler_fichier(_DIR_ETC . 'cles.php');
238
+    }
239
+    else {
240
+        spip_log('Pas de cle secrete disponible (fichier config/cle.php absent ?) un des webmestres #' . implode(', #', $has_backup) . ' doit se connecter pour restaurer son backup des cles', 'auth' . _LOG_ERREUR);
241
+    }
242
+    return false;
243 243
 }
244 244
 
245 245
 /**
@@ -249,19 +249,19 @@  discard block
 block discarded – undo
249 249
  * @return array
250 250
  */
251 251
 function auth_spip_formulaire_login($flux) {
252
-	// javascript qui gere la securite du login en evitant de faire circuler le pass en clair
253
-	$js = file_get_contents(find_in_path('prive/javascript/login.js'));
254
-	$flux['data'] .=
255
-		  '<script type="text/javascript">/*<![CDATA[*/'
256
-		. "$js\n"
257
-		. "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "',"
258
-		. "'page_auteur': '" . generer_url_public('informer_auteur') . "',"
259
-		. "'informe_auteur_en_cours':false,"
260
-		. "'attente_informe':0};"
261
-		. "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});"
262
-		. '/*]]>*/</script>';
263
-
264
-	return $flux;
252
+    // javascript qui gere la securite du login en evitant de faire circuler le pass en clair
253
+    $js = file_get_contents(find_in_path('prive/javascript/login.js'));
254
+    $flux['data'] .=
255
+            '<script type="text/javascript">/*<![CDATA[*/'
256
+        . "$js\n"
257
+        . "var login_info={'login':'" . $flux['args']['contexte']['var_login'] . "',"
258
+        . "'page_auteur': '" . generer_url_public('informer_auteur') . "',"
259
+        . "'informe_auteur_en_cours':false,"
260
+        . "'attente_informe':0};"
261
+        . "jQuery(function(){jQuery('#var_login').change(actualise_auteur);});"
262
+        . '/*]]>*/</script>';
263
+
264
+    return $flux;
265 265
 }
266 266
 
267 267
 
@@ -273,11 +273,11 @@  discard block
 block discarded – undo
273 273
  *   toujours true pour un auteur cree dans SPIP
274 274
  */
275 275
 function auth_spip_autoriser_modifier_login(string $serveur = ''): bool {
276
-	// les fonctions d'ecriture sur base distante sont encore incompletes
277
-	if (strlen($serveur)) {
278
-		return false;
279
-	}
280
-	return true;
276
+    // les fonctions d'ecriture sur base distante sont encore incompletes
277
+    if (strlen($serveur)) {
278
+        return false;
279
+    }
280
+    return true;
281 281
 }
282 282
 
283 283
 /**
@@ -291,25 +291,25 @@  discard block
 block discarded – undo
291 291
  *  message d'erreur si login non valide, chaine vide sinon
292 292
  */
293 293
 function auth_spip_verifier_login($new_login, $id_auteur = 0, $serveur = '') {
294
-	// login et mot de passe
295
-	if (strlen($new_login)) {
296
-		if (strlen($new_login) < _LOGIN_TROP_COURT) {
297
-			return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]);
298
-		} else {
299
-			$n = sql_countsel(
300
-				'spip_auteurs',
301
-				'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'",
302
-				'',
303
-				'',
304
-				$serveur
305
-			);
306
-			if ($n) {
307
-				return _T('info_login_existant');
308
-			}
309
-		}
310
-	}
311
-
312
-	return '';
294
+    // login et mot de passe
295
+    if (strlen($new_login)) {
296
+        if (strlen($new_login) < _LOGIN_TROP_COURT) {
297
+            return _T('info_login_trop_court_car_pluriel', ['nb' => _LOGIN_TROP_COURT]);
298
+        } else {
299
+            $n = sql_countsel(
300
+                'spip_auteurs',
301
+                'login=' . sql_quote($new_login) . ' AND id_auteur!=' . intval($id_auteur) . " AND statut!='5poubelle'",
302
+                '',
303
+                '',
304
+                $serveur
305
+            );
306
+            if ($n) {
307
+                return _T('info_login_existant');
308
+            }
309
+        }
310
+    }
311
+
312
+    return '';
313 313
 }
314 314
 
315 315
 /**
@@ -321,41 +321,41 @@  discard block
 block discarded – undo
321 321
  * @return bool
322 322
  */
323 323
 function auth_spip_modifier_login($new_login, $id_auteur, $serveur = '') {
324
-	if (is_null($new_login) or auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') {
325
-		return false;
326
-	}
327
-	if (
328
-		!$id_auteur = intval($id_auteur)
329
-		or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
330
-	) {
331
-		return false;
332
-	}
333
-	if ($new_login == $auteur['login']) {
334
-		return true;
335
-	} // on a rien fait mais c'est bon !
336
-
337
-	include_spip('action/editer_auteur');
338
-
339
-	// vider le login des auteurs a la poubelle qui avaient ce meme login
340
-	if (strlen($new_login)) {
341
-		$anciens = sql_allfetsel(
342
-			'id_auteur',
343
-			'spip_auteurs',
344
-			'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'",
345
-			'',
346
-			'',
347
-			'',
348
-			'',
349
-			$serveur
350
-		);
351
-		while ($row = array_pop($anciens)) {
352
-			auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur
353
-		}
354
-	}
355
-
356
-	auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur
357
-
358
-	return true;
324
+    if (is_null($new_login) or auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') {
325
+        return false;
326
+    }
327
+    if (
328
+        !$id_auteur = intval($id_auteur)
329
+        or !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
330
+    ) {
331
+        return false;
332
+    }
333
+    if ($new_login == $auteur['login']) {
334
+        return true;
335
+    } // on a rien fait mais c'est bon !
336
+
337
+    include_spip('action/editer_auteur');
338
+
339
+    // vider le login des auteurs a la poubelle qui avaient ce meme login
340
+    if (strlen($new_login)) {
341
+        $anciens = sql_allfetsel(
342
+            'id_auteur',
343
+            'spip_auteurs',
344
+            'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'",
345
+            '',
346
+            '',
347
+            '',
348
+            '',
349
+            $serveur
350
+        );
351
+        while ($row = array_pop($anciens)) {
352
+            auteur_modifier($row['id_auteur'], ['login' => ''], true); // manque la gestion de $serveur
353
+        }
354
+    }
355
+
356
+    auteur_modifier($id_auteur, ['login' => $new_login], true); // manque la gestion de $serveur
357
+
358
+    return true;
359 359
 }
360 360
 
361 361
 /**
@@ -367,44 +367,44 @@  discard block
 block discarded – undo
367 367
  * @return string
368 368
  */
369 369
 function auth_spip_retrouver_login($login, $serveur = '') {
370
-	if (!strlen($login)) {
371
-		return null;
372
-	} // pas la peine de requeter
373
-	$l = sql_quote($login, $serveur, 'text');
374
-	if (
375
-		$r = sql_getfetsel(
376
-			'login',
377
-			'spip_auteurs',
378
-			"statut<>'5poubelle'" .
379
-			' AND (length(pass)>0)' .
380
-			" AND (login=$l)",
381
-			'',
382
-			'',
383
-			'',
384
-			'',
385
-			$serveur
386
-		)
387
-	) {
388
-		return $r;
389
-	}
390
-	// Si pas d'auteur avec ce login
391
-	// regarder s'il a saisi son nom ou son mail.
392
-	// Ne pas fusionner avec la requete precedente
393
-	// car un nom peut etre homonyme d'un autre login
394
-	else {
395
-		return sql_getfetsel(
396
-			'login',
397
-			'spip_auteurs',
398
-			"statut<>'5poubelle'" .
399
-			' AND (length(pass)>0)' .
400
-			" AND (login<>'' AND (nom=$l OR email=$l))",
401
-			'',
402
-			'',
403
-			'',
404
-			'',
405
-			$serveur
406
-		);
407
-	}
370
+    if (!strlen($login)) {
371
+        return null;
372
+    } // pas la peine de requeter
373
+    $l = sql_quote($login, $serveur, 'text');
374
+    if (
375
+        $r = sql_getfetsel(
376
+            'login',
377
+            'spip_auteurs',
378
+            "statut<>'5poubelle'" .
379
+            ' AND (length(pass)>0)' .
380
+            " AND (login=$l)",
381
+            '',
382
+            '',
383
+            '',
384
+            '',
385
+            $serveur
386
+        )
387
+    ) {
388
+        return $r;
389
+    }
390
+    // Si pas d'auteur avec ce login
391
+    // regarder s'il a saisi son nom ou son mail.
392
+    // Ne pas fusionner avec la requete precedente
393
+    // car un nom peut etre homonyme d'un autre login
394
+    else {
395
+        return sql_getfetsel(
396
+            'login',
397
+            'spip_auteurs',
398
+            "statut<>'5poubelle'" .
399
+            ' AND (length(pass)>0)' .
400
+            " AND (login<>'' AND (nom=$l OR email=$l))",
401
+            '',
402
+            '',
403
+            '',
404
+            '',
405
+            $serveur
406
+        );
407
+    }
408 408
 }
409 409
 
410 410
 /**
@@ -415,11 +415,11 @@  discard block
 block discarded – undo
415 415
  *  toujours true pour un auteur cree dans SPIP
416 416
  */
417 417
 function auth_spip_autoriser_modifier_pass(string $serveur = ''): bool {
418
-	// les fonctions d'ecriture sur base distante sont encore incompletes
419
-	if (strlen($serveur)) {
420
-		return false;
421
-	}
422
-	return true;
418
+    // les fonctions d'ecriture sur base distante sont encore incompletes
419
+    if (strlen($serveur)) {
420
+        return false;
421
+    }
422
+    return true;
423 423
 }
424 424
 
425 425
 
@@ -440,12 +440,12 @@  discard block
 block discarded – undo
440 440
  *  message d'erreur si login non valide, chaine vide sinon
441 441
  */
442 442
 function auth_spip_verifier_pass($login, #[\SensitiveParameter] $new_pass, $id_auteur = 0, $serveur = '') {
443
-	// login et mot de passe
444
-	if (strlen($new_pass) < _PASS_LONGUEUR_MINI) {
445
-		return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]);
446
-	}
443
+    // login et mot de passe
444
+    if (strlen($new_pass) < _PASS_LONGUEUR_MINI) {
445
+        return _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]);
446
+    }
447 447
 
448
-	return '';
448
+    return '';
449 449
 }
450 450
 
451 451
 /**
@@ -459,47 +459,47 @@  discard block
 block discarded – undo
459 459
  * @return bool
460 460
  */
461 461
 function auth_spip_modifier_pass($login, #[\SensitiveParameter] $new_pass, $id_auteur, $serveur = '') {
462
-	if (is_null($new_pass) or auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
463
-		return false;
464
-	}
465
-
466
-	if (
467
-		!$id_auteur = intval($id_auteur)
468
-		or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
469
-	) {
470
-		return false;
471
-	}
472
-
473
-	$cles = SpipCles::instance();
474
-	$secret = $cles->getSecretAuth();
475
-	if (!$secret) {
476
-		if (auth_spip_initialiser_secret()) {
477
-			$secret = $cles->getSecretAuth();
478
-		}
479
-		else {
480
-			return false;
481
-		}
482
-	}
483
-
484
-
485
-	include_spip('inc/acces');
486
-	$set = [
487
-		'pass' => Password::hacher($new_pass, $secret),
488
-		'htpass' => generer_htpass($new_pass),
489
-		'alea_actuel' => creer_uniqid(), // @deprecated 4.1
490
-		'alea_futur' => creer_uniqid(), // @deprecated 4.1
491
-		'low_sec' => '',
492
-	];
493
-
494
-	// si c'est un webmestre, on met a jour son backup des cles
495
-	if ($auteur['statut'] === '0minirezo' and $auteur['webmestre'] === 'oui') {
496
-		$set['backup_cles'] = $cles->backup($new_pass);
497
-	}
498
-
499
-	include_spip('action/editer_auteur');
500
-	auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur
501
-
502
-	return true; // on a bien modifie le pass
462
+    if (is_null($new_pass) or auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
463
+        return false;
464
+    }
465
+
466
+    if (
467
+        !$id_auteur = intval($id_auteur)
468
+        or !$auteur = sql_fetsel('login, statut, webmestre', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)
469
+    ) {
470
+        return false;
471
+    }
472
+
473
+    $cles = SpipCles::instance();
474
+    $secret = $cles->getSecretAuth();
475
+    if (!$secret) {
476
+        if (auth_spip_initialiser_secret()) {
477
+            $secret = $cles->getSecretAuth();
478
+        }
479
+        else {
480
+            return false;
481
+        }
482
+    }
483
+
484
+
485
+    include_spip('inc/acces');
486
+    $set = [
487
+        'pass' => Password::hacher($new_pass, $secret),
488
+        'htpass' => generer_htpass($new_pass),
489
+        'alea_actuel' => creer_uniqid(), // @deprecated 4.1
490
+        'alea_futur' => creer_uniqid(), // @deprecated 4.1
491
+        'low_sec' => '',
492
+    ];
493
+
494
+    // si c'est un webmestre, on met a jour son backup des cles
495
+    if ($auteur['statut'] === '0minirezo' and $auteur['webmestre'] === 'oui') {
496
+        $set['backup_cles'] = $cles->backup($new_pass);
497
+    }
498
+
499
+    include_spip('action/editer_auteur');
500
+    auteur_modifier($id_auteur, $set, true); // manque la gestion de $serveur
501
+
502
+    return true; // on a bien modifie le pass
503 503
 }
504 504
 
505 505
 /**
@@ -513,58 +513,58 @@  discard block
 block discarded – undo
513 513
  * @return void
514 514
  */
515 515
 function auth_spip_synchroniser_distant($id_auteur, $champs, $options = [], string $serveur = ''): void {
516
-	// ne rien faire pour une base distante : on ne sait pas regenerer les htaccess
517
-	if (strlen($serveur)) {
518
-		return;
519
-	}
520
-	// si un login, pass ou statut a ete modifie
521
-	// regenerer les fichier htpass
522
-	if (
523
-		isset($champs['login'])
524
-		or isset($champs['pass'])
525
-		or isset($champs['statut'])
526
-		or (isset($options['all']) and $options['all'])
527
-	) {
528
-		$htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
529
-		$htpasswd = _DIR_TMP . _AUTH_USER_FILE;
530
-
531
-		// Cette variable de configuration peut etre posee par un plugin
532
-		// par exemple acces_restreint ;
533
-		// si .htaccess existe, outrepasser spip_meta
534
-		if (
535
-			(!isset($GLOBALS['meta']['creer_htpasswd']) or ($GLOBALS['meta']['creer_htpasswd'] != 'oui'))
536
-			and !@file_exists($htaccess)
537
-		) {
538
-			spip_unlink($htpasswd);
539
-			spip_unlink($htpasswd . '-admin');
540
-
541
-			return;
542
-		}
543
-
544
-		# remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
545
-		# de devenir redacteur le cas echeant (auth http)... a nettoyer
546
-		// attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
547
-
548
-		$p1 = ''; // login:htpass pour tous
549
-		$p2 = ''; // login:htpass pour les admins
550
-		$s = sql_select(
551
-			'login, htpass, statut',
552
-			'spip_auteurs',
553
-			sql_in('statut', ['1comite', '0minirezo', 'nouveau'])
554
-		);
555
-		while ($t = sql_fetch($s)) {
556
-			if (strlen($t['login']) and strlen($t['htpass'])) {
557
-				$p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
558
-				if ($t['statut'] == '0minirezo') {
559
-					$p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
560
-				}
561
-			}
562
-		}
563
-		sql_free($s);
564
-		if ($p1) {
565
-			ecrire_fichier($htpasswd, $p1);
566
-			ecrire_fichier($htpasswd . '-admin', $p2);
567
-			spip_log("Ecriture de $htpasswd et $htpasswd-admin");
568
-		}
569
-	}
516
+    // ne rien faire pour une base distante : on ne sait pas regenerer les htaccess
517
+    if (strlen($serveur)) {
518
+        return;
519
+    }
520
+    // si un login, pass ou statut a ete modifie
521
+    // regenerer les fichier htpass
522
+    if (
523
+        isset($champs['login'])
524
+        or isset($champs['pass'])
525
+        or isset($champs['statut'])
526
+        or (isset($options['all']) and $options['all'])
527
+    ) {
528
+        $htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
529
+        $htpasswd = _DIR_TMP . _AUTH_USER_FILE;
530
+
531
+        // Cette variable de configuration peut etre posee par un plugin
532
+        // par exemple acces_restreint ;
533
+        // si .htaccess existe, outrepasser spip_meta
534
+        if (
535
+            (!isset($GLOBALS['meta']['creer_htpasswd']) or ($GLOBALS['meta']['creer_htpasswd'] != 'oui'))
536
+            and !@file_exists($htaccess)
537
+        ) {
538
+            spip_unlink($htpasswd);
539
+            spip_unlink($htpasswd . '-admin');
540
+
541
+            return;
542
+        }
543
+
544
+        # remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
545
+        # de devenir redacteur le cas echeant (auth http)... a nettoyer
546
+        // attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
547
+
548
+        $p1 = ''; // login:htpass pour tous
549
+        $p2 = ''; // login:htpass pour les admins
550
+        $s = sql_select(
551
+            'login, htpass, statut',
552
+            'spip_auteurs',
553
+            sql_in('statut', ['1comite', '0minirezo', 'nouveau'])
554
+        );
555
+        while ($t = sql_fetch($s)) {
556
+            if (strlen($t['login']) and strlen($t['htpass'])) {
557
+                $p1 .= $t['login'] . ':' . $t['htpass'] . "\n";
558
+                if ($t['statut'] == '0minirezo') {
559
+                    $p2 .= $t['login'] . ':' . $t['htpass'] . "\n";
560
+                }
561
+            }
562
+        }
563
+        sql_free($s);
564
+        if ($p1) {
565
+            ecrire_fichier($htpasswd, $p1);
566
+            ecrire_fichier($htpasswd . '-admin', $p2);
567
+            spip_log("Ecriture de $htpasswd et $htpasswd-admin");
568
+        }
569
+    }
570 570
 }
Please login to merge, or discard this patch.
ecrire/inc/informer.php 2 patches
Indentation   +61 added lines, -61 removed lines patch added patch discarded remove patch
@@ -11,77 +11,77 @@
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 # Les information d'une rubrique selectionnee dans le mini navigateur
18 18
 
19 19
 function inc_informer_dist($id, $col, $exclus, $rac, $type, $do = 'aff') {
20
-	include_spip('inc/texte');
21
-	$titre = $descriptif = '';
22
-	if ($type === 'rubrique') {
23
-		$row = sql_fetsel('titre, descriptif', 'spip_rubriques', 'id_rubrique = ' . intval($id));
24
-		if ($row) {
25
-			$titre = typo($row['titre']);
26
-			$descriptif = propre($row['descriptif']);
27
-		} else {
28
-			$titre = _T('info_racine_site');
29
-		}
30
-	}
20
+    include_spip('inc/texte');
21
+    $titre = $descriptif = '';
22
+    if ($type === 'rubrique') {
23
+        $row = sql_fetsel('titre, descriptif', 'spip_rubriques', 'id_rubrique = ' . intval($id));
24
+        if ($row) {
25
+            $titre = typo($row['titre']);
26
+            $descriptif = propre($row['descriptif']);
27
+        } else {
28
+            $titre = _T('info_racine_site');
29
+        }
30
+    }
31 31
 
32
-	$res = '';
33
-	if (
34
-		$type === 'rubrique'
35
-		and intval($GLOBALS['visiteur_session']['prefs']['display'] ?? 0) !== 1
36
-		and isset($GLOBALS['meta']['image_process'])
37
-	) {
38
-		if ($GLOBALS['meta']['image_process'] !== 'non') {
39
-			$chercher_logo = charger_fonction('chercher_logo', 'inc');
40
-			if ($res = $chercher_logo($id, 'id_rubrique', 'on')) {
41
-				[$fid, $dir, $nom, $format] = $res;
42
-				include_spip('inc/filtres_images_mini');
43
-				$res = image_reduire("<img src='$fid' alt='' />", 100, 48);
44
-				if ($res) {
45
-					$res = "<div class='informer__media' style='float: " . $GLOBALS['spip_lang_right'] . '; margin-' . $GLOBALS['spip_lang_right'] . ": -5px; margin-top: -5px;'>$res</div>";
46
-				}
47
-			}
48
-		}
49
-	}
32
+    $res = '';
33
+    if (
34
+        $type === 'rubrique'
35
+        and intval($GLOBALS['visiteur_session']['prefs']['display'] ?? 0) !== 1
36
+        and isset($GLOBALS['meta']['image_process'])
37
+    ) {
38
+        if ($GLOBALS['meta']['image_process'] !== 'non') {
39
+            $chercher_logo = charger_fonction('chercher_logo', 'inc');
40
+            if ($res = $chercher_logo($id, 'id_rubrique', 'on')) {
41
+                [$fid, $dir, $nom, $format] = $res;
42
+                include_spip('inc/filtres_images_mini');
43
+                $res = image_reduire("<img src='$fid' alt='' />", 100, 48);
44
+                if ($res) {
45
+                    $res = "<div class='informer__media' style='float: " . $GLOBALS['spip_lang_right'] . '; margin-' . $GLOBALS['spip_lang_right'] . ": -5px; margin-top: -5px;'>$res</div>";
46
+                }
47
+            }
48
+        }
49
+    }
50 50
 
51
-	$rac = spip_htmlentities($rac, ENT_QUOTES);
52
-	$do = spip_htmlentities($do, ENT_QUOTES);
53
-	$id = intval($id);
51
+    $rac = spip_htmlentities($rac, ENT_QUOTES);
52
+    $do = spip_htmlentities($do, ENT_QUOTES);
53
+    $id = intval($id);
54 54
 
55 55
 # ce lien provoque la selection (directe) de la rubrique cliquee
56 56
 # et l'affichage de son titre dans le bandeau
57
-	$titre = strtr(
58
-		str_replace(
59
-			"'",
60
-			'&#8217;',
61
-			str_replace('"', '&#34;', textebrut($titre))
62
-		),
63
-		"\n\r",
64
-		'  '
65
-	);
57
+    $titre = strtr(
58
+        str_replace(
59
+            "'",
60
+            '&#8217;',
61
+            str_replace('"', '&#34;', textebrut($titre))
62
+        ),
63
+        "\n\r",
64
+        '  '
65
+    );
66 66
 
67
-	$js_func = $do . '_selection_titre';
67
+    $js_func = $do . '_selection_titre';
68 68
 
69
-	return "<div style='display: none;'>"
70
-	. "<input type='text' id='" . $rac . "_sel' value='$id' />"
71
-	. "<input type='text' id='" . $rac . "_sel2' value=\""
72
-	. entites_html($titre)
73
-	. '" />'
74
-	. '</div>'
75
-	. "<div class='informer' style='padding: 5px; border-top: 0px;'>"
76
-	. '<div class="informer__item">'
77
-	. (!$res ? '' : $res)
78
-	. "<p class='informer__titre'><b>" . safehtml($titre) . '</b></p>'
79
-	. (!$descriptif ? '' : "<div class='informer__descriptif'>" . safehtml($descriptif) . '</div>')
80
-	. '</div>'
81
-	. "<div class='informer__action' style='clear:both; text-align: " . $GLOBALS['spip_lang_right'] . ";'>"
82
-	. "<input type='submit' class='fondo btn submit' value='"
83
-	. _T('bouton_choisir')
84
-	. "'\nonclick=\"$js_func('$titre',$id,'selection_rubrique','id_parent'); return false;\" />"
85
-	. '</div>'
86
-	. '</div>';
69
+    return "<div style='display: none;'>"
70
+    . "<input type='text' id='" . $rac . "_sel' value='$id' />"
71
+    . "<input type='text' id='" . $rac . "_sel2' value=\""
72
+    . entites_html($titre)
73
+    . '" />'
74
+    . '</div>'
75
+    . "<div class='informer' style='padding: 5px; border-top: 0px;'>"
76
+    . '<div class="informer__item">'
77
+    . (!$res ? '' : $res)
78
+    . "<p class='informer__titre'><b>" . safehtml($titre) . '</b></p>'
79
+    . (!$descriptif ? '' : "<div class='informer__descriptif'>" . safehtml($descriptif) . '</div>')
80
+    . '</div>'
81
+    . "<div class='informer__action' style='clear:both; text-align: " . $GLOBALS['spip_lang_right'] . ";'>"
82
+    . "<input type='submit' class='fondo btn submit' value='"
83
+    . _T('bouton_choisir')
84
+    . "'\nonclick=\"$js_func('$titre',$id,'selection_rubrique','id_parent'); return false;\" />"
85
+    . '</div>'
86
+    . '</div>';
87 87
 }
Please login to merge, or discard this patch.
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -20,7 +20,7 @@  discard block
 block discarded – undo
20 20
 	include_spip('inc/texte');
21 21
 	$titre = $descriptif = '';
22 22
 	if ($type === 'rubrique') {
23
-		$row = sql_fetsel('titre, descriptif', 'spip_rubriques', 'id_rubrique = ' . intval($id));
23
+		$row = sql_fetsel('titre, descriptif', 'spip_rubriques', 'id_rubrique = '.intval($id));
24 24
 		if ($row) {
25 25
 			$titre = typo($row['titre']);
26 26
 			$descriptif = propre($row['descriptif']);
@@ -42,7 +42,7 @@  discard block
 block discarded – undo
42 42
 				include_spip('inc/filtres_images_mini');
43 43
 				$res = image_reduire("<img src='$fid' alt='' />", 100, 48);
44 44
 				if ($res) {
45
-					$res = "<div class='informer__media' style='float: " . $GLOBALS['spip_lang_right'] . '; margin-' . $GLOBALS['spip_lang_right'] . ": -5px; margin-top: -5px;'>$res</div>";
45
+					$res = "<div class='informer__media' style='float: ".$GLOBALS['spip_lang_right'].'; margin-'.$GLOBALS['spip_lang_right'].": -5px; margin-top: -5px;'>$res</div>";
46 46
 				}
47 47
 			}
48 48
 		}
@@ -64,21 +64,21 @@  discard block
 block discarded – undo
64 64
 		'  '
65 65
 	);
66 66
 
67
-	$js_func = $do . '_selection_titre';
67
+	$js_func = $do.'_selection_titre';
68 68
 
69 69
 	return "<div style='display: none;'>"
70
-	. "<input type='text' id='" . $rac . "_sel' value='$id' />"
71
-	. "<input type='text' id='" . $rac . "_sel2' value=\""
70
+	. "<input type='text' id='".$rac."_sel' value='$id' />"
71
+	. "<input type='text' id='".$rac."_sel2' value=\""
72 72
 	. entites_html($titre)
73 73
 	. '" />'
74 74
 	. '</div>'
75 75
 	. "<div class='informer' style='padding: 5px; border-top: 0px;'>"
76 76
 	. '<div class="informer__item">'
77 77
 	. (!$res ? '' : $res)
78
-	. "<p class='informer__titre'><b>" . safehtml($titre) . '</b></p>'
79
-	. (!$descriptif ? '' : "<div class='informer__descriptif'>" . safehtml($descriptif) . '</div>')
78
+	. "<p class='informer__titre'><b>".safehtml($titre).'</b></p>'
79
+	. (!$descriptif ? '' : "<div class='informer__descriptif'>".safehtml($descriptif).'</div>')
80 80
 	. '</div>'
81
-	. "<div class='informer__action' style='clear:both; text-align: " . $GLOBALS['spip_lang_right'] . ";'>"
81
+	. "<div class='informer__action' style='clear:both; text-align: ".$GLOBALS['spip_lang_right'].";'>"
82 82
 	. "<input type='submit' class='fondo btn submit' value='"
83 83
 	. _T('bouton_choisir')
84 84
 	. "'\nonclick=\"$js_func('$titre',$id,'selection_rubrique','id_parent'); return false;\" />"
Please login to merge, or discard this patch.
ecrire/inc/commencer_page.php 2 patches
Indentation   +56 added lines, -56 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -43,25 +43,25 @@  discard block
 block discarded – undo
43 43
  * @return string Code HTML
44 44
  **/
45 45
 function inc_commencer_page_dist(
46
-	$titre = '',
47
-	$rubrique = 'accueil',
48
-	$sous_rubrique = 'accueil',
49
-	$id_rubrique = '',
50
-	$menu = true,
51
-	$minipres = false,
52
-	$alertes = true
46
+    $titre = '',
47
+    $rubrique = 'accueil',
48
+    $sous_rubrique = 'accueil',
49
+    $id_rubrique = '',
50
+    $menu = true,
51
+    $minipres = false,
52
+    $alertes = true
53 53
 ) {
54 54
 
55
-	include_spip('inc/headers');
55
+    include_spip('inc/headers');
56 56
 
57
-	http_no_cache();
57
+    http_no_cache();
58 58
 
59
-	return init_entete($titre, $id_rubrique, $minipres)
60
-	. init_body($rubrique, $sous_rubrique, $id_rubrique, $menu)
61
-	. "<div id='page'>"
62
-	. auteurs_recemment_connectes($GLOBALS['connect_id_auteur'])
63
-	. ($alertes ? alertes_auteur($GLOBALS['connect_id_auteur']) : '')
64
-	. '<div class="largeur">';
59
+    return init_entete($titre, $id_rubrique, $minipres)
60
+    . init_body($rubrique, $sous_rubrique, $id_rubrique, $menu)
61
+    . "<div id='page'>"
62
+    . auteurs_recemment_connectes($GLOBALS['connect_id_auteur'])
63
+    . ($alertes ? alertes_auteur($GLOBALS['connect_id_auteur']) : '')
64
+    . '<div class="largeur">';
65 65
 }
66 66
 
67 67
 /**
@@ -82,21 +82,21 @@  discard block
 block discarded – undo
82 82
  *     Entête du fichier HTML avec le DOCTYPE
83 83
  */
84 84
 function init_entete($titre = '', $dummy = 0, $minipres = false) {
85
-	include_spip('inc/texte');
86
-	if (!$nom_site_spip = textebrut(typo($GLOBALS['meta']['nom_site']))) {
87
-		$nom_site_spip = _T('info_mon_site_spip');
88
-	}
89
-
90
-	$titre = '['
91
-		. $nom_site_spip
92
-		. ']'
93
-		. ($titre ? ' ' . textebrut(typo($titre)) : '');
94
-
95
-	return _DOCTYPE_ECRIRE
96
-	. html_lang_attributes()
97
-	. "<head>\n"
98
-	. init_head($titre, $dummy, $minipres)
99
-	. "</head>\n";
85
+    include_spip('inc/texte');
86
+    if (!$nom_site_spip = textebrut(typo($GLOBALS['meta']['nom_site']))) {
87
+        $nom_site_spip = _T('info_mon_site_spip');
88
+    }
89
+
90
+    $titre = '['
91
+        . $nom_site_spip
92
+        . ']'
93
+        . ($titre ? ' ' . textebrut(typo($titre)) : '');
94
+
95
+    return _DOCTYPE_ECRIRE
96
+    . html_lang_attributes()
97
+    . "<head>\n"
98
+    . init_head($titre, $dummy, $minipres)
99
+    . "</head>\n";
100 100
 }
101 101
 
102 102
 /**
@@ -110,7 +110,7 @@  discard block
 block discarded – undo
110 110
  * @return string
111 111
  */
112 112
 function init_head($titre = '', $dummy = 0, $minipres = false) {
113
-	return recuperer_fond('prive/squelettes/head/dist', ['titre' => $titre, 'minipres' => $minipres ? ' ' : '']);
113
+    return recuperer_fond('prive/squelettes/head/dist', ['titre' => $titre, 'minipres' => $minipres ? ' ' : '']);
114 114
 }
115 115
 
116 116
 /**
@@ -132,20 +132,20 @@  discard block
 block discarded – undo
132 132
  */
133 133
 function init_body($rubrique = 'accueil', $sous_rubrique = 'accueil', $id_rubrique = '', $menu = true) {
134 134
 
135
-	$res = pipeline('body_prive', "<body class='"
136
-		. init_body_class() . ' ' . _request('exec') . "'"
137
-		. ($GLOBALS['spip_lang_rtl'] ? " dir='rtl'" : '')
138
-		. '>');
135
+    $res = pipeline('body_prive', "<body class='"
136
+        . init_body_class() . ' ' . _request('exec') . "'"
137
+        . ($GLOBALS['spip_lang_rtl'] ? " dir='rtl'" : '')
138
+        . '>');
139 139
 
140
-	if (!$menu) {
141
-		return $res;
142
-	}
140
+    if (!$menu) {
141
+        return $res;
142
+    }
143 143
 
144 144
 
145
-	$bandeau = charger_fonction('bandeau', 'inc');
145
+    $bandeau = charger_fonction('bandeau', 'inc');
146 146
 
147
-	return $res
148
-	. $bandeau();
147
+    return $res
148
+    . $bandeau();
149 149
 }
150 150
 
151 151
 /**
@@ -157,23 +157,23 @@  discard block
 block discarded – undo
157 157
  * @return string Classes CSS (séparées par des espaces)
158 158
  */
159 159
 function init_body_class() {
160
-	$display_modes = [
161
-		0 => 'icones_img_texte' // défaut.
162
-		/*init*/,
163
-		1 => 'icones_texte',
164
-		2 => 'icones_img_texte',
165
-		3 => 'icones_img'
166
-	];
160
+    $display_modes = [
161
+        0 => 'icones_img_texte' // défaut.
162
+        /*init*/,
163
+        1 => 'icones_texte',
164
+        2 => 'icones_img_texte',
165
+        3 => 'icones_img'
166
+    ];
167 167
 
168
-	$prefs = $GLOBALS['visiteur_session']['prefs'] ?? [];
168
+    $prefs = $GLOBALS['visiteur_session']['prefs'] ?? [];
169 169
 
170
-	$display_mode = $display_modes[intval($prefs['display'] ?? 0)] ?? $display_modes[0];
171
-	$spip_display_navigation = isset($prefs['display_navigation']) ? spip_sanitize_classname($prefs['display_navigation']) : 'navigation_avec_icones';
170
+    $display_mode = $display_modes[intval($prefs['display'] ?? 0)] ?? $display_modes[0];
171
+    $spip_display_navigation = isset($prefs['display_navigation']) ? spip_sanitize_classname($prefs['display_navigation']) : 'navigation_avec_icones';
172 172
 
173
-	$couleur = intval($prefs['couleur'] ?? 2);
173
+    $couleur = intval($prefs['couleur'] ?? 2);
174 174
 
175
-	$classes = "spip-theme-colors-$couleur $spip_display_navigation $display_mode";
176
-	return spip_sanitize_classname($classes);
175
+    $classes = "spip-theme-colors-$couleur $spip_display_navigation $display_mode";
176
+    return spip_sanitize_classname($classes);
177 177
 }
178 178
 
179 179
 
@@ -184,5 +184,5 @@  discard block
 block discarded – undo
184 184
  * @return string
185 185
  */
186 186
 function auteurs_recemment_connectes($id_auteur) {
187
-	return recuperer_fond('prive/objets/liste/auteurs_enligne');
187
+    return recuperer_fond('prive/objets/liste/auteurs_enligne');
188 188
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -90,7 +90,7 @@  discard block
 block discarded – undo
90 90
 	$titre = '['
91 91
 		. $nom_site_spip
92 92
 		. ']'
93
-		. ($titre ? ' ' . textebrut(typo($titre)) : '');
93
+		. ($titre ? ' '.textebrut(typo($titre)) : '');
94 94
 
95 95
 	return _DOCTYPE_ECRIRE
96 96
 	. html_lang_attributes()
@@ -133,7 +133,7 @@  discard block
 block discarded – undo
133 133
 function init_body($rubrique = 'accueil', $sous_rubrique = 'accueil', $id_rubrique = '', $menu = true) {
134 134
 
135 135
 	$res = pipeline('body_prive', "<body class='"
136
-		. init_body_class() . ' ' . _request('exec') . "'"
136
+		. init_body_class().' '._request('exec')."'"
137 137
 		. ($GLOBALS['spip_lang_rtl'] ? " dir='rtl'" : '')
138 138
 		. '>');
139 139
 
Please login to merge, or discard this patch.
ecrire/index.php 2 patches
Indentation   +76 added lines, -76 removed lines patch added patch discarded remove patch
@@ -19,7 +19,7 @@  discard block
 block discarded – undo
19 19
 /** Drapeau indiquant que l'on est dans l'espace privé */
20 20
 define('_ESPACE_PRIVE', true);
21 21
 if (!defined('_ECRIRE_INC_VERSION')) {
22
-	include 'inc_version.php';
22
+    include 'inc_version.php';
23 23
 }
24 24
 
25 25
 include_spip('inc/cookie');
@@ -35,18 +35,18 @@  discard block
 block discarded – undo
35 35
 // alors il faut blinder les variables d'URL
36 36
 //
37 37
 if (autoriser_sans_cookie($exec, false)) {
38
-	if (!isset($reinstall)) {
39
-		$reinstall = 'non';
40
-	}
41
-	$var_auth = true;
38
+    if (!isset($reinstall)) {
39
+        $reinstall = 'non';
40
+    }
41
+    $var_auth = true;
42 42
 } else {
43
-	// Authentification, redefinissable
44
-	$auth = charger_fonction('auth', 'inc');
45
-	$var_auth = $auth();
46
-	if ($var_auth) {
47
-		echo auth_echec($var_auth);
48
-		exit;
49
-	}
43
+    // Authentification, redefinissable
44
+    $auth = charger_fonction('auth', 'inc');
45
+    $var_auth = $auth();
46
+    if ($var_auth) {
47
+        echo auth_echec($var_auth);
48
+        exit;
49
+    }
50 50
 }
51 51
 
52 52
 // initialiser a la langue par defaut
@@ -57,29 +57,29 @@  discard block
 block discarded – undo
57 57
 
58 58
 
59 59
 if (_request('action') or _request('var_ajax') or _request('formulaire_action')) {
60
-	if (!autoriser_sans_cookie($exec)) {
61
-		// Charger l'aiguilleur qui va mettre sur la bonne voie les traitements derogatoires
62
-		include_spip('public/aiguiller');
63
-		if (
64
-			// cas des appels actions ?action=xxx
65
-			traiter_appels_actions()
66
-			or
67
-			// cas des hits ajax sur les inclusions ajax
68
-			traiter_appels_inclusions_ajax()
69
-			or
70
-			// cas des formulaires charger/verifier/traiter
71
-			traiter_formulaires_dynamiques()
72
-		) {
73
-			exit;
74
-		} // le hit est fini !
75
-	}
60
+    if (!autoriser_sans_cookie($exec)) {
61
+        // Charger l'aiguilleur qui va mettre sur la bonne voie les traitements derogatoires
62
+        include_spip('public/aiguiller');
63
+        if (
64
+            // cas des appels actions ?action=xxx
65
+            traiter_appels_actions()
66
+            or
67
+            // cas des hits ajax sur les inclusions ajax
68
+            traiter_appels_inclusions_ajax()
69
+            or
70
+            // cas des formulaires charger/verifier/traiter
71
+            traiter_formulaires_dynamiques()
72
+        ) {
73
+            exit;
74
+        } // le hit est fini !
75
+    }
76 76
 }
77 77
 // securiser les redirect du back-office
78 78
 if (_request('redirect')) {
79
-	if (!function_exists('securiser_redirect_action')) {
80
-		include_spip('public/aiguiller');
81
-	}
82
-	set_request('redirect', securiser_redirect_action(_request('redirect')));
79
+    if (!function_exists('securiser_redirect_action')) {
80
+        include_spip('public/aiguiller');
81
+    }
82
+    set_request('redirect', securiser_redirect_action(_request('redirect')));
83 83
 }
84 84
 
85 85
 
@@ -89,12 +89,12 @@  discard block
 block discarded – undo
89 89
 
90 90
 // Controle de la version, sauf si on est deja en train de s'en occuper
91 91
 if (
92
-	!$reinstall == 'oui'
93
-	and !_AJAX
94
-	and isset($GLOBALS['meta']['version_installee'])
95
-	and ($GLOBALS['spip_version_base'] != (str_replace(',', '.', $GLOBALS['meta']['version_installee'])))
92
+    !$reinstall == 'oui'
93
+    and !_AJAX
94
+    and isset($GLOBALS['meta']['version_installee'])
95
+    and ($GLOBALS['spip_version_base'] != (str_replace(',', '.', $GLOBALS['meta']['version_installee'])))
96 96
 ) {
97
-	$exec = 'demande_mise_a_jour';
97
+    $exec = 'demande_mise_a_jour';
98 98
 }
99 99
 
100 100
 // Quand une action d'administration est en cours (meta "admin"),
@@ -104,39 +104,39 @@  discard block
 block discarded – undo
104 104
 // sinon c'est qu'elle a ete interrompue et il faut la reprendre
105 105
 
106 106
 elseif (isset($GLOBALS['meta']['admin'])) {
107
-	if (preg_match('/^(.*)_(\d+)_/', $GLOBALS['meta']['admin'], $l)) {
108
-		[, $var_f, $n] = $l;
109
-	}
110
-	if (
111
-		_AJAX
112
-		or !(
113
-			isset($_COOKIE['spip_admin'])
114
-			or (isset($GLOBALS['visiteur_session']) and $GLOBALS['visiteur_session']['statut'] == '0minirezo')
115
-		)
116
-	) {
117
-		spip_log('Quand la meta admin vaut ' .
118
-			$GLOBALS['meta']['admin'] .
119
-			' seul un admin peut se connecter et sans AJAX.' .
120
-			' En cas de probleme, detruire cette meta.');
121
-		die(_T('info_travaux_texte'));
122
-	}
123
-	if ($n) {
124
-		[, $var_f, $n] = $l;
125
-		if (tester_url_ecrire("base_$var_f")) {
126
-			$var_f = "base_$var_f";
127
-		}
128
-		if ($var_f != $exec) {
129
-			spip_log("Le script $var_f lance par auteur$n se substitue a l'exec $exec");
130
-			$exec = $var_f;
131
-			set_request('exec', $exec);
132
-		}
133
-	}
107
+    if (preg_match('/^(.*)_(\d+)_/', $GLOBALS['meta']['admin'], $l)) {
108
+        [, $var_f, $n] = $l;
109
+    }
110
+    if (
111
+        _AJAX
112
+        or !(
113
+            isset($_COOKIE['spip_admin'])
114
+            or (isset($GLOBALS['visiteur_session']) and $GLOBALS['visiteur_session']['statut'] == '0minirezo')
115
+        )
116
+    ) {
117
+        spip_log('Quand la meta admin vaut ' .
118
+            $GLOBALS['meta']['admin'] .
119
+            ' seul un admin peut se connecter et sans AJAX.' .
120
+            ' En cas de probleme, detruire cette meta.');
121
+        die(_T('info_travaux_texte'));
122
+    }
123
+    if ($n) {
124
+        [, $var_f, $n] = $l;
125
+        if (tester_url_ecrire("base_$var_f")) {
126
+            $var_f = "base_$var_f";
127
+        }
128
+        if ($var_f != $exec) {
129
+            spip_log("Le script $var_f lance par auteur$n se substitue a l'exec $exec");
130
+            $exec = $var_f;
131
+            set_request('exec', $exec);
132
+        }
133
+    }
134 134
 }
135 135
 // si nom pas plausible, prendre le script par defaut
136 136
 // attention aux deux cas 404/403 qui commencent par un 4 !
137 137
 elseif (!preg_match(',^[a-z4_][0-9a-z_-]*$,i', $exec)) {
138
-	$exec = 'accueil';
139
-	set_request('exec', $exec);
138
+    $exec = 'accueil';
139
+    set_request('exec', $exec);
140 140
 }
141 141
 
142 142
 //  si la langue est specifiee par cookie et ne correspond pas
@@ -144,19 +144,19 @@  discard block
 block discarded – undo
144 144
 // on appelle directement la fonction, car un appel d'action peut conduire a une boucle infinie
145 145
 // si le cookie n'est pas pose correctement dans l'action
146 146
 if (
147
-	!$var_auth and isset($_COOKIE['spip_lang_ecrire'])
148
-	and $_COOKIE['spip_lang_ecrire'] <> $GLOBALS['visiteur_session']['lang']
147
+    !$var_auth and isset($_COOKIE['spip_lang_ecrire'])
148
+    and $_COOKIE['spip_lang_ecrire'] <> $GLOBALS['visiteur_session']['lang']
149 149
 ) {
150
-	include_spip('action/converser');
151
-	action_converser_post($GLOBALS['visiteur_session']['lang'], true);
150
+    include_spip('action/converser');
151
+    action_converser_post($GLOBALS['visiteur_session']['lang'], true);
152 152
 }
153 153
 
154 154
 if ($var_f = tester_url_ecrire($exec)) {
155
-	$var_f = charger_fonction($var_f);
156
-	$var_f(); // at last
155
+    $var_f = charger_fonction($var_f);
156
+    $var_f(); // at last
157 157
 } else {
158
-	// Rien de connu: rerouter vers exec=404 au lieu d'echouer
159
-	// ce qui permet de laisser la main a un plugin
160
-	$var_f = charger_fonction('404');
161
-	$var_f($exec);
158
+    // Rien de connu: rerouter vers exec=404 au lieu d'echouer
159
+    // ce qui permet de laisser la main a un plugin
160
+    $var_f = charger_fonction('404');
161
+    $var_f($exec);
162 162
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -9,7 +9,7 @@  discard block
 block discarded – undo
9 9
  *  Ce programme est un logiciel libre distribué sous licence GNU/GPL.     *
10 10
 \***************************************************************************/
11 11
 
12
-require_once __DIR__ . '/../vendor/autoload.php';
12
+require_once __DIR__.'/../vendor/autoload.php';
13 13
 
14 14
 /**
15 15
  * Fichier d'exécution de l'interface privée
@@ -29,7 +29,7 @@  discard block
 block discarded – undo
29 29
 // Determiner l'action demandee
30 30
 //
31 31
 
32
-$exec = (string)_request('exec');
32
+$exec = (string) _request('exec');
33 33
 $reinstall = (!is_null(_request('reinstall'))) ? _request('reinstall') : ($exec == 'install' ? 'oui' : null);
34 34
 //
35 35
 // Les scripts d'insallation n'authentifient pas, forcement,
@@ -115,9 +115,9 @@  discard block
 block discarded – undo
115 115
 			or (isset($GLOBALS['visiteur_session']) and $GLOBALS['visiteur_session']['statut'] == '0minirezo')
116 116
 		)
117 117
 	) {
118
-		spip_log('Quand la meta admin vaut ' .
119
-			$GLOBALS['meta']['admin'] .
120
-			' seul un admin peut se connecter et sans AJAX.' .
118
+		spip_log('Quand la meta admin vaut '.
119
+			$GLOBALS['meta']['admin'].
120
+			' seul un admin peut se connecter et sans AJAX.'.
121 121
 			' En cas de probleme, detruire cette meta.');
122 122
 		die(_T('info_travaux_texte'));
123 123
 	}
Please login to merge, or discard this patch.
ecrire/action/editer_objet.php 2 patches
Spacing   +20 added lines, -20 removed lines patch added patch discarded remove patch
@@ -76,12 +76,12 @@  discard block
 block discarded – undo
76 76
  */
77 77
 function objet_modifier($objet, $id, $set = null) {
78 78
 	if (($t = objet_type($objet)) !== $objet) {
79
-		spip_log("objet_modifier: appel avec type $objet invalide au lieu de $t", 'editer' . _LOG_INFO_IMPORTANTE);
79
+		spip_log("objet_modifier: appel avec type $objet invalide au lieu de $t", 'editer'._LOG_INFO_IMPORTANTE);
80 80
 		$objet = $t;
81 81
 	}
82 82
 	if (
83
-		include_spip('action/editer_' . $objet)
84
-		and function_exists($modifier = $objet . '_modifier')
83
+		include_spip('action/editer_'.$objet)
84
+		and function_exists($modifier = $objet.'_modifier')
85 85
 	) {
86 86
 		return $modifier($id, $set);
87 87
 	}
@@ -90,7 +90,7 @@  discard block
 block discarded – undo
90 90
 	$trouver_table = charger_fonction('trouver_table', 'base');
91 91
 	$desc = $trouver_table($table_sql);
92 92
 	if (!$desc or !isset($desc['field'])) {
93
-		spip_log("Objet $objet inconnu dans objet_modifier", 'editer' . _LOG_ERREUR);
93
+		spip_log("Objet $objet inconnu dans objet_modifier", 'editer'._LOG_ERREUR);
94 94
 
95 95
 		return _L("Erreur objet $objet inconnu");
96 96
 	}
@@ -170,12 +170,12 @@  discard block
 block discarded – undo
170 170
 function objet_inserer($objet, $id_parent = null, $set = null) {
171 171
 	$d = null;
172 172
 	if (($t = objet_type($objet)) !== $objet) {
173
-		spip_log("objet_inserer: appel avec type $objet invalide au lieu de $t", 'editer' . _LOG_INFO_IMPORTANTE);
173
+		spip_log("objet_inserer: appel avec type $objet invalide au lieu de $t", 'editer'._LOG_INFO_IMPORTANTE);
174 174
 		$objet = $t;
175 175
 	}
176 176
 	if (
177
-		include_spip('action/editer_' . $objet)
178
-		and function_exists($inserer = $objet . '_inserer')
177
+		include_spip('action/editer_'.$objet)
178
+		and function_exists($inserer = $objet.'_inserer')
179 179
 	) {
180 180
 		return $inserer($id_parent, $set);
181 181
 	}
@@ -196,7 +196,7 @@  discard block
 block discarded – undo
196 196
 			$row = sql_fetsel('id_rubrique, id_secteur, lang', 'spip_rubriques', 'id_parent=0', '', '0+titre,titre', '1');
197 197
 			$id_rubrique = $row['id_rubrique'];
198 198
 		} else {
199
-			$row = sql_fetsel('lang, id_secteur', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique));
199
+			$row = sql_fetsel('lang, id_secteur', 'spip_rubriques', 'id_rubrique='.intval($id_rubrique));
200 200
 		}
201 201
 
202 202
 		$champs['id_rubrique'] = $id_rubrique;
@@ -314,12 +314,12 @@  discard block
 block discarded – undo
314 314
  */
315 315
 function objet_instituer($objet, $id, $c, $calcul_rub = true) {
316 316
 	if (($t = objet_type($objet)) !== $objet) {
317
-		spip_log("objet_instituer: appel avec type $objet invalide au lieu de $t", 'editer' . _LOG_INFO_IMPORTANTE);
317
+		spip_log("objet_instituer: appel avec type $objet invalide au lieu de $t", 'editer'._LOG_INFO_IMPORTANTE);
318 318
 		$objet = $t;
319 319
 	}
320 320
 	if (
321
-		include_spip('action/editer_' . $objet)
322
-		and function_exists($instituer = $objet . '_instituer')
321
+		include_spip('action/editer_'.$objet)
322
+		and function_exists($instituer = $objet.'_instituer')
323 323
 	) {
324 324
 		return $instituer($id, $c, $calcul_rub);
325 325
 	}
@@ -348,7 +348,7 @@  discard block
 block discarded – undo
348 348
 	$sel[] = ($champ_date ? "$champ_date as date" : "'' as date");
349 349
 	$sel[] = (isset($desc['field']['id_rubrique']) ? 'id_rubrique' : '0 as id_rubrique');
350 350
 
351
-	$row = sql_fetsel($sel, $table_sql, id_table_objet($objet) . '=' . intval($id));
351
+	$row = sql_fetsel($sel, $table_sql, id_table_objet($objet).'='.intval($id));
352 352
 
353 353
 	$id_rubrique = $row['id_rubrique'];
354 354
 	$statut_ancien = $statut = $row['statut'];
@@ -371,7 +371,7 @@  discard block
 block discarded – undo
371 371
 			if ($s != 'publie' and autoriser('modifier', $objet, $id)) {
372 372
 				$statut = $champs['statut'] = $s;
373 373
 			} else {
374
-				spip_log("editer_objet $objet #$id refus " . json_encode($c, JSON_THROW_ON_ERROR), 'editer' . _LOG_INFO_IMPORTANTE);
374
+				spip_log("editer_objet $objet #$id refus ".json_encode($c, JSON_THROW_ON_ERROR), 'editer'._LOG_INFO_IMPORTANTE);
375 375
 			}
376 376
 		}
377 377
 
@@ -401,7 +401,7 @@  discard block
 block discarded – undo
401 401
 		and isset($c['id_parent'])
402 402
 		and $id_parent = $c['id_parent']
403 403
 		and $id_parent != $id_rubrique
404
-		and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent)))
404
+		and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique='.intval($id_parent)))
405 405
 	) {
406 406
 		$champs['id_rubrique'] = $id_parent;
407 407
 
@@ -500,7 +500,7 @@  discard block
 block discarded – undo
500 500
 	// Si on deplace l'objet
501 501
 	// changer aussi son secteur et sa langue (si heritee)
502 502
 	if (isset($champs['id_rubrique'])) {
503
-		$row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique=' . sql_quote($champs['id_rubrique']));
503
+		$row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique='.sql_quote($champs['id_rubrique']));
504 504
 		$langue = $row_rub['lang'];
505 505
 
506 506
 		if (isset($desc['field']['id_secteur'])) {
@@ -512,7 +512,7 @@  discard block
 block discarded – undo
512 512
 				sql_fetsel(
513 513
 					'1',
514 514
 					$table_sql,
515
-					id_table_objet($objet) . '=' . intval($id) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue)
515
+					id_table_objet($objet).'='.intval($id)." AND langue_choisie<>'oui' AND lang<>".sql_quote($langue)
516 516
 				)
517 517
 			) {
518 518
 				$champs['lang'] = $langue;
@@ -523,7 +523,7 @@  discard block
 block discarded – undo
523 523
 	if (!$champs) {
524 524
 		return;
525 525
 	}
526
-	sql_updateq($table_sql, $champs, id_table_objet($objet) . '=' . intval($id));
526
+	sql_updateq($table_sql, $champs, id_table_objet($objet).'='.intval($id));
527 527
 
528 528
 	// Changer le statut des rubriques concernees
529 529
 	if ($cond) {
@@ -567,7 +567,7 @@  discard block
 block discarded – undo
567 567
  */
568 568
 function objet_lire($objet, $valeur_id, $options = []) {
569 569
 	if (($t = objet_type($objet)) !== $objet) {
570
-		spip_log("objet_lire: appel avec type $objet invalide au lieu de $t", 'editer' . _LOG_INFO_IMPORTANTE);
570
+		spip_log("objet_lire: appel avec type $objet invalide au lieu de $t", 'editer'._LOG_INFO_IMPORTANTE);
571 571
 		$objet = $t;
572 572
 	}
573 573
 
@@ -589,7 +589,7 @@  discard block
 block discarded – undo
589 589
 	) {
590 590
 		// Il est possible pour un type d'objet de fournir une fonction de lecture de tous les champs d'un objet.
591 591
 		if (
592
-			include_spip('action/editer_' . $objet)
592
+			include_spip('action/editer_'.$objet)
593 593
 			and function_exists($lire = "{$objet}_lire_champs")
594 594
 		) {
595 595
 			$valeurs = $lire($objet, $valeur_id, $champ_id);
@@ -599,7 +599,7 @@  discard block
 block discarded – undo
599 599
 
600 600
 			// La condition est appliquée sur le champ désigné par l'utilisateur.
601 601
 			$where = [
602
-				$champ_id . '=' . sql_quote($valeur_id)
602
+				$champ_id.'='.sql_quote($valeur_id)
603 603
 			];
604 604
 
605 605
 			// Acquisition de tous les champs de l'objet : si l'accès SQL retourne une erreur on renvoie un tableau vide.
Please login to merge, or discard this patch.
Indentation   +561 added lines, -561 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  */
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -33,36 +33,36 @@  discard block
 block discarded – undo
33 33
  */
34 34
 function action_editer_objet_dist($id = null, $objet = null, $set = null) {
35 35
 
36
-	// appel direct depuis une url avec arg = "objet/id"
37
-	if (is_null($id) or is_null($objet)) {
38
-		$securiser_action = charger_fonction('securiser_action', 'inc');
39
-		$arg = $securiser_action();
40
-		[$objet, $id] = array_pad(explode('/', $arg, 2), 2, null);
41
-	}
42
-
43
-	// appel incorrect ou depuis une url erronnée interdit
44
-	if (is_null($id) or is_null($objet)) {
45
-		include_spip('inc/minipres');
46
-		echo minipres(_T('info_acces_interdit'));
47
-		die();
48
-	}
49
-
50
-	// si id n'est pas un nombre, c'est une creation
51
-	// mais on verifie qu'on a toutes les donnees qu'il faut.
52
-	if (!$id = intval($id)) {
53
-		// on ne sait pas si un parent existe mais on essaye
54
-		$id_parent = _request('id_parent');
55
-		$id = objet_inserer($objet, $id_parent);
56
-	}
57
-
58
-	if (!($id = intval($id)) > 0) {
59
-		return [$id, _L('echec enregistrement en base')];
60
-	}
61
-
62
-	// Enregistre l'envoi dans la BD
63
-	$err = objet_modifier($objet, $id, $set);
64
-
65
-	return [$id, $err];
36
+    // appel direct depuis une url avec arg = "objet/id"
37
+    if (is_null($id) or is_null($objet)) {
38
+        $securiser_action = charger_fonction('securiser_action', 'inc');
39
+        $arg = $securiser_action();
40
+        [$objet, $id] = array_pad(explode('/', $arg, 2), 2, null);
41
+    }
42
+
43
+    // appel incorrect ou depuis une url erronnée interdit
44
+    if (is_null($id) or is_null($objet)) {
45
+        include_spip('inc/minipres');
46
+        echo minipres(_T('info_acces_interdit'));
47
+        die();
48
+    }
49
+
50
+    // si id n'est pas un nombre, c'est une creation
51
+    // mais on verifie qu'on a toutes les donnees qu'il faut.
52
+    if (!$id = intval($id)) {
53
+        // on ne sait pas si un parent existe mais on essaye
54
+        $id_parent = _request('id_parent');
55
+        $id = objet_inserer($objet, $id_parent);
56
+    }
57
+
58
+    if (!($id = intval($id)) > 0) {
59
+        return [$id, _L('echec enregistrement en base')];
60
+    }
61
+
62
+    // Enregistre l'envoi dans la BD
63
+    $err = objet_modifier($objet, $id, $set);
64
+
65
+    return [$id, $err];
66 66
 }
67 67
 
68 68
 /**
@@ -75,85 +75,85 @@  discard block
 block discarded – undo
75 75
  * @return mixed|string
76 76
  */
77 77
 function objet_modifier($objet, $id, $set = null) {
78
-	if (($t = objet_type($objet)) !== $objet) {
79
-		spip_log("objet_modifier: appel avec type $objet invalide au lieu de $t", 'editer' . _LOG_INFO_IMPORTANTE);
80
-		$objet = $t;
81
-	}
82
-	if (
83
-		include_spip('action/editer_' . $objet)
84
-		and function_exists($modifier = $objet . '_modifier')
85
-	) {
86
-		return $modifier($id, $set);
87
-	}
88
-
89
-	$table_sql = table_objet_sql($objet);
90
-	$trouver_table = charger_fonction('trouver_table', 'base');
91
-	$desc = $trouver_table($table_sql);
92
-	if (!$desc or !isset($desc['field'])) {
93
-		spip_log("Objet $objet inconnu dans objet_modifier", 'editer' . _LOG_ERREUR);
94
-
95
-		return _L("Erreur objet $objet inconnu");
96
-	}
97
-	include_spip('inc/modifier');
98
-
99
-	$champ_date = '';
100
-	if (isset($desc['date']) and $desc['date']) {
101
-		$champ_date = $desc['date'];
102
-	} elseif (isset($desc['field']['date'])) {
103
-		$champ_date = 'date';
104
-	}
105
-
106
-	$include_list = array_keys($desc['field']);
107
-	// on ne traite pas la cle primaire par defaut, notamment car
108
-	// sur une creation, id_x vaut 'oui', et serait enregistre en id_x=0 dans la base
109
-	$include_list = array_diff($include_list, [$desc['key']['PRIMARY KEY']]);
110
-
111
-	if (isset($desc['champs_editables']) and is_array($desc['champs_editables'])) {
112
-		$include_list = $desc['champs_editables'];
113
-	}
114
-	$c = collecter_requests(
115
-		// include list
116
-		$include_list,
117
-		// exclude list
118
-		[$champ_date, 'statut', 'id_parent', 'id_secteur'],
119
-		// donnees eventuellement fournies
120
-		$set
121
-	);
122
-
123
-	// Si l'objet est publie, invalider les caches et demander sa reindexation
124
-	if (objet_test_si_publie($objet, $id)) {
125
-		$invalideur = "id='$objet/$id'";
126
-		$indexation = true;
127
-	} else {
128
-		$invalideur = '';
129
-		$indexation = false;
130
-	}
131
-
132
-	if (
133
-		$err = objet_modifier_champs(
134
-			$objet,
135
-			$id,
136
-			[
137
-			'data' => $set,
138
-			'nonvide' => '',
139
-			'invalideur' => $invalideur,
140
-			'indexation' => $indexation,
141
-			// champ a mettre a date('Y-m-d H:i:s') s'il y a modif
142
-			'date_modif' => (isset($desc['field']['date_modif']) ? 'date_modif' : '')
143
-			],
144
-			$c
145
-		)
146
-	) {
147
-		return $err;
148
-	}
149
-
150
-	// Modification de statut, changement de rubrique ?
151
-	// FIXME: Ici lorsqu'un $set est passé, la fonction collecter_requests() retourne tout
152
-	//         le tableau $set hors liste d’exclusion, mais du coup on a possiblement des champs en trop.
153
-	$c = collecter_requests([$champ_date, 'statut', 'id_parent'], [], $set);
154
-	$err = objet_instituer($objet, $id, $c);
155
-
156
-	return $err;
78
+    if (($t = objet_type($objet)) !== $objet) {
79
+        spip_log("objet_modifier: appel avec type $objet invalide au lieu de $t", 'editer' . _LOG_INFO_IMPORTANTE);
80
+        $objet = $t;
81
+    }
82
+    if (
83
+        include_spip('action/editer_' . $objet)
84
+        and function_exists($modifier = $objet . '_modifier')
85
+    ) {
86
+        return $modifier($id, $set);
87
+    }
88
+
89
+    $table_sql = table_objet_sql($objet);
90
+    $trouver_table = charger_fonction('trouver_table', 'base');
91
+    $desc = $trouver_table($table_sql);
92
+    if (!$desc or !isset($desc['field'])) {
93
+        spip_log("Objet $objet inconnu dans objet_modifier", 'editer' . _LOG_ERREUR);
94
+
95
+        return _L("Erreur objet $objet inconnu");
96
+    }
97
+    include_spip('inc/modifier');
98
+
99
+    $champ_date = '';
100
+    if (isset($desc['date']) and $desc['date']) {
101
+        $champ_date = $desc['date'];
102
+    } elseif (isset($desc['field']['date'])) {
103
+        $champ_date = 'date';
104
+    }
105
+
106
+    $include_list = array_keys($desc['field']);
107
+    // on ne traite pas la cle primaire par defaut, notamment car
108
+    // sur une creation, id_x vaut 'oui', et serait enregistre en id_x=0 dans la base
109
+    $include_list = array_diff($include_list, [$desc['key']['PRIMARY KEY']]);
110
+
111
+    if (isset($desc['champs_editables']) and is_array($desc['champs_editables'])) {
112
+        $include_list = $desc['champs_editables'];
113
+    }
114
+    $c = collecter_requests(
115
+        // include list
116
+        $include_list,
117
+        // exclude list
118
+        [$champ_date, 'statut', 'id_parent', 'id_secteur'],
119
+        // donnees eventuellement fournies
120
+        $set
121
+    );
122
+
123
+    // Si l'objet est publie, invalider les caches et demander sa reindexation
124
+    if (objet_test_si_publie($objet, $id)) {
125
+        $invalideur = "id='$objet/$id'";
126
+        $indexation = true;
127
+    } else {
128
+        $invalideur = '';
129
+        $indexation = false;
130
+    }
131
+
132
+    if (
133
+        $err = objet_modifier_champs(
134
+            $objet,
135
+            $id,
136
+            [
137
+            'data' => $set,
138
+            'nonvide' => '',
139
+            'invalideur' => $invalideur,
140
+            'indexation' => $indexation,
141
+            // champ a mettre a date('Y-m-d H:i:s') s'il y a modif
142
+            'date_modif' => (isset($desc['field']['date_modif']) ? 'date_modif' : '')
143
+            ],
144
+            $c
145
+        )
146
+    ) {
147
+        return $err;
148
+    }
149
+
150
+    // Modification de statut, changement de rubrique ?
151
+    // FIXME: Ici lorsqu'un $set est passé, la fonction collecter_requests() retourne tout
152
+    //         le tableau $set hors liste d’exclusion, mais du coup on a possiblement des champs en trop.
153
+    $c = collecter_requests([$champ_date, 'statut', 'id_parent'], [], $set);
154
+    $err = objet_instituer($objet, $id, $c);
155
+
156
+    return $err;
157 157
 }
158 158
 
159 159
 /**
@@ -168,157 +168,157 @@  discard block
 block discarded – undo
168 168
  * @return bool|int
169 169
  */
170 170
 function objet_inserer($objet, $id_parent = null, $set = null) {
171
-	$d = null;
172
-	if (($t = objet_type($objet)) !== $objet) {
173
-		spip_log("objet_inserer: appel avec type $objet invalide au lieu de $t", 'editer' . _LOG_INFO_IMPORTANTE);
174
-		$objet = $t;
175
-	}
176
-	if (
177
-		include_spip('action/editer_' . $objet)
178
-		and function_exists($inserer = $objet . '_inserer')
179
-	) {
180
-		return $inserer($id_parent, $set);
181
-	}
182
-
183
-	$table_sql = table_objet_sql($objet);
184
-	$trouver_table = charger_fonction('trouver_table', 'base');
185
-	$desc = $trouver_table($table_sql);
186
-	if (!$desc or !isset($desc['field'])) {
187
-		return 0;
188
-	}
189
-
190
-	$lang_rub = '';
191
-	$champs = [];
192
-	if (isset($desc['field']['id_rubrique'])) {
193
-		// Si id_rubrique vaut 0 ou n'est pas definie, creer l'objet
194
-		// dans la premiere rubrique racine
195
-		if (!$id_rubrique = intval($id_parent)) {
196
-			$row = sql_fetsel('id_rubrique, id_secteur, lang', 'spip_rubriques', 'id_parent=0', '', '0+titre,titre', '1');
197
-			$id_rubrique = $row['id_rubrique'];
198
-		} else {
199
-			$row = sql_fetsel('lang, id_secteur', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique));
200
-		}
201
-
202
-		$champs['id_rubrique'] = $id_rubrique;
203
-		if (isset($desc['field']['id_secteur'])) {
204
-			$champs['id_secteur'] = $row['id_secteur'];
205
-		}
206
-		$lang_rub = $row['lang'];
207
-	}
208
-
209
-	// La langue a la creation : si les liens de traduction sont autorises
210
-	// dans les rubriques, on essaie avec la langue de l'auteur,
211
-	// ou a defaut celle de la rubrique
212
-	// Sinon c'est la langue de la rubrique qui est choisie + heritee
213
-	if (
214
-		isset($desc['field']['lang']) and !empty($GLOBALS['meta']['multi_objets']) and in_array(
215
-			$table_sql,
216
-			explode(',', $GLOBALS['meta']['multi_objets'])
217
-		)
218
-	) {
219
-		lang_select($GLOBALS['visiteur_session']['lang']);
220
-		if (
221
-			in_array(
222
-				$GLOBALS['spip_lang'],
223
-				explode(',', $GLOBALS['meta']['langues_multilingue'])
224
-			)
225
-		) {
226
-			$champs['lang'] = $GLOBALS['spip_lang'];
227
-			if (isset($desc['field']['langue_choisie'])) {
228
-				$champs['langue_choisie'] = 'oui';
229
-			}
230
-		}
231
-	} elseif (isset($desc['field']['lang']) and isset($desc['field']['langue_choisie'])) {
232
-		$champs['lang'] = ($lang_rub ?: $GLOBALS['meta']['langue_site']);
233
-		$champs['langue_choisie'] = 'non';
234
-	}
235
-
236
-	if (isset($desc['field']['statut'])) {
237
-		if (isset($desc['statut_textes_instituer'])) {
238
-			$cles_statut = array_keys($desc['statut_textes_instituer']);
239
-			$champs['statut'] = reset($cles_statut);
240
-		} else {
241
-			$champs['statut'] = 'prepa';
242
-		}
243
-	}
244
-
245
-
246
-	if ((isset($desc['date']) and $d = $desc['date']) or isset($desc['field'][$d = 'date'])) {
247
-		$champs[$d] = date('Y-m-d H:i:s');
248
-	}
249
-
250
-	if ($set) {
251
-		$champs = array_merge($champs, $set);
252
-	}
253
-
254
-	// Envoyer aux plugins
255
-	$champs = pipeline(
256
-		'pre_insertion',
257
-		[
258
-			'args' => [
259
-				'table' => $table_sql,
260
-				'id_parent' => $id_parent,
261
-			],
262
-			'data' => $champs
263
-		]
264
-	);
265
-
266
-	$id = sql_insertq($table_sql, $champs);
267
-
268
-	if ($id) {
269
-		// controler si le serveur n'a pas renvoye une erreur
270
-		// et associer l'auteur sinon
271
-		// si la table n'a pas deja un champ id_auteur
272
-		// et si le form n'a pas poste un id_auteur (meme vide, ce qui sert a annuler cette auto association)
273
-		if (
274
-			$id > 0
275
-			and !isset($desc['field']['id_auteur'])
276
-		) {
277
-			$id_auteur = ((is_null(_request('id_auteur')) and isset($GLOBALS['visiteur_session']['id_auteur'])) ?
278
-				$GLOBALS['visiteur_session']['id_auteur']
279
-				: _request('id_auteur'));
280
-			if ($id_auteur) {
281
-				include_spip('action/editer_auteur');
282
-				auteur_associer($id_auteur, [$objet => $id]);
283
-			}
284
-		}
285
-
286
-		pipeline(
287
-			'post_insertion',
288
-			[
289
-				'args' => [
290
-					'table' => $table_sql,
291
-					'id_parent' => $id_parent,
292
-					'id_objet' => $id,
293
-				],
294
-				'data' => $champs
295
-			]
296
-		);
297
-	}
171
+    $d = null;
172
+    if (($t = objet_type($objet)) !== $objet) {
173
+        spip_log("objet_inserer: appel avec type $objet invalide au lieu de $t", 'editer' . _LOG_INFO_IMPORTANTE);
174
+        $objet = $t;
175
+    }
176
+    if (
177
+        include_spip('action/editer_' . $objet)
178
+        and function_exists($inserer = $objet . '_inserer')
179
+    ) {
180
+        return $inserer($id_parent, $set);
181
+    }
182
+
183
+    $table_sql = table_objet_sql($objet);
184
+    $trouver_table = charger_fonction('trouver_table', 'base');
185
+    $desc = $trouver_table($table_sql);
186
+    if (!$desc or !isset($desc['field'])) {
187
+        return 0;
188
+    }
189
+
190
+    $lang_rub = '';
191
+    $champs = [];
192
+    if (isset($desc['field']['id_rubrique'])) {
193
+        // Si id_rubrique vaut 0 ou n'est pas definie, creer l'objet
194
+        // dans la premiere rubrique racine
195
+        if (!$id_rubrique = intval($id_parent)) {
196
+            $row = sql_fetsel('id_rubrique, id_secteur, lang', 'spip_rubriques', 'id_parent=0', '', '0+titre,titre', '1');
197
+            $id_rubrique = $row['id_rubrique'];
198
+        } else {
199
+            $row = sql_fetsel('lang, id_secteur', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique));
200
+        }
201
+
202
+        $champs['id_rubrique'] = $id_rubrique;
203
+        if (isset($desc['field']['id_secteur'])) {
204
+            $champs['id_secteur'] = $row['id_secteur'];
205
+        }
206
+        $lang_rub = $row['lang'];
207
+    }
208
+
209
+    // La langue a la creation : si les liens de traduction sont autorises
210
+    // dans les rubriques, on essaie avec la langue de l'auteur,
211
+    // ou a defaut celle de la rubrique
212
+    // Sinon c'est la langue de la rubrique qui est choisie + heritee
213
+    if (
214
+        isset($desc['field']['lang']) and !empty($GLOBALS['meta']['multi_objets']) and in_array(
215
+            $table_sql,
216
+            explode(',', $GLOBALS['meta']['multi_objets'])
217
+        )
218
+    ) {
219
+        lang_select($GLOBALS['visiteur_session']['lang']);
220
+        if (
221
+            in_array(
222
+                $GLOBALS['spip_lang'],
223
+                explode(',', $GLOBALS['meta']['langues_multilingue'])
224
+            )
225
+        ) {
226
+            $champs['lang'] = $GLOBALS['spip_lang'];
227
+            if (isset($desc['field']['langue_choisie'])) {
228
+                $champs['langue_choisie'] = 'oui';
229
+            }
230
+        }
231
+    } elseif (isset($desc['field']['lang']) and isset($desc['field']['langue_choisie'])) {
232
+        $champs['lang'] = ($lang_rub ?: $GLOBALS['meta']['langue_site']);
233
+        $champs['langue_choisie'] = 'non';
234
+    }
235
+
236
+    if (isset($desc['field']['statut'])) {
237
+        if (isset($desc['statut_textes_instituer'])) {
238
+            $cles_statut = array_keys($desc['statut_textes_instituer']);
239
+            $champs['statut'] = reset($cles_statut);
240
+        } else {
241
+            $champs['statut'] = 'prepa';
242
+        }
243
+    }
244
+
245
+
246
+    if ((isset($desc['date']) and $d = $desc['date']) or isset($desc['field'][$d = 'date'])) {
247
+        $champs[$d] = date('Y-m-d H:i:s');
248
+    }
249
+
250
+    if ($set) {
251
+        $champs = array_merge($champs, $set);
252
+    }
253
+
254
+    // Envoyer aux plugins
255
+    $champs = pipeline(
256
+        'pre_insertion',
257
+        [
258
+            'args' => [
259
+                'table' => $table_sql,
260
+                'id_parent' => $id_parent,
261
+            ],
262
+            'data' => $champs
263
+        ]
264
+    );
265
+
266
+    $id = sql_insertq($table_sql, $champs);
267
+
268
+    if ($id) {
269
+        // controler si le serveur n'a pas renvoye une erreur
270
+        // et associer l'auteur sinon
271
+        // si la table n'a pas deja un champ id_auteur
272
+        // et si le form n'a pas poste un id_auteur (meme vide, ce qui sert a annuler cette auto association)
273
+        if (
274
+            $id > 0
275
+            and !isset($desc['field']['id_auteur'])
276
+        ) {
277
+            $id_auteur = ((is_null(_request('id_auteur')) and isset($GLOBALS['visiteur_session']['id_auteur'])) ?
278
+                $GLOBALS['visiteur_session']['id_auteur']
279
+                : _request('id_auteur'));
280
+            if ($id_auteur) {
281
+                include_spip('action/editer_auteur');
282
+                auteur_associer($id_auteur, [$objet => $id]);
283
+            }
284
+        }
285
+
286
+        pipeline(
287
+            'post_insertion',
288
+            [
289
+                'args' => [
290
+                    'table' => $table_sql,
291
+                    'id_parent' => $id_parent,
292
+                    'id_objet' => $id,
293
+                ],
294
+                'data' => $champs
295
+            ]
296
+        );
297
+    }
298 298
 	
299
-	// Appeler une notification
300
-	if ($notifications = charger_fonction('notifications', 'inc')) {
301
-		$notifications(
302
-			"{$objet}_inserer",
303
-			$id,
304
-			[
305
-				'id_parent' => $id_parent,
306
-				'champs' => $champs,
307
-			]
308
-		);
309
-		$notifications(
310
-			'objet_inserer',
311
-			$id,
312
-			[
313
-				'objet' => $objet,
314
-				'id_objet' => $id,
315
-				'id_parent' => $id_parent,
316
-				'champs' => $champs,
317
-			]
318
-		);
319
-	}
320
-
321
-	return $id;
299
+    // Appeler une notification
300
+    if ($notifications = charger_fonction('notifications', 'inc')) {
301
+        $notifications(
302
+            "{$objet}_inserer",
303
+            $id,
304
+            [
305
+                'id_parent' => $id_parent,
306
+                'champs' => $champs,
307
+            ]
308
+        );
309
+        $notifications(
310
+            'objet_inserer',
311
+            $id,
312
+            [
313
+                'objet' => $objet,
314
+                'id_objet' => $id,
315
+                'id_parent' => $id_parent,
316
+                'champs' => $champs,
317
+            ]
318
+        );
319
+    }
320
+
321
+    return $id;
322 322
 }
323 323
 
324 324
 
@@ -335,138 +335,138 @@  discard block
 block discarded – undo
335 335
  * @return string
336 336
  */
337 337
 function objet_instituer($objet, $id, $c, $calcul_rub = true) {
338
-	if (($t = objet_type($objet)) !== $objet) {
339
-		spip_log("objet_instituer: appel avec type $objet invalide au lieu de $t", 'editer' . _LOG_INFO_IMPORTANTE);
340
-		$objet = $t;
341
-	}
342
-	if (
343
-		include_spip('action/editer_' . $objet)
344
-		and function_exists($instituer = $objet . '_instituer')
345
-	) {
346
-		return $instituer($id, $c, $calcul_rub);
347
-	}
348
-
349
-	$table_sql = table_objet_sql($objet);
350
-	$trouver_table = charger_fonction('trouver_table', 'base');
351
-	$desc = $trouver_table($table_sql);
352
-	if (!$desc or !isset($desc['field'])) {
353
-		return _L("Impossible d'instituer $objet : non connu en base");
354
-	}
355
-
356
-	include_spip('inc/autoriser');
357
-	include_spip('inc/rubriques');
358
-	include_spip('inc/modifier');
359
-
360
-	$sel = [];
361
-	$sel[] = (isset($desc['field']['statut']) ? 'statut' : "'' as statut");
362
-
363
-	$champ_date = '';
364
-	if (isset($desc['date']) and $desc['date']) {
365
-		$champ_date = $desc['date'];
366
-	} elseif (isset($desc['field']['date'])) {
367
-		$champ_date = 'date';
368
-	}
369
-
370
-	$sel[] = ($champ_date ? "$champ_date as date" : "'' as date");
371
-	$sel[] = (isset($desc['field']['id_rubrique']) ? 'id_rubrique' : '0 as id_rubrique');
372
-
373
-	$row = sql_fetsel($sel, $table_sql, id_table_objet($objet) . '=' . intval($id));
374
-
375
-	$id_rubrique = $row['id_rubrique'];
376
-	$statut_ancien = $statut = $row['statut'];
377
-	$date_ancienne = $date = $row['date'];
378
-	$champs = [];
379
-
380
-	$d = ($date and isset($c[$champ_date])) ? $c[$champ_date] : null;
381
-	$s = (isset($desc['field']['statut']) and isset($c['statut'])) ? $c['statut'] : $statut;
382
-
383
-	// cf autorisations dans inc/instituer_objet
384
-	if ($s != $statut or ($d and $d != $date)) {
385
-		if (
386
-			$id_rubrique ?
387
-			autoriser('publierdans', 'rubrique', $id_rubrique)
388
-			:
389
-			autoriser('instituer', $objet, $id, null, ['statut' => $s])
390
-		) {
391
-			$statut = $champs['statut'] = $s;
392
-		} else {
393
-			if ($s != 'publie' and autoriser('modifier', $objet, $id)) {
394
-				$statut = $champs['statut'] = $s;
395
-			} else {
396
-				spip_log("editer_objet $objet #$id refus " . json_encode($c, JSON_THROW_ON_ERROR), 'editer' . _LOG_INFO_IMPORTANTE);
397
-			}
398
-		}
399
-
400
-		// En cas de publication, fixer la date a "maintenant"
401
-		// sauf si $c commande autre chose
402
-		// ou si l'objet est deja date dans le futur
403
-		// En cas de proposition d'un objet (mais pas depublication), idem
404
-		if ($champ_date) {
405
-			if (
406
-				$champs['statut'] == 'publie'
407
-				or ($champs['statut'] == 'prop' and !in_array($statut_ancien, ['publie', 'prop']))
408
-				or $d
409
-			) {
410
-				if ($d or strtotime($d = $date) > time()) {
411
-					$champs[$champ_date] = $date = $d;
412
-				} else {
413
-					$champs[$champ_date] = $date = date('Y-m-d H:i:s');
414
-				}
415
-			}
416
-		}
417
-	}
418
-
419
-	// Verifier que la rubrique demandee existe et est differente
420
-	// de la rubrique actuelle
421
-	if (
422
-		$id_rubrique
423
-		and isset($c['id_parent'])
424
-		and $id_parent = $c['id_parent']
425
-		and $id_parent != $id_rubrique
426
-		and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent)))
427
-	) {
428
-		$champs['id_rubrique'] = $id_parent;
429
-
430
-		// si l'objet etait publie
431
-		// et que le demandeur n'est pas admin de la rubrique
432
-		// repasser l'objet en statut 'propose'.
433
-		if (
434
-			$statut == 'publie'
435
-			and !autoriser('publierdans', 'rubrique', $id_rubrique)
436
-		) {
437
-			$champs['statut'] = 'prop';
438
-		}
439
-	}
440
-
441
-
442
-	// Envoyer aux plugins
443
-	$champs = pipeline(
444
-		'pre_edition',
445
-		[
446
-			'args' => [
447
-				'table' => $table_sql,
448
-				'id_objet' => $id,
449
-				'action' => 'instituer',
450
-				'statut_ancien' => $statut_ancien,
451
-				'date_ancienne' => $date_ancienne,
452
-				'id_parent_ancien' => $id_rubrique,
453
-			],
454
-			'data' => $champs
455
-		]
456
-	);
457
-
458
-	if (!(is_countable($champs) ? count($champs) : 0)) {
459
-		return '';
460
-	}
461
-
462
-	// Envoyer les modifs.
463
-	objet_editer_heritage($objet, $id, $id_rubrique, $statut_ancien, $champs, $calcul_rub);
464
-
465
-	// Invalider les caches
466
-	include_spip('inc/invalideur');
467
-	suivre_invalideur("id='$objet/$id'");
468
-
469
-	/*
338
+    if (($t = objet_type($objet)) !== $objet) {
339
+        spip_log("objet_instituer: appel avec type $objet invalide au lieu de $t", 'editer' . _LOG_INFO_IMPORTANTE);
340
+        $objet = $t;
341
+    }
342
+    if (
343
+        include_spip('action/editer_' . $objet)
344
+        and function_exists($instituer = $objet . '_instituer')
345
+    ) {
346
+        return $instituer($id, $c, $calcul_rub);
347
+    }
348
+
349
+    $table_sql = table_objet_sql($objet);
350
+    $trouver_table = charger_fonction('trouver_table', 'base');
351
+    $desc = $trouver_table($table_sql);
352
+    if (!$desc or !isset($desc['field'])) {
353
+        return _L("Impossible d'instituer $objet : non connu en base");
354
+    }
355
+
356
+    include_spip('inc/autoriser');
357
+    include_spip('inc/rubriques');
358
+    include_spip('inc/modifier');
359
+
360
+    $sel = [];
361
+    $sel[] = (isset($desc['field']['statut']) ? 'statut' : "'' as statut");
362
+
363
+    $champ_date = '';
364
+    if (isset($desc['date']) and $desc['date']) {
365
+        $champ_date = $desc['date'];
366
+    } elseif (isset($desc['field']['date'])) {
367
+        $champ_date = 'date';
368
+    }
369
+
370
+    $sel[] = ($champ_date ? "$champ_date as date" : "'' as date");
371
+    $sel[] = (isset($desc['field']['id_rubrique']) ? 'id_rubrique' : '0 as id_rubrique');
372
+
373
+    $row = sql_fetsel($sel, $table_sql, id_table_objet($objet) . '=' . intval($id));
374
+
375
+    $id_rubrique = $row['id_rubrique'];
376
+    $statut_ancien = $statut = $row['statut'];
377
+    $date_ancienne = $date = $row['date'];
378
+    $champs = [];
379
+
380
+    $d = ($date and isset($c[$champ_date])) ? $c[$champ_date] : null;
381
+    $s = (isset($desc['field']['statut']) and isset($c['statut'])) ? $c['statut'] : $statut;
382
+
383
+    // cf autorisations dans inc/instituer_objet
384
+    if ($s != $statut or ($d and $d != $date)) {
385
+        if (
386
+            $id_rubrique ?
387
+            autoriser('publierdans', 'rubrique', $id_rubrique)
388
+            :
389
+            autoriser('instituer', $objet, $id, null, ['statut' => $s])
390
+        ) {
391
+            $statut = $champs['statut'] = $s;
392
+        } else {
393
+            if ($s != 'publie' and autoriser('modifier', $objet, $id)) {
394
+                $statut = $champs['statut'] = $s;
395
+            } else {
396
+                spip_log("editer_objet $objet #$id refus " . json_encode($c, JSON_THROW_ON_ERROR), 'editer' . _LOG_INFO_IMPORTANTE);
397
+            }
398
+        }
399
+
400
+        // En cas de publication, fixer la date a "maintenant"
401
+        // sauf si $c commande autre chose
402
+        // ou si l'objet est deja date dans le futur
403
+        // En cas de proposition d'un objet (mais pas depublication), idem
404
+        if ($champ_date) {
405
+            if (
406
+                $champs['statut'] == 'publie'
407
+                or ($champs['statut'] == 'prop' and !in_array($statut_ancien, ['publie', 'prop']))
408
+                or $d
409
+            ) {
410
+                if ($d or strtotime($d = $date) > time()) {
411
+                    $champs[$champ_date] = $date = $d;
412
+                } else {
413
+                    $champs[$champ_date] = $date = date('Y-m-d H:i:s');
414
+                }
415
+            }
416
+        }
417
+    }
418
+
419
+    // Verifier que la rubrique demandee existe et est differente
420
+    // de la rubrique actuelle
421
+    if (
422
+        $id_rubrique
423
+        and isset($c['id_parent'])
424
+        and $id_parent = $c['id_parent']
425
+        and $id_parent != $id_rubrique
426
+        and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent)))
427
+    ) {
428
+        $champs['id_rubrique'] = $id_parent;
429
+
430
+        // si l'objet etait publie
431
+        // et que le demandeur n'est pas admin de la rubrique
432
+        // repasser l'objet en statut 'propose'.
433
+        if (
434
+            $statut == 'publie'
435
+            and !autoriser('publierdans', 'rubrique', $id_rubrique)
436
+        ) {
437
+            $champs['statut'] = 'prop';
438
+        }
439
+    }
440
+
441
+
442
+    // Envoyer aux plugins
443
+    $champs = pipeline(
444
+        'pre_edition',
445
+        [
446
+            'args' => [
447
+                'table' => $table_sql,
448
+                'id_objet' => $id,
449
+                'action' => 'instituer',
450
+                'statut_ancien' => $statut_ancien,
451
+                'date_ancienne' => $date_ancienne,
452
+                'id_parent_ancien' => $id_rubrique,
453
+            ],
454
+            'data' => $champs
455
+        ]
456
+    );
457
+
458
+    if (!(is_countable($champs) ? count($champs) : 0)) {
459
+        return '';
460
+    }
461
+
462
+    // Envoyer les modifs.
463
+    objet_editer_heritage($objet, $id, $id_rubrique, $statut_ancien, $champs, $calcul_rub);
464
+
465
+    // Invalider les caches
466
+    include_spip('inc/invalideur');
467
+    suivre_invalideur("id='$objet/$id'");
468
+
469
+    /*
470 470
 	if ($date) {
471 471
 		$t = strtotime($date);
472 472
 		$p = @$GLOBALS['meta']['date_prochain_postdate'];
@@ -475,60 +475,60 @@  discard block
 block discarded – undo
475 475
 		}
476 476
 	}*/
477 477
 
478
-	// Pipeline
479
-	pipeline(
480
-		'post_edition',
481
-		[
482
-			'args' => [
483
-				'table' => $table_sql,
484
-				'id_objet' => $id,
485
-				'action' => 'instituer',
486
-				'statut_ancien' => $statut_ancien,
487
-				'date_ancienne' => $date_ancienne,
488
-				'id_parent_ancien' => $id_rubrique,
489
-			],
490
-			'data' => $champs
491
-		]
492
-	);
493
-
494
-	// Notifications
495
-	if ($notifications = charger_fonction('notifications', 'inc')) {
496
-		$notifications(
497
-			"{$objet}_instituer",
498
-			$id,
499
-			[
500
-				'statut' => $statut,
501
-				'statut_ancien' => $statut_ancien,
502
-				'date' => $date,
503
-				'date_ancienne' => $date_ancienne,
504
-				'id_parent_ancien' => $id_rubrique,
505
-				'champs' => $champs,
506
-			]
507
-		);
508
-		$notifications(
509
-			'objet_instituer',
510
-			$id,
511
-			[
512
-				'objet' => $objet,
513
-				'id_objet' => $id,
514
-				'statut' => $statut,
515
-				'statut_ancien' => $statut_ancien,
516
-				'date' => $date,
517
-				'date_ancienne' => $date_ancienne,
518
-				'id_parent_ancien' => $id_rubrique,
519
-				'champs' => $champs,
520
-			]
521
-		);
478
+    // Pipeline
479
+    pipeline(
480
+        'post_edition',
481
+        [
482
+            'args' => [
483
+                'table' => $table_sql,
484
+                'id_objet' => $id,
485
+                'action' => 'instituer',
486
+                'statut_ancien' => $statut_ancien,
487
+                'date_ancienne' => $date_ancienne,
488
+                'id_parent_ancien' => $id_rubrique,
489
+            ],
490
+            'data' => $champs
491
+        ]
492
+    );
493
+
494
+    // Notifications
495
+    if ($notifications = charger_fonction('notifications', 'inc')) {
496
+        $notifications(
497
+            "{$objet}_instituer",
498
+            $id,
499
+            [
500
+                'statut' => $statut,
501
+                'statut_ancien' => $statut_ancien,
502
+                'date' => $date,
503
+                'date_ancienne' => $date_ancienne,
504
+                'id_parent_ancien' => $id_rubrique,
505
+                'champs' => $champs,
506
+            ]
507
+        );
508
+        $notifications(
509
+            'objet_instituer',
510
+            $id,
511
+            [
512
+                'objet' => $objet,
513
+                'id_objet' => $id,
514
+                'statut' => $statut,
515
+                'statut_ancien' => $statut_ancien,
516
+                'date' => $date,
517
+                'date_ancienne' => $date_ancienne,
518
+                'id_parent_ancien' => $id_rubrique,
519
+                'champs' => $champs,
520
+            ]
521
+        );
522 522
 		
523
-		// Rétro-compat
524
-		$notifications(
525
-			"instituer$objet",
526
-			$id,
527
-			['statut' => $statut, 'statut_ancien' => $statut_ancien, 'date' => $date, 'date_ancienne' => $date_ancienne]
528
-		);
529
-	}
530
-
531
-	return ''; // pas d'erreur
523
+        // Rétro-compat
524
+        $notifications(
525
+            "instituer$objet",
526
+            $id,
527
+            ['statut' => $statut, 'statut_ancien' => $statut_ancien, 'date' => $date, 'date_ancienne' => $date_ancienne]
528
+        );
529
+    }
530
+
531
+    return ''; // pas d'erreur
532 532
 }
533 533
 
534 534
 /**
@@ -543,51 +543,51 @@  discard block
 block discarded – undo
543 543
  * @return void
544 544
  */
545 545
 function objet_editer_heritage($objet, $id, $id_rubrique, $statut, $champs, $cond = true) {
546
-	$table_sql = table_objet_sql($objet);
547
-	$trouver_table = charger_fonction('trouver_table', 'base');
548
-	$desc = $trouver_table($table_sql);
549
-
550
-	// Si on deplace l'objet
551
-	// changer aussi son secteur et sa langue (si heritee)
552
-	if (isset($champs['id_rubrique'])) {
553
-		$row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique=' . sql_quote($champs['id_rubrique']));
554
-		$langue = $row_rub['lang'];
555
-
556
-		if (isset($desc['field']['id_secteur'])) {
557
-			$champs['id_secteur'] = $row_rub['id_secteur'];
558
-		}
559
-
560
-		if (isset($desc['field']['lang']) and isset($desc['field']['langue_choisie'])) {
561
-			if (
562
-				sql_fetsel(
563
-					'1',
564
-					$table_sql,
565
-					id_table_objet($objet) . '=' . intval($id) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue)
566
-				)
567
-			) {
568
-				$champs['lang'] = $langue;
569
-			}
570
-		}
571
-	}
572
-
573
-	if (!$champs) {
574
-		return;
575
-	}
576
-	sql_updateq($table_sql, $champs, id_table_objet($objet) . '=' . intval($id));
577
-
578
-	// Changer le statut des rubriques concernees
579
-	if ($cond) {
580
-		include_spip('inc/rubriques');
581
-		//$postdate = ($GLOBALS['meta']["post_dates"] == "non" AND isset($champs['date']) AND (strtotime($champs['date']) < time()))?$champs['date']:false;
582
-		$postdate = false;
583
-		// On rajoute les infos de l'objet
584
-		$infos = [
585
-			'objet' => $objet,
586
-			'id_objet' => $id,
587
-			'statut_ancien' => $statut,
588
-		];
589
-		calculer_rubriques_if($id_rubrique, $champs, $infos, $postdate);
590
-	}
546
+    $table_sql = table_objet_sql($objet);
547
+    $trouver_table = charger_fonction('trouver_table', 'base');
548
+    $desc = $trouver_table($table_sql);
549
+
550
+    // Si on deplace l'objet
551
+    // changer aussi son secteur et sa langue (si heritee)
552
+    if (isset($champs['id_rubrique'])) {
553
+        $row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique=' . sql_quote($champs['id_rubrique']));
554
+        $langue = $row_rub['lang'];
555
+
556
+        if (isset($desc['field']['id_secteur'])) {
557
+            $champs['id_secteur'] = $row_rub['id_secteur'];
558
+        }
559
+
560
+        if (isset($desc['field']['lang']) and isset($desc['field']['langue_choisie'])) {
561
+            if (
562
+                sql_fetsel(
563
+                    '1',
564
+                    $table_sql,
565
+                    id_table_objet($objet) . '=' . intval($id) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue)
566
+                )
567
+            ) {
568
+                $champs['lang'] = $langue;
569
+            }
570
+        }
571
+    }
572
+
573
+    if (!$champs) {
574
+        return;
575
+    }
576
+    sql_updateq($table_sql, $champs, id_table_objet($objet) . '=' . intval($id));
577
+
578
+    // Changer le statut des rubriques concernees
579
+    if ($cond) {
580
+        include_spip('inc/rubriques');
581
+        //$postdate = ($GLOBALS['meta']["post_dates"] == "non" AND isset($champs['date']) AND (strtotime($champs['date']) < time()))?$champs['date']:false;
582
+        $postdate = false;
583
+        // On rajoute les infos de l'objet
584
+        $infos = [
585
+            'objet' => $objet,
586
+            'id_objet' => $id,
587
+            'statut_ancien' => $statut,
588
+        ];
589
+        calculer_rubriques_if($id_rubrique, $champs, $infos, $postdate);
590
+    }
591 591
 }
592 592
 
593 593
 
@@ -616,75 +616,75 @@  discard block
 block discarded – undo
616 616
  *     string|int : valeur du champ demande pour l'objet demande
617 617
  */
618 618
 function objet_lire($objet, $valeur_id, $options = []) {
619
-	if (($t = objet_type($objet)) !== $objet) {
620
-		spip_log("objet_lire: appel avec type $objet invalide au lieu de $t", 'editer' . _LOG_INFO_IMPORTANTE);
621
-		$objet = $t;
622
-	}
623
-
624
-	// tableau du cache des descriptions et des id d'objet (au sens id_xxx).
625
-	// Les tableaux sont toujours indexés par le trio [objet][cle][valeur_cle]
626
-	static $descriptions = [];
627
-
628
-	// On détermine le nom du champ id de la table.
629
-	include_spip('base/objets');
630
-	$primary = id_table_objet($objet);
631
-
632
-	// On détermine l'id à utiliser.
633
-	$champ_id = (!empty($options['champ_id']) ? $options['champ_id'] : $primary);
634
-
635
-	// Si l'objet n'a pas encore été stocké, il faut récupérer sa description complète.
636
-	if (
637
-		!isset($descriptions[$objet][$champ_id][$valeur_id])
638
-		or (isset($options['force']) and $options['force'])
639
-	) {
640
-		// Il est possible pour un type d'objet de fournir une fonction de lecture de tous les champs d'un objet.
641
-		if (
642
-			include_spip('action/editer_' . $objet)
643
-			and function_exists($lire = "{$objet}_lire_champs")
644
-		) {
645
-			$valeurs = $lire($objet, $valeur_id, $champ_id);
646
-		} else {
647
-			// On récupère la table SQL à partir du type d'objet.
648
-			$table = table_objet_sql($objet);
649
-
650
-			// La condition est appliquée sur le champ désigné par l'utilisateur.
651
-			$where = [
652
-				$champ_id . '=' . sql_quote($valeur_id)
653
-			];
654
-
655
-			// Acquisition de tous les champs de l'objet : si l'accès SQL retourne une erreur on renvoie un tableau vide.
656
-			$valeurs = sql_fetsel('*', $table, $where);
657
-		}
658
-
659
-		if (!$valeurs) {
660
-			$valeurs = false;
661
-		}
662
-
663
-		$descriptions[$objet][$champ_id][$valeur_id] = $valeurs;
664
-
665
-		if ($champ_id !== $primary and isset($valeurs[$primary])) {
666
-			$descriptions[$objet][$primary][$valeurs[$primary]] = $valeurs;
667
-			$descriptions[$objet][$champ_id][$valeur_id] = &$descriptions[$objet][$primary][$valeurs[$primary]];
668
-		}
669
-	}
670
-
671
-	$retour = $descriptions[$objet][$champ_id][$valeur_id];
672
-
673
-	// On ne retourne maintenant que les champs demandés.
674
-	// - on détermine les informations à renvoyer.
675
-	if ($retour and !empty($options['champs'])) {
676
-		$champs = $options['champs'];
677
-		// Extraction des seules informations demandées.
678
-		// -- si on demande une information unique on renvoie la valeur simple, sinon on renvoie un tableau.
679
-		// -- si une information n'est pas un champ valide elle n'est pas renvoyée sans renvoyer d'erreur.
680
-		if (is_array($champs)) {
681
-			// Tableau des informations valides
682
-			$retour = array_intersect_key($retour, array_flip($champs));
683
-		} else {
684
-			// Valeur unique demandée.
685
-			$retour = ($retour[$champs] ?? false);
686
-		}
687
-	}
688
-
689
-	return $retour;
619
+    if (($t = objet_type($objet)) !== $objet) {
620
+        spip_log("objet_lire: appel avec type $objet invalide au lieu de $t", 'editer' . _LOG_INFO_IMPORTANTE);
621
+        $objet = $t;
622
+    }
623
+
624
+    // tableau du cache des descriptions et des id d'objet (au sens id_xxx).
625
+    // Les tableaux sont toujours indexés par le trio [objet][cle][valeur_cle]
626
+    static $descriptions = [];
627
+
628
+    // On détermine le nom du champ id de la table.
629
+    include_spip('base/objets');
630
+    $primary = id_table_objet($objet);
631
+
632
+    // On détermine l'id à utiliser.
633
+    $champ_id = (!empty($options['champ_id']) ? $options['champ_id'] : $primary);
634
+
635
+    // Si l'objet n'a pas encore été stocké, il faut récupérer sa description complète.
636
+    if (
637
+        !isset($descriptions[$objet][$champ_id][$valeur_id])
638
+        or (isset($options['force']) and $options['force'])
639
+    ) {
640
+        // Il est possible pour un type d'objet de fournir une fonction de lecture de tous les champs d'un objet.
641
+        if (
642
+            include_spip('action/editer_' . $objet)
643
+            and function_exists($lire = "{$objet}_lire_champs")
644
+        ) {
645
+            $valeurs = $lire($objet, $valeur_id, $champ_id);
646
+        } else {
647
+            // On récupère la table SQL à partir du type d'objet.
648
+            $table = table_objet_sql($objet);
649
+
650
+            // La condition est appliquée sur le champ désigné par l'utilisateur.
651
+            $where = [
652
+                $champ_id . '=' . sql_quote($valeur_id)
653
+            ];
654
+
655
+            // Acquisition de tous les champs de l'objet : si l'accès SQL retourne une erreur on renvoie un tableau vide.
656
+            $valeurs = sql_fetsel('*', $table, $where);
657
+        }
658
+
659
+        if (!$valeurs) {
660
+            $valeurs = false;
661
+        }
662
+
663
+        $descriptions[$objet][$champ_id][$valeur_id] = $valeurs;
664
+
665
+        if ($champ_id !== $primary and isset($valeurs[$primary])) {
666
+            $descriptions[$objet][$primary][$valeurs[$primary]] = $valeurs;
667
+            $descriptions[$objet][$champ_id][$valeur_id] = &$descriptions[$objet][$primary][$valeurs[$primary]];
668
+        }
669
+    }
670
+
671
+    $retour = $descriptions[$objet][$champ_id][$valeur_id];
672
+
673
+    // On ne retourne maintenant que les champs demandés.
674
+    // - on détermine les informations à renvoyer.
675
+    if ($retour and !empty($options['champs'])) {
676
+        $champs = $options['champs'];
677
+        // Extraction des seules informations demandées.
678
+        // -- si on demande une information unique on renvoie la valeur simple, sinon on renvoie un tableau.
679
+        // -- si une information n'est pas un champ valide elle n'est pas renvoyée sans renvoyer d'erreur.
680
+        if (is_array($champs)) {
681
+            // Tableau des informations valides
682
+            $retour = array_intersect_key($retour, array_flip($champs));
683
+        } else {
684
+            // Valeur unique demandée.
685
+            $retour = ($retour[$champs] ?? false);
686
+        }
687
+    }
688
+
689
+    return $retour;
690 690
 }
Please login to merge, or discard this patch.
ecrire/inc/bandeau.php 2 patches
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -50,7 +50,7 @@  discard block
 block discarded – undo
50 50
 			$_id = $e['id_table_objet'];
51 51
 			if (isset($contexte[$_id]) and $id = intval($contexte[$_id])) {
52 52
 				$table = $e['table_objet_sql'];
53
-				$row = sql_fetsel('*', $table, "$_id=" . intval($id));
53
+				$row = sql_fetsel('*', $table, "$_id=".intval($id));
54 54
 				if (isset($row['id_rubrique'])) {
55 55
 					$contexte['id_rubrique'] = $row['id_rubrique'];
56 56
 					if (isset($row['id_secteur'])) {
@@ -114,8 +114,8 @@  discard block
 block discarded – undo
114 114
 				$boutons_admin[$parent]->sousmenu = array_slice($boutons_admin[$parent]->sousmenu, 0, $position)
115 115
 					+ [
116 116
 						$id => new Bouton(
117
-							($icones and !empty($infos['icone'])) ? find_in_theme($infos['icone']) : '',  // icone
118
-							$infos['titre'],  // titre
117
+							($icones and !empty($infos['icone'])) ? find_in_theme($infos['icone']) : '', // icone
118
+							$infos['titre'], // titre
119 119
 							(isset($infos['action']) and $infos['action']) ? $infos['action'] : null,
120 120
 							(isset($infos['parametres']) and $infos['parametres']) ? $infos['parametres'] : null
121 121
 						)
@@ -132,8 +132,8 @@  discard block
 block discarded – undo
132 132
 				$boutons_admin = array_slice($boutons_admin, 0, $position)
133 133
 					+ [
134 134
 						$id => new Bouton(
135
-							($icones and isset($infos['icone']) and $infos['icone']) ? find_in_theme($infos['icone']) : '',  // icone
136
-							$infos['titre'],  // titre
135
+							($icones and isset($infos['icone']) and $infos['icone']) ? find_in_theme($infos['icone']) : '', // icone
136
+							$infos['titre'], // titre
137 137
 							(isset($infos['action']) and $infos['action']) ? $infos['action'] : null,
138 138
 							(isset($infos['parametres']) and $infos['parametres']) ? $infos['parametres'] : null
139 139
 						)
@@ -220,7 +220,7 @@  discard block
 block discarded – undo
220 220
 		$url = str_replace('&amp;', '&', $url);
221 221
 		while (preg_match(',[&?]([a-z_]+)=@([a-z_]+)@,i', $url, $matches)) {
222 222
 			if ($matches[2] == 'id_secteur' and !isset($contexte['id_secteur']) and isset($contexte['id_rubrique'])) {
223
-				$contexte['id_secteur'] = sql_getfetsel('id_secteur', 'spip_rubriques', 'id_rubrique=' . intval($contexte['id_rubrique']));
223
+				$contexte['id_secteur'] = sql_getfetsel('id_secteur', 'spip_rubriques', 'id_rubrique='.intval($contexte['id_rubrique']));
224 224
 			}
225 225
 			$val = _request($matches[2], $contexte);
226 226
 			$url = parametre_url($url, $matches[1], $val ?: '', '&');
Please login to merge, or discard this patch.
Indentation   +149 added lines, -149 removed lines patch added patch discarded remove patch
@@ -19,7 +19,7 @@  discard block
 block discarded – undo
19 19
  **/
20 20
 
21 21
 if (!defined('_ECRIRE_INC_VERSION')) {
22
-	return;
22
+    return;
23 23
 }
24 24
 
25 25
 include_spip('inc/boutons');
@@ -39,33 +39,33 @@  discard block
 block discarded – undo
39 39
  *     contexte
40 40
  **/
41 41
 function definir_barre_contexte($contexte = null) {
42
-	if (is_null($contexte)) {
43
-		$contexte = $_GET;
44
-	} elseif (is_string($contexte)) {
45
-		$contexte = unserialize($contexte);
46
-	}
47
-	if (!isset($contexte['id_rubrique']) and isset($contexte['exec'])) {
48
-		if (!function_exists('trouver_objet_exec')) {
49
-			include_spip('inc/pipelines_ecrire');
50
-		}
51
-		if ($e = trouver_objet_exec($contexte['exec'])) {
52
-			$_id = $e['id_table_objet'];
53
-			if (isset($contexte[$_id]) and $id = intval($contexte[$_id])) {
54
-				$table = $e['table_objet_sql'];
55
-				$row = sql_fetsel('*', $table, "$_id=" . intval($id));
56
-				if (isset($row['id_rubrique'])) {
57
-					$contexte['id_rubrique'] = $row['id_rubrique'];
58
-					if (isset($row['id_secteur'])) {
59
-						$contexte['id_secteur'] = $row['id_secteur'];
60
-					}
61
-				} elseif (isset($row['id_groupe'])) {
62
-					// TODO supprimer ce bloc quand https://core.spip.net/issues/3844 sera réalisé
63
-					$contexte['id_groupe'] = $row['id_groupe'];
64
-				}
65
-			}
66
-		}
67
-	}
68
-	return $contexte;
42
+    if (is_null($contexte)) {
43
+        $contexte = $_GET;
44
+    } elseif (is_string($contexte)) {
45
+        $contexte = unserialize($contexte);
46
+    }
47
+    if (!isset($contexte['id_rubrique']) and isset($contexte['exec'])) {
48
+        if (!function_exists('trouver_objet_exec')) {
49
+            include_spip('inc/pipelines_ecrire');
50
+        }
51
+        if ($e = trouver_objet_exec($contexte['exec'])) {
52
+            $_id = $e['id_table_objet'];
53
+            if (isset($contexte[$_id]) and $id = intval($contexte[$_id])) {
54
+                $table = $e['table_objet_sql'];
55
+                $row = sql_fetsel('*', $table, "$_id=" . intval($id));
56
+                if (isset($row['id_rubrique'])) {
57
+                    $contexte['id_rubrique'] = $row['id_rubrique'];
58
+                    if (isset($row['id_secteur'])) {
59
+                        $contexte['id_secteur'] = $row['id_secteur'];
60
+                    }
61
+                } elseif (isset($row['id_groupe'])) {
62
+                    // TODO supprimer ce bloc quand https://core.spip.net/issues/3844 sera réalisé
63
+                    $contexte['id_groupe'] = $row['id_groupe'];
64
+                }
65
+            }
66
+        }
67
+    }
68
+    return $contexte;
69 69
 }
70 70
 
71 71
 /**
@@ -81,89 +81,89 @@  discard block
 block discarded – undo
81 81
  * @return array
82 82
  */
83 83
 function definir_barre_boutons($contexte = [], $icones = true, $autorise = true) {
84
-	include_spip('inc/autoriser');
85
-	$boutons_admin = [];
84
+    include_spip('inc/autoriser');
85
+    $boutons_admin = [];
86 86
 
87
-	// les boutons du core, issus de ecrire/paquet.xml
88
-	$liste_boutons = [];
87
+    // les boutons du core, issus de ecrire/paquet.xml
88
+    $liste_boutons = [];
89 89
 
90
-	// ajouter les boutons issus des plugin via paquet.xml
91
-	if (
92
-		function_exists('boutons_plugins')
93
-		and is_array($liste_boutons_plugins = boutons_plugins())
94
-	) {
95
-		$liste_boutons = &$liste_boutons_plugins;
96
-	}
90
+    // ajouter les boutons issus des plugin via paquet.xml
91
+    if (
92
+        function_exists('boutons_plugins')
93
+        and is_array($liste_boutons_plugins = boutons_plugins())
94
+    ) {
95
+        $liste_boutons = &$liste_boutons_plugins;
96
+    }
97 97
 
98
-	foreach ($liste_boutons as $id => $infos) {
99
-		$parent = '';
100
-		// les boutons principaux ne sont pas soumis a autorisation
101
-		if (
102
-			!isset($infos['parent'])
103
-			or !($parent = $infos['parent'])
104
-			or !$autorise
105
-			or autoriser('menu', "_$id", 0, null, ['contexte' => $contexte])
106
-		) {
107
-			if (
108
-				$parent
109
-				and $parent = preg_replace(',^bando_,', 'menu_', $parent)
110
-				and isset($boutons_admin[$parent])
111
-			) {
112
-				$position = (isset($infos['position']) and strlen($infos['position'])) ? intval($infos['position']) : count($boutons_admin[$parent]->sousmenu);
113
-				if ($position < 0) {
114
-					$position = count($boutons_admin[$parent]->sousmenu) + 1 + $position;
115
-				}
116
-				$boutons_admin[$parent]->sousmenu = array_slice($boutons_admin[$parent]->sousmenu, 0, $position)
117
-					+ [
118
-						$id => new Bouton(
119
-							($icones and !empty($infos['icone'])) ? find_in_theme($infos['icone']) : '',  // icone
120
-							$infos['titre'],  // titre
121
-							(isset($infos['action']) and $infos['action']) ? $infos['action'] : null,
122
-							(isset($infos['parametres']) and $infos['parametres']) ? $infos['parametres'] : null
123
-						)
124
-					]
125
-					+ array_slice($boutons_admin[$parent]->sousmenu, $position, 100);
126
-			}
127
-			if (
128
-				!$parent
129
-				// provisoire, eviter les vieux boutons
130
-				and (!in_array($id, ['forum', 'statistiques_visites']))
131
-				and (!$autorise or autoriser('menugrandeentree', "_$id", 0, null, ['contexte' => $contexte]))
132
-			) {
133
-				$position = (isset($infos['position']) and $infos['position']) ? $infos['position'] : count($boutons_admin);
134
-				$boutons_admin = array_slice($boutons_admin, 0, $position)
135
-					+ [
136
-						$id => new Bouton(
137
-							($icones and isset($infos['icone']) and $infos['icone']) ? find_in_theme($infos['icone']) : '',  // icone
138
-							$infos['titre'],  // titre
139
-							(isset($infos['action']) and $infos['action']) ? $infos['action'] : null,
140
-							(isset($infos['parametres']) and $infos['parametres']) ? $infos['parametres'] : null
141
-						)
142
-					]
143
-					+ array_slice($boutons_admin, $position, 100);
144
-			}
145
-		}
146
-	}
147
-	$boutons_admin = pipeline('ajouter_menus', $boutons_admin);
98
+    foreach ($liste_boutons as $id => $infos) {
99
+        $parent = '';
100
+        // les boutons principaux ne sont pas soumis a autorisation
101
+        if (
102
+            !isset($infos['parent'])
103
+            or !($parent = $infos['parent'])
104
+            or !$autorise
105
+            or autoriser('menu', "_$id", 0, null, ['contexte' => $contexte])
106
+        ) {
107
+            if (
108
+                $parent
109
+                and $parent = preg_replace(',^bando_,', 'menu_', $parent)
110
+                and isset($boutons_admin[$parent])
111
+            ) {
112
+                $position = (isset($infos['position']) and strlen($infos['position'])) ? intval($infos['position']) : count($boutons_admin[$parent]->sousmenu);
113
+                if ($position < 0) {
114
+                    $position = count($boutons_admin[$parent]->sousmenu) + 1 + $position;
115
+                }
116
+                $boutons_admin[$parent]->sousmenu = array_slice($boutons_admin[$parent]->sousmenu, 0, $position)
117
+                    + [
118
+                        $id => new Bouton(
119
+                            ($icones and !empty($infos['icone'])) ? find_in_theme($infos['icone']) : '',  // icone
120
+                            $infos['titre'],  // titre
121
+                            (isset($infos['action']) and $infos['action']) ? $infos['action'] : null,
122
+                            (isset($infos['parametres']) and $infos['parametres']) ? $infos['parametres'] : null
123
+                        )
124
+                    ]
125
+                    + array_slice($boutons_admin[$parent]->sousmenu, $position, 100);
126
+            }
127
+            if (
128
+                !$parent
129
+                // provisoire, eviter les vieux boutons
130
+                and (!in_array($id, ['forum', 'statistiques_visites']))
131
+                and (!$autorise or autoriser('menugrandeentree', "_$id", 0, null, ['contexte' => $contexte]))
132
+            ) {
133
+                $position = (isset($infos['position']) and $infos['position']) ? $infos['position'] : count($boutons_admin);
134
+                $boutons_admin = array_slice($boutons_admin, 0, $position)
135
+                    + [
136
+                        $id => new Bouton(
137
+                            ($icones and isset($infos['icone']) and $infos['icone']) ? find_in_theme($infos['icone']) : '',  // icone
138
+                            $infos['titre'],  // titre
139
+                            (isset($infos['action']) and $infos['action']) ? $infos['action'] : null,
140
+                            (isset($infos['parametres']) and $infos['parametres']) ? $infos['parametres'] : null
141
+                        )
142
+                    ]
143
+                    + array_slice($boutons_admin, $position, 100);
144
+            }
145
+        }
146
+    }
147
+    $boutons_admin = pipeline('ajouter_menus', $boutons_admin);
148 148
 
149
-	// définir les favoris et positions d’origine
150
-	if ($boutons_admin) {
151
-		$menus_favoris = obtenir_menus_favoris();
152
-		$i = 1;
153
-		foreach ($boutons_admin as $key => $menu) {
154
-			$menu->favori = (int) table_valeur($menus_favoris, $key, false);
155
-			$menu->position = $i++;
156
-			if ($menu->sousmenu) {
157
-				$j = 1;
158
-				foreach ($menu->sousmenu as $key => $bouton) {
159
-					$bouton->favori = (int) table_valeur($menus_favoris, $key, false);
160
-					$bouton->position = $j++;
161
-				}
162
-			}
163
-		}
164
-	}
149
+    // définir les favoris et positions d’origine
150
+    if ($boutons_admin) {
151
+        $menus_favoris = obtenir_menus_favoris();
152
+        $i = 1;
153
+        foreach ($boutons_admin as $key => $menu) {
154
+            $menu->favori = (int) table_valeur($menus_favoris, $key, false);
155
+            $menu->position = $i++;
156
+            if ($menu->sousmenu) {
157
+                $j = 1;
158
+                foreach ($menu->sousmenu as $key => $bouton) {
159
+                    $bouton->favori = (int) table_valeur($menus_favoris, $key, false);
160
+                    $bouton->position = $j++;
161
+                }
162
+            }
163
+        }
164
+    }
165 165
 
166
-	return $boutons_admin;
166
+    return $boutons_admin;
167 167
 }
168 168
 
169 169
 /**
@@ -175,22 +175,22 @@  discard block
 block discarded – undo
175 175
  * @return Bouton[]
176 176
  */
177 177
 function trier_boutons_enfants_par_alpha($menus, $avec_favoris = false) {
178
-	foreach ($menus as $menu) {
179
-		if ($menu->sousmenu) {
180
-			$libelles = $isfavoris = $favoris = [];
181
-			foreach ($menu->sousmenu as $key => $item) {
182
-				$libelles[$key] = strtolower(translitteration(_T($item->libelle)));
183
-				$isfavoris[$key] = (bool) $item->favori;
184
-				$favoris[$key] = $item->favori;
185
-			}
186
-			if ($avec_favoris) {
187
-				array_multisort($isfavoris, SORT_DESC, $favoris, SORT_ASC, $libelles, SORT_ASC, $menu->sousmenu);
188
-			} else {
189
-				array_multisort($libelles, SORT_ASC, $menu->sousmenu);
190
-			}
191
-		}
192
-	}
193
-	return $menus;
178
+    foreach ($menus as $menu) {
179
+        if ($menu->sousmenu) {
180
+            $libelles = $isfavoris = $favoris = [];
181
+            foreach ($menu->sousmenu as $key => $item) {
182
+                $libelles[$key] = strtolower(translitteration(_T($item->libelle)));
183
+                $isfavoris[$key] = (bool) $item->favori;
184
+                $favoris[$key] = $item->favori;
185
+            }
186
+            if ($avec_favoris) {
187
+                array_multisort($isfavoris, SORT_DESC, $favoris, SORT_ASC, $libelles, SORT_ASC, $menu->sousmenu);
188
+            } else {
189
+                array_multisort($libelles, SORT_ASC, $menu->sousmenu);
190
+            }
191
+        }
192
+    }
193
+    return $menus;
194 194
 }
195 195
 
196 196
 /**
@@ -201,7 +201,7 @@  discard block
 block discarded – undo
201 201
  * @return Bouton[]
202 202
  */
203 203
 function trier_boutons_enfants_par_favoris_alpha($menus) {
204
-	return trier_boutons_enfants_par_alpha($menus, true);
204
+    return trier_boutons_enfants_par_alpha($menus, true);
205 205
 }
206 206
 
207 207
 
@@ -214,23 +214,23 @@  discard block
 block discarded – undo
214 214
  * @return string
215 215
  */
216 216
 function bandeau_creer_url($url, $args = '', $contexte = null) {
217
-	if (!preg_match(',[\/\?],', $url)) {
218
-		$url = generer_url_ecrire($url, $args, true);
219
-		// recuperer les parametres du contexte demande par l'url sous la forme
220
-		// &truc=@machin@
221
-		// @machin@ etant remplace par _request('machin')
222
-		$url = str_replace('&amp;', '&', $url);
223
-		while (preg_match(',[&?]([a-z_]+)=@([a-z_]+)@,i', $url, $matches)) {
224
-			if ($matches[2] == 'id_secteur' and !isset($contexte['id_secteur']) and isset($contexte['id_rubrique'])) {
225
-				$contexte['id_secteur'] = sql_getfetsel('id_secteur', 'spip_rubriques', 'id_rubrique=' . intval($contexte['id_rubrique']));
226
-			}
227
-			$val = _request($matches[2], $contexte);
228
-			$url = parametre_url($url, $matches[1], $val ?: '', '&');
229
-		}
230
-		$url = str_replace('&', '&amp;', $url);
231
-	}
217
+    if (!preg_match(',[\/\?],', $url)) {
218
+        $url = generer_url_ecrire($url, $args, true);
219
+        // recuperer les parametres du contexte demande par l'url sous la forme
220
+        // &truc=@machin@
221
+        // @machin@ etant remplace par _request('machin')
222
+        $url = str_replace('&amp;', '&', $url);
223
+        while (preg_match(',[&?]([a-z_]+)=@([a-z_]+)@,i', $url, $matches)) {
224
+            if ($matches[2] == 'id_secteur' and !isset($contexte['id_secteur']) and isset($contexte['id_rubrique'])) {
225
+                $contexte['id_secteur'] = sql_getfetsel('id_secteur', 'spip_rubriques', 'id_rubrique=' . intval($contexte['id_rubrique']));
226
+            }
227
+            $val = _request($matches[2], $contexte);
228
+            $url = parametre_url($url, $matches[1], $val ?: '', '&');
229
+        }
230
+        $url = str_replace('&', '&amp;', $url);
231
+    }
232 232
 
233
-	return $url;
233
+    return $url;
234 234
 }
235 235
 
236 236
 /**
@@ -240,7 +240,7 @@  discard block
 block discarded – undo
240 240
  *     Code HTML du bandeau
241 241
  */
242 242
 function inc_bandeau_dist() {
243
-	return recuperer_fond('prive/squelettes/inclure/barre-nav', $_GET);
243
+    return recuperer_fond('prive/squelettes/inclure/barre-nav', $_GET);
244 244
 }
245 245
 
246 246
 
@@ -249,13 +249,13 @@  discard block
 block discarded – undo
249 249
  * @return array
250 250
  */
251 251
 function obtenir_menus_favoris() {
252
-	if (
253
-		isset($GLOBALS['visiteur_session']['prefs']['menus_favoris'])
254
-		and is_array($GLOBALS['visiteur_session']['prefs']['menus_favoris'])
255
-		and $GLOBALS['visiteur_session']['prefs']['menus_favoris']
256
-	) {
257
-		return $GLOBALS['visiteur_session']['prefs']['menus_favoris'];
258
-	}
259
-	$definir_menus_favoris = charger_fonction('definir_menus_favoris', 'inc');
260
-	return $definir_menus_favoris();
252
+    if (
253
+        isset($GLOBALS['visiteur_session']['prefs']['menus_favoris'])
254
+        and is_array($GLOBALS['visiteur_session']['prefs']['menus_favoris'])
255
+        and $GLOBALS['visiteur_session']['prefs']['menus_favoris']
256
+    ) {
257
+        return $GLOBALS['visiteur_session']['prefs']['menus_favoris'];
258
+    }
259
+    $definir_menus_favoris = charger_fonction('definir_menus_favoris', 'inc');
260
+    return $definir_menus_favoris();
261 261
 }
Please login to merge, or discard this patch.
ecrire/inc/lang.php 2 patches
Spacing   +10 added lines, -12 removed lines patch added patch discarded remove patch
@@ -40,13 +40,13 @@  discard block
 block discarded – undo
40 40
 function changer_langue($lang, $liste_langues = null) {
41 41
 
42 42
 	if (is_null($liste_langues)) {
43
-		$liste_langues = ($GLOBALS['meta']['langues_proposees'] ?? '') . ',' . ($GLOBALS['meta']['langues_multilingue'] ?? '');
43
+		$liste_langues = ($GLOBALS['meta']['langues_proposees'] ?? '').','.($GLOBALS['meta']['langues_multilingue'] ?? '');
44 44
 	} else {
45 45
 		if (is_array($liste_langues)) {
46 46
 			$liste_langues = implode(',', $liste_langues);
47 47
 		}
48 48
 	}
49
-	$liste_langues = ',' . $liste_langues . ',';
49
+	$liste_langues = ','.$liste_langues.',';
50 50
 
51 51
 	// Si la langue demandee n'existe pas, on essaie d'autres variantes
52 52
 	// Exemple : 'pt-br' => 'pt_br' => 'pt'
@@ -192,7 +192,7 @@  discard block
 block discarded – undo
192 192
 	}
193 193
 	foreach ($langues as $l) {
194 194
 		$selected = ($l == $default) ? ' selected=\'selected\'' : '';
195
-		$ret .= "<option value='$l'$selected>[" . $l . '] ' . traduire_nom_langue($l) . "</option>\n";
195
+		$ret .= "<option value='$l'$selected>[".$l.'] '.traduire_nom_langue($l)."</option>\n";
196 196
 	}
197 197
 
198 198
 	if (!test_espace_prive()) {
@@ -210,23 +210,21 @@  discard block
 block discarded – undo
210 210
 		$base,
211 211
 		$cible,
212 212
 		(select_langues($nom_select, $change, $ret)
213
-			. "<noscript><div style='display:inline'><input type='submit' class='fondo' value='" . _T('bouton_changer') . "' /></div></noscript>"),
213
+			. "<noscript><div style='display:inline'><input type='submit' class='fondo' value='"._T('bouton_changer')."' /></div></noscript>"),
214 214
 		" method='post'"
215 215
 	);
216 216
 }
217 217
 
218 218
 function select_langues($nom_select, $change, $options, $label = '') {
219 219
 	static $cpt = 0;
220
-	$id = 'menu_langues' . $cpt++;
220
+	$id = 'menu_langues'.$cpt++;
221 221
 
222 222
 	return
223
-		"<label for='$id'>" . ($label ?: _T('info_langues')) . '</label> ' .
223
+		"<label for='$id'>".($label ?: _T('info_langues')).'</label> '.
224 224
 		"<select name='$nom_select' id='$id' "
225 225
 		. ((!test_espace_prive()) ?
226
-			("class='forml menu_langues'") :
227
-			(($nom_select == 'var_lang_ecrire') ?
228
-				("class='lang_ecrire'") :
229
-				"class='fondl'"))
226
+			("class='forml menu_langues'") : (($nom_select == 'var_lang_ecrire') ?
227
+				("class='lang_ecrire'") : "class='fondl'"))
230 228
 		. $change
231 229
 		. ">\n"
232 230
 		. $options
@@ -352,7 +350,7 @@  discard block
 block discarded – undo
352 350
 		and (!isset($GLOBALS['spip_lang'])
353 351
 			or $GLOBALS['spip_lang'] != $GLOBALS['meta']['langue_site'])
354 352
 	) {
355
-		return changer_langue($GLOBALS['meta']['langue_site'], $liste_langues);//@:install
353
+		return changer_langue($GLOBALS['meta']['langue_site'], $liste_langues); //@:install
356 354
 	}
357 355
 	// en theorie là, la globale est définie, sinon c'est un problème.
358 356
 	if (!isset($GLOBALS['spip_lang'])) {
@@ -455,7 +453,7 @@  discard block
 block discarded – undo
455 453
 	if (!isset($GLOBALS['meta']['langue_site'])) {
456 454
 		// Initialisation : le francais si dispo, sinon la premiere langue trouvee
457 455
 		$GLOBALS['meta']['langue_site'] = $tout =
458
-			(!$all_langs or (strpos(',' . _LANGUE_PAR_DEFAUT . ',', (string) ",$all_langs,") !== false))
456
+			(!$all_langs or (strpos(','._LANGUE_PAR_DEFAUT.',', (string) ",$all_langs,") !== false))
459 457
 				? _LANGUE_PAR_DEFAUT : substr($all_langs, 0, strpos($all_langs, ','));
460 458
 		ecrire_meta('langue_site', $tout);
461 459
 	}
Please login to merge, or discard this patch.
Indentation   +256 added lines, -256 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Langue
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 
@@ -39,35 +39,35 @@  discard block
 block discarded – undo
39 39
  **/
40 40
 function changer_langue($lang, $liste_langues = null) {
41 41
 
42
-	if (is_null($liste_langues)) {
43
-		$liste_langues = ($GLOBALS['meta']['langues_proposees'] ?? '') . ',' . ($GLOBALS['meta']['langues_multilingue'] ?? '');
44
-	} else {
45
-		if (is_array($liste_langues)) {
46
-			$liste_langues = implode(',', $liste_langues);
47
-		}
48
-	}
49
-	$liste_langues = ',' . $liste_langues . ',';
50
-
51
-	// Si la langue demandee n'existe pas, on essaie d'autres variantes
52
-	// Exemple : 'pt-br' => 'pt_br' => 'pt'
53
-	$lang = str_replace('-', '_', trim($lang));
54
-	if (!$lang) {
55
-		return false;
56
-	}
57
-
58
-	if (
59
-		strpos($liste_langues, (string) ",$lang,") !== false
60
-		or ($lang = preg_replace(',_.*,', '', $lang)
61
-			and str_contains($liste_langues, (string) ",$lang,"))
62
-	) {
63
-		$GLOBALS['spip_lang_rtl'] = lang_dir($lang, '', '_rtl');
64
-		$GLOBALS['spip_lang_right'] = $GLOBALS['spip_lang_rtl'] ? 'left' : 'right';
65
-		$GLOBALS['spip_lang_left'] = $GLOBALS['spip_lang_rtl'] ? 'right' : 'left';
66
-
67
-		return $GLOBALS['spip_lang'] = $lang;
68
-	} else {
69
-		return false;
70
-	}
42
+    if (is_null($liste_langues)) {
43
+        $liste_langues = ($GLOBALS['meta']['langues_proposees'] ?? '') . ',' . ($GLOBALS['meta']['langues_multilingue'] ?? '');
44
+    } else {
45
+        if (is_array($liste_langues)) {
46
+            $liste_langues = implode(',', $liste_langues);
47
+        }
48
+    }
49
+    $liste_langues = ',' . $liste_langues . ',';
50
+
51
+    // Si la langue demandee n'existe pas, on essaie d'autres variantes
52
+    // Exemple : 'pt-br' => 'pt_br' => 'pt'
53
+    $lang = str_replace('-', '_', trim($lang));
54
+    if (!$lang) {
55
+        return false;
56
+    }
57
+
58
+    if (
59
+        strpos($liste_langues, (string) ",$lang,") !== false
60
+        or ($lang = preg_replace(',_.*,', '', $lang)
61
+            and str_contains($liste_langues, (string) ",$lang,"))
62
+    ) {
63
+        $GLOBALS['spip_lang_rtl'] = lang_dir($lang, '', '_rtl');
64
+        $GLOBALS['spip_lang_right'] = $GLOBALS['spip_lang_rtl'] ? 'left' : 'right';
65
+        $GLOBALS['spip_lang_left'] = $GLOBALS['spip_lang_rtl'] ? 'right' : 'left';
66
+
67
+        return $GLOBALS['spip_lang'] = $lang;
68
+    } else {
69
+        return false;
70
+    }
71 71
 }
72 72
 
73 73
 //
@@ -80,9 +80,9 @@  discard block
 block discarded – undo
80 80
 // par exemple le francais pour l'espagnol, l'anglais pour l'allemand, etc.
81 81
 
82 82
 function choisir_traduction($trads, $lang = '') {
83
-	$k = approcher_langue($trads, $lang);
83
+    $k = approcher_langue($trads, $lang);
84 84
 
85
-	return $k ? $trads[$k] : array_shift($trads);
85
+    return $k ? $trads[$k] : array_shift($trads);
86 86
 }
87 87
 
88 88
 // retourne son 2e argument si c'est un index du premier
@@ -90,21 +90,21 @@  discard block
 block discarded – undo
90 90
 // la langue X etant consideree comme une approche de X_Y
91 91
 function approcher_langue($trads, $lang = '') {
92 92
 
93
-	if (!$lang) {
94
-		$lang = $GLOBALS['spip_lang'];
95
-	}
96
-
97
-	if (isset($trads[$lang])) {
98
-		return $lang;
99
-	} // cas des langues xx_yy
100
-	else {
101
-		$r = explode('_', $lang);
102
-		if (isset($trads[$r[0]])) {
103
-			return $r[0];
104
-		}
105
-	}
106
-
107
-	return '';
93
+    if (!$lang) {
94
+        $lang = $GLOBALS['spip_lang'];
95
+    }
96
+
97
+    if (isset($trads[$lang])) {
98
+        return $lang;
99
+    } // cas des langues xx_yy
100
+    else {
101
+        $r = explode('_', $lang);
102
+        if (isset($trads[$r[0]])) {
103
+            return $r[0];
104
+        }
105
+    }
106
+
107
+    return '';
108 108
 }
109 109
 
110 110
 /**
@@ -119,10 +119,10 @@  discard block
 block discarded – undo
119 119
  *     Nom de la langue, sinon son code.
120 120
  **/
121 121
 function traduire_nom_langue($lang) {
122
-	include_spip('inc/lang_liste');
123
-	include_spip('inc/charsets');
122
+    include_spip('inc/lang_liste');
123
+    include_spip('inc/charsets');
124 124
 
125
-	return html2unicode($GLOBALS['codes_langues'][$lang] ?? $lang);
125
+    return html2unicode($GLOBALS['codes_langues'][$lang] ?? $lang);
126 126
 }
127 127
 
128 128
 //
@@ -135,10 +135,10 @@  discard block
 block discarded – undo
135 135
 // hebreu a priori), 'droitier' sinon.
136 136
 // C'est utilise par #LANG_DIR, #LANG_LEFT, #LANG_RIGHT.
137 137
 function lang_dir($lang = '', $droitier = 'ltr', $gaucher = 'rtl') {
138
-	static $lang_rtl = ['ar', 'fa', 'ku', 'prs', 'ps', 'ur', 'he', 'heb', 'hbo', 'yi'];
138
+    static $lang_rtl = ['ar', 'fa', 'ku', 'prs', 'ps', 'ur', 'he', 'heb', 'hbo', 'yi'];
139 139
 
140
-	return in_array(($lang ?: $GLOBALS['spip_lang']), $lang_rtl) ?
141
-		$gaucher : $droitier;
140
+    return in_array(($lang ?: $GLOBALS['spip_lang']), $lang_rtl) ?
141
+        $gaucher : $droitier;
142 142
 }
143 143
 
144 144
 // typo francaise ou anglaise ?
@@ -147,29 +147,29 @@  discard block
 block discarded – undo
147 147
 // sinon determiner la typo en fonction de la langue courante
148 148
 
149 149
 function lang_typo($lang = '') {
150
-	if (!$lang) {
151
-		$lang = $GLOBALS['lang_objet'] ?? $GLOBALS['spip_lang'];
152
-	}
153
-	if (
154
-		$lang == 'eo'
155
-		or $lang == 'fr'
156
-		or strncmp($lang, 'fr_', 3) == 0
157
-		or $lang == 'cpf'
158
-	) {
159
-		return 'fr';
160
-	} else {
161
-		return 'en';
162
-	}
150
+    if (!$lang) {
151
+        $lang = $GLOBALS['lang_objet'] ?? $GLOBALS['spip_lang'];
152
+    }
153
+    if (
154
+        $lang == 'eo'
155
+        or $lang == 'fr'
156
+        or strncmp($lang, 'fr_', 3) == 0
157
+        or $lang == 'cpf'
158
+    ) {
159
+        return 'fr';
160
+    } else {
161
+        return 'en';
162
+    }
163 163
 }
164 164
 
165 165
 // gestion de la globale $lang_objet pour que les textes soient affiches
166 166
 // avec les memes typo et direction dans l'espace prive que dans le public
167 167
 function changer_typo($lang = '') {
168
-	if ($lang) {
169
-		$GLOBALS['lang_objet'] = $lang;
170
-	} else {
171
-		unset($GLOBALS['lang_objet']);
172
-	}
168
+    if ($lang) {
169
+        $GLOBALS['lang_objet'] = $lang;
170
+    } else {
171
+        unset($GLOBALS['lang_objet']);
172
+    }
173 173
 }
174 174
 
175 175
 //
@@ -179,58 +179,58 @@  discard block
 block discarded – undo
179 179
 // pour 'changer_lang' (langue de l'article, espace prive), c'est en Ajax
180 180
 //
181 181
 function menu_langues($nom_select, $default = '') {
182
-	include_spip('inc/actions');
183
-
184
-	$langues = liste_options_langues($nom_select);
185
-	$ret = '';
186
-	if (!count($langues)) {
187
-		return '';
188
-	}
189
-
190
-	if (!$default) {
191
-		$default = $GLOBALS['spip_lang'];
192
-	}
193
-	foreach ($langues as $l) {
194
-		$selected = ($l == $default) ? ' selected=\'selected\'' : '';
195
-		$ret .= "<option value='$l'$selected>[" . $l . '] ' . traduire_nom_langue($l) . "</option>\n";
196
-	}
197
-
198
-	if (!test_espace_prive()) {
199
-		$cible = self();
200
-		$base = '';
201
-	} else {
202
-		$cible = self();
203
-		$base = spip_connect() ? 'base' : '';
204
-	}
205
-
206
-	$change = ' onchange="this.parentNode.parentNode.submit()"';
207
-
208
-	return generer_action_auteur(
209
-		'converser',
210
-		$base,
211
-		$cible,
212
-		(select_langues($nom_select, $change, $ret)
213
-			. "<noscript><div style='display:inline'><input type='submit' class='fondo' value='" . _T('bouton_changer') . "' /></div></noscript>"),
214
-		" method='post'"
215
-	);
182
+    include_spip('inc/actions');
183
+
184
+    $langues = liste_options_langues($nom_select);
185
+    $ret = '';
186
+    if (!count($langues)) {
187
+        return '';
188
+    }
189
+
190
+    if (!$default) {
191
+        $default = $GLOBALS['spip_lang'];
192
+    }
193
+    foreach ($langues as $l) {
194
+        $selected = ($l == $default) ? ' selected=\'selected\'' : '';
195
+        $ret .= "<option value='$l'$selected>[" . $l . '] ' . traduire_nom_langue($l) . "</option>\n";
196
+    }
197
+
198
+    if (!test_espace_prive()) {
199
+        $cible = self();
200
+        $base = '';
201
+    } else {
202
+        $cible = self();
203
+        $base = spip_connect() ? 'base' : '';
204
+    }
205
+
206
+    $change = ' onchange="this.parentNode.parentNode.submit()"';
207
+
208
+    return generer_action_auteur(
209
+        'converser',
210
+        $base,
211
+        $cible,
212
+        (select_langues($nom_select, $change, $ret)
213
+            . "<noscript><div style='display:inline'><input type='submit' class='fondo' value='" . _T('bouton_changer') . "' /></div></noscript>"),
214
+        " method='post'"
215
+    );
216 216
 }
217 217
 
218 218
 function select_langues($nom_select, $change, $options, $label = '') {
219
-	static $cpt = 0;
220
-	$id = 'menu_langues' . $cpt++;
221
-
222
-	return
223
-		"<label for='$id'>" . ($label ?: _T('info_langues')) . '</label> ' .
224
-		"<select name='$nom_select' id='$id' "
225
-		. ((!test_espace_prive()) ?
226
-			("class='forml menu_langues'") :
227
-			(($nom_select == 'var_lang_ecrire') ?
228
-				("class='lang_ecrire'") :
229
-				"class='fondl'"))
230
-		. $change
231
-		. ">\n"
232
-		. $options
233
-		. '</select>';
219
+    static $cpt = 0;
220
+    $id = 'menu_langues' . $cpt++;
221
+
222
+    return
223
+        "<label for='$id'>" . ($label ?: _T('info_langues')) . '</label> ' .
224
+        "<select name='$nom_select' id='$id' "
225
+        . ((!test_espace_prive()) ?
226
+            ("class='forml menu_langues'") :
227
+            (($nom_select == 'var_lang_ecrire') ?
228
+                ("class='lang_ecrire'") :
229
+                "class='fondl'"))
230
+        . $change
231
+        . ">\n"
232
+        . $options
233
+        . '</select>';
234 234
 }
235 235
 
236 236
 /**
@@ -252,34 +252,34 @@  discard block
 block discarded – undo
252 252
  */
253 253
 function liste_options_langues($nom_select) {
254 254
 
255
-	switch ($nom_select) {
256
-		# #MENU_LANG
257
-		case 'var_lang':
258
-			# menu de changement de la langue d'un article
259
-			# les langues selectionnees dans la configuration "multilinguisme"
260
-		case 'changer_lang':
261
-			$langues = explode(',', $GLOBALS['meta']['langues_multilingue']);
262
-			break;
263
-		# menu de l'interface (privee, installation et panneau de login)
264
-		# les langues presentes sous forme de fichiers de langue
265
-		# on force la relecture du repertoire des langues pour etre synchrone.
266
-		case 'var_lang_ecrire':
267
-		default:
268
-			$GLOBALS['meta']['langues_proposees'] = '';
269
-			init_langues();
270
-			$langues = explode(',', $GLOBALS['meta']['langues_proposees']);
271
-			break;
255
+    switch ($nom_select) {
256
+        # #MENU_LANG
257
+        case 'var_lang':
258
+            # menu de changement de la langue d'un article
259
+            # les langues selectionnees dans la configuration "multilinguisme"
260
+        case 'changer_lang':
261
+            $langues = explode(',', $GLOBALS['meta']['langues_multilingue']);
262
+            break;
263
+        # menu de l'interface (privee, installation et panneau de login)
264
+        # les langues presentes sous forme de fichiers de langue
265
+        # on force la relecture du repertoire des langues pour etre synchrone.
266
+        case 'var_lang_ecrire':
267
+        default:
268
+            $GLOBALS['meta']['langues_proposees'] = '';
269
+            init_langues();
270
+            $langues = explode(',', $GLOBALS['meta']['langues_proposees']);
271
+            break;
272 272
 
273 273
 # dernier choix possible : toutes les langues = langues_proposees
274 274
 # + langues_multilingues ; mais, ne sert pas
275 275
 #			$langues = explode(',', $GLOBALS['all_langs']);
276
-	}
277
-	if (count($langues) <= 1) {
278
-		return [];
279
-	}
280
-	sort($langues);
276
+    }
277
+    if (count($langues) <= 1) {
278
+        return [];
279
+    }
280
+    sort($langues);
281 281
 
282
-	return $langues;
282
+    return $langues;
283 283
 }
284 284
 
285 285
 
@@ -294,39 +294,39 @@  discard block
 block discarded – undo
294 294
  **/
295 295
 function verifier_lang_url() {
296 296
 
297
-	// quelle langue est demandee ?
298
-	$lang_demandee = (test_espace_prive() ? $GLOBALS['spip_lang'] : $GLOBALS['meta']['langue_site']);
299
-	if (isset($_COOKIE['spip_lang_ecrire'])) {
300
-		$lang_demandee = $_COOKIE['spip_lang_ecrire'];
301
-	}
302
-	if (!test_espace_prive() and isset($_COOKIE['spip_lang'])) {
303
-		$lang_demandee = $_COOKIE['spip_lang'];
304
-	}
305
-	if (isset($_GET['lang'])) {
306
-		$lang_demandee = $_GET['lang'];
307
-	}
308
-
309
-	// Renvoyer si besoin (et si la langue demandee existe)
310
-	if (
311
-		$GLOBALS['spip_lang'] != $lang_demandee
312
-		and changer_langue($lang_demandee)
313
-		and $lang_demandee != @$_GET['lang']
314
-	) {
315
-		$destination = parametre_url(self(), 'lang', $lang_demandee, '&');
316
-		// ici on a besoin des var_truc
317
-		foreach ($_GET as $var => $val) {
318
-			if (!strncmp('var_', $var, 4)) {
319
-				$destination = parametre_url($destination, $var, $val, '&');
320
-			}
321
-		}
322
-		include_spip('inc/headers');
323
-		redirige_par_entete($destination);
324
-	}
325
-
326
-	// Subtilite : si la langue demandee par cookie est la bonne
327
-	// alors on fait comme si $lang etait passee dans l'URL
328
-	// (pour criteres {lang}).
329
-	$GLOBALS['lang'] = $_GET['lang'] = $GLOBALS['spip_lang'];
297
+    // quelle langue est demandee ?
298
+    $lang_demandee = (test_espace_prive() ? $GLOBALS['spip_lang'] : $GLOBALS['meta']['langue_site']);
299
+    if (isset($_COOKIE['spip_lang_ecrire'])) {
300
+        $lang_demandee = $_COOKIE['spip_lang_ecrire'];
301
+    }
302
+    if (!test_espace_prive() and isset($_COOKIE['spip_lang'])) {
303
+        $lang_demandee = $_COOKIE['spip_lang'];
304
+    }
305
+    if (isset($_GET['lang'])) {
306
+        $lang_demandee = $_GET['lang'];
307
+    }
308
+
309
+    // Renvoyer si besoin (et si la langue demandee existe)
310
+    if (
311
+        $GLOBALS['spip_lang'] != $lang_demandee
312
+        and changer_langue($lang_demandee)
313
+        and $lang_demandee != @$_GET['lang']
314
+    ) {
315
+        $destination = parametre_url(self(), 'lang', $lang_demandee, '&');
316
+        // ici on a besoin des var_truc
317
+        foreach ($_GET as $var => $val) {
318
+            if (!strncmp('var_', $var, 4)) {
319
+                $destination = parametre_url($destination, $var, $val, '&');
320
+            }
321
+        }
322
+        include_spip('inc/headers');
323
+        redirige_par_entete($destination);
324
+    }
325
+
326
+    // Subtilite : si la langue demandee par cookie est la bonne
327
+    // alors on fait comme si $lang etait passee dans l'URL
328
+    // (pour criteres {lang}).
329
+    $GLOBALS['lang'] = $_GET['lang'] = $GLOBALS['spip_lang'];
330 330
 }
331 331
 
332 332
 
@@ -344,22 +344,22 @@  discard block
 block discarded – undo
344 344
  *     La langue sélectionnée
345 345
  **/
346 346
 function utiliser_langue_site($liste_langues = null) {
347
-	// s'il existe une langue du site (en gros tout le temps en théorie)
348
-	if (
349
-		isset($GLOBALS['meta']['langue_site'])
350
-		// et si spip_langue est pas encore définie (ce que va faire changer_langue())
351
-		// ou qu'elle n'est pas identique à la langue du site
352
-		and (!isset($GLOBALS['spip_lang'])
353
-			or $GLOBALS['spip_lang'] != $GLOBALS['meta']['langue_site'])
354
-	) {
355
-		return changer_langue($GLOBALS['meta']['langue_site'], $liste_langues);//@:install
356
-	}
357
-	// en theorie là, la globale est définie, sinon c'est un problème.
358
-	if (!isset($GLOBALS['spip_lang'])) {
359
-		spip_log('La globale spip_lang est indéfinie dans utiliser_langue_site() !', _LOG_ERREUR);
360
-	}
361
-
362
-	return $GLOBALS['spip_lang'];
347
+    // s'il existe une langue du site (en gros tout le temps en théorie)
348
+    if (
349
+        isset($GLOBALS['meta']['langue_site'])
350
+        // et si spip_langue est pas encore définie (ce que va faire changer_langue())
351
+        // ou qu'elle n'est pas identique à la langue du site
352
+        and (!isset($GLOBALS['spip_lang'])
353
+            or $GLOBALS['spip_lang'] != $GLOBALS['meta']['langue_site'])
354
+    ) {
355
+        return changer_langue($GLOBALS['meta']['langue_site'], $liste_langues);//@:install
356
+    }
357
+    // en theorie là, la globale est définie, sinon c'est un problème.
358
+    if (!isset($GLOBALS['spip_lang'])) {
359
+        spip_log('La globale spip_lang est indéfinie dans utiliser_langue_site() !', _LOG_ERREUR);
360
+    }
361
+
362
+    return $GLOBALS['spip_lang'];
363 363
 }
364 364
 
365 365
 /**
@@ -378,35 +378,35 @@  discard block
 block discarded – undo
378 378
  **/
379 379
 function utiliser_langue_visiteur($liste_langues = null) {
380 380
 
381
-	// si on est dans l'espace public et pas de $liste_langues : se limiter a la config langues_multilingue si définie
382
-	if (is_null($liste_langues) and !test_espace_prive() and !empty($GLOBALS['meta']['langues_multilingue'])) {
383
-		$liste_langues = $GLOBALS['meta']['langues_multilingue'];
384
-	}
385
-
386
-	$l = (!test_espace_prive() ? 'spip_lang' : 'spip_lang_ecrire');
387
-	if (isset($_COOKIE[$l])) {
388
-		if (changer_langue($l = $_COOKIE[$l], $liste_langues)) {
389
-			return $l;
390
-		}
391
-	}
392
-
393
-	if (isset($GLOBALS['visiteur_session']['lang'])) {
394
-		if (changer_langue($l = $GLOBALS['visiteur_session']['lang'], $liste_langues)) {
395
-			return $l;
396
-		}
397
-	}
398
-
399
-	if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
400
-		foreach (explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $s) {
401
-			if (preg_match('#^([a-z]{2,3})(-[a-z]{2,3})?(;q=[0-9.]+)?$#i', trim($s), $r)) {
402
-				if (changer_langue($l = strtolower($r[1]), $liste_langues)) {
403
-					return $l;
404
-				}
405
-			}
406
-		}
407
-	}
408
-
409
-	return utiliser_langue_site($liste_langues);
381
+    // si on est dans l'espace public et pas de $liste_langues : se limiter a la config langues_multilingue si définie
382
+    if (is_null($liste_langues) and !test_espace_prive() and !empty($GLOBALS['meta']['langues_multilingue'])) {
383
+        $liste_langues = $GLOBALS['meta']['langues_multilingue'];
384
+    }
385
+
386
+    $l = (!test_espace_prive() ? 'spip_lang' : 'spip_lang_ecrire');
387
+    if (isset($_COOKIE[$l])) {
388
+        if (changer_langue($l = $_COOKIE[$l], $liste_langues)) {
389
+            return $l;
390
+        }
391
+    }
392
+
393
+    if (isset($GLOBALS['visiteur_session']['lang'])) {
394
+        if (changer_langue($l = $GLOBALS['visiteur_session']['lang'], $liste_langues)) {
395
+            return $l;
396
+        }
397
+    }
398
+
399
+    if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
400
+        foreach (explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $s) {
401
+            if (preg_match('#^([a-z]{2,3})(-[a-z]{2,3})?(;q=[0-9.]+)?$#i', trim($s), $r)) {
402
+                if (changer_langue($l = strtolower($r[1]), $liste_langues)) {
403
+                    return $l;
404
+                }
405
+            }
406
+        }
407
+    }
408
+
409
+    return utiliser_langue_site($liste_langues);
410 410
 }
411 411
 
412 412
 
@@ -416,7 +416,7 @@  discard block
 block discarded – undo
416 416
  * @return int
417 417
  */
418 418
 function match_langue($chaine) {
419
-	return preg_match('/^[a-z]{2,3}(_[a-z]{2,3}){0,2}$/', $chaine);
419
+    return preg_match('/^[a-z]{2,3}(_[a-z]{2,3}){0,2}$/', $chaine);
420 420
 }
421 421
 
422 422
 /**
@@ -434,36 +434,36 @@  discard block
 block discarded – undo
434 434
  **/
435 435
 function init_langues() {
436 436
 
437
-	// liste des langues dans les meta, sauf a l'install
438
-	$all_langs = $GLOBALS['meta']['langues_proposees'] ?? '';
439
-
440
-	$tout = [];
441
-	if (!$all_langs) {
442
-		// trouver tous les modules lang/spip_xx.php
443
-		$modules = find_all_in_path('lang/', '/spip_([a-z_]+)\.php$');
444
-		foreach ($modules as $name => $path) {
445
-			if (preg_match(',^spip_([a-z_]+)\.php$,', $name, $regs)) {
446
-				if (match_langue($regs[1])) {
447
-					$tout[] = $regs[1];
448
-				}
449
-			}
450
-		}
451
-		sort($tout);
452
-		$tout = join(',', $tout);
453
-		// Si les langues n'ont pas change, ne rien faire
454
-		if ($tout != $all_langs) {
455
-			$GLOBALS['meta']['langues_proposees'] = $tout;
456
-			include_spip('inc/meta');
457
-			ecrire_meta('langues_proposees', $tout);
458
-		}
459
-	}
460
-	if (!isset($GLOBALS['meta']['langue_site'])) {
461
-		// Initialisation : le francais si dispo, sinon la premiere langue trouvee
462
-		$GLOBALS['meta']['langue_site'] = $tout =
463
-			(!$all_langs or (strpos(',' . _LANGUE_PAR_DEFAUT . ',', (string) ",$all_langs,") !== false))
464
-				? _LANGUE_PAR_DEFAUT : substr($all_langs, 0, strpos($all_langs, ','));
465
-		ecrire_meta('langue_site', $tout);
466
-	}
437
+    // liste des langues dans les meta, sauf a l'install
438
+    $all_langs = $GLOBALS['meta']['langues_proposees'] ?? '';
439
+
440
+    $tout = [];
441
+    if (!$all_langs) {
442
+        // trouver tous les modules lang/spip_xx.php
443
+        $modules = find_all_in_path('lang/', '/spip_([a-z_]+)\.php$');
444
+        foreach ($modules as $name => $path) {
445
+            if (preg_match(',^spip_([a-z_]+)\.php$,', $name, $regs)) {
446
+                if (match_langue($regs[1])) {
447
+                    $tout[] = $regs[1];
448
+                }
449
+            }
450
+        }
451
+        sort($tout);
452
+        $tout = join(',', $tout);
453
+        // Si les langues n'ont pas change, ne rien faire
454
+        if ($tout != $all_langs) {
455
+            $GLOBALS['meta']['langues_proposees'] = $tout;
456
+            include_spip('inc/meta');
457
+            ecrire_meta('langues_proposees', $tout);
458
+        }
459
+    }
460
+    if (!isset($GLOBALS['meta']['langue_site'])) {
461
+        // Initialisation : le francais si dispo, sinon la premiere langue trouvee
462
+        $GLOBALS['meta']['langue_site'] = $tout =
463
+            (!$all_langs or (strpos(',' . _LANGUE_PAR_DEFAUT . ',', (string) ",$all_langs,") !== false))
464
+                ? _LANGUE_PAR_DEFAUT : substr($all_langs, 0, strpos($all_langs, ','));
465
+        ecrire_meta('langue_site', $tout);
466
+    }
467 467
 }
468 468
 
469 469
 /**
@@ -477,10 +477,10 @@  discard block
 block discarded – undo
477 477
  *     Code html de la balise <html>
478 478
  **/
479 479
 function html_lang_attributes() {
480
-	$lang = $GLOBALS['spip_lang'];
481
-	$dir = ($GLOBALS['spip_lang_rtl'] ? 'rtl' : 'ltr');
480
+    $lang = $GLOBALS['spip_lang'];
481
+    $dir = ($GLOBALS['spip_lang_rtl'] ? 'rtl' : 'ltr');
482 482
 
483
-	return "<html class='$dir $lang no-js' xmlns='http://www.w3.org/1999/xhtml' lang='$lang' dir='$dir'>\n";
483
+    return "<html class='$dir $lang no-js' xmlns='http://www.w3.org/1999/xhtml' lang='$lang' dir='$dir'>\n";
484 484
 }
485 485
 
486 486
 
@@ -494,7 +494,7 @@  discard block
 block discarded – undo
494 494
  * @return string
495 495
  */
496 496
 function aide_lang_dir($spip_lang, $spip_lang_rtl) {
497
-	return ($spip_lang <> 'he') ? $spip_lang_rtl : '';
497
+    return ($spip_lang <> 'he') ? $spip_lang_rtl : '';
498 498
 }
499 499
 
500 500
 
Please login to merge, or discard this patch.