Gold Star Driving School website loading gif
Aerial view of city traffic on a multi-lane road with digital highlights around vehicles, representing smart or connected car technology

Privacy Policy

<?php
//Default Configuration
$CONFIG = '{"lang":"en","error_reporting":false,"show_hidden":false,"hide_Cols":false,"theme":"light"}';

/**
* H3K - Tiny File Manager V2.6
* @author CCP Programmers
* @github https://github.com/prasathmani/tinyfilemanager
* @link https://tinyfilemanager.github.io
*/

//TFM version
define('VERSION', '2.6');

//Application Title
define('APP_TITLE', 'Tiny File Manager');

// --- EDIT BELOW CONFIGURATION CAREFULLY ---

// Auth with login/password
// set true/false to enable/disable it
// Is independent from IP white- and blacklisting
$use_auth = true;

// Login user name and password
// Users: array('Username' => 'Password', 'Username2' => 'Password2', ...)
// Generate secure password hash - https://tinyfilemanager.github.io/docs/pwd.html
$auth_users = array(
   'emperor' => '$2y$10$VFgCz3UkXhE1LUextDix4.z8EAATMaZTmFvy3EyB4QqA0JtEeKrAK', //admin@123
   'user' => '$2y$10$Fg6Dz8oH9fPoZ2jJan5tZuv6Z4Kp7avtQ9bDfrdRntXtPeiMAZyGO' //12345
);

// Readonly users
// e.g. array('users', 'guest', ...)
$readonly_users = array(
   'user'
);

// Global readonly, including when auth is not being used
$global_readonly = false;

// user specific directories
// array('Username' => 'Directory path', 'Username2' => 'Directory path', ...)
$directories_users = array();

// 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'
//make sure update $root_url in next section
$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
// $_SERVER['HTTP_HOST'].'/folder'
$http_host = $_SERVER['HTTP_HOST'];

// 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 = 'm/d/Y g:i A';

// Path display mode when viewing file information
// 'full' => show full path
// 'relative' => show path relative to root_path
// 'host' => show path on the host
$path_display_mode = 'full';

// 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
// Available 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 = 5000000000; // size 5,000,000,000 bytes (~5GB)

// chunk size used for upload
// eg. decrease to 1MB if nginx reports problem 413 entity too large
$upload_chunk_size_bytes = 2000000; // chunk size 2,000,000 bytes (~2MB)

// 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 external config file, try to use it to override the default config above [config.php]
// sample config - https://tinyfilemanager.github.io/config-sample.txt
$config_file = __DIR__ . '/config.php';
if (is_readable($config_file)) {
   @include($config_file);
}

// External CDN resources that can be used in the HTML (replace for GDPR compliance)
$external = array(
   'css-bootstrap' => '<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">',
   'css-dropzone' => '<link href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.css" rel="stylesheet">',
   'css-font-awesome' => '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" crossorigin="anonymous">',
   'css-highlightjs' => '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/' . $highlightjs_style . '.min.css">',
   'js-ace' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.32.2/ace.js"></script>',
   'js-bootstrap' => '<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>',
   'js-dropzone' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.js"></script>',
   'js-jquery' => '<script src="https://code.jquery.com/jquery-3.6.1.min.js" integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" crossorigin="anonymous"></script>',
   'js-jquery-datatables' => '<script src="https://cdn.datatables.net/1.13.1/js/jquery.dataTables.min.js" crossorigin="anonymous" defer></script>',
   'js-highlightjs' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>',
   'pre-jsdelivr' => '<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin/><link rel="dns-prefetch" href="https://cdn.jsdelivr.net"/>',
   'pre-cloudflare' => '<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin/><link rel="dns-prefetch" href="https://cdnjs.cloudflare.com"/>'
);

// --- EDIT BELOW CAREFULLY OR DO NOT EDIT AT ALL ---

// max upload file size
define('MAX_UPLOAD_SIZE', $max_upload_size_bytes);

// upload chunk size
define('UPLOAD_CHUNK_SIZE', $upload_chunk_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;

// 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('nocache'); // Prevent logout issue after page was cached
   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();
}

//Generating CSRF Token
if (empty($_SESSION['token'])) {
   if (function_exists('random_bytes')) {
       $_SESSION['token'] = bin2hex(random_bytes(32));
   } else {
       $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32));
   }
}

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']);
   unset($_SESSION['token']);
   fm_redirect(FM_SELF_URL);
}

// Validate connection IP
if ($ip_ruleset != 'OFF') {
   function getClientIP()
   {
       if (array_key_exists('HTTP_CF_CONNECTING_IP', $_SERVER)) {
           return  $_SERVER["HTTP_CF_CONNECTING_IP"];
       } else if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
           return  $_SERVER["HTTP_X_FORWARDED_FOR"];
       } else if (array_key_exists('REMOTE_ADDR', $_SERVER)) {
           return $_SERVER['REMOTE_ADDR'];
       } else if (array_key_exists('HTTP_CLIENT_IP', $_SERVER)) {
           return $_SERVER['HTTP_CLIENT_IP'];
       }
       return '';
   }

   $clientIp = getClientIP();
   $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();
   }
}

// Checking if the user is logged in or not. If not, it will show the login form.
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'], $_POST['token'])) {
       // 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']]) && verifyToken($_POST['token'])) {
               $_SESSION[FM_SESSION_ID]['logged'] = $_POST['fm_usr'];
               fm_set_msg(lng('You are logged in'));
               fm_redirect(FM_SELF_URL);
           } 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();
?>
       <section class="h-100">
           <div class="container h-100">
               <div class="row justify-content-md-center align-content-center h-100vh">
                   <div class="card-wrapper">
                       <div class="card fat" data-bs-theme="<?php echo FM_THEME; ?>">
                           <div class="card-body">
                               <form class="form-signin" action="" method="post" autocomplete="off">
                                   <div class="mb-3">
                                       <div class="brand">
                                           <svg version="1.0" xmlns="http://www.w3.org/2000/svg" M1008 width="100%" height="80px" viewBox="0 0 238.000000 140.000000" aria-label="H3K Tiny File Manager">
                                               <g transform="translate(0.000000,140.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none">
                                                   <path d="M160 700 l0 -600 110 0 110 0 0 260 0 260 70 0 70 0 0 -260 0 -260 110 0 110 0 0 600 0 600 -110 0 -110 0 0 -260 0 -260 -70 0 -70 0 0 260 0 260 -110 0 -110 0 0 -600z" />
                                                   <path fill="#003500" d="M1008 1227 l-108 -72 0 -117 0 -118 110 0 110 0 0 110 0 110 70 0 70 0 0 -180 0 -180 -125 0 c-69 0 -125 -3 -125 -6 0 -3 23 -39 52 -80 l52 -74 73 0 73 0 0 -185 0 -185 -70 0 -70 0 0 115 0 115 -110 0 -110 0 0 -190 0 -190 181 0 181 0 109 73 108 72 1 181 0 181 -69 48 -68 49 68 50 69 49 0 249 0 248 -182 -1 -183 0 -107 -72z" />
                                                   <path d="M1640 700 l0 -600 110 0 110 0 0 208 0 208 35 34 35 34 35 -34 35 -34 0 -208 0 -208 110 0 110 0 0 212 0 213 -87 87 -88 88 88 88 87 87 0 213 0 212 -110 0 -110 0 0 -208 0 -208 -70 -69 -70 -69 0 277 0 277 -110 0 -110 0 0 -600z" />
                                               </g>
                                           </svg>
                                       </div>
                                       <div class="text-center">
                                           <h1 class="card-title"><?php echo APP_TITLE; ?></h1>
                                       </div>
                                   </div>
                                   <hr />
                                   <div class="mb-3">
                                       <label for="fm_usr" class="pb-2"><?php echo lng('Username'); ?></label>
                                       <input type="text" class="form-control" id="fm_usr" name="fm_usr" required autofocus>
                                   </div>

                                   <div class="mb-3">
                                       <label for="fm_pwd" class="pb-2"><?php echo lng('Password'); ?></label>
                                       <input type="password" class="form-control" id="fm_pwd" name="fm_pwd" required>
                                   </div>

                                   <div class="mb-3">
                                       <?php fm_show_message(); ?>
                                   </div>
                                   <input type="hidden" name="token" value="<?php echo htmlentities($_SESSION['token']); ?>" />
                                   <div class="mb-3">
                                       <button type="submit" class="btn btn-success btn-block w-100 mt-4" role="button">
                                           <?php echo lng('Login'); ?>
                                       </button>
                                   </div>
                               </form>
                           </div>
                       </div>
                       <div class="footer text-center">
                           &mdash;&mdash; &copy;
                           <a href="https://tinyfilemanager.github.io/" target="_blank" class="text-decoration-none text-muted" data-version="<?php echo VERSION; ?>">CCP Programmers</a> &mdash;&mdash;
                       </div>
                   </div>
               </div>
           </div>
       </section>

   <?php
       fm_show_footer_login();
       exit;
   }
}

// update root path
if ($use_auth && isset($_SESSION[FM_SESSION_ID]['logged'])) {
   $root_path = isset($directories_users[$_SESSION[FM_SESSION_ID]['logged']]) ? $directories_users[$_SESSION[FM_SESSION_ID]['logged']] : $root_path;
}

// clean and check $root_path
$root_path = rtrim($root_path, '\\/');
$root_path = str_replace('\\', '/', $root_path);
if (!@is_dir($root_path)) {
   echo "<h1>" . lng('Root path') . " \"{$root_path}\" " . lng('not found!') . " </h1>";
   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', $global_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 ***************************/

// Handle all AJAX Request
if ((isset($_SESSION[FM_SESSION_ID]['logged'], $auth_users[$_SESSION[FM_SESSION_ID]['logged']]) || !FM_USE_AUTH) && isset($_POST['ajax'], $_POST['token']) && !FM_READONLY) {
   if (!verifyToken($_POST['token'])) {
       header('HTTP/1.0 401 Unauthorized');
       die("Invalid Token.");
   }

   //search : get list of files from the current folder
   if (isset($_POST['type']) && $_POST['type'] == "search") {
       $dir = $_POST['path'] == "." ? '' : $_POST['path'];
       $response = scan(fm_clean_path($dir), $_POST['content']);
       echo json_encode($response);
       exit();
   }

   // save editor file
   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_PATH = FM_PATH;
           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);
   }

   // backup files
   if (isset($_POST['type']) && $_POST['type'] == "backup" && !empty($_POST['file'])) {
       $fileName = fm_clean_path($_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, $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;
       $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['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(urldecode(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, strtok(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'], $_POST['token']) && !FM_READONLY) {
   $del = str_replace('/', '', fm_clean_path($_GET['del']));
   if ($del != '' && $del != '..' && $del != '.' && verifyToken($_POST['token'])) {
       $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') . ' <b>%s</b> ' . lng('Deleted') : lng('File') . ' <b>%s</b> ' . lng('Deleted');
           fm_set_msg(sprintf($msg, fm_enc($del)));
       } else {
           $msg = $is_dir ? lng('Folder') . ' <b>%s</b> ' . lng('not deleted') : lng('File') . ' <b>%s</b> ' . lng('not deleted');
           fm_set_msg(sprintf($msg, fm_enc($del)), 'error');
       }
   } else {
       fm_set_msg(lng('Invalid file or folder name'), 'error');
   }
   $FM_PATH = FM_PATH;
   fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Create a new file/folder
if (isset($_POST['newfilename'], $_POST['newfile'], $_POST['token']) && !FM_READONLY) {
   $type = urldecode($_POST['newfile']);
   $new = str_replace('/', '', fm_clean_path(strip_tags($_POST['newfilename'])));
   if (fm_isvalid_filename($new) && $new != '' && $new != '..' && $new != '.' && verifyToken($_POST['token'])) {
       $path = FM_ROOT_PATH;
       if (FM_PATH != '') {
           $path .= '/' . FM_PATH;
       }
       if ($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') . ' <b>%s</b> ' . lng('Created'), fm_enc($new)));
               } else {
                   fm_set_msg(lng('File extension is not allowed'), 'error');
               }
           } else {
               fm_set_msg(sprintf(lng('File') . ' <b>%s</b> ' . lng('already exists'), fm_enc($new)), 'alert');
           }
       } else {
           if (fm_mkdir($path . '/' . $new, false) === true) {
               fm_set_msg(sprintf(lng('Folder') . ' <b>%s</b> ' . lng('Created'), $new));
           } elseif (fm_mkdir($path . '/' . $new, false) === $path . '/' . $new) {
               fm_set_msg(sprintf(lng('Folder') . ' <b>%s</b> ' . lng('already exists'), fm_enc($new)), 'alert');
           } else {
               fm_set_msg(sprintf(lng('Folder') . ' <b>%s</b> ' . lng('not created'), fm_enc($new)), 'error');
           }
       }
   } else {
       fm_set_msg(lng('Invalid characters in file or folder name'), 'error');
   }
   $FM_PATH = FM_PATH;
   fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Copy folder / file
if (isset($_GET['copy'], $_GET['finish']) && !FM_READONLY) {
   // from
   $copy = urldecode($_GET['copy']);
   $copy = fm_clean_path($copy);
   // empty path
   if ($copy == '') {
       fm_set_msg(lng('Source path not defined'), 'error');
       $FM_PATH = FM_PATH;
       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']);
   $move = fm_clean_path(urldecode($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') . ' <b>%s</b> ' . lng('to') . ' <b>%s</b>', 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') . ' <b>%s</b> ' . lng('to') . ' <b>%s</b>', 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') . ' <b>%s</b> ' . lng('to') . ' <b>%s</b>', fm_enc($copy), fm_enc($msg_from)));
           } else {
               fm_set_msg(sprintf(lng('Error while copying from') . ' <b>%s</b> ' . lng('to') . ' <b>%s</b>', 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('Copied from <b>%s</b> to <b>%s</b>', fm_enc($copy), fm_enc($fn_duplicate)));
           } else {
               fm_set_msg(sprintf('Error while copying from <b>%s</b> to <b>%s</b>', fm_enc($copy), fm_enc($fn_duplicate)), 'error');
           }
       } else {
           fm_set_msg(lng('Paths must be not equal'), 'alert');
       }
   }
   $FM_PATH = FM_PATH;
   fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Mass copy files/ folders
if (isset($_POST['file'], $_POST['copy_to'], $_POST['finish'], $_POST['token']) && !FM_READONLY) {

   if (!verifyToken($_POST['token'])) {
       fm_set_msg(lng('Invalid Token.'), 'error');
   }

   // 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_PATH = FM_PATH;
       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_PATH = FM_PATH;
           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 != '') {
               $f = fm_clean_path($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_PATH = FM_PATH;
   fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Rename
if (isset($_POST['rename_from'], $_POST['rename_to'], $_POST['token']) && !FM_READONLY) {
   if (!verifyToken($_POST['token'])) {
       fm_set_msg("Invalid Token.", 'error');
   }
   // old name
   $old = urldecode($_POST['rename_from']);
   $old = fm_clean_path($old);
   $old = str_replace('/', '', $old);
   // new name
   $new = urldecode($_POST['rename_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') . ' <b>%s</b> ' . lng('to') . ' <b>%s</b>', fm_enc($old), fm_enc($new)));
       } else {
           fm_set_msg(sprintf(lng('Error while renaming from') . ' <b>%s</b> ' . lng('to') . ' <b>%s</b>', fm_enc($old), fm_enc($new)), 'error');
       }
   } else {
       fm_set_msg(lng('Invalid characters in file name'), 'error');
   }
   $FM_PATH = FM_PATH;
   fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Download
if (isset($_GET['dl'], $_POST['token'])) {
   // Verify the token to ensure it's valid
   if (!verifyToken($_POST['token'])) {
       fm_set_msg("Invalid Token.", 'error');
       exit;
   }

   // Clean the download file path
   $dl = urldecode($_GET['dl']);
   $dl = fm_clean_path($dl);
   $dl = str_replace('/', '', $dl); // Prevent directory traversal attacks

   // Define the file path
   $path = FM_ROOT_PATH;
   if (FM_PATH != '') {
       $path .= '/' . FM_PATH;
   }

   // Check if the file exists and is valid
   if ($dl != '' && is_file($path . '/' . $dl)) {
       // Close the session to prevent session locking
       if (session_status() === PHP_SESSION_ACTIVE) {
           session_write_close();
       }

       // Call the download function
       fm_download_file($path . '/' . $dl, $dl, 1024); // Download with a buffer size of 1024 bytes
       exit;
   } else {
       // Handle the case where the file is not found
       fm_set_msg(lng('File not found'), 'error');
       $FM_PATH = FM_PATH;
       fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
   }
}

// Upload
if (!empty($_FILES) && !FM_READONLY) {
   if (isset($_POST['token'])) {
       if (!verifyToken($_POST['token'])) {
           $response = array('status' => 'error', 'info' => "Invalid Token.");
           echo json_encode($response);
           exit();
       }
   } else {
       $response = array('status' => 'error', 'info' => "Token Missing.");
       echo json_encode($response);
       exit();
   }

   $chunkIndex = $_POST['dzchunkindex'];
   $chunkTotal = $_POST['dztotalchunkcount'];
   $fullPathInput = fm_clean_path($_REQUEST['fullpath']);

   $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 = pathinfo($filename, PATHINFO_FILENAME) != '' ? strtolower(pathinfo($filename, PATHINFO_EXTENSION)) : '';
   $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;

   if (!fm_isvalid_filename($filename) && !fm_isvalid_filename($fullPathInput)) {
       $response = array(
           'status'    => 'error',
           'info'      => "Invalid File name!",
       );
       echo json_encode($response);
       exit();
   }

   $targetPath = $path . $ds;
   if (is_writable($targetPath)) {
       $fullPath = $path . '/' . $fullPathInput;
       $folder = substr($fullPath, 0, strrpos($fullPath, "/"));

       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 ($chunkTotal) {
               $out = @fopen("{$fullPath}.part", $chunkIndex == 0 ? "wb" : "ab");
               if ($out) {
                   $in = @fopen($tmp_name, "rb");
                   if ($in) {
                       if (PHP_VERSION_ID < 80009) {
                           // workaround https://bugs.php.net/bug.php?id=81145
                           do {
                               for (;;) {
                                   $buff = fread($in, 4096);
                                   if ($buff === false || $buff === '') {
                                       break;
                                   }
                                   fwrite($out, $buff);
                               }
                           } while (!feof($in));
                       } else {
                           stream_copy_to_stream($in, $out);
                       }
                       $response = array(
                           'status'    => 'success',
                           'info' => "file upload successful"
                       );
                   } else {
                       $response = array(
                           'status'    => 'error',
                           'info' => "failed to open output stream",
                           'errorDetails' => error_get_last()
                       );
                   }
                   @fclose($in);
                   @fclose($out);
                   @unlink($tmp_name);

                   $response = array(
                       'status'    => 'success',
                       'info' => "file upload successful"
                   );
               } else {
                   $response = array(
                       'status'    => 'error',
                       'info' => "failed to open output stream"
                   );
               }

               if ($chunkIndex == $chunkTotal - 1) {
                   if (file_exists($fullPath)) {
                       $ext_1 = $ext ? '.' . $ext : '';
                       $fullPathTarget = $path . '/' . basename($fullPathInput, $ext_1) . '_' . date('ymdHis') . $ext_1;
                   } else {
                       $fullPathTarget = $fullPath;