* @author Jean-Pascal MILCENT * @author Aurelien PERONNET * @license GPL v3 * @license CECILL v2 * @copyright 1999-2014 Tela Botanica */ class GestionUtilisateur { protected $conteneur; protected $contexte; protected $bdd; private $utilisateur = array(); public function __construct(Conteneur $conteneur) { $this->conteneur = $conteneur; $this->bdd = $this->conteneur->getBdd(); $this->contexte = $this->conteneur->getContexte(); $this->chargerUtilisateur(); } private function chargerUtilisateur() { $this->demarrerSession(); $infos = $this->getUtilisateurIdentifie(); $this->utilisateur = ($infos == null) ? $this->getUtilisateurAnonyme() : $infos; } private function demarrerSession() { if (session_id() == '') { // TODO : modifier ce test lors du passage en php 5.4 session_start(); } } public function getUtilisateurIdentifie() { $utilisateur = null; $delCourriel = $this->contexte->getCookie('del_courriel'); $delMdp = $this->contexte->getCookie('del_mot_de_passe'); if ($delCourriel != null && $delMdp != null) { $utilisateur = $this->identifierUtilisateurSansEncryptionMotDePasse($delCourriel, $delMdp); } if ($utilisateur != null) { $utilisateur['session_id'] = session_id(); } return $utilisateur; } public function getUtilisateurAnonyme() { return array( 'connecte' => false, 'id_utilisateur' => session_id(), 'courriel' => '', 'mot_de_passe' => '', 'nom' => '', 'prenom' => '', 'admin' => '0', 'session_id' => session_id() ); } protected function identifierUtilisateur($login, $mot_de_passe) { return $this->recupererUtilisateurEnBdd($login, $mot_de_passe, 'MD5'); } protected function identifierUtilisateurSansEncryptionMotDePasse($login, $mot_de_passe) { return $this->recupererUtilisateurEnBdd($login, $mot_de_passe); } private function recupererUtilisateurEnBdd($login, $mot_de_passe, $cryptage = false) { $loginP = $this->bdd->proteger($login); $mdpP = $this->bdd->proteger($mot_de_passe); $mdpSql = $cryptage ? "$cryptage($mdpP)" : $mdpP; $requete = 'SELECT du.id_utilisateur, nom, prenom, courriel, mot_de_passe, dui.admin '. 'FROM del_utilisateur AS du '. ' LEFT JOIN del_utilisateur_infos AS dui ON (du.id_utilisateur = dui.id_utilisateur) '. "WHERE courriel = $loginP ". "AND mot_de_passe = $mdpSql ". ' -- '.__FILE__.' : '.__LINE__; return $this->bdd->recuperer($requete); } protected function completerInfosUtilisateur($utilisateur) { $utilisateur['session_id'] = session_id(); $utilisateur['connecte'] = true; return $utilisateur; } protected function poserCookieUtilisateur($utilisateur) { $this->setPersistentCookie('del_courriel', $utilisateur['courriel'], 1); $this->setPersistentCookie('del_mot_de_passe', $utilisateur['mot_de_passe'], 1); } protected function setPersistentCookie($name, $value, $remember = 1) { setcookie($name, $value, time() + ($remember ? (60*60*24*100) : (60*60)),'/'); } protected function oublierUtilisateur() { setcookie('del_courriel', $this->contexte->getCookie('del_courriel'), time()-3600, '/'); setcookie('del_mot_de_passe', $this->contexte->getCookie('del_mot_de_passe'), time()-3600, '/'); $this->contexte->setCookie('del_courriel', null); $this->contexte->setCookie('del_mot_de_passe', null); } public function etreAdmin() { $idUtilisateurP = $this->bdd->proteger($this->utilisateur['id_utilisateur']); $requete = 'SELECT admin '. 'FROM del_utilisateur_infos '. "WHERE id_utilisateur = $idUtilisateurP ". ' -- '.__FILE__.' : '.__LINE__; $resultat = $this->bdd->recuperer($requete); return ($resultat && $resultat['admin'] == 1); } protected function getEvenements($id_utilisateur) { $sql = $this->conteneur->getSql(); $date = $this->getDerniereDateConsultationEvenements($id_utilisateur); $requete_activite = $sql->getRequeteNbEvenementsDepuisDate($id_utilisateur, $date); $resultats = $this->bdd->recupererTous($requete_activite); $nb_evenements = $resultats[0]['nb_evenements']; $evenements['nb_evenements'] = $nb_evenements; $evenements['date_derniere_consultation_evenements'] = $date; return $evenements; } public function getDerniereDateConsultationEvenements($id_utilisateur) { $requete = "SELECT date_derniere_consultation_evenements FROM del_utilisateur_infos ". "WHERE id_utilisateur = ".$this->bdd->proteger($id_utilisateur); $date = $this->bdd->recuperer($requete); $date = !empty($date['date_derniere_consultation_evenements']) ? $date['date_derniere_consultation_evenements'] : "0"; return $date; } public function setDerniereDateConsultationEvenements($id_utilisateur, $date) { // Vérification que la ligne correspondant à l'utilisateur dans la table // infos existe bien (sinon on la crée) $infos_utilisateur = $this->obtenirInfosUtilisateur($id_utilisateur); if (empty($infos_utilisateur)) { $this->initialiserInfosUtilisateur($id_utilisateur); } $requete = "UPDATE del_utilisateur_infos SET date_derniere_consultation_evenements = ".$this->bdd->proteger($date)." ". "WHERE id_utilisateur = ".$this->bdd->proteger($id_utilisateur); $this->bdd->executer($requete); } protected function ajouterEvenements(&$utilisateur) { $evenements = $this->getEvenements($utilisateur['id_utilisateur']); $utilisateur = array_merge($utilisateur, $evenements); } public function obtenirPreferencesUtilisateur($id_utilisateur) { $prefs_utilisateur = $this->obtenirInfosUtilisateur($id_utilisateur); if (empty($prefs_utilisateur)) { $this->initialiserInfosUtilisateur($id_utilisateur); $prefs_utilisateur = $this->renvoyerInfosUtilisateurDefaut($id_utilisateur); } else { if (empty($prefs_utilisateur['preferences'])) { $prefs_utilisateur['preferences'] = $this->obtenirTableauPreferenceDefaut(); } else { $prefs_utilisateur['preferences'] = json_decode($prefs_utilisateur['preferences']); } $prefs_utilisateur['admin'] = $prefs_utilisateur['admin']; } return $prefs_utilisateur; } private function obtenirTableauPreferenceDefaut() { return array('mail_notification_mes_obs' => '1', 'mail_notification_toutes_obs' => '0'); } private function renvoyerInfosUtilisateurDefaut($id_utilisateur) { return array('id_utilisateur' => $id_utilisateur, 'admin' => '0', 'preferences' => $this->obtenirTableauPreferenceDefaut(), 'date_premiere_utilisation' => date('Y-m-d H:i:s'), 'date_derniere_consultation_evenements' => '0000-00-00 00:00:00'); } public function obtenirInfosUtilisateur($id_utilisateur) { $requete = 'SELECT * '. 'FROM del_utilisateur_infos '. 'WHERE id_utilisateur = '.$this->bdd->proteger($id_utilisateur).' '. ' -- '.__FILE__.' : '.__LINE__; $prefs_utilisateur = $this->bdd->recuperer($requete); return $prefs_utilisateur; } public function initialiserInfosUtilisateur($id_utilisateur) { $preferences_defaut = $this->obtenirTableauPreferenceDefaut(); $prefsEncodeesP = $this->bdd->proteger(json_encode($preferences_defaut)); $idUtilisateurP = $this->bdd->proteger($id_utilisateur); $requete = 'INSERT INTO del_utilisateur_infos '. '(id_utilisateur, admin, preferences, date_premiere_utilisation )'. "VALUES ($idUtilisateurP, 0, $prefsEncodeesP, NOW()) ". 'ON DUPLICATE KEY UPDATE date_premiere_utilisation = NOW() '. ' -- '.__FILE__.' : '.__LINE__; return $this->bdd->executer($requete); } }