Subversion Repositories eFlore/Applications.del

Rev

Rev 1696 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
/**
* Classe de controle d'accès aux services
*
* Cette classe propose des méthodes permettant :
*  - l'authentification http pour bloquer ou autoriser l'accès
*  - de déterminer les droits des utilisateurs
*
* @category DEL
* @package Commun
* @author Aurélien Peronnet <aurelien@tela-botanica.org>
* @author Jean-Pascal Milcent <jpm@tela-botanica.org>
* @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() {
                $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();
                }
        }
}