Subversion Repositories eFlore/Applications.del

Rev

Rev 2077 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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