Rev 2846 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php// declare(encoding='UTF-8');/*** Classe de gestion des utilisateurs*** @internal Mininum PHP version : 5.2* @category CEL* @package Services* @subpackage Bibliothèques* @version 0.1* @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-2015 Tela Botanica <accueil@tela-botanica.org>*/class GestionUtilisateur extends Cel {public function obtenirIdentiteConnectee() {$login_utilisateur = $this->getLoginUtilisateurVerifie();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 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);}// booleanisation des valeurs$retour['admin'] = ($retour['admin'] == 1);$retour['licence_acceptee'] = (isset($retour['licence_acceptee']) && ($retour['licence_acceptee'] == 1));return $retour;}private function utilisateurEstAutorise($id_utilisateur) {$autorise = false;$token = $this->getToken();// TODO: tester si le jeton contient réelement quelque chose ?if($token) {// On demande à l'annuaire si le jeton est bien valide$valide = file_get_contents($this->config['identification']['sso_url'].'/verifierjeton?token='.$token);$token_decode = $this->decoderToken($token);// Si l'utilisateur du token est bien le même que celui sur lequel on veut agir : OKif($token_decode['id'] == $id_utilisateur) {$autorise = true;} else {// Sinon on vérifie que l'utilisateur est admin$requete = "SELECT admin FROM cel_utilisateurs WHERE id_utilisateur = ".Cel::db()->proteger($token_decode['id']);$resultat = Cel::db()->requeter($requete);$admin = false;if ($resultat && count($resultat) > 0) {$autorise = ($resultat[0]['admin'] == 1);}}} else {// pas de token, on vérifie bien qu'il s'agit d'une session temporaire$autorise = ($id_utilisateur == session_id());}return $autorise;}// renvoie false ou bien le login utilisateur actuelprivate function getLoginUtilisateurVerifie() {$token = $this->getToken();$login = false;if($token) {// On demande à l'annuaire si le jeton est bien valide// curl avec les options suivantes ignore le pb de certificat (pour tester en local)// @TODO CHANGER !$ch = curl_init();$timeout = 5;curl_setopt($ch, CURLOPT_URL, $this->config['identification']['sso_url'].'/verifierjeton?token='.$token);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);// équivalent de "-k"curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);$valide = curl_exec($ch);curl_close($ch);//$valide = file_get_contents($this->config['identification']['sso_url'].'/verifierjeton?token='.$token);$login = ($valide === "true") ? $this->obtenirLoginParToken($token) : false;}return $login;}protected function verifierJeton($jeton) {$urlServiceVerification = $this->conteneur->getParametre("urlServiceBaseAuth") . "verifierjeton";$urlServiceVerification .= "?token=" . $jeton;// file_get_contents râle si le certificat HTTPS est auto-signé//$retour = file_get_contents($urlServiceVerification);// curl avec les options suivantes ignore le pb de certificat (pour tester en local)$ch = curl_init();$timeout = 5;curl_setopt($ch, CURLOPT_URL, $urlServiceVerification);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);// équivalent de "-k"curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);$data = curl_exec($ch);curl_close($ch);$retour = $data;$retour = json_decode($retour, true);return ($retour === true);}private function decoderToken($token) {$token_parts = explode('.', $token);return json_decode(base64_decode($token_parts[1]), true);}private function obtenirLoginParToken($token) {$token_decode = $this->decoderToken($token);return $token_decode['sub'];}private function getToken() {// Premier essai, dans le header$headers = apache_request_headers();$token = !empty($headers['Authorization']) ? $headers['Authorization'] : null;// Sinon dans $_REQUEST ?if($token == null) {$token = !empty($_REQUEST['Authorization']) ? $_REQUEST['Authorization'] : null;}return $token;}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 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);}}/*** Compatibilité avec nginx - merci http://php.net/manual/fr/function.getallheaders.php*/if (! function_exists('apache_request_headers')) {function apache_request_headers() {$headers = '';foreach ($_SERVER as $name => $value) {if (substr($name, 0, 5) == 'HTTP_') {$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;}}return $headers;}}?>