Subversion Repositories eFlore/Applications.coel

Rev

Rev 1932 | Rev 1936 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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