Subversion Repositories eFlore/Applications.del

Rev

Rev 1794 | Rev 2077 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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