Subversion Repositories eFlore/Applications.coel

Rev

Rev 1936 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1497 jpm 1
<?php
2
/**
3
 * Service d'itentification d'un utilisateur.
1906 mathias 4
 * Modifié pour fonctionner avec le SSO.
5
 *
1497 jpm 6
 * Encodage en entrée : utf8
7
 * Encodage en sortie : utf8
1906 mathias 8
 *
1497 jpm 9
 * Cas d'utilisation :
1906 mathias 10
 * Le service reçoit un jeton SSO (ou pas) dans le header "Authorization", le fait
11
 * vérifier par l'annuaire; s'il est valide, le décode puis retourne le profil utilisateur
12
 * associé; sinon retourne un profil anonyme.
1497 jpm 13
 *
1906 mathias 14
 * 1: Aucun jeton ou jeton invalide transmis
15
 * 	1: L'application retourne l'identifiant de session en cours (mode anonyme)
1497 jpm 16
 *
1906 mathias 17
 * 2: Jeton valide transmis
18
 * 	1 : Passe ou reste dans l'état "connecté"; le profil actif est retourné
1497 jpm 19
 *
20
 *  En résumé, utilisation des URLs :
1906 mathias 21
 *  /CoelUtilisateur/identite : retour identifiant de session si jamais connecté, sinon retour de l'id (+ login et mot de passe)
1497 jpm 22
 *
23
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
1906 mathias 24
 * @author David DELON <david.delon@clapas.net>
25
 * @author Mathias CHOUET <mathias@tela-botanica.org>
1497 jpm 26
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
27
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
28
 * @version $Id$
29
 * @copyright 2009
30
 */
1908 mathias 31
class CoelUtilisateur extends Coel {
1497 jpm 32
 
1906 mathias 33
	protected $licence_acceptee = false;
34
 
35
	/**
1908 mathias 36
	 * Point d'entrée GET sans paramètres
1906 mathias 37
	 */
38
	public function getRessource() {
39
		// par défaut, mode anonyme
40
		$infos = $this->getUtilisateurAnonyme();
41
		// recherche d'un utilisateur identifié en fonction du jeton SSO
42
		$infosIdentifie = $this->getUtilisateurSSO();
43
		if ($infosIdentifie != null) {
44
			$infos = $infosIdentifie;
1497 jpm 45
		}
1906 mathias 46
		// et vlan, passe-moi l'éponge
47
		$this->envoyer($infos);
48
	}
49
 
50
	/**
1908 mathias 51
	 * Point d'entrée GET avec paramètres
52
	 */
53
	public function getElement($ressources) {
54
		switch($ressources[0]) {
55
			case "setLicence" :
56
				$this->setLicence($ressources[1]);
57
				break;
58
			default:
59
				echo "action [" . $ressources[0] . "] inconnue";
60
		}
61
	}
62
 
63
	/**
1906 mathias 64
	 * Renvoie un profil utilisateur CoeL anonyme
65
	 * (licence vide, id de session, non connecté)
66
	 */
67
	protected function getUtilisateurAnonyme() {
68
		$info = array("", session_id(), false);
69
		return $info;
70
	}
71
 
72
	/**
73
	 * Recherche un jeton SSO dans l'entête HTTP "Authorization", vérifie ce
74
	 * jeton auprès de l'annuaire et en cas de succès charge les informations
75
	 * de l'utilisateur associé; si besoin, copie l'utilisateur dans la table
76
	 * Personnes de CoeL
77
	 *
78
	 * @return Array un profil utilisateur ou null
79
	 */
80
	protected function getUtilisateurSSO() {
81
		$utilisateur = null;
82
		// lecture du jeton
83
		$jeton = $this->lireJetonEntete();
84
		//echo "Jeton : "; var_dump($jeton);
85
		if ($jeton != null) {
86
			// validation par l'annuaire
87
			$valide = $this->verifierJeton($jeton);
88
			if ($valide === true) {
89
				// décodage du courriel utilisateur depuis le jeton
90
				$donneesJeton = $this->decoderJeton($jeton);
91
				if ($donneesJeton != null && $donneesJeton["sub"] != "") {
92
					// récupération de l'utilisateur
93
					$courriel = $donneesJeton["sub"];
94
 
95
					// lecture des infos dans l'annuaire (relou mais nécessaire pour la copie dans la table Personnes de CoeL)
96
					$infosAnnuaire = $this->obtenirInfosAnnuaire($courriel);
1950 mathias 97
					$infosAnnuaire['courriel'] = $courriel;
1906 mathias 98
					$this->setInfosAnnuaire($infosAnnuaire);
99
					//echo "Infos Annu: "; var_dump($infosAnnuaire);
100
 
101
					// lecture de l'utilisateur connu (ou pas) par CoeL (table Personnes)
102
					$utilisateur_existant = $this->chargerUtilisateur($courriel);
103
					//echo "UTIL EXIST: "; var_dump($utilisateur_existant);
104
 
105
					// Vérification de la nécessité de mettre à jour l'utilisateur COEL vis à vis de l'annuaire de Tela Botanica
106
					if (!is_null($infosAnnuaire) &&  $this->avoirBesoinMiseAJour($utilisateur_existant)) {
107
						$this->debug[] = "Besoin d'une mise à jour";
108
 
109
						$presence_dans_coel = ($utilisateur_existant != false); // si on l'a trouvé juste au dessus
110
						$this->debug[] = "Presence: $presence_dans_coel";
1950 mathias 111
						//$mot_de_passe_sha1 = $infosAnnuaire['pass'];
1906 mathias 112
						//echo "MDP: " .$mot_de_passe_sha1;
113
 
114
						if ($presence_dans_coel) {
115
							// Nécessite de faire une mise à jour
116
							$this->debug[] = "Mise à jour de l'utilisateur {$infosAnnuaire['id']}";
1950 mathias 117
							$this->mettreAJourUtilisateur($courriel, $infosAnnuaire);
1936 mathias 118
							// ci-dessous : ne pas caster en int car GWT attend une String (le con !)
119
							$utilisateur_existant['licence'] = $this->recupererLicenceUtilisateur($infosAnnuaire['id']);
1906 mathias 120
						} else {
121
							// Nécessite d'ajouter le nouvel utilisateur
122
							$this->debug[] = "Ajout d'une nouvel utilisateur";
1950 mathias 123
							$this->ajouterUtilisateurACoel($infosAnnuaire);
1906 mathias 124
							// rechargement après l'avoir ajouté (un peu nul)
125
							$utilisateur_existant = $this->chargerUtilisateur($courriel);
126
						}
1497 jpm 127
					}
1906 mathias 128
 
129
					// stockage de l'utilisateur en session
130
					$this->setUtilisateur($utilisateur_existant);
131
 
132
					// renvoi des infos
133
					$utilisateur = array($utilisateur_existant['licence'], $infosAnnuaire['id'], true, $this->getUtilisateurNomComplet(), $this->getUtilisateurPrenom(), $this->getUtilisateurNom(), $this->getParametre());
1497 jpm 134
				}
135
			}
136
		}
137
 
1906 mathias 138
		return $utilisateur;
1497 jpm 139
	}
140
 
1906 mathias 141
	protected function deconnecterUtilisateur() {
1497 jpm 142
		$_SESSION['coel_utilisateur'] = '';
143
		$_SESSION['coel_infosAnnuaire'] = '';
144
	}
145
 
1906 mathias 146
	/**
147
	 * Retourne true si le compte utilisateur a été modifié dans l'annuaire, et que les
148
	 * modifications ont besoin d'être répercutées dans la table Personnes de Coel
149
	 */
150
	protected function avoirBesoinMiseAJour($info_annuaire_coel) {
1497 jpm 151
		$necessite_maj = false;
152
		if ($info_annuaire_coel == false) {
153
			// Le login et/ou le mot de passe a pu changer
154
			$necessite_maj = true;
155
		} else {
156
			$info_annuaire_distant = $this->getInfosAnnuaire();
157
			if ($this->comparerInfosAnnuairesDistantEtCoel($info_annuaire_distant, $info_annuaire_coel) == false) {
158
				$necessite_maj = true;
159
			}
160
		}
161
		return $necessite_maj;
162
	}
163
 
1906 mathias 164
	protected function comparerInfosAnnuairesDistantEtCoel($annuaire_distant, $annuaire_coel) {
1497 jpm 165
		$identique = true;
166
		$tableau_annuaire_distant = array('nom' => $annuaire_distant['nom'],
167
			'prenom' => $annuaire_distant['prenom'],
168
			'ville' => $annuaire_distant['ville'],
169
			'code_postal' => $annuaire_distant['code_postal']);
170
		$tableau_annuaire_coel = array('nom' => $annuaire_coel['nom'],
171
			'prenom' => $annuaire_coel['prenom'],
172
			'ville' => $annuaire_coel['ville'],
173
			'code_postal' => $annuaire_coel['code_postal']);
174
		foreach ($tableau_annuaire_distant as $cle => $valeur) {
175
			if ($tableau_annuaire_coel[$cle] != $valeur) {
176
				$identique = false;
177
				break;
178
			}
179
		}
180
		return $identique;
181
	}
1906 mathias 182
 
183
	/**
184
	 * Vérifie si un utilisateur est présent dans la table Personnes de CoeL
185
	 */
186
	protected function verifierPresenceUtilisateur($id) {
1497 jpm 187
		$present = false;
188
		$requete =	'SELECT COUNT(cp_id_personne) AS nbre '.
189
					'FROM coel_personne '.
1508 jpm 190
					"WHERE cp_ce_annuaire = {$this->bdd->quote($id)} ".
1635 aurelien 191
					"	AND cp_ce_annuaire = cp_id_personne ";
1497 jpm 192
		try {
193
			$nbre = $this->bdd->query($requete)->fetchColumn();
1508 jpm 194
			if (0 == $nbre) {
195
				$this->debug[] = "Utilisateur NON présent dans l'annuaire de COEL.";
196
			} else if (1 == $nbre) {
197
				$this->debug[] = "Utilisateur présent dans l'annuaire de COEL.";
1497 jpm 198
				$present = true;
1508 jpm 199
			} else if (false === $nbre) {
200
				$this->debug[] = "Erreur dans la requête de vérification de présence dans l'annuaire de COEL.";
1497 jpm 201
			}
202
		} catch (PDOException $e) {
203
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
204
		}
205
 
206
		return $present;
207
	}
1906 mathias 208
 
209
	/**
210
	 * Renvoie l'état d'acceptation de la licence pour un utilisateur donné :
211
	 * 0 (non acceptée) ou 1 (acceptée)
212
	 */
213
	protected function recupererLicenceUtilisateur($id) {
1497 jpm 214
		$requete =	'SELECT cp_mark_licence '.
215
					'FROM coel_personne '.
1508 jpm 216
					"WHERE cp_ce_annuaire = {$this->bdd->quote($id)} ".
1635 aurelien 217
					"	AND cp_ce_annuaire = cp_id_personne ";
1497 jpm 218
		try {
219
			$licence = $this->bdd->query($requete)->fetchColumn();
220
			if ($licence === false) {
221
				$this->debug[] = "La licence n'a pas pu être récupérée.";
222
				return 0;
223
			} else {
224
				return $licence;
225
			}
226
		} catch (PDOException $e) {
227
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
228
		}
229
	}
1906 mathias 230
 
231
	/**
232
	 * Met à jour les données de l'utilisateur dans la table CoeL Personnes
233
	 */
1950 mathias 234
	protected function mettreAJourUtilisateur($login, $infos) {
1497 jpm 235
		try {
236
		   	$cp_fmt_nom_complet = $infos['prenom'].' '.$infos['nom'];
1936 mathias 237
			$requete =  ''
238
				. 'UPDATE coel_personne'
239
				. " SET cp_id_personne = '{$infos['id']}', "
240
				. "	cp_fmt_nom_complet = '$cp_fmt_nom_complet', cp_prenom = '{$infos['prenom']}', cp_nom = '{$infos['nom']}', "
241
				. "	cp_code_postal = '{$infos['code_postal']}', cp_ville = '{$infos['ville']}', cp_truk_courriel = '{$infos['courriel']}', "
1950 mathias 242
				. "	cp_login = '{$infos['courriel']}', cp_ce_annuaire = '{$infos['id']}' "
1936 mathias 243
				. " WHERE cp_login = '$login' "
244
			;
245
 
1497 jpm 246
			// Ajout des données
247
			$resultat = $this->bdd->exec($requete);
248
			if ($resultat === false) {
249
				$this->messages[] = "L'utilisateur n'a pas été mis à jour car la requête a échouée.";
250
			}
251
		} catch (PDOException $e) {
252
			$messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
253
		}
254
	}
1906 mathias 255
 
256
	/**
1908 mathias 257
	 * Met à jour l'utilisateur d'id $idUtilisateur, et passe son acceptation de
258
	 * la licence à "1"
259
	 */
260
	protected function setLicence($idUtilisateur = null) {
261
		if ($idUtilisateur == null) {
262
			$messages[] = "Id utilisateur null";
263
			$this->envoyer();
264
			exit;
265
		}
266
		// Mise à jour de l'utilisateur
267
		try {
268
			$requete = 	'UPDATE coel_personne '.
269
				"SET cp_mark_licence = 1 ".
270
				"WHERE cp_ce_annuaire = '$idUtilisateur' ";
271
			// Ajout des données
272
			$resultat = $this->bdd->exec($requete);
273
			if ($resultat === false) {
274
				$this->messages[] = "L'utilisateur n'a pas été mis à jour car la requête a échouée.";
275
			} else {
276
				// Confirmation attendue par l'interface
277
				$this->envoyer(array("1"));
278
				exit;
279
			}
280
		} catch (PDOException $e) {
281
			$messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
282
			$this->envoyer();
283
		}
284
	}
285
 
286
	/**
1906 mathias 287
	 * Ajoute une copie de l'utilisateur dans la table CoeL Personnes
288
	 */
1950 mathias 289
	protected function ajouterUtilisateurACoel($infos) {
1497 jpm 290
		try {
291
			// Construction de la requête d'ajout
292
		   	// Notes : pour rester compatibles avec l'annuaire de Tela, les utilisateurs sont ajoutés directement avec l'id
293
		   	// de l'annuaire Tela. Dans CoelPersonne, les personnes qui ne sont pas utilisateur sont ajoutés avec un id supérieur à 100 000
1950 mathias 294
		   	// Notes 2017 : on ne devrait plus stocker les mots de passe dans la table coel_personne, et on ne devrait plus
295
		   	// considérer que la base de données de l'annuaire se trouve sur le même serveur.
1497 jpm 296
		   	$cp_fmt_nom_complet = $infos['prenom'].' '.$infos['nom'];
1932 mathias 297
		   	$cp_mark_licence = '0';
298
			// si un utilisateur a changé son email dans un compte TB existant, une ligne avec son ID existera déjà et /i
299
			// => on fait un REPLACE (attention à la compatibilité !)
300
		   	$requete = 	'REPLACE INTO coel_personne '.
1765 aurelien 301
		   				'	(cp_id_personne, cp_fmt_nom_complet, cp_prenom, cp_nom, cp_code_postal, '.
1950 mathias 302
						'	cp_ville, cp_truk_courriel, cp_login, cp_ce_annuaire, cp_mark_licence) '.
1765 aurelien 303
		   				"VALUES ('{$infos['id']}', '$cp_fmt_nom_complet', '{$infos['prenom']}', '{$infos['nom']}', ".
1950 mathias 304
		   				"'{$infos['code_postal']}', '{$infos['ville']}', '{$infos['courriel']}', '{$infos['courriel']}', ".
1497 jpm 305
		   				"'{$infos['id']}', $cp_mark_licence) ";
1508 jpm 306
		   	//$this->debug[] = $requete;
1497 jpm 307
			// Ajout des données
1950 mathias 308
			var_dump($requete);
1497 jpm 309
			$resultat = $this->bdd->exec($requete);
310
			if ($resultat === false) {
1508 jpm 311
				$this->debug[] = "Utilisateur NON ajouté dans coel_personne car la requête a échouée.";
312
			} else {
313
				$this->debug[] = "Utilisateur ajouté à coel_personne.";
1497 jpm 314
			}
315
		} catch (PDOException $e) {
1932 mathias 316
			//$this->debug[] = "EREEUR SQL: " . sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
1497 jpm 317
			$messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
318
		}
319
	}
1852 mathias 320
 
1906 mathias 321
	/**
322
	 * Appelle l'annuaire pour connaître tous les détails de l'utilisateur de courriel $login
1950 mathias 323
	 * @TODO gérer le pseudo un jour !
1906 mathias 324
	 */
325
	protected function obtenirInfosAnnuaire($login)	{
1497 jpm 326
		$url_annuaire = $this->config['coel']['urlAnnuaire'];
327
		$login_annuaire = $this->config['coel']['loginAnnuaire'];
328
		$mdp_annuaire = $this->config['coel']['mdpAnnuaire'];
1852 mathias 329
 
330
		$posds = strpos($url_annuaire, "//");
331
		$protocole = substr($url_annuaire, 0, $posds+2);
332
		$reste_adresse = substr($url_annuaire, $posds+2);
333
		// auth HTTP basic cracra
334
		$url_annuaire = $protocole . $login_annuaire . ':' . $mdp_annuaire . "@" . $reste_adresse;
335
		$url_annuaire .= '/' . $login;
336
		$url_annuaire .= '/xml'; // @TODO un jour, faire en sorte que ça lise du JSON
337
 
1497 jpm 338
		$resultat_annuaire = file_get_contents($url_annuaire);
1950 mathias 339
		// valeurs par défaut pour éviter des warning
340
		$tableau_annuaire = array(
341
			"nom" => "",
342
			"prenom" => "",
343
			"ville" => "",
344
			"code_postal" => "",
345
			"courriel" => ""
346
		);
1497 jpm 347
		if ($xml_utilisateur = simplexml_load_string($resultat_annuaire))	{
348
			// La fonction a retourné un objet
349
			foreach ($xml_utilisateur->children() as $key => $val) {
350
				if ((string) $val != '') {
351
			  		$tableau_annuaire[$key] = (String) $val;
352
				}
353
			}
354
		}
355
		return $tableau_annuaire;
356
	}
1852 mathias 357
 
1906 mathias 358
	/**
359
	 * Enregistre le fait que la personne de login $login a accepté la licence de CoeL
360
	 */
361
	protected function accepterLicence($login) {
1497 jpm 362
		$sortie = false;
363
		try {
364
			$requete = 	'UPDATE coel_personne '.
365
						'SET cp_mark_licence = 1 '.
1508 jpm 366
						"WHERE cp_login = {$this->bdd->quote($login)} ";
1497 jpm 367
			$resultat = $this->bdd->exec($requete);
368
			if ($resultat === false) {
1906 mathias 369
				$this->debug[] = "La table Personne n'a pas été mise à jour car la requête a échoué";
1497 jpm 370
			} else {
1508 jpm 371
				$this->debug[] = "Création du cookie licence.";
1497 jpm 372
				$_SESSION['coel_utilisateur']['licence'] = '1';
1906 mathias 373
				// @TODO CHANGER
1934 mathias 374
				//$this->setCookiePersistant('coel_licence', '1');
1497 jpm 375
				$sortie = true;
376
			}
377
		} catch (PDOException $e) {
378
		 	$messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
379
		}
380
		return $sortie;
381
	}
1906 mathias 382
 
383
	/**
384
	 * Essaye de trouver un jeton JWT non vide dans l'entête HTTP "Authorization"
385
	 *
386
	 * @return String un jeton JWT ou null
387
	 */
388
	protected function lireJetonEntete() {
389
		$jwt = null;
390
		$headers = apache_request_headers();
391
		if (isset($headers["Authorization"]) && ($headers["Authorization"] != "")) {
392
			$jwt = $headers["Authorization"];
393
		}
394
		return $jwt;
395
	}
396
 
397
	/**
398
	 * Vérifie un jeton auprès de l'annuaire
399
	 *
400
	 * @param String $jeton un jeton JWT
401
	 * @return true si le jeton est vérifié, false sinon
402
	 */
403
	protected function verifierJeton($jeton) {
1950 mathias 404
		$urlServiceVerification = $this->config['coel']['urlServiceBaseAuth'] . "verifierjeton";
1906 mathias 405
		$urlServiceVerification .= "?token=" . $jeton;
1950 mathias 406
 
1906 mathias 407
		// file_get_contents râle si le certificat HTTPS est auto-signé
408
		//$retour = file_get_contents($urlServiceVerification);
409
 
410
		// curl avec les options suivantes ignore le pb de certificat (pour tester en local)
411
		$ch = curl_init();
412
		$timeout = 5;
413
		curl_setopt($ch, CURLOPT_URL, $urlServiceVerification);
414
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
415
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
416
		// équivalent de "-k"
417
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
418
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
419
		$data = curl_exec($ch);
420
		curl_close($ch);
421
		$retour = $data;
422
 
423
		$retour = json_decode($retour, true);
424
 
425
		return ($retour === true);
426
	}
427
 
428
	/**
429
	 * Décode un jeton JWT (SSO) précédemment validé et retourne les infos
430
	 * qu'il contient (payload / claims)
431
	 * @param String $jeton un jeton JWT précédemment validé
432
	 */
433
	protected function decoderJeton($jeton) {
434
		$parts = explode('.', $jeton);
435
		$payload = $parts[1];
436
		$payload = base64_decode($payload);
437
		$payload = json_decode($payload, true);
438
 
439
		return $payload;
440
	}
441
 
442
	// accesseurs à deux ronds
443
	protected function getUtilisateurId() {
444
		if ($utilisateur = $this->getUtilisateur()) {
445
			return $utilisateur['id'];
446
		} else {
447
			return '';
448
		}
449
	}
450
	protected function getUtilisateurLogin() {
451
		if ($utilisateur = $this->getUtilisateur()) {
452
			return $utilisateur['login'];
453
		} else {
454
			return '';
455
		}
456
	}
457
	protected function getUtilisateurNomComplet() {
458
		if ($utilisateur = $this->getUtilisateur()) {
459
			return $utilisateur['nom_complet'];
460
		} else {
461
			return '';
462
		}
463
	}
464
	protected function getUtilisateurPrenom() {
465
		if ($utilisateur = $this->getUtilisateur()) {
466
			return $utilisateur['prenom'];
467
		} else {
468
			return '';
469
		}
470
	}
471
	protected function getUtilisateurNom() {
472
		if ($utilisateur = $this->getUtilisateur()) {
473
			return $utilisateur['nom'];
474
		} else {
475
			return '';
476
		}
477
	}
478
	protected function getParametre() {
479
		if ($utilisateur = $this->getUtilisateur()) {
480
			return $utilisateur['parametre'];
481
		} else {
482
			return '';
483
		}
484
	}
485
	protected function getLicence()	{
486
		if (!empty($_SESSION['coel_utilisateur']))	{
487
			return (string) $_SESSION['coel_utilisateur']['licence'];
488
		} else {
489
			return '';
490
		}
491
	}
492
	protected function getInfosAnnuaire()	{
493
		if (!empty($_SESSION['coel_infosAnnuaire']))	{
494
			return $_SESSION['coel_infosAnnuaire'];
495
		} else	{
496
			return '';
497
		}
498
	}
499
	protected function setInfosAnnuaire($infosAnnuaire)	{
500
		$_SESSION['coel_infosAnnuaire'] = $infosAnnuaire;
501
	}
1497 jpm 502
}
1906 mathias 503
 
504
/**
505
 * Compatibilité avec nginx - merci http://php.net/manual/fr/function.getallheaders.php
506
 */
507
if (! function_exists('apache_request_headers')) {
508
	function apache_request_headers() {
509
		$headers = '';
510
		foreach ($_SERVER as $name => $value) {
511
			if (substr($name, 0, 5) == 'HTTP_') {
512
				$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
513
			}
514
		}
515
		return $headers;
516
	}
517
}
1932 mathias 518
?>