Subversion Repositories eFlore/Applications.del

Rev

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