Subversion Repositories Applications.annuaire

Rev

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

Rev 519 Rev 521
1
<?php
1
<?php
2
/**
2
/**
3
 * Classe mère abstraite contenant les méthodes génériques des services.
3
 * Classe mère abstraite contenant les méthodes génériques des services.
4
 * Encodage en entrée : utf8
4
 * Encodage en entrée : utf8
5
 * Encodage en sortie : utf8
5
 * Encodage en sortie : utf8
6
 *
6
 *
7
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
7
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
8
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
8
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
9
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
9
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
10
 * @version $Id$
10
 * @version $Id$
11
 * @copyright 2009
11
 * @copyright 2009
12
 */
12
 */
13
abstract class JRestService {
13
abstract class JRestService {
14
 
14
 
15
	public $config;
15
	public $config;
16
	protected $bdd;
16
	protected $bdd;
17
	protected $ressources;
17
	protected $ressources;
18
	protected $log = array();
18
	protected $log = array();
19
	protected $messages = array();
19
	protected $messages = array();
20
	protected $debug = array();
20
	protected $debug = array();
21
	protected $distinct = false;
21
	protected $distinct = false;
22
	protected $orderby = null;
22
	protected $orderby = null;
23
	protected $formatRetour = 'objet';
23
	protected $formatRetour = 'objet';
24
	protected $start = 0;
24
	protected $start = 0;
25
	protected $limit = 150;
25
	protected $limit = 150;
26
 
26
 
27
	/** pour l'envoi de XML : éventuelle balise dans laquelle placer tout le contenu */
27
	/** pour l'envoi de XML : éventuelle balise dans laquelle placer tout le contenu */
28
	protected $baliseMaitresse;
28
	protected $baliseMaitresse;
29
 
29
 
30
	public function __construct($config, $demarrer_session = true) {
30
	public function __construct($config, $demarrer_session = true) {
31
		// Tableau contenant la config de Jrest
31
		// Tableau contenant la config de Jrest
32
		$this->config = $config;
32
		$this->config = $config;
33
 
33
 
34
		// Connection à la base de données
34
		// Connection à la base de données
35
		$this->bdd = $this->connecterPDO($this->config, 'appli');
35
		$this->bdd = $this->connecterPDO($this->config, 'appli');
36
 
36
 
37
		// Nettoyage du $_GET (sécurité)
37
		// Nettoyage du $_GET (sécurité)
38
		if (isset($_GET)) {
38
		if (isset($_GET)) {
39
			$get_params = array('orderby', 'distinct', 'start', 'limit', 'formatRetour');
39
			$get_params = array('orderby', 'distinct', 'start', 'limit', 'formatRetour');
40
			foreach ($get_params as $get) {
40
			foreach ($get_params as $get) {
41
				$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
41
				$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
42
				$_GET[$get] = str_replace($verifier, '', $_GET[$get]);
42
				$_GET[$get] = str_replace($verifier, '', $_GET[$get]);
43
				if (isset($_GET[$get]) && $_GET[$get] != '') {
43
				if (isset($_GET[$get]) && $_GET[$get] != '') {
44
					$this->$get = $_GET[$get];
44
					$this->$get = $_GET[$get];
45
				} else {
45
				} else {
46
					$_GET[$get] = null;
46
					$_GET[$get] = null;
47
				}
47
				}
48
			}
48
			}
49
		}
49
		}
50
	}
50
	}
51
 
51
 
52
	/**
52
	/**
53
	 * Méthode appelée quand aucun paramètre n'est passé dans l'url et avec une requête de type GET.
53
	 * Méthode appelée quand aucun paramètre n'est passé dans l'url et avec une requête de type GET.
54
	 */
54
	 */
55
	public function getRessource() {
55
	public function getRessource() {
56
		$this->getElement(array());
56
		$this->getElement(array());
57
	}
57
	}
58
 
58
 
59
	//+----------------------------------------------------------------------------------------------------------------+
59
	//+----------------------------------------------------------------------------------------------------------------+
60
	// GESTION de l'ENVOIE au NAVIGATEUR
60
	// GESTION de l'ENVOIE au NAVIGATEUR
61
 
61
 
62
	protected function envoyerJson($donnees, $encodage = 'utf-8') {
62
	protected function envoyerJson($donnees, $encodage = 'utf-8') {
63
		$contenu = json_encode($donnees);
63
		$contenu = json_encode($donnees);
64
		$this->envoyer($contenu, 'application/json', $encodage, false);
64
		$this->envoyer($contenu, 'application/json', $encodage, false);
65
	}
65
	}
66
 
66
 
67
	/** à l'arrache pour rétrocompatibilité avec le service "annuaire_tela" de eFlore_chatin */
67
	/** à l'arrache pour rétrocompatibilité avec le service "annuaire_tela" de eFlore_chatin */
68
	protected function envoyerXml($donnees, $encodage = 'utf-8') {
68
	protected function envoyerXml($donnees, $encodage = 'utf-8') {
69
		$xml = '<?xml version="1.0" encoding="' . strtoupper($encodage) . '"?>';
69
		$xml = '<?xml version="1.0" encoding="' . strtoupper($encodage) . '"?>';
70
		if ($this->baliseMaitresse) {
70
		if ($this->baliseMaitresse) {
71
			$xml .= '<' . $this->baliseMaitresse . '>';
71
			$xml .= '<' . $this->baliseMaitresse . '>';
72
		}
72
		}
73
		$xml .= $this->genererXmlAPartirDeTableau($donnees);
73
		$xml .= $this->genererXmlAPartirDeTableau($donnees);
74
		if ($this->baliseMaitresse) {
74
		if ($this->baliseMaitresse) {
75
			$xml .= '</' . $this->baliseMaitresse . '>';
75
			$xml .= '</' . $this->baliseMaitresse . '>';
76
		}
76
		}
77
		$this->envoyer($xml, 'application/xml', $encodage, false);
77
		$this->envoyer($xml, 'application/xml', $encodage, false);
78
	}
78
	}
79
 
79
 
80
	/**
80
	/**
81
	 * Génère un XML minimaliste à partir d'un tableau associatif
81
	 * Génère un XML minimaliste à partir d'un tableau associatif
82
	 * Note : gère mal les indices numériques
82
	 * Note : gère mal les indices numériques
83
	 * @TODO utiliser une vraie lib 
83
	 * @TODO utiliser une vraie lib 
84
	 */ 
84
	 */ 
85
	protected function genererXmlAPartirDeTableau($tableau) {
85
	protected function genererXmlAPartirDeTableau($tableau) {
86
		$xml = '';
86
		$xml = '';
87
		foreach ($tableau as $balise => $donnee) {
87
		foreach ($tableau as $balise => $donnee) {
88
			$xml .= '<' . $balise . '>';
88
			$xml .= '<' . $balise . '>';
89
			if (is_array($donnee)) {
89
			if (is_array($donnee)) {
90
				// récurer, balayer, que ce soit toujours pimpant
90
				// récurer, balayer, que ce soit toujours pimpant
91
				$xml .= $this->genererXmlAPartirDeTableau($donnee);
91
				$xml .= $this->genererXmlAPartirDeTableau($donnee);
92
			} else {
92
			} else {
93
				$xml .= $donnee;
93
				$xml .= $donnee;
94
			}
94
			}
95
			$xml .= '</' . $balise . '>';
95
			$xml .= '</' . $balise . '>';
96
		}
96
		}
97
		return $xml;
97
		return $xml;
98
	}
98
	}
99
 
99
 
100
	protected function envoyerJsonVar($variable, $donnees = null, $encodage = 'utf-8') {
100
	protected function envoyerJsonVar($variable, $donnees = null, $encodage = 'utf-8') {
101
		$contenu = "var $variable = ".json_encode($donnees);
101
		$contenu = "var $variable = ".json_encode($donnees);
102
		$this->envoyer($contenu, 'text/html', $encodage, false);
102
		$this->envoyer($contenu, 'text/html', $encodage, false);
103
	}
103
	}
104
 
104
 
105
	protected function envoyerJsonp($donnees = null, $encodage = 'utf-8') {
105
	protected function envoyerJsonp($donnees = null, $encodage = 'utf-8') {
106
		$contenu = $_GET['callback'].'('.json_encode($donnees).');';
106
		$contenu = $_GET['callback'].'('.json_encode($donnees).');';
107
		$this->envoyer($contenu, 'text/html', $encodage, false);
107
		$this->envoyer($contenu, 'text/html', $encodage, false);
108
	}
108
	}
109
 
109
 
110
	protected function envoyerTxt($donnees, $encodage = 'utf-8') {
110
	protected function envoyerTxt($donnees, $encodage = 'utf-8') {
111
		$this->envoyer($contenu, 'text/html', $encodage, false);
111
		$this->envoyer($contenu, 'text/html', $encodage, false);
112
	}
112
	}
113
 
113
 
114
	protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8', $json = true) {
114
	protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8', $json = true) {
115
		// Traitements des messages d'erreurs et données
115
		// Traitements des messages d'erreurs et données
116
		if (count($this->messages) != 0) {
116
		if (count($this->messages) != 0) {
117
			header('HTTP/1.1 500 Internal Server Error');
117
			header('HTTP/1.1 500 Internal Server Error');
118
			$mime = 'text/html';
118
			$mime = 'text/html';
119
			$encodage = 'utf-8';
119
			$encodage = 'utf-8';
120
			$json = true;
120
			$json = true;
121
			$sortie = $this->messages;
121
			$sortie = $this->messages;
122
		} else {
122
		} else {
123
			$sortie = $donnees;
123
			$sortie = $donnees;
124
			if (is_null($donnees)) {
124
			if (is_null($donnees)) {
125
				$sortie = 'OK';
125
				$sortie = 'OK';
126
			}
126
			}
127
		}
127
		}
128
 
128
 
129
		// Gestion de l'envoie du déboguage
129
		// Gestion de l'envoie du déboguage
130
		$this->envoyerDebogage();
130
		$this->envoyerDebogage();
131
 
131
 
132
		// Encodage au format et JSON et envoie sur la sortie standard
132
		// Encodage au format et JSON et envoie sur la sortie standard
133
		$contenu = $json ? json_encode($sortie) : $sortie;
133
		$contenu = $json ? json_encode($sortie) : $sortie;
134
		$this->envoyerContenu($encodage, $mime, $contenu);
134
		$this->envoyerContenu($encodage, $mime, $contenu);
135
	}
135
	}
136
 
136
 
137
	private function envoyerDebogage() {
137
	private function envoyerDebogage() {
138
		if (!is_array($this->debug)) {
138
		if (!is_array($this->debug)) {
139
			$this->debug[] = $this->debug;
139
			$this->debug[] = $this->debug;
140
		}
140
		}
141
		if (count($this->debug) != 0) {
141
		if (count($this->debug) != 0) {
142
			foreach ($this->debug as $cle => $val) {
142
			foreach ($this->debug as $cle => $val) {
143
				if (is_array($val)) {
143
				if (is_array($val)) {
144
					$this->debug[$cle] = print_r($val, true);
144
					$this->debug[$cle] = print_r($val, true);
145
				}
145
				}
146
			}
146
			}
147
			header('X-DebugJrest-Data:'.json_encode($this->debug));
147
			header('X-DebugJrest-Data:'.json_encode($this->debug));
148
		}
148
		}
149
	}
149
	}
150
 
150
 
151
	private function envoyerContenu($encodage, $mime, $contenu) {
151
	private function envoyerContenu($encodage, $mime, $contenu) {
152
		if (!is_null($mime) && !is_null($encodage)) {
152
		if (!is_null($mime) && !is_null($encodage)) {
153
			header("Content-Type: $mime; charset=$encodage");
153
			header("Content-Type: $mime; charset=$encodage");
154
		} else if (!is_null($mime) && is_null($encodage)) {
154
		} else if (!is_null($mime) && is_null($encodage)) {
155
			header("Content-Type: $mime");
155
			header("Content-Type: $mime");
156
		}
156
		}
157
		print $contenu;
157
		print $contenu;
158
	}
158
	}
159
 
159
 
160
	private function envoyerAuth($message_accueil, $message_echec) {
160
	private function envoyerAuth($message_accueil, $message_echec) {
161
		header('HTTP/1.0 401 Unauthorized');
161
		header('HTTP/1.0 401 Unauthorized');
162
		header('WWW-Authenticate: Basic realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"');
162
		header('WWW-Authenticate: Basic realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"');
163
		header('Content-type: text/plain; charset=UTF-8');
163
		header('Content-type: text/plain; charset=UTF-8');
164
		print $message_echec;
164
		print $message_echec;
165
		exit(0);
165
		exit(0);
166
	}
166
	}
167
 
167
 
168
	protected function envoyerMessageErreur($msg, $code) {
168
	protected function envoyerMessageErreur($msg, $code) {
169
		$textHttp = $this->getCodeHttpText($code);
169
		$textHttp = $this->getCodeHttpText($code);
170
		header("HTTP/1.0 $code $textHttp");
170
		header("HTTP/1.0 $code $textHttp");
171
		header("Content-Type: text/plain; charset=utf-8");
171
		header("Content-Type: text/plain; charset=utf-8");
172
		die($msg);
172
		die($msg);
173
	}
173
	}
174
 
174
 
175
	private function getCodeHttpText($code) {
175
	private function getCodeHttpText($code) {
176
		$text = '';
176
		$text = '';
177
		switch ($code) {
177
		switch ($code) {
178
			case 100: $text = 'Continue'; break;
178
			case 100: $text = 'Continue'; break;
179
			case 101: $text = 'Switching Protocols'; break;
179
			case 101: $text = 'Switching Protocols'; break;
180
			case 200: $text = 'OK'; break;
180
			case 200: $text = 'OK'; break;
181
			case 201: $text = 'Created'; break;
181
			case 201: $text = 'Created'; break;
182
			case 202: $text = 'Accepted'; break;
182
			case 202: $text = 'Accepted'; break;
183
			case 203: $text = 'Non-Authoritative Information'; break;
183
			case 203: $text = 'Non-Authoritative Information'; break;
184
			case 204: $text = 'No Content'; break;
184
			case 204: $text = 'No Content'; break;
185
			case 205: $text = 'Reset Content'; break;
185
			case 205: $text = 'Reset Content'; break;
186
			case 206: $text = 'Partial Content'; break;
186
			case 206: $text = 'Partial Content'; break;
187
			case 300: $text = 'Multiple Choices'; break;
187
			case 300: $text = 'Multiple Choices'; break;
188
			case 301: $text = 'Moved Permanently'; break;
188
			case 301: $text = 'Moved Permanently'; break;
189
			case 302: $text = 'Moved Temporarily'; break;
189
			case 302: $text = 'Moved Temporarily'; break;
190
			case 303: $text = 'See Other'; break;
190
			case 303: $text = 'See Other'; break;
191
			case 304: $text = 'Not Modified'; break;
191
			case 304: $text = 'Not Modified'; break;
192
			case 305: $text = 'Use Proxy'; break;
192
			case 305: $text = 'Use Proxy'; break;
193
			case 400: $text = 'Bad Request'; break;
193
			case 400: $text = 'Bad Request'; break;
194
			case 401: $text = 'Unauthorized'; break;
194
			case 401: $text = 'Unauthorized'; break;
195
			case 402: $text = 'Payment Required'; break;
195
			case 402: $text = 'Payment Required'; break;
196
			case 403: $text = 'Forbidden'; break;
196
			case 403: $text = 'Forbidden'; break;
197
			case 404: $text = 'Not Found'; break;
197
			case 404: $text = 'Not Found'; break;
198
			case 405: $text = 'Method Not Allowed'; break;
198
			case 405: $text = 'Method Not Allowed'; break;
199
			case 406: $text = 'Not Acceptable'; break;
199
			case 406: $text = 'Not Acceptable'; break;
200
			case 407: $text = 'Proxy Authentication Required'; break;
200
			case 407: $text = 'Proxy Authentication Required'; break;
201
			case 408: $text = 'Request Time-out'; break;
201
			case 408: $text = 'Request Time-out'; break;
202
			case 409: $text = 'Conflict'; break;
202
			case 409: $text = 'Conflict'; break;
203
			case 410: $text = 'Gone'; break;
203
			case 410: $text = 'Gone'; break;
204
			case 411: $text = 'Length Required'; break;
204
			case 411: $text = 'Length Required'; break;
205
			case 412: $text = 'Precondition Failed'; break;
205
			case 412: $text = 'Precondition Failed'; break;
206
			case 413: $text = 'Request Entity Too Large'; break;
206
			case 413: $text = 'Request Entity Too Large'; break;
207
			case 414: $text = 'Request-URI Too Large'; break;
207
			case 414: $text = 'Request-URI Too Large'; break;
208
			case 415: $text = 'Unsupported Media Type'; break;
208
			case 415: $text = 'Unsupported Media Type'; break;
209
			case 500: $text = 'Internal Server Error'; break;
209
			case 500: $text = 'Internal Server Error'; break;
210
			case 501: $text = 'Not Implemented'; break;
210
			case 501: $text = 'Not Implemented'; break;
211
			case 502: $text = 'Bad Gateway'; break;
211
			case 502: $text = 'Bad Gateway'; break;
212
			case 503: $text = 'Service Unavailable'; break;
212
			case 503: $text = 'Service Unavailable'; break;
213
			case 504: $text = 'Gateway Time-out'; break;
213
			case 504: $text = 'Gateway Time-out'; break;
214
			case 505: $text = 'HTTP Version not supported'; break;
214
			case 505: $text = 'HTTP Version not supported'; break;
215
			default:
215
			default:
216
				exit('Unknown http status code "' . htmlentities($code) . '"');
216
				exit('Unknown http status code "' . htmlentities($code) . '"');
217
			break;
217
			break;
218
		}
218
		}
219
		return $text;
219
		return $text;
220
	}
220
	}
221
 
221
 
222
	//+----------------------------------------------------------------------------------------------------------------+
222
	//+----------------------------------------------------------------------------------------------------------------+
223
	// GESTION de la BASE de DONNÉES
223
	// GESTION de la BASE de DONNÉES
224
 
224
 
225
	private function connecterPDO($config, $base = 'database') {
225
	private function connecterPDO($config, $base = 'database') {
226
  		$cfg = $config[$base];
226
  		$cfg = $config[$base];
227
		// ATTENTION : la connexin à la bdd peut échouer si l'host vaut localhost. Utiliser 127.0.0.1 à la place.
227
		// ATTENTION : la connexin à la bdd peut échouer si l'host vaut localhost. Utiliser 127.0.0.1 à la place.
228
		$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
228
		$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
229
		try {
229
		try {
230
		// Création de la connexion en UTF-8 à la BDD
230
		// Création de la connexion en UTF-8 à la BDD
231
			$PDO = new PDO($dsn, $cfg['username'], $cfg['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));
231
			$PDO = new PDO($dsn, $cfg['username'], $cfg['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));
232
		} catch (PDOException $e) {
232
		} catch (PDOException $e) {
233
			echo 'La connexion à la base de donnée via PDO a échouée : ' .$dsn. $e->getMessage();
233
			echo 'La connexion à la base de donnée via PDO a échouée : ' .$dsn. $e->getMessage();
234
		}
234
		}
235
		// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
235
		// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
236
		$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
236
		$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
237
		return $PDO;
237
		return $PDO;
238
	}
238
	}
239
 
239
 
240
	protected function getTxt($id) {
240
	protected function getTxt($id) {
241
		$sortie = '';
241
		$sortie = '';
242
		switch ($id) {
242
		switch ($id) {
243
			case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
243
			case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
244
			default : $sortie = $id;
244
			default : $sortie = $id;
245
		}
245
		}
246
		return $sortie;
246
		return $sortie;
247
	}
247
	}
248
 
248
 
249
	//+----------------------------------------------------------------------------------------------------------------+
249
	//+----------------------------------------------------------------------------------------------------------------+
250
	// TRAITEMENT des URLs et des PARAMÊTRES
250
	// TRAITEMENT des URLs et des PARAMÊTRES
251
 
251
 
252
	protected function traiterNomMethodeGet($nom) {
252
	protected function traiterNomMethodeGet($nom) {
253
		$methode = 'get';
253
		$methode = 'get';
254
		$methode .= str_replace(' ', '', ucwords(str_replace('-', ' ', strtolower($nom))));
254
		$methode .= str_replace(' ', '', ucwords(str_replace('-', ' ', strtolower($nom))));
255
		return $methode;
255
		return $methode;
256
	}
256
	}
257
 
257
 
258
	protected function traiterNomMethodePost($nom) {
258
	protected function traiterNomMethodePost($nom) {
259
		$methode = 'update';
259
		$methode = 'update';
260
		$methode .= str_replace(' ', '', ucwords(str_replace('-', ' ', strtolower($nom))));
260
		$methode .= str_replace(' ', '', ucwords(str_replace('-', ' ', strtolower($nom))));
261
		return $methode;
261
		return $methode;
262
	}
262
	}
263
 
263
 
264
	protected function traiterNomMethodePut($nom) {
264
	protected function traiterNomMethodePut($nom) {
265
		$methode = 'create';
265
		$methode = 'create';
266
		$methode .= str_replace(' ', '', ucwords(str_replace('-', ' ', strtolower($nom))));
266
		$methode .= str_replace(' ', '', ucwords(str_replace('-', ' ', strtolower($nom))));
267
		return $methode;
267
		return $methode;
268
	}
268
	}
269
 
269
 
270
	protected function traiterParametresUrl($params_attendu, $params, $pourBDD = true) {
270
	protected function traiterParametresUrl($params_attendu, $params, $pourBDD = true) {
271
		$sortie = array();
271
		$sortie = array();
272
		foreach ($params_attendu as $num => $nom) {
272
		foreach ($params_attendu as $num => $nom) {
273
			if (isset($params[$num]) && $params[$num] != '*') {
273
			if (isset($params[$num]) && $params[$num] != '*') {
274
				if ($pourBDD) {
274
				if ($pourBDD) {
275
					$params[$num] = $this->bdd->quote($params[$num]);
275
					$params[$num] = $this->bdd->quote($params[$num]);
276
				}
276
				}
277
				$sortie[$nom] = $params[$num];
277
				$sortie[$nom] = $params[$num];
278
			}
278
			}
279
		}
279
		}
280
		return $sortie;
280
		return $sortie;
281
	}
281
	}
282
 
282
 
283
	protected function traiterParametresPost($params) {
283
	protected function traiterParametresPost($params) {
284
		$sortie = array();
284
		$sortie = array();
285
		foreach ($params as $cle => $valeur) {
285
		foreach ($params as $cle => $valeur) {
286
			$sortie[$cle] = $this->bdd->quote($valeur);
286
			$sortie[$cle] = $this->bdd->quote($valeur);
287
		}
287
		}
288
		return $sortie;
288
		return $sortie;
289
	}
289
	}
290
 
290
 
291
	//+----------------------------------------------------------------------------------------------------------------+
291
	//+----------------------------------------------------------------------------------------------------------------+
292
	// GESTION DE L'IDENTIFICATION
292
	// GESTION DE L'IDENTIFICATION
293
 
293
 
294
	public function controlerIpAutorisees() {
294
	public function controlerIpAutorisees() {
295
		$ipsAutorisees = $this->config['jrest_admin']['ip_autorisees'];
295
		$ipsAutorisees = $this->config['jrest_admin']['ip_autorisees'];
296
 
296
 
297
		$remoteIp = filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP);
297
		$remoteIp = filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP);
298
		$serverIp = filter_input(INPUT_SERVER, 'SERVER_ADDR', FILTER_VALIDATE_IP);
298
		$serverIp = filter_input(INPUT_SERVER, 'SERVER_ADDR', FILTER_VALIDATE_IP);
299
		if (in_array($remoteIp, $ipsAutorisees) == false) {
299
		if (in_array($remoteIp, $ipsAutorisees) == false) {
300
			if ($remoteIp != $serverIp) {// ATTENTION : maintenir ce test à l'intérieur du précédent
300
			if ($remoteIp != $serverIp) {// ATTENTION : maintenir ce test à l'intérieur du précédent
301
				$message = "Accès interdit. \n".
301
				$message = "Accès interdit. \n".
302
					"Vous n'êtes pas autorisé à accéder à ce service depuis '$remoteIp' !\n";
302
					"Vous n'êtes pas autorisé à accéder à ce service depuis '$remoteIp' !\n";
303
				$this->envoyerMessageErreur($message, 401);
303
				$this->envoyerMessageErreur($message, 401);
304
			}
304
			}
305
		}
305
		}
306
		return true;
306
		return true;
307
	}
307
	}
308
 
308
 
309
	protected function getIdentification(&$params) {
309
	protected function getIdentification(&$params) {
310
		// Initialisation des variables
310
		// Initialisation des variables
311
		$utilisateur = array(0, session_id());
311
		$utilisateur = array(0, session_id());
312
 
312
 
313
		// L'id utilisateur est soit passé par le POST soit dans l'url
313
		// L'id utilisateur est soit passé par le POST soit dans l'url
314
		if (is_array($params) && isset($params['cmhl_ce_modifier_par'])) {
314
		if (is_array($params) && isset($params['cmhl_ce_modifier_par'])) {
315
		   	$utilisateur[0] = $params['cmhl_ce_modifier_par'];
315
		   	$utilisateur[0] = $params['cmhl_ce_modifier_par'];
316
			unset($params['cmhl_ce_modifier_par']);
316
			unset($params['cmhl_ce_modifier_par']);
317
		} else if (is_string($params)) {
317
		} else if (is_string($params)) {
318
			$utilisateur[0] = $params;
318
			$utilisateur[0] = $params;
319
		}
319
		}
320
 
320
 
321
		return $utilisateur;
321
		return $utilisateur;
322
	}
322
	}
323
 
323
 
324
	protected function etreAutorise($id_utilisateur) {
324
	protected function etreAutorise($id_utilisateur) {
325
		$autorisation = false;
325
		$autorisation = false;
326
		if (($_SESSION['coel_utilisateur'] != '') && $_SESSION['coel_utilisateur']['id'] != $id_utilisateur) {
326
		if (($_SESSION['coel_utilisateur'] != '') && $_SESSION['coel_utilisateur']['id'] != $id_utilisateur) {
327
			$this->messages[] = 'Accès interdit.';
327
			$this->messages[] = 'Accès interdit.';
328
		} else if ($_SESSION['coel_utilisateur'] == '') {
328
		} else if ($_SESSION['coel_utilisateur'] == '') {
329
			$this->messages[] = 'Veuillez vous identifiez pour accéder à cette fonction.';
329
			$this->messages[] = 'Veuillez vous identifiez pour accéder à cette fonction.';
330
		} else {
330
		} else {
331
			$autorisation = true;
331
			$autorisation = true;
332
		}
332
		}
333
		return $autorisation;
333
		return $autorisation;
334
	}
334
	}
335
 
335
 
336
	private function gererIdentificationPermanente() {
336
	private function gererIdentificationPermanente() {
337
		// Pour maintenir l'utilisateur tjrs réellement identifié nous sommes obligé de recréer une SESSION et de le recharger depuis la bdd
337
		// Pour maintenir l'utilisateur tjrs réellement identifié nous sommes obligé de recréer une SESSION et de le recharger depuis la bdd
338
		if ($this->getUtilisateur() == ''
338
		if ($this->getUtilisateur() == ''
339
				&& isset($_COOKIE['coel_login'])
339
				&& isset($_COOKIE['coel_login'])
340
				&& ($utilisateur = $this->chargerUtilisateur($_COOKIE['coel_login'], $_COOKIE['coel_mot_de_passe']))) {
340
				&& ($utilisateur = $this->chargerUtilisateur($_COOKIE['coel_login'], $_COOKIE['coel_mot_de_passe']))) {
341
			$this->setUtilisateur($utilisateur, $_COOKIE['coel_permanence']);
341
			$this->setUtilisateur($utilisateur, $_COOKIE['coel_permanence']);
342
		}
342
		}
343
	}
343
	}
344
 
344
 
345
	protected function getUtilisateur() {
345
	protected function getUtilisateur() {
346
		return (isset($_SESSION['coel_utilisateur']) ? $_SESSION['coel_utilisateur'] : '');
346
		return (isset($_SESSION['coel_utilisateur']) ? $_SESSION['coel_utilisateur'] : '');
347
	}
347
	}
348
 
348
 
349
	protected function authentifier() {
349
	protected function authentifier() {
350
		if (!isset($_SERVER['PHP_AUTH_USER'])) {
350
		if (!isset($_SERVER['PHP_AUTH_USER'])) {
351
			header('WWW-Authenticate: Basic realm="www.tela-botanica.org"');
351
			header('WWW-Authenticate: Basic realm="www.tela-botanica.org"');
352
			header('HTTP/1.0 401 Unauthorized');
352
			header('HTTP/1.0 401 Unauthorized');
353
			header('Content-type: text/html; charset=UTF-8');
353
			header('Content-type: text/html; charset=UTF-8');
354
			echo 'Accès interdit';
354
			echo 'Accès interdit';
355
			exit;
355
			exit;
356
		} else {
356
		} else {
357
			if ($this->verifierAcces()) {
357
			if ($this->verifierAcces()) {
358
				return ;
358
				return ;
359
			} else {
359
			} else {
360
				header('WWW-Authenticate: Basic realm="www.tela-botanica.org"');
360
				header('WWW-Authenticate: Basic realm="www.tela-botanica.org"');
361
				header('HTTP/1.0 401 Unauthorized');
361
				header('HTTP/1.0 401 Unauthorized');
362
				header('Content-type: text/html; charset=UTF-8');
362
				header('Content-type: text/html; charset=UTF-8');
363
				echo 'Accès interdit';
363
				echo 'Accès interdit';
364
				exit ;
364
				exit ;
365
			}
365
			}
366
		}
366
		}
367
	}
367
	}
368
 
368
 
369
	protected function verifierAcces($id = null, $mdp = null) {
369
	protected function verifierAcces($id = null, $mdp = null) {
370
		$id = is_null($id) ? $_SERVER['PHP_AUTH_USER'] : $id;
370
		$id = is_null($id) ? $_SERVER['PHP_AUTH_USER'] : $id;
371
		$mdp = is_null($mdp) ? $_SERVER['PHP_AUTH_PW'] : $mdp;
371
		$mdp = is_null($mdp) ? $_SERVER['PHP_AUTH_PW'] : $mdp;
372
 
372
 
373
		$requete = 'SELECT '.$this->config['database_ident']['ann_id'].' AS courriel '.
373
		$requete = 'SELECT '.$this->config['database_ident']['ann_id'].' AS courriel '.
374
			'FROM '.$this->config['database_ident']['database'].'.'.$this->config['database_ident']['annuaire'].' '.
374
			'FROM '.$this->config['database_ident']['database'].'.'.$this->config['database_ident']['annuaire'].' '.
375
			'WHERE '.$this->config['database_ident']['ann_id'].' = '.$this->bdd->quote($id).' '.
375
			'WHERE '.$this->config['database_ident']['ann_id'].' = '.$this->bdd->quote($id).' '.
376
			'	AND '.$this->config['database_ident']['ann_pwd'].' = '.$this->config['database_ident']['pass_crypt_funct'].'('.$this->bdd->quote($mdp).')' ;
376
			'	AND '.$this->config['database_ident']['ann_pwd'].' = '.$this->config['database_ident']['pass_crypt_funct'].'('.$this->bdd->quote($mdp).')' ;
377
		$resultat = $this->bdd->query($requete)->fetch();
377
		$resultat = $this->bdd->query($requete)->fetch();
378
 
378
 
379
		$identifie = false;
379
		$identifie = false;
380
		if (isset($resultat['courriel'])) {
380
		if (isset($resultat['courriel'])) {
381
			$identifie = true;
381
			$identifie = true;
382
		}
382
		}
383
		return $identifie;
383
		return $identifie;
384
	}
384
	}
-
 
385
 
-
 
386
	/**
-
 
387
	 * Envoie une demande d'authentification HTTP puis compare le couple
-
 
388
	 * login / mot de passe envoyé par l'utilisateur, à ceux définis dans
-
 
389
	 * la config (section database_ident).
-
 
390
	 * En cas d'erreur, sort du programme avec un entête HTTP 401
-
 
391
	 * @TODO redondant avec les trucs du dessus :'(
-
 
392
	 */
-
 
393
	protected function authentificationHttpSimple() {
-
 
394
		$autorise = true;
-
 
395
		// contrôle d'accès
-
 
396
		$nomUtil = $_SERVER['PHP_AUTH_USER'];
-
 
397
		$mdp = $_SERVER['PHP_AUTH_PW'];
-
 
398
		$autorise = (($nomUtil == $this->config['database_ident']['username']) && ($mdp == $this->config['database_ident']['password']));
-
 
399
		// entêtes HTTP
-
 
400
		if (! $autorise) {
-
 
401
			header('WWW-Authenticate: Basic realm="Annuaire de Tela Botanica"');
-
 
402
			header('HTTP/1.0 401 Unauthorized');
-
 
403
			echo 'Veuillez vous authentifier pour utiliser ce service';
-
 
404
			exit;
-
 
405
		}
-
 
406
	}
385
 
407
 
386
	protected function creerCookiePersistant($duree = null, $id = null, $mdp = null) {
408
	protected function creerCookiePersistant($duree = null, $id = null, $mdp = null) {
387
		$id = is_null($id) ? $_SERVER['PHP_AUTH_USER'] : $id;
409
		$id = is_null($id) ? $_SERVER['PHP_AUTH_USER'] : $id;
388
		$mdp = is_null($mdp) ? $_SERVER['PHP_AUTH_PW'] : $mdp;
410
		$mdp = is_null($mdp) ? $_SERVER['PHP_AUTH_PW'] : $mdp;
389
		$duree = (int) is_null($duree) ? time()+3600*24*30 : $duree;
411
		$duree = (int) is_null($duree) ? time()+3600*24*30 : $duree;
390
 
412
 
391
		$nomCookie = $this->config['database_ident']['nom_cookie_persistant'];
413
		$nomCookie = $this->config['database_ident']['nom_cookie_persistant'];
392
		$valeurCookie = md5($mdp).$id;
414
		$valeurCookie = md5($mdp).$id;
393
 
415
 
394
		setcookie($nomCookie, $valeurCookie, $duree, '/');
416
		setcookie($nomCookie, $valeurCookie, $duree, '/');
395
	}
417
	}
396
 
418
 
397
	protected function creerCookieUtilisateur($duree = null, $id = null, $mdp = null) {
419
	protected function creerCookieUtilisateur($duree = null, $id = null, $mdp = null) {
398
		$id = is_null($id) ? $_SERVER['PHP_AUTH_USER'] : $id;
420
		$id = is_null($id) ? $_SERVER['PHP_AUTH_USER'] : $id;
399
		$mdp = is_null($mdp) ? $_SERVER['PHP_AUTH_PW'] : $mdp;
421
		$mdp = is_null($mdp) ? $_SERVER['PHP_AUTH_PW'] : $mdp;
400
		$duree = (int) is_null($duree) ? 0 : $duree;
422
		$duree = (int) is_null($duree) ? 0 : $duree;
401
 
423
 
402
		$nomCookie = $this->config['database_ident']['nom_cookie_utilisateur'];
424
		$nomCookie = $this->config['database_ident']['nom_cookie_utilisateur'];
403
		$valeurCookie = md5($mdp).$id;
425
		$valeurCookie = md5($mdp).$id;
404
 
426
 
405
		setcookie($nomCookie, $valeurCookie, $duree, '/');
427
		setcookie($nomCookie, $valeurCookie, $duree, '/');
406
	}
428
	}
407
 
429
 
408
	protected function estAutoriseMessagerie($adresse) {
430
	protected function estAutoriseMessagerie($adresse) {
409
		$utilisateurs_messagerie = explode(',', $this->config['messagerie']['utilisateurs_autorises']);
431
		$utilisateurs_messagerie = explode(',', $this->config['messagerie']['utilisateurs_autorises']);
410
		return in_array($adresse, $utilisateurs_messagerie);
432
		return in_array($adresse, $utilisateurs_messagerie);
411
	}
433
	}
412
 
434
 
413
	//+----------------------------------------------------------------------------------------------------------------+
435
	//+----------------------------------------------------------------------------------------------------------------+
414
	// GESTION DES SQUELETTES PHP
436
	// GESTION DES SQUELETTES PHP
415
 
437
 
416
	/**
438
	/**
417
	 * Méthode prenant en paramètre un chemin de fichier squelette et un tableau associatif de données,
439
	 * Méthode prenant en paramètre un chemin de fichier squelette et un tableau associatif de données,
418
	 * en extrait les variables, charge le squelette et retourne le résultat des deux combinés.
440
	 * en extrait les variables, charge le squelette et retourne le résultat des deux combinés.
419
	 *
441
	 *
420
	 * @param String $fichier	le chemin du fichier du squelette
442
	 * @param String $fichier	le chemin du fichier du squelette
421
	 * @param Array  $donnees	un tableau associatif contenant les variables a injecter dans le squelette.
443
	 * @param Array  $donnees	un tableau associatif contenant les variables a injecter dans le squelette.
422
	 *
444
	 *
423
	 * @return boolean false si le squelette n'existe pas, sinon la chaine résultat.
445
	 * @return boolean false si le squelette n'existe pas, sinon la chaine résultat.
424
	 */
446
	 */
425
	public static function traiterSquelettePhp($fichier, Array $donnees = array()) {
447
	public static function traiterSquelettePhp($fichier, Array $donnees = array()) {
426
		$sortie = false;
448
		$sortie = false;
427
		if (file_exists($fichier)) {
449
		if (file_exists($fichier)) {
428
			// Extraction des variables du tableau de données
450
			// Extraction des variables du tableau de données
429
			extract($donnees);
451
			extract($donnees);
430
			// Démarage de la bufferisation de sortie
452
			// Démarage de la bufferisation de sortie
431
			ob_start();
453
			ob_start();
432
			// Si les tags courts sont activés
454
			// Si les tags courts sont activés
433
			if ((bool) @ini_get('short_open_tag') === true) {
455
			if ((bool) @ini_get('short_open_tag') === true) {
434
				// Simple inclusion du squelette
456
				// Simple inclusion du squelette
435
				include $fichier;
457
				include $fichier;
436
			} else {
458
			} else {
437
				// Sinon, remplacement des tags courts par la syntaxe classique avec echo
459
				// Sinon, remplacement des tags courts par la syntaxe classique avec echo
438
				$html_et_code_php = self::traiterTagsCourts($fichier);
460
				$html_et_code_php = self::traiterTagsCourts($fichier);
439
				// Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval
461
				// Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval
440
				$html_et_code_php = '?>'.$html_et_code_php;
462
				$html_et_code_php = '?>'.$html_et_code_php;
441
				// Interprétation du html et du php dans le buffer
463
				// Interprétation du html et du php dans le buffer
442
				echo eval($html_et_code_php);
464
				echo eval($html_et_code_php);
443
			}
465
			}
444
			// Récupèration du contenu du buffer
466
			// Récupèration du contenu du buffer
445
			$sortie = ob_get_contents();
467
			$sortie = ob_get_contents();
446
			// Suppression du buffer
468
			// Suppression du buffer
447
			@ob_end_clean();
469
			@ob_end_clean();
448
		} else {
470
		} else {
449
			$msg = "Le fichier du squelette '$fichier' n'existe pas.";
471
			$msg = "Le fichier du squelette '$fichier' n'existe pas.";
450
			trigger_error($msg, E_USER_WARNING);
472
			trigger_error($msg, E_USER_WARNING);
451
		}
473
		}
452
		// Retourne le contenu
474
		// Retourne le contenu
453
		return $sortie;
475
		return $sortie;
454
	}
476
	}
455
 
477
 
456
	/**
478
	/**
457
	 * Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo.
479
	 * Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo.
458
	 *
480
	 *
459
	 * @param String $chemin_squelette le chemin du fichier du squelette
481
	 * @param String $chemin_squelette le chemin du fichier du squelette
460
	 *
482
	 *
461
	 * @return string le contenu du fichier du squelette php avec les tags courts remplacés.
483
	 * @return string le contenu du fichier du squelette php avec les tags courts remplacés.
462
	 */
484
	 */
463
	private static function traiterTagsCourts($chemin_squelette) {
485
	private static function traiterTagsCourts($chemin_squelette) {
464
		$contenu = file_get_contents($chemin_squelette);
486
		$contenu = file_get_contents($chemin_squelette);
465
		// Remplacement de tags courts par un tag long avec echo
487
		// Remplacement de tags courts par un tag long avec echo
466
		$contenu = str_replace('<?=', '<?php echo ',  $contenu);
488
		$contenu = str_replace('<?=', '<?php echo ',  $contenu);
467
		// Ajout systématique d'un point virgule avant la fermeture php
489
		// Ajout systématique d'un point virgule avant la fermeture php
468
		$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu);
490
		$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu);
469
		return $contenu;
491
		return $contenu;
470
	}
492
	}
471
}
493
}
472
?>
494
?>