Changeset 44001 in spip-zone


Ignore:
Timestamp:
Jan 30, 2011, 11:44:33 AM (9 years ago)
Author:
jean-marc.viglino@…
Message:

[BUG] Securisation du proxy (-> action/geoproxy.php).
[MAJ] Passage en API 1.2 (OpenLayers? 2.10)

Location:
_plugins_/spip_geoportail
Files:
3 added
6 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/spip_geoportail/balise/geoportail_balises.php

    r43490 r44001  
    2020**/
    2121// La version de l'API Geoportail qu'on utilise
    22 define('_API_GEOPORTAIL_VERSION', "1.1");
     22define('_API_GEOPORTAIL_VERSION', "1.2");
    2323
    2424if (!defined("_ECRIRE_INC_VERSION")) return;    #securite
     
    7878}
    7979
    80 // RGC utilise
     80// Protection des scripts
    8181function balise_GEOPORTAIL_PROTECT($p)
    82 {       $param = interprete_argument_balise(1,$p);
     82{       // faire un cache par session
     83        $p->descr['session'] = true;
     84        // Parametre
     85        $param = interprete_argument_balise(1,$p);
    8386        // Code...
    8487        $p->code = "geoportail_protect($param)";
  • _plugins_/spip_geoportail/css/geoportail_carte.css

    r39814 r44001  
    1919.gpGroupDivClass
    2020{       max-height:350px;
     21}
     22
     23.gpControlPanelToggleItemInactive
     24{       background-image: url("picto_options_off.png");
     25}
     26.gpControlPanelToggleItemActive
     27{       background-image: url("picto_options_on.png");
    2128}
    2229
  • _plugins_/spip_geoportail/inc/geoportail_fonctions.php

    r41869 r44001  
    1919include_spip('inc/compat_192');
    2020include_spip('public/geoportail_profils');
     21
     22/** Recalcule sur chaque page (hors cache)
     23 - pseudo balise _SPIP_GEOPORATAIL_HASH_ qui doit etre calcule sur chaque page
     24*/
     25function geoportail_affichage_final($page)
     26{       // Inclure le hash code de maniere dynamique
     27        charger_fonction('securiser_action','inc');
     28        $action = calculer_action_auteur('geoportail');
     29        return str_replace("<!_SPIP_GEOPORTAIL_HASH_!>",$action,$page);
     30}
    2131
    2232/**
  • _plugins_/spip_geoportail/modeles/geoportail.html

    r39814 r44001  
    6464[<script type="text/javascript" src="(#CHEMIN{js/Layer/Locator.js})"></script>]
    6565[<script type="text/javascript" src="(#CHEMIN{js/Layer/GXT.js})"></script>]
    66 <script>jQuery.geoportail.hash = "[(#GEOPORTAIL_PROTECT{geoportail})]";</script>
     66<script>jQuery.geoportail.hash = "<!_SPIP_GEOPORTAIL_HASH_!>";</script>
    6767]
    6868<script language=javascript>
     
    7676                        map = this.map = map#ENV{id_geoportail,0};
    7777                       
    78                         map.getMap().setProxyUrl("#CHEMIN{php/proxy.php}?url=");
    79                         //map.getMap().setProxyUrl("spip.php?page=geoproxy&hash=#GEOPORTAIL_PROTECT{geoproxy}&url=");
     78                        //map.getMap().setProxyUrl("#CHEMIN{php/proxy.php}?url=");
     79                        map.getMap().setProxyUrl("?action=geoproxy&hash=<!_SPIP_GEOPORTAIL_HASH_!>&url=");
    8080                        // Affichage de la carte
    8181                        jQuery.geoportail.showMap (map, '#GET{zone}', Number('#LON'), Number('#LAT'), Number('#ZOOM'), '#LAYERCTRL', '#TOOLBOX', '#INFOBOX', '#CARTO', '#ORTHO');
  • _plugins_/spip_geoportail/php/proxy.php

    r39814 r44001  
    11<?php
    2 // proxy http
    3 // auteur: Marc Gauthier
    4 // 02/09/2009
    5 // les erreurs dans les log du serveur
    6 // http://www.papygeek.com/download/53/
    7 // Transfer-Encoding: chunked
    8 //
    9 // Didier Richard - IGN - dérivation pour publication
    10 // (c) IGN 2010
    11 // License : http://creativecommons.org/licenses/by-nc-sa/2.0/fr/
    12 
    13     // ----------------------------------------------------------
    14     // global variables :
    15     $debug= 1;
    16     $debug_html= 0;
    17     $sUrl= '';
    18     $sReponse= '';
    19     // via un proxy d'entreprise/IP
    20     $proxy_host= '';
    21     $proxy_port= 80;
    22     $content_types= array(
    23         'application/vnd.google-earth.kml+xml',
    24         'application/vnd.google-earth.kml',
    25         //'application/vnd.google-earth.kmz', # TODO needs to unzip response ...
    26         'application/vnd.ogc.se_xml',
    27         'application/vnd.ogc.wms_xml',
    28         'application/vnd.ogc.wfs_xml',
    29         'application/vnd.ogc.gml',
    30         'application/soap+xml',
    31         'application/xml',
    32         'text/xml',
    33         'text/plain',
    34         'text/html');
    35     // ----------------------------------------------------------
    36 
    37     //
    38     // écriture d'un message de log
    39     function carp($msg) {
    40         global $debug;
    41         if ($debug) {
    42             if ($debug_html) {
    43                 print "__FILE__.:$msg.<br>\n";
    44             }
    45             error_log(__FILE__.": $msg", 0);
    46         }
    47     }
    48 
    49     //
    50     // écriture d'un message de log et erreur http
    51     function confess($msg) {
    52         carp($msg);
    53         header("HTTP/1.0 500 $msg");
    54         exit;
    55     }
    56 
    57     //
    58     // mode chunk
    59     function unchunk($result) {
    60         return preg_replace_callback(
    61             '/(?:(?:\r\n|\n)|^)([0-9A-F]+)(?:\r\n|\n){1,2}(.*?)'.
    62             '((?:\r\n|\n)(?:[0-9A-F]+(?:\r\n|\n))|$)/si',
    63             create_function(
    64                 '$matches',
    65                 'return hexdec($matches[1]) == strlen($matches[2]) ? $matches[2] : $matches[0];'
    66             ),
    67             $result
    68         );
    69     }
    70 
    71     //
    72     // la fonction proxy
    73     // 2 grandes étapes:
    74     // - émission de la requête
    75     // - réception de la réponse
    76     function proxy($sUrl) {
    77         global $proxy_host, $proxy_port, $chunked, $content_types;
    78         //
    79         // analyse de l'url et construction de la requête
    80         $sUrl= urldecode($sUrl);
    81         $referrer= $_SERVER["HTTP_REFERER"];
    82         $userAgent= $_SERVER["HTTP_USER_AGENT"];
    83         $aUrl= @parse_url($sUrl);
    84         if (!isset($aUrl['scheme'])) {
    85             //try absolute and relative path:
    86             confess("proxy scheme missing");
    87         }
    88         // construction de la requete
    89         $acceptH= $_SERVER['HTTP_ACCEPT'];
    90         $pragmaH= $_SERVER['HTTP_PRAGMA'];
    91         $cacheControlH= $_SERVER['HTTP_CACHE_CONTROL'];
    92         $acceptLanguageH= $_SERVER['HTTP_ACCEPT_CHARSET'];
    93         $keepAliveH= $_SERVER['HTTP_KEEP_ALIVE'];
    94         #$acceptEncodingH= $_SERVER['HTTP_ACCEPT_ENCODING'];//TODO decompression
    95         #$connectionH= $_SERVER['HTTP_CONNECTION'];
    96         $SOAPActionH= $_SERVER['HTTP_SOAPACTION'];
    97         $acceptCharsetH= $_SERVER['HTTP_ACCEPT_CHARSET'];
    98         $gppKeyH= $_SERVER['HTTP_GPPKEY'];#if gppKey in HTTP Header
    99         $Hs= "Host: ".$aUrl['host'].($aUrl['port']? ":".$aUrl['port'] : "")."\r\n"
    100             . (strlen($acceptH)>0? "Accept: ".$acceptH : join(",", $content_types))."\r\n"
    101             . (strlen($pragmaH)>0? "Pragma: ".$pragmaH."\r\n" : "")
    102             . (strlen($cacheControlH)>0? "Cache-Control: ".$cacheControlH."\r\n" : "")
    103             . (strlen($acceptLanguageH)>0? "Accept-Language: ".$acceptLanguageH."\r\n" : "")
    104             . (strlen($keepAliveH)>0? "Keep-Alive: ".$keepAliveH."\r\n" : "")
    105             #. (strlen($acceptEncodingH)>0? "Accept-Encoding: ".$acceptEncodingH."\r\n" : "")
    106             #. (strlen($connectionH)>0? "Connection: ".$connectionH."\r\n" : "")
    107             . (strlen($SOAPActionH)>0? "SOAPAction: ".$SOAPActionH."\r\n" : "")
    108             . (strlen($acceptCharsetH)>0? "Accept-Charset: ".$acceptCharsetH."\r\n" : "")
    109             . (strlen($gppKeyH)>0? "gppkey: ".$gppKeyH."\r\n" : "")
    110             . (strlen($referrer)>0? "Referer: ".$referrer."\r\n" : "")
    111             . (strlen($userAgent)>0? "User-Agent: ".$userAgent."\r\n" : "")
    112             ;
    113         carp($Hs);
    114         if ($_SERVER["REQUEST_METHOD"]==='GET') {
    115             $sReq= "GET $sUrl HTTP/1.0\r\n"
    116                  . $Hs
    117                  ;
    118         } else {
    119             if ($_SERVER["REQUEST_METHOD"]==='POST') {
    120                 $data= '';
    121                 if (count($_POST)){
    122                     while (list($key, $val)= each($_POST)){
    123                         $data.="$key : $val\n";
    124                     }
    125                 } else {
    126                     $data= trim(file_get_contents('php://input'));
    127                 }
    128                 $sReq= "POST $sUrl HTTP/1.0\r\n"
    129                      . $Hs
    130                      . "Content-Type: text/xml\r\n"
    131                      . "Content-length: ".strlen($data)."\r\n"
    132                      . "\r\n"
    133                      . $data
    134                      ;
    135             }
    136         }
    137         $sReq.= "\r\n";
    138         if (empty($proxy_host)) {
    139             $host= $aUrl["host"];
    140             $port= $aUrl["port"] ? $aUrl["port"] : 80;
    141         } else {
    142             $host= $proxy_host;
    143             $port= $proxy_port;
    144         }
    145         // envoi de la requête
    146         carp("host:$host port:$port url:$sUrl");
    147         $fp= @fsockopen($host, $port, $errno, $errstr, 5);
    148         if (!$fp) {
    149             confess("fsockopen failed: $errstr ($errno)");
    150         }
    151         carp("sReq:$sReq");
    152         fwrite($fp, $sReq);
    153         // attente de la réponse
    154         $headers= '';
    155         $sReponse= '';
    156         ob_start();
    157         while (!feof($fp)) {
    158             $sReponse.= fread($fp, 4096);
    159         }
    160         fclose ($fp);
    161         $eoh= strpos($sReponse, "\r\n\r\n");
    162         $headers= substr($sReponse, 0, $eoh);
    163         $sReponse= substr($sReponse, $eoh+4);
    164         $Hs= preg_split('/(?:\r\n|\n)/', $headers);
    165         carp("Hs=[".count($Hs)."]");
    166         for ($i= 0, $l= count($Hs); $i<$l; $i++) {
    167             if (preg_match('/^Content-Length/i', $Hs[$i])) {
    168                 continue;
    169             }
    170             if (preg_match('/^Transfer-Encoding: chunked/i', $Hs[$i])) {
    171                 // Transfer-Encoding: chunked
    172                 carp("chunked response");
    173                 $sReponse= unchunck($sReponse);
    174                 continue;
    175             }
    176             #carp("header=[$Hs[$i]]");
    177             header($Hs[$i]);
    178         }
    179         header("Content-Length: ".strlen($sReponse));
    180         print $sReponse;
    181     }
    182 
    183     // ----------------------------------------------------------
    184     // programme principal:
    185     // on accept que GET/POST (pour l'instant)
    186     if (($_SERVER["REQUEST_METHOD"]==='GET' or $_SERVER["REQUEST_METHOD"]==='POST') &&
    187         (isset($_REQUEST["url"]) && strlen($_REQUEST["url"])>0)) {
    188         $sUrl= substr($_SERVER["QUERY_STRING"],4);
    189         carp("Proxying:$sUrl");
    190         proxy($sUrl);
    191         exit;
    192     }
    193     // on ne traite pas la demande :
    194     carp("REQUEST_METHOD:".$_SERVER["REQUEST_METHOD"]." QUERY_STRING:".$_SERVER["QUERY_STRING"] );
    195     if ($debug) {
    196         phpinfo(INFO_VARIABLES);
    197     }
    198     exit;
    199     // ----------------------------------------------------------
     2/***
     3* Code supprime -> remplace par action/geoproxy.php securisee
     4**/
    2005?>
  • _plugins_/spip_geoportail/plugin.xml

    r40098 r44001  
    5858                <inclure>geoportail.php</inclure>
    5959        </pipeline>
     60        <pipeline>
     61                <nom>affichage_final</nom>
     62                <inclure>geoportail.php</inclure>
     63        </pipeline>
    6064        <pipeline> <!-- seulement en SPIP v2 -->
    6165                <nom>afficher_contenu_objet</nom>
Note: See TracChangeset for help on using the changeset viewer.