Subversion Repositories eFlore/Applications.del

Rev

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

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