UNPKG

7.97 kBapplication/x-httpd-phpView Raw
1<?php
2/**
3 * Ce fichier PHP permet d'appeler les services qui se trouvent dans le
4 * sous-répertoire "svc".
5 * Voici les paramètres attendus :
6 * - "s" (service) : Nom du service.
7 * - "i" (input) :
8 * Le retour est une chaîne de caractères qui représente, quand tout se passe bien, un JSON.
9 * Si l'utilisateur n'a pas le role pour accéder à un service, le premier caractère sera un "!".
10 * Tout autre exception sera précédée du caractère "#".
11 */
12ob_start();
13
14// Cross Site Origin.
15//header('Access-Control-Allow-Origin: *');
16header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
17header('Access-Control-Allow-Credentials: true');
18header('Access-Control-Allow-Methods: POST, GET, PUT, OPTIONS');
19header('Access-Control-Max-Age: 900');
20
21date_default_timezone_set("Europe/Paris");
22
23class FatalException extends Exception {}
24
25function fatal($code, $message="") {
26 throw new FatalException($message, $code);
27}
28
29// Protection contre les modification de quotes selon la config du serveur PHP.
30if (get_magic_quotes_gpc()) {
31 $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
32 while (list($key, $val) = each($process)) {
33 foreach ($val as $k => $v) {
34 unset($process[$key][$k]);
35 if (is_array($v)) {
36 $process[$key][stripslashes($k)] = $v;
37 $process[] = &$process[$key][stripslashes($k)];
38 } else {
39 $process[$key][stripslashes($k)] = stripslashes($v);
40 }
41 }
42 }
43 unset($process);
44}
45
46
47class SystemData {
48 var $datadir = '';
49 var $locks = Array();
50
51 function SystemData($datadir) {
52 $this->datadir = dirname(__file__).'/'.$datadir.'/';
53 if (!file_exists($datadir)) {
54 @mkdir($datadir, 0777, true);
55 }
56 }
57
58 function setRoot($dir) {
59 $this->datadir .= $dir . '/';
60 if (!file_exists($this->datadir)) {
61 @mkdir($datadir, 0777, true);
62 }
63 }
64
65 function __destruct() {
66 foreach ($this->locks as $key => $fd) {
67 echo "Releasing lock on \"$key\" : ";
68 flock($fd, LOCK_UN);
69 fclose($fd);
70 echo "done!\n";
71 }
72 }
73
74 function lock($filename) {
75 if (array_key_exists($filename, $this->locks)) {
76 return;
77 }
78
79 $fd = fopen($this->getPath($filename . ".lock"), "w");
80 while (!flock($fd, LOCK_EX)) {
81 usleep(10000); // sleep for 0.01 second
82 }
83 $this->locks[$filename] = $fd;
84 }
85
86 function unlock($filename) {
87 if (array_key_exists($filename, $this->locks)) {
88 flock($this->locks[$filename], LOCK_UN);
89 fclose($this->locks[$filename]);
90 unset($this->locks[$filename]);
91 }
92 }
93
94 function mkdir($dir) {
95 $dir = $this->datadir . $dir;
96 if (!file_exists($dir)) {
97 @mkdir($dir, 0777, true);
98 }
99 }
100
101 function getPath($filename) {
102 return $this->datadir . $filename;
103 }
104
105 function opendir($dir) {
106 return opendir($this->datadir . $dir);
107 }
108
109 function unlink($filename) {
110 return unlink($this->getPath($filename));
111 }
112
113 function saveText($filename, $data) {
114 if (!file_exists($this->datadir)) {
115 @mkdir($this->datadir, 0777, true);
116 }
117 @file_put_contents($this->datadir.$filename, $data);
118 }
119
120 function saveJSON($filename, $data) {
121 if (!file_exists($this->datadir)) {
122 @mkdir($this->datadir, 0777, true);
123 }
124 @file_put_contents($this->datadir.$filename, json_encode($data));
125 }
126
127 function loadText($filename) {
128 $file = $this->datadir.$filename;
129 if (file_exists($file)) {
130 // L'ajout du paramètre "true" sert à s'assurer que $data
131 // sera bien du type Array et non stdClass.
132 $data = @file_get_contents($file);
133 return $data;
134 } else {
135 echo "Unable to find \"$file\"!\n";
136 return null;
137 }
138 }
139
140 function loadJSON($filename) {
141 $file = $this->datadir.$filename;
142 if (file_exists($file)) {
143 // L'ajout du paramètre "true" sert à s'assurer que $data
144 // sera bien du type Array et non stdClass.
145 $data = @json_decode(file_get_contents($file), true);
146 return $data;
147 } else {
148 echo "Unable to find \"$file\"!\n";
149 return null;
150 }
151 }
152};
153
154
155include_once("php/db.inc");
156
157// Cette fonction permet d'éviter d'utiliser des includes
158// pour chaque classe que l'on souhaite utiliser.
159// Si, lors d'un new, la classe n'est pas connue alors
160// l'include se fera comme spécifié dans cette fonction.
161function __autoload($class_name) {
162 include 'php/' . $class_name . '.php';
163}
164
165echo "<pre style='border: 1px solid black'>";
166echo date("d/m/Y H:i:s");
167echo " (from " . $_SERVER["REMOTE_ADDR"] . ")\n";
168print_r($_REQUEST);
169echo "<hr/>\n";
170
171@session_start();
172
173echo SID . "<br/>\n";
174
175@$service = $_REQUEST['s'];
176// Vérification de la validité du nom de service.
177// Il ne doit contenir que des lettres, des chiffres et des points.
178for ($i=0 ; $i<strlen($service) ; $i++) {
179 $c = $service[$i];
180 if ($c == '.') continue;
181 if ($c >= '0' && $c <= '9') continue;
182 if ($c >= 'a' && $c <= 'z') continue;
183 if ($c >= 'A' && $c <= 'Z') continue;
184 // On a détecté un nom de service invalide.
185 die("Invalid service name: $service");
186}
187
188// Paramètre d'entrée.
189echo "Input = " . $_REQUEST['i'] . "\n";
190@$input = json_decode($_REQUEST['i'], true);
191/*
192 switch (json_last_error()) {
193 case JSON_ERROR_DEPTH:
194 echo ' - Profondeur maximale atteinte';
195 break;
196 case JSON_ERROR_STATE_MISMATCH:
197 echo ' - Inadéquation des modes ou underflow';
198 break;
199 case JSON_ERROR_CTRL_CHAR:
200 echo ' - Erreur lors du contrôle des caractères';
201 break;
202 case JSON_ERROR_SYNTAX:
203 echo ' - Erreur de syntaxe ; JSON malformé';
204 break;
205 case JSON_ERROR_UTF8:
206 echo ' - Caractères UTF-8 malformés, probablement une erreur d\'encodage';
207 break;
208 default:
209 echo ' - Erreur inconnue';
210 break;
211 }
212 */
213$output = Array();
214
215// Déclarer les objets d'accès aux donées publiques et privées.
216
217// Inclure le code du service qui doit fournir une fonction execService().
218// Il doit aussi redéfinir la variable $ROLE qui donne le role nécessaire
219// à l'appel de ce service. Si $ROLE est vide, tout le monde est autorisé.
220$ROLE = microtime(); // Random role for security reason.
221include "svc/$service.php";
222
223$json = "null";
224$user = new User();
225if ($user->hasRole($ROLE)) {
226 try {
227 $json = json_encode(execService($input, $user));
228 }
229 catch (FatalException $e) {
230 $json = "#" + json_encode(Array("id" => $e->getCode(),
231 "msg" => $e->getMessage()));
232 }
233 catch (Exception $e) {
234 $msg = $e->getMessage();
235 echo "<pre>";
236 echo $msg;
237 echo "</pre>\n";
238 if( substr( $msg, 0, 1 ) == '!' ) {
239 // This is a message that asks for login.
240 $json = $msg;
241 } else {
242 $json = "#null";
243 }
244 }
245} else {
246 $json = "!" . json_encode($ROLE);
247}
248// Fermer la connexion à la base de données.
249$DB = null;
250
251echo "<hr/>\n";
252echo $json;
253echo "</pre>";
254
255$output = ob_get_clean();
256$logfile = "pri/services.log.html";
257if (file_exists($logfile)) {
258 $t = time() - filemtime($logfile);
259 if ($t > 15) {
260 @unlink($logfile);
261 file_put_contents($logfile, "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />");
262 }
263}
264error_log($output, 3, $logfile);
265
266// Paramètre de sortie.
267echo $json;
268?>