예제 #1
0
파일: index.php 프로젝트: nbtetreault/igo
 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.");
     }
 }
예제 #2
0
 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);
 }