Subversion Repositories eFlore/Applications.del

Rev

Rev 1249 | Rev 1475 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
/**
* Classe de controle d'accès utilisant l'authentification http pour bloquer ou autoriser l'accès.
* Elle offre des méthodes permettant de réserver l'accès à une section aux admins ou bien aux utilisateurs identifiés
*
* @category php 5.2
* @package del
* @author Aurélien Peronnet <aurelien@tela-botanica.org>
* @copyright Copyright (c) 2012, Tela Botanica (accueil@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
* @version      $Id$
*/
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 demanderAuthentificationAdmin() {
                if(!$this->etreAdminAutorise()) {
                        $this->authentifierAdmin();
                }
        }
        
        public function demanderAuthentificationUtilisateur() {
                if(!$this->etreUtilisateurAutorise()) {
                        $this->authentifierUtilisateur();
                }
        }
        
        public function etreUtilisateurAutorise() {
                $identifiant = $this->getAuthIdentifiant();
                $mdp = $this->getAuthMotDePasse();
                $existe = $this->obtenirUtilisateur($identifiant, $mdp);
        
                $autorisation = (isset($existe) && $existe) ? true :false;
                return $autorisation;
        }
        
        private function obtenirUtilisateur($login, $motDePasse) {
                $requete = 'SELECT id_utilisateur, nom, prenom, courriel, mot_de_passe FROM '.$this->gestionBdd->formaterTable('del_utilisateur', 'du').
                                                'WHERE courriel = '.$this->gestionBdd->getBdd()->proteger($login).' '.
                                                'AND mot_de_passe = MD5('.$this->gestionBdd->getBdd()->proteger($motDePasse).')';
                $utilisateur = $this->gestionBdd->getBdd()->recuperer($requete . ' -- ' . __FILE__ . ':' . __LINE__);
                return $utilisateur;
        }
        
        private function obtenirUtilisateurSansEncryptionMdp($login, $motDePasseEncrypte) {
                $requete = 'SELECT id_utilisateur, nom, prenom, courriel, mot_de_passe FROM '.$this->gestionBdd->formaterTable('del_utilisateur', 'du').
                                                        'WHERE courriel = '.$this->gestionBdd->getBdd()->proteger($login).' '.
                                                        'AND mot_de_passe = '.$this->gestionBdd->getBdd()->proteger($motDePasseEncrypte).' ';
                $utilisateur = $this->gestionBdd->getBdd()->recuperer($requete . ' -- ' . __FILE__ . ':' . __LINE__);
                return $utilisateur;
        }
        
        public function etreAdminAutorise() {
                $identifiant = $this->getAuthIdentifiant();
                $autorisation = ($this->etreAdminDel($identifiant) && $this->etreUtilisateurAutorise()) ? true : false;
                return $autorisation;
        }
        
        public function etreAdminDel($courriel) {
                $admins = Config::get('admins');
                $courriels_autorises = explode(',', $admins);
                $autorisation = (in_array($courriel, $courriels_autorises)) ? true : false ;
                return $autorisation;
        }
        
        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 getInfosUtilisateurConnecte() {
                $utilisateur = false;
                if (isset($_SESSION["del_utilisateur"])) {
                        $utilisateur = $_SESSION["del_utilisateur"];
                } else if(isset($_COOKIE["del_courriel"])) {
                        $utilisateur = array('del_courriel' => $_COOKIE["del_courriel"],
                                                                'del_password' => $_COOKIE["del_password"]);
                }

                if($utilisateur !== false) {
                        $utilisateur = $this->obtenirUtilisateurSansEncryptionMdp($utilisateur['del_courriel'], $utilisateur['del_password']);
                }
                
                return $utilisateur;
        }
}