diff --git a/_experimental/gatitac/index.php b/_experimental/gatitac/index.php
new file mode 100755
index 0000000..2481298
--- /dev/null
+++ b/_experimental/gatitac/index.php
@@ -0,0 +1 @@
+
diff --git a/_experimental/vvb.ini b/_experimental/gatitac/vvb.ini
similarity index 100%
rename from _experimental/vvb.ini
rename to _experimental/gatitac/vvb.ini
diff --git a/_experimental/icon-logo.svg b/_experimental/icon-logo.svg
new file mode 100755
index 0000000..1b73481
--- /dev/null
+++ b/_experimental/icon-logo.svg
@@ -0,0 +1 @@
+
diff --git a/_experimental/index.php b/_experimental/index.php
index b960739..e57fc2b 100755
--- a/_experimental/index.php
+++ b/_experimental/index.php
@@ -1 +1,462 @@
-
+loadXML($data) or die('xml malformé');
+ $title = $dom->getElementsByTagName('title');
+ return $title->item(0)->nodeValue;
+ }
+
+function get_link_from_feed($url)
+ {
+ // get site link from feed
+ $data = file_get_contents("$url");
+ $xml = simplexml_load_string($data); // quick feed check
+ if (isset($xml->entry)) // ATOM feed.
+ {$result="true";}
+ elseif (isset($xml->item)) // RSS 1.0 /RDF
+ {$result="true";}
+ elseif (isset($xml->channel->item)) // RSS 2.0
+ {$result="true";}
+ else
+ {$result="false";}
+ if($result == "false") { die('le flux n\'a pas une syntaxe valide'); }
+ $check = substr($data, 0, 5);
+ if($check !== 'channel->link;
+ if($channel['link'] === NULL)
+ {
+ $dom = new DOMDocument;
+ $dom->loadXML($data) or die('xml malformé');
+ $link = $dom->getElementsByTagName('uri');
+ return $link->item(0)->nodeValue;
+ }
+ else
+ {
+ return $channel['link'];
+ }
+ }
+
+function serverUrl()
+{
+ $https = (!empty($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS'])=='on')) || $_SERVER["SERVER_PORT"]=='443'; // HTTPS detection.
+ $serverport = ($_SERVER["SERVER_PORT"]=='80' || ($https && $_SERVER["SERVER_PORT"]=='443') ? '' : ':'.$_SERVER["SERVER_PORT"]);
+ return 'http'.($https?'s':'').'://'.$_SERVER["SERVER_NAME"].$serverport;
+}
+
+function NoProtocolSiteURL($url)
+ {
+ $siteurlnoprototypes = array("http://", "https://");
+ $siteurlnoproto = str_replace($siteurlnoprototypes, "", $url);
+ return $siteurlnoproto;
+ }
+
+function DetectRedirect($url)
+{
+$response = get_headers($url, 1);
+if(!empty($response['Location']))
+ {
+ $response2 = get_headers($response['Location'], 1);
+ if(!empty($response2['Location']))
+ {die('too much redirection');}
+ else { return $response['Location']; }
+ }
+else
+ {
+ return $url;
+ }
+}
+
+if (isset($_GET['check']))
+{
+$randomtime=rand(86400, 259200); /* intervalle de mise à jour: de 1 à 3 jours (pour éviter que le statut de tous les autoblogs soit rafraichi en bloc et bouffe le CPU) */
+$expire=time() -$randomtime ;
+
+/* SVG minimalistes */
+$svg_vert='';
+$svg_jaune='';
+$svg_rouge='';
+$svg_twitter='';
+$svg_identica='';
+$svg_statusnet='';
+
+ if(strpos($_GET['check'], 'twitter') !== FALSE) { header('Content-type: image/svg+xml');die($svg_twitter); }
+ if(strpos($_GET['check'], 'identica') !== FALSE) { header('Content-type: image/svg+xml');die($svg_identica); }
+ if(strpos($_GET['check'], 'statusnet') !== FALSE) { header('Content-type: image/svg+xml');die($svg_statusnet); }
+
+ $errorlog="./".$_GET['check']."/error.log";
+ if(file_exists($errorlog) && filemtime($errorlog) < $expire) { unlink($errorlog); } /* errorlog périmé ? Suppression. */
+ if(file_exists($errorlog)) /* errorlog existe encore ? se contenter de lire sa taille pour avoir le statut */
+ {
+ header('Content-type: image/svg+xml');
+ if(filesize($errorlog) == "0") {die($svg_vert);}
+ else if(filesize($errorlog) == "1") {die($svg_jaune);}
+ else {die($svg_rouge);}
+ }
+ else /* ..sinon, lancer la procédure de contrôle */
+ {
+ $ini = parse_ini_file("./".$_GET['check']."/vvb.ini") or die;
+ header('Content-type: image/svg+xml');
+ $headers = get_headers("$ini[FEED_URL]");
+ if(empty($headers)) { file_put_contents($errorlog, '..'); die($svg_rouge); } /* le flux est indisponible (typiquement: erreur DNS ou possible censure) - à vérifier */
+ $code=explode(" ", $headers[0]);
+ if($code[1] == "200") { file_put_contents($errorlog, ''); die($svg_vert);} /* code retour 200: flux disponible */
+ else {file_put_contents($errorlog, '.'); die($svg_jaune);} /* autre code retour: un truc a changé (redirection, changement de CMS, .. bref vvb.ini doit être corrigé) */
+ }
+}
+
+if (isset($_GET['export']))
+// autoblog exporting
+{
+header('Content-Type: application/json');
+$directory = "./";
+$subdirs = glob($directory . "*");
+foreach($subdirs as $unit)
+ {
+ if(is_dir($unit))
+ {
+ $unit=substr($unit, 2);
+ $ini = parse_ini_file($unit.'/vvb.ini');
+ $config = new stdClass;
+ foreach ($ini as $key=>$value)
+ {
+ $key = strtolower($key);
+ $config->$key = $value;
+ }
+ unset($ini);
+ $title=$config->site_title;
+ $url=$config->site_url;
+ $feed=$config->feed_url;
+ $reponse[$unit] = array("$title", "$url", "$feed");
+ }
+ }
+echo json_encode($reponse);
+die;
+}
+
+if (isset($_GET['feedexport']))
+// autoblog exporting -feed only
+{
+header('Content-Type: application/json');
+$directory = "./";
+$reponse="";
+$subdirs = glob($directory . "*");
+foreach($subdirs as $unit)
+ {
+ if(is_dir($unit))
+ {
+ $unit=substr($unit, 2);
+ $ini = parse_ini_file($unit.'/vvb.ini');
+ $config = new stdClass;
+ foreach ($ini as $key=>$value)
+ {
+ $key = strtolower($key);
+ $config->$key = $value;
+ }
+ unset($ini);
+ $feed=$config->feed_url;
+ $reponse=$reponse.";$feed";
+ }
+ }
+$reponse=substr($reponse, 1);
+echo json_encode(explode(';', $reponse));
+die;
+}
+
+if (isset($_GET['sitemap']))
+// url-list sitemap
+{
+header('Content-Type: text/plain');
+$directory = "./";
+$subdirs = glob($directory . "*");
+foreach($subdirs as $unit)
+ {
+ if(is_dir($unit))
+ {
+ $unit=substr($unit, 2);
+ $proto=$_SERVER['HTTPS']?"https://":"http://";
+ echo $proto.$_SERVER['SERVER_NAME'].substr($_SERVER['PHP_SELF'], 0, -9)."$unit/"."\n";
+ }
+ }
+die;
+}
+
+function escape($str)
+{
+ return htmlspecialchars($str, ENT_COMPAT, 'UTF-8', false);
+}
+
+$form = '
';
+
+if(!empty($_GET['via_button']) && !empty($_GET['rssurl']) && $_GET['number'] === '17')
+{
+ if(isset($_GET['add']) && $_GET['add'] === '1' && !empty($_GET['siteurl']) && !empty($_GET['sitename']))
+ {
+ $rssurl = DetectRedirect(escape($_GET['rssurl']));
+ $siteurl = escape($_GET['siteurl']);
+ $foldername = sha1(NoProtocolSiteURL($siteurl));
+ if(substr($siteurl, -1) == '/'){ $foldername2 = sha1(NoProtocolSiteURL(substr($siteurl, 0, -1))); }else{ $foldername2 = sha1(NoProtocolSiteURL($siteurl).'/');}
+ $sitename = escape($_GET['sitename']);
+ $sitedomain1 = preg_split('/\//', $siteurl, 0);
+ $sitedomain2=$sitedomain1[2];
+ $sitedomain3=explode(".", $sitedomain2);
+ $sitedomain3=array_reverse($sitedomain3);
+ $sitedomain = $sitedomain3[1].'.'.$sitedomain3[0];
+ if(file_exists($foldername) || file_exists($foldername2)) { die('Erreur: l\'autoblog existe déjà.'); }
+ if ( mkdir('./'. $foldername, 0755, false) ) {
+ $fp = fopen('./'. $foldername .'/index.php', 'w+');
+ if( !fwrite($fp, "") )
+ {die("Impossible d'écrire le fichier index.php");}
+ fclose($fp);
+ $fp = fopen('./'. $foldername .'/vvb.ini', 'w+');
+ if( !fwrite($fp, '[VroumVroumBlogConfig]
+SITE_TITLE="'. $sitename .'"
+SITE_DESCRIPTION="Ce site n\'est pas le site officiel de '. $sitename .'
C\'est un blog automatisé qui réplique les articles de '. $sitename .'"
+SITE_URL="'. $siteurl .'"
+FEED_URL="'. $rssurl .'"
+DOWNLOAD_MEDIA_FROM='.$sitedomain) )
+ {die("Impossible d'écrire le fichier vvb.ini");}
+ fclose($fp);
+ {die('autoblog crée avec succès. → afficher l\'autoblog');}
+ }
+else
+ {die("Impossible de créer le répertoire.");}
+
+ }
+ else
+ {
+ // checking procedure
+ $rssurl = DetectRedirect($_GET['rssurl']);
+ $siteurl = get_link_from_feed($rssurl);
+ $foldername = sha1(NoProtocolSiteURL($siteurl));
+ if(substr($siteurl, -1) == '/'){ $foldername2 = sha1(NoProtocolSiteURL(substr($siteurl, 0, -1))); }else{ $foldername2 = sha1(NoProtocolSiteURL($siteurl).'/');}
+ $sitename = get_title_from_feed($rssurl);
+ $sitedomain1 = preg_split('/\//', $siteurl, 0);$sitedomain2=$sitedomain1[2];$sitedomain3=explode(".", $sitedomain2);$sitedomain3=array_reverse($sitedomain3);$sitedomain = $sitedomain3[1].'.'.$sitedomain3[0];
+ if(file_exists($foldername) || file_exists($foldername2)) { die('Erreur: l\'autoblog existe déjà.'); }
+ $form = 'Merci de vérifier les informations suivantes, corrigez si nécessaire.
+ ';
+ echo $form; die;
+ }
+}
+
+if(!empty($_POST['socialaccount']) && !empty($_POST['socialinstance']))
+{
+$socialaccount = strtolower(escape($_POST['socialaccount']));
+ if(escape($_POST['socialinstance']) === 'twitter') { $socialinstance = 'twitter'; }
+ if(escape($_POST['socialinstance']) === 'identica') { $socialinstance = 'identica'; }
+ if(escape($_POST['socialinstance']) === 'statusnet') { $socialinstance = 'statusnet'; }
+ $folder = "$socialinstance-$socialaccount";if(file_exists($folder)) { die('Erreur: l\'autoblog existe déjà.'); }
+ if($socialinstance === 'twitter') { $siteurl = "http://twitter.com/$socialaccount"; $rssurl = "http://api.twitter.com.nyud.net/1/statuses/user_timeline.rss?screen_name=$socialaccount"; }
+ if($socialinstance === 'identica') { $siteurl = "http://identi.ca/$socialaccount"; $rssurl = "http://identi.ca.nyud.net/api/statuses/user_timeline/$socialaccount.rss"; }
+ if($socialinstance === 'statusnet' && !empty($_POST['socialurl'])) { $siteurl = "http://".escape($_POST['socialurl'])."/$socialaccount"; $rssurl = "http://".escape($_POST['socialurl'])."/api/statuses/user_timeline/$socialaccount.rss"; }
+ $headers = get_headers($rssurl, 1);
+ if (strpos($headers[0], '200') == FALSE) {$error[] = "Flux inaccessible (compte inexistant ?)";} else { }
+if( empty($error) ) {
+ if( !preg_match('#\.\.|/#', $folder) ) {
+ if ( mkdir('./'. $folder, 0755, false) ) {
+ $fp = fopen('./'. $folder .'/index.php', 'w+');
+ if( !fwrite($fp, "") )
+ $error[] = "Impossible d'écrire le fichier index.php";
+ fclose($fp);
+ $fp = fopen('./'. $folder .'/vvb.ini', 'w+');
+ if( !fwrite($fp, '[VroumVroumBlogConfig]
+SITE_TITLE="'.$socialinstance.'-'.$socialaccount.'"
+SITE_DESCRIPTION="AutoMicroblog automatisé de "
+SITE_URL='. $siteurl .'
+FEED_URL="'. $rssurl .'"') )
+ $error[] = "Impossible d'écrire le fichier vvb.ini";
+ fclose($fp);
+ $error[] = 'AutoMicroblog ajouté avec succès.';
+ }
+ else
+ $error[] = "Impossible de créer le répertoire.";
+ }
+ else
+ $error[] = "Nom de site invalide.";
+ }
+
+}
+
+
+if( !empty($_POST) && empty($_POST['socialinstance']) ) {
+ $error = array();
+ if(empty($_POST['rssurl']))
+ {$error[] = "Veuillez entrer l'adresse du flux.";}
+ if(empty($_POST['number']))
+ {$error[] = "Le chiffre. Écrivez le chiffre.";}
+ if($_POST['number'] !== '17')
+ {$error[] = "C'est pas le bon chiffre.";}
+
+ if(empty($error))
+ {
+ $rssurl = DetectRedirect(escape($_POST['rssurl']));
+ if(!empty($_POST['siteurl']))
+ {
+ // check done, writing out
+ $siteurl = escape($_POST['siteurl']);
+ $foldername = sha1(NoProtocolSiteURL($siteurl));$sitename = get_title_from_feed($rssurl);
+ if(substr($siteurl, -1) == '/'){ $foldername2 = sha1(NoProtocolSiteURL(substr($siteurl, 0, -1))); }else{ $foldername2 = sha1(NoProtocolSiteURL($siteurl).'/');}
+ $sitedomain1 = preg_split('/\//', $siteurl, 0);$sitedomain2=$sitedomain1[2];$sitedomain3=explode(".", $sitedomain2);$sitedomain3=array_reverse($sitedomain3);$sitedomain = $sitedomain3[1].'.'.$sitedomain3[0];
+ if(file_exists($foldername) || file_exists($foldername2)) { die('Erreur: l\'autoblog existe déjà.'); }
+ if ( mkdir('./'. $foldername, 0755, false) ) {
+ $fp = fopen('./'. $foldername .'/index.php', 'w+');
+ if( !fwrite($fp, "") )
+ $error[] = "Impossible d'écrire le fichier index.php";
+ fclose($fp);
+ $fp = fopen('./'. $foldername .'/vvb.ini', 'w+');
+ if( !fwrite($fp, '[VroumVroumBlogConfig]
+SITE_TITLE="'. $sitename .'"
+SITE_DESCRIPTION="Ce site n\'est pas le site officiel de '. $sitename .'
C\'est un blog automatisé qui réplique les articles de '. $sitename .'"
+SITE_URL="'. $siteurl .'"
+FEED_URL="'. $rssurl .'"
+DOWNLOAD_MEDIA_FROM='.$sitedomain) )
+ $error[] = "Impossible d'écrire le fichier vvb.ini";
+ fclose($fp);
+ $error[] = 'autoblog crée avec succès. → afficher l\'autoblog';
+ }
+ else
+ $error[] = "Impossible de créer le répertoire.";
+
+
+ }
+ else
+ {
+ // checking procedure
+ $rssurl = DetectRedirect($rssurl);
+ $siteurl = get_link_from_feed($rssurl);
+ $foldername = sha1(NoProtocolSiteURL($siteurl));
+ $sitename = get_title_from_feed($rssurl);
+ if(substr($siteurl, -1) == '/'){ $foldername2 = sha1(NoProtocolSiteURL(substr($siteurl, 0, -1))); }else{ $foldername2 = sha1(NoProtocolSiteURL($siteurl).'/');}
+ $sitedomain1 = preg_split('/\//', $siteurl, 0);$sitedomain2=$sitedomain1[2];$sitedomain3=explode(".", $sitedomain2);$sitedomain3=array_reverse($sitedomain3);$sitedomain = $sitedomain3[1].'.'.$sitedomain3[0];
+ if(file_exists($foldername) || file_exists($foldername2)) { die('Erreur: l\'autoblog existe déjà.'); }
+ $form = 'Merci de vérifier les informations suivantes, corrigez si nécessaire.
+ ';
+ }
+
+ }
+}
+?>
+
+
+
+
+ Le Projet Autoblog
+
+
+
+ LE PROJET AUTOBLOG
+
+
+
Autoblogs hébergés
+
+$value)
+ {
+ $key = strtolower($key);
+ $config->$key = $value;
+ }
+ $autoblogs[$unit] = '
+
';
+ unset($ini);
+ }
+ }
+}
+if(!empty($autoblogs)){
+ sort($autoblogs, SORT_STRING);
+ foreach ($autoblogs as $autoblog) {
+ echo $autoblog;
+ }
+}
+?>
+
+".count($autoblogs)." autoblogs d'hébergés"; ?>
+
+Autoblogs propulsés par VroumVroumBlog 0.2.10 [SQLite] (Domaine Public)
index2 inspiré par Arthur et développé par Mitsu et Oros (Domaine Public)
+
Code source du projet
+".$HTML_footer; } ?>
+
+
+
diff --git a/_experimental/xsaf3.php b/_experimental/xsaf3.php
new file mode 100755
index 0000000..03e49ff
--- /dev/null
+++ b/_experimental/xsaf3.php
@@ -0,0 +1,151 @@
+ $expire) {
+ echo "too early";
+ die;
+ }else{
+ unlink($lockfile);
+ file_put_contents($lockfile, '');
+ }
+}else{
+ file_put_contents($lockfile, '');
+}
+
+define('ROOT_DIR', __DIR__);
+function escape($str) {
+ return htmlspecialchars($str, ENT_COMPAT, 'UTF-8', false);
+}
+
+function serverUrl() {
+ $https = (!empty($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS'])=='on')) || $_SERVER["SERVER_PORT"]=='443'; // HTTPS detection.
+ $serverport = ($_SERVER["SERVER_PORT"]=='80' || ($https && $_SERVER["SERVER_PORT"]=='443') ? '' : ':'.$_SERVER["SERVER_PORT"]);
+ return 'http'.($https?'s':'').'://'.$_SERVER["SERVER_NAME"].$serverport;
+}
+
+function NoProtocolSiteURL($url) {
+ $siteurlnoprototypes = array("http://", "https://");
+ $siteurlnoproto = str_replace($siteurlnoprototypes, "", $url);
+ return $siteurlnoproto;
+}
+
+libxml_use_internal_errors(true);
+// $max_exec_time = temps max d'exécution en seconde
+function xsafimport($xsafremote, $max_exec_time) {
+ echo "\n*Traitement $xsafremote en maximum $max_exec_time secondes";
+ $max_exec_time+=time()-1; // -1 car l'import prend environ 1 seconde
+/* détection de ferme autoblog */ if(strpos($xsafremote, '?export') === false) {$get_remote_db="0";} else {$get_remote_db="1";}
+ $json_import = file_get_contents($xsafremote);
+ if(!empty($json_import)) {
+ $to_update=array();
+ foreach (json_decode($json_import, true) as $value) {
+ $infos="";
+ if(count($value)==3 && !empty($value['SITE_TYPE']) && !empty($value['SITE_TITLE']) && !empty($value['SITE_URL']) && !empty($value['FEED_URL'])) {
+ $sitetype = $value['SITE_TYPE'];
+ $sitename = $value['SITE_TITLE'];
+ $siteurl = escape($value['SITE_URL']);
+ $rssurl = escape($value['FEED_URL']);
+
+ $foldername = $sitename;$foldername2 = $sitename;
+
+ if(!file_exists($foldername) && !file_exists($foldername2)) {
+ if ( mkdir('./'. $foldername, 0755, false) ) {
+ $fp = fopen('./'. $foldername .'/index.php', 'w+');
+
+ $response = get_headers($rssurl, 1); // check for redirections
+ if(!empty($response['Location'])) {
+ $result="false";
+ }else{
+ $xml = simplexml_load_file($rssurl); // quick feed check
+
+ if($xml === FALSE){
+ $result="false";
+ }elseif (isset($xml->entry)) { // ATOM feed.
+ $result="true";
+ }elseif (isset($xml->item)) { // RSS 1.0 /RDF
+ $result="true";
+ }elseif (isset($xml->channel->item)) { // RSS 2.0
+ $result="true";
+ }else{
+ $result="false";
+ }
+ }
+
+ /* autoblog */
+ if($result!=="false") {
+ if( !fwrite($fp, "") ) {
+ $infos = "\nImpossible d'écrire le fichier index.php dans ".$foldername;
+ fclose($fp);
+ }else{
+ fclose($fp);
+ $fp = fopen('./'. $foldername .'/vvb.ini', 'w+');
+ if( !fwrite($fp, '[VroumVroumBlogConfig]
+SITE_TYPE="'. $sitetype .'"
+SITE_TITLE="'. $sitename .'"
+SITE_DESCRIPTION="Ce site n\'est pas le site officiel de '. $sitename .'
C\'est un blog automatisé qui réplique les articles de '. $sitename .'"
+SITE_URL="'. $siteurl .'"
+FEED_URL="'. $rssurl .'"') ){
+ fclose($fp);
+ $infos = "\nImpossible d'écrire le fichier vvb.ini dans ".$foldername;
+ }else{
+ fclose($fp);
+/* ============================================================================================================================================================================== */
+/* récupération de la DB distante */ $remote_db=str_replace("?export", $foldername."/articles.db", $xsafremote); copy($remote_db, './'. $foldername .'/articles.db');
+/* ============================================================================================================================================================================== */
+ $infos = "\nautoblog crée avec succès : $foldername";
+ $to_update[]=serverUrl().preg_replace("/(.*)\/(.*)$/i","$1/".$foldername , $_SERVER['SCRIPT_NAME']); // url of the new autoblog
+ }
+ }
+ } else {
+ $infos = "\n$rssurl -> flux invalide";
+ }
+ /* end of file writing */
+ }else {
+ $infos = "\nImpossible de créer le répertoire ".$foldername;
+ }
+ } else {
+ /*$infos = "\nFin d'itération ou Le répertoire ".$foldername." existe déjà ($sitename;$siteurl;$rssurl)";*/
+ }
+ if(DEBUG){
+ echo $infos;
+ }
+ }
+ echo "\n time : ".(time() - $max_exec_time);
+ if(time() >= $max_exec_time){
+ break;
+ }
+ }
+ /*if(!empty($to_update)){
+ if(DEBUG){
+ echo "\nupdate of autoblogs ...";
+ }
+ // because it's could be very long, we finish by updating new autoblogs
+ foreach ($to_update as $url) {
+ get_headers($url);
+ }
+ if(DEBUG){
+ echo "done\n\n";
+ }
+ }*/
+ }
+ return;
+}
+
+/* And now, the XSAF links to be imported, with maximal execusion time for import in second ! */
+xsafimport('https://raw.github.com/mitsukarenai/xsaf-bootstrap/master/2.json', 5);
+//xsafimport('https://www.ecirtam.net/autoblogs/?export', 5);
+//xsafimport('https://autoblog.suumitsu.eu/?export', 5);
+
+if(DEBUG) {
+ echo "\n\nXSAF import finished\n\n";
+}
+die;
+?>