<?php
/**
 * Questo script deve le sue origini a FD di Detronizator - aka Ivan De Marino
 * Modifiche di Aldo Boccacci
 * e-mail: zorba_ (AT) tin.it
 * sito web: www.aldoboccacci.it
 * versione: 0.8
 *
 * (Da usare con Flatnuke >= 2.5.8)
 *
 * Il codice del metodo getIcon proviene quasi interamente dal progetto Autoindex
 *
 * This program is free software. You can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
 */

//lo script non può essere richiamato direttamente

if (eregi("fd+.php",$_SERVER['PHP_SELF'])) {
    Header("Location: ../index.php");
    fd_die("You cannot call fd+.php!");
}

//CONFIGURAZIONE AVANZATA: NON MODIFICARE!
//Il file che conterrà l'elenco dei file più scaricati
$max_download_file = "fd_top_download.php";

//Il nome della cartella di archivio
$archivedir = "none_archivedir";

//L'estensione dei file di descrizione
//questa variabile non è ancora usata
$desc_extension=".description";

//il file di log
$fdlogfile ="misc/log/fdpluslog.php";

//importo la configurazione
require_once("download/fdconfig.php");

//ci sono prolemi con register_globals=off
$GLOBALS['archivedir'] = $archivedir;
$GLOBALS['extensions'] = $extensions;
$GLOBALS['icon_style'] = $icon_style;
$GLOBALS['newfiletime'] = $newfiletime;
$GLOBALS['automd5'] = $automd5;
$GLOBALS['autosha1'] = $autosha1;
$GLOBALS['max_download_file'] = $max_download_file;
$GLOBALS['maxFileSize']= $maxFileSize;
$GLOBALS['desc_extension'] = $desc_extension;
$GLOBALS['fdlogfile'] = $fdlogfile;
$GLOBALS['showuploader'] = $showuploader;
$GLOBALS['extsig'] = trim($extsig);
$GLOBALS['extscreenshot'] = $extscreenshot;
$GLOBALS['admins'] = trim($admins);
$GLOBALS['enable_admin_options'] = trim($enable_admin_options);
$GLOBALS['section_show_header'] = trim($section_show_header);
$GLOBALS['defaultvoteon'] = trim($defaultvoteon);
//UTENTI
//ci sono prolemi con register_globals=off
$GLOBALS['usermaxFileSize'] = $usermaxFileSize;
$GLOBALS['userwaitingfile'] = $userwaitingfile;
$GLOBALS['userfilelimit'] = $userfilelimit;
$GLOBALS['userblacklist'] = $userblacklist;
$GLOBALS['minlevel'] = $minlevel;
$GLOBALS['showdownloadlink'] = $showdownloadlink;
$GLOBALS['overview_show_files'] = $overview_show_files;

include_once("config.php");
include_once("functions.php");
include_once("shared.php");

//impone l'inclusione dei file di supporto
require_once("download/include/fdview.php");
if (fd_is_admin()) require_once("download/include/fdadmin.php");
require_once("download/include/fdfunctions.php");
require_once("download/include/fdurl.php");
include_once("download/include/fduser.php");

//inclusione moduli esterni
fd_load_php_code("download/include/phpfunctions/");

//impostazione lingua
global $lang;
if (!isset($lang))$lang="it";
$userlang = getparam("userlang", PAR_COOKIE, SAN_FLAT);

if ($userlang!=""){
	if (file_exists("languages/".str_replace(".php","",$userlang).".php")) $lang = str_replace(".php","",$userlang);
}

if ($lang=="en" or $lang=="es"){
    include_once ("languages/fd+lang/fd+en.php");
    include_once ("languages/$lang.php");
}
else if ($lang=="it"){
    include_once ("languages/fd+lang/fd+it.php");
    include_once ("languages/it.php");
}
else if ($lang=="de"){
    include_once ("languages/fd+lang/fd+de.php");
    include_once ("languages/de.php");
}
else {
    include_once ("languages/fd+lang/fd+en.php");
    include_once ("languages/$lang.php");
}
//fine impostazione lingua
	
	//A seconda dei parametri passati si intraprenderà l'azione opportuna
	//PARAMETRI GET
	if (isset($_GET['fdaction'])){
	
		$_get_fdaction = "";
		$_get_fdaction = trim(getparam("fdaction",PAR_GET,SAN_FLAT));
		$file="";
		$file = getparam("fdfile",PAR_GET,SAN_NULL);
		$file = trim($file);
// 		echo "FILE: $file";die();
		if (!fd_check_path($file,"sections/","false") and $file!="") fd_die(_FDNONPUOI.basename(__FILE__).": ".__LINE__);
		if ($_get_fdaction=="confirmDelete"){
			if ($file=="") return;
			confermaElimina($file);
		}

		else if ($_get_fdaction=="delete"){
			if ($file=="") return;
			elimina($file);
		}
		
		else if ($_get_fdaction=="confirmDeleteSign"){
			if ($file=="") return;
			delete_sign_interface($file);
		}
		
		else if ($_get_fdaction=="deletesign"){
			if ($file=="") return;
			delete_sign($file);
		}
		
		else if ($_get_fdaction=="confirmDeleteScreenshot"){
			if ($file=="") return;
			delete_screenshot_interface($file);
		}
		
		else if ($_get_fdaction=="deletescreenshot"){
			if ($file=="") return;
			delete_screenshot($file);
		}

		else if ($_get_fdaction=="hide"){
			if ($file=="") return;
			$value = getparam("value",PAR_GET,SAN_FLAT);
			if (!eregi("^false$|^true$",$value)) fd_die("<b>Value</b> must be true or false! FD+: ".__LINE__);

			hide_file($file,$value);

		}

		else if ($_get_fdaction=="archive"){
			if ($file=="") return;
			archivia($file,$archivedir);
		}

		else if ($_get_fdaction=="renameinterface"){
			if ($file=="") return;
			rename_interface($file);
		}

		else if ($_get_fdaction=="modify"){
			if ($file=="") return;
// 			modifica($file,$maxFileSize);
			edit_description_interface($file,load_description($file),"edit");
		}


		else if ($_get_fdaction=="ripristina"){
			if ($file=="") return;
			ripristina($file,$archivedir);
		}

		else if ($_get_fdaction=="download"){
		
			$url = getparam("url",PAR_GET,SAN_NULL);
			$url = trim($url);
			if ($url=="") return;
			if (!fd_check_path($url,"sections/","false")) fd_die(_FDNONPUOI.basename(__FILE__).": ".__LINE__);
// 			echo "URL".$url;
			track($url);
		}
		else if ($_get_fdaction=="moveinterface"){
			if ($file=="") return;
			move_file_interface($file);
		}
		else if ($_get_fdaction=="movefileconfirm"){
			if ($file=="") return;
			$newdir = "";
			$newdir = getparam("newdir",PAR_GET,SAN_NULL);
			$newdir = trim($newdir);
			if ($newdir=="")return;
			if (!fd_check_path($newdir,"./sections/","false")) fd_die(_FDNONPUOI.basename(__FILE__).": ".__LINE__);

			move_file_confirm($file,eregi_replace("^\./","",$newdir));
		}
		else fdlogf("\$_GET['fdaction'] value is invalid: \"".strip_tags($_get_fdaction)."\". FD+: ".__LINE__,"ERROR");

	}

	//PARAMETRI POST
	if (isset($_POST['fdaction'])){
		$_post_fdaction = "";
		$_post_fdaction = getparam("fdaction",PAR_POST,SAN_FLAT);
		if ($_post_fdaction=="createsectinterface"){
			mksection_interface();
		}
		else if ($_post_fdaction=="addfile"){
// 			nuovoFile($maxFileSize);
			edit_description_interface("",array(),"upload");
		}
		else if ($_post_fdaction=="addurl"){
// 			nuovoFile($maxFileSize);
			edit_description_interface("",array(),"addurl");
		}
		else if ($_post_fdaction=="createsect"){
			if (isset($_POST['fdmod'])) $fdmod = $_POST['fdmod'];
			else return;
			if (isset($_POST['fdnewsect'])) $fdnewsect = $_POST['fdnewsect'];
			else return;
			if (isset($_POST['fdsecthidden'])) $fdsecthidden = $_POST['fdsecthidden'];
			else $fdsecthidden="false";
			if (isset($_POST['fdsectallowuserupload'])) 
				$fdsectallowuserupload = $_POST['fdsectallowuserupload'];
			else $fdsectallowuserupload="false";
			
			
			mksection($fdmod,$fdnewsect,$fdsecthidden,$fdsectallowuserupload);
		}
		else if ($_post_fdaction=="renamefile"){
			if (isset($_POST['oldfilename'])) $oldfinename = $_POST['oldfilename'];
			else return;
			if (isset($_POST['newfilename'])) $newfilename = $_POST['newfilename'];
			else return;
			if (isset($_POST['fdpath'])) $fdpath = $_POST['fdpath'];
			else return;
			rename_file($oldfinename,$newfilename,$fdpath);
		}
		else if ($_post_fdaction=="movefile"){
			if (isset($_POST['fdfile'])) $fdfile = $_POST['fdfile'];
			else return;
			if (isset($_POST['newdir'])) $newdir = eregi_replace("^\./","",$_POST['newdir']);
			else return;
			fd_move_file($fdfile,$newdir);
		}
		else if ($_post_fdaction=="upload"){
			upload();
		}
		else if ($_post_fdaction=="uploadurl"){
			uploadurl();
		}
		else if ($_post_fdaction=="save"){
			save_changes();
		}
		else if ($_post_fdaction=="saveurl"){
			saveurl();
		}
		
		//User upload
		else if ($_post_fdaction=="useraddfile"){
			edit_description_interface("",array(),"userupload");
// 			user_addfile();
		}
		else if ($_post_fdaction=="userupload"){
			user_upload();
		}
		else if ($_post_fdaction=="publishuserfileinterface"){
			publish_interface();
		}
		else if ($_post_fdaction=="publishuserfile"){
			publish_file($_POST['fdfile']);
		}
		else if ($_post_fdaction=="deleteuserfile"){
			confermaElimina($_POST['fdfile']);
		}
		else if ($_post_fdaction=="allowuserupload"){
			$fdmod = getparam("fdmod",PAR_POST,SAN_FLAT);
			allow_user_upload($fdmod);
		}
		else if ($_post_fdaction=="removeuserupload"){
			$fdmod = getparam("fdmod",PAR_POST,SAN_FLAT);
			remove_user_upload($fdmod);
		}
		else fdlogf("\$_POST['fdaction'] value is invalid: \"".strip_tags($_post_fdaction)."\" FD+: ".__LINE__,"ERROR");
	}


/**
 * Restituisce true se l'utente è di livello 10
 * (e dunque possiede i privilegi di amministrazione)
 * 
 * @return TRUE se l'utente collegato è di livello 10, FALSE se non lo è
 * @author Aldo Boccacci
 */
function fd_is_admin(){

//blocco admin
global $enable_admin_options;
if (trim($enable_admin_options)!="1") return FALSE;

if (is_admin()) return TRUE;

global $admins;
$powerusers= array();
$powerusers = explode(",",eregi_replace(" ","",$admins));
$myforum = get_username();

if (in_array(get_username(),$powerusers)){
	if (versecid(get_username(),"home") and is_user()) return TRUE;
}

}


/**
 * converte la cartella di archivio eventualmente presente con il vecchio nome
 * @param string $archivedir il nuovo nome della cartella di archivio
 * @author Aldo Boccacci
 * @since 0.6
 */
function rename_archivedir($archivedir){
	$mod="";
	$mod =getparam("mod",PAR_GET,SAN_FLAT);
	$mod = trim($mod);
	if ($mod=="") return;
	if (!fd_check_path($mod,"","false")) return;
	if (!fd_check_path($archivedir,"","false")) return;
	if (is_dir("sections/$mod/vecchie_versioni/") and (!file_exists("sections/$mod/$archivedir"))){
		rename("sections/$mod/vecchie_versioni","sections/$mod/$archivedir");
	}

}

/**
 *
 * @return TRUE se l'utente ha i permessi per vedere il file specificato, FALSE se
 * non li ha
 * @since 0.7
 * @author Aldo Boccacci
 */
/*
function user_can_view_file($file){
	if (!fc_check_path($file)) return FALSE;
}
*/

/**
 * Questa funzione serve per salvare il log di fd+.
 * Il messaggio viene formattato aggiungendo campi di interesse.
 * 
 * Dalla versione 0.8 sono presenti due file di log:
 * 1. è quello impostato dalla variabile $logfile. Viene utilizzato se non viene impostato il secondo parametro.
 * 2. se viene impostato come secondo parametro "ERROR" il file di log avrà nome fdlogerror.php (di default)
 * 
 * @param string $message il messaggio da salvare
 * @param string $type il tipo di messaggio. Può essere lasciato vuoto o 
 *               impostato a "ERROR"
 * @author Aldo Boccacci
 * @since 0.7
 */
function fdlogf($message,$type="") {
	global $fdlogfile;

	if (!isset($fdlogfile)) $fdlogfile="misc/log/fdpluslog.php";

	if (eregi("\<\?",$message) or eregi("\?\>",$message)) fd_die(_FDNONPUOI.basename(__FILE__).": ".__LINE__);
	
	if ($type=="ERROR"){
		$fdlogfile = eregi_replace("\.php$","error.php",$fdlogfile);
	}
	
	if (!is_dir("misc/log/")){
		mkdir("misc/log","0777");

	}

	if (!file_exists("$fdlogfile")){
		fnwrite($fdlogfile,"<?exit(1);?>\n","w",array("nonull"));
	}
	else {
		$logtext="";
		$logtext = get_file($fdlogfile);
		if (!eregi("\<\?exit\(1\);\?\>",$logtext)){
// 		echo "no codice controllo";
			fnwrite($fdlogfile,"<?exit(1);?>\n$logtext","w",array("nonull"));
		}
	}


	//l'utente collegato
	$myforum="";
	if (isset($_COOKIE['myforum'])) $myforum = $_COOKIE['myforum'];
// 	if (!is_alphanumeric($myforum)) $myforum ="";
	if (!versecid($myforum)) $myforum .= "(NOT VALID!)";
	$REMOTE_ADDR="";
	$REMOTE_ADDR = getparam("REMOTE_ADDR",PAR_SERVER,SAN_FLAT);

// 	if (isset($_GET['mod'])) 
	$mod=getparam("mod",PAR_GET,SAN_FLAT);
// 	else $mod="";

// 	if (!is_alphanumeric($myforum)) die(_NON<PUOI." FD+: ".__LINE__);
// 	if (!fd_check_path($mod,"","false")) die(_NONPUOI." FD+: ".__LINE__);
// 	if (!eregi("^[0-9\.]+$",$REMOTE_ADDR)) die(_NONPUOI." FD+: ".__LINE__);


	$messageok = date(_FDDATEFORMAT)."
	fd version: ".get_fd_version()."
	user: $myforum
	remoteaddr: $REMOTE_ADDR
	section: $mod
	message: $message";
	
	//prima richiede modifica a fnwrite	
// 	fnwrite($fdlogfile,strip_tags("$messageok\n"),"a",array("nonull"));
	$fl=fopen("$fdlogfile","a");
	fwrite($fl, strip_tags("$messageok\n"));
	fclose($fl);

}

/**
 * Questa funzione serve per salvare il log di fd+
 * @param string $message il messaggio da salvare
 * @author Aldo Boccacci
 * @since 0.7
 */
function fdlog($message) {
	global $fdlogfile;

	if (eregi("\<\?",$message) or eregi("\?\>",$message)) fd_die(_FDNONPUOI.basename(__FILE__).": ".__LINE__);

	if (!is_dir("misc/log/")){
		mkdir("misc/log","0777");

	}

	if (!file_exists("$fdlogfile")){
		$fl = NULL;
		$fl=fopen("$fdlogfile","a");
		fwrite($fl, "<?exit(1);?>\n");
		fclose($fl);
	}
	else {
		$logtext="";
		$logtext = get_file($fdlogfile);
		if (!eregi("\<\?exit\(1\);\?\>",$logtext)){
// 		echo "no codice controllo";
			$flogtemp = fopen($fdlogfile,"w");
			fwrite($flogtemp,"<?exit(1);?>\n".strip_tags($logtext));
			fclose($flogtemp);
		}
	}
	
	$myforum = get_username();
	$REMOTE_ADDR = getparam("REMOTE_ADDR",PAR_SERVER,SAN_FLAT);

// 	if (isset($_GET['mod'])) 
	$mod = getparam("mod",PAR_GET,SAN_FLAT);
// 	else $mod="";

	if (!is_alphanumeric($myforum)) die(_NONPUOI.__LINE__);
	if (!fd_check_path($mod,"","false")) die(_NONPUOI.__LINE__);
	if (!eregi("^[0-9\.]+$",$REMOTE_ADDR)) die(_NONPUOI.__LINE__);


	$fl=fopen("$fdlogfile","a");
	fwrite($fl, strip_tags(date(_FDDATEFORMAT)."\n\t$message\n"));
	fclose($fl);

}

/**
 * Funzione di die() personalizzata per fd+ che prima di uccidere il processo
 * salva un messaggio nel log
 * @param string $message il messaggio da stampare a schermo e da salvare nel log
 * @param string $file il file che ha generato l'errore
 * @param string $line la linea nella quale è stato generato l'errore
 * @author Aldo Boccacci
 * @since 0.7
 */
function fd_die($message="unset",$file="",$line=""){
	if ($file!="" and check_path($file,"","true")) $file=strip_tags(basename(trim($file)));
	else $file="";
	if (check_var(trim($line),"digit")) $line=strip_tags(trim($line));
	else $line="";
	
	if ($file!="" and $line!="")
		$message = "$message $file: $line";
	
	fdlogf($message,"ERROR");
	if (is_admin()) echo $message;
	die();
}


/**
 * restituisce una stringa contenente la versione di fdplus
 * @return la versione di fdplus
 * @author Aldo Boccacci
 * @since 0.7rc4
 */
function get_fd_version(){
	return "0.8";
}
?>