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 mapfileAction($contexte_id, $profil_id = null, $utilisateur_id = null) { $igo_contexte = IgoContexte::findFirstByid($contexte_id); if (!$igo_contexte) { $this->flash->error("Contexte non-trouvé"); return $this->dispatcher->forward(array("controller" => "igo_contexte", "action" => "search")); } $contexte = $igo_contexte->toArray(); $couches = array(); // $igo_couches = $igo_contexte->getCouches(); $contexte["wms_onlineresource"] = $this->view->host . $igo_contexte->mf_map_meta_onlineresource; if (is_numeric($igo_contexte->mf_map_projection)) { $contexte["mf_map_projection"] = "\"init=epsg:" . $igo_contexte->mf_map_projection . "\""; } else { if (trim($igo_contexte->mf_map_projection) != '') { $contexte["mf_map_projection"] = $igo_contexte->mf_map_projection; if ($contexte["mf_map_projection"] != "") { $contexte["mf_map_projection"] = str_replace('"', "\t\t\t", str_replace('" ', '\\n ', $contexte["mf_map_projection"])); } } } $contexteCouches = IgoVueContexteCoucheNavigateur::find(array("conditions" => "contexte_id={$contexte_id}", "order" => array("mf_layer_meta_group_title", "mf_layer_meta_title"))); // Il faut trier les classes par mf_class_z_order, c'est impossible de // le faire avec l'orm ou encore avec le volt... Il faudrait étendre volt // pour y ajouter une fonction usort, préférable d'utiliser la BD pour le sort... // http://docs.phalconphp.com/en/latest/reference/volt.html#extending-volt $couchesClasses = array(); foreach ($contexteCouches as $contexteCouche) { $classes = IgoClasse::find(array("conditions" => "couche_id={$contexteCouche->couche_id}", "order" => array("mf_class_z_order"))); $couchesClasses[$contexteCouche->couche_id] = $classes; } $mapfileInclude = ''; if (isset($this->config->mapserver->mapfileInclude)) { foreach ($this->config->mapserver->mapfileInclude as $chemin) { $mapfileInclude .= parent::fopen_file_get_contents($chemin); } } $this->view->mapfileInclude = $mapfileInclude; $this->view->couchesClasses = $couchesClasses; $this->view->contexteCouches = $contexteCouches; $this->view->contexte = $contexte; $this->view->preview = true; return array($contexte, $couches); }