Subversion Repositories Applications.annuaire

Rev

Rev 536 | Rev 561 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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