function wms_proxy($contexteId) { global $app; $httprequest = new Phalcon\Http\Request(); $httprequest->setDI($app->getDI()); //Possible sanitize filters: string, email, int, float, alphanum, striptags, trim, lower, upper $filter = new \Phalcon\Filter(); if ($httprequest->isGet() || $httprequest->isPost()) { $datain = $httprequest->get(); $data = array(); foreach ($datain as $key => $value) { $data[strtoupper($key)] = $value; } $service = $filter->sanitize($data["SERVICE"], array("string", "upper")); $request = $filter->sanitize($data["REQUEST"], array("string", "upper")); } else { // TODO : Gérer l'erreur, on ne peut appeler un service wms en put ou en delete. error_log("not a get or a post?"); return; } error_log("service: {$service}, request: {$request}"); if ($service === "WMS") { $config = $app->getDI()->get("config"); $mapserver = $config['mapserver']['host'] . $config['mapserver']['mapserver_path'] . $config['mapserver']['executable']; $contexte = IgoContexte::findFirst("id='{$contexteId}'"); $map = $config['mapserver']['mapfileCacheDir'] . $config['mapserver']['contextesCacheDir'] . $contexte->code . ".map"; $method = $httprequest->getMethod(); $data = $httprequest->get(); $data["MAP"] = $map; $response = null; switch ($request) { case "GETCAPABILITIES": $response = proxy_request($mapserver, $data, $method); // Devrait-on enlever les couches non permises en lecture de la réponse.? C'est probablement trop complexe... break; case "GETMAP": case "GETFEATUREINFO": case "DESCRIBELAYER": case "GETLEGENDGRAPHIC": $authentificationModule = obtenirAuthentificationModule(); if ($authentificationModule === null) { $response = proxy_request($mapserver, $data, $method); } else { if (isset($data["LAYERS"])) { $couches = explode(",", $data["LAYERS"]); } else { $couches = explode(",", $data["LAYER"]); } foreach ($couches as $couche) { $igoVueContexteCoucheNavigateur = IgoVueContexteCoucheNavigateur::findFirst("mf_layer_name='{$couche}'"); $coucheContexte = array($igoVueContexteCoucheNavigateur); if ($igoVueContexteCoucheNavigateur === false) { $coucheContexte = IgoVueContexteCoucheNavigateur::find("mf_layer_group='{$couche}' and contexte_id='{$contexteId}'"); } if (count($coucheContexte) === 0) { // L'utilisateur essaie d'appeler la couche root du mapfile qui consiste à toutes les couches. // Nous interdissons ce type d'appels pour le moment. die("Forbidden"); } $estPermis = false; foreach ($coucheContexte as $igoVueContexteCoucheNavigateur) { $permission = obtenirPermission($igoVueContexteCoucheNavigateur->couche_id); if ($permission !== null && $permission->est_lecture) { $estPermis = true; break; } } if (!$estPermis) { die("Forbidden"); } } $response = proxy_request($mapserver, $data, $method); } break; default: break; } $headerArray = explode("\r\n", $response["header"]); foreach ($headerArray as $headerLine) { header($headerLine); } echo $response["content"]; } else { die("Seul les services WMS sont pris en charge par ce proxy."); } }
public function contexteAction($code) { $this->definirVariablesCommunes(); $this->view->setVar("titre", "Navigateur"); if (isset($this->getDi()->getConfig()->configurations["defaut"])) { $xmlPath = $this->getDi()->getConfig()->configurations["defaut"]; } else { $xmlPath = $this->getDi()->getConfig()->configurationsDir . "defaut" . '.xml'; } $filemtime = filemtime($xmlPath); $this->view->setVar("configuration", "defaut?v={$filemtime}"); $this->view->setVar("couche", "null"); $type = "id"; if (!is_numeric($code)) { $type = "code"; $contexte = IgoContexte::findFirst("{$type}='{$code}'"); } else { $contexte = IgoContexte::findFirst("{$type}={$code}"); } $this->view->setVar("contexteCode", "null"); $this->view->setVar("contexteId", "null"); if ($contexte) { $this->view->setVar("contexte" . ucfirst($type), $code . "?v=" . md5($contexte->date_modif)); } else { $this->view->setVar("avertissement", "Le contexte avec le {$type}:{$code} n'existe pas"); } }
public function deleteAction($id, $r_controller = null, $r_action = null, $r_id = null) { $igoContexte = IgoContexte::findFirst($id); $mapServerConfig = $this->getDI()->getConfig()->mapserver; $fileName = $mapServerConfig->mapfileCacheDir . $mapServerConfig->contextesCacheDir . $igoContexte->code . ".map"; if (file_exists($fileName)) { unlink($fileName); } parent::deleteAction($id, $r_controller, $r_action, $r_id); }