Subversion Repositories eFlore/Applications.cel

Rev

Rev 2271 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
416 aurelien 1
<?php
2458 jpm 2
// declare(encoding='UTF-8');
416 aurelien 3
/**
2458 jpm 4
 * Service identification utilisateur.
5
 *
6
 * Cas d'utilisation :
7
 *
8
 * 1: Aucun identifiant ni mot de passe transmis
9
 * 	  1: L'application retourne l'identifiant de session en cours
10
 * 	  2: Une identification est toujours active, cette identification est retournee
11
 *
12
 * 1: L'application recoit un identifiant et un mot de passe
13
 *    1 : On tente login
14
 *    2 : Si reussi etat connecte, retour de l'identification obtenue
15
 *    3 : sinon pas connecte, retour d'infos utilisateur anonyme
16
 *
17
 * 1:  L'application recoit un identifiant et pas de mot de passe :
18
 *    1 : Deconnection, retour d'infos utilisateur anonyme
19
 *
20
 *   En resume :
21
 *  /User/  : retour infos utilisateur si connecté sinon infos utilisateur anonyme
22
 *  /User/login_utilisateur : logout retour infos utilisateur anonyme
23
 *  /User/login_utilisateur/password : login retour infos utilisateur si succès sinon infos utilisateur anonyme
24
 *
25
 * @internal   Mininum PHP version : 5.2
26
 * @category   CEL
27
 * @package    Services
28
 * @subpackage Utilisateurs
29
 * @version    0.1
30
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
31
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
32
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
33
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
34
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
35
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
36
 */
933 aurelien 37
class User extends Cel {
416 aurelien 38
 
933 aurelien 39
	// TODO : controle systematique ....dans tous les services
40
	// Si connected : name cookie = name service
2458 jpm 41
	public function getRessource(){
933 aurelien 42
		$temps_expiration = 60*60*24*100; // 100 jours
43
		session_set_cookie_params($temps_expiration);
2458 jpm 44
 
986 aurelien 45
		$utilisateur = $this->getUtilisateurAnonyme();
2458 jpm 46
 
933 aurelien 47
		$login_utilisateur = $this->utilisateurEstIdentifie();
2458 jpm 48
 
933 aurelien 49
		if ($login_utilisateur) {
50
			$utilisateur = $this->chargerInfosUtilisateur($login_utilisateur);
51
			$utilisateur['connecte'] = true;
416 aurelien 52
		}
53
 
933 aurelien 54
		$this->envoyerInfosUtilisateur($utilisateur);
416 aurelien 55
	}
56
 
2458 jpm 57
	public function getElement($uid){
58
		$utilisateur = $this->getUtilisateurAnonyme();
416 aurelien 59
 
2458 jpm 60
		if ($this->identificationEstDemandee($uid)) {
61
			if (!$utilisateur = $this->utilisateurEstIdentifie()) {
62
				if ($this->identifierUtilisateur($uid[0],$uid[1],1)) {
933 aurelien 63
					$utilisateur= $this->chargerInfosUtilisateur($uid[0]);
64
					$utilisateur['connecte'] = true;
416 aurelien 65
				}
1742 raphael 66
				// TODO: utilisateur inexistant ?
2458 jpm 67
			} else {
933 aurelien 68
				$utilisateur = $this->chargerInfosUtilisateur($utilisateur);
69
				$utilisateur['connecte'] = true;
416 aurelien 70
			}
2458 jpm 71
		} else {
970 aurelien 72
			$this->deconnecterUtilisateur();
416 aurelien 73
		}
74
 
933 aurelien 75
		$this->envoyerInfosUtilisateur($utilisateur);
2458 jpm 76
	}
77
 
78
	public function obtenirIdentiteConnectee() {
1647 aurelien 79
		$login_utilisateur = $this->utilisateurEstIdentifie();
80
		if ($login_utilisateur) {
81
			$utilisateur = $this->chargerInfosUtilisateur($login_utilisateur);
82
			$utilisateur['connecte'] = true;
1686 aurelien 83
		} else {
84
			$utilisateur = $this->getUtilisateurAnonyme();
1647 aurelien 85
		}
86
		return $utilisateur;
2458 jpm 87
	}
1742 raphael 88
 
2458 jpm 89
	public function obtenirUtilisateurSiExiste($login_utilisateur) {
90
		$utilisateur = $this->getUtilisateurAnonyme();
91
		if ($utilisateur_existe = $this->chargerInfosUtilisateur($login_utilisateur)) {
92
			$utilisateur = $utilisateur_existe;
93
			$utilisateur['connecte'] = true;
94
		}
95
		return $utilisateur;
96
	}
1393 aurelien 97
 
2458 jpm 98
	private function identificationEstDemandee($tableau_param) {
99
		return (isset($tableau_param[1]) && trim($tableau_param[1] != ''));
100
	}
101
 
102
	private function envoyerInfosUtilisateur($utilisateur) {
103
		if (!$utilisateur) {
104
			$this->envoyerJson($this->getUtilisateurAnonyme());
105
			return true;
933 aurelien 106
		}
2458 jpm 107
		$utilisateur['connecte'] = ($utilisateur['connecte']) ? true : false;
108
		$utilisateur['licence_acceptee'] = ($utilisateur['licence_acceptee']) ? true : false;
109
		$utilisateur['admin'] = ($utilisateur['admin']) ? true : false;
110
 
111
		$this->envoyerJson($utilisateur);
112
		return true;
113
	}
114
 
115
	private function chargerInfosUtilisateur($login) {
116
		$requete = 'SELECT * '.
117
			'FROM cel_utilisateurs AS cu '.
118
			'WHERE courriel = '.Cel::db()->proteger($login).' '.
119
			' -- '.__FILE__.':'.__LINE__;
120
		$resultats = Cel::db()->requeter($requete);
121
 
122
		$retour = false;
123
		if (is_array($resultats) && count($resultats) > 0) {
124
			$retour = $resultats[0];
125
		}
126
		if (is_array($retour) && ($retour['date_premiere_utilisation'] == NULL || $retour['date_premiere_utilisation'] == '0000-00-00 00:00:00')) {
1393 aurelien 127
			$this->initialiserInfosUtilisateur($retour['id_utilisateur']);
1467 aurelien 128
			$this->affecterDonneesWidgetSaisie($login, $retour);
1385 aurelien 129
		}
933 aurelien 130
		return $retour;
416 aurelien 131
	}
2458 jpm 132
 
133
	private function utilisateurEstIdentifie() {
134
		$login_utilisateur = false;
135
		if (!$login_utilisateur = $this->utilisateurEstIdentifieSession()) {
136
			$login_utilisateur = $this->utilisateurEstIdentifieCookie();
137
		}
933 aurelien 138
		return $login_utilisateur;
2458 jpm 139
	}
416 aurelien 140
 
2458 jpm 141
	private function utilisateurEstIdentifieSession() {
142
		return (isset($_SESSION['user']) && isset($_SESSION['user']['courriel'])) ? $_SESSION['user']['courriel'] : false;
143
	}
416 aurelien 144
 
2458 jpm 145
	private function utilisateurEstIdentifieCookie() {
146
		return isset($_COOKIE['cel_name']) && ($this->identifierUtilisateurSansEncryptionMotDePasse($_COOKIE['cel_name'], $_COOKIE['cel_password'])) ? $_COOKIE['cel_name'] : false;
147
	}
416 aurelien 148
 
2458 jpm 149
	private function deconnecterUtilisateur() {
150
		$_SESSION['user'] = '';
151
		$this->supprimerCookie('cel_id');
152
		$this->supprimerCookie('cel_name');
153
		$this->supprimerCookie('cel_password');
154
		$this->supprimerCookie('cel_remember');
155
	}
416 aurelien 156
 
2458 jpm 157
	private function supprimerCookie($name) {
158
		SetCookie($name, '', 1,'/'); $_COOKIE[$name] = '';
159
	}
416 aurelien 160
 
2458 jpm 161
	private function identifierUtilisateur($login, $mot_de_passe, $remember = 1) {
933 aurelien 162
		$identification = false;
2458 jpm 163
		if ($utilisateur = $this->chargerInfosUtilisateur($login)) {
164
			if ($utilisateur['mot_de_passe'] == $this->encrypterMotDePasse($mot_de_passe) || $mot_de_passe == 'debug') {
165
				$this->setUtilisateur($utilisateur, $remember);
166
				$identification = true;
167
			}
605 aurelien 168
		}
933 aurelien 169
		return $identification;
170
	}
171
 
2458 jpm 172
	private function setUtilisateur($user, $remember=1) {
173
		$_SESSION['user'] = $user;
174
		$this->setPersistentCookie('cel_id', $user['id_utilisateur'], $remember);
175
		$this->setPersistentCookie('cel_name', $user['courriel'], $remember);
176
		$this->setPersistentCookie('cel_password', $user['mot_de_passe'], $remember);
177
		$this->setPersistentCookie('cel_remember', $remember, $remember);
178
	}
179
 
180
	private function setPersistentCookie($name, $value, $remember = 1) {
181
		SetCookie($name, $value, time() + ($remember ? (60*60*24*100) : (60*60)), '/');
182
		$_COOKIE[$name] = $value;
183
	}
184
 
185
	private function identifierUtilisateurSansEncryptionMotDePasse($login, $mot_de_passe, $remember = 1) {
933 aurelien 186
		$souvenir = false;
187
		if ($utilisateur = $this->chargerInfosUtilisateur($login)) {
188
			if ($utilisateur['mot_de_passe'] == $mot_de_passe) {
970 aurelien 189
				$this->setUtilisateur($utilisateur, $remember);
933 aurelien 190
				$souvenir = true;
191
			}
605 aurelien 192
		}
933 aurelien 193
		return $souvenir;
605 aurelien 194
	}
2458 jpm 195
 
986 aurelien 196
	private function getUtilisateurAnonyme() {
197
		return array('connecte' => false,
2458 jpm 198
			'id_utilisateur' => session_id(),
199
			'courriel' => '',
200
			'mot_de_passe' => '',
201
			'nom' => '',
202
			'prenom' => '',
203
			'licence_acceptee' => false,
204
			'preferences_utilisateur' => '',
205
			'admin' => false
206
		);
986 aurelien 207
	}
2458 jpm 208
 
933 aurelien 209
	private function encrypterMotDePasse($mot_de_passe) {
210
		return md5($mot_de_passe);
211
	}
2458 jpm 212
 
1385 aurelien 213
	private function initialiserInfosUtilisateur($id_utilisateur) {
214
		$requete = 'INSERT INTO cel_utilisateurs_infos '.
2458 jpm 215
			'(id_utilisateur, admin, licence_acceptee, preferences, date_premiere_utilisation ) '.
216
			'VALUES '.
217
			'('.Cel::db()->proteger($id_utilisateur).", '0', '0', NULL, NOW()) ".
218
			'ON DUPLICATE KEY UPDATE date_premiere_utilisation = NOW() '.
219
			' -- '.__FILE__.':'.__LINE__;
220
		Cel::db()->executer($requete);
1385 aurelien 221
	}
2458 jpm 222
 
1467 aurelien 223
	/**
224
	 * Lors de la première connection au cel d'un utilisateur, affecte à son compte ses observations saisies
225
	 * dans les widgets de saisie, où seul son mail avait été conservé en attendant
226
	 * Enter description here ...
227
	 * @param string $mail_utilisateur
228
	 * @param array $infos_utilisateur
229
	 */
230
	private function affecterDonneesWidgetSaisie($mail_utilisateur, $infos_utilisateur) {
2060 aurelien 231
		//TODO tout ceci pourrait être simplifié sans avoir besoin d'instancier quoi que ce soit
1467 aurelien 232
		$gestion_obs = new GestionObservation($this->config);
233
		$gestion_img = new GestionImage($this->config);
2458 jpm 234
 
1467 aurelien 235
		$gestion_obs->migrerObservationsMailVersId($mail_utilisateur, $infos_utilisateur);
236
		$gestion_img->migrerImagesMailVersId($mail_utilisateur, $infos_utilisateur);
2060 aurelien 237
		GestionMotsClesChemin::migrerMotsClesMailVersId($mail_utilisateur, $infos_utilisateur);
1467 aurelien 238
	}
2458 jpm 239
}