Subversion Repositories eFlore/Applications.del

Rev

Rev 1815 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1815 Rev 2077
Line 1... Line 1...
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Classe de controle d'accès aux services de DEL.
4
 * Classe de controle d'accès HTTP AUTH aux services de DEL, à n'utiliser
-
 
5
 * que dans ce cas (HTTP AUTH), et pas dans le cas de l'identification générale sur le SSO
5
 *
6
 *
6
 * Cette classe propose des méthodes permettant :
7
 * Cette classe propose des méthodes permettant :
7
 *  - l'authentification http pour bloquer ou autoriser l'accès
8
 *  - l'authentification HTTP pour bloquer ou autoriser l'accès
8
 *  - de déterminer les droits des utilisateurs
9
 *  - de déterminer le statut d'admin des utilisateurs
9
 *
10
 *
10
 * @category  DEL
11
 * @category  DEL
11
 * @package   Services
12
 * @package   Services
12
 * @package   Bibliotheque
13
 * @package   Bibliotheque
13
 * @version   0.1
14
 * @version   0.1
Line 18... Line 19...
18
 * @license   CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
19
 * @license   CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
19
 * @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
20
 * @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
20
 */
21
 */
21
class ControleAcces {
22
class ControleAcces {
Line 22... Line 23...
22
 
23
 
23
	private $conteneur;
24
	protected $conteneur;
Line 24... Line 25...
24
	private $bdd;
25
	protected $bdd;
25
 
26
 
26
	public function __construct($conteneur) {
27
	public function __construct($conteneur) {
27
		$this->conteneur = $conteneur;
28
		$this->conteneur = $conteneur;
Line -... Line 29...
-
 
29
		$this->bdd = $this->conteneur->getBdd();
-
 
30
	}
-
 
31
 
-
 
32
	/**
-
 
33
	 * Vérifie que l'IP du client est dans la liste "ip_autorisees" de la config
28
		$this->bdd = $this->conteneur->getBdd();
34
	 * @throws Exception
29
	}
35
	 * @return boolean
Line 30... Line 36...
30
 
36
	 */
31
	public function controlerIpAutorisees() {
37
	public function controlerIpAutorisees() {
Line 42... Line 48...
42
			}
48
			}
43
		}
49
		}
44
		return true;
50
		return true;
45
	}
51
	}
Line -... Line 52...
-
 
52
 
-
 
53
	/**
-
 
54
	 * Exige qu'un administrateur s'autenthentifie à l'aide de HTTP AUTH
46
 
55
	 */
47
	public function demanderAuthentificationAdmin() {
56
	public function demanderAuthentificationAdmin() {
48
		if (!$this->etreAdminAutoriseParHttp()) {
57
		if (!$this->etreAdminAutoriseParHttp()) {
49
			$this->authentifierAdmin();
58
			$this->authentifierAdmin();
50
		}
59
		}
Line -... Line 60...
-
 
60
	}
-
 
61
 
-
 
62
	/**
51
	}
63
	 * Exige qu'un utilisateur s'autenthentifie à l'aide de HTTP AUTH
52
 
64
	 */
53
	public function demanderAuthentificationUtilisateur() {
65
	public function demanderAuthentificationUtilisateur() {
54
		if (!$this->etreUtilisateurAutoriseParHttp()) {
66
		if (!$this->etreUtilisateurAutoriseParHttp()) {
55
			$this->authentifierUtilisateur();
67
			$this->authentifierUtilisateur();
Line -... Line 68...
-
 
68
		}
-
 
69
	}
-
 
70
 
-
 
71
	/**
-
 
72
	 * Lit les entêtes HTTP AUTH et vérifie si l'utilisateur
-
 
73
	 * existe (courriel / mot de passe); si $doitEtreAdmin est true,
-
 
74
	 * vérifiera également que l'utilisateur est administrateur de Del
56
		}
75
	 * 
57
	}
76
	 * @return boolean true si l'utilisateur est identifié, false sinon
58
 
77
	 */
59
	private function etreUtilisateurAutoriseParHttp() {
78
	protected function etreUtilisateurAutoriseParHttp($doitEtreAdmin=false) {
Line 60... Line 79...
60
		$identifiant = $this->getAuthIdentifiant();
79
		$identifiant = $this->getAuthIdentifiant();
61
		$mdp = $this->getAuthMotDePasse();
-
 
62
		$existe = $this->obtenirUtilisateur($identifiant, $mdp);
-
 
63
 
-
 
64
		$autorisation = (isset($existe) && $existe) ? true :false;
-
 
65
		return $autorisation;
-
 
66
	}
-
 
67
 
-
 
68
	private function obtenirUtilisateur($login, $motDePasse) {
-
 
69
		$login = $this->bdd->proteger($login);
-
 
70
		$motDePasse = $this->bdd->proteger($motDePasse);
-
 
71
		$requete = 'SELECT id_utilisateur, nom, prenom, courriel, mot_de_passe '.
-
 
72
			'FROM del_utilisateur AS du '.
-
 
73
			"WHERE courriel = $login ".
-
 
74
			"	AND mot_de_passe = MD5($motDePasse) ".
-
 
Line 75... Line 80...
75
			' -- '.__FILE__.':'.__LINE__."\n";
80
		$mdp = $this->getAuthMotDePasse();
76
		$utilisateur = $this->bdd->recuperer($requete);
81
		$existe = $this->obtenirUtilisateur($identifiant, $mdp);
77
		return $utilisateur;
-
 
-
 
82
 
78
	}
83
		$autorisation = (isset($existe) && $existe) ? true :false; // c'est quoi ces tests de clodos ??
79
 
84
 
Line 80... Line -...
80
	private function etreAdminAutoriseParHttp() {
-
 
81
		$identifiant = $this->getAuthIdentifiant();
-
 
82
		$autorisation = ($this->etreAdmin($identifiant) && $this->etreUtilisateurAutorise()) ? true : false;
85
		if ($doitEtreAdmin === true) {
83
		return $autorisation;
86
			$autorisation = ($autorisation && $this->etreAdmin($identifiant));
84
	}
87
		}
85
 
-
 
86
	private function etreAdmin($courriel) {
-
 
87
		$courriel = $this->bdd->proteger($courriel);
88
		return $autorisation;
88
		$requete = 'SELECT dui.admin '.
89
	}
89
			'FROM del_utilisateur AS du LEFT JOIN del_user_infos AS dui ON (du.id_utilisateur = dui.id_utilisateur) '.
-
 
90
			"WHERE du.courriel = $courriel ".
90
 
91
			' -- '.__FILE__.':'.__LINE__."\n";
-
 
92
		$infoUtilisateur = $this->bdd->recuperer($requete);
91
	/**
93
 
92
	 * Lit les entêtes HTTP AUTH et vérifie que l'utilisateur est identifié
94
		$etreAdmin = $this->verifierDroitAdmin($infoUtilisateur['admin']);
-
 
95
		return $etreAdmin;
-
 
96
	}
-
 
97
 
-
 
98
	private function verifierDroitAdmin($droit) {
-
 
99
		$droitAdmin = $this->conteneur->getParametre('droit_superadmin');
93
	 * et est administrateur de Del
Line -... Line 94...
-
 
94
	 * 
-
 
95
	 * @return boolean true si l'utilisateur est identifié et admin de Del, false sinon
-
 
96
	 */
-
 
97
	protected function etreAdminAutoriseParHttp() {
100
		$etreAdmin = false;
98
		return $this->etreUtilisateurAutoriseParHttp(true);
101
		if (isset($droit) && $droit == $droitAdmin) {
99
	}
102
			$etreAdmin = true;
100
 
103
		}
101
	/**
Line -... Line 102...
-
 
102
	 * Lit l'identifiant utilisateur dans les entêtes HTTP AUTH
-
 
103
	 * @return String l'identifiant utilisateur ou null
-
 
104
	 */
-
 
105
	protected function getAuthIdentifiant() {
104
		return $etreAdmin;
106
		$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null;
105
	}
107
		return $id;
106
 
108
	}
107
	private function getAuthIdentifiant() {
109
 
Line -... Line 110...
-
 
110
	/**
-
 
111
	 * Lit le mot de passe dans les entêtes HTTP AUTH
-
 
112
	 * @return String le mot de passe ou null
108
		$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null;
113
	 */
-
 
114
	protected function getAuthMotDePasse() {
-
 
115
		$mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null;
109
		return $id;
116
		return $mdp;
110
	}
117
	}
111
 
118
 
112
	private function getAuthMotDePasse() {
119
	/**
113
		$mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null;
120
	 * Envoie un message HTTP 401 / une boîte de login HTTP AUTH avec des
114
		return $mdp;
121
	 * messages correspondant à la demande d'authentification d'un administrateur
115
	}
122
	 * TODO: externaliser noms et adresses spécifiques à Tela Botanica
Line -... Line 123...
-
 
123
	 * @return boolean
-
 
124
	 */
-
 
125
	protected function authentifierAdmin() {
-
 
126
		$message_accueil = "Veuillez vous identifier avec votre compte administrateur Tela Botanica.";
-
 
127
		$message_echec = "Accès limité aux administrateurs de DEL.\n".
-
 
128
			"Votre tentative d'identification a échoué.\n".
116
 
129
			"Actualiser la page pour essayer à nouveau si vous êtes bien inscrit comme administrateur.";
117
	//TODO: externaliser noms et adresses spécifiques à Tela Botanica
130
		return $this->authentifier($message_accueil, $message_echec, 'Admin');
118
	private function authentifierAdmin() {
131
	}
119
		$message_accueil = "Veuillez vous identifier avec votre compte administrateur Tela Botanica.";
132
 
120
		$message_echec = "Accès limité aux administrateurs de DEL.\n".
133
	/**
121
			"Votre tentative d'identification a échoué.\n".
134
	 * Envoie un message HTTP 401 / une boîte de login HTTP AUTH avec des
122
			"Actualiser la page pour essayer à nouveau si vous êtes bien inscrit comme administrateur.";
135
	 * messages correspondant à la demande d'authentification d'un utilisateur
123
		return $this->authentifier($message_accueil, $message_echec, 'Admin');
136
	 * TODO: externaliser noms et adresses spécifiques à Tela Botanica
Line -... Line 137...
-
 
137
	 * @return boolean
-
 
138
	 */
-
 
139
	protected function authentifierUtilisateur() {
-
 
140
		$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica.";
124
	}
141
		$message_echec = "Accès limité aux utilisateurs de DEL.\n".
125
 
142
			"Inscrivez vous http://www.tela-botanica.org/page:inscription pour le devenir.\n".
126
	private function authentifierUtilisateur() {
143
			"Votre tentative d'identification a échoué.\n".
127
		$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica.";
144
			"Actualiser la page pour essayer à nouveau si vous êtes déjà inscrit ou contacter 'accueil@tela-botanica.org'.";
128
		$message_echec = "Accès limité aux utilisateurs de DEL.\n".
145
		return $this->authentifier($message_accueil, $message_echec, 'Utilisateur');
129
			"Inscrivez vous http://www.tela-botanica.org/page:inscription pour le devenir.\n".
146
	}
Line 148... Line 165...
148
			}
165
			}
149
		}
166
		}
150
		return true;
167
		return true;
151
	}
168
	}
Line 152... Line -...
152
 
-
 
153
	public function etreUtilisateurAvecDroitAdmin() {
-
 
154
		$infos = $this->getInfosUtilisateurConnecte();
169
 
155
 
170
	/**
156
		$etreAdmin = false;
171
	 * Envoie un message HTTP 401 / une boîte de login HTTP AUTH
157
		if (isset($infos['admin'])) {
172
	 * @param string $message_accueil
158
			$etreAdmin = $this->verifierDroitAdmin($infos['admin']);
173
	 * @param string $message_echec
159
		}
-
 
-
 
174
	 */
160
 
175
	private function envoyerAuth($message_accueil, $message_echec) {
161
		if ($etreAdmin == false) {
176
		header('HTTP/1.0 401 Unauthorized');
162
			$message = "Vous ne pouvez pas accéder à ce service car vous n'avez pas les droits d'administrateur !\n";
177
		header('WWW-Authenticate:  realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"');
163
			$code = RestServeur::HTTP_CODE_ACCES_NON_AUTORISE;
178
		header('Content-type: text/plain; charset=UTF-8');
164
			throw new Exception($message, $code);
-
 
165
		}
179
		print $message_echec;
166
		return $etreAdmin;
180
		exit(0);
167
	}
181
	}
-
 
182
 
168
 
183
	/**
169
	public function getInfosUtilisateurConnecte() {
-
 
170
		$utilisateur = array();
-
 
171
		if (isset($_COOKIE['del_courriel'])) {
-
 
172
			$courriel = $_COOKIE['del_courriel'];
184
	 * Authentifie et récupère un utilisateur directement depuis la table des
173
			$motDePasse = $_COOKIE['del_mot_de_passe'];
185
	 * utilisateurs Del, utile pour l'authentification HTTP AUTH - ne pas
174
			$utilisateur = $this->obtenirUtilisateurSansEncryptionMdp($courriel, $motDePasse);
186
	 * utiliser pour les services Del qui doivent être branchés au SSO
175
		}
-
 
176
		return $utilisateur;
-
 
177
	}
-
 
178
 
187
	 */
179
	private function obtenirUtilisateurSansEncryptionMdp($login, $motDePasseEncrypte) {
188
	protected function obtenirUtilisateur($login, $motDePasse) {
180
		$login = $this->bdd->proteger($login);
189
		$login = $this->bdd->proteger($login);
181
		$motDePasseEncrypte = $this->bdd->proteger($motDePasseEncrypte);
190
		$motDePasse = $this->bdd->proteger($motDePasse);
182
		$requete = 'SELECT du.*, admin, preferences, date_premiere_utilisation '.
191
		$requete = 'SELECT id_utilisateur, nom, prenom, courriel, mot_de_passe '.
183
			'FROM del_utilisateur AS du '.
-
 
184
			'	LEFT JOIN del_utilisateur_infos AS dui ON (du.id_utilisateur = dui.id_utilisateur) '.
192
			'FROM del_utilisateur AS du '.
185
			"WHERE du.courriel = $login ".
193
			"WHERE courriel = $login ".
186
			"	AND du.mot_de_passe = $motDePasseEncrypte ".
194
			"	AND mot_de_passe = MD5($motDePasse) ".
187
			' -- '.__FILE__.':'.__LINE__."\n";
195
			' -- '.__FILE__.':'.__LINE__."\n";
188
		$utilisateur = $this->bdd->recuperer($requete);
196
		$utilisateur = $this->bdd->recuperer($requete);
189
		return $utilisateur;
197
		return $utilisateur;
Line -... Line 198...
-
 
198
	}
-
 
199
 
-
 
200
	/**
-
 
201
	 * Vérifie dans la table des utilisateurs Del qu'un utilisateur
-
 
202
	 * (identifié par son courriel) est administrateur de Del
-
 
203
	 * 
-
 
204
	 * @param string $courriel
190
	}
205
	 * @return boolean true si l'utilisateur est administrateur de Del, false sinon
191
 
206
	 */
-
 
207
	protected function etreAdmin($courriel) {
-
 
208
		$courriel = $this->bdd->proteger($courriel);
-
 
209
		$requete = 'SELECT dui.admin '.
-
 
210
			'FROM del_utilisateur AS du LEFT JOIN del_user_infos AS dui ON (du.id_utilisateur = dui.id_utilisateur) '.
-
 
211
			"WHERE du.courriel = $courriel ".
-
 
212
			' -- '.__FILE__.':'.__LINE__."\n";
-
 
213
		$infoUtilisateur = $this->bdd->recuperer($requete);
192
	public function getIdAnonymeTemporaire() {
214
 
193
		$this->demarrerSession();
215
		$etreAdmin = $this->verifierDroitAdmin($infoUtilisateur['admin']);
Line -... Line 216...
-
 
216
		return $etreAdmin;
-
 
217
	}
-
 
218
 
-
 
219
	/**
-
 
220
	 * Vérifie que la valeur "admin" d'un profil utilisateur correspond à la valeur
-
 
221
	 * attendue dans la config
194
		return session_id();
222
	 * 
-
 
223
	 * @return true si sébon, false si sépabon
195
	}
224
	 */
196
 
225
	protected function verifierDroitAdmin($droit) {
197
	private function demarrerSession() {
226
		$droitAdmin = $this->conteneur->getParametre('droit_superadmin');
198
		if (session_id() == '') {
227
		$etreAdmin = false;
-
 
228
		if (isset($droit) && $droit == $droitAdmin) {
199
			// TODO : modifier ce test lors du passage en php 5.4
229
			$etreAdmin = true;
-
 
230
		}
200
			session_start();
231
		return $etreAdmin;
201
		}
232
	}