Gmane
Favicon
From: Francois Legrand <legrand <at> iap.fr>
Subject: [Fwd: Re: Butiner des répertoires dans un environnement SPIP]
Newsgroups: gmane.comp.web.spip.user, gmane.comp.web.spip.devel
Date: 2003-12-08 11:49:28 GMT (4 years, 51 weeks, 3 days, 19 hours and 21 minutes ago)

Salut,
Bon, voici ma méthode pour browser des répertoires dans spip, voire 
afficher carrément un autre site à l'intérieur du mien.
J'ai pas encore "nettoyé" le  code... donc ça marche mais c'est  assez 
crade because ca sort direct de la fonderie :-) .
Le principe est le suivant:
J'ai crée un article (le no 46 dans mon cas) qui doit faire afficher le 
répertoire à browser. J'ai donc crée un squelette spécifique pour
cet article et modifié le article.php3 pour utiliser ce squelette.
On passe une variable contenant l'addresse absolue du répertoire ou de 
la page à insérer.
Je vérifie que la page ou le répertoire demandé est autorisé (sinon, 
virtuellement ma méthode permet d'afficher
n'importe quelle page web, par ex un site de cul, au milieu du site).
J'ouvre un socket sur l'addresse du répertoire à browser (mais ça peut 
aussi être une page web, voir un site).
Je récupére le code html de la page (si c'est un répertoire, c'est 
apache qui le génère). Je ne garde que ce qui se
trouve entre les balises <body> et </body> (de façon à avoir un résultat 
final en html bien formé, cad à peu près W3C compliant).
Je réécrit les liens relatifs en liens absolus et je remet les adresses 
à mon format de façon à autoriser la navigation (c'est à mon sens
le problème de cette méthode).
J'affiche le tout dans mon site.
Bonne chance et je suis preneur pour toute remaque ou suggestion.

Francois

PS:
- Les explications au début de GetURL ne sont pas uptodate...
- J'ai utilisé une base de code trouvée sur le ouaib et fait par 
tahmer <at> free.fr. Je l'ai modificationné pour pouvoir aussi gérer des
authentifications par mots de passe.

----------------- article.php3 -----------
<?php

switch ($id_article){
      case 46:          $fond = "browse_data" ;
                          break;

       default :       $fond = "article";
}

$delais = 0;

include ("inc-public.php3");

?>

------- le squelette browse_data.html  à l'endroit où je veux faire 
afficher le contenu d'un répertoire ou une page exterieure ----------
<?php
                               if 
(!isset($requestedurl)){$requestedurl="http://monsite/repertoire_depart/";};
                               $url=parse_url($requestedurl);

GetUrl($url[host],$url[path],$url[query],"",$page,$tete,"", "");        

                               $page= filtrehtml($page);
                               $page =  rewritelinks($page, 
$PHP_SELF."?".eregi_replace("\&requestedurl.*", "",$argv[0]));
                               echo $page;
?>

------- Mes_fonctions.php3 -----------
// Liste des racines des sites autorisés pour l'affichage dans les pages
$GLOBALS['Authorized_sites']=array(    
"http://monsite/repertoire_depart/" , "http://unautresite/");

// Fonction d'extraction du contenu (ce qui est entre les balises body) 
d'une page html
function filtrehtml($pagehtml){
   if (eregi("< *body[^>]*>(.*)</body[^>]*>",$pagehtml,$regs)){
       return $regs[1];
   }
   else {
       return $pagehtml;
   }
}

/*
***************** VO ********************
GetUrl v1.1
Originally written by tahmer <at> free.fr
Modified by legrand <at> iap.fr
return:
   -1 cant connect
    0 protocol error
    1 ok
mandatory parameters
   $hostwebserver (ie: "www.web.com")

   $urlin        page beginning with "/"  (ie: "/index.html")
   $fl_param parameter which have to be passed to the requested page
   $cookie     list of cookie
     syntax:   [name=value [ ';' name=value]]
   ie:   cookie1=v1
      or
   cookie1=v1; cookie2=v2; ...

output parameters
   $page(out)   content of url
   $header(out) content of header

optional  parameters
   $fl_login         (login and password for basic .htaccess
   $fl_password      authentification protected pages: "" if none )
   $fl_timeout        Timeout for connection

exemple:
login on a web server
the login process send a cookie "MagicNumber" witch is mandatory to
access a database result page
ps: cookie are sent by server in the header
Set-Cookie: name=value;....
$res=readurl("www.webserver.com","/login.cgi?user_name=me&password=mypass","",$page,$header);
if ($res!=1) exit;
$MagicNumber=0;
     if (preg_match("/Set-Cookie:\s+MagicNumber=(\d+)/i", $header, $parts))
    $MagicNumber=$parts[1];
if ($MagicNumber==0) exit;
$res=readurl("www.webserver.com","/result.cgi?query=my_query","MagicNumber=$MagicNumber",$page,$header);
*/

function GetUrl($host 
,$urlin,$fl_param,$cookie,&$page,&$header,$fl_login="", $fl_password="", 
$fl_timeout="30"){

if (site_autorise("http://".$host.$urlin)){
   if ($fl_param==""){$url = $urlin;} else {$url = $urlin."?".$fl_param;};
   $page="";
   $header="";

   $sock=fsockopen($host,80);
   if (!$sock) return -1;
   //socket_set_timeout($sock, $fl_timeout); // this feature is not 
supported by our php built
   $msg="GET $url HTTP/1.1";
   if ($cookie!="") $msg.="\r\nCookie: $cookie";
   $msg.="\r\n"."Host: $host\r\nConnection: 
Keep-Alive\r\nUser-Agent:".$_SERVER["HTTP_USER_AGENT"]."\r\n"; // Use of 
$_SERVER["HTTP_USER_AGENT"] to get the page compatible with the user browser
   if ($fl_login) $msg.="Authorization: Basic 
".base64_encode("$fl_login:$fl_password")."\r\n";
   $msg.="\r\n"."Accept: text/html";
   $msg.="\r\n\r\n\r\n\r\n";
   fputs($sock,$msg);
   $chunked=0;
   // read header
   while ($buffer=fgets($sock,4096)) {
       if ($buffer=="\r\n") break;
       $header.=$buffer;
       if (preg_match("/Transfer-Encoding:\s+(.+)\r\n/U", $buffer, $parts))
           if (strtoupper($parts[1])=="CHUNKED") $chunked=1;
           else echo "**???".$parts[1]."??\r\n";
   }

   if ($chunked==0) {
       while ($buffer = fgets($sock, 4096)) {
           $page.=$buffer;
           //echo $buffer;
       }
   }
   else {
       while ($buffer = fgets($sock, 4096)) {
           if (!preg_match("/\s*([\dABCDEFabcdef]+)\s*\r\n/i", $buffer, 
$parts)) {
               echo "**chunk size not found : $buffer\r\n";
               return 0;
           }
           $size = (int)base_convert(strtoupper($parts[1]), 16, 10);
           if ($size==0) break;
           $buffer=fread($sock,$size);
           if (strlen($buffer)!=$size) {
               echo "**reading : $size\r\n";
               echo "**readed : ".strlen($buffer)."\r\n";
               return 0;
           }
           $page.=$buffer;
           //echo $buffer;
           $buffer=fgets($sock,4096);
           if ($buffer!="\r\n") {
               echo "**CRLF not found : $buffer\r\n";
               return 0;
           }
       }
   }

   // On réecrit les URL en absolu
   // Les liens href = "bla bla" mais aussi <href = bli.bli >
   $page = preg_replace( "|href= *\"\.(?!http:)([^\"]*)\"|i", 
"href=\"http://".$host.dirname($urlin)."\\1\"", $page);   
   $page = preg_replace( "|href= *\"/(?!http:)([^\"]*)\"|i", 
"href=\"http://".$host."/\\1\"", $page);
   $page = preg_replace( "|href= *\"(?!http:)([^\"]*)\"|i", 
"href=\"http://".$host.$urlin."\\1\"", $page);

   $page = preg_replace( "|href= *\.(?!\")(?!http:)([^>]*)>|i", 
"href=\"http://".$host.dirname($urlin)."\\1\">", $page);   
   $page = preg_replace( "|href= *(?!\")/(?!http:)([^>]*)>|i", 
"href=\"http://".$host."/\\1\">", $page);
   $page = preg_replace( "|href= *(?!\")(?!http:)([^>]*)>|i", 
"href=\"http://".$host.$urlin."\\1\">", $page);

   // les images
   $page = preg_replace( "|src= *\"\.(?!http:)([^\"]*)\"|i", 
"src=\"http://".$host.dirname($urlin)."\\1\"", $page);
   $page = preg_replace( "|src= *\"/(?!http:)([^\"]*)\"|i", 
"src=\"http://".$host."/\\1\"", $page);
   $page = preg_replace( "|src= *\"(?!http:)([^\"]*)\"|i", 
"src=\"http://".$host.$urlin."\\1\"", $page);

   $page = preg_replace( "|src= *\.(?!\")(?!http:)([^>]*)>|i", 
"src=\"http://".$host.dirname($urlin)."\\1\">", $page);   
   $page = preg_replace( "|src= *(?!\")/(?!http:)([^>]*)>|i", 
"src=\"http://".$host."/\\1\">", $page);
   $page = preg_replace( "|src= *(?!\")(?!http:)([^>]*)>|i", 
"src=\"http://".$host.$urlin."\\1\">", $page);

   //    les formulaires (risky !!!)
   $page = preg_replace( "|form action= *\"\.(?!http:)([^\"]*)\"|i", 
"form action=\"http://".$host.dirname($urlin)."\\1\"", $page);
   $page = preg_replace( "|form action= *\"/(?!http:)([^\"]*)\"|i", 
"form action=\"http://".$host."/\\1\"", $page);
   $page = preg_replace( "|form action= *\"(?!http:)([^\"]*)\"|i", 
"form action=\"http://".$host.$urlin."\\1\"", $page);

   $page = preg_replace( "|form action= *\.(?!\")(?!http:)([^>]*)>|i", 
"form action=\"http://".$host.dirname($urlin)."\\1\">", $page);   
   $page = preg_replace( "|form action= *(?!\")/(?!http:)([^>]*)>|i", 
"form action=\"http://".$host."/\\1\">", $page);
   $page = preg_replace( "|form action= *(?!\")(?!http:)([^>]*)>|i", 
"form action=\"http://".$host.$urlin."\\1\">", $page);

   fclose($sock);
   return 1;
}
else{
   $page="You cannot display the requested url.";
   $header="";
}
}

//fonction de calcul d'une url absolue
function absurl($urlaanalyser, $serveur, $pathurlbase){
   $newurl= parse_url($urlaanalyser);
   echo "path = ".$newurl[path]." original=".$urlaanalyser;
   if (isset($newurl[scheme])) {
       // c'est une url absolue car http ou ftp est défini
       return $urlaanalyser;
   }
   elseif (eregi("^/*",$urlaanalyser)){
       // Le chemin défini est absolu
       return "http://".$serveur.$newurl[path];

   }
   else {
       // c'est une url relative: on la transforme
       return "http://".$serveur.$pathurlbase.$newurl[path];
   }
}

// fonction de réécriture des liens d'une page html insérée
function rewritelinks($pagehtml, $pageappelante){
   //return eregi_replace( "^< *href=([^>]*)>$", 
"<href=\"$pageappelante&amp;requestedurl=\\1 \"", $pagehtml);
   return eregi_replace( "href= *\"", 
"href=\"$pageappelante&amp;requestedurl=", $pagehtml);

}

// Fonction renvoyant trou si l'url passée est autorisée pour 
l'affichage et faulse sinon
function site_autorise($url){
   $retour = false;
   foreach ($GLOBALS['Authorized_sites'] as $unsite){
       if (ereg($unsite, $url)){$retour=true;break;}
   }
   return $retour;
}

-----------

Webmestre France Hotel Services wrote:

>Bonsoir,
>
>J'ai un problème similaire et je serais donc intéressé par une solution
>satisfaisante.
>D'avance merci de toute info.
>FHS
>
>----- Original Message ----- 
>From: "Francois Legrand" <legrand <at> iap.fr>
>To: "Francois Legrand" <legrand <at> iap.fr>
>Cc: <spip <at> rezo.net>
>Sent: Friday, December 05, 2003 2:20 PM
>Subject: Re: [Spip] Butiner des répertoires dans un environnement SPIP
>
>
>  
>
>>Etant donné que personne ne m'a répondu, j'ai trouvé une soluce tout
>>seul comme un grand.
>>Si certains sont interessés, qu'ils me contactent.
>>
>>F.
>>
>>Francois Legrand wrote:
>>
>>    
>>
>>>Salut,
>>>
>>>Est-ce que quelqu'un  aurait une solution pour pouvoir naviguer dans
>>>des répertoires d'un site tout en conservant l'environnement
>>>du site sous SPIP.
>>>Je m'explique:
>>>J'ai un site avec un menu de navigation et une zone d'affichage des
>>>articles.
>>>J'ai par exemple une rubrique documents. Cette rubrique contient trois
>>>liens vers des repertoires
>>>/documents/2001
>>>/documents/2002
>>>/documents/2003
>>>
>>>Et chacun de ces répertoires contient des sous répertoires
>>>ex:
>>>/documents/2001/docs
>>>/documents/2001/CR
>>>/documents/2001/autres
>>>
>>>qui contiennent eux même des fichiers. Ces répertoires sont crées/maj
>>>automatiquement par d'autres applications (donc
>>>impossible de les inclure/tenir à jour dans SPIP).
>>>Actuellement, si on clique sur les liens, on peut butiner les
>>>répertoires, mais c'est apache qui gère l'affichage.
>>>Je voudrais pouvoir garder mon environnement de navigation (défini
>>>dans mon squelette) et faire apparaitre le contenu de
>>>mes répertoires dans la zone normalement réservée au contenu des
>>>articles.
>>>
>>>A terme le pb peut aussi consister à faire afficher une page html
>>>(d'un autre site par ex), voire d'inclure
>>>un autre pgme web (je penses par ex à ViewCVS) dans un site sous spip.
>>>
>>>François
>>>
>>>_______________________________________________
>>>liste spip
>>>spip <at> rezo.net - désabonnement : spip-off <at> rezo.net
>>>Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
>>>Documentation de SPIP : http://www.spip.net/
>>>      
>>>
>>_______________________________________________
>>liste spip
>>spip <at> rezo.net - désabonnement : spip-off <at> rezo.net
>>Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
>>Documentation de SPIP : http://www.spip.net/
>>
>>    
>>