Subversion Repositories eFlore/Applications.del

Rev

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

Rev 1478 Rev 1606
Line 1... Line 1...
1
<?php
1
<?php
2
/**
2
/**
3
* Classe de controle d'accès utilisant l'authentification http pour bloquer ou autoriser l'accès.
3
* Classe de controle d'accès aux services
4
* Elle offre des méthodes permettant de réserver l'accès à une section aux admins ou bien aux utilisateurs identifiés
-
 
5
*
4
*
-
 
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
*
6
* @category php 5.2
9
* @category DEL
7
* @package del
10
* @package Commun
8
* @author Aurélien Peronnet <aurelien@tela-botanica.org>
11
* @author Aurélien Peronnet <aurelien@tela-botanica.org>
9
* @copyright Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org)
12
* @author Jean-Pascal Milcent <jpm@tela-botanica.org>
10
* @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
11
* @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
14
* @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
12
* @version	$Id$
15
* @copyright Copyright (c) 1999-2014, Tela Botanica (accueil@tela-botanica.org)
13
*/
16
*/
14
class ControleAcces {
17
class ControleAcces {
15
	
18
 
16
	private $conteneur;
19
	private $conteneur;
17
	private $gestionBdd;
20
	private $gestionBdd;
18
	private $bdd;
21
	private $bdd;
19
	
22
 
20
	public function __construct($conteneur) {
23
	public function __construct($conteneur) {
21
		$this->conteneur = $conteneur;
24
		$this->conteneur = $conteneur;
22
		$this->gestionBdd = $conteneur->getGestionBdd();
25
		$this->gestionBdd = $conteneur->getGestionBdd();
23
		$this->bdd = $this->gestionBdd->getBdd();
26
		$this->bdd = $this->gestionBdd->getBdd();
24
	}
27
	}
25
	
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
 
26
	public function demanderAuthentificationAdmin() {
41
	public function demanderAuthentificationAdmin() {
27
		if(!$this->etreAdminAutorise()) {
42
		if (!$this->etreAdminAutoriseParHttp()) {
28
			$this->authentifierAdmin();
43
			$this->authentifierAdmin();
29
		}
44
		}
30
	}
45
	}
31
	
46
 
32
	public function demanderAuthentificationUtilisateur() {
47
	public function demanderAuthentificationUtilisateur() {
33
		if(!$this->etreUtilisateurAutorise()) {
48
		if (!$this->etreUtilisateurAutoriseParHttp()) {
34
			$this->authentifierUtilisateur();
49
			$this->authentifierUtilisateur();
35
		}
50
		}
36
	}
51
	}
37
	
52
 
38
	public function etreUtilisateurAutorise() {
53
	private function etreUtilisateurAutoriseParHttp() {
39
		$identifiant = $this->getAuthIdentifiant();
54
		$identifiant = $this->getAuthIdentifiant();
40
		$mdp = $this->getAuthMotDePasse();
55
		$mdp = $this->getAuthMotDePasse();
41
		$existe = $this->obtenirUtilisateur($identifiant, $mdp);
56
		$existe = $this->obtenirUtilisateur($identifiant, $mdp);
42
	
57
 
43
		$autorisation = (isset($existe) && $existe) ? true :false;
58
		$autorisation = (isset($existe) && $existe) ? true :false;
44
		return $autorisation;
59
		return $autorisation;
45
	}
60
	}
46
	
61
 
47
	private function obtenirUtilisateur($login, $motDePasse) {
62
	private function obtenirUtilisateur($login, $motDePasse) {
-
 
63
		$login = $this->bdd->proteger($login);
-
 
64
		$motDePasse = $this->bdd->proteger($motDePasse);
48
		$requete = 'SELECT id_utilisateur, nom, prenom, courriel, mot_de_passe FROM '.$this->gestionBdd->formaterTable('del_utilisateur', 'du').
65
		$requete = 'SELECT id_utilisateur, nom, prenom, courriel, mot_de_passe '.
-
 
66
			'FROM del_utilisateur AS du '.
49
						'WHERE courriel = '.$this->gestionBdd->getBdd()->proteger($login).' '.
67
			"WHERE courriel = $login ".
50
						'AND mot_de_passe = MD5('.$this->gestionBdd->getBdd()->proteger($motDePasse).')';
68
			"	AND mot_de_passe = MD5($motDePasse) ".
-
 
69
			' -- '.__FILE__.':'.__LINE__."\n";
51
		$utilisateur = $this->gestionBdd->getBdd()->recuperer($requete . ' -- ' . __FILE__ . ':' . __LINE__);
70
		$utilisateur = $this->bdd->recuperer($requete);
52
		return $utilisateur;
71
		return $utilisateur;
53
	}
72
	}
54
	
73
 
55
	private function obtenirUtilisateurSansEncryptionMdp($login, $motDePasseEncrypte) {
-
 
56
		$requete = 'SELECT id_utilisateur, nom, prenom, courriel, mot_de_passe FROM '.$this->gestionBdd->formaterTable('del_utilisateur', 'du').
-
 
57
							'WHERE courriel = '.$this->gestionBdd->getBdd()->proteger($login).' '.
-
 
58
							'AND mot_de_passe = '.$this->gestionBdd->getBdd()->proteger($motDePasseEncrypte).' ';
-
 
59
		$utilisateur = $this->gestionBdd->getBdd()->recuperer($requete . ' -- ' . __FILE__ . ':' . __LINE__);
-
 
60
		return $utilisateur;
-
 
61
	}
-
 
62
	
-
 
63
	public function etreAdminAutorise() {
74
	private function etreAdminAutoriseParHttp() {
64
		$identifiant = $this->getAuthIdentifiant();
75
		$identifiant = $this->getAuthIdentifiant();
65
		$autorisation = ($this->etreAdminDel($identifiant) && $this->etreUtilisateurAutorise()) ? true : false;
76
		$autorisation = ($this->etreAdmin($identifiant) && $this->etreUtilisateurAutorise()) ? true : false;
66
		return $autorisation;
77
		return $autorisation;
67
	}
78
	}
68
	
79
 
69
	public function etreAdminDel($courriel) {
80
	private function etreAdmin($courriel) {
-
 
81
		$courriel = $this->bdd->proteger($courriel);
70
		$admins = Config::get('admins');
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;
-
 
90
	}
-
 
91
 
71
		$courriels_autorises = explode(',', $admins);
92
	private function verifierDroitAdmin($droit) {
72
		$autorisation = (in_array($courriel, $courriels_autorises)) ? true : false ;
93
		$droitAdmin = $this->conteneur->getParametre('droit_superadmin');
-
 
94
		$etreAdmin = false;
-
 
95
		if (isset($droit) && $droit == $droitAdmin) {
-
 
96
			$etreAdmin = true;
-
 
97
		}
73
		return $autorisation;
98
		return $etreAdmin;
74
	}
99
	}
75
	
100
 
76
	private function getAuthIdentifiant() {
101
	private function getAuthIdentifiant() {
77
		$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null;
102
		$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null;
78
		return $id;
103
		return $id;
79
	}
104
	}
80
	
105
 
81
	private function getAuthMotDePasse() {
106
	private function getAuthMotDePasse() {
82
		$mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null;
107
		$mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null;
83
		return $mdp;
108
		return $mdp;
84
	}
109
	}
85
	
110
 
86
	//TODO: externaliser noms et adresses spécifiques à Tela Botanica
111
	//TODO: externaliser noms et adresses spécifiques à Tela Botanica
87
	private function authentifierAdmin() {
112
	private function authentifierAdmin() {
88
		$message_accueil = "Veuillez vous identifier avec votre compte administrateur Tela Botanica.";
113
		$message_accueil = "Veuillez vous identifier avec votre compte administrateur Tela Botanica.";
89
		$message_echec = "Accès limité aux administrateurs de DEL.\n".
114
		$message_echec = "Accès limité aux administrateurs de DEL.\n".
90
					"Votre tentative d'identification a échoué.\n".
115
			"Votre tentative d'identification a échoué.\n".
91
					"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.";
92
		return $this->authentifier($message_accueil, $message_echec, 'Admin');
117
		return $this->authentifier($message_accueil, $message_echec, 'Admin');
93
	}
118
	}
94
	
119
 
95
	private function authentifierUtilisateur() {
120
	private function authentifierUtilisateur() {
96
		$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica.";
121
		$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica.";
97
		$message_echec = "Accès limité aux utilisateurs de DEL.\n".
122
		$message_echec = "Accès limité aux utilisateurs de DEL.\n".
98
				"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".
99
				"Votre tentative d'identification a échoué.\n".
124
			"Votre tentative d'identification a échoué.\n".
100
				"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'.";
101
		return $this->authentifier($message_accueil, $message_echec, 'Utilisateur');
126
		return $this->authentifier($message_accueil, $message_echec, 'Utilisateur');
102
	}
127
	}
103
	
128
 
104
	private function authentifier($message_accueil, $message_echec, $type) {
129
	private function authentifier($message_accueil, $message_echec, $type) {
105
		$id = $this->getAuthIdentifiant();
130
		$id = $this->getAuthIdentifiant();
106
		if (!isset($id)) {
131
		if (!isset($id)) {
107
			$this->envoyerAuth($message_accueil, $message_echec);
132
			$this->envoyerAuth($message_accueil, $message_echec);
108
		} else {
133
		} else {
Line 116... Line 141...
116
				$this->envoyerAuth($message_accueil, $message_echec);
141
				$this->envoyerAuth($message_accueil, $message_echec);
117
			}
142
			}
118
		}
143
		}
119
		return true;
144
		return true;
120
	}
145
	}
121
	
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
 
122
	public function getInfosUtilisateurConnecte() {
157
	public function getInfosUtilisateurConnecte() {
-
 
158
		$utilisateur = array();
123
		if(isset($_COOKIE["del_courriel"])) {
159
		if (isset($_COOKIE['del_courriel'])) {
124
			$utilisateur = array('del_courriel' => $_COOKIE["del_courriel"],
160
			$courriel = $_COOKIE['del_courriel'];
125
								'del_mot_de_passe' => $_COOKIE["del_mot_de_passe"]);
161
			$motDePasse = $_COOKIE['del_mot_de_passe'];
126
			$utilisateur = $this->obtenirUtilisateurSansEncryptionMdp($utilisateur['del_courriel'], $utilisateur['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);
127
		}
173
		}
128
		
-
 
129
		return $utilisateur;
174
		return $utilisateur;
130
	}
175
	}
131
	
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
 
132
	public function getIdAnonymeTemporaire() {
190
	public function getIdAnonymeTemporaire() {
133
		$this->demarrerSession();
191
		$this->demarrerSession();
134
		return session_id();
192
		return session_id();
135
	}
193
	}
136
	
194
 
137
	private function demarrerSession() {
195
	private function demarrerSession() {
138
		if(session_id() == '') {
196
		if (session_id() == '') {
139
			// modifier ce test lors du passage en php 5.4
197
			// TODO : modifier ce test lors du passage en php 5.4
140
			session_start();
198
			session_start();
141
		}
199
		}
142
	}
200
	}
143
}
201
}
144
202