|
|
|
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&requestedurl=\\1 \"", $pagehtml);
return eregi_replace( "href= *\"",
"href=\"$pageappelante&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/
>>
>>
>>
|
|