Rev 3604 | 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 {/** contient le jeton SSO décodé, si une authentification a eu lieu avec succès */protected $token_decode;public function obtenirIdentiteConnectee() {$login_utilisateur = $this->getIdUtilisateurVerifie();if ($login_utilisateur) {$utilisateur['connecte'] = true;$utilisateur['id_utilisateur'] = $login_utilisateur;} else {$utilisateur = $this->getUtilisateurAnonyme();}return $utilisateur;}/*** Retourne l'utilisateur demandé, seulement s'il s'il est connecté au SSO* (le nom de la méthode est trompeur @TODO renommer); retourne false si* aucun jeton SSO n'est disponible*/public function obtenirUtilisateurSiExiste($login_utilisateur) {$utilisateur = $this->getUtilisateurAnonyme();if ($utilisateur_existe = $this->chargerInfosUtilisateur($login_utilisateur)) {$utilisateur = $utilisateur_existe;$utilisateur['connecte'] = true;}return $utilisateur;}/*** Répercute le nom et le prénom contenus dans le jeton SSO (si au* moins un des deux n'est pas vide) dans toutes les observations* et images de l'auteur; si le jeton SSO est vide, ne fait rien* (boulette-proof)** @TODO gérer l'intitulé un jour*/protected function mettreAJourCoordonneesDansObsEtImages() {//echo "Mise à jour obs et images !!";if ($this->token_decode != null && $this->token_decode['id'] != '' && ($this->token_decode['nom'] != '' || $this->token_decode['prenom'] != '')) {$requete = 'UPDATE cel_obs SET'. ' nom_utilisateur = ' . Cel::db()->proteger($this->token_decode['nom']) . ', '. ' prenom_utilisateur = ' . Cel::db()->proteger($this->token_decode['prenom']). ' WHERE ce_utilisateur = ' . Cel::db()->proteger($this->token_decode['id']) // s'assurer qu'il y a des ' autour de l'ID sans quoi les hash MD5 matcheront !. ' -- '.__FILE__.':'.__LINE__;//var_dump($requete);Cel::db()->executer($requete);$requete = 'UPDATE cel_images SET'. ' nom_utilisateur = ' . Cel::db()->proteger($this->token_decode['nom']) . ', '. ' prenom_utilisateur = ' . Cel::db()->proteger($this->token_decode['prenom']). ' WHERE ce_utilisateur = ' . Cel::db()->proteger($this->token_decode['id']) // s'assurer qu'il y a des ' autour de l'ID sans quoi les hash MD5 matcheront !. ' -- '.__FILE__.':'.__LINE__;//var_dump($requete);Cel::db()->executer($requete);}}// @TODO a l'air inutilisée (2017-01-02) - vérifierprivate 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_infos 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;$url = $this->config['identification']['sso_url'].'/verifierjeton?token='.$token;curl_setopt($ch, CURLOPT_URL, $url);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;}// renvoie false ou bien le login utilisateur actuelprivate function getIdUtilisateurVerifie() {$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;$url = $this->config['identification']['sso_url'].'/verifierjeton?token='.$token;curl_setopt($ch, CURLOPT_URL, $url);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->obtenirIdParToken($token) : false;}return $login;}// @WTF doublon avec la méthode du dessus ? Qu'est-ce que c'est que ce bins ?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($this->urlsafeB64Decode($token_parts[1]), true);}/*** Decode a string with URL-safe Base64.* copié depuis firebase/jwt** @param string $input A Base64 encoded string* @return string A decoded string*/protected function urlsafeB64Decode($input) {$remainder = strlen($input) % 4;if ($remainder) {$padlen = 4 - $remainder;$input .= str_repeat('=', $padlen);}return base64_decode(strtr($input, '-_', '+/'));}//retourne l'adresse mailprivate function obtenirLoginParToken($token) {$this->token_decode = $this->decoderToken($token);return $this->token_decode['sub'];}// retourne l'idprivate function obtenirIdParToken($token) {$this->token_decode = $this->decoderToken($token);return $this->token_decode['id'];}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;}$token = str_replace('Bearer ', '', $token);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);}}/*** 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;}}?>