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@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@free.fr
Modified by legrand@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;
}