Subversion Repositories eFlore/Applications.cel

Rev

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 service
        public function getRessource(){
                $temps_expiration = 60*60*24*100; // 100 jours
                session_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);
        }
}