* @author Jean-Pascal Milcent * @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL * @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL * @copyright Copyright (c) 1999-2014, Tela Botanica (accueil@tela-botanica.org) */ class ControleAcces { private $conteneur; private $gestionBdd; private $bdd; public function __construct($conteneur) { $this->conteneur = $conteneur; $this->gestionBdd = $conteneur->getGestionBdd(); $this->bdd = $this->gestionBdd->getBdd(); } public function controlerIpAutorisees() { $ipAutorisees = $this->conteneur->getParametre('ip_autorisees'); $ipAutorisees = explode(',', $ipAutorisees); if (!in_array($_SERVER['REMOTE_ADDR'], $ipAutorisees) && $_SERVER['REMOTE_ADDR'] != $_SERVER['SERVER_ADDR']) { $message = "Accès interdit. \n"."Vous n'êtes pas autorisé à accéder à ce service depuis '{$_SERVER['REMOTE_ADDR']}' !\n"; $code = RestServeur::HTTP_CODE_ACCES_NON_AUTORISE; throw new Exception($message, $code); } return true; } public function demanderAuthentificationAdmin() { if (!$this->etreAdminAutoriseParHttp()) { $this->authentifierAdmin(); } } public function demanderAuthentificationUtilisateur() { if (!$this->etreUtilisateurAutoriseParHttp()) { $this->authentifierUtilisateur(); } } private function etreUtilisateurAutoriseParHttp() { $identifiant = $this->getAuthIdentifiant(); $mdp = $this->getAuthMotDePasse(); $existe = $this->obtenirUtilisateur($identifiant, $mdp); $autorisation = (isset($existe) && $existe) ? true :false; return $autorisation; } private function obtenirUtilisateur($login, $motDePasse) { $login = $this->bdd->proteger($login); $motDePasse = $this->bdd->proteger($motDePasse); $requete = 'SELECT id_utilisateur, nom, prenom, courriel, mot_de_passe '. 'FROM del_utilisateur AS du '. "WHERE courriel = $login ". " AND mot_de_passe = MD5($motDePasse) ". ' -- '.__FILE__.':'.__LINE__."\n"; $utilisateur = $this->bdd->recuperer($requete); return $utilisateur; } private function etreAdminAutoriseParHttp() { $identifiant = $this->getAuthIdentifiant(); $autorisation = ($this->etreAdmin($identifiant) && $this->etreUtilisateurAutorise()) ? true : false; return $autorisation; } private function etreAdmin($courriel) { $courriel = $this->bdd->proteger($courriel); $requete = 'SELECT dui.admin '. 'FROM del_utilisateur AS du LEFT JOIN del_user_infos AS dui ON (du.id_utilisateur = dui.id_utilisateur) '. "WHERE du.courriel = $courriel ". ' -- '.__FILE__.':'.__LINE__."\n"; $infoUtilisateur = $this->bdd->recuperer($requete); $etreAdmin = $this->verifierDroitAdmin($infoUtilisateur['admin']); return $etreAdmin; } private function verifierDroitAdmin($droit) { $droitAdmin = $this->conteneur->getParametre('droit_superadmin'); $etreAdmin = false; if (isset($droit) && $droit == $droitAdmin) { $etreAdmin = true; } return $etreAdmin; } private function getAuthIdentifiant() { $id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null; return $id; } private function getAuthMotDePasse() { $mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null; return $mdp; } //TODO: externaliser noms et adresses spécifiques à Tela Botanica private function authentifierAdmin() { $message_accueil = "Veuillez vous identifier avec votre compte administrateur Tela Botanica."; $message_echec = "Accès limité aux administrateurs de DEL.\n". "Votre tentative d'identification a échoué.\n". "Actualiser la page pour essayer à nouveau si vous êtes bien inscrit comme administrateur."; return $this->authentifier($message_accueil, $message_echec, 'Admin'); } private function authentifierUtilisateur() { $message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica."; $message_echec = "Accès limité aux utilisateurs de DEL.\n". "Inscrivez vous http://www.tela-botanica.org/page:inscription pour le devenir.\n". "Votre tentative d'identification a échoué.\n". "Actualiser la page pour essayer à nouveau si vous êtes déjà inscrit ou contacter 'accueil@tela-botanica.org'."; return $this->authentifier($message_accueil, $message_echec, 'Utilisateur'); } private function authentifier($message_accueil, $message_echec, $type) { $id = $this->getAuthIdentifiant(); if (!isset($id)) { $this->envoyerAuth($message_accueil, $message_echec); } else { if ($type == 'Utilisateur' && $this->getAuthMotDePasse() == 'debug') { $autorisation = true; } else { $methodeAutorisation = "etre{$type}Autorise"; $autorisation = $this->$methodeAutorisation(); } if ($autorisation == false) { $this->envoyerAuth($message_accueil, $message_echec); } } return true; } public function etreUtilisateurAvecDroitAdmin() { $infos = $this->getInfosUtilisateurConnecte(); $etreAdmin = false; if (isset($infos['admin'])) { $etreAdmin = $this->verifierDroitAdmin($infos['admin']); } return $etreAdmin; } public function getInfosUtilisateurConnecte() { $utilisateur = array(); if (isset($_COOKIE['del_courriel'])) { $courriel = $_COOKIE['del_courriel']; $motDePasse = $_COOKIE['del_mot_de_passe']; $utilisateur = $this->obtenirUtilisateurSansEncryptionMdp($courriel, $motDePasse); } return $utilisateur; } private function obtenirUtilisateurSansEncryptionMdp($login, $motDePasseEncrypte) { $login = $this->bdd->proteger($login); $motDePasseEncrypte = $this->bdd->proteger($motDePasseEncrypte); $requete = 'SELECT du.*, dui.* '. 'FROM del_utilisateur AS du '. ' LEFT JOIN del_utilisateur_infos AS dui ON (du.id_utilisateur = dui.id_utilisateur) '. "WHERE du.courriel = $login ". " AND du.mot_de_passe = $motDePasseEncrypte ". ' -- '.__FILE__.':'.__LINE__."\n"; $utilisateur = $this->bdd->recuperer($requete); return $utilisateur; } public function getIdAnonymeTemporaire() { $this->demarrerSession(); return session_id(); } private function demarrerSession() { if (session_id() == '') { // TODO : modifier ce test lors du passage en php 5.4 session_start(); } } }