2013-06-20 23:23:42 +02:00
< ? php
2013-10-19 12:41:06 +02:00
/* ( webpage retriever by Timo Van Neerden ; http :// lehollandaisvolant . net / contact December 2012 )
* last updated : December , 10 th , 2012
*
* This piece of software is under the WTF Public Licence .
* Everyone is permitted to copy and distribute verbatim or modified
* copies of this program , under the following terms of the WFTPL :
*
* DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
* TERMS AND CONDITIONS FOR COPYING , DISTRIBUTION AND MODIFICATION
*
* 0. You just DO WHAT THE FUCK YOU WANT TO .
*
*/
/* all the enhancements ( logo , css , session lock , bookmarklet , tags , rss feed , api ) are from Bronco ( www . warriordudimanche . net )
* and are based on the same licence ;)
* thanks a lot to Timo for his great job on this app ;) */
// PHP 5.1.2 minimum required
error_reporting ( - 1 );
date_default_timezone_set ( 'UTC' );
2013-10-16 13:08:47 +02:00
// liste des parametres GET autorisés pour l'accès public
if ( isset ( $_GET [ 'public' ])
|| isset ( $_GET [ 'zippublic' ])
|| isset ( $_GET [ 'rss' ])
|| isset ( $_GET [ 'publicget' ])
|| isset ( $_GET [ 'api' ]))
{ $publicarg = '?public' ; $GLOBAL [ 'public' ] = true ; $bodyclass = 'publicpage' ;}
else { $publicarg = '' ; $bodyclass = '' ; $GLOBAL [ 'public' ] = false ; include 'auto_restrict.php' ;}
if ( isset ( $_GET [ 'tag' ])){ $search_tags = strip_tags ( $_GET [ 'tag' ]);} else { $search_tags = '' ;}
2013-10-19 12:41:06 +02:00
// CONFIGURABLE OPTIONS
// change those directories'names for more security
$GLOBAL [ 'data_folder' ] = 'mypersonaldata' ;
$GLOBAL [ 'private_data_folder' ] = $GLOBAL [ 'data_folder' ] . '/private' ;
$GLOBAL [ 'public_data_folder' ] = $GLOBAL [ 'data_folder' ] . '/public' ;
$GLOBAL [ 'default_data_folder' ] = $GLOBAL [ 'public_data_folder' ]; //change to private_data_folder to make private the default status
$GLOBAL [ 'version' ] = '2.1' ;
$GLOBAL [ 'rss_title' ] = 'Respawn: le flux de la webliothèque' ;
$GLOBAL [ 'rss_description' ] = 'Le respawn de warriordudimanche.net' ;
$GLOBAL [ 'respawn_url' ] = returncurrenturl ();
$GLOBAL [ 'message' ] = 'Votre webliothèque perso' ;
$GLOBAL [ 'public_title' ] = 'Voici la webliothèque publique de Bronco' ;
$bookmarklet = '<a title="Drag this link to your shortcut bar" href=\'javascript:javascript:(function(){var url = location.href;window.open("http://' . $_SERVER [ 'SERVER_NAME' ] . $_SERVER [ 'PHP_SELF' ] . '?q="+ encodeURIComponent(url),"_blank","menubar=yes,height=600,width=1000,toolbar=yes,scrollbars=yes,status=yes");})();\' >Bookmarklet</a>' ;
$column_width = 'width:47%' ;
if ( $GLOBAL [ 'public' ]){ $bookmarklet = '' ; $column_width = 'width:97%' ;}
if ( ! creer_dossier ( $GLOBAL [ 'data_folder' ], TRUE )) { die ( 'Cant create ' . $GLOBAL [ 'data_folder' ] . ' folder.' ); }
if ( ! creer_dossier ( $GLOBAL [ 'data_folder' ] . '/zipversions' , TRUE )) { die ( 'Cant create ' . $GLOBAL [ 'data_folder' ] . '/zipversions' . ' folder.' ); }
if ( ! creer_dossier ( $GLOBAL [ 'private_data_folder' ], TRUE )) { die ( 'Cant create ' . $GLOBAL [ 'private_data_folder' ] . ' folder.' ); }
if ( ! creer_dossier ( $GLOBAL [ 'public_data_folder' ], TRUE )) { die ( 'Cant create ' . $GLOBAL [ 'public_data_folder' ] . ' folder.' ); }
if ( is_file ( $GLOBAL [ 'data_folder' ] . '/tags.txt' )){ $GLOBAL [ 'tag_array' ] = unstore ( $GLOBAL [ 'data_folder' ] . '/tags.txt' );} else { $GLOBAL [ 'tag_array' ] = array ( 'public' => array (), 'private' => array ()); store ( $GLOBAL [ 'data_folder' ] . '/tags.txt' , $GLOBAL [ 'tag_array' ]);}
if ( ! isset ( $GLOBAL [ 'tag_array' ][ 'public' ])){ $GLOBAL [ 'tag_array' ][ 'public' ] = array ();};
if ( ! isset ( $GLOBAL [ 'tag_array' ][ 'private' ])){ $GLOBAL [ 'tag_array' ][ 'private' ] = array ();};
2013-10-16 13:08:47 +02:00
// Fonctions
2013-06-25 12:05:16 +02:00
function aff ( $a , $stop = true ){ echo 'Arret a la ligne ' . __LINE__ . ' du fichier ' . __FILE__ . '<pre>' ; var_dump ( $a ); echo '</pre>' ; if ( $stop ){ exit ();}}
function BodyClasses ( $add = '' ){ $regex = '#(msie)[/ ]([0-9])+|(firefox)/([0-9])+|(chrome)/([0-9])+|(opera)/([0-9]+)|(safari)/([0-9]+)|(android)|(iphone)|(ipad)|(blackberry)|(Windows Phone)|(symbian)|(mobile)|(bada])#i' ; @ preg_match ( $regex , $_SERVER [ 'HTTP_USER_AGENT' ], $resultat ); return ' class="' . $add . ' ' .@ preg_replace ( '#([a-zA-Z ]+)[ /]([0-9]+)#' , '$1 $1$2' , $resultat [ 0 ]) . ' ' . basename ( $_SERVER [ 'PHP_SELF' ], '.php' ) . '" ' ;}
function title2filename ( $chaine ){ $a = array ( ' ' , ':' , '|' , '#' , '/' , '\\' , '$' , '*' , '?' , '&' , '<' , '>' ); return substr ( stripAccents ( str_replace ( $a , '_' , $chaine )), 0 , 30 );}
function stripAccents ( $string ){ $a = explode ( ' ' , 'à á â ã ä ç è é ê ë ì í î ï ñ ò ó ô õ ö ù ú û ü ý ÿ À Á Â Ã Ä Ç È É Ê Ë Ì Í Î Ï Ñ Ò Ó Ô Õ Ö Ù Ú Û Ü Ý' ); $b = explode ( ' ' , 'a a a a a c e e e e i i i i n o o o o o u u u u y y A A A A A C E E E E I I I I N O O O O O U U U U Y' ); return str_replace ( $a , $b , $string );}
2013-10-16 13:08:47 +02:00
function returncurrenturl (){ $domaine = dirname ( $_SERVER [ 'SERVER_PROTOCOL' ]) . " :// " . $_SERVER [ 'HTTP_HOST' ] . $_SERVER [ 'REQUEST_URI' ] ; $domaine = explode ( '?' , $domaine ); return $domaine [ 0 ];}
function store ( $file , $datas ){ file_put_contents ( $file , serialize ( $datas ));}
function unstore ( $file ){ return unserialize ( file_get_contents ( $file ));}
2013-10-19 12:41:06 +02:00
function getinfos ( $path = '' ){ if ( ! is_file ( $path . '/index.ini' )){ return false ;} return parse_ini_file ( $path . '/index.ini' );}
function setinfos ( $path = '' , $infos = array ()){ if ( ! is_dir ( $path . '/index.ini' )){ return false ;} $ini = '' ; foreach ( $infos as $key => $val ){ $ini .= $key . '="' . str_replace ( '"' , '\"' , $val ) . '"' . " \n " ;} store ( $path . '/index.ini' , $ini );}
function statuspath ( $path ){ global $GLOBAL ; if ( strpos ( $path , $GLOBAL [ 'public_data_folder' ]) !== false ){ return 'public' ;} else { return 'private' ;}}
function idfrompath ( $path ){ $id = explode ( '/' , $path ); $id = $id [ count ( $id ) - 1 ]; return $id ;}
function deltags ( $tags , $path , $id = false , $status = false ){
/* delete the tags of the page's path*/
global $GLOBAL ;
if ( is_string ( $tags )){ $tags = explode ( ' ' , $tags );}
if ( ! $status ){ $status = statuspath ( $path );}
if ( ! $id ){ $id = idfrompath ( $path );}
2013-10-20 10:29:22 +02:00
2013-10-19 12:41:06 +02:00
foreach ( $tags as $tag ){
if ( isset ( $GLOBAL [ 'tag_array' ][ $status ][ $id ])){
$GLOBAL [ 'tag_array' ][ $status ][ $id ] = trim ( str_replace ( ' ' . $tag . ' ' , '' , ' ' . $GLOBAL [ 'tag_array' ][ $status ][ $id ] . ' ' ));
}
}
store ( $GLOBAL [ 'data_folder' ] . '/tags.txt' , $GLOBAL [ 'tag_array' ]);
}
function settags ( $tags , $path , $id = false , $status = false ){
/* set tags to the page's path*/
global $GLOBAL ;
if ( ! $status ){ $status = statuspath ( $path );}
if ( ! $id ){ $id = idfrompath ( $path );}
$GLOBAL [ 'tag_array' ][ $status ][ $id ] = trim ( $tags );
store ( $GLOBAL [ 'data_folder' ] . '/tags.txt' , $GLOBAL [ 'tag_array' ]);
}
function link2favicon ( $dir ){
if ( ! is_dir ( $dir )){ return '<link rel="shortcut icon" type="/image/png" href="design/favicon2.png">' ;}
$favs = glob ( $dir . '/*favicon*' );
2013-10-20 10:29:22 +02:00
if ( count ( $favs ) > 0 ){ $fav = basename ( $favs [ 0 ]);
$extension = pathinfo ( $dir , PATHINFO_EXTENSION );
echo '<link rel="shortcut icon" type="/image/' . $extension . '" href="' . $dir . '/' . $fav . '">' ;
} else {
echo '<link rel="shortcut icon" type="/image/png" href="design/favicon2.png">' ;;
}
2013-10-19 12:41:06 +02:00
}
2013-10-16 13:08:47 +02:00
function search ( $public = 'public' , $tag = false ){
global $GLOBAL ;
//$GLOBAL['tag_array'];
if ( ! $tag ){ return scandir ( $GLOBAL [ $public . '_data_folder' ] );}
else {
foreach ( $GLOBAL [ 'tag_array' ][ $public ] as $key => $val ){
if ( stripos ( $val , $tag ) !== false ){ $result [] = $key ;}
}
if ( ! empty ( $result )){ return $result ;} else { return array ();}
}
}
function array2feed ( $array = null ){
// more infos on this function at https://github.com/broncowdd/feed2array
if ( ! $array ){ return false ;}
if ( empty ( $array [ 'infos' ][ 'type' ])){ $array [ 'infos' ][ 'type' ] = 'rss' ;} else { $array [ 'infos' ][ 'type' ] = strtolower ( $array [ 'infos' ][ 'type' ]);}
if ( empty ( $array [ 'infos' ][ 'description' ])){ $array [ 'infos' ][ 'description' ] = '' ;}
$r = " \n " ; $t = " \t " ;
$tpl = array ( 'rss' => array (), 'atom' => array ());
$tpl [ 'rss' ][ 'header' ] = '<?xml version="1.0" encoding="utf-8" ?>' . $r . '<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">' . $r . $t . '<channel>' . $r ;
$tpl [ 'atom' ][ 'header' ] = '<feed xmlns="http://www.w3.org/2005/Atom">' . $r ;
$tpl [ 'rss' ][ 'footer' ] = $t . '</channel></rss>' . $r ;
$tpl [ 'atom' ][ 'footer' ] = '</feed>' . $r ;
$tpl [ 'rss' ][ 'content-type' ] = 'Content-Type: application/rss+xml' ;
$tpl [ 'atom' ][ 'content-type' ] = 'Content-Type: application/atom+xml;charset=utf-8' ;
header ( $tpl [ $array [ 'infos' ][ 'type' ]][ 'content-type' ]);
$feed = $tpl [ $array [ 'infos' ][ 'type' ]][ 'header' ];
//create the feed's info content
foreach ( $array [ 'infos' ] as $key => $value ){
if ( $array [ 'infos' ][ 'type' ] == 'atom' ){ // ATOM
if ( $key == 'link' ){ $feed .= $t . $t . '<link href="' . $value . '" rel="self" type="application/atom+xml"/>' . $r ;}
elseif ( $key == 'author' ){ $feed .= $t . $t . '<author><name>' . $value . '</name></author>' . $r ;}
elseif ( $key == 'licence' ){ $feed .= $t . $t . '<' . $key . ' href="' . $value . '" rel="license"/>' . $r ;} // in atom feed, licence is the link to the licence type
elseif ( $key != 'version' && $key != 'type' ){ $feed .= $t . $t . '<' . $key . '>' . $value . '</' . $key . '>' . $r ;}
} else { // RSS
if ( $key != 'version' && $key != 'type' ){ $feed .= $t . $t . '<' . $key . '>' . $value . '</' . $key . '>' . $r ;}
}
}
//then the items content
foreach ( $array [ 'items' ] as $item ){
if ( $array [ 'infos' ][ 'type' ] == 'atom' ){ $feed .= $t . $t . $t . '<entry>' . $r ;} else { $feed .= $t . $t . $t . '<item>' . $r ;}
foreach ( $item as $key => $value ){
if ( $array [ 'infos' ][ 'type' ] == 'atom' ){ // ATOM
if ( $key == 'link' ){ $feed .= $t . $t . $t . $t . '<link href="' . $value . '" rel="alternate" type="text/html"/>' . $r ;}
elseif ( $key == 'content' ){ $feed .= $t . $t . $t . $t . '<content type="text">' . htmlspecialchars ( $value ) . '</content>' . $r ;}
else { $feed .= $t . $t . $t . $t . '<' . $key . '>' . $value . '</' . $key . '>' . $r ;}
} else { // RSS
if ( $key == 'date' || $key == 'pubDate' || $key == 'title' || $key == 'link' ){ $feed .= $t . $t . $t . $t . '<' . $key . '>' . htmlspecialchars ( $value ) . '</' . $key . '>' . $r ;}
elseif ( $key == 'guid' ){ $feed .= $t . $t . $t . $t . '<guid isPermaLink="false">' . $value . '</guid>' . $r ;}
else { $feed .= $t . $t . $t . $t . '<' . $key . '><![CDATA[' . $value . ']]></' . $key . '>' . $r ;}
}
}
if ( $array [ 'infos' ][ 'type' ] == 'atom' ){ $feed .= $t . $t . $t . '</entry>' . $r ;} else { $feed .= $t . $t . $t . '</item>' . $r ;}
}
$feed .= $tpl [ $array [ 'infos' ][ 'type' ]][ 'footer' ];
return $feed ;
}
function tagcloud (){
2013-10-19 12:41:06 +02:00
global $GLOBAL ; $array = array ( 'public' => array (), 'private' => array ());
2013-10-16 13:08:47 +02:00
if ( ! $GLOBAL [ 'public' ]){
foreach ( $GLOBAL [ 'tag_array' ][ 'private' ] as $key => $tag ){
2013-10-19 12:41:06 +02:00
$tags = explode ( ' ' , trim ( $tag ));
2013-10-16 13:08:47 +02:00
foreach ( $tags as $t ){
2013-10-19 12:41:06 +02:00
if ( ! isset ( $array [ 'private' ][ $t ][ 'nb' ])){ $array [ 'private' ][ $t ][ 'nb' ] = 1 ;} else { $array [ 'private' ][ $t ][ 'nb' ] ++ ;}
2013-10-16 13:08:47 +02:00
}
}
}
foreach ( $GLOBAL [ 'tag_array' ][ 'public' ] as $key => $tag ){
2013-10-19 12:41:06 +02:00
$tags = explode ( ' ' , trim ( $tag ));
2013-10-16 13:08:47 +02:00
foreach ( $tags as $t ){
2013-10-19 12:41:06 +02:00
if ( ! isset ( $array [ 'public' ][ $t ][ 'nb' ])){ $array [ 'public' ][ $t ][ 'nb' ] = 1 ;} else { $array [ 'public' ][ $t ][ 'nb' ] ++ ;}
2013-10-20 10:29:22 +02:00
//if (!isset($array[$t]['status'])){$array[$t]['status']='public';}
2013-10-16 13:08:47 +02:00
}
}
2013-06-29 10:53:37 +02:00
2013-10-19 12:41:06 +02:00
foreach ( $array [ 'public' ] as $tag => $val ){ if ( trim ( $tag ) != '' ){ echo '<a class="tag_public" href="' . $GLOBAL [ 'respawn_url' ] . '?public&tag=' . $tag . '">' . $tag . ' <em>' . $val [ 'nb' ] . '</em></a>' ;}}
if ( isset ( $array [ 'private' ])){ foreach ( $array [ 'private' ] as $tag => $val ){ if ( trim ( $tag ) != '' ){ echo '<a class="tag_private" href="' . $GLOBAL [ 'respawn_url' ] . '?tag=' . $tag . '">' . $tag . ' <em>' . $val [ 'nb' ] . '</em></a>' ;}}}
2013-10-16 13:08:47 +02:00
}
function tag2links ( $tagstring ){
global $GLOBAL ;
2013-10-16 19:27:05 +02:00
$array = explode ( ' ' , $tagstring ); $links = '' ; $public = '' ;
if ( $GLOBAL [ 'public' ]){ $public = '&public' ;}
2013-10-16 13:08:47 +02:00
foreach ( $array as $tag ){
2013-10-16 19:27:05 +02:00
$links .= '<a href="' . $GLOBAL [ 'respawn_url' ] . '?tag=' . $tag . $public . '" class="tag">' . $tag . '</a>' ;
2013-10-16 13:08:47 +02:00
}
return $links ;
}
2013-06-25 12:05:16 +02:00
if ( isset ( $_GET [ 'publicget' ]) || isset ( $_GET [ 'privateget' ])){ $bodyclass .= ' iframe' ;}
$bodyclass = bodyclasses ( $bodyclass ); $target = '' ;
2013-06-20 23:23:42 +02:00
//
// BEGIN SCRIPT
//
// init
// url not yet retrieved
2013-10-16 13:08:47 +02:00
$GLOBAL [ 'done' ][ 'd' ] = FALSE ;
2013-06-21 10:46:43 +02:00
2013-10-16 13:08:47 +02:00
if ( ! $GLOBAL [ 'public' ]){ // private
2013-06-20 23:23:42 +02:00
// Get URL to save.
if ( ! empty ( $_GET [ 'q' ])) {
$url = htmlspecialchars ( $_GET [ 'q' ]);
if ( strpos ( $url , '://' ) === false ) {
$url = 'http://' . $url ;
}
2013-10-16 13:08:47 +02:00
$GLOBAL [ 'url' ] = $url ;
2013-06-20 23:23:42 +02:00
$url_p = url_parts ();
// retrieve the file main HTML file
2013-10-16 13:08:47 +02:00
$GLOBAL [ 'main_page_data' ] = get_external_file ( $GLOBAL [ 'url' ], 6 );
2013-06-20 23:23:42 +02:00
2013-10-16 13:08:47 +02:00
if ( $GLOBAL [ 'main_page_data' ] === FALSE ) {
2013-06-20 23:23:42 +02:00
die ( 'error retrieving external main page' );
}
else {
// crée le nouveau dossier basé sur le TS.
$new_folder = date ( 'Y-m-d-H-i-s' );
2013-10-16 13:08:47 +02:00
if ( ! creer_dossier ( $GLOBAL [ 'default_data_folder' ] . '/' . $new_folder ) === TRUE ) {
2013-06-20 23:23:42 +02:00
die ( 'error creating data folder' );
}
else {
2013-10-16 13:08:47 +02:00
$GLOBAL [ 'target_folder' ] = $GLOBAL [ 'default_data_folder' ] . '/' . $new_folder ;
2013-06-20 23:23:42 +02:00
}
2013-06-29 10:53:37 +02:00
/*GESTION DU PDF ICI*/
if ( strtolower ( substr ( $_GET [ 'q' ], - 4 )) == '.pdf' ){
$title = basename ( $_GET [ 'q' ]);
2013-10-16 13:08:47 +02:00
file_put_contents ( $GLOBAL [ 'target_folder' ] . '/' . $title , $GLOBAL [ 'main_page_data' ]);
file_put_contents ( $GLOBAL [ 'target_folder' ] . '/index.php' , '<?php header("location: ' . $title . '");?>' );
2013-06-29 10:53:37 +02:00
} else {
$liste_css = array ();
// parse le fichier principal à la recherche de données à télécharger
2013-10-16 13:08:47 +02:00
$files = list_retrievable_data ( $GLOBAL [ 'url' ], $GLOBAL [ 'main_page_data' ]);
2013-06-29 10:53:37 +02:00
// les récupère et les enregistre.
//echo '<pre>';print_r($files);die();
foreach ( $files as $i => $file ) {
if ( $data = get_external_file ( $file [ 'url_fichier' ], 3 ) and ( $data !== FALSE ) ) {
// CSS files need to be parsed aswell
if ( $file [ 'type' ] == 'css' ) {
$liste_css [] = $file ;
}
else {
2013-10-16 13:08:47 +02:00
file_put_contents ( $GLOBAL [ 'target_folder' ] . '/' . $file [ 'nom_destination' ], $data );
2013-06-29 10:53:37 +02:00
}
2013-06-20 23:23:42 +02:00
}
}
2013-06-29 10:53:37 +02:00
// remplace juste les liens <a href=""> relatifs vers des liens absolus
2013-10-16 13:08:47 +02:00
absolutes_links ( $GLOBAL [ 'main_page_data' ]);
2013-06-29 10:53:37 +02:00
// enregistre le fichier HTML principal
2013-10-16 13:08:47 +02:00
file_put_contents ( $GLOBAL [ 'target_folder' ] . '/' . 'index.html' , $GLOBAL [ 'main_page_data' ]);
2013-06-29 10:53:37 +02:00
// récupère le titre de la page
// cherche le charset spécifié dans le code HTML.
// récupère la balise méta tout entière, dans $meta
2013-10-16 13:08:47 +02:00
preg_match ( '#<meta .*charset=.*>#Usi' , $GLOBAL [ 'main_page_data' ], $meta );
2013-06-29 10:53:37 +02:00
// si la balise a été trouvée, on tente d’ isoler l’ encodage.
if ( ! empty ( $meta [ 0 ])) {
// récupère juste l’ encodage utilisé, dans $enc
preg_match ( '#charset="?(.*)"#si' , $meta [ 0 ], $enc );
// regarde si le charset a été trouvé, sinon le fixe à UTF-8
$html_charset = ( ! empty ( $enc [ 1 ])) ? strtolower ( $enc [ 1 ]) : 'utf-8' ;
} else { $html_charset = 'utf-8' ; }
// récupère le titre, dans le tableau $titles, rempli par preg_match()
2013-10-16 13:08:47 +02:00
preg_match ( '#<title>(.*)</title>#Usi' , $GLOBAL [ 'main_page_data' ], $titles );
2013-06-29 10:53:37 +02:00
if ( ! empty ( $titles [ 1 ])) {
$html_title = trim ( $titles [ 1 ]);
// ré-encode le titre en UTF-8 en fonction de son encodage.
$title = ( $html_charset == 'iso-8859-1' ) ? utf8_encode ( $html_title ) : $html_title ;
// si pas de titre : on utilise l’ URL.
} else {
$title = $url ;
}
2013-06-20 23:23:42 +02:00
2013-06-29 10:53:37 +02:00
// récupère, parse, modifie & enregistre les fichier CSS (et les fichiés liés)
$n = 0 ;
$count = count ( $liste_css );
while ( $n < $count and $n < 300 ) { // no more than 300 ext files.
$i = $n ;
$file = $liste_css [ $i ];
if ( $data = get_external_file ( $file [ 'url_fichier' ], 3 ) and ( $data !== FALSE ) ) {
if ( preg_match ( '#(css|php|txt|html|xml|js)#' , $file [ 'url_fichier' ]) ) {
$matches_url = array ();
preg_match_all ( '#url\s{0,}\(("|\')?([^\'")]{1,})(\'|")?\)#i' , $data , $matches_url , PREG_SET_ORDER );
$matches_url2 = array ();
preg_match_all ( " #@import \ s*(?: \" ([^ \" >]*) \" ?|'([^'>]*)'?)([^;]*)(;| $ )#i " , $data , $matches_url2 , PREG_SET_ORDER );
2013-06-22 16:17:11 +02:00
2013-06-20 23:23:42 +02:00
2013-06-29 10:53:37 +02:00
$matches_url = array_merge ( $matches_url2 , $matches_url );
2013-06-22 16:17:11 +02:00
2013-06-29 10:53:37 +02:00
// pour chaque URL/URI
foreach ( $matches_url as $j => $valuej ) {
2013-06-20 23:23:42 +02:00
2013-06-29 10:53:37 +02:00
if ( preg_match ( '#^data:#' , $matches_url [ $j ][ 2 ])) break ; // if BASE64 data, dont download.
2013-06-20 23:23:42 +02:00
2013-06-29 10:53:37 +02:00
// get the filenam (basename)
$nom_fichier = ( preg_match ( '#^(ht|f)tps?://#' , $matches_url [ $j ][ 2 ])) ? pathinfo ( parse_url ( $matches_url [ $j ][ 2 ], PHP_URL_PATH ), PATHINFO_BASENAME ) : pathinfo ( $matches_url [ $j ][ 2 ], PATHINFO_BASENAME );
2013-06-20 23:23:42 +02:00
2013-06-29 10:53:37 +02:00
// get the URL. For URIs, uses the GLOBALS[url] tu make the URL
// the files in CSS are relative to the CSS !
if ( preg_match ( '#^https?://#' , $matches_url [ $j ][ 2 ])) {
$url_fichier = $matches_url [ $j ][ 2 ];
}
// abs url w/o protocole
elseif ( preg_match ( '#^//#' , $matches_url [ $j ][ 2 ])) {
$url_fichier = $url_p [ 's' ] . ':' . $matches_url [ $j ][ 2 ];
}
// rel url
elseif ( preg_match ( '#^/#' , $matches_url [ $j ][ 2 ])) {
$url_fichier = $url_p [ 's' ] . '://' . $url_p [ 'h' ] . $matches_url [ $j ][ 2 ];
}
2013-06-22 16:17:11 +02:00
2013-06-29 10:53:37 +02:00
else {
$endstr = ( $w = strpos ( $file [ 'url_fichier' ], '?' )) ? $w : strlen ( $file [ 'url_fichier' ]);
$url_fichier = substr ( substr ( $file [ 'url_fichier' ], 0 , $endstr ), 0 , - strlen ( $file [ 'nom_fich_origine' ])) . $matches_url [ $j ][ 2 ];
}
// new rand name, for local storage.
$nouveau_nom = rand_new_name ( $nom_fichier );
//echo '<pre>'.$nouveau_nom."\n";
$add = TRUE ;
// avoids downloading the same file twice. (yes, we re-use the same $retrievable ($files), why not ?)
foreach ( $files as $key => $item ) {
if ( $item [ 'url_fichier' ] == $url_fichier ) {
$nouveau_nom = $item [ 'nom_destination' ];
$add = FALSE ;
break ;
}
2013-06-20 23:23:42 +02:00
}
2013-06-29 10:53:37 +02:00
// if we do download, add it to the array.
if ( $add === TRUE ) {
$files_n = array (
'url_origine' => $matches_url [ $j ][ 2 ],
'url_fichier' => $url_fichier ,
'nom_fich_origine' => $nom_fichier ,
'nom_destination' => $nouveau_nom
);
$files [] = $files_n ;
$liste_css [] = $files_n ;
}
2013-06-20 23:23:42 +02:00
2013-06-29 10:53:37 +02:00
// replace url in CSS $data
$data = str_replace ( $matches_url [ $j ][ 2 ], $nouveau_nom , $data );
// echo $nouveau_nom."<br>\n";
2013-06-20 23:23:42 +02:00
2013-06-29 10:53:37 +02:00
if ( ! preg_match ( '#(css|php|txt|html)#' , $file [ 'url_fichier' ]) ) {
if ( FALSE !== ( $f = get_external_file ( $url_fichier , 3 )) ) {
2013-10-16 13:08:47 +02:00
file_put_contents ( $GLOBAL [ 'target_folder' ] . '/' . $nouveau_nom , $f );
2013-06-29 10:53:37 +02:00
}
2013-06-20 23:23:42 +02:00
}
}
}
2013-06-29 10:53:37 +02:00
// don't forget to save data
2013-10-16 13:08:47 +02:00
file_put_contents ( $GLOBAL [ 'target_folder' ] . '/' . $file [ 'nom_destination' ], $data );
2013-06-29 10:53:37 +02:00
}
$n ++ ;
$count = count ( $liste_css );
2013-06-20 23:23:42 +02:00
}
}
// enregistre un fichier d’ informations concernant la page (date, url, titre)
$info = '' ;
2013-10-16 13:08:47 +02:00
$info .= 'URL="' . $GLOBAL [ 'url' ] . '"' . " \n " ;
2013-06-20 23:23:42 +02:00
$info .= 'TITLE="' . $title . '"' . " \n " ;
$info .= 'DATE="' . time () . '"' . " \n " ;
2013-10-16 13:08:47 +02:00
file_put_contents ( $GLOBAL [ 'target_folder' ] . '/' . 'index.ini' , $info );
/* $GLOBAL [ 'done' ][ 'd' ] = 'ajout' ;
$GLOBAL [ 'done' ][ 'lien' ] = $GLOBAL [ 'target_folder' ] . '/' ; */
2013-06-29 10:53:37 +02:00
2013-06-20 23:23:42 +02:00
}
2013-06-29 10:53:37 +02:00
2013-06-22 16:17:11 +02:00
} //die;
2013-06-20 23:23:42 +02:00
// in case of delete an entry
if ( isset ( $_GET [ 'suppr' ]) and $torem = $_GET [ 'suppr' ] and $torem != '' ) {
$torem = htmlspecialchars ( $_GET [ 'suppr' ]);
if ( is_dir ( $_GET [ 'suppr' ])){
2013-10-19 12:41:06 +02:00
// suppr tags
$id = idfrompath ( $_GET [ 'suppr' ]);
$status = statuspath ( $_GET [ 'suppr' ]);
if ( isset ( $GLOBAL [ 'tag_array' ][ $status ][ $id ])){ deltags ( $GLOBAL [ 'tag_array' ][ $status ][ $id ], $_GET [ 'suppr' ], $id , $status );}
// suppr page
2013-06-20 23:23:42 +02:00
$sousliste = scandir ( $_GET [ 'suppr' ]); // listage des dossiers de data.
$nb_sousfichier = count ( $sousliste );
for ( $j = 0 ; $j < $nb_sousfichier ; $j ++ ) {
if ( ! ( $sousliste [ $j ] == '..' or $sousliste [ $j ] == '.' )) {
unlink ( $_GET [ 'suppr' ] . '/' . $sousliste [ $j ]);
}
}
// then the folder itself.
if ( TRUE === rmdir ( $_GET [ 'suppr' ])) {
2013-10-16 13:08:47 +02:00
$GLOBAL [ 'done' ][ 'd' ] = 'remove' ;
2013-06-20 23:23:42 +02:00
}
}
header ( " location: index.php " );
}
// to private
if ( isset ( $_GET [ 'toprivate' ]) and $torem = $_GET [ 'toprivate' ] and $torem != '' ) {
$torem = htmlspecialchars ( $_GET [ 'toprivate' ]);
2013-10-16 13:08:47 +02:00
if ( is_dir ( $GLOBAL [ 'public_data_folder' ] . '/' . $_GET [ 'toprivate' ])){
rename ( $GLOBAL [ 'public_data_folder' ] . '/' . $_GET [ 'toprivate' ], $GLOBAL [ 'private_data_folder' ] . '/' . $_GET [ 'toprivate' ]);
2013-10-19 12:41:06 +02:00
if ( isset ( $GLOBAL [ 'tag_array' ][ 'public' ][ $_GET [ 'toprivate' ]])){
$temp = $GLOBAL [ 'tag_array' ][ 'public' ][ $_GET [ 'toprivate' ]];
deltags ( $temp , $_GET [ 'toprivate' ], $_GET [ 'toprivate' ], 'public' );
settags ( $temp , $_GET [ 'toprivate' ], $_GET [ 'toprivate' ], 'private' );
}
2013-06-20 23:23:42 +02:00
header ( " location: index.php " );
}
}
// to public
if ( isset ( $_GET [ 'topublic' ]) and $torem = $_GET [ 'topublic' ] and $torem != '' ) {
$torem = htmlspecialchars ( $_GET [ 'topublic' ]);
2013-10-16 13:08:47 +02:00
if ( is_dir ( $GLOBAL [ 'private_data_folder' ] . '/' . $_GET [ 'topublic' ])){
rename ( $GLOBAL [ 'private_data_folder' ] . '/' . $_GET [ 'topublic' ], $GLOBAL [ 'public_data_folder' ] . '/' . $_GET [ 'topublic' ]);
2013-10-19 12:41:06 +02:00
if ( isset ( $GLOBAL [ 'tag_array' ][ 'private' ][ $_GET [ 'topublic' ]])){
$temp = $GLOBAL [ 'tag_array' ][ 'private' ][ $_GET [ 'topublic' ]];
deltags ( $temp , $_GET [ 'topublic' ], $_GET [ 'topublic' ], 'private' );
settags ( $temp , $_GET [ 'topublic' ], $_GET [ 'topublic' ], 'public' );
}
2013-06-20 23:23:42 +02:00
header ( " location: index.php " );
}
}
2013-06-25 12:05:16 +02:00
// disconnect
if ( isset ( $_GET [ 'discotime' ])){ log_user ( 'disco' , '' );}
2013-10-16 13:08:47 +02:00
if ( isset ( $_GET [ 'privateget' ]) && is_dir ( $GLOBAL [ 'private_data_folder' ] . '/' . $_GET [ 'privateget' ])){ $target = $GLOBAL [ 'private_data_folder' ] . '/' . $_GET [ 'privateget' ];}
2013-06-25 12:05:16 +02:00
if ( isset ( $_GET [ 'zipprivate' ])) {
2013-10-16 13:08:47 +02:00
$ini_file = $GLOBAL [ 'private_data_folder' ] . '/' . $_GET [ 'zipprivate' ] . '/index.ini' ;
2013-06-25 12:05:16 +02:00
if ( is_file ( $ini_file )){ $info = parse_ini_file ( $ini_file );} else { $info [ 'TITLE' ] = '' ;}
2013-10-16 13:08:47 +02:00
$origin_folder_path = $GLOBAL [ 'private_data_folder' ] . '/' . $_GET [ 'zipprivate' ];
2013-06-25 12:05:16 +02:00
$zip_foldername = title2filename ( $info [ 'TITLE' ]) . '-' . $_GET [ 'zipprivate' ];
$zip_filename = $zip_foldername . '.zip' ;
2013-10-16 13:08:47 +02:00
$zip_completepath = $GLOBAL [ 'data_folder' ] . '/zipversions/' . $zip_filename ;
2013-06-25 12:05:16 +02:00
if ( is_file ( $zip_completepath )){ header ( " location: $zip_completepath " ); exit ();} // il existe déjà, on envoie
if ( is_dir ( $origin_folder_path )){ // sinon on crée le zip si le dossier existe
include 'zip.php' ;
rename ( $origin_folder_path , $zip_foldername ); // on le déplace pour éviter de voir la structure de dossiers apparaître dans le zip
2013-10-16 13:08:47 +02:00
zip ( $zip_filename , $zip_foldername , $GLOBAL [ 'data_folder' ] . '/zipversions/' );
2013-06-25 12:05:16 +02:00
rename ( $zip_foldername , $origin_folder_path ); // on le remet à sa place
2013-10-16 13:08:47 +02:00
header ( 'location: ' . $GLOBAL [ 'data_folder' ] . '/zipversions/' . $zip_filename );
2013-06-21 10:46:43 +02:00
}
}
2013-10-16 13:08:47 +02:00
if ( isset ( $_GET [ 'rename' ]) && isset ( $_GET [ 'to' ]) && isset ( $_GET [ 'file' ])) {
if ( is_file ( $_GET [ 'file' ] . '/index.ini' )){
$ini = parse_ini_file ( $_GET [ 'file' ] . '/index.ini' );
$old = strip_tags ( urldecode ( $_GET [ 'rename' ]));
$new = strip_tags ( urldecode ( $_GET [ 'to' ]));
$newini = 'URL="' . $ini [ 'URL' ] . '"' . " \n " . 'TITLE="' . $new . '"' . " \n " . 'DATE="' . $ini [ 'DATE' ] . '"' ;
file_put_contents ( $_GET [ 'file' ] . '/index.ini' , $newini );
}
}
if ( isset ( $_GET [ 'settag' ]) && isset ( $_GET [ 'file' ])) {
if ( is_file ( $GLOBAL [ 'data_folder' ] . '/tags.txt' )){ $GLOBAL [ 'tag_array' ] = unstore ( $GLOBAL [ 'data_folder' ] . '/tags.txt' );} else { $GLOBAL [ 'tag_array' ] = array ();}
if ( isset ( $_GET [ 'ispublic' ])){ $type = 'public' ;} else { $type = 'private' ;}
$GLOBAL [ 'tag_array' ][ $type ][ $_GET [ 'file' ]] = strip_tags ( $_GET [ 'settag' ]);
store ( $GLOBAL [ 'data_folder' ] . '/tags.txt' , $GLOBAL [ 'tag_array' ]);
}
} else { // public get
2013-06-21 10:46:43 +02:00
//download public zip version
if ( isset ( $_GET [ 'zippublic' ])) {
2013-10-16 13:08:47 +02:00
$ini_file = $GLOBAL [ 'public_data_folder' ] . '/' . $_GET [ 'zippublic' ] . '/index.ini' ;
if ( is_file ( $ini_file )){ $info = parse_ini_file ( $ini_file );} else { $info [ 'TITLE' ] = '' ;}
$origin_folder_path = $GLOBAL [ 'public_data_folder' ] . '/' . $_GET [ 'zippublic' ];
$zip_foldername = title2filename ( $info [ 'TITLE' ]) . '-' . $_GET [ 'zippublic' ];
$zip_filename = $zip_foldername . '.zip' ;
$zip_completepath = $GLOBAL [ 'data_folder' ] . '/zipversions/' . $zip_filename ;
if ( is_file ( $zip_completepath )){ header ( " location: $zip_completepath " ); exit ();} // il existe déjà, on envoie
if ( is_dir ( $origin_folder_path )){ // sinon on crée le zip si le dossier existe
include 'zip.php' ;
rename ( $origin_folder_path , $zip_foldername ); // on le déplace pour éviter de voir la structure de dossiers apparaître dans le zip
zip ( $zip_filename , $zip_foldername , $GLOBAL [ 'data_folder' ] . '/zipversions/' );
rename ( $zip_foldername , $origin_folder_path ); // on le remet à sa place
header ( 'location: ' . $GLOBAL [ 'data_folder' ] . '/zipversions/' . $zip_filename );
}
}
if ( isset ( $_GET [ 'publicget' ]) && is_dir ( $GLOBAL [ 'public_data_folder' ] . '/' . $_GET [ 'publicget' ])){ $target = $GLOBAL [ 'public_data_folder' ] . '/' . $_GET [ 'publicget' ];}
if ( isset ( $_GET [ 'rss' ])){
$items = array_reverse ( search ( 'public' , $search_tags ));
$feed = array (
'infos' => array (
'type' => 'rss' ,
'description' => $GLOBAL [ 'rss_description' ],
'title' => $GLOBAL [ 'rss_title' ],
'link' => $GLOBAL [ 'respawn_url' ],
)
);
foreach ( $items as $key => $item ){
if ( $item != 'index.html' ){
if ( is_dir ( $GLOBAL [ 'public_data_folder' ] . '/' . $item )){
if ( is_file ( $GLOBAL [ 'public_data_folder' ] . '/' . $item . '/index.ini' )){
$infos = parse_ini_file ( $GLOBAL [ 'public_data_folder' ] . '/' . $item . '/index.ini' );
date_default_timezone_set ( 'Europe/Paris' );
$infos [ 'DATE' ] = date ( " r " , $infos [ 'DATE' ]);
if ( $infos [ 'TITLE' ] == '' ){ $infos [ 'TITLE' ] = 'Version Respawn de ' . $infos [ 'URL' ];}
$feed [ 'items' ][ $key ] = array (
'description' => 'Version Respawn de ' . $infos [ 'URL' ],
'title' => $infos [ 'TITLE' ],
'link' => $GLOBAL [ 'respawn_url' ] . '?publicget=' . $item ,
'guid' => $infos [ 'URL' ],
'pubDate' => $infos [ 'DATE' ],
);
}
}
}
2013-06-21 10:46:43 +02:00
}
2013-10-16 13:08:47 +02:00
exit ( array2feed ( $feed ));
2013-06-21 10:46:43 +02:00
}
2013-10-16 13:08:47 +02:00
if ( isset ( $_GET [ 'api' ])){
$content = array ();
$items = search ( 'public' , $search_tags );
foreach ( $items as $key => $item ){
if ( $item != 'index.html' ){
if ( is_dir ( $GLOBAL [ 'public_data_folder' ] . '/' . $item )){
if ( is_file ( $GLOBAL [ 'public_data_folder' ] . '/' . $item . '/index.ini' )){
$infos = parse_ini_file ( $GLOBAL [ 'public_data_folder' ] . '/' . $item . '/index.ini' );
date_default_timezone_set ( 'Europe/Paris' );
$infos [ 'DATE' ] = date ( 'd/m/Y' , $infos [ 'DATE' ]);
if ( $infos [ 'TITLE' ] == '' ){ $infos [ 'TITLE' ] = 'Respawn de ' . $infos [ 'URL' ];}
2013-10-17 10:38:24 +02:00
$t = '' ;
2013-10-17 10:20:45 +02:00
if ( isset ( $GLOBAL [ 'tag_array' ][ 'public' ][ $item ])){ $t = $GLOBAL [ 'tag_array' ][ 'public' ][ $item ];}
2013-10-16 13:08:47 +02:00
$content [ $key ] = array (
'description' => 'Version Respawn de ' . $infos [ 'URL' ],
'title' => $infos [ 'TITLE' ],
'respawn_link' => $GLOBAL [ 'respawn_url' ] . '?publicget=' . $item ,
'original_link' => $infos [ 'URL' ],
'date' => $infos [ 'DATE' ],
2013-10-17 10:20:45 +02:00
'tags' => $t ,
2013-10-16 13:08:47 +02:00
);
}
}
}
2013-06-25 12:05:16 +02:00
2013-10-16 13:08:47 +02:00
}
exit ( serialize ( $content ));
}
}
2013-06-21 10:46:43 +02:00
2013-06-20 23:23:42 +02:00
function url_parts () {
2013-10-16 18:54:46 +02:00
global $GLOBAL ;
2013-10-16 13:08:47 +02:00
$url_p [ 's' ] = parse_url ( $GLOBAL [ 'url' ], PHP_URL_SCHEME ); $url_p [ 's' ] = ( is_null ( $url_p [ 's' ])) ? '' : $url_p [ 's' ];
$url_p [ 'h' ] = parse_url ( $GLOBAL [ 'url' ], PHP_URL_HOST ); $url_p [ 'h' ] = ( is_null ( $url_p [ 'h' ])) ? '' : $url_p [ 'h' ];
$url_p [ 'p' ] = parse_url ( $GLOBAL [ 'url' ], PHP_URL_PORT ); $url_p [ 'p' ] = ( is_null ( $url_p [ 'p' ])) ? '' : ':' . $url_p [ 'p' ];
$url_p [ 'pat' ] = parse_url ( $GLOBAL [ 'url' ], PHP_URL_PATH ); $url_p [ 'pat' ] = ( is_null ( $url_p [ 'pat' ])) ? '' : $url_p [ 'pat' ];
2013-06-20 23:23:42 +02:00
$url_p [ 'file' ] = pathinfo ( $url_p [ 'pat' ], PATHINFO_BASENAME );
return $url_p ;
}
//
// Gets external file by URL.
// Make a stream context (better).
//
function get_external_file ( $url , $timeout ) {
$context = stream_context_create ( array ( 'http' => array ( 'timeout' => $timeout ))); // Timeout : time until we stop waiting for the response.
$data = @ file_get_contents ( $url , false , $context , - 1 , 4000000 ); // We download at most 4 Mb from source.
if ( isset ( $data ) and isset ( $http_response_header ) and isset ( $http_response_header [ 0 ]) and ( strpos ( $http_response_header [ 0 ], '200 OK' ) !== FALSE ) ) {
return $data ;
}
else {
return FALSE ;
}
}
//
// CREATE FOLDER
//
function creer_dossier ( $dossier , $indexfile = FALSE ) {
if ( ! is_dir ( $dossier ) ) {
if ( mkdir ( $dossier , 0777 , TRUE ) === TRUE ) {
chmod ( $dossier , 0777 );
if ( $indexfile == TRUE ) touch ( $dossier . '/index.html' ); // make a index.html file : avoid the possibility of listing folder's content
return TRUE ;
} else {
return FALSE ;
}
}
return TRUE ; // if folder already exists
}
//
// PARSE TAGS AND LISTE DOWNLOADABLE CONTENT IN ARRAY
// Also modify html source code to replace absolutes URLs with local URIs.
//
function list_retrievable_data ( $url , & $data ) {
$url_p = url_parts ();
$retrievable = array ();
// cherche les balises 'link' qui contiennent un rel="(icon|favicon|stylesheet)" et un href=""
// (on ne cherche pas uniquement le "href" sinon on se retrouve avec les flux RSS aussi)
$matches = array ();
preg_match_all ( '#<\s*link[^>]+rel=["\'][^"\']*(icon|favicon|stylesheet)[^"\']*["\'][^>]*>#Si' , $data , $matches , PREG_SET_ORDER );
// dans les link avec une icone, stylesheet, etc récupère l’ url.
foreach ( $matches as $i => $key ) {
$type = ( strpos ( $key [ 1 ], 'stylesheet' ) !== FALSE ) ? 'css' : 'other' ;
if ( ( preg_match_all ( '#(href|src)=["\']([^"\']*)["\']#i' , $matches [ $i ][ 0 ], $matches_attr , PREG_SET_ORDER ) === 1 ) ) {
$retrievable = add_table_and_replace ( $data , $retrievable , $matches [ $i ][ 0 ], $matches_attr [ 0 ][ 2 ], $url_p , $type );
}
}
// recherche les images, scripts, audio & videos HTML5.
// dans les balises, récupère l’ url/uri contenue dans les src="".
// le fichier sera téléchargé.
// Le nom du fichier sera modifié pour être unique, et sera aussi modifié dans le code source.
$matches = array ();
preg_match_all ( '#<\s*(source|audio|img|script|video)[^>]+src="([^"]*)"[^>]*>#Si' , $data , $matches , PREG_SET_ORDER );
foreach ( $matches as $i => $key ) {
if ( preg_match ( '#^data:#' , $matches [ $i ][ 2 ])) break ;
$retrievable = add_table_and_replace ( $data , $retrievable , $matches [ $i ][ 0 ], $matches [ $i ][ 2 ], $url_p , 'other' );
}
// Dans les balises <style>, remplace les url() et src()
$matches = array ();
preg_match_all ( '#<\s*style[^>]*>(.*?)<\s*/\s*style[^>]*>#is' , $data , $matches , PREG_SET_ORDER );
// pour chaque élement <style>
foreach ( $matches as $i => $value ) {
$matches_url = array ();
preg_match_all ( '#url\s*\(("|\')?([^\'")]*)(\'|")?\)#i' , $matches [ $i ][ 1 ], $matches_url , PREG_SET_ORDER );
2013-06-22 16:17:11 +02:00
$matches_url2 = array ();
preg_match_all ( " #@import \ s*( \" ([^ \" >]*) \" ?|'([^'>]*)'?)([^;]*)(;| $ )#i " , $matches [ $i ][ 1 ], $matches_url2 , PREG_SET_ORDER );
$matches_url = array_merge ( $matches_url2 , $matches_url );
//echo '<pre>';print_r($matches_url);die;
2013-06-20 23:23:42 +02:00
// pour chaque URL/URI
foreach ( $matches_url as $j => $valuej ) {
if ( preg_match ( '#^data:#' , $matches_url [ $j ][ 2 ])) break ;
$retrievable = add_table_and_replace ( $data , $retrievable , $matches [ $i ][ 1 ], $matches_url [ $j ][ 2 ], $url_p , 'other' );
}
}
// recherche les url dans les CSS inlines.
$matches = array ();
// pour chaque élement contenant un style=""
preg_match_all ( '#<\s*[^>]+style="([^"]*url\s*\(([^)]*)\)[^"]*)"[^>]*>+#is' , $data , $matches , PREG_SET_ORDER );
foreach ( $matches as $i => $value ) {
$matches_url = array ();
// pour chaque URL/URI trouvé
preg_match_all ( '#url\s*\(("|\')?([^\'")]*)(\'|")?\)#i' , $matches [ $i ][ 1 ], $matches_url , PREG_SET_ORDER );
foreach ( $matches_url as $j => $valuej ) {
if ( preg_match ( '#^data:#' , $matches_url [ $j ][ 2 ])) break ; // if BASE64 data, dont download.
$retrievable = add_table_and_replace ( $data , $retrievable , $matches [ $i ][ 1 ], $matches_url [ $j ][ 2 ], $url_p , 'other' );
}
}
return $retrievable ;
}
function absolutes_links ( & $data ) {
$url_p = url_parts ();
// cherche les balises 'a' qui contiennent un href
$matches = array ();
preg_match_all ( '#<\s*a[^>]+href=["\'](([^"\']*))["\'][^>]*>#Si' , $data , $matches , PREG_SET_ORDER );
// ne conserve que les liens ne commençant pas par un protocole « protocole:// » ni par une ancre « # »
foreach ( $matches as $i => $link ) {
$link [ 1 ] = trim ( $link [ 1 ]);
if ( ! preg_match ( '#^(([a-z]+://)|(\#))#' , $link [ 1 ]) ) {
2013-06-22 16:17:11 +02:00
$matches [ $i ][ 1 ] = complete_url ( $link [ 1 ]);
2013-06-20 23:23:42 +02:00
$new_match = str_replace ( $matches [ $i ][ 2 ], $matches [ $i ][ 1 ], $matches [ $i ][ 0 ]);
$data = str_replace ( $matches [ $i ][ 0 ], $new_match , $data );
}
2013-06-22 16:17:11 +02:00
}
}
2013-06-20 23:23:42 +02:00
2013-06-22 16:17:11 +02:00
function complete_url ( $url ) {
$home_p = url_parts ();
2013-06-20 23:23:42 +02:00
2013-06-22 16:17:11 +02:00
$url = trim ( $url );
if ( $url === '' ) {
return '' ;
2013-06-20 23:23:42 +02:00
}
2013-06-22 16:17:11 +02:00
// echo $url."\n\n\n";
$hash_pos = strrpos ( $url , '#' );
$fragment = $hash_pos !== false ? '#' . substr ( $url , $hash_pos ) : '' ;
$sep_pos = strpos ( $url , '://' );
if ( $sep_pos === false || $sep_pos > 5 ) {
switch ( $url { 0 }) {
// absolute path w/o HTTP and relatives paths
case '/' :
$url = substr ( $url , 0 , 2 ) === '//' ? $home_p [ 's' ] . ':' . $url : $home_p [ 's' ] . '://' . $home_p [ 'h' ] . $url ;
break ;
// php query string
case '?' :
$url = $home_p [ 'h' ] . '/' . $home_p [ 'file' ] . $url ;
break ;
// html # particule
case '#' :
// magnet & mailto
case 'm' :
// javascript
case 'j' :
break ;
default :
$url = $home_p [ 'h' ] . '/' . $url ;
break ;
}
}
// echo $url."\n\n\n";
return $url ;
2013-06-20 23:23:42 +02:00
}
function add_table_and_replace ( & $data , $retrievable , & $match1 , $match , $url_p , $type ) {
// get the filenam (basename)
2013-10-19 12:41:06 +02:00
global $GLOBAL ;
2013-06-20 23:23:42 +02:00
$nom_fichier = ( preg_match ( '#^https?://#' , $match )) ? pathinfo ( parse_url ( $match , PHP_URL_PATH ), PATHINFO_BASENAME ) : pathinfo ( $match , PATHINFO_BASENAME );
// get the URL. For relatives URL, uses the GLOBALS[url] tu make the complete URL
// the files in CSS are relative to the CSS !
if ( preg_match ( '#^https?://#' , $match )) { // url
$url_fichier = $match ;
}
elseif ( preg_match ( '#^//#' , $match )) { // absolute path w/o HTTP
$url_fichier = $url_p [ 's' ] . ':' . $match ;
}
elseif ( preg_match ( '#^/#' , $match )) { // absolute local path
$url_fichier = $url_p [ 's' ] . '://' . $url_p [ 'h' ] . $match ;
}
else { // relative local path
2013-10-16 13:08:47 +02:00
$uuu = ( strlen ( $url_p [ 'file' ]) == 0 or preg_match ( '#/$#' , $url_p [ 'pat' ])) ? $GLOBAL [ 'url' ] : substr ( $GLOBAL [ 'url' ], 0 , - strlen ( $url_p [ 'file' ])) ;
2013-06-20 23:23:42 +02:00
$url_fichier = $uuu . substr ( $match , 0 , - strlen ( $nom_fichier )) . $nom_fichier ;
}
$url_fichier = html_entity_decode ( urldecode ( $url_fichier ));
// new rand name, for local storage.
$nouveau_nom = rand_new_name ( $nom_fichier );
if ( $type == 'css' ) {
$nouveau_nom = $nouveau_nom . '.css' ;
}
$add = TRUE ;
// avoids downloading the same file twice.
foreach ( $retrievable as $key => $item ) {
if ( $item [ 'url_fichier' ] == $url_fichier ) {
$nouveau_nom = $item [ 'nom_destination' ];
$add = FALSE ;
break ;
}
}
// if we do want to download it, we add to the array.
if ( $add === TRUE ) {
$retrievable [] = array (
'url_origine' => $match ,
'url_fichier' => $url_fichier ,
'nom_fich_origine' => $nom_fichier ,
'nom_destination' => $nouveau_nom ,
'type' => $type
);
}
// replace the URL with the new filename in the &data.
$new_match = str_replace ( $match , $nouveau_nom , $match1 );
$data = str_replace ( $match1 , $new_match , $data );
$match1 = $new_match ;
return $retrievable ;
}
2013-06-22 16:17:11 +02:00
function rand_new_name ( $name ) {
$name = substr ( $name , 0 , (( $w = strpos ( $name , '?' )) ? $w : strlen ( $name )));
return 'f_' . str_shuffle ( 'abcd' ) . mt_rand ( 100 , 999 ) . '--' . preg_replace ( '#[^\w.]#' , '_' , substr ( $name , 15 )) . '.' . pathinfo ( $name , PATHINFO_EXTENSION );
}
2013-10-16 13:08:47 +02:00
if ( $GLOBAL [ 'done' ][ 'd' ] !== FALSE ) {
switch ( $GLOBAL [ 'done' ][ 'd' ]) {
2013-06-20 23:23:42 +02:00
case 'ajout' :
2013-10-16 13:08:47 +02:00
header ( 'Location: index.php?done=' . $GLOBAL [ 'done' ][ 'd' ] . '&lien=' . urlencode ( $GLOBAL [ 'url' ]) . '&loclink=' . urlencode ( $GLOBAL [ 'done' ][ 'lien' ]));
2013-06-20 23:23:42 +02:00
break ;
case 'remove' :
2013-10-16 13:08:47 +02:00
header ( 'Location: index.php?done=' . $GLOBAL [ 'done' ][ 'd' ]);
2013-06-20 23:23:42 +02:00
break ;
}
echo '</div>' . " \n " ;
}
/*
* Displays main form ( page to retrieve )
*
*/
2013-06-21 09:24:00 +02:00
?>
<! DOCTYPE html >
< html >
< head >
2013-10-16 13:08:47 +02:00
< ? php
if ( ! empty ( $_GET [ 'publicget' ])){
$id = strip_tags ( $_GET [ 'publicget' ]);
$temp = parse_ini_file ( $GLOBAL [ 'public_data_folder' ] . '/' . $id . '/index.ini' );
$page_title = $temp [ 'TITLE' ];
} else if ( ! empty ( $search_tags )){
$page_title = 'Tag: ' . $search_tags ;
}
else { $page_title = 'Respawn – a PHP WebPage Saver' ; }
?>
2013-06-21 09:24:00 +02:00
< meta charset = " utf-8 " /></ head >
2013-10-16 13:08:47 +02:00
< title >< ? php echo $page_title ; ?> </title>
2013-06-21 09:24:00 +02:00
< link rel = " stylesheet " type = " text/css " href = " design/style.css " />
2013-10-19 12:41:06 +02:00
< ? php link2favicon ( $target ); ?>
2013-06-21 09:24:00 +02:00
<!-- [ if IE ] >< script > document . createElement ( " article " ); document . createElement ( " aside " ); document . createElement ( " section " ); document . createElement ( " footer " ); </ script > <! [ endif ] -->
</ head >
2013-06-25 12:05:16 +02:00
< body < ? php echo $bodyclass ; ?> >
2013-10-16 13:08:47 +02:00
< header >< a href = " <?php echo $GLOBAL['respawn_url'] . $publicarg ; ?> " >< img src = " design/logo2.png " /></ a >
2013-06-21 09:24:00 +02:00
< nav id = " orpx_nav-bar " >
< ? php
2013-10-16 13:08:47 +02:00
if ( ! $GLOBAL [ 'public' ]){
2013-10-19 12:41:06 +02:00
echo " \t " . '<form method="get" action="' . $_SERVER [ 'PHP_SELF' ] . '" >' . " \n " ;
2013-06-21 09:24:00 +02:00
echo " \t \t " . '<input id="____q" type="text" size="70" name="q" value="" placeholder="URL from the page to download" />' . " \n " ;
echo " \t \t " . '<input type="submit" value="Retrieve"/>' . " \n " ;
echo " \t " . '</form>' . " \n " ;
2013-10-16 13:08:47 +02:00
} else {
echo '<p>' ;
if ( ! empty ( $target )){ echo $page_title . ' <a class="zip" href="?zippublic=' . strip_tags ( $_GET [ 'publicget' ]) . '" title="Get ZIP version"></a>' ;} else { echo $GLOBAL [ 'message' ];}
echo '</p>' ;
}
echo '<div class="tag_cloud">' ;
tagcloud ();
echo '</div>' ;
2013-06-21 09:24:00 +02:00
?>
</ nav >
</ header >
< aside >
< ? php
2013-06-25 12:05:16 +02:00
if ( ! empty ( $target )){
2013-07-07 11:28:21 +02:00
echo '<iframe name="embed" style="min-height: 800px;" src="' . $target . '" width="100%" height="100%" scrolling="auto" frameborder="0" allowtransparency="true" ></iframe>' ;
2013-06-25 12:05:16 +02:00
} else {
2013-10-16 13:08:47 +02:00
if ( ! empty ( $search_tags )){ echo '<h2> Tag : <em>' . $search_tags . '</em> - <a href="' . $GLOBAL [ 'respawn_url' ] . '">No tag</a></h2><hr/>' ;}
if ( ! $GLOBAL [ 'public' ]){
2013-06-25 12:05:16 +02:00
if ( isset ( $_GET [ 'done' ]) and $_GET [ 'done' ] !== FALSE ) {
echo '<div id="new-link">' . " \n " ;
switch ( $_GET [ 'done' ]) {
case 'ajout' :
echo " \t " . '<a target="_blank" href="' . urldecode ( $_GET [ 'loclink' ]) . '">Retrieved page</a> - (<a href="' . htmlspecialchars ( urldecode ( $_GET [ 'lien' ])) . '">orig. page</a>)' . " \n " ;
break ;
case 'remove' :
echo " \t " . 'Page removed' . " \n " ;
break ;
2013-06-20 23:23:42 +02:00
}
2013-06-25 12:05:16 +02:00
echo '</div>' . " \n " ;
2013-06-20 23:23:42 +02:00
}
}
2013-06-25 12:05:16 +02:00
// public pages
echo '<div class="public" style="' . $column_width . '">' . " \n " ;
2013-10-16 13:08:47 +02:00
$liste_pages = search ( 'public' , $search_tags );
2013-06-21 09:24:00 +02:00
if ( ( $nb = count ( $liste_pages )) != 0 ) {
echo '<ul id="liste-pages-sauvees">' . " \n " ;
for ( $i = 0 ; $i < $nb ; $i ++ ) {
// dont list '.' and '..' folders.
2013-10-16 13:08:47 +02:00
if ( is_dir ( $GLOBAL [ 'public_data_folder' ] . '/' . $liste_pages [ $i ]) and ( $liste_pages [ $i ] != '.' ) and ( $liste_pages [ $i ] != '..' )) {
2013-06-21 09:24:00 +02:00
// each folder should contain such a file "index.ini".
2013-10-16 13:08:47 +02:00
$ini_file = $GLOBAL [ 'public_data_folder' ] . '/' . $liste_pages [ $i ] . '/index.ini' ;
$favicon = glob ( $GLOBAL [ 'public_data_folder' ] . '/' . $liste_pages [ $i ] . '/*favicon.*' );
2013-06-25 12:05:16 +02:00
2013-06-22 16:17:11 +02:00
$favicon = ( isset ( $favicon [ 0 ])) ? $favicon [ 0 ] : '' ;
2013-06-21 09:24:00 +02:00
if ( is_file ( $ini_file ) and is_readable ( $ini_file ) ) {
$infos = parse_ini_file ( $ini_file );
} else {
$infos = FALSE ;
}
if ( FALSE !== $infos ) {
2013-10-19 12:41:06 +02:00
$titre = $infos [ 'TITLE' ]; $url = $infos [ 'URL' ]; $date = @ date ( 'd/m/Y, H:i:s' , $infos [ 'DATE' ]);
2013-06-21 09:24:00 +02:00
} else {
$titre = 'titre' ; $url = '#' ; $date = 'date inconnue' ;
}
2013-10-16 13:08:47 +02:00
$tags = $taglinks = '' ;
if ( isset ( $GLOBAL [ 'tag_array' ][ 'public' ][ $liste_pages [ $i ]])){ $tags = $GLOBAL [ 'tag_array' ][ 'public' ][ $liste_pages [ $i ]]; $taglinks = tag2links ( $GLOBAL [ 'tag_array' ][ 'public' ][ $liste_pages [ $i ]]);}
2013-06-25 12:05:16 +02:00
echo " \t " . '<li>' ;
2013-10-19 12:41:06 +02:00
if ( ! $GLOBAL [ 'public' ]){ echo '<a class="icon suppr" onclick="return window.confirm(\'Sure to remove?\')" href="?suppr=' . $GLOBAL [ 'public_data_folder' ] . '/' . $liste_pages [ $i ] . '" title="suppr">X</a>' ;}
if ( ! $GLOBAL [ 'public' ]){ echo '<a class="icon rename" onclick="rename(\'' . $GLOBAL [ 'public_data_folder' ] . '/' . $liste_pages [ $i ] . '\',\'' . $titre . '\',this)" href="" title="rename">R</a>' ;}
if ( ! $GLOBAL [ 'public' ]){ echo '<a class="icon tagme" onclick="tag(\'&ispublic\',\'' . $liste_pages [ $i ] . '\',\'' . $tags . '\',this)" href="#" title="edit tags">T</a>' ;}
echo '<a class="icon zip" href="?zippublic=' . $liste_pages [ $i ] . '" title="Download zip version">Z</a><a class="icon origine" href="' . $url . '" title="origin">➦</a> - <a href="?public&publicget=' . $liste_pages [ $i ] . '"><img src="' . $favicon . '"/>' . $titre . '</a> <em> [' . $date . ']</em> ' . $taglinks ;
2013-10-16 13:08:47 +02:00
if ( ! $GLOBAL [ 'public' ]){ echo '<a href="?toprivate=' . $liste_pages [ $i ] . '" class="toprivate" title="Change to private">▶</a></li>' . " \n " ;} else { echo " </li> \n " ;}
2013-06-21 09:24:00 +02:00
}
}
echo '</ul>' . " \n " ;
2013-10-16 13:08:47 +02:00
} else { echo 'Nothing found...' ;}
2013-06-21 09:24:00 +02:00
echo '</div>' . " \n " ;
2013-06-25 12:05:16 +02:00
2013-10-16 13:08:47 +02:00
// PRIVATE PAGES ------------------------------------------------------------------------------------------
if ( ! $GLOBAL [ 'public' ]){
2013-06-25 12:05:16 +02:00
echo '<div class="private" style="' . $column_width . '">' . " \n " ;
2013-10-16 13:08:47 +02:00
$liste_pages = search ( 'private' , $search_tags );
2013-06-25 12:05:16 +02:00
if ( ( $nb = count ( $liste_pages )) != 0 ) {
echo '<ul id="liste-pages-sauvees">' . " \n " ;
for ( $i = 0 ; $i < $nb ; $i ++ ) {
// dont list '.' and '..' folders.
2013-10-16 13:08:47 +02:00
if ( is_dir ( $GLOBAL [ 'private_data_folder' ] . '/' . $liste_pages [ $i ]) and ( $liste_pages [ $i ] != '.' ) and ( $liste_pages [ $i ] != '..' )) {
2013-06-25 12:05:16 +02:00
// each folder should contain such a file "index.ini".
2013-10-16 13:08:47 +02:00
$ini_file = $GLOBAL [ 'private_data_folder' ] . '/' . $liste_pages [ $i ] . '/index.ini' ;
$favicon = glob ( $GLOBAL [ 'private_data_folder' ] . '/' . $liste_pages [ $i ] . '/*favicon.*' );
2013-06-25 12:05:16 +02:00
$favicon = ( isset ( $favicon [ 0 ])) ? $favicon [ 0 ] : '' ;
if ( is_file ( $ini_file ) and is_readable ( $ini_file ) ) {
$infos = parse_ini_file ( $ini_file );
} else {
$infos = FALSE ;
}
if ( FALSE !== $infos ) {
$titre = $infos [ 'TITLE' ]; $url = $infos [ 'URL' ]; $date = date ( 'd/m/Y, H:i:s' , $infos [ 'DATE' ]);
} else {
$titre = 'titre' ; $url = '#' ; $date = 'date inconnue' ;
}
2013-10-16 13:08:47 +02:00
$tags = $taglinks = '' ;
if ( isset ( $GLOBAL [ 'tag_array' ][ 'private' ][ $liste_pages [ $i ]])){ $tags = $GLOBAL [ 'tag_array' ][ 'private' ][ $liste_pages [ $i ]]; $taglinks = tag2links ( $GLOBAL [ 'tag_array' ][ 'private' ][ $liste_pages [ $i ]]);}
2013-10-19 12:41:06 +02:00
echo " \t " . '<li><a class="icon suppr" onclick="return window.confirm(\'Sure to remove?\')" href="?suppr=' . $GLOBAL [ 'private_data_folder' ] . '/' . $liste_pages [ $i ] . ' " title= " suppr " >X</a>
< a class = " icon rename " onclick = " rename( \ ''. $GLOBAL['public_data_folder'] .'/'. $liste_pages[$i] .' \ ', \ ''. $titre .' \ ',this) " href = " # " title = " rename " > R </ a >
< a class = " icon tagme " onclick = " tag( \ ' \ ', \ ''. $liste_pages[$i] .' \ ', \ ''. $tags .' \ ',this) " href = " # " title = " edit tags " > T </ a >
< a class = " icon zip " href = " ?zipprivate='. $liste_pages[$i] .' " title = " Download zip version " > Z </ a >
< a class = " icon origine " href = " '. $url .' " title = " origin " >& #10150;</a> - <a href="?privateget='.$liste_pages[$i].'"><img src="'.$favicon.'"/>'.$titre.'</a> <em> ['.$date.']</em> '.$taglinks.' <a href="?topublic='.$liste_pages[$i].'" class="topublic" title="Change to public">◀</a></li>'."\n";
2013-06-25 12:05:16 +02:00
}
}
echo '</ul>' . " \n " ;
2013-10-16 13:08:47 +02:00
} else { echo 'Nothing found...' ;}
2013-06-25 12:05:16 +02:00
echo '</div>' . " \n " ;
}
2013-06-21 09:24:00 +02:00
}
?>
</ aside >
2013-10-16 13:08:47 +02:00
< footer >
< a title = 'from TiMo' href = 'http://lehollandaisvolant.net/index.php?mode=links&id=20121211195941' > Respawn </ a > ( bronco edition v < ? php echo $GLOBAL [ 'version' ]; ?> ) - <a href='?public'>Public page link</a> -
< a href = " ?rss<?php if ( $search_tags !='') { echo '&tag='. $search_tags ; }?> " > RSS </ a > -
< ? php if ( ! $GLOBAL [ 'public' ]){ echo $bookmarklet ;} ?> -
2013-10-19 12:41:06 +02:00
< ? php if ( ! $GLOBAL [ 'public' ]){ echo '<a href="?discotime">Disconnect</a>' ;} else { echo '<a href="login_form.php">Admin</a>' ;} ?>
2013-10-16 13:08:47 +02:00
</ footer >
< script >
function rename ( file , oldname , obj ){
newname = prompt ( 'Rename this page:' , oldname );
if ( newname && newname != oldname ){
obj . setAttribute ( 'href' , " <?php echo $GLOBAL['respawn_url'] ; ?>?rename= " + encodeURIComponent ( oldname ) + " &to= " + encodeURIComponent ( newname ) + " &file= " + file );
} else {}
}
function tag ( ispublic , file , oldtags , obj ){
newtags = prompt ( 'Tags for this page:' , oldtags );
if ( newtags && newtags != oldtags ){
obj . setAttribute ( 'href' , " <?php echo $GLOBAL['respawn_url'] ; ?>?settag= " + encodeURIComponent ( newtags ) + " &file= " + file + ispublic );
} else {}
}
</ script >
2013-06-21 09:24:00 +02:00
</ body >
</ html >