commit b77bdd3da1ca26324fc43f17629f1cd386d303e2 Author: Bronco Date: Thu Jun 20 23:23:42 2013 +0200 Version 1.0 à la pelle de chantier diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..412eeda --- /dev/null +++ b/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b9d6bd9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,215 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +build/ +[Bb]in/ +[Oo]bj/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml +*.pubxml + +# NuGet Packages Directory +## TODO: If you have NuGet Package Restore enabled, uncomment the next line +#packages/ + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + +############# +## Windows detritus +############# + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac crap +.DS_Store + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist/ +build/ +eggs/ +parts/ +var/ +sdist/ +develop-eggs/ +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg diff --git a/auto_restrict.php b/auto_restrict.php new file mode 100644 index 0000000..3dc2206 --- /dev/null +++ b/auto_restrict.php @@ -0,0 +1,183 @@ +'); + include('login_form.php');exit(); + } + else{ # On affiche un formulaire invitant à rentrer le mdp puis on exit le script + include('login_form.php');exit(); + } + } + // --------------------------------------------------------------------------------- + + + // ------------------------------------------------------------------ + + // ------------------------------------------------------------------ + // gestion de post pour demande de connexion + // si un utilisateur tente de se loguer, on gère ici + // ------------------------------------------------------------------ + if (isset($_POST['login'])&&isset($_POST['pass'])){ + log_user($_POST['login'],$_POST['pass']); + if (isset($_POST['cookie'])){setcookie($auto_restrict['cookie_name'],sha1($_SERVER['HTTP_USER_AGENT']),time()+31104000);}//un an + } + + // ------------------------------------------------------------------ + // si pas de demande de connexion on verifie les vars de session + // et la duree d'inactivité de la session + // si probleme,on include un form de login. + // ------------------------------------------------------------------ + if (!is_ok()){session_destroy();include('login_form.php');exit();} + // ------------------------------------------------------------------ + // demande de deco via la variable get 'deconnexion' + // ------------------------------------------------------------------ + if (isset($_GET['deconnexion'])){log_user($_POST['login'],$_POST['pass']);} + // ------------------------------------------------------------------ + + + + + + // ------------------------------------------------------------------ + // fonctions de cryptage + // récupérées sur http://www.info-3000.com/phpmysql/cryptagedecryptage.php + // ------------------------------------------------------------------ + function GenerationCle($Texte,$CleDEncryptage) + { + $CleDEncryptage = md5($CleDEncryptage); + $Compteur=0; + $VariableTemp = ""; + for ($Ctr=0;$Ctr \ No newline at end of file diff --git a/design/actions.png b/design/actions.png new file mode 100644 index 0000000..ac00de9 Binary files /dev/null and b/design/actions.png differ diff --git a/design/favicon2.png b/design/favicon2.png new file mode 100644 index 0000000..a59cb06 Binary files /dev/null and b/design/favicon2.png differ diff --git a/design/foil.png b/design/foil.png new file mode 100644 index 0000000..68f3961 Binary files /dev/null and b/design/foil.png differ diff --git a/design/lined_paper.png b/design/lined_paper.png new file mode 100644 index 0000000..fe703c4 Binary files /dev/null and b/design/lined_paper.png differ diff --git a/design/logo2.png b/design/logo2.png new file mode 100644 index 0000000..703c90d Binary files /dev/null and b/design/logo2.png differ diff --git a/design/paper.png b/design/paper.png new file mode 100644 index 0000000..5977961 Binary files /dev/null and b/design/paper.png differ diff --git a/design/style.css b/design/style.css new file mode 100644 index 0000000..d2670cc --- /dev/null +++ b/design/style.css @@ -0,0 +1,52 @@ +* { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } +body { + background:url(paper.png) #efe; + width: 100%; + margin:0;padding:0; + font-family: Georgia, Serif;font-size : 16px; color: #050; +} +a:hover { color: #050;text-shadow:0 0 5px green;} + +a { color: black; text-decoration: none;} + +input{outline:none;-moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; height:25px;padding : 3px ; vertical-align: bottom; margin-top : 3px ;} +input[type=text]{width:80%;min-width:200px; background-color:rgba(255,255,255,0.8);border:1px solid #444;border-top-color:#333;border-bottom-color:#aaa; -moz-box-shadow: inset 0 1px 3px #000000; -webkit-box-shadow: inset 0 1px 3px #000000; box-shadow: inset 0 1px 3px #000000; #000} +input[type=text]:hover{background-color:rgba(200,255,200,0.8);-moz-box-shadow: inset 0 1px 3px #040; -webkit-box-shadow: inset 0 1px 3px #040; box-shadow: inset 0 1px 3px #040; } +input[type=text]:focus{background-color:rgba(200,255,200,0.9);-moz-box-shadow: inset 0 0 3px #040; -webkit-box-shadow: inset 0 0 3px #040; box-shadow: inset 0 0 3px #040; } +input[type=submit]{cursor: pointer; border:1px solid #494;border-bottom-color:#272;border-top-color:#afa; background-color:rgba(0,200,0,0.8); -moz-box-shadow: 0 1px 2px #080; -webkit-box-shadow: 0 1px 2px #080; box-shadow: 0 1px 2px #080; -ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=2, Direction=135, Color='#000')"; filter: progid:DXImageTransform.Microsoft.Shadow(Strength=2, Direction=135, Color='#000'); } +input[type=submit]:hover{ background-color:rgba(0,255,0,0.8);} +input[type=submit]:active{border-color:black; background-color:rgba(0,255,0,0.8);} +#____q{margin-top:20px;} +header{ + -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; + border-bottom:1px solid #222; + -moz-box-shadow: 0 1px 3px #888; -webkit-box-shadow: 0 1px 3px #888; box-shadow: 0 1px 3px #888; -ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=2, Direction=135, Color='#888')"; filter: progid:DXImageTransform.Microsoft.Shadow(Strength=2, Direction=135, Color='#888'); + padding : 10px ; width: 100%; height:auto;margin: 0; + text-align: left;box-shadow: 0 1px 2px; + filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #555, endColorstr = #333); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #555, endColorstr = #333)"; + background-image: -moz-linear-gradient( top, #555, #333); background-image: -ms-linear-gradient( top, #555, #333); + background-image: -o-linear-gradient( top, #555, #333); background-image: -webkit-gradient(linear, center top, center bottom, from(#555), to(#333)); background-image: -webkit-linear-gradient( top, #555, #333); background-image: linear-gradient( top, #555, #333); +} + header nav{display:inline-block; vertical-align: top;} + +aside{height:100%;padding-bottom : 70px;text-align:center;} +aside ul{padding:0;} +aside li{margin:5px;list-style:none;vertical-align:middle;border-radius:3px;} +aside .public li{background:rgba(100,255,100,0.2);} +aside .private li{background:rgba(255,100,100,0.2);} +aside li em {font-size:10px ; color:#484;} +aside li img {vertical-align:bottom;margin:1px;width:16px;height:16px;} +aside li a.suppr, aside li a.origine{opacity:0.5;width:16px;height:16px;display:inline-block;background:url(actions.png) no-repeat 0 -159px ;} +aside li a.origine{background-position: 0 -396px ;} +aside li a.suppr:hover,aside li a.origine:hover{opacity:1;} +aside li a.toprivate,aside li a.topublic{float:right;margin-right:5px;opacity:0.5;} +aside li a.toprivate:hover,aside li a.topublic:hover{opacity:1;} + +aside .public,.private{text-align:left;vertical-align:top; margin-top:25px;padding:10px; border-radius:5px; border:1px dashed;display:inline-block;width:45%;} +aside .public{border-color:green;} +aside .private{border-color:red;} +footer {text-align: right; color:#F80;text-shadow: 0 1px 1px black; position:fixed;bottom:0;left:0;right:0;height:auto;min-height:20px;padding : 5px ; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; border-top:1px solid #888;-moz-box-shadow: 0 0px 9px #000; -webkit-box-shadow: 0 0px 9px #000; box-shadow: 0 0px 9px #000; -ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=9, Direction=135, Color='#000')"; filter: progid:DXImageTransform.Microsoft.Shadow(Strength=9, Direction=135, Color='#000'); filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #555, endColorstr = #333); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #555, endColorstr = #333)"; background-image: -moz-linear-gradient( top, #555, #333); background-image: -ms-linear-gradient( top, #555, #333); background-image: -o-linear-gradient( top, #555, #333); background-image: -webkit-gradient(linear, center top, center bottom, from(#555), to(#333)); background-image: -webkit-linear-gradient( top, #555, #333); background-image: linear-gradient( top, #555, #333); } + footer p {margin:0;padding:0;color:lightgreen;text-shadow:0 1px 1px green;} + footer a {color:lightgreen;text-shadow:0 1px 1px green;} + footer a:hover {color:white;} + diff --git a/index.php b/index.php new file mode 100644 index 0000000..58af406 --- /dev/null +++ b/index.php @@ -0,0 +1,619 @@ +Bookmarklet'; +if ($public){$bookmarklet='';} +if (!creer_dossier($GLOBALS['data_folder'], TRUE)) { die('Cant create '.$GLOBALS['data_folder'].' folder.'); } +if (!creer_dossier($GLOBALS['private_data_folder'], TRUE)) { die('Cant create '.$GLOBALS['private_data_folder'].' folder.'); } +if (!creer_dossier($GLOBALS['public_data_folder'], TRUE)) { die('Cant create '.$GLOBALS['public_data_folder'].' folder.'); } + +// +// BEGIN SCRIPT +// + +#TODO +/* +- remplacer les liens relatifs par les liens absolus (ne chercher que les liens relatifs, uri) +- gestion des pages DL (classement ?) +- gestion de la taille max des fichiers à télélcharger + + +*/ + +// init +// url not yet retrieved +$GLOBALS['done']['d'] = FALSE; +if (!$public){ + // Get URL to save. + if (!empty($_GET['q'])) { + + + $url = htmlspecialchars($_GET['q']); + if (strpos($url, '://') === false) { + $url = 'http://'.$url; + } + $GLOBALS['url'] = $url; + $url_p = url_parts(); + + // retrieve the file main HTML file + + $GLOBALS['main_page_data'] = get_external_file($GLOBALS['url'], 6); + + + if ($GLOBALS['main_page_data'] === FALSE) { + 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'); + if (!creer_dossier($GLOBALS['default_data_folder'].'/'.$new_folder) === TRUE ) { + die('error creating data folder'); + } + else { + $GLOBALS['target_folder'] = $GLOBALS['default_data_folder'].'/'.$new_folder; + } + $liste_css = array(); + // parse le fichier principal à la recherche de données à télécharger + $files = list_retrievable_data($GLOBALS['url'], $GLOBALS['main_page_data']); + // les récupère et les enregistre. + //echo '
';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 {
+						file_put_contents($GLOBALS['target_folder'].'/'.$file['nom_destination'], $data);
+					}
+				}
+			}
+			// remplace juste les liens  relatifs vers des liens absolus
+			absolutes_links($GLOBALS['main_page_data']);
+
+			// enregistre le fichier HTML principal
+			file_put_contents($GLOBALS['target_folder'].'/'.'index.html', $GLOBALS['main_page_data']);
+
+			// 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
+			preg_match('##Usi', $GLOBALS['main_page_data'], $meta);
+
+			// 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()
+			preg_match('#(.*)#Usi', $GLOBALS['main_page_data'], $titles);
+			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;
+			}
+
+
+			// récupère, parse, modifie & enregistre les fichier CSS (et les fichiés liés)
+			$n = 0;
+			$count = count($liste_css);
+			while ( $n < $count ) {
+				$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*\(("|\')?([^\'")]*)(\'|")?\)#i', $data, $matches_url, PREG_SET_ORDER);
+						$matches_url2 = array();
+						preg_match_all('#@import\s*(url\()?["\']?([^\'"\(\);]*)["\']?\)?([^;]*);#i', $data, $matches_url2, PREG_SET_ORDER);
+
+						$matches_url = array_merge($matches_url2, $matches_url);
+				
+						// pour chaque URL/URI
+						foreach ($matches_url as $j => $valuej) {
+
+							if (preg_match('#^data:#', $matches_url[$j][2])) break; // if BASE64 data, dont download.
+
+							// 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);
+
+							// 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];
+							}
+							elseif (preg_match('#^/#', $matches_url[$j][2])) {
+								$url_fichier = $url_p['s'].'://'.$url_p['h'].$matches_url[$j][2];
+							}
+							else {
+								$url_fichier = substr($file['url_fichier'], 0, -strlen($file['nom_fich_origine'])).$matches_url[$j][2];
+							}
+							// new rand name, for local storage.
+							$nouveau_nom = rand_new_name($nom_fichier);
+							$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;
+								}
+							}
+
+							// 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;
+							}
+
+							// replace url in CSS $data
+							$data = str_replace($matches_url[$j][2], $nouveau_nom, $data);
+							// echo $nouveau_nom."
\n"; + + if (!preg_match('#(css|php|txt|html)#', $file['url_fichier']) ) { + if (FALSE !== ($f = get_external_file($url_fichier, 3)) ) { + file_put_contents($GLOBALS['target_folder'].'/'.$nouveau_nom, $f); + } + } + } + } + + // don't forget to save data + file_put_contents($GLOBALS['target_folder'].'/'.$file['nom_destination'], $data); + } + $n++; + $count = count($liste_css); + } + + + // enregistre un fichier d’informations concernant la page (date, url, titre) + $info = ''; + $info .= 'URL="'.$GLOBALS['url'].'"'."\n"; + $info .= 'TITLE="'.$title.'"'."\n"; + $info .= 'DATE="'.time().'"'."\n"; + + file_put_contents($GLOBALS['target_folder'].'/'.'index.ini', $info); + + // + $GLOBALS['done']['d'] = 'ajout'; + $GLOBALS['done']['lien'] = $GLOBALS['target_folder'].'/'; + } + + } + + + // in case of delete an entry + if (isset($_GET['suppr']) and $torem = $_GET['suppr'] and $torem != '') { + $torem = htmlspecialchars($_GET['suppr']); + /* + $liste = scandir($GLOBALS['data_folder']); // listage des dossiers de data. + $nb_fichier = count($liste); + for ($i = 0 ; $i < $nb_fichier ; $i++) { + if ($liste[$i] == $torem and !($liste[$i] == '..' or $liste[$i] == '.')) {*/ + + // the folder exists and can be removed: + + + // included files first (noway doing it like "rmdir -R" :/) + + if (is_dir($_GET['suppr'])){ + $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'])) { + $GLOBALS['done']['d'] = 'remove'; + + } + } + + header("location: index.php"); + } + + // to private + if (isset($_GET['toprivate']) and $torem = $_GET['toprivate'] and $torem != '') { + $torem = htmlspecialchars($_GET['toprivate']); + if (is_dir($GLOBALS['public_data_folder'].'/'.$_GET['toprivate'])){ + rename ($GLOBALS['public_data_folder'].'/'.$_GET['toprivate'],$GLOBALS['private_data_folder'].'/'.$_GET['toprivate']); + header("location: index.php"); + } + } + // to public + if (isset($_GET['topublic']) and $torem = $_GET['topublic'] and $torem != '') { + $torem = htmlspecialchars($_GET['topublic']); + if (is_dir($GLOBALS['private_data_folder'].'/'.$_GET['topublic'])){ + rename ($GLOBALS['private_data_folder'].'/'.$_GET['topublic'],$GLOBALS['public_data_folder'].'/'.$_GET['topublic']); + header("location: index.php"); + } + } +} // end of private admin acces + +function url_parts() { + $url_p['s'] = parse_url($GLOBALS['url'], PHP_URL_SCHEME); $url_p['s'] = (is_null($url_p['s'])) ? '' : $url_p['s']; + $url_p['h'] = parse_url($GLOBALS['url'], PHP_URL_HOST); $url_p['h'] = (is_null($url_p['h'])) ? '' : $url_p['h']; + $url_p['p'] = parse_url($GLOBALS['url'], PHP_URL_PORT); $url_p['p'] = (is_null($url_p['p'])) ? '' : ':'.$url_p['p']; + $url_p['pat'] = parse_url($GLOBALS['url'], PHP_URL_PATH); $url_p['pat'] = (is_null($url_p['pat'])) ? '' : $url_p['pat']; + $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 + +
+
+ + Identifiez-vous';}else{echo '

Creez votre passe

';} ?> +
+ + +
+
+ + + +
+ +
+ +
+
\ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..d2b0ec4 --- /dev/null +++ b/readme.md @@ -0,0 +1,11 @@ +Ceci est un fork de l'appli Respawn de Timo le Hollandais Volant. +J'ai utilisé le moteur de cette appli et y ai ajouté quelques aspect : +-le verrouillage par mot de passe, +-deux espaces séparés : un public et un privé (dont on peut (doit!) renommer les dossiers dans la config) +-l'ajout (si possible) de la favicon +-l'ajout d'icones et d'un design un peu amélioré, même si beaucoup reste à faire (mais là j'ai les yeux qui piquent) +-l'ajout d'un logo propre à cette appli + +Merci à Timo pour cette merveille de simplicité et d'efficacité qui concourt à conserver et diffuser l'information ! + +Bronco - bronco@warriordudimanche.net \ No newline at end of file