Subversion Repositories eFlore/Applications.del

Rev

Rev 1793 | Rev 1815 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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