Subversion Repositories eFlore/Applications.coel

Rev

Rev 1852 | Rev 1907 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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