Compare commits

...

6 Commits

Author SHA1 Message Date
Knah Tsaeb de5cb8f122 Correction de la génération de la liste de skin 2014-08-29 17:23:19 +02:00
Knah Tsaeb 8b39a207db Ajout de la possibilité de sauver des fichiers seul.
Ajout d'une favicon en fonction du type de fichier.
Ajout d'une favicon par défaut si aucune favicon est trouvé
2014-08-29 16:56:52 +02:00
Knah Tsaeb 6185cbeeaf Merge branch 'userOptions' into kt-dev
Conflicts:
	.gitignore
2014-08-29 16:01:52 +02:00
Knah Tsaeb f23d8631f9 Ajout d'un fichier de config utilisateur 2014-08-29 15:51:57 +02:00
Knah Tsaeb 584fc5a7e2 Oublie du fichier pass.php 2014-08-29 12:26:00 +02:00
Knah Tsaeb fc4fbf4938 Affinage des fichiers ignorés 2014-08-29 12:19:13 +02:00
23 changed files with 356 additions and 260 deletions

8
.gitignore vendored
View File

@ -213,3 +213,11 @@ pip-log.txt
#Mr Developer
.mr.developer.cfg
mypersonaldata/private/
!mypersonaldata/private/index.html
mypersonaldata/public/
!mypersonaldata/public/index.html
mypersonaldata/zipversions/
!mypersonaldata/zipversions/index.html
pass.php
user_config.php

View File

@ -1,185 +1,185 @@
<?php
/**
* @author bronco@warriordudimanche.com / www.warriordudimanche.net
* @copyright open source and free to adapt (keep me aware !)
* @version 2.0
*
* Verrouille l'accès à une page
* Il suffit d'inclure ce fichier pour bloquer l'accès
* il gère seul l'expiration de session, la connexion,
* la déconnexion.
*
* Améliorations eventuelles:
* ajouter compteur de tentatives sur ban id.
* ajouter la sécurisation du $_POST (en cas d'usage d'une base de donnees)
*
*/
session_start();
// ------------------------------------------------------------------
// configuration
// ------------------------------------------------------------------
$auto_restrict['error_msg']='Erreur - impossible de se connecter.';// utilisé si on ne veut pas rediriger
$auto_restrict['cookie_name']='sonarrss';// nom du cookie
$auto_restrict['encryption_key']='abcdef';// clé pour le cryptage de la chaine de vérification
$auto_restrict['session_expiration_delay']=120;//minutes
//$auto_restrict['login']='bronco'; // caractères alphanum + _ et .
$auto_restrict['redirect_error']='index.php?public';// si précisé, pas de message d'erreur
// ---------------------------------------------------------------------------------
// sécurisation du passe: procédure astucieuse de JérômeJ (http://www.olissea.com/)
@include('pass.php');
if(!isset($auto_restrict['pass'])){
if(isset($_POST['pass'])&&isset($_POST['login'])&&$_POST['pass']!=''&&$_POST['login']!=''){ # Création du fichier pass.php
$salt = md5(uniqid('', true));
file_put_contents('pass.php', '<?php $auto_restrict["login"]="'.$_POST['login'].'";$auto_restrict["salt"] = '.var_export($salt,true).'; $auto_restrict["pass"] = '.var_export(hash('sha512', $salt.$_POST['pass']),true).'; ?>');
include('login_form.php');exit();
}
else{ # On affiche un formulaire invitant à rentrer le mdp puis on exit le script
include('login_form.php');exit();
}
}
// ---------------------------------------------------------------------------------
/**
* @author bronco@warriordudimanche.com / www.warriordudimanche.net
* @copyright open source and free to adapt (keep me aware !)
* @version 2.0
*
* Verrouille l'accès à une page
* Il suffit d'inclure ce fichier pour bloquer l'accès
* il gère seul l'expiration de session, la connexion,
* la déconnexion.
*
* Améliorations eventuelles:
* ajouter compteur de tentatives sur ban id.
* ajouter la sécurisation du $_POST (en cas d'usage d'une base de donnees)
*
*/
session_start();
// ------------------------------------------------------------------
// ------------------------------------------------------------------
// 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
header('location: index.php');
}
// ------------------------------------------------------------------
// configuration
// ------------------------------------------------------------------
$auto_restrict['error_msg']='Erreur - impossible de se connecter.';// utilisé si on ne veut pas rediriger
$auto_restrict['cookie_name']='sonarrss';// nom du cookie
$auto_restrict['encryption_key']='abcdef';// clé pour le cryptage de la chaine de vérification
$auto_restrict['session_expiration_delay']=120;//minutes
//$auto_restrict['login']='bronco'; // caractères alphanum + _ et .
$auto_restrict['redirect_error']='index.php?public';// si précisé, pas de message d'erreur
// ------------------------------------------------------------------
// 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();header('location: index.php?public');exit();}
// ------------------------------------------------------------------
// demande de deco via la variable get 'deconnexion'
// ------------------------------------------------------------------
if (isset($_GET['deconnexion'])){log_user($_POST['login'],$_POST['pass']);}
// ------------------------------------------------------------------
//header('location: index.php?public');
// ------------------------------------------------------------------
// 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<strlen($Texte);$Ctr++)
{
if ($Compteur==strlen($CleDEncryptage))
$Compteur=0;
$VariableTemp.= substr($Texte,$Ctr,1) ^ substr($CleDEncryptage,$Compteur,1);
$Compteur++;
}
return $VariableTemp;
}
function Crypte($Texte,$Cle)
{
srand((double)microtime()*1000000);
$CleDEncryptage = md5(rand(0,32000) );
$Compteur=0;
$VariableTemp = "";
for ($Ctr=0;$Ctr<strlen($Texte);$Ctr++)
{
if ($Compteur==strlen($CleDEncryptage))
$Compteur=0;
$VariableTemp.= substr($CleDEncryptage,$Compteur,1).(substr($Texte,$Ctr,1) ^ substr($CleDEncryptage,$Compteur,1) );
$Compteur++;
}
return base64_encode(GenerationCle($VariableTemp,$Cle) );
}
function Decrypte($Texte,$Cle)
{
$Texte = GenerationCle(base64_decode($Texte),$Cle);
$VariableTemp = "";
for ($Ctr=0;$Ctr<strlen($Texte);$Ctr++)
{
$md5 = substr($Texte,$Ctr,1);
$Ctr++;
$VariableTemp.= (substr($Texte,$Ctr,1) ^ $md5);
}
return $VariableTemp;
}
// ---------------------------------------------------------------------------------
// sécurisation du passe: procédure astucieuse de JérômeJ (http://www.olissea.com/)
@include('pass.php');
if(!isset($auto_restrict['pass'])){
if(isset($_POST['pass'])&&isset($_POST['login'])&&$_POST['pass']!=''&&$_POST['login']!=''){ # Création du fichier pass.php
$salt = md5(uniqid('', true));
file_put_contents('pass.php', '<?php $auto_restrict["login"]="'.$_POST['login'].'";$auto_restrict["salt"] = '.var_export($salt,true).'; $auto_restrict["pass"] = '.var_export(hash('sha512', $salt.$_POST['pass']),true).'; ?>');
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
header('location: index.php');
}
// ------------------------------------------------------------------
// 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();header('location: index.php?public');exit();}
// ------------------------------------------------------------------
// demande de deco via la variable get 'deconnexion'
// ------------------------------------------------------------------
if (isset($_GET['deconnexion'])){log_user($_POST['login'],$_POST['pass']);}
// ------------------------------------------------------------------
//header('location: index.php?public');
// ------------------------------------------------------------------
// 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<strlen($Texte);$Ctr++)
{
if ($Compteur==strlen($CleDEncryptage))
$Compteur=0;
$VariableTemp.= substr($Texte,$Ctr,1) ^ substr($CleDEncryptage,$Compteur,1);
$Compteur++;
}
return $VariableTemp;
}
function Crypte($Texte,$Cle)
{
srand((double)microtime()*1000000);
$CleDEncryptage = md5(rand(0,32000) );
$Compteur=0;
$VariableTemp = "";
for ($Ctr=0;$Ctr<strlen($Texte);$Ctr++)
{
if ($Compteur==strlen($CleDEncryptage))
$Compteur=0;
$VariableTemp.= substr($CleDEncryptage,$Compteur,1).(substr($Texte,$Ctr,1) ^ substr($CleDEncryptage,$Compteur,1) );
$Compteur++;
}
return base64_encode(GenerationCle($VariableTemp,$Cle) );
}
function Decrypte($Texte,$Cle)
{
$Texte = GenerationCle(base64_decode($Texte),$Cle);
$VariableTemp = "";
for ($Ctr=0;$Ctr<strlen($Texte);$Ctr++)
{
$md5 = substr($Texte,$Ctr,1);
$Ctr++;
$VariableTemp.= (substr($Texte,$Ctr,1) ^ $md5);
}
return $VariableTemp;
}
//------------------------------------------------------------------------------------------
function id_user(){
// retourne une chaine identifiant l'utilisateur que l'on comparera par la suite
// cette chaine cryptée contient les variables utiles sérialisées
$id=array();
$id['REMOTE_ADDR']=$_SERVER['REMOTE_ADDR'];
$id['HTTP_USER_AGENT']=$_SERVER['HTTP_USER_AGENT'];
$id['session_id']=session_id();
$id=serialize($id);
return $id;
}
function id_user(){
// retourne une chaine identifiant l'utilisateur que l'on comparera par la suite
// cette chaine cryptée contient les variables utiles sérialisées
$id=array();
$id['REMOTE_ADDR']=$_SERVER['REMOTE_ADDR'];
$id['HTTP_USER_AGENT']=$_SERVER['HTTP_USER_AGENT'];
$id['session_id']=session_id();
$id=serialize($id);
return $id;
}
function is_ok(){
// vérifie et compare les variables de session
// en cas de problème on sort/redirige en détruisant la session
global $auto_restrict;
$expired=false;
if (isset($_COOKIE[$auto_restrict['cookie_name']])&&$_COOKIE[$auto_restrict['cookie_name']]==sha1($_SERVER['HTTP_USER_AGENT'])){return true;}
if (!isset($_SESSION['id_user'])){return false;}
if ($_SESSION['expire']<time()){$expired=true;}
$sid=Decrypte($_SESSION['id_user'],$auto_restrict['encryption_key']);
$id=id_user();
if ($sid!=$id || $expired==true){// problème
return false;
}else{ // tout va bien
//on redonne un délai à la session
$_SESSION['expire']=time()+(60*$auto_restrict['session_expiration_delay']);
return true;
}
}
function log_user($login_donne,$pass_donne){
//cree les variables de session
global $auto_restrict;
if ($auto_restrict['login']==$login_donne && $auto_restrict['pass']==hash('sha512', $auto_restrict["salt"].$pass_donne)){
$_SESSION['id_user']=Crypte(id_user(),$auto_restrict['encryption_key']);
$_SESSION['login']=$auto_restrict['login'];
$_SESSION['expire']=time()+(60*$auto_restrict['session_expiration_delay']);
return true;
}else{
exit_redirect();
return false;
}
}
function redirect_to($page){header('Location: '.$page); }
function exit_redirect(){
global $auto_restrict;
@session_unset();
@session_destroy();
setcookie($auto_restrict['cookie_name'],'',time()+1);
if ($auto_restrict['redirect_error']&&$auto_restrict['redirect_error']!=''){//tester sans la deuxième condition
redirect_to($auto_restrict['redirect_error']);
}else{exit($auto_restrict['error_msg']);}
}
function is_ok(){
// vérifie et compare les variables de session
// en cas de problème on sort/redirige en détruisant la session
global $auto_restrict;
$expired=false;
if (isset($_COOKIE[$auto_restrict['cookie_name']])&&$_COOKIE[$auto_restrict['cookie_name']]==sha1($_SERVER['HTTP_USER_AGENT'])){return true;}
if (!isset($_SESSION['id_user'])){return false;}
if ($_SESSION['expire']<time()){$expired=true;}
$sid=Decrypte($_SESSION['id_user'],$auto_restrict['encryption_key']);
$id=id_user();
if ($sid!=$id || $expired==true){// problème
return false;
}else{ // tout va bien
//on redonne un délai à la session
$_SESSION['expire']=time()+(60*$auto_restrict['session_expiration_delay']);
return true;
}
}
function log_user($login_donne,$pass_donne){
//cree les variables de session
global $auto_restrict;
if ($auto_restrict['login']==$login_donne && $auto_restrict['pass']==hash('sha512', $auto_restrict["salt"].$pass_donne)){
$_SESSION['id_user']=Crypte(id_user(),$auto_restrict['encryption_key']);
$_SESSION['login']=$auto_restrict['login'];
$_SESSION['expire']=time()+(60*$auto_restrict['session_expiration_delay']);
return true;
}else{
exit_redirect();
return false;
}
}
function redirect_to($page){header('Location: '.$page); }
function exit_redirect(){
global $auto_restrict;
@session_unset();
@session_destroy();
setcookie($auto_restrict['cookie_name'],'',time()+1);
if ($auto_restrict['redirect_error']&&$auto_restrict['redirect_error']!=''){//tester sans la deuxième condition
redirect_to($auto_restrict['redirect_error']);
}else{exit($auto_restrict['error_msg']);}
}
?>

View File

@ -1,12 +1,36 @@
<?php
/* The configuration generated with auto_form*/
$GLOBAL['data_folder']='mypersonaldata';
$GLOBAL['default_data_folder']='public';
$GLOBAL['rss_title']='Respawn: le flux de la webliothèque';
$GLOBAL['rss_description']='Le respawn de warriordudimanche.net';
$GLOBAL['message']='Votre webliothèque perso';
$GLOBAL['public_title']='Voici la webliothèque publique de Bronco';
$GLOBAL['skin']='pinterest';
<?php
/* The configuration generated with auto_form*/
$GLOBAL['data_folder'] = 'mypersonaldata';
$GLOBAL['default_data_folder'] = 'public';
$GLOBAL['rss_title'] = 'Respawn: le flux de la webliothèque';
$GLOBAL['rss_description'] = 'Le respawn de warriordudimanche.net';
$GLOBAL['message'] = 'Votre webliothèque perso';
$GLOBAL['public_title'] = 'Voici la webliothèque publique de Bronco';
$GLOBAL['skin'] = 'pinterest';
// File restriction
$GLOBAL['image'] = array(
'image/png' => 'png',
'image/jpg' => 'jpg',
'image/jpeg' => 'jpg',
'image/jpe' => 'jpg',
'image/gif' => 'gif',
'image/bmp' => 'bmp',
'image/tiff' => 'tiff'
);
$GLOBAL['document'] = array(
'application/vnd.oasis.opendocument.text' => 'odt',
'application/vnd.oasis.opendocument.spreadsheet' => 'ods',
'application/pdf' => 'pdf',
'application/msword' => 'doc',
'application/rtf' => 'rtf',
'application/vnd.ms-excel' => 'xls',
'application/vnd.ms-powerpoint' => 'ppt'
);
$GLOBAL['archive'] = array(
'application/zip' => 'zip',
'application/x-rar-compressed' => 'rar',
'application/x-msdownload' => 'exe',
'application/x-msdownload' => 'msi'
);
?>

View File

@ -3,10 +3,10 @@
* @author bronco@warriordudimanche.com
* @copyright open source and free to adapt (keep me aware !)
* @version 0.1
* auto_form.php is a little script to auto create a form and
* its content only with an array.
* It can create text inputs radiobuttons, select lists, passwords inputs.
* All the generated form's elements can be reached by classes
* auto_form.php is a little script to auto create a form and
* its content only with an array.
* It can create text inputs radiobuttons, select lists, passwords inputs.
* All the generated form's elements can be reached by classes
* and ids with css or jquery.
*
* It's possible to configure auto_form to add some features
@ -23,7 +23,7 @@ $config=array(
'use_a_radiobutton_choice'=>'choice one',// current value: other values are defined below
'my_password'=>'password',
'confirm_password'=>'',
);*/
//then render_form($config);
@ -31,7 +31,7 @@ $config=array(
/* #####################################################################
# auto_form config #
#####################################################################
*/
// here are the basic parameters
@ -48,7 +48,10 @@ $autoform_config=array(
'reset_button_label'
);
foreach (glob('design/*') as $skin){
foreach (glob('design/*',GLOB_ONLYDIR) as $skin){
if(basename($skin) === 'icons'){
continue;
}
$skin=basename($skin);if ($skin!='index.html'){$skins[]=$skin;}
}
$autoform_config['skin']=$skins;
@ -68,7 +71,7 @@ function render_form($var){
if ($autoform_config['form_class']){$class=' class="'.$autoform_config['form_class'].'" ';}
if ($autoform_config['enctype']){$enctype=' enctype="'.$autoform_config['enctype'].'" ';}
if (isset($autoform_config['reset_button_label'])){$reset="<input type='reset' value='".$autoform_config['reset_button_label'].'"/>';}
echo '<form name="'.$autoform_config['form_name']."\" $id $class $enctype method=\"".$autoform_config['method']."\" action=\"".$autoform_config['action']."\">\n ";
foreach($var as $key=>$value){
$all_keys.=$key.' | ';
@ -77,7 +80,7 @@ function render_form($var){
$idclasname="name='$key' id='$key' class='$key'";
//
echo '<li>';
if (is_bool($value)){
if (is_bool($value)){
// oh, a checkbox !
if ($value==true){$checked=' checked ';}else{$checked='';}
echo $label;
@ -89,7 +92,7 @@ function render_form($var){
// lists of choices
if (isset($autoform_config[$key]['type'])&&$autoform_config[$key]['type']=='radio'){
unset($autoform_config[$key]['type']);
// oh, a radiobutton list !
echo $txt.'<br/>';
echo "<ul>\n";
@ -98,11 +101,11 @@ function render_form($var){
echo "<li><label for='$choice$key'> $choice </label><input name='$key' type='radio' value='$choice' $checked id='$choice$key'/></li>\n";
}
echo "</ul>\n";
}else{
// oh, a select input !
echo $label;
echo "<select $idclasname text='$value'>\n";
echo "<select $idclasname text='$value'>\n";
foreach ($autoform_config[$key] as $choice){
if ($choice==$value){$checked='selected';}else{$checked='';}
echo "<option $checked value='$choice'>$choice</option>\n";
@ -112,15 +115,15 @@ function render_form($var){
}else if (isset($autoform_config[$key]) && $autoform_config[$key]=='pass'){
//oh, a password input !
echo $label;
echo "<input type='password' $idclasname value='$value' />\n";
echo "<input type='password' $idclasname value='$value' />\n";
}else{
// ok, so that's a text input...
echo $label;
if ($autoform_config['use_placeholder']){$placeholder=" placeholder='$txt'";}else{$placeholder='';}
echo "<input type='text' $idclasname value='$value' $placeholder/>\n";
echo "<input type='text' $idclasname value='$value' $placeholder/>\n";
}
}
echo "</li>\n";
}
@ -129,13 +132,17 @@ function render_form($var){
}
include('auto_restrict.php');
include('config.php');
if(file_exists('user_config.php')){
include('user_config.php');
}
unset($GLOBAL['private_data_folder']);
unset($GLOBAL['public_data_folder']);
unset($GLOBAL['image'],$GLOBAL['document'],$GLOBAL['archive']);
$GLOBAL['default_data_folder']=basename($GLOBAL['default_data_folder']);
$message='';
if ($_POST){
$auto_form['filename']='config.php';
$auto_form['filename']='user_config.php';
$auto_form['filecontent']="<?php \n /* The configuration generated with auto_form*/\n\n";
$auto_form['variable_name']='$GLOBAL';
$all_keys=explode(' | ',$_POST['all_keys']);
@ -150,7 +157,7 @@ if ($_POST){
}else{// not bool
$auto_form['filecontent'].=$auto_form['variable_name']."['$key']='".$postdata[$key]."';\n";
}
}
$auto_form['filecontent'].="\n?>";
@ -164,9 +171,9 @@ if ($_POST){
<!DOCTYPE html>
<html>
<head>
<head>
<meta charset="utf-8" /></head>
<title>Configuration</title>
<title>Configuration</title>
<link rel="stylesheet" type="text/css" href="design/<?php echo $GLOBAL['skin']; ?>/style.css"/>
<link rel="shortcut icon" type="/image/png" href="design/<?php echo $GLOBAL['skin']; ?>/favicon2.png">
<!--[if IE]><script> document.createElement("article");document.createElement("aside");document.createElement("section");document.createElement("footer");</script> <![endif]-->
@ -178,7 +185,7 @@ if ($_POST){
</nav>
</header>
<aside>
<?php
<?php
render_form($GLOBAL);
?>
</aside>

5
design/icons/AUTHORS Normal file
View File

@ -0,0 +1,5 @@
Faenza is designed and developed by Matthieu James <matthieu.james@gmail.com>.
Faenza icons are all licensed under the GPL.
Thanks to Holger Seelig and clemyeats for their help for having some text preview inside icons in Nautilus.

1
design/icons/bmp.png Symbolic link
View File

@ -0,0 +1 @@
png.png

1
design/icons/doc.png Symbolic link
View File

@ -0,0 +1 @@
odt.png

BIN
design/icons/exe.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 748 B

1
design/icons/gif.png Symbolic link
View File

@ -0,0 +1 @@
png.png

BIN
design/icons/html.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 770 B

1
design/icons/jpg.png Symbolic link
View File

@ -0,0 +1 @@
png.png

1
design/icons/msi.png Symbolic link
View File

@ -0,0 +1 @@
exe.png

BIN
design/icons/odp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 B

BIN
design/icons/ods.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 495 B

BIN
design/icons/odt.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 535 B

BIN
design/icons/pdf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 799 B

BIN
design/icons/png.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 671 B

1
design/icons/rar.png Symbolic link
View File

@ -0,0 +1 @@
zip.png

BIN
design/icons/rtf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

1
design/icons/tiff.png Symbolic link
View File

@ -0,0 +1 @@
png.png

1
design/icons/xls.png Symbolic link
View File

@ -0,0 +1 @@
ods.png

BIN
design/icons/zip.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 551 B

158
index.php
View File

@ -3,18 +3,18 @@
/* (webpage retriever by Timo Van Neerden; http://lehollandaisvolant.net/contact December 2012)
* last updated : December, 10th, 2012
*
* This piece of software is under the WTF Public Licence.
* Everyone is permitted to copy and distribute verbatim or modified
* 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
* 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)
/* 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 ;) */
@ -35,6 +35,9 @@ if (isset($_GET['tag'])){$search_tags=strip_tags($_GET['tag']);}else{$search_tag
// CONFIGURABLE OPTIONS
// adapter la configuration dans le fichier config.php
include('config.php');
if(file_exists('user_config.php')){
include('user_config.php');
}
$GLOBAL['version']='2.2';
$GLOBAL['respawn_url']=returncurrenturl();
@ -229,13 +232,25 @@ if (!$GLOBAL['public']){ // private
else {
$GLOBAL['target_folder'] = $GLOBAL['default_data_folder'].'/'.$new_folder;
}
/*GESTION DU PDF ICI*/
if (strtolower(substr($_GET['q'],-4))=='.pdf'){
$title=basename($_GET['q']);
file_put_contents($GLOBAL['target_folder'].'/'.$title,$GLOBAL['main_page_data']);
file_put_contents($GLOBAL['target_folder'].'/index.php','<?php header("location: '.$title.'");?>');
}else{
$urlInfo =pathinfo($GLOBAL['url']);
$title = $urlInfo['filename'];
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mineType = $finfo->buffer($GLOBAL['main_page_data']);
if(array_key_exists($mineType, $GLOBAL['image'])){
$ext = $GLOBAL['image'][$mineType];
file_put_contents($GLOBAL['target_folder'].'/'.$title.'.'.$ext, $GLOBAL['main_page_data']);
file_put_contents($GLOBAL['target_folder'].'/index.php','<!DOCTYPE html><html><head><title>'.$title.'</title></head><body><img src="'.$title.'.'.$ext.'" alt="Save image from '.$GLOBAL['url'].'"/></body></html>');
} elseif(array_key_exists($mineType, $GLOBAL['document'])){
$ext = $GLOBAL['document'][$mineType];
$title=basename($_GET['q']);
file_put_contents($GLOBAL['target_folder'].'/'.$title,$GLOBAL['main_page_data']);
file_put_contents($GLOBAL['target_folder'].'/index.php','<?php header("location: '.$title.'");?>');
} elseif(array_key_exists($mineType, $GLOBAL['archive'])){
$ext = $GLOBAL['archive'][$mineType];
$title=basename($_GET['q']);
file_put_contents($GLOBAL['target_folder'].'/'.$title,$GLOBAL['main_page_data']);
file_put_contents($GLOBAL['target_folder'].'/index.php','<?php header("location: '.$title.'");?>');
}else{
$liste_css = array();
@ -299,7 +314,7 @@ if (!$GLOBAL['public']){ // private
$matches_url = array_merge($matches_url2, $matches_url);
// pour chaque URL/URI
foreach ($matches_url as $j => $valuej) {
@ -371,18 +386,20 @@ if (!$GLOBAL['public']){ // private
$n++;
$count = count($liste_css);
}
$mineType = '';
}
// enregistre un fichier dinformations concernant la page (date, url, titre)
// enregistre un fichier dinformations concernant la page (date, url, titre, extension du fichier)
$info = '';
$info .= 'URL="'.$GLOBAL['url'].'"'."\n";
$info .= 'TITLE="'.$title.'"'."\n";
$info .= 'DATE="'.time().'"'."\n";
$info .= 'TYPE="'.$ext.'"'."\n";
file_put_contents($GLOBAL['target_folder'].'/'.'index.ini', $info);
/*$GLOBAL['done']['d'] = 'ajout';
/*$GLOBAL['done']['d'] = 'ajout';
$GLOBAL['done']['lien'] = $GLOBAL['target_folder'].'/'; */
}
}//die;
@ -394,7 +411,7 @@ if (!$GLOBAL['public']){ // private
$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
$sousliste = scandir($_GET['suppr']); // listage des dossiers de data.
$nb_sousfichier = count($sousliste);
@ -405,11 +422,11 @@ if (!$GLOBAL['public']){ // private
}
// then the folder itself.
if (TRUE === rmdir($_GET['suppr'])) {
$GLOBAL['done']['d'] = 'remove';
$GLOBAL['done']['d'] = 'remove';
}
}
header("location: index.php");
}
@ -444,7 +461,7 @@ if (!$GLOBAL['public']){ // private
if (isset($_GET['privateget'])&&is_dir($GLOBAL['private_data_folder'].'/'.$_GET['privateget'])){$target=$GLOBAL['private_data_folder'].'/'.$_GET['privateget'];}
if (isset($_GET['zipprivate'])) {
if (isset($_GET['zipprivate'])) {
$ini_file = $GLOBAL['private_data_folder'].'/'.$_GET['zipprivate'].'/index.ini';
if(is_file($ini_file)){$info=parse_ini_file($ini_file);}else{$info['TITLE']='';}
$origin_folder_path=$GLOBAL['private_data_folder'].'/'.$_GET['zipprivate'];
@ -453,31 +470,31 @@ if (!$GLOBAL['public']){ // private
$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';
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/');
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['rename'])&&isset($_GET['to'])&&isset($_GET['file'])) {
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['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
}else{ // public get
//download public zip version
if (isset($_GET['zippublic'])) {
$ini_file = $GLOBAL['public_data_folder'].'/'.$_GET['zippublic'].'/index.ini';
@ -488,9 +505,9 @@ if (!$GLOBAL['public']){ // private
$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';
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/');
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);
}
@ -508,8 +525,8 @@ if (!$GLOBAL['public']){ // private
)
);
foreach ($items as $key=>$item){
if ($item!='index.html'){
if (is_dir($GLOBAL['public_data_folder'].'/'.$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');
@ -531,10 +548,10 @@ if (!$GLOBAL['public']){ // private
}
if (isset($_GET['api'])){
$content=array();
$items=search('public',$search_tags);
$items=search('public',$search_tags);
foreach ($items as $key=>$item){
if ($item!='index.html'){
if (is_dir($GLOBAL['public_data_folder'].'/'.$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');
@ -572,7 +589,7 @@ function url_parts() {
}
//
// Gets external file by URL.
// Gets external file by URL.
// Make a stream context (better).
//
@ -792,6 +809,36 @@ function rand_new_name($name) {
return 'f_'.str_shuffle('abcd').mt_rand(100, 999).'--'.preg_replace('#[^\w.]#', '_', substr($name, 15)).'.'.pathinfo($name, PATHINFO_EXTENSION);
}
function returnLocalFavicon($path,$fileType){
$favicon = glob($path.'*favicon.*');
if(empty($favicon)){
if(file_exists('design/icons/'.$fileType.'.png')){
return 'design/icons/'.$fileType.'.png';
} else {
return 'design/icons/html.png';
}
} else {
return $favicon[0];
}
}
/**
* Améliore la sortie print
*
* @author Tatane http://www.tatane.info/index.php/print_rn
* @author http://www.blog.cactuscrew.com/77-print_rn.html
* @param $data (array) tableau à examiner
* @param $name (string) nom a affiché
* @return false affiche les clef valeur du tableau $data
*/
function n_print($data, $name = '') {
$aBackTrace = debug_backtrace();
echo '<h2>', $name, '</h2>';
echo '<fieldset style="border: 1px solid orange; padding: 5px;color: #333; background-color: #fff;">';
echo '<legend style="border:1px solid orange;padding: 1px;background-color:#eee;color:orange;">', basename($aBackTrace[0]['file']), ' ligne => ', $aBackTrace[0]['line'], '</legend>';
echo '<pre>', htmlentities(print_r($data, 1)), '</pre>';
echo '</fieldset><br />';
}
if ($GLOBAL['done']['d'] !== FALSE) {
switch($GLOBAL['done']['d']) {
@ -813,7 +860,7 @@ if ($GLOBAL['done']['d'] !== FALSE) {
<!DOCTYPE html>
<html>
<head>
<?php
<?php
if (!empty($_GET['publicget'])){
$id=strip_tags($_GET['publicget']);
$temp=parse_ini_file($GLOBAL['public_data_folder'].'/'.$id.'/index.ini');
@ -825,16 +872,16 @@ if ($GLOBAL['done']['d'] !== FALSE) {
else{$page_title='Respawn';}
?>
<meta charset="utf-8" /></head>
<title><?php echo $page_title; ?></title>
<title><?php echo $page_title; ?></title>
<link rel="stylesheet" type="text/css" href="<?php echo $GLOBAL['css_folder']; ?>/style.css"/>
<?php link2favicon($target);?>
<!--[if IE]><script> document.createElement("article");document.createElement("aside");document.createElement("section");document.createElement("footer");</script> <![endif]-->
</head>
<body <?php echo $bodyclass;?>>
<header><a href="<?php echo $GLOBAL['respawn_url'].$publicarg; ?>"><img src="<?php echo $GLOBAL['css_folder']; ?>/logo2.png"/></a>
<nav id="orpx_nav-bar">
<?php
<?php
if (!$GLOBAL['public']){
echo "\t".'<form method="get" action="'.$_SERVER['PHP_SELF'].'" >'."\n";
@ -846,7 +893,7 @@ if ($GLOBAL['done']['d'] !== FALSE) {
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>';
@ -887,9 +934,7 @@ if ($GLOBAL['done']['d'] !== FALSE) {
if (is_dir($GLOBAL['public_data_folder'].'/'.$liste_pages[$i]) and ($liste_pages[$i] != '.') and ($liste_pages[$i] != '..')) {
// each folder should contain such a file "index.ini".
$ini_file = $GLOBAL['public_data_folder'].'/'.$liste_pages[$i].'/index.ini';
$favicon = glob($GLOBAL['public_data_folder'].'/'.$liste_pages[$i].'/*favicon.*');
$favicon = (isset($favicon[0])) ? $favicon[0] : '';
if ( is_file($ini_file) and is_readable($ini_file) ) {
$infos = parse_ini_file($ini_file);
} else {
@ -900,7 +945,7 @@ if ($GLOBAL['done']['d'] !== FALSE) {
} else {
$titre = 'titre'; $url = '#'; $date = 'date inconnue';
}
$favicon = returnLocalFavicon($GLOBAL['public_data_folder'].'/'.$liste_pages[$i].'/',$infos['TYPE']);
$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]]);}
echo "\t".'<li>';
@ -925,8 +970,8 @@ if ($GLOBAL['done']['d'] !== FALSE) {
// PRIVATE PAGES ------------------------------------------------------------------------------------------
if (!$GLOBAL['public']){
if (!$GLOBAL['public']){
echo '<div class="private" style="'.$column_width.'">'."\n";
$liste_pages = search('private',$search_tags);
if ( ($nb = count($liste_pages)) != 0 ) {
@ -937,8 +982,6 @@ if ($GLOBAL['done']['d'] !== FALSE) {
if (is_dir($GLOBAL['private_data_folder'].'/'.$liste_pages[$i]) and ($liste_pages[$i] != '.') and ($liste_pages[$i] != '..')) {
// each folder should contain such a file "index.ini".
$ini_file = $GLOBAL['private_data_folder'].'/'.$liste_pages[$i].'/index.ini';
$favicon=glob($GLOBAL['private_data_folder'].'/'.$liste_pages[$i].'/*favicon.*');
$favicon = (isset($favicon[0])) ? $favicon[0] : '';
if ( is_file($ini_file) and is_readable($ini_file) ) {
$infos = parse_ini_file($ini_file);
} else {
@ -949,19 +992,20 @@ if ($GLOBAL['done']['d'] !== FALSE) {
} else {
$titre = 'titre'; $url = '#'; $date = 'date inconnue';
}
$favicon = returnLocalFavicon($GLOBAL['public_data_folder'].'/'.$liste_pages[$i].'/',$infos['TYPE']);
$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]]);}
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="title" href="?privateget='.$liste_pages[$i].'" title="'.$titre.'('.$date.')"><img src="'.$favicon.'"/>'.$titre.'</a>
<p class="infos">'.$taglinks.'</p>
<p class="infos">'.$taglinks.'</p>
<p class="tools">
<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 class="icon origine" href="'.$url.'" title="origin">&#10150;</a>
<a href="?topublic='.$liste_pages[$i].'" class="topublic" title="Change to public">&#9664;</a>
</p>
</li>'."\n";
@ -974,11 +1018,11 @@ if ($GLOBAL['done']['d'] !== FALSE) {
}
?>
</aside>
<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> -
<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;} ?> -
<?php if (!$GLOBAL['public']){echo '<a href="config_page.php">Config</a>';} ?> -
<?php if (!$GLOBAL['public']){echo $bookmarklet;} ?> -
<?php if (!$GLOBAL['public']){echo '<a href="config_page.php">Config</a>';} ?> -
<?php if (!$GLOBAL['public']){echo '<a href="?discotime">Disconnect</a>';}else{echo '<a href="login_form.php">Admin</a>';}?>
</footer>
@ -987,14 +1031,14 @@ if ($GLOBAL['done']['d'] !== FALSE) {
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>