Subversion Repositories eFlore/Applications.del

Rev

Rev 1696 | Rev 1794 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1055 aurelien 1
<?php
2
/**
1606 jpm 3
* Classe de controle d'accès aux services
1055 aurelien 4
*
1606 jpm 5
* Cette classe propose des méthodes permettant :
6
*  - l'authentification http pour bloquer ou autoriser l'accès
7
*  - de déterminer les droits des utilisateurs
8
*
9
* @category DEL
10
* @package Commun
1055 aurelien 11
* @author Aurélien Peronnet <aurelien@tela-botanica.org>
1606 jpm 12
* @author Jean-Pascal Milcent <jpm@tela-botanica.org>
1055 aurelien 13
* @license	http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
14
* @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
1606 jpm 15
* @copyright Copyright (c) 1999-2014, Tela Botanica (accueil@tela-botanica.org)
1055 aurelien 16
*/
17
class ControleAcces {
1606 jpm 18
 
1055 aurelien 19
	private $conteneur;
1249 aurelien 20
	private $bdd;
1606 jpm 21
 
1055 aurelien 22
	public function __construct($conteneur) {
23
		$this->conteneur = $conteneur;
1793 jpm 24
		$this->bdd = $this->conteneur->getBdd();
1055 aurelien 25
	}
1606 jpm 26
 
27
	public function controlerIpAutorisees() {
1696 jpm 28
		$ipsAutorisees = $this->conteneur->getParametreTableau('ip_autorisees');
1606 jpm 29
 
1694 jpm 30
		$remoteIp = filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP);
31
		$serverIp = filter_input(INPUT_SERVER, 'SERVER_ADDR', FILTER_VALIDATE_IP);
32
		if (in_array($remoteIp, $ipsAutorisees) == false) {
33
			if ($remoteIp != $serverIp) {// ATTENTION : maintenir ce test à l'intérieur du précédent
34
				$message = "Accès interdit. \n".
35
					"Vous n'êtes pas autorisé à accéder à ce service depuis '$remoteIp' !\n";
36
				$code = RestServeur::HTTP_CODE_ACCES_NON_AUTORISE;
37
				throw new Exception($message, $code);
38
			}
1606 jpm 39
		}
40
		return true;
41
	}
42
 
1055 aurelien 43
	public function demanderAuthentificationAdmin() {
1606 jpm 44
		if (!$this->etreAdminAutoriseParHttp()) {
1055 aurelien 45
			$this->authentifierAdmin();
46
		}
47
	}
1606 jpm 48
 
1055 aurelien 49
	public function demanderAuthentificationUtilisateur() {
1606 jpm 50
		if (!$this->etreUtilisateurAutoriseParHttp()) {
1055 aurelien 51
			$this->authentifierUtilisateur();
52
		}
53
	}
1606 jpm 54
 
55
	private function etreUtilisateurAutoriseParHttp() {
1055 aurelien 56
		$identifiant = $this->getAuthIdentifiant();
57
		$mdp = $this->getAuthMotDePasse();
58
		$existe = $this->obtenirUtilisateur($identifiant, $mdp);
1606 jpm 59
 
1055 aurelien 60
		$autorisation = (isset($existe) && $existe) ? true :false;
61
		return $autorisation;
62
	}
1606 jpm 63
 
1055 aurelien 64
	private function obtenirUtilisateur($login, $motDePasse) {
1606 jpm 65
		$login = $this->bdd->proteger($login);
66
		$motDePasse = $this->bdd->proteger($motDePasse);
67
		$requete = 'SELECT id_utilisateur, nom, prenom, courriel, mot_de_passe '.
68
			'FROM del_utilisateur AS du '.
69
			"WHERE courriel = $login ".
70
			"	AND mot_de_passe = MD5($motDePasse) ".
71
			' -- '.__FILE__.':'.__LINE__."\n";
72
		$utilisateur = $this->bdd->recuperer($requete);
1055 aurelien 73
		return $utilisateur;
74
	}
1606 jpm 75
 
76
	private function etreAdminAutoriseParHttp() {
1055 aurelien 77
		$identifiant = $this->getAuthIdentifiant();
1606 jpm 78
		$autorisation = ($this->etreAdmin($identifiant) && $this->etreUtilisateurAutorise()) ? true : false;
1055 aurelien 79
		return $autorisation;
80
	}
1606 jpm 81
 
82
	private function etreAdmin($courriel) {
83
		$courriel = $this->bdd->proteger($courriel);
84
		$requete = 'SELECT dui.admin '.
85
			'FROM del_utilisateur AS du LEFT JOIN del_user_infos AS dui ON (du.id_utilisateur = dui.id_utilisateur) '.
86
			"WHERE du.courriel = $courriel ".
87
			' -- '.__FILE__.':'.__LINE__."\n";
88
		$infoUtilisateur = $this->bdd->recuperer($requete);
89
 
90
		$etreAdmin = $this->verifierDroitAdmin($infoUtilisateur['admin']);
91
		return $etreAdmin;
1055 aurelien 92
	}
1606 jpm 93
 
94
	private function verifierDroitAdmin($droit) {
95
		$droitAdmin = $this->conteneur->getParametre('droit_superadmin');
96
		$etreAdmin = false;
97
		if (isset($droit) && $droit == $droitAdmin) {
98
			$etreAdmin = true;
99
		}
100
		return $etreAdmin;
101
	}
102
 
1055 aurelien 103
	private function getAuthIdentifiant() {
104
		$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null;
105
		return $id;
106
	}
1606 jpm 107
 
1055 aurelien 108
	private function getAuthMotDePasse() {
109
		$mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null;
110
		return $mdp;
111
	}
1606 jpm 112
 
1055 aurelien 113
	//TODO: externaliser noms et adresses spécifiques à Tela Botanica
114
	private function authentifierAdmin() {
115
		$message_accueil = "Veuillez vous identifier avec votre compte administrateur Tela Botanica.";
116
		$message_echec = "Accès limité aux administrateurs de DEL.\n".
1606 jpm 117
			"Votre tentative d'identification a échoué.\n".
118
			"Actualiser la page pour essayer à nouveau si vous êtes bien inscrit comme administrateur.";
1055 aurelien 119
		return $this->authentifier($message_accueil, $message_echec, 'Admin');
120
	}
1606 jpm 121
 
1055 aurelien 122
	private function authentifierUtilisateur() {
123
		$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica.";
124
		$message_echec = "Accès limité aux utilisateurs de DEL.\n".
1606 jpm 125
			"Inscrivez vous http://www.tela-botanica.org/page:inscription pour le devenir.\n".
126
			"Votre tentative d'identification a échoué.\n".
127
			"Actualiser la page pour essayer à nouveau si vous êtes déjà inscrit ou contacter 'accueil@tela-botanica.org'.";
1055 aurelien 128
		return $this->authentifier($message_accueil, $message_echec, 'Utilisateur');
129
	}
1606 jpm 130
 
1055 aurelien 131
	private function authentifier($message_accueil, $message_echec, $type) {
132
		$id = $this->getAuthIdentifiant();
133
		if (!isset($id)) {
134
			$this->envoyerAuth($message_accueil, $message_echec);
135
		} else {
136
			if ($type == 'Utilisateur' && $this->getAuthMotDePasse() == 'debug') {
137
				$autorisation = true;
138
			} else {
139
				$methodeAutorisation = "etre{$type}Autorise";
140
				$autorisation = $this->$methodeAutorisation();
141
			}
142
			if ($autorisation == false) {
143
				$this->envoyerAuth($message_accueil, $message_echec);
144
			}
145
		}
146
		return true;
147
	}
1606 jpm 148
 
149
	public function etreUtilisateurAvecDroitAdmin() {
150
		$infos = $this->getInfosUtilisateurConnecte();
151
 
152
		$etreAdmin = false;
153
		if (isset($infos['admin'])) {
154
			$etreAdmin = $this->verifierDroitAdmin($infos['admin']);
155
		}
1690 jpm 156
 
157
		if ($etreAdmin == false) {
158
			$message = "Vous ne pouvez pas accéder à ce service car vous n'avez pas les droits d'administrateur !\n";
159
			$code = RestServeur::HTTP_CODE_ACCES_NON_AUTORISE;
160
			throw new Exception($message, $code);
161
		}
1606 jpm 162
		return $etreAdmin;
163
	}
164
 
1249 aurelien 165
	public function getInfosUtilisateurConnecte() {
1606 jpm 166
		$utilisateur = array();
167
		if (isset($_COOKIE['del_courriel'])) {
168
			$courriel = $_COOKIE['del_courriel'];
169
			$motDePasse = $_COOKIE['del_mot_de_passe'];
170
			$utilisateur = $this->obtenirUtilisateurSansEncryptionMdp($courriel, $motDePasse);
1249 aurelien 171
		}
172
		return $utilisateur;
1055 aurelien 173
	}
1606 jpm 174
 
175
	private function obtenirUtilisateurSansEncryptionMdp($login, $motDePasseEncrypte) {
176
		$login = $this->bdd->proteger($login);
177
		$motDePasseEncrypte = $this->bdd->proteger($motDePasseEncrypte);
1690 jpm 178
		$requete = 'SELECT du.*, admin, preferences, date_premiere_utilisation '.
1606 jpm 179
			'FROM del_utilisateur AS du '.
180
			'	LEFT JOIN del_utilisateur_infos AS dui ON (du.id_utilisateur = dui.id_utilisateur) '.
181
			"WHERE du.courriel = $login ".
182
			"	AND du.mot_de_passe = $motDePasseEncrypte ".
183
			' -- '.__FILE__.':'.__LINE__."\n";
184
		$utilisateur = $this->bdd->recuperer($requete);
185
		return $utilisateur;
186
	}
187
 
1472 aurelien 188
	public function getIdAnonymeTemporaire() {
1475 aurelien 189
		$this->demarrerSession();
190
		return session_id();
191
	}
1606 jpm 192
 
1475 aurelien 193
	private function demarrerSession() {
1606 jpm 194
		if (session_id() == '') {
195
			// TODO : modifier ce test lors du passage en php 5.4
1475 aurelien 196
			session_start();
1472 aurelien 197
		}
198
	}
1055 aurelien 199
}