$version = '1.7.9';
$charset = 'UTF-8';
$debug_mode = false;
$max_php_recursion = 200;
$resolve_ids = 0;
$quota_mb = 0;
$upload_ext_filter = array();
$download_ext_filter = array();
$cookie_cache_time = 60*60*24*30; // 30 Days
$fm_color = array();
$fm_color['Bg'] = "EEEEEE";
$fm_color['Text'] = "000000";
$fm_color['Link'] = "0A77F7";
$fm_color['Entry'] = "FFFFFF";
$fm_color['Over'] = "C0EBFD";
$fm_color['Mark'] = "A7D2E4";
$services = array();
$services['21'] = "FTP";
$services['22'] = "SSH";
$services['23'] = "TELNET";
$services['25'] = "SMTP";
$services['80'] = "HTTPD";
$services['110'] = "POP3";
//$services['123:UDP'] = "NTP";
//$services['137:UDP'] = "NETBIOS-NS";
//$services['138:UDP'] = "NETBIOS-DATA";
$services['139'] = "NETBIOS-SESSION";
$services['143'] = "IMAP";
$services['161'] = "SNMP";
$services['389'] = "LDAP";
$services['445'] = "SMB-AD";
//$services['445:UDP'] = "SMB-FS";
$services['465'] = "SMTPS-SSL";
$services['512'] = "RPC";
$services['514'] = "RSH";
//$services['514:UDP'] = "SYSLOG";
$services['515'] = "LPD-PRINTER";
//$services['520:UDP'] = "RIP-ROUTER";
$services['530'] = "RPC";
$services['540'] = "UUCP";
$services['544'] = "KSHELL";
$services['556'] = "REMOTE-FS";
$services['587'] = "SMTPS-TLS";
$services['593'] = "HTTP-RPC";
$services['631'] = "IPP";
$services['636'] = "LDAPS";
$services['993'] = "IMAPS";
$services['995'] = "POP3S";
$services['990'] = "FTPS";
$services['992'] = "TELNETS";
$services['1433'] = "MSSQL";
$services['1521'] = "ORACLE";
$services['3306'] = "MYSQL/MARIADB";
$services['3389'] = "RDESKTOP";
$services['5900'] = "VNC";
$services['7778'] = "KLOXO-ADMIN";
$services['8080'] = "HTTPD-ALT";
$services['8200'] = "GOTOMYPC";
$services['10000'] = "VIRTUALMIN-ADMIN";
$services['27017'] = "MONGODB";
$services['50000'] = "DB2";
// +--------------------------------------------------
// | Header and Globals
// +--------------------------------------------------
@ob_start(); // For ChromePhp Debug and JSONRPC to Work!
function getmicrotime(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$script_init_time = getmicrotime();
function log_script_time(){
global $script_init_time;
fb_log(number_format((getmicrotime()-$script_init_time), 3, '.', '')."s");
}
$is_windows = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');
$max_php_recursion_counter = 0;
if(!isset($_SERVER['PATH_INFO']) && isset($_SERVER['ORIG_PATH_INFO'])) {
$_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];
}
function fix_directory_separator($str){
global $is_windows;
if ($is_windows) $str = str_replace('/',DIRECTORY_SEPARATOR,$str);
else $str = str_replace('\\',DIRECTORY_SEPARATOR,$str);
return $str;
}
if(!isset($_SERVER['DOCUMENT_ROOT'])) {
if (isset($_SERVER['SCRIPT_FILENAME'])) $path = $_SERVER['SCRIPT_FILENAME'];
elseif (isset($_SERVER['PATH_TRANSLATED'])) $path = str_replace('\\\\', '\\', $_SERVER['PATH_TRANSLATED']);
$_SERVER['DOCUMENT_ROOT'] = substr($path, 0, 0-strlen($_SERVER['PHP_SELF']));
}
$_SERVER['DOCUMENT_ROOT'] = fix_directory_separator($_SERVER['DOCUMENT_ROOT']);
if (@get_magic_quotes_gpc()) {
function stripslashes_deep($value){
return is_array($value)? array_map('stripslashes_deep', $value):$value;
}
$_POST = array_map('stripslashes_deep', $_POST);
$_GET = array_map('stripslashes_deep', $_GET);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
}
// Register Globals (its an old script..)
$blockKeys = array('_SERVER','_SESSION','_GET','_POST','_COOKIE');
foreach ($_GET as $key => $val) if (array_search($key,$blockKeys) === false) $$key=$val;
foreach ($_POST as $key => $val) if (array_search($key,$blockKeys) === false) $$key=$val;
foreach ($_COOKIE as $key => $val) if (array_search($key,$blockKeys) === false && $key != 'fm_current_dir' && $key != 'ace_wrap') $$key=$val;
// PHP_VERSION_ID is available as of PHP 5.2.7, if our version is lower than that, then emulate it
if (!defined('PHP_VERSION_ID')) {
$php_version = explode('.', PHP_VERSION);
define('PHP_VERSION_ID', ($php_version[0] * 10000 + $php_version[1] * 100 + $php_version[2]));
if (PHP_VERSION_ID < 50207) {
define('PHP_MAJOR_VERSION', $php_version[0]);
define('PHP_MINOR_VERSION', $php_version[1]);
define('PHP_RELEASE_VERSION', $php_version[2]);
}
}
// Server Vars
function curl_server_online_check(){
if (function_exists('curl_init')){
@$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://phpfm.sf.net");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
@curl_exec($ch);
$errnum = curl_errno($ch);
@curl_close($ch);
}
return ($errnum == "0");
}
function socket_get_lan_ip($dest='64.0.0.0', $port=80) {
$addr = '';
if (function_exists('socket_create')){
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_connect($socket, $dest, $port);
socket_getsockname($socket, $addr, $port);
socket_close($socket);
}
return $addr;
}
function get_client_ip() {
$ipaddress = '';
if ($_SERVER['HTTP_CLIENT_IP']) $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
else if($_SERVER['HTTP_X_FORWARDED_FOR']) $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if($_SERVER['HTTP_X_FORWARDED']) $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
else if($_SERVER['HTTP_FORWARDED_FOR']) $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
else if($_SERVER['HTTP_FORWARDED']) $ipaddress = $_SERVER['HTTP_FORWARDED'];
else if($_SERVER['HTTP_X_REAL_IP']) $ipaddress = $_SERVER['HTTP_X_REAL_IP'];
else if($_SERVER['REMOTE_ADDR']) $ipaddress = $_SERVER['REMOTE_ADDR'];
// proxy transparente não esconde o IP local, colocando ele após o IP da rede, separado por vírgula
if (strpos($ipaddress, ',') !== false) {
$ips = explode(',', $ipaddress);
$ipaddress = trim($ips[0]);
}
if ($ipaddress == '::1' || $ipaddress == '127.0.0.1') $ipaddress = 'localhost';
return $ipaddress;
}
$ip = @get_client_ip();
$lan_ip = @socket_get_lan_ip();
function getServerURL() {
$url = (lowercase($_SERVER['HTTPS']) == "on")?"https://":"http://";
if (strlen($_SERVER['SERVER_NAME'])) $url .= $_SERVER['SERVER_NAME'];
elseif (strlen($_SERVER['HTTP_HOST'])) $url .= $_SERVER['HTTP_HOST'];
if ($_SERVER['SERVER_PORT'] != "80" && $_SERVER['SERVER_PORT'] != "443") $url .= ":".$_SERVER['SERVER_PORT'];
return $url;
}
function getCompleteURL() {
return getServerURL().$_SERVER['REQUEST_URI'];
}
$url = @getCompleteURL();
$url_info = parse_url($url);
$doc_root = rtrim($_SERVER['DOCUMENT_ROOT'],DIRECTORY_SEPARATOR); // ex: 'C:/htdocs'
$url_root = rtrim(@getServerURL(),'/'); // ex. 'http://www.site.com'
$fm_file = __FILE__;
$fm_url = $url_root.$_SERVER['PHP_SELF'];
$fm_path_info = pathinfo($fm_file);
$open_basedir_ini = trim(@ini_get("open_basedir"));
$open_basedirs = array();
if (strlen($open_basedir_ini)) {
$dirs = array($open_basedir_ini);
if ($is_windows) {
if (strpos($open_basedir_ini,';') !== false) {
$dirs = explode(';',$open_basedir_ini);
}
$dirs = array_map('ucfirst',$dirs);
} else {
if (strpos($open_basedir_ini,':') !== false) {
$dirs = explode(':',$open_basedir_ini);
}
}
foreach ($dirs as $dir) {
$dir = rtrim($dir,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; // fm_root must have trailing slash
if (is_dir($dir)) $open_basedirs[] = $dir;
}
}
$sys_lang = strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2));
if (!function_exists('mb_strtolower') || !function_exists('mb_strtoupper')) {
die('PHP File Manager
Error: Please enable "mbstring" php module.
http://php.net/manual/en/book.mbstring.php');
}
// +--------------------------------------------------
// | Config Class
// +--------------------------------------------------
function object_to_array( $var ) {
if( !is_object( $var ) && !is_array( $var ) ) {
return $var;
}
if( is_object( $var ) ) {
$var = get_object_vars( $var );
}
return array_map( 'object_to_array', $var );
}
function array_to_object( $var ) {
if( !is_object( $var ) && !is_array( $var ) ) {
return $var;
}
$obj = new stdClass();
foreach ($var as $key => $value) {
if (strlen($key)) $obj->{$key} = array_to_object( $value );
}
return $obj;
}
class config {
var $data;
function __construct(){
$this->data = array(
'lang'=>'',
'fm_root'=>'',
'timezone'=>'',
'date_format'=>'Y/m/d H:i',
'auth_pass'=>md5(''),
'error_reporting'=>1
);
}
function save(){
global $fm_file;
$config_string = "".chr(13).chr(10)."//".json_encode($this->data).chr(13).chr(10);
if (is_file($fm_file)){
$lines = file($fm_file);
$script_start_line = 1;
if (strpos($lines[0],'') === 0 && strpos($lines[1],'//{"') === 0) $script_start_line = 2;
if ($fh = @fopen($fm_file, "w")){
@fputs($fh,$config_string,strlen($config_string));
for ($x=$script_start_line;$x<count($lines);$x++) @fputs($fh,$lines[$x],strlen($lines[$x]));
@fclose($fh);
}
}
}
function load(){
global $fm_file;
$data = false;
if (is_file($fm_file)){
$fh = fopen($fm_file, 'r');
$line1 = fgets($fh);
$line2 = fgets($fh);
$line3 = fgets($fh);
fclose($fh);
if (strpos($line1,'') === 0 && strpos($line2,'//{"') === 0){
$config_string = trim(substr($line2,2));
if (strlen($config_string)) $data = object_to_array(json_decode($config_string));
}
}
if (is_array($data) && count($data)) $this->data = $data;
foreach ($this->data as $key => $val) $GLOBALS[$key] = $val;
}
}
// +--------------------------------------------------
// | Config Load
// +--------------------------------------------------
$cfg = new config();
$cfg->load();
if (strlen($timezone)) @date_default_timezone_set($timezone);
//@setlocale(LC_CTYPE, 'C');
//@ini_set('default_charset', $charset);
@mb_internal_encoding($charset);
@ini_set('mbstring.substitute_character','none'); // That will strip invalid characters from UTF-8 strings
@ini_set("allow_url_fopen",1);
@error_reporting(0);
@ini_set("display_errors",0);
if ($error_reporting > 0){
error_reporting(E_ERROR | E_PARSE | E_COMPILE_ERROR); @ini_set("display_errors",1);
}
function fb_log(){
global $error_reporting;
if ($error_reporting < 2) return;
if (!class_exists('ChromePhp')) return;
$arguments = func_get_args();
if (func_num_args() > 1 && is_string($arguments[0])) {
ChromePhp::log($arguments[0].': ',$arguments[1]);
} else {
ChromePhp::log($arguments[0]);
}
}
if (!strlen($fm_current_root)) {
if ($is_windows) {
if (strpos($doc_root,":") !== false) $fm_current_root = ucfirst(substr($doc_root,0,strpos($doc_root,":")+1).DIRECTORY_SEPARATOR); // If doc_root has ":" take the drive letter
$fm_current_root = ucfirst($doc_root.DIRECTORY_SEPARATOR);
} else {
$fm_current_root = "/"; // Linux default show root
}
} else {
if ($is_windows) $fm_current_root = ucfirst($fm_current_root);
}
if (strlen($fm_root)){
$fm_current_root = $fm_root;
}
if (count($open_basedirs)){
$fm_current_root_ok = false;
foreach ($open_basedirs as $open_basedir) {
if (strpos($fm_current_root,$open_basedir) !== false) {
$fm_current_root_ok = true;
break;
}
}
if (!$fm_current_root_ok) {
$fm_path = rtrim($fm_path_info['dirname'],DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
foreach ($open_basedirs as $open_basedir) {
if (strpos($fm_path,$open_basedir) !== false) {
$fm_current_root = $open_basedir;
$fm_current_root_ok = true;
break;
}
}
}
if (!$fm_current_root_ok){
$fm_current_root = $open_basedirs[0];
}
}
if (!isset($fm_current_dir)){
$fm_path = rtrim($fm_path_info['dirname'],DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
if (strpos($fm_path,$fm_current_root) !== false) {
$fm_current_dir = $fm_path;
} else {
$fm_current_dir = $fm_current_root;
}
if ($is_windows) $fm_current_dir = ucfirst($fm_current_dir);
if (strlen($_COOKIE['fm_current_dir'])) {
$fm_current_dir = $_COOKIE['fm_current_dir'];
}
}
$fm_current_root = rtrim($fm_current_root,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
$fm_current_dir = rtrim($fm_current_dir,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
@chdir($fm_current_dir); // Note: So is_link(), is_file(), is_dir() and other functions work with relative paths too.
//fb_log('fm_root',$fm_root);
//fb_log('fm_current_root',$fm_current_root);
//fb_log('fm_current_dir',$fm_current_dir);
if (isset($set_resolve_ids)){
$resolve_ids=intval($set_resolve_ids);
setcookie("resolve_ids", $resolve_ids, time()+$cookie_cache_time, "/");
}
// +--------------------------------------------------
// | User/Group Functions
// +--------------------------------------------------
$passwd_array = false;
function get_user_name($uid) {
global $is_windows, $passwd_array;
if ($is_windows) return $uid;
if ($passwd_array === false){
@system_exec_cmd("cat /etc/passwd",$passwd_file);
$passwd_array = explode(chr(10),$passwd_file);
}
foreach ($passwd_array as $line) {
$mat = explode(":",$line);
if ($mat[2] == $uid){
return $mat[0];
}
}
if (function_exists('posix_getpwuid')) {
$info = posix_getpwuid($uid);
return $info['name'];
}
return $uid;
}
$group_array = false;
function get_group_name($gid) {
global $is_windows, $group_array;
if ($is_windows) return $gid;
if ($group_array === false){
@system_exec_cmd("cat /etc/group",$group_file);
$group_array = explode(chr(10),$group_file);
}
foreach ($group_array as $line) {
$mat = explode(":",$line);
if ($mat[2] == $gid){
return $mat[0];
}
}
if (function_exists('posix_getgrgid')) {
$info = posix_getgrgid($gid);
return $info['name'];
}
return $gid;
}
function get_user_groups($user_name) {
global $is_windows, $group_array;
if ($is_windows) return array();
if ($group_array === false){
@system_exec_cmd("cat /etc/group",$group_file);
$group_array = explode(chr(10),$group_file);
}
$resul = array();
$resul['ids'] = array();
$resul['names'] = array();
foreach ($group_array as $line) {
$mat = explode(":",$line);
$user_names = explode(",",$mat[3]);
if (array_search($user_name,$user_names) !== false){
$resul['ids'][] = $mat[2];
$resul['names'][] = $mat[0];
}
}
return $resul;
}
function is_rwx_phpfm($file,$what='r'){
global $is_windows;
// Note: You can only change the uid/euid of the current process when one of the two is currently set to 0 (root).
// groupadd gteste
// usermod -a -G gteste www-data
// gpasswd -d www-data gteste
if (!is_array($GLOBALS['script_info'])) {
$GLOBALS['script_info'] = array();
$GLOBALS['script_info']['sys_uname'] = function_exists('posix_uname') ? @posix_uname() : '';
$GLOBALS['script_info']['sys_hostname'] = function_exists('gethostname') ? @gethostname() : '';
if (!strlen($GLOBALS['script_info']['sys_hostname'])){
$GLOBALS['script_info']['sys_hostname'] = @getenv('COMPUTERNAME');
}
$GLOBALS['script_info']['script_user_id'] = function_exists('posix_getuid') ? @posix_getuid() : '';
$GLOBALS['script_info']['script_user_name'] = $GLOBALS['script_info']['script_user_id'];
$GLOBALS['script_info']['script_user_home'] = '';
$GLOBALS['script_info']['script_user_shell'] = '';
$GLOBALS['script_info']['script_user_group_id'] = '';
$GLOBALS['script_info']['script_user_group_name'] = '';
$GLOBALS['script_info']['script_user_group_ids'] = array();
$GLOBALS['script_info']['script_user_group_names'] = array();
$GLOBALS['script_info']['script_group_id'] = function_exists('posix_getgid') ? @posix_getgid() : '';
$GLOBALS['script_info']['script_group_name'] = $GLOBALS['script_info']['script_group_id'];
$GLOBALS['script_info']['script_group_members'] = '';
if ($GLOBALS['script_info']['script_user_id'] && function_exists('posix_getpwuid')) {
$info = posix_getpwuid($GLOBALS['script_info']['script_user_id']);
$GLOBALS['script_info']['script_user_home'] = $info['dir'];
$GLOBALS['script_info']['script_user_shell'] = $info['shell'];
$GLOBALS['script_info']['script_user_name'] = $info['name'];
$GLOBALS['script_info']['script_user_group_id'] = $info['gid'];
if (function_exists('posix_getgrgid')) {
$info = posix_getgrgid($GLOBALS['script_info']['script_user_group_id']);
$GLOBALS['script_info']['script_user_group_name'] = $info['name'];
}
$info = get_user_groups($GLOBALS['script_info']['script_user_name']);
$GLOBALS['script_info']['script_user_group_ids'] = $info['ids'];
$GLOBALS['script_info']['script_user_group_names'] = $info['names'];
array_unshift($GLOBALS['script_info']['script_user_group_ids'], $GLOBALS['script_info']['script_user_group_id']);
array_unshift($GLOBALS['script_info']['script_user_group_names'], $GLOBALS['script_info']['script_user_group_name']);
}
if (!strlen($GLOBALS['script_info']['script_user_name'])) {
if (!system_exec_cmd('whoami',$GLOBALS['script_info']['script_user_name'])) {
$GLOBALS['script_info']['script_user_name'] = '';
}
}
if (!strlen($GLOBALS['script_info']['script_user_name']) && function_exists('get_current_user')) {
$GLOBALS['script_info']['script_user_name'] = get_current_user();
}
if (!strlen($GLOBALS['script_info']['script_user_name'])){
$GLOBALS['script_info']['script_user_name'] = @getenv('USERNAME') ? : @getenv('USER');
}
if ($is_windows && strpos($GLOBALS['script_info']['script_user_name'],'\\') !== false){
$GLOBALS['script_info']['script_user_name'] = ucfirst(substr($GLOBALS['script_info']['script_user_name'],strpos($GLOBALS['script_info']['script_user_name'],'\\')+1));
}
if (function_exists('posix_getgrgid')) {
$info = posix_getgrgid($GLOBALS['script_info']['script_group_id']);
$GLOBALS['script_info']['script_group_name'] = $info['name'];
$GLOBALS['script_info']['script_group_members'] = $info['members'];
}
fb_log($GLOBALS['script_info']);
}
$file_info = array();
$file_info['name'] = $file;
$file_stat = stat($file);
$file_info['nlinks'] = $file_stat['nlink'];
$file_info['perms'] = fileperms($file);
$file_info['owner'] = fileowner($file);
$file_info['group'] = filegroup($file);
$file_info['is_owner_readable'] = ($file_info['perms'] & 0x0100);
$file_info['is_group_readable'] = ($file_info['perms'] & 0x0020);
$file_info['is_world_readable'] = ($file_info['perms'] & 0x0004);
$file_info['is_readable'] = false;
if ($file_info['is_world_readable']) {
$file_info['is_readable'] = true;
}
if ($file_info['is_group_readable']) {
foreach ($GLOBALS['script_info']['script_user_group_ids'] as $gid) {
if ($file_info['group'] == $gid) {
$file_info['is_readable'] = true;
break;
}
}
}
if ($file_info['is_owner_readable'] && $file_info['owner'] == $GLOBALS['script_info']['script_user_id']) {
$file_info['is_readable'] = true;
}
$file_info['is_owner_writable'] = ($file_info['perms'] & 0x0080);
$file_info['is_group_writable'] = ($file_info['perms'] & 0x0010);
$file_info['is_world_writable'] = ($file_info['perms'] & 0x0002);
$file_info['is_writable'] = false;
if ($file_info['is_world_writable']) {
$file_info['is_writable'] = true;
}
if ($file_info['is_group_writable']) {
foreach ($GLOBALS['script_info']['script_user_group_ids'] as $gid) {
if ($file_info['group'] == $gid) {
$file_info['is_writable'] = true;
break;
}
}
}
if ($file_info['is_owner_writable'] && $file_info['owner'] == $GLOBALS['script_info']['script_user_id']) {
$file_info['is_writable'] = true;
}
$file_info['is_owner_executable'] = ($file_info['perms'] & 0x0040);
$file_info['is_group_executable'] = ($file_info['perms'] & 0x0400);
$file_info['is_world_executable'] = ($file_info['perms'] & 0x0001);
$file_info['is_executable'] = false;
if ($file_info['is_world_executable']) {
$file_info['is_executable'] = true;
}
if ($file_info['is_group_executable']) {
foreach ($GLOBALS['script_info']['script_user_group_ids'] as $gid) {
if ($file_info['group'] == $gid) {
$file_info['is_executable'] = true;
break;
}
}
}
if ($file_info['is_owner_executable'] && $file_info['owner'] == $GLOBALS['script_info']['script_user_id']) {
$file_info['is_executable'] = true;
}
if ($what == 'r') return $file_info['is_readable'];
if ($what == 'w') return $file_info['is_writable'];
if ($what == 'x') return $file_info['is_executable'];
return false;
}
function is_readable_phpfm($file){
return is_rwx_phpfm($file,'r');
}
function is_writable_phpfm($file){
return is_rwx_phpfm($file,'w');
}
function is_executable_phpfm($file){
return is_rwx_phpfm($file,'x');
}
// +--------------------------------------------------
// | File Manager Actions
// +--------------------------------------------------
if ($action != '99') {
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Content-Type: text/html; charset=".$charset);
}
if ($auth_pass == md5('') || $loggedon==$auth_pass){
switch ($frame){
case 1: break; // Empty Frame
case 2: frame2(); break;
case 3: frame3(); break;
default:
switch($action){
case 1: logout(); break;
case 2: config_form(); break;
case 3: download(); break;
case 4: view_form(); break;
case 5: server_info_form(); break;
case 6: break;
case 7: edit_file_form(); break;
case 8: chmod_form(); break;
case 9: shell_form(); break;
case 10: upload_form(); break;
case 11: system_exec_file(); break;
case 12: portscan_form(); break;
case 14: dir_list_update_total_size(); break;
case 99: get_base64_file(); break;
default:
if ($noscript) login_form();
else frameset();
}
}
} elseif (strlen($pass)) {
login();
} else {
login_form();
}
// +--------------------------------------------------
// | File System
// +--------------------------------------------------
function symlink_phpfm($target,$link){
global $is_windows;
$ok = false;
if (!$is_windows){ // symlink() function not available on windows
if (function_exists('symlink')) {
$ok = symlink($target,$link);
} else {
$GLOBALS['dir_list_warn_message'] .= 'Error: php symlink() function is disabled.
';
}
}
if (!$ok){
$cmd = '';
if ($is_windows){
//$runas = 'runas /noprofile /user:Administrator ';
if (is_dir($target)) $cmd = $runas.'mklink /D '.escapeshellarg($link).' '.escapeshellarg($target);
else $cmd = $runas.'mklink '.escapeshellarg($link).' '.escapeshellarg($target);
} else {
$cmd = 'ln -s '.escapeshellarg($target).' '.escapeshellarg($link);
}
$output = '';
$ok = system_exec_cmd($cmd,$output);
if (!$ok) {
$GLOBALS['dir_list_warn_message'] .= 'CMD: '.$cmd.'
';
$GLOBALS['dir_list_warn_message'] .= $output.'
';
}
// link() function is available on windows (Vista, Server 2008 or greater)
// if everything failed, try to create a hardlink to the file instead
if (!$ok && !is_dir($target) && $is_windows) {
if (function_exists('link')) {
$ok = link($target,$link);
} else {
$GLOBALS['dir_list_warn_message'] .= 'Error: php link() function is disabled.
';
}
}
}
return $ok;
}
function link_phpfm($target,$link){
global $is_windows;
if (is_dir($target)) {
// hardlinks to directories are not allowed, create symlink instead
// https://askubuntu.com/questions/210741/why-are-hard-links-not-allowed-for-directories
return symlink_phpfm($target,$link);
}
$ok = false;
if (function_exists('link')) { // link() function is available on windows (Vista, Server 2008 or greater)
$ok = link($target,$link);
} else {
$GLOBALS['dir_list_warn_message'] .= 'Error: php link() function is disabled.
';
}
if (!$ok){
$cmd = '';
if ($is_windows){
//$runas = 'runas /noprofile /user:Administrator ';
$cmd = $runas.'mklink /H '.escapeshellarg($link).' '.escapeshellarg($target);
} else {
$cmd = 'ln '.escapeshellarg($target).' '.escapeshellarg($link);
}
$output = '';
$ok = system_exec_cmd($cmd,$output);
if (!$ok) {
$GLOBALS['dir_list_warn_message'] .= 'CMD: '.$cmd.'
';
$GLOBALS['dir_list_warn_message'] .= $output.'
';
}
}
return $ok;
}
function phpfm_get_total_size($path){
$total_size = false;
$dir_cookiename = 'dir_'.md5(fix_cookie_name($path));
if (strlen($_COOKIE[$dir_cookiename])) {
$total_size = $_COOKIE[$dir_cookiename];
if ($total_size != 'error'){
return intval($total_size);
}
return $total_size;
}
$total_size = system_get_total_size($path);
if ($total_size !== false) {
setcookie((string)$dir_cookiename, (string)$total_size, 0 , "/");
}
return $total_size;
}
function dir_list_update_total_size(){
global $fm_current_dir, $dirname;
$path = rtrim($fm_current_dir,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.$dirname;
$total_size = system_get_total_size($path);
if ($total_size === false) {
$total_size = php_get_total_size($path);
}
if ($total_size === false) {
$total_size = 'error';
}
$dir_cookiename = 'dir_'.md5(fix_cookie_name($fm_current_dir.$dirname));
setcookie((string)$dir_cookiename, (string)$total_size, 0 , "/");
echo $total_size;
die();
}
// INFO: php filesize() returns ZERO for files over 4Gb
function phpfm_filesize($file){
$filesize = intval(filesize($file));
if ($filesize <= 0) $filesize = system_get_total_size($file);
return $filesize;
}
function system_get_total_size($path){
global $is_windows;
$total_size = false;
if ($is_windows){
if (class_exists('COM')) {
$fsobj = new COM('Scripting.FileSystemObject');
if (is_object($fsobj)) {
try {
if (is_dir($path)) $ref = $fsobj->GetFolder($path);
else $ref = $fsobj->GetFile($path);
if (is_object($ref)) {
$total_size = floatval($ref->size);
$fsobj = null;
unset($fsobj);
}
} catch (Exception $e) {
}
}
}
if ($total_size === false) {
if (is_file($path)){
$output = '';
if (system_exec_cmd('for %I in ('.$path.') do @echo %~zI',$output)){
$total_size = floatval($output);
}
}
}
} else {
$output = '';
if (system_exec_cmd('du -sb '.$path,$output)){
$total_size = floatval(substr($output,0,strpos($output,"\t")));
}
}
if ($total_size === false) fb_log('system_get_total_size("'.$path.'") = FALSE');
else fb_log('system_get_total_size("'.$path.'") = '.format_size($total_size));
return $total_size;
}
function php_get_total_size($path) {
global $debug_mode,$max_php_recursion_counter;
$max_php_recursion_counter = 0;
$total_size = php_get_total_size_execute($path);
if ($total_size === false) fb_log('php_get_total_size("'.$path.'") = false'.' (recursion: '.$max_php_recursion_counter.')');
else fb_log('php_get_total_size("'.$path.'") = '.format_size($total_size).' (recursion: '.$max_php_recursion_counter.')');
return $total_size;
}
function php_get_total_size_execute($path) {
global $debug_mode,$max_php_recursion,$max_php_recursion_counter;
fb_log('php_get_total_size_execute',$path);
if ($debug_mode) return 0;
$total_size = 0;
if (is_dir($path)) {
$entry_list = scandir(fs_encode($path));
foreach ($entry_list as $entry) {
if ($entry == "." || $entry == "..") continue;
if (is_dir($path.DIRECTORY_SEPARATOR.$entry)) {
if ($max_php_recursion_counter >= $max_php_recursion) {
return false;
}
$max_php_recursion_counter++;
$size = php_get_total_size_execute($path.DIRECTORY_SEPARATOR.$entry);
if ($size === false) {
return false;
}
$total_size += $size;
} else {
$total_size += phpfm_filesize($path.DIRECTORY_SEPARATOR.$entry);
}
}
} else {
$total_size = phpfm_filesize($path);
}
return $total_size;
}
function php_shred($filepath) {
// Based on https://github.com/DanielRuf/secure-shred (MIT license)
// https://www.aldeid.com/wiki/Secure-delete-files
// TODO: test write each pass, and rename the file before delete.
try {
// clear stat cache to avoid falsely reported file status
// use $filepath parameter to possibly improve performance
clearstatcache(true, $filepath);
if (is_file($filepath) && is_readable($filepath) && is_writable($filepath)) {
$read = new \SplFileObject($filepath, 'r');
$write = new \SplFileObject($filepath, 'r+');
while (!$read->eof()) {
$line_pos = $read->ftell();
$line_content = $read->fgets();
$line_length = strlen($line_content);
if ($line_length === 0) continue;
for ($n=0;$n<3;$n++) { // does 3 overwrites per line
$write->fseek($line_pos);
$write->fwrite(random_bytes($line_length));
$write->fflush();
}
}
$write->ftruncate(0);
$read = $write = null;
return unlink($filepath);
}
} catch(\Exception $e) {
fb_log($e->getMessage().' ('.$e->getCode().')');
}
return false;
}
function total_delete($path,$followlinks=false,$checkhardlinks=true) {
global $debug_mode;
fb_log('total_delete',$path);
if ($debug_mode) return;
// TODO: $checkhardlinks will not allow to delete anything that has other links on the system, using stat() to avoid creating brokenlinks. Add a warning and complete action;.
if (file_exists($path)) {
@chmod($path,0755);
if (is_dir($path)) {
$entry_list = scandir(fs_encode($path));
foreach ($entry_list as $entry) {
if ($entry == "." || $entry == "..") continue;
if ($followlinks == false && is_link(rtrim($path,DIRECTORY_SEPARATOR))) continue;
total_delete($path.DIRECTORY_SEPARATOR.$entry,$followlinks,$checkhardlinks);
}
if (is_link($path)) @unlink($path);
else @rmdir($path);
} else {
@unlink($path);
}
} elseif (is_link($path)) {
@unlink($path); // Broken links must be removed
}
}
function total_copy($orig,$dest,$copylinks=true,$followlinks=false) {
global $debug_mode;
fb_log('total_copy',$orig.' => '.$dest);
if ($debug_mode) return;
$ok = true;
if (file_exists($orig) || is_link($orig)) {
if ($copylinks == true && is_link($orig)){
$ok = link_phpfm(readlink($orig), $dest);
if (!$ok) $ok = link_phpfm($orig, $dest); // Allow copy of broken links, but rather copy the link to the target, as the link was.
} elseif (is_dir($orig)) {
$ok = mkdir(fs_encode($dest),0755);
if ($ok) {
$entry_list = scandir(fs_encode($orig));
foreach ($entry_list as $entry) {
if ($entry == "." || $entry == "..") continue;
if ($followlinks == false && is_link(rtrim($orig,DIRECTORY_SEPARATOR))){
$ok = link_phpfm(readlink($orig.DIRECTORY_SEPARATOR.$entry), $dest.DIRECTORY_SEPARATOR.$entry);
} else {
$ok = total_copy($orig.DIRECTORY_SEPARATOR.$entry, $dest.DIRECTORY_SEPARATOR.$entry, $copylinks, $followlinks);
}
if (!$ok) break;
}
}
} else {
$ok = copy((string)$orig,(string)$dest);
}
}
return $ok;
}
function total_move($orig,$dest) {
global $debug_mode;
fb_log('total_move',$orig.' => '.$dest);
if ($debug_mode) return;
// Just why doesn't it has a MOVE alias?!
return rename((string)$orig,(string)$dest);
}
function download(){
global $fm_current_dir,$filename,$debug_mode;
$file = $fm_current_dir.$filename;
fb_log('download',$file);
if ($debug_mode) return;
if(file_exists($file)){
$is_denied = false;
foreach($download_ext_filter as $key=>$ext){
if (eregi($ext,$filename)){
$is_denied = true;
break;
}
}
if (!$is_denied){
$size = phpfm_filesize($file);
header("Content-Type: application/save");
header("Content-Length: $size");
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-Transfer-Encoding: binary");
if ($fh = fopen("$file", "rb")){
ob_get_flush(); // Flush the output buffer and turn off output buffering, to allow direct download of big files
fpassthru($fh);
fclose($fh);
} else alert(et('ReadDenied').": ".$file);
} else alert(et('ReadDenied').": ".$file);
} else alert(et('FileNotFound').": ".$file);
}
// Returns the full path of the current PHP executable
function linux_get_proc_name(){
$output = '';
$ok = system_exec_cmd("readlink -f /proc/".posix_getpid()."/exe",$output);
if (!$ok) return false;
return $output;
}
function system_exec_file(){
global $fm_current_dir,$filename,$debug_mode,$is_windows;
fb_log('system_exec_file',$filename);
if ($debug_mode) return;
header("Content-type: text/plain");
$file = $fm_current_dir.$filename;
if(file_exists($file)){
if (!is_executable($file)) @chmod($file,0755);
if (is_executable($file)) {
$fm_current_dir = get_absolute_path($fm_current_dir);
$cmd_line = '';
if ($is_windows) {
$cmd_line .= "cd /D ".$fm_current_dir." && ";
} else {
$cmd_line .= "cd ".$fm_current_dir." && ";
}
// TODO: verificar e usar interpretador correto
// php -f /script.php
// bash /script.sh
// sh /script.sh
// python /script.py
// perl /script.pl
$cmd_line .= $file;
echo "# ".$cmd_line."\n";
system_exec_cmd($cmd_line, $output);
echo $output;
} else echo('Error: '.$file.' is not executable...');
} else echo(et('FileNotFound').": ".$file);
}
function save_upload($temp_file,$filename,$dir_dest) {
global $upload_ext_filter,$debug_mode,$is_windows;
fb_log('save_upload',$temp_file.' => '.$dir_dest.$filename);
if ($debug_mode) return;
$filename = remove_special_chars($filename);
$file = $dir_dest.$filename;
$filesize = phpfm_filesize($temp_file);
$is_denied = false;
foreach($upload_ext_filter as $key=>$ext){
if (eregi($ext,$filename)){
$is_denied = true;
break;
}
}
if (!$is_denied){
if (!check_limit($filesize)){
if (file_exists($file)){
if (unlink($file)){
if (copy($temp_file,$file)){
// https://stackoverflow.com/questions/23851821/setting-file-permissions-in-windows-with-php
if ($is_windows) system_exec_cmd('icacls "'.$file.'" /q /c /reset');
else @chmod($file,0644);
$out = 6;
} else $out = 2;
} else $out = 5;
} else {
if (copy($temp_file,$file)){
if ($is_windows) system_exec_cmd('icacls "'.$file.'" /q /c /reset');
else @chmod($file,0644);
$out = 1;
} else $out = 2;
}
} else $out = 3;
} else $out = 4;
return $out;
}
// Note: readlink() may return a relative path, with or without ./, and that is not good for is_file() is_dir() and broken link evaluation, because we can´t always chdir() to the link basepath.
function readlink_absolute_path($path){
global $is_windows;
if (!is_link($path)) return $path;
$target = readlink($path);
if (strpos($target,'.'.DIRECTORY_SEPARATOR) === 0){
$target = substr($target,2); // remove ./
}
if (($is_windows && substr($target,2,1) != ':') || (!$is_windows && substr($target,0,1) != DIRECTORY_SEPARATOR)){ // check if does not start with C: or / = relative path
$target = substr($path,0,strrpos($path,DIRECTORY_SEPARATOR)+1).$target; // complete the target using origin path
}
return $target;
}
// +--------------------------------------------------
// | Data Formating
// +--------------------------------------------------
function fix_cookie_name($str){
$str = remove_acentos(trim($str));
$str = str_replace('\\', '_', $str);
$str = str_replace('/', '_', $str);
$str = str_replace(':', '_', $str);
$str = str_replace('*', '_', $str);
$str = str_replace('?', '_', $str);
$str = str_replace('"', '_', $str);
$str = str_replace('<', '_', $str);
$str = str_replace('>', '_', $str);
$str = str_replace('|', '_', $str);
$str = str_replace(' ', '_', $str);
$str = str_strip($str,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-0123456789");
$str = replace_double('_', $str);
$str = trim($str,'_');
return $str;
}
// http://www.ietf.org/rfc/rfc1738.txt
// The characters ";", "/", "?", ":", "@", "=" and "&" are the characters which may be reserved for special meaning within a scheme. No other characters may be reserved within a scheme.
// Thus, only alphanumerics, the special characters "$-_.+!*'(),", and reserved characters used for their reserved purposes may be used unencoded within a URL.
function fix_url($str) {
// Remove acentos
$str = remove_acentos($str);
// Substitui caracteres reservados
$str = str_replace(';', '-', $str);
$str = str_replace('/', '-', $str);
$str = str_replace('?', '-', $str);
$str = str_replace(':', '-', $str);
$str = str_replace('@', '-', $str);
$str = str_replace('=', '-', $str);
$str = str_replace('&', '-', $str);
// Caracteres adicionais
$str = str_replace('(', '-', $str);
$str = str_replace(')', '-', $str);
$str = str_replace('.', '-', $str);
$str = str_replace('_', '-', $str);
$str = str_replace(' ', '-', $str);
// Apenas caracteres válidos
$str = str_strip($str, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890.-");
$str = replace_double('-', $str);
$str = trim($str,'-');
return $str;
}
function fix_filename($str,$allowSpaces=false){ // no filesystem não podemos ter acentos
$str = remove_acentos(trim($str));
// Substitui caracteres reservados
$str = str_replace('\\', '_', $str);
$str = str_replace('/', '_', $str);
$str = str_replace(':', '_', $str);
$str = str_replace('*', '_', $str);
$str = str_replace('?', '_', $str);
$str = str_replace('"', '_', $str);
$str = str_replace('<', '_', $str);
$str = str_replace('>', '_', $str);
$str = str_replace('|', '_', $str);
if ($allowSpaces){
// Apenas caracteres válidos
$str = str_strip($str,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-0123456789.()[]& ");
$str = replace_double(' ', $str);
$str = trim($str);
} else {
$str = str_replace(' ', '_', $str);
// Apenas caracteres válidos
$str = str_strip($str,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-0123456789.()[]&");
}
$str = replace_double('_', $str);
$str = trim($str,'_');
return $str;
}
function fix_filename_download($str){ // no download podemos ter acentos
$str = trim($str);
// Substitui caracteres reservados
$str = str_replace('\\', ' ', $str);
$str = str_replace('/', ' ', $str);
$str = str_replace(':', ' ', $str);
$str = str_replace('*', ' ', $str);
$str = str_replace('?', ' ', $str);
$str = str_replace('"', ' ', $str);
$str = str_replace('<', ' ', $str);
$str = str_replace('>', ' ', $str);
$str = str_replace('|', ' ', $str);
// Apenas caracteres válidos
$str = str_strip($str,"ÁÀÃÂÉÊÈËÍÓÔÕÒÚÜÇÑáàãâéêèëíóõôòúüçñABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-0123456789.()[] ");
$str = replace_double(' ', $str);
$str = trim($str);
return $str;
}
function add_http($str){
if (mb_strlen($str) > 0 && mb_strpos($str, 'http://') === false && mb_strpos($str, 'https://') === false) return 'http://'.$str;
else return $str;
}
function remove_sinais($str){
$sinais = "./\\-,:;'`~?!\"<>{}[]@#\$%^&*()_+=|";
$str = str_replace(str_split($sinais),"",$str);
return replace_double(" ",$str);
}
function remove_acentos($string) {
if ( !preg_match('/[\x80-\xff]/', $string) ) return $string;
$chars = array(
// Decompositions for Latin-1 Supplement
chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
chr(195).chr(135) => 'C', chr(195).chr(136) => 'E',
chr(195).chr(137) => 'E', chr(195).chr(138) => 'E',
chr(195).chr(139) => 'E', chr(195).chr(140) => 'I',
chr(195).chr(141) => 'I', chr(195).chr(142) => 'I',
chr(195).chr(143) => 'I', chr(195).chr(145) => 'N',
chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
chr(195).chr(159) => 's', chr(195).chr(160) => 'a',
chr(195).chr(161) => 'a', chr(195).chr(162) => 'a',
chr(195).chr(163) => 'a', chr(195).chr(164) => 'a',
chr(195).chr(165) => 'a', chr(195).chr(167) => 'c',
chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
chr(195).chr(177) => 'n', chr(195).chr(178) => 'o',
chr(195).chr(179) => 'o', chr(195).chr(180) => 'o',
chr(195).chr(181) => 'o', chr(195).chr(182) => 'o',
chr(195).chr(182) => 'o', chr(195).chr(185) => 'u',
chr(195).chr(186) => 'u', chr(195).chr(187) => 'u',
chr(195).chr(188) => 'u', chr(195).chr(189) => 'y',
chr(195).chr(191) => 'y',
// Decompositions for Latin Extended-A
chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
chr(197).chr(190) => 'z', chr(197).chr(191) => 's'
);
$string = strtr($string, $chars);
return $string;
}
function retifica_aspas($str){
//return $str;
$quotes = array(
"\xC2\xAB" => '"', // « (U+00AB) in UTF-8
"\xC2\xBB" => '"', // » (U+00BB) in UTF-8
"\xE2\x80\x98" => "'", // ‘ (U+2018) in UTF-8
"\xE2\x80\x99" => "'", // ’ (U+2019) in UTF-8
"\xE2\x80\x9A" => "'", // ‚ (U+201A) in UTF-8
"\xE2\x80\x9B" => "'", // ‛ (U+201B) in UTF-8
"\xE2\x80\x9C" => '"', // “ (U+201C) in UTF-8
"\xE2\x80\x9D" => '"', // ” (U+201D) in UTF-8
"\xE2\x80\x9E" => '"', // „ (U+201E) in UTF-8
"\xE2\x80\x9F" => '"', // ‟ (U+201F) in UTF-8
"\xE2\x80\xB9" => "'", // ‹ (U+2039) in UTF-8
"\xE2\x80\xBA" => "'", // › (U+203A) in UTF-8
);
return strtr($str, $quotes);
// replace Microsoft Word version of single and double quotations marks (“ ” ‘ ’) with regular quotes (' and ")
//return iconv('UTF-8', 'ASCII//TRANSLIT', $str);
}
function html_encode($str){
global $charset;
$str = preg_replace(array('/&/', '/</', '/>/', '/"/'), array('&', '<', '>', '"'), $str); // Bypass PHP to allow any charset!!
if (version_compare(PHP_VERSION, '5.2.3', '>=')) {
$str = htmlentities($str, ENT_QUOTES, $charset, false);
} else {
$str = htmlentities($str, ENT_QUOTES, $charset);
}
return $str;
}
function rep($x,$y){
if ($x) {
$aux = "";
for ($a=1;$a<=$x;$a++) $aux .= $y;
return $aux;
} else return "";
}
function str_zero($arg1,$arg2){
if (strstr($arg1,"-") == false){
$aux = intval($arg2) - strlen($arg1);
if ($aux) return rep($aux,"0").$arg1;
else return $arg1;
} else {
return "[$arg1]";
}
}
function replace_double($sub,$str){
$out=str_replace($sub.$sub,$sub,$str);
while ( strlen($out) != strlen($str) ){
$str=$out;
$out=str_replace($sub.$sub,$sub,$str);
}
return $out;
}
function remove_special_chars($str){
$str = trim($str);
$str = strtr($str,"¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ!@#%&*()[]{}+=?",
"YuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy_______________");
$str = str_replace("..","",str_replace("/","",str_replace("\\","",str_replace("\$","",$str))));
return $str;
}
function array_csort() {
$args = func_get_args();
$marray = array_shift($args);
$msortline = "return(array_multisort(";
foreach ($args as $arg) {
$i++;
if (is_string($arg)) {
foreach ($marray as $row) {
$sortarr[$i][] = $row[$arg];
}
} else {
$sortarr[$i] = $arg;
}
$msortline .= "\$sortarr[".$i."],";
}
$msortline .= "\$marray));";
eval($msortline);
return $marray;
}
function show_perms($P) {
$sP = "";
if($P & 0x1000) $sP .= 'p'; // FIFO pipe
elseif($P & 0x2000) $sP .= 'c'; // Character special
elseif($P & 0x4000) $sP .= 'd'; // Directory
elseif($P & 0x6000) $sP .= 'b'; // Block special
elseif($P & 0x8000) $sP .= '−'; // Regular
elseif($P & 0xA000) $sP .= 'l'; // Symbolic Link
elseif($P & 0xC000) $sP .= 's'; // Socket
else $sP .= 'u'; // UNKNOWN
$sP .= "";
// owner - group - others
$sP .= (($P & 0x0100) ? 'r' : '−') . (($P & 0x0080) ? 'w' : '−') . (($P & 0x0040) ? (($P & 0x0800) ? 's' : 'x' ) : (($P & 0x0800) ? 'S' : '−'));
$sP .= (($P & 0x0020) ? 'r' : '−') . (($P & 0x0010) ? 'w' : '−') . (($P & 0x0008) ? (($P & 0x0400) ? 's' : 'x' ) : (($P & 0x0400) ? 'S' : '−'));
$sP .= (($P & 0x0004) ? 'r' : '−') . (($P & 0x0002) ? 'w' : '−') . (($P & 0x0001) ? (($P & 0x0200) ? 't' : 'x' ) : (($P & 0x0200) ? 'T' : '−'));
return $sP;
}
function format_size($arg) {
if ($arg>0){
$j = 0;
$ext = array(" bytes"," Kb"," Mb"," Gb"," Tb");
while ($arg >= pow(1024,$j)) ++$j;
return round($arg / pow(1024,$j-1) * 100) / 100 . $ext[$j-1];
} else return "0 bytes";
}
function check_limit($new_filesize=0) {
global $fm_current_root;
global $quota_mb;
if($quota_mb){
$total = intval(phpfm_get_total_size($fm_current_root));
if (floor(($total+$new_filesize)/(1024*1024)) > $quota_mb) return true;
}
return false;
}
function uppercase($str){
global $charset;
return mb_strtoupper($str, $charset);
}
function lowercase($str){
global $charset;
return mb_strtolower($str, $charset);
}
function word_count($theString) {
$theString = html_decode(strip_tags($theString));
$char_count = mb_strlen($theString);
$fullStr = $theString." ";
$initial_whitespace_rExp = "^[[:alnum:]]$";
$left_trimmedStr = ereg_replace($initial_whitespace_rExp,"",$fullStr);
$non_alphanumerics_rExp = "^[[:alnum:]]$";
$cleanedStr = ereg_replace($non_alphanumerics_rExp," ",$left_trimmedStr);
$splitString = explode(" ",$cleanedStr);
$word_count = count($splitString)-1;
if(mb_strlen($fullStr)<2)$word_count=0;
return $word_count;
}
function str_strip($str,$valid_chars){
$out = "";
for ($i=0;$i<mb_strlen($str);$i++){
$mb_char = mb_substr($str,$i,1);
if (mb_strpos($valid_chars,$mb_char) !== false){
$out .= $mb_char;
}
}
return $out;
}
function mb_str_ireplace($co, $naCo, $wCzym) {
$wCzymM = mb_strtolower($wCzym);
$coM = mb_strtolower($co);
$offset = 0;
while(!is_bool($poz = mb_strpos($wCzymM, $coM, $offset))) {
$offset = $poz + mb_strlen($naCo);
$wCzym = mb_substr($wCzym, 0, $poz). $naCo .mb_substr($wCzym, $poz+mb_strlen($co));
$wCzymM = mb_strtolower($wCzym);
}
return $wCzym;
}
// +--------------------------------------------------
// | Interface
// +--------------------------------------------------
// Fix for the demo at https://phpfm-demo.000webhostapp.com
function demo_fix(){
global $url_root;
if (strpos($url_root,'phpfm-demo.000webhostapp.com') !== false) {
echo "
<script language=\"Javascript\" type=\"text/javascript\">
if (window.jQuery){
setTimeout(function(){
$('div:has(a:has(img[alt=\"www.000webhost.com\"]))').remove();
},1000);
}
</script>";
}
}
function html_header($header=""){
global $charset,$fm_color,$fm_path_info,$cookie_cache_time;
echo "
<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"//www.w3.org/1999/xhtml\">
<meta http-equiv=\"content-type\" content=\"text/html; charset=".$charset."\" />
<link rel=\"shortcut icon\" href=\"".$fm_path_info['basename']."?action=99&filename=favicon.ico\" type=\"image/x-icon\">
".et('FileMan')." <title>".et('FileMan')."</title>
<style>
.fm-title { margin: 0; font-weight: 500; line-height: 1.2; font-size: 1.5rem; }
.float-left { float: left }
.float-right { float: right }
.noselect {
-webkit-touch-callout: none; /* iOS Safari */
-webkit-user-select: none; /* Safari */
-khtml-user-select: none; /* Konqueror HTML */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* Internet Explorer/Edge */
user-select: none; /* Non-prefixed version */
}
.btn {
display: inline-block;
text-align: center;
white-space: nowrap;
vertical-align: middle;
user-select: none;
padding: 0 .4rem .05rem .2rem;
line-height: 1.6;
cursor: pointer;
}
.noIcon {
padding: 0 .4rem .05rem .4rem;
}
i.bdc-link {
font-style: normal;
padding: 0 1px;
}
.fm-disk-info span {
display: inline-block;
margin: 2px 0;
font-weight: 700;
}
.table {
width: 100%;
margin-bottom: 1rem;
border-collapse: collapse;
}
.table .thead-light th {
color: #495057;
background-color: #e9ecef;
border-color: #dee2e6;
vertical-align: bottom;
border-bottom: 2px solid #dee2e6;
border-bottom-width: 2px;
}
.table td, .table th {
padding: .3rem .4rem;
border: 1px solid #dee2e6;
}
.table th {
text-align: left;
}
.table td.lg {
width: 400px;
}
.table td.sm {
width: 10px;
padding: .3rem .6rem;
white-space: nowrap;
}
table.entry_name_table {
width: 100%;
}
table.entry_name_table td {
border: none;
white-space: nowrap;
padding: 0;
}
table.entry_name_table td.entry_name {
padding-right: 60px;
padding-top: 3px;
}
table.entry_name_table td .fa {
margin-top: 0;
margin-left: -6px;
margin-right: 3px;
}
.form-signin {
max-width: 350px;
padding: 20px 20px 25px 20px;
/*margin: 0 auto;*/
background-color: #fff;
border: 1px solid #ccc;
}
.form-signin-heading {
margin-top: 0;
margin-bottom: 18px;
white-space: nowrap;
}
.form-control {
display: block;
width: 100%;
margin-top: 1px;
padding: 4px 10px;
color: #495057;
background-color: #fff;
background-clip: padding-box;
border: 1px solid #ced4da;
}
.form-signin input[type=\"password\"] {
max-width: calc(100% - 80px);
float: left;
}
.alert {
position: relative;
padding: 5px 10px;
border: 1px solid transparent;
clear: both;
}
.alert-danger {
color: #721c24;
background-color: #f8d7da;
border-color: #f5c6cb;
}
.mt-3 { margin-top: 1rem!important; }
.mt-5 { margin-top: 3rem!important; }
.icon_loading {
background:url('".$fm_path_info['basename']."?action=99&filename=throbber.gif') 0 0 no-repeat;
width: 16px;
height: 16px;
line-height: 16px;
display: inline-block;
vertical-align: text-bottom;
}
.fa {
background:url('".$fm_path_info['basename']."?action=99&filename=file_sprite.png') 0 0 no-repeat;
width: 18px;
height: 18px;
line-height: 18px;
display: inline-block;
vertical-align: text-bottom;
margin-top: 3px;
}
.fa.fa-code { background-position: -126px 0; }
.fa.fa-code-o { background-position: -143px 0; }
.fa.fa-php { background-position: -108px -18px; }
.fa.fa-picture { background-position: -125px -18px; }
.fa.fa-file-text-o { background-position: -254px -18px; }
.fa-file-archive-o { background-position: -180px 0; }
.fa.fa-html { background-position: -434px -18px; }
.fa.fa-file-excel-o { background-position: -361px 0; }
.fa.fa-music { background-position: -108px 0; }
.fa.fa-video { background-position: -90px 0; }
.fa.fa-file-aspx { background-position: -236px 0; }
.fa.fa-database { background-position: -272px 0; }
.fa.fa-file-word { background-position: -361px -18px; }
.fa.fa-file-powerpoint { background-position: -144px -18px; }
.fa.fa-font { background-position: -415px 0; }
.fa.file-pdf { background-position: -18px 0; }
.fa.file-image-o { background-position: -398px 0; }
.fa.fa-gear { background-position: -434px 0; }
.fa.fa-download { background-position: -162px -18px; }
.fa.fa-settings { background-position: -398px -18px; }
.fa.fa-refresh { background-position: -236px -18px; }
.fa.fa-lunix { background-position: -290px -18px; }
.fa.fa-folder { background-position: -506px -18px; }
.fa.fa-add-file { background-position: -54px 0; }
.fa.fa-upload { background-position: -453px 0; }
.fa.fa-file-go { background-position: -470px 0; }
.fa.fa-link { background-position: -488px -18px; }
.fa.fa-find { background-position: -380px 0; }
.fa.fa-file-light { background-position: -470px -18px; }
.fa.fa-file-remove { background-position: -290px 0; }
.fa.fa-file-config { background-position: -308px 0; }
.fa.fa-resolve { background-position: -272px 0; }
.fa.fa-perms { background-position: -344px 0; }
.fa.fa-copy { background-position: -198px 0; }
.fa.fa-copy-o { background-position: -198px -18px; }
.fa.fa-edit { background-position: -326px 0; }
.fa.fa-rename { background-position: -454px -18px; }
.fa.fa-glob { background-position: -380px -18px; }
.fa.fa-vs { background-position: -326px -18px; }
.fa.fa-search { background-position: 0 -18px; }
</style>
<script language=\"Javascript\" type=\"text/javascript\">
<!--
function Is(){
this.appname = navigator.appName;
this.appversion = navigator.appVersion;
this.platform = navigator.platform;
this.useragent = navigator.userAgent.toLowerCase();
this.ie = ( this.appname == 'Microsoft Internet Explorer' );
if (( this.useragent.indexOf( 'mac' ) != -1 ) || ( this.platform.indexOf( 'mac' ) != -1 )){
this.sisop = 'mac';
} else if (( this.useragent.indexOf( 'windows' ) != -1 ) || ( this.platform.indexOf( 'win32' ) != -1 )){
this.sisop = 'windows';
} else if (( this.useragent.indexOf( 'inux' ) != -1 ) || ( this.platform.indexOf( 'linux' ) != -1 )){
this.sisop = 'linux';
}
}
var is = new Is();
function enterSubmit(keypressEvent,submitFunc){
var kCode = (is.ie) ? keypressEvent.keyCode : keypressEvent.which
if( kCode == 13) eval(submitFunc);
}
function getCookieVal(offset) {
var endstr = document.cookie.indexOf (';', offset);
if (endstr == -1) endstr = document.cookie.length;
return decodeURIComponent(document.cookie.substring(offset, endstr));
}
function getCookie(name) {
var arg = name + '=';
var alen = arg.length;
var clen = document.cookie.length;
var i = 0;
while (i < clen) {
var j = i + alen;
if (document.cookie.substring(i, j) == arg) return getCookieVal (j);
i = document.cookie.indexOf(' ', i) + 1;
if (i == 0) break;
}
return null;
}
function setCookie(name, value) {
var argv = setCookie.arguments;
var argc = setCookie.arguments.length;
var expires = (argc > 2) ? argv[2] : null;
var path = (argc > 3) ? argv[3] : null;
var domain = (argc > 4) ? argv[4] : null;
var secure = (argc > 5) ? argv[5] : false;
document.cookie = name + '=' + encodeURIComponent(value) +
((expires == null) ? '' : ('; expires=' + expires.toGMTString())) +
((path == null) ? '' : ('; path=' + path)) +
((domain == null) ? '' : ('; domain=' + domain)) +
((secure == true) ? '; secure' : '');
}
function delCookie(name) {
var exp = new Date();
exp.setTime (exp.getTime() - 1);
var cval = getCookie (name);
document.cookie = name + '=' + cval + '; expires=' + exp.toGMTString();
}
function setCookiePersistent(name, value){
var exp = new Date();
exp.setTime(exp.getTime()+".$cookie_cache_time.");
setCookie(name,value,exp);
}
var frameWidth, frameHeight;
function getFrameSize(){
if (self.innerWidth){
frameWidth = self.innerWidth;
frameHeight = self.innerHeight;
}else if (document.documentElement && document.documentElement.clientWidth){
frameWidth = document.documentElement.clientWidth;
frameHeight = document.documentElement.clientHeight;
}else if (document.body){
frameWidth = document.body.clientWidth;
frameHeight = document.body.clientHeight;
}else return false;
return true;
}
getFrameSize();
function str_replace (search, replace, subject, count) {
var i = 0,
j = 0,
temp = '',
repl = '',
sl = 0,
fl = 0,
f = [].concat(search),
r = [].concat(replace),
s = subject,
ra = Object.prototype.toString.call(r) === '[object Array]',
sa = Object.prototype.toString.call(s) === '[object Array]';
s = [].concat(s);
if (count) {
this.window[count] = 0;
}
for (i = 0, sl = s.length; i < sl; i++) {
if (s[i] === '') {
continue;
}
for (j = 0, fl = f.length; j < fl; j++) {
temp = s[i] + '';
repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0];
s[i] = (temp).split(f[j]).join(repl);
if (count && s[i] !== temp) {
this.window[count] += (temp.length - s[i].length) / f[j].length;
}
}
}
return sa ? s : s[0];
}
function rep(str,i){
str = String(str);
i = parseInt(i);
if (i > 0) {
var out = '';
for (var ii=1;ii<=i;ii++) out += str;
return out;
} else return '';
}
//-->
</script>
<style type=\"text/css\">
html {
width: 100%;
margin-left: 0 !important;
}
body {
font-family : Arial;
font-size: 14px;
font-weight : normal;
color: #".$fm_color['Text'].";
background-color: #".$fm_color['Bg'].";
}
table {
font-family : Arial;
font-size: 14px;
font-weight : normal;
color: #".$fm_color['Text'].";
cursor: default;
}
input {
font-family : Arial;
font-size: 14px;
font-weight : normal;
color: #".$fm_color['Text'].";
}
textarea {
font-family : Courier;
font-size: 12px;
font-weight : normal;
color: #".$fm_color['Text'].";
}
a {
font-family : Arial;
font-size : 14px;
font-weight : bold;
text-decoration: none;
color: #".$fm_color['Text'].";
}
a:link {
color: #".$fm_color['Text'].";
}
a:visited {
color: #".$fm_color['Text'].";
}
a:hover {
color: #".$fm_color['Link'].";
}
a:active {
color: #".$fm_color['Text'].";
}
tr.entryUnselected {
background-color: #".$fm_color['Entry'].";
}
tr.entryUnselected:hover {
background-color: #".$fm_color['Over'].";
}
tr.entrySelected {
background-color: #".$fm_color['Mark'].";
}
</style>
".$header."
";
}
function reloadframe($ref,$frame_number,$plus=""){
global $fm_current_dir,$fm_path_info;
echo "
<script language=\"Javascript\" type=\"text/javascript\">
<!--
".$ref.".frame".$frame_number.".location.href='".$fm_path_info['basename']."?frame=".$frame_number."&fm_current_dir=".rawurlencode($fm_current_dir.$plus)."';
//-->
</script>
";
}
function alert($arg){
echo "
<script language=\"Javascript\" type=\"text/javascript\">
<!--
alert('$arg');
//-->
</script>
";
}
define('UTF32_BIG_ENDIAN_BOM' , chr(0x00).chr(0x00).chr(0xFE).chr(0xFF));
define('UTF32_LITTLE_ENDIAN_BOM', chr(0xFF).chr(0xFE).chr(0x00).chr(0x00));
define('UTF16_BIG_ENDIAN_BOM' , chr(0xFE).chr(0xFF));
define('UTF16_LITTLE_ENDIAN_BOM', chr(0xFF).chr(0xFE));
define('UTF8_BOM' , chr(0xEF).chr(0xBB).chr(0xBF));
function get_encoding($text){
$first2 = mb_substr($text, 0, 2);
$first3 = mb_substr($text, 0, 3);
$first4 = mb_substr($text, 0, 4);
if ($first3 == UTF8_BOM) return 'UTF-8'; // WITH BOM
elseif ($first4 == UTF32_BIG_ENDIAN_BOM) return 'UTF-32BE';
elseif ($first4 == UTF32_LITTLE_ENDIAN_BOM) return 'UTF-32LE';
elseif ($first2 == UTF16_BIG_ENDIAN_BOM) return 'UTF-16BE';
elseif ($first2 == UTF16_LITTLE_ENDIAN_BOM) return 'UTF-16LE';
elseif (mb_detect_encoding($text, 'UTF-8', true) == true) return 'UTF-8'; // WITHOUT BOM
elseif (mb_detect_encoding($text, 'ISO-8859-1', true) == true) return 'ISO-8859-1';
else return mb_detect_encoding($text);
}
function utf8_convert($str){
if (extension_loaded('mbstring') && extension_loaded('iconv')) {
$str_chatset = get_encoding($str);
if ($str_chatset == "UTF-8") return $str;
return iconv($str_chatset, "UTF-8//TRANSLIT", $str);
} else return utf8_encode($str);
}
function convert_charset($str,$charset){
$str_chatset = get_encoding($str);
if ($str_chatset == $charset) return $str;
else return iconv($str_chatset, $charset."//TRANSLIT", $str);
}
function fs_encode($str){
global $is_windows;
if ($is_windows) {
if (extension_loaded('mbstring') && extension_loaded('iconv')) {
$str = convert_charset($str,'ISO-8859-1');
}
}
return $str;
}
class tree_fs {
protected $base = null;
public function __construct($base) {
$this->base = $this->real($base);
if(!$this->base) { fb_log('Base directory does not exist'); }
}
protected function real($path) {
if (is_link($path)) $temp = get_absolute_path(fs_encode($path));
else $temp = realpath(fs_encode($path));
if(!$temp) { fb_log('Path does not exist: ' . $path); }
if($this->base && strlen($this->base)) {
if(strpos($temp, $this->base) !== 0) { fb_log('Path is not inside base ('.$this->base.'): ' . $temp); }
}
return $temp;
}
protected function path($id) {
global $is_windows;
$path = str_replace('/', DIRECTORY_SEPARATOR, $id);
$path = $this->real($this->base.DIRECTORY_SEPARATOR.$path);
$path = rtrim($path, DIRECTORY_SEPARATOR);
if (!$is_windows) {
$path = DIRECTORY_SEPARATOR.$path;
}
$path = replace_double(DIRECTORY_SEPARATOR,$path);
//fb_log('path()',$id.' => '.$path);
return $path;
}
protected function id($path) {
global $is_windows;
$id = $this->real($path);
$id = substr($id, strlen($this->base));
$id = str_replace(DIRECTORY_SEPARATOR, '/', $id);
$id = '/'.rtrim($id, '/');
$id = replace_double('/',$id);
//fb_log('id()',$path.' => '.$id);
return $id;
}
public function lst($id, $with_root=false) {
$path = $this->path($id);
$lst = scandir(fs_encode($path));
if(!$lst) { fb_log('Could not list path: '.$path); }
$res = array();
foreach($lst as $item) {
if ($item == '.' || $item == '..' || $item === null) { continue; }
$item_path = rtrim($path,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.$item;
if (is_dir($item_path)) {
if (is_link($item_path)) $item .= ' (L)';
$res[] = array('text' => utf8_convert($item), 'children' => true, 'id' => utf8_convert($this->id($item_path)), 'icon' => 'folder');
} elseif (is_link($item_path) && !is_file($item_path)) {
// Add   Invisible char to change color to RED using Jquery https://stackoverflow.com/questions/17978720/invisible-characters-ascii
// TODO: Find a better way to show RED broken folder links, using jsTree API
if (is_link($item_path)) $item .= ' (L*)';
$res[] = array('text' => utf8_convert($item), 'children' => true, 'id' => utf8_convert($this->id($item_path)), 'icon' => 'folder');
}
}
if($with_root && $this->id($path) == '/') {
$res = array(array('text' => utf8_convert($this->base), 'children' => $res, 'id' => '/', 'icon'=>'folder', 'state' => array('opened' => true, 'disabled' => false)));
}
return $res;
}
public function data($id) {
if(strpos($id, ":")) {
$id = array_map(array($this, 'id'), explode(':', $id));
return array('type'=>'multiple', 'content'=> 'Multiple selected: ' . implode(' ', $id));
}
$path = $this->path($id);
if(is_dir($path)) {
return array('type'=>'folder', 'content'=> $id);
}
fb_log('Not a valid selection: '.$path);
}
}
function frame2(){
global $fm_root,$fm_current_root,$fm_path_info,$setflag,$is_windows,$cookie_cache_time,$fm_current_dir,$auth_pass,$open_basedirs;
if(isset($_GET['operation'])) {
$tree_fs = new tree_fs($fm_current_root);
try {
$resul = null;
switch($_GET['operation']) {
case 'get_node':
$node = (strlen($_GET['id']) && $_GET['id'] !== '#') ? $_GET['id'] : '/';
$with_root = true;
$resul = $tree_fs->lst($node, $with_root);
break;
default:
fb_log('Unsupported operation: '.$_GET['operation']);
break;
}
header('Content-Type: application/json; charset=utf-8');
echo json_encode($resul);
}
catch (Exception $e) {
header($_SERVER['SERVER_PROTOCOL'] . ' 500 Server Error');
header('Status: 500 Server Error');
echo $e->getMessage();
}
die();
}
html_header("
<script language=\"Javascript\" type=\"text/javascript\">
<!--
function saveFrameSize(){
if (getFrameSize()){
var exp = new Date();
exp.setTime(exp.getTime()+".$cookie_cache_time.");
setCookie('leftFrameWidth',frameWidth,exp);
}
}
window.onresize = saveFrameSize;
//-->
</script>");
echo "<body marginwidth=\"0\" marginheight=\"0\">
<script language=\"Javascript\" type=\"text/javascript\">
<!--
// Disable text selection, binding the onmousedown, but not for some elements, it must work.
function disableTextSelection(e){
var type = String(e.target.type);
return (type.indexOf('select') != -1 || type.indexOf('button') != -1 || type.indexOf('input') != -1 || type.indexOf('radio') != -1);
}
function enableTextSelection(){return true}
if (is.ie) document.onselectstart=new Function('return false')
else {
document.body.onmousedown=disableTextSelection
document.body.onclick=enableTextSelection
}
var flag = ".(($setflag)?"true":"false")."
function set_flag(arg) {
flag = arg;
}
function go_tree(arg) {
if (flag) {
parent.frame3.set_dir_dest(arg+'".addslashes(DIRECTORY_SEPARATOR)."');
flag = false;
} else {
parent.frame3.location.href='".addslashes($fm_path_info['basename'])."?frame=3&fm_current_root=".rawurlencode($fm_current_root)."&fm_current_dir='+encodeURIComponent(arg)+'".rawurlencode(DIRECTORY_SEPARATOR)."';
}
}
function set_fm_current_root(arg){
document.location.href='".addslashes($fm_path_info['basename'])."?frame=2&fm_current_root='+encodeURIComponent(arg);
}
function refresh_tree(){
document.location.href='".addslashes($fm_path_info['basename'])."?frame=2&fm_current_root=".rawurlencode($fm_current_root)."';
}
function logout(){
document.location.href='".addslashes($fm_path_info['basename'])."?action=1';
}
//-->
</script>
";
echo "<table width=\"100%\" height=\"100%\" border=0 cellspacing=0 cellpadding=5>\n";
echo "<tr valign=top height=10 bgcolor=\"#DDDDDD\" style=\"border-bottom: 2px solid #eaeaea;\"><td style=\"padding: 6px 6px 1px; 6px;\">";
echo "";
echo "";
echo "<tr valign=top>";
<script type="text/javascript" src=" echo $fm_path_info['basename']; ?action=99&filename=jquery-1.11.1.min.js"></script>
<script type="text/javascript" src=" echo $fm_path_info['basename']; ?action=99&filename=jstree.min.js"></script>
<link rel="stylesheet" type="text/css" href=" echo $fm_path_info['basename']; ?action=99&filename=jstree.style.min.css" media="screen" />
<style>
#tree { float:left; overflow:auto; padding:0; margin-bottom: 20px;}
#tree .folder { background:url(' echo $fm_path_info['basename']; ?action=99&filename=file_sprite.png') right bottom no-repeat; }
#tree .file { background:url(' echo $fm_path_info['basename']; ?action=99&filename=file_sprite.png') 0 0 no-repeat; }
#tree .file-pdf { background-position: -32px 0 }
#tree .file-as { background-position: -36px 0 }
#tree .file-c { background-position: -72px -0px }
#tree .file-iso { background-position: -108px -0px }
#tree .file-htm, #tree .file-html, #tree .file-xml, #tree .file-xsl { background-position: -126px -0px }
#tree .file-cf { background-position: -162px -0px }
#tree .file-cpp { background-position: -216px -0px }
#tree .file-cs { background-position: -236px -0px }
#tree .file-sql { background-position: -272px -0px }
#tree .file-xls, #tree .file-xlsx { background-position: -362px -0px }
#tree .file-h { background-position: -488px -0px }
#tree .file-crt, #tree .file-pem, #tree .file-cer { background-position: -452px -18px }
#tree .file-php { background-position: -108px -18px }
#tree .file-jpg, #tree .file-jpeg, #tree .file-png, #tree .file-gif, #tree .file-bmp { background-position: -126px -18px }
#tree .file-ppt, #tree .file-pptx { background-position: -144px -18px }
#tree .file-rb { background-position: -180px -18px }
#tree .file-text, #tree .file-txt, #tree .file-md, #tree .file-log, #tree .file-htaccess { background-position: -254px -18px }
#tree .file-doc, #tree .file-docx { background-position: -362px -18px }
#tree .file-zip, #tree .file-gz, #tree .file-tar, #tree .file-rar { background-position: -416px -18px }
#tree .file-js { background-position: -434px -18px }
#tree .file-css { background-position: -144px -0px }
#tree .file-fla { background-position: -398px -0px }
</style>
<div id="container" role="main">
<div id="tree"></div>
</div>
$tree_auto_load_nodes = substr($fm_current_dir,strlen($fm_current_root));
$tree_auto_load_nodes = trim($tree_auto_load_nodes,DIRECTORY_SEPARATOR);
$tree_auto_load_nodes = explode(DIRECTORY_SEPARATOR,$tree_auto_load_nodes);
<script>
var tree_loaded = false;
var tree_auto_load_nodes = echo json_encode($tree_auto_load_nodes); ;
var tree_auto_load_node_curr = 0;
//console.log(tree_auto_load_nodes);
function highlight_broken_links(){
$("#tree a:contains('(L*)')").css({'color':'red'});
var str = $("#tree a:contains('(L*)')").html();
$("#tree a:contains('(L*)')").html(String(str).replace('(L*)','(L)'));
}
function tree_auto_load(){
if (tree_auto_load_node_curr > tree_auto_load_nodes.length) return;
var node_id = '/'+tree_auto_load_nodes.slice(0, tree_auto_load_node_curr+1).join('/');
var node = $('#tree').find("[id='"+node_id+"']:eq(0)");
tree_auto_load_node_curr++;
//console.log('tree_auto_load() '+tree_auto_load_node_curr);
//console.log('node_id: '+node_id);
//console.log(node);
if (tree_auto_load_node_curr == tree_auto_load_nodes.length) {
if (node.length) {
$("#tree").jstree(true).open_node(node, function(){
highlight_broken_links();
$('#tree').jstree(true).select_node(node,true);
tree_loaded = true;
}, false);
} else {
tree_loaded = true;
}
} else {
if (node.length) {
$("#tree").jstree(true).open_node(node, tree_auto_load, false);
} else {
tree_auto_load();
}
}
highlight_broken_links();
}
$(function () {
$('#tree')
.jstree({
'core' : {
'data' : {
'url' : '?frame=2&fm_current_root= echo rawurlencode($fm_current_root) &operation=get_node',
'data' : function (node) {
return { 'id' : node.id };
}
},
'check_callback' : function(o, n, p, i, m) {
if(m && m.dnd && m.pos !== 'i') { return false; }
if(o === "move_node" || o === "copy_node") {
if(this.get_node(n).parent === this.get_node(p).id) { return false; }
}
return true;
},
'force_text' : true,
'themes' : {
'responsive' : false,
'variant' : 'small',
'stripes' : false
},
'expand_selected_onload' : true
},
'sort' : function(a, b) {
return this.get_type(a) === this.get_type(b) ? (this.get_text(a) > this.get_text(b) ? 1 : -1) : (this.get_type(a) >= this.get_type(b) ? 1 : -1);
},
'types' : {
'default' : { 'icon' : 'folder' },
'file' : { 'valid_children' : [], 'icon' : 'file' },
'broken_link': { 'icon' : 'folder' }
},
'unique' : {
'duplicate' : function (name, counter) {
return name + ' ' + counter;
}
},
'massload' : {
'url' : '?frame=2&fm_current_root= echo rawurlencode($fm_current_root) &operation=get_node',
'data' : function (nodes) {
return { 'ids' : nodes.join(',') };
}
},
'plugins' : ['sort','types','unique'] // 'state', 'massload'
})
//.on('changed.jstree', function (e, data) {
.on('select_node.jstree', function (e, data) {
if (!tree_loaded) return;
if (data && data.selected && data.selected.length) {
//console.log('select_node.jstree()');
var path = String(data.selected[0]);
path = path.replace(/\//g,' echo addslashes(DIRECTORY_SEPARATOR); ');
go_tree(' echo addslashes(rtrim($fm_current_root,DIRECTORY_SEPARATOR)); '+path);
}
})
.on('loaded.jstree', function (e, data) {
//console.log('loaded.jstree()');
//console.log(e);
//console.log(data);
tree_auto_load();
});
//$('#tree').jstree(true).clear_state();
});
</script>
echo " | ";
echo "\n";
echo "