Subversion Repositories eFlore/Applications.coel

Rev

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

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