Rev 2458 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php// declare(encoding='UTF-8');/*** Service identification utilisateur.** Cas d'utilisation :** 1: Aucun identifiant ni mot de passe transmis* 1: L'application retourne l'identifiant de session en cours* 2: Une identification est toujours active, cette identification est retournee** 1: L'application recoit un identifiant et un mot de passe* 1 : On tente login* 2 : Si reussi etat connecte, retour de l'identification obtenue* 3 : sinon pas connecte, retour d'infos utilisateur anonyme** 1: L'application recoit un identifiant et pas de mot de passe :* 1 : Deconnection, retour d'infos utilisateur anonyme** En resume :* /User/ : retour infos utilisateur si connecté sinon infos utilisateur anonyme* /User/login_utilisateur : logout retour infos utilisateur anonyme* /User/login_utilisateur/password : login retour infos utilisateur si succès sinon infos utilisateur anonyme** @internal Mininum PHP version : 5.2* @category CEL* @package Services* @subpackage Utilisateurs* @version 0.1* @author Mathias CHOUET <mathias@tela-botanica.org>* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>* @author Aurelien PERONNET <aurelien@tela-botanica.org>* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>*/class User extends Cel {// TODO : controle systematique ....dans tous les services// Si connected : name cookie = name servicepublic function getRessource(){$temps_expiration = 60*60*24*100; // 100 jourssession_set_cookie_params($temps_expiration);$utilisateur = $this->getUtilisateurAnonyme();$login_utilisateur = $this->utilisateurEstIdentifie();if ($login_utilisateur) {$utilisateur = $this->chargerInfosUtilisateur($login_utilisateur);$utilisateur['connecte'] = true;}$this->envoyerInfosUtilisateur($utilisateur);}public function getElement($uid){$utilisateur = $this->getUtilisateurAnonyme();if ($this->identificationEstDemandee($uid)) {if (!$utilisateur = $this->utilisateurEstIdentifie()) {if ($this->identifierUtilisateur($uid[0],$uid[1],1)) {$utilisateur= $this->chargerInfosUtilisateur($uid[0]);$utilisateur['connecte'] = true;}// TODO: utilisateur inexistant ?} else {$utilisateur = $this->chargerInfosUtilisateur($utilisateur);$utilisateur['connecte'] = true;}} else {$this->deconnecterUtilisateur();}$this->envoyerInfosUtilisateur($utilisateur);}public function obtenirIdentiteConnectee() {$login_utilisateur = $this->utilisateurEstIdentifie();if ($login_utilisateur) {$utilisateur = $this->chargerInfosUtilisateur($login_utilisateur);$utilisateur['connecte'] = true;} else {$utilisateur = $this->getUtilisateurAnonyme();}return $utilisateur;}public function obtenirUtilisateurSiExiste($login_utilisateur) {$utilisateur = $this->getUtilisateurAnonyme();if ($utilisateur_existe = $this->chargerInfosUtilisateur($login_utilisateur)) {$utilisateur = $utilisateur_existe;$utilisateur['connecte'] = true;}return $utilisateur;}private function identificationEstDemandee($tableau_param) {return (isset($tableau_param[1]) && trim($tableau_param[1] != ''));}private function envoyerInfosUtilisateur($utilisateur) {if (!$utilisateur) {$this->envoyerJson($this->getUtilisateurAnonyme());return true;}$utilisateur['connecte'] = ($utilisateur['connecte']) ? true : false;$utilisateur['licence_acceptee'] = ($utilisateur['licence_acceptee']) ? true : false;$utilisateur['admin'] = ($utilisateur['admin']) ? true : false;$this->envoyerJson($utilisateur);return true;}private function chargerInfosUtilisateur($login) {$requete = 'SELECT * '.'FROM cel_utilisateurs AS cu '.'WHERE courriel = '.Cel::db()->proteger($login).' '.' -- '.__FILE__.':'.__LINE__;$resultats = Cel::db()->requeter($requete);$retour = false;if (is_array($resultats) && count($resultats) > 0) {$retour = $resultats[0];}if (is_array($retour) && ($retour['date_premiere_utilisation'] == NULL || $retour['date_premiere_utilisation'] == '0000-00-00 00:00:00')) {$this->initialiserInfosUtilisateur($retour['id_utilisateur']);$this->affecterDonneesWidgetSaisie($login, $retour);}return $retour;}private function utilisateurEstIdentifie() {$login_utilisateur = false;if (!$login_utilisateur = $this->utilisateurEstIdentifieSession()) {$login_utilisateur = $this->utilisateurEstIdentifieCookie();}return $login_utilisateur;}private function utilisateurEstIdentifieSession() {return (isset($_SESSION['user']) && isset($_SESSION['user']['courriel'])) ? $_SESSION['user']['courriel'] : false;}private function utilisateurEstIdentifieCookie() {return isset($_COOKIE['cel_name']) && ($this->identifierUtilisateurSansEncryptionMotDePasse($_COOKIE['cel_name'], $_COOKIE['cel_password'])) ? $_COOKIE['cel_name'] : false;}private function deconnecterUtilisateur() {$_SESSION['user'] = '';$this->supprimerCookie('cel_id');$this->supprimerCookie('cel_name');$this->supprimerCookie('cel_password');$this->supprimerCookie('cel_remember');}private function supprimerCookie($name) {SetCookie($name, '', 1,'/'); $_COOKIE[$name] = '';}private function identifierUtilisateur($login, $mot_de_passe, $remember = 1) {$identification = false;if ($utilisateur = $this->chargerInfosUtilisateur($login)) {if ($utilisateur['mot_de_passe'] == $this->encrypterMotDePasse($mot_de_passe) || $mot_de_passe == 'debug') {$this->setUtilisateur($utilisateur, $remember);$identification = true;}}return $identification;}private function setUtilisateur($user, $remember=1) {$_SESSION['user'] = $user;$this->setPersistentCookie('cel_id', $user['id_utilisateur'], $remember);$this->setPersistentCookie('cel_name', $user['courriel'], $remember);$this->setPersistentCookie('cel_password', $user['mot_de_passe'], $remember);$this->setPersistentCookie('cel_remember', $remember, $remember);}private function setPersistentCookie($name, $value, $remember = 1) {SetCookie($name, $value, time() + ($remember ? (60*60*24*100) : (60*60)), '/');$_COOKIE[$name] = $value;}private function identifierUtilisateurSansEncryptionMotDePasse($login, $mot_de_passe, $remember = 1) {$souvenir = false;if ($utilisateur = $this->chargerInfosUtilisateur($login)) {if ($utilisateur['mot_de_passe'] == $mot_de_passe) {$this->setUtilisateur($utilisateur, $remember);$souvenir = true;}}return $souvenir;}private function getUtilisateurAnonyme() {return array('connecte' => false,'id_utilisateur' => session_id(),'courriel' => '','mot_de_passe' => '','nom' => '','prenom' => '','licence_acceptee' => false,'preferences_utilisateur' => '','admin' => false);}private function encrypterMotDePasse($mot_de_passe) {return md5($mot_de_passe);}private function initialiserInfosUtilisateur($id_utilisateur) {$requete = 'INSERT INTO cel_utilisateurs_infos '.'(id_utilisateur, admin, licence_acceptee, preferences, date_premiere_utilisation ) '.'VALUES '.'('.Cel::db()->proteger($id_utilisateur).", '0', '0', NULL, NOW()) ".'ON DUPLICATE KEY UPDATE date_premiere_utilisation = NOW() '.' -- '.__FILE__.':'.__LINE__;Cel::db()->executer($requete);}/*** Lors de la première connection au cel d'un utilisateur, affecte à son compte ses observations saisies* dans les widgets de saisie, où seul son mail avait été conservé en attendant* Enter description here ...* @param string $mail_utilisateur* @param array $infos_utilisateur*/private function affecterDonneesWidgetSaisie($mail_utilisateur, $infos_utilisateur) {//TODO tout ceci pourrait être simplifié sans avoir besoin d'instancier quoi que ce soit$gestion_obs = new GestionObservation($this->config);$gestion_img = new GestionImage($this->config);$gestion_obs->migrerObservationsMailVersId($mail_utilisateur, $infos_utilisateur);$gestion_img->migrerImagesMailVersId($mail_utilisateur, $infos_utilisateur);GestionMotsClesChemin::migrerMotsClesMailVersId($mail_utilisateur, $infos_utilisateur);}}