Subversion Repositories eFlore/Applications.del

Rev

Rev 1478 | Rev 1666 | 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;
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() {
30
		$ipAutorisees = $this->conteneur->getParametre('ip_autorisees');
31
		$ipAutorisees = explode(',', $ipAutorisees);
32
 
33
		if (!in_array($_SERVER['REMOTE_ADDR'], $ipAutorisees) && $_SERVER['REMOTE_ADDR'] != $_SERVER['SERVER_ADDR']) {
34
			$message = "Accès interdit. \n"."Vous n'êtes pas autorisé à accéder à ce service depuis '{$_SERVER['REMOTE_ADDR']}' !\n";
35
			$code = RestServeur::HTTP_CODE_ACCES_NON_AUTORISE;
36
			throw new Exception($message, $code);
37
		}
38
		return true;
39
	}
40
 
1055 aurelien 41
	public function demanderAuthentificationAdmin() {
1606 jpm 42
		if (!$this->etreAdminAutoriseParHttp()) {
1055 aurelien 43
			$this->authentifierAdmin();
44
		}
45
	}
1606 jpm 46
 
1055 aurelien 47
	public function demanderAuthentificationUtilisateur() {
1606 jpm 48
		if (!$this->etreUtilisateurAutoriseParHttp()) {
1055 aurelien 49
			$this->authentifierUtilisateur();
50
		}
51
	}
1606 jpm 52
 
53
	private function etreUtilisateurAutoriseParHttp() {
1055 aurelien 54
		$identifiant = $this->getAuthIdentifiant();
55
		$mdp = $this->getAuthMotDePasse();
56
		$existe = $this->obtenirUtilisateur($identifiant, $mdp);
1606 jpm 57
 
1055 aurelien 58
		$autorisation = (isset($existe) && $existe) ? true :false;
59
		return $autorisation;
60
	}
1606 jpm 61
 
1055 aurelien 62
	private function obtenirUtilisateur($login, $motDePasse) {
1606 jpm 63
		$login = $this->bdd->proteger($login);
64
		$motDePasse = $this->bdd->proteger($motDePasse);
65
		$requete = 'SELECT id_utilisateur, nom, prenom, courriel, mot_de_passe '.
66
			'FROM del_utilisateur AS du '.
67
			"WHERE courriel = $login ".
68
			"	AND mot_de_passe = MD5($motDePasse) ".
69
			' -- '.__FILE__.':'.__LINE__."\n";
70
		$utilisateur = $this->bdd->recuperer($requete);
1055 aurelien 71
		return $utilisateur;
72
	}
1606 jpm 73
 
74
	private function etreAdminAutoriseParHttp() {
1055 aurelien 75
		$identifiant = $this->getAuthIdentifiant();
1606 jpm 76
		$autorisation = ($this->etreAdmin($identifiant) && $this->etreUtilisateurAutorise()) ? true : false;
1055 aurelien 77
		return $autorisation;
78
	}
1606 jpm 79
 
80
	private function etreAdmin($courriel) {
81
		$courriel = $this->bdd->proteger($courriel);
82
		$requete = 'SELECT dui.admin '.
83
			'FROM del_utilisateur AS du LEFT JOIN del_user_infos AS dui ON (du.id_utilisateur = dui.id_utilisateur) '.
84
			"WHERE du.courriel = $courriel ".
85
			' -- '.__FILE__.':'.__LINE__."\n";
86
		$infoUtilisateur = $this->bdd->recuperer($requete);
87
 
88
		$etreAdmin = $this->verifierDroitAdmin($infoUtilisateur['admin']);
89
		return $etreAdmin;
1055 aurelien 90
	}
1606 jpm 91
 
92
	private function verifierDroitAdmin($droit) {
93
		$droitAdmin = $this->conteneur->getParametre('droit_superadmin');
94
		$etreAdmin = false;
95
		if (isset($droit) && $droit == $droitAdmin) {
96
			$etreAdmin = true;
97
		}
98
		return $etreAdmin;
99
	}
100
 
1055 aurelien 101
	private function getAuthIdentifiant() {
102
		$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null;
103
		return $id;
104
	}
1606 jpm 105
 
1055 aurelien 106
	private function getAuthMotDePasse() {
107
		$mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null;
108
		return $mdp;
109
	}
1606 jpm 110
 
1055 aurelien 111
	//TODO: externaliser noms et adresses spécifiques à Tela Botanica
112
	private function authentifierAdmin() {
113
		$message_accueil = "Veuillez vous identifier avec votre compte administrateur Tela Botanica.";
114
		$message_echec = "Accès limité aux administrateurs de DEL.\n".
1606 jpm 115
			"Votre tentative d'identification a échoué.\n".
116
			"Actualiser la page pour essayer à nouveau si vous êtes bien inscrit comme administrateur.";
1055 aurelien 117
		return $this->authentifier($message_accueil, $message_echec, 'Admin');
118
	}
1606 jpm 119
 
1055 aurelien 120
	private function authentifierUtilisateur() {
121
		$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica.";
122
		$message_echec = "Accès limité aux utilisateurs de DEL.\n".
1606 jpm 123
			"Inscrivez vous http://www.tela-botanica.org/page:inscription pour le devenir.\n".
124
			"Votre tentative d'identification a échoué.\n".
125
			"Actualiser la page pour essayer à nouveau si vous êtes déjà inscrit ou contacter 'accueil@tela-botanica.org'.";
1055 aurelien 126
		return $this->authentifier($message_accueil, $message_echec, 'Utilisateur');
127
	}
1606 jpm 128
 
1055 aurelien 129
	private function authentifier($message_accueil, $message_echec, $type) {
130
		$id = $this->getAuthIdentifiant();
131
		if (!isset($id)) {
132
			$this->envoyerAuth($message_accueil, $message_echec);
133
		} else {
134
			if ($type == 'Utilisateur' && $this->getAuthMotDePasse() == 'debug') {
135
				$autorisation = true;
136
			} else {
137
				$methodeAutorisation = "etre{$type}Autorise";
138
				$autorisation = $this->$methodeAutorisation();
139
			}
140
			if ($autorisation == false) {
141
				$this->envoyerAuth($message_accueil, $message_echec);
142
			}
143
		}
144
		return true;
145
	}
1606 jpm 146
 
147
	public function etreUtilisateurAvecDroitAdmin() {
148
		$infos = $this->getInfosUtilisateurConnecte();
149
 
150
		$etreAdmin = false;
151
		if (isset($infos['admin'])) {
152
			$etreAdmin = $this->verifierDroitAdmin($infos['admin']);
153
		}
154
		return $etreAdmin;
155
	}
156
 
1249 aurelien 157
	public function getInfosUtilisateurConnecte() {
1606 jpm 158
		$utilisateur = array();
159
		if (isset($_COOKIE['del_courriel'])) {
160
			$courriel = $_COOKIE['del_courriel'];
161
			$motDePasse = $_COOKIE['del_mot_de_passe'];
162
			$utilisateur = $this->obtenirUtilisateurSansEncryptionMdp($courriel, $motDePasse);
163
 
164
			if ($utilisateur == false) {
165
				$message = "Vos login et/ou mot de passe ne sont pas corrects !\n";
166
				$code = RestServeur::HTTP_CODE_ACCES_NON_AUTORISE;
167
				throw new Exception($message, $code);
168
			}
169
		} else {
170
			$message = "Vous n'êtes pas identifié à DEL et/ou le cookie de DEL n'est pas accessible !\n";
171
			$code = RestServeur::HTTP_CODE_ACCES_NON_AUTORISE;
172
			throw new Exception($message, $code);
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);
180
		$requete = 'SELECT du.*, dui.* '.
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
}