Subversion Repositories eFlore/Applications.del

Rev

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

Rev 1826 Rev 1922
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Contexte permet d'encapsuler les super globales et de définir le contexte du web service courrant.
4
 * Contexte permet d'encapsuler les super globales et de définir le contexte du web service courrant.
5
 *
5
 *
6
 * @category  DEL
6
 * @category  DEL
7
 * @package   Services
7
 * @package   Services
8
 * @package   Bibliotheque
8
 * @package   Bibliotheque
9
 * @version   0.1
9
 * @version   0.1
10
 * @author    Mathias CHOUET <mathias@tela-botanica.org>
10
 * @author    Mathias CHOUET <mathias@tela-botanica.org>
11
 * @author    Jean-Pascal MILCENT <jpm@tela-botanica.org>
11
 * @author    Jean-Pascal MILCENT <jpm@tela-botanica.org>
12
 * @author    Aurelien PERONNET <aurelien@tela-botanica.org>
12
 * @author    Aurelien PERONNET <aurelien@tela-botanica.org>
13
 * @license   GPL v3 <http://www.gnu.org/licenses/gpl.txt>
13
 * @license   GPL v3 <http://www.gnu.org/licenses/gpl.txt>
14
 * @license   CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
14
 * @license   CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
15
 * @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
15
 * @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
16
*/
16
*/
17
class Contexte {
17
class Contexte {
18
 
18
 
19
	private $conteneur;
19
	private $conteneur;
20
	private $get;
20
	private $get;
21
	private $getBrut;
21
	private $getBrut;
22
	private $post;
22
	private $post;
23
	private $session;
23
	private $session;
24
	private $cookie;
24
	private $cookie;
25
	private $server;
25
	private $server;
26
	private $urlRessource;
26
	private $urlRessource;
27
 
27
 
28
	private $mapping = array('getPhp' => 'get',
28
	private $mapping = array('getPhp' => 'get',
29
		'getQS' => 'getBrut',
29
		'getQS' => 'getBrut',
30
		'getPost' => 'post',
30
		'getPost' => 'post',
31
		'getServer' => 'server',
31
		'getServer' => 'server',
32
		'getSession' => 'session',
32
		'getSession' => 'session',
33
		'getCookie' => 'cookie',
33
		'getCookie' => 'cookie',
34
		'getRessource' => 'urlRessource',
34
		'getRessource' => 'urlRessource',
35
		'setCookie' => 'cookie');
35
		'setCookie' => 'cookie');
36
 
36
 
37
	public function __construct($conteneur, &$server, &$get, &$post, &$session, &$cookie) {
37
	public function __construct($conteneur, &$server, &$get, &$post, &$session, &$cookie) {
38
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
38
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
39
		$this->server = $server;
39
		$this->server = $server;
40
		$this->get = $this->nettoyerParametres($get);
40
		$this->get = $this->nettoyerParametres($get);
41
		$this->getBrut = $this->recupererParametresBruts();
41
		$this->getBrut = $this->recupererParametresBruts();
42
		$this->post = $post;
42
		$this->post = $post;
43
		$this->session = $session;
43
		$this->session = $session;
44
		$this->cookie = $cookie;
44
		$this->cookie = $cookie;
45
		$this->urlRessource = $this->decouperUrlChemin();
45
		$this->urlRessource = $this->decouperUrlChemin();
46
	}
46
	}
47
 
47
 
48
	public function __call($nom, $arguments) {
48
	public function __call($nom, $arguments) {
49
		if (!isset($this->mapping[$nom])) {
49
		if (!isset($this->mapping[$nom])) {
50
			$msg = "La méthode $nom n'existe pas dans l'objet {get_class()}";
50
			$msg = "La méthode $nom n'existe pas dans l'objet {get_class()}";
51
			throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
51
			throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
52
		}
52
		}
53
		$attributNom = $this->mapping[$nom];
53
		$attributNom = $this->mapping[$nom];
54
		$data = $this->$attributNom;
54
		$data = $this->$attributNom;
55
 
55
 
56
		if (substr($nom, 0, 3) == 'get') {
56
		if (substr($nom, 0, 3) == 'get') {
57
			$cle = isset($arguments[0]) ? $arguments[0] : null;
57
			$cle = isset($arguments[0]) ? $arguments[0] : null;
58
			return $this->getGenerique($data, $cle);
58
			return $this->getGenerique($data, $cle);
59
		} else if (substr($nom, 0, 3) == 'set') {
59
		} else if (substr($nom, 0, 3) == 'set') {
60
			$cle = isset($arguments[0]) ? $arguments[0] : null;
60
			$cle = isset($arguments[0]) ? $arguments[0] : null;
61
			$valeur = isset($arguments[1]) ? $arguments[1] : null;
61
			$valeur = isset($arguments[1]) ? $arguments[1] : null;
62
			return $this->setGenerique($data, $cle, $valeur);
62
			return $this->setGenerique($data, $cle, $valeur);
63
		}
63
		}
64
	}
64
	}
65
 
65
 
66
	private function getGenerique($data, $cle) {
66
	private function getGenerique($data, $cle) {
67
		$retour = null;
67
		$retour = null;
68
		if ($cle === null) {
68
		if ($cle === null) {
69
			$retour = $data;
69
			$retour = $data;
70
		} else if (isset($data[$cle])) {
70
		} else if (isset($data[$cle])) {
71
			$retour = $data[$cle];
71
			$retour = $data[$cle];
72
		}
72
		}
73
		return $retour;
73
		return $retour;
74
	}
74
	}
75
 
75
 
76
	private function setGenerique($data, $cle, $valeur) {
76
	private function setGenerique($data, $cle, $valeur) {
77
		if ($valeur === null) {
77
		if ($valeur === null) {
78
			unset($data[$cle]);
78
			unset($data[$cle]);
79
		} else {
79
		} else {
80
			$data[$cle] = $valeur;
80
			$data[$cle] = $valeur;
81
		}
81
		}
82
	}
82
	}
83
 
83
 
84
	private function nettoyerParametres(Array $parametres) {
84
	private function nettoyerParametres(Array $parametres) {
85
		// Pas besoin d'utiliser urldecode car déjà fait par php pour les clés et valeur de $_GET
85
		// Pas besoin d'utiliser urldecode car déjà fait par php pour les clés et valeur de $_GET
86
		if (isset($parametres) && count($parametres) > 0) {
86
		if (isset($parametres) && count($parametres) > 0) {
87
			foreach ($parametres as $cle => $valeur) {
87
			foreach ($parametres as $cle => $valeur) {
88
				// les quotes, guillements et points-virgules ont été retirés des caractères à vérifier car
88
				// les quotes, guillements et points-virgules ont été retirés des caractères à vérifier car
89
				//ça n'a plus lieu d'être maintenant que l'on utilise protéger à peu près partout
89
				//ça n'a plus lieu d'être maintenant que l'on utilise protéger à peu près partout
90
				$verifier = array('NULL', "\\", "\x00", "\x1a");
90
				$verifier = array('NULL', "\\", "\x00", "\x1a");
91
				$parametres[$cle] = strip_tags(str_replace($verifier, '', $valeur));
91
				$parametres[$cle] = strip_tags(str_replace($verifier, '', $valeur));
92
			}
92
			}
93
		}
93
		}
94
		return $parametres;
94
		return $parametres;
95
	}
95
	}
96
 
96
 
97
	private function recupererParametresBruts() {
97
	private function recupererParametresBruts() {
98
		$parametres_bruts = array();
98
		$parametres_bruts = array();
99
		if (isset($this->server['QUERY_STRING']) && !empty($this->server['QUERY_STRING'])) {
99
		if (isset($this->server['QUERY_STRING']) && !empty($this->server['QUERY_STRING'])) {
100
			$paires = explode('&', $this->server['QUERY_STRING']);
100
			$paires = explode('&', $this->server['QUERY_STRING']);
101
			foreach ($paires as $paire) {
101
			foreach ($paires as $paire) {
-
 
102
				if ($paire != '' && substr_count($paire, '=') == 1) {
102
				$nv = explode('=', $paire);
103
					$nv = explode('=', $paire);
103
				$nom = urldecode($nv[0]);
104
					$nom = urldecode($nv[0]);
104
				$valeur = urldecode($nv[1]);
105
					$valeur = urldecode($nv[1]);
105
				$parametres_bruts[$nom] = $valeur;
106
					$parametres_bruts[$nom] = $valeur;
-
 
107
				}
106
			}
108
			}
107
			$parametres_bruts = $this->nettoyerParametres($parametres_bruts);
109
			$parametres_bruts = $this->nettoyerParametres($parametres_bruts);
108
		}
110
		}
109
		return $parametres_bruts;
111
		return $parametres_bruts;
110
	}
112
	}
111
 
113
 
112
	private function decouperUrlChemin() {
114
	private function decouperUrlChemin() {
113
		if (isset($this->server['REDIRECT_URL']) && $this->server['REDIRECT_URL'] != '') {
115
		if (isset($this->server['REDIRECT_URL']) && $this->server['REDIRECT_URL'] != '') {
114
			if (isset($this->server['REDIRECT_QUERY_STRING']) && !empty($this->server['REDIRECT_QUERY_STRING'])) {
116
			if (isset($this->server['REDIRECT_QUERY_STRING']) && !empty($this->server['REDIRECT_QUERY_STRING'])) {
115
				$url = $this->server['REDIRECT_URL'].'?'.$this->server['REDIRECT_QUERY_STRING'];
117
				$url = $this->server['REDIRECT_URL'].'?'.$this->server['REDIRECT_QUERY_STRING'];
116
			} else {
118
			} else {
117
				$url = $this->server['REDIRECT_URL'];
119
				$url = $this->server['REDIRECT_URL'];
118
			}
120
			}
119
		} else {
121
		} else {
120
			$url = $this->server['REQUEST_URI'];
122
			$url = $this->server['REQUEST_URI'];
121
		}
123
		}
122
 
124
 
123
		$tailleQueryString = strlen($this->server['QUERY_STRING']);
125
		$tailleQueryString = strlen($this->server['QUERY_STRING']);
124
		$tailleURL = ($tailleQueryString == 0) ?  strlen($url) : -($tailleQueryString + 1);
126
		$tailleURL = ($tailleQueryString == 0) ?  strlen($url) : -($tailleQueryString + 1);
125
 
127
 
126
		$urlChaine = '';
128
		$urlChaine = '';
127
		if (strpos($url, $this->conteneur->getParametre('serveur.baseURL')) !== false) {
129
		if (strpos($url, $this->conteneur->getParametre('serveur.baseURL')) !== false) {
128
			$urlChaine = substr($url, strlen($this->conteneur->getParametre('serveur.baseURL')), $tailleURL);
130
			$urlChaine = substr($url, strlen($this->conteneur->getParametre('serveur.baseURL')), $tailleURL);
129
		} else if (strpos($url, $this->conteneur->getParametre('serveur.baseAlternativeURL')) !== false) {
131
		} else if (strpos($url, $this->conteneur->getParametre('serveur.baseAlternativeURL')) !== false) {
130
			$urlChaine = substr($url, strlen($this->conteneur->getParametre('serveur.baseAlternativeURL')), $tailleURL);
132
			$urlChaine = substr($url, strlen($this->conteneur->getParametre('serveur.baseAlternativeURL')), $tailleURL);
131
		}
133
		}
132
		return explode('/', $urlChaine);
134
		return explode('/', $urlChaine);
133
	}
135
	}
134
}
136
}