* @author Jean-Pascal MILCENT * @author Aurelien PERONNET * @license GPL v3 * @license CECILL v2 * @copyright 1999-2014 Tela Botanica */ class ControleAcces { private $conteneur; private $bdd; public function __construct($conteneur) { $this->conteneur = $conteneur; $this->bdd = $this->conteneur->getBdd(); } public function controlerIpAutorisees() { $ipsAutorisees = $this->conteneur->getParametreTableau('ip_autorisees'); $remoteIp = filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP); $serverIp = filter_input(INPUT_SERVER, 'SERVER_ADDR', FILTER_VALIDATE_IP); if (in_array($remoteIp, $ipsAutorisees) == false) { if ($remoteIp != $serverIp) {// ATTENTION : maintenir ce test à l'intérieur du précédent $message = "Accès interdit. \n". "Vous n'êtes pas autorisé à accéder à ce service depuis '$remoteIp' !\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']); } if ($etreAdmin == false) { $message = "Vous ne pouvez pas accéder à ce service car vous n'avez pas les droits d'administrateur !\n"; $code = RestServeur::HTTP_CODE_ACCES_NON_AUTORISE; throw new Exception($message, $code); } 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.*, admin, preferences, date_premiere_utilisation '. '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(); } } }