This commit is contained in:
杜恒 2021-04-19 19:21:21 +08:00
parent 5f2fc632bb
commit 34d9e81c56

View File

@ -6,7 +6,8 @@ ini_set('display_startup_errors', 1);
error_reporting(E_ALL); error_reporting(E_ALL);
// config // config
class config { class config
{
// DEFAULT CONFIG // DEFAULT CONFIG
// Only edit directly if it is a temporary installation. Settings added here will be lost when updating! // Only edit directly if it is a temporary installation. Settings added here will be lost when updating!
@ -104,7 +105,8 @@ class config {
static $local_config_file = '_filesconfig.php'; static $local_config_file = '_filesconfig.php';
// get config // get config
private function get_config($path) { private function get_config($path)
{
if (empty($path) || !file_exists($path)) return array(); if (empty($path) || !file_exists($path)) return array();
$config = include $path; $config = include $path;
return empty($config) || !is_array($config) ? array() : array_map(function ($v) { return empty($config) || !is_array($config) ? array() : array_map(function ($v) {
@ -113,7 +115,8 @@ class config {
} }
// dump config // dump config
private function dump_config($local_config, $storage_path, $storage_config, $user_config, $user_valid){ private function dump_config($local_config, $storage_path, $storage_config, $user_config, $user_valid)
{
// invalid and duplicate arrays // invalid and duplicate arrays
$user_invalid = array_diff_key($user_config, self::$default); $user_invalid = array_diff_key($user_config, self::$default);
@ -150,7 +153,8 @@ class config {
//public static function helloWorld() { //public static function helloWorld() {
public static function save_config($config = array()){ public static function save_config($config = array())
{
$save_config = array_intersect_key(array_replace(self::$storage_config, $config), self::$default); $save_config = array_intersect_key(array_replace(self::$storage_config, $config), self::$default);
$export = preg_replace("/ '/", " //'", var_export(array_replace(self::$default, $save_config), true)); $export = preg_replace("/ '/", " //'", var_export(array_replace(self::$default, $save_config), true));
foreach ($save_config as $key => $value) if ($value !== self::$default[$key]) $export = str_replace("//'" . $key, "'" . $key, $export); foreach ($save_config as $key => $value) if ($value !== self::$default[$key]) $export = str_replace("//'" . $key, "'" . $key, $export);
@ -160,7 +164,8 @@ class config {
// construct // construct
function __construct($is_doc = false) { function __construct($is_doc = false)
{
// normalize OS paths // normalize OS paths
self::$__dir__ = real_path(__DIR__); self::$__dir__ = real_path(__DIR__);
@ -247,10 +252,12 @@ class config {
}; };
// login page // login page
function login_page($is_login_attempt, $sidx, $is_logout, $client_hash){ function login_page($is_login_attempt, $sidx, $is_logout, $client_hash)
{
?> ?>
<!doctype html> <!doctype html>
<html> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover, user-scalable=no, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover, user-scalable=no, shrink-to-fit=no">
@ -259,7 +266,10 @@ function login_page($is_login_attempt, $sidx, $is_logout, $client_hash){
<link href="<?php echo config::$assets ?>css/files.css" rel="stylesheet"> <link href="<?php echo config::$assets ?>css/files.css" rel="stylesheet">
<?php custom_script('css'); ?> <?php custom_script('css'); ?>
</head> </head>
<body><div id="files-login-container"></div></body>
<body>
<div id="files-login-container"></div>
</body>
<script> <script>
document.getElementById('files-login-container').innerHTML = '\ document.getElementById('files-login-container').innerHTML = '\
<h1 class="header mb-5">Login</h1>\ <h1 class="header mb-5">Login</h1>\
@ -282,15 +292,18 @@ function login_page($is_login_attempt, $sidx, $is_logout, $client_hash){
this.method = 'post'; this.method = 'post';
}, false); }, false);
</script> </script>
</html> </html>
<?php exit; // end form and exit <?php exit; // end form and exit
} }
// check login // check login
function check_login($is_doc){ function check_login($is_doc)
{
if ($is_doc) foreach (['username', 'password'] as $val) if (empty(config::$config[$val])) error($val . ' cannot be empty.'); if ($is_doc) foreach (['username', 'password'] as $val) if (empty(config::$config[$val])) error($val . ' cannot be empty.');
if (!session_start() && $is_doc) error('Failed to initiate PHP session_start();', 500); if (!session_start() && $is_doc) error('Failed to initiate PHP session_start();', 500);
function get_client_hash(){ function get_client_hash()
{
foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) { foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) {
if (isset($_SERVER[$key]) && !empty($_SERVER[$key]) && filter_var($_SERVER[$key], FILTER_VALIDATE_IP)) return md5($_SERVER[$key] . $_SERVER['HTTP_USER_AGENT'] . __FILE__ . $_SERVER['HTTP_HOST']); if (isset($_SERVER[$key]) && !empty($_SERVER[$key]) && filter_var($_SERVER[$key], FILTER_VALIDATE_IP)) return md5($_SERVER[$key] . $_SERVER['HTTP_USER_AGENT'] . __FILE__ . $_SERVER['HTTP_HOST']);
} }
@ -317,7 +330,8 @@ function check_login($is_doc){
$is_login_attempt = isset($_POST['fusername']) && isset($_POST['fpassword']) && isset($_POST['client_hash']) && isset($_POST['sidx']); $is_login_attempt = isset($_POST['fusername']) && isset($_POST['fpassword']) && isset($_POST['client_hash']) && isset($_POST['sidx']);
// correct login set $_SESSION['login'] // correct login set $_SESSION['login']
if($is_login_attempt && if (
$is_login_attempt &&
trim($_POST['fusername']) == config::$config['username'] && trim($_POST['fusername']) == config::$config['username'] &&
(phpversion() >= 5.5 && !password_needs_rehash(config::$config['password'], PASSWORD_DEFAULT) ? password_verify(trim($_POST['fpassword']), config::$config['password']) : (trim($_POST['fpassword']) == config::$config['password'])) && (phpversion() >= 5.5 && !password_needs_rehash(config::$config['password'], PASSWORD_DEFAULT) ? password_verify(trim($_POST['fpassword']), config::$config['password']) : (trim($_POST['fpassword']) == config::$config['password'])) &&
$_POST['client_hash'] === $client_hash && $_POST['client_hash'] === $client_hash &&
@ -333,7 +347,6 @@ function check_login($is_doc){
// not logged in (images or post API requests), don't show form. // not logged in (images or post API requests), don't show form.
} else if (post('action')) { } else if (post('action')) {
json_error('login'); json_error('login');
} else { } else {
error('You are not logged in.', 401); error('You are not logged in.', 401);
} }
@ -341,49 +354,62 @@ function check_login($is_doc){
} }
// //
function mkdir_or_error($path){ function mkdir_or_error($path)
{
if (!file_exists($path) && !mkdir($path, 0777, true)) error('Failed to create ' . $path, 500); if (!file_exists($path) && !mkdir($path, 0777, true)) error('Failed to create ' . $path, 500);
} }
function real_path($path){ function real_path($path)
{
$real_path = realpath($path); $real_path = realpath($path);
return $real_path ? str_replace('\\', '/', $real_path) : false; return $real_path ? str_replace('\\', '/', $real_path) : false;
} }
function root_relative($dir){ function root_relative($dir)
{
return ltrim(substr($dir, strlen(config::$root)), '\/'); return ltrim(substr($dir, strlen(config::$root)), '\/');
} }
function root_absolute($dir){ function root_absolute($dir)
{
return config::$root . ($dir ? '/' . $dir : ''); return config::$root . ($dir ? '/' . $dir : '');
} }
function is_within_path($path, $root){ function is_within_path($path, $root)
{
return strpos($path . '/', $root . '/') === 0; return strpos($path . '/', $root . '/') === 0;
} }
function is_within_root($path){ function is_within_root($path)
{
return is_within_path($path, config::$root); return is_within_path($path, config::$root);
} }
function is_within_docroot($path){ function is_within_docroot($path)
{
return is_within_path($path, config::$doc_root); return is_within_path($path, config::$doc_root);
} }
function get_folders_cache_path($name){ function get_folders_cache_path($name)
{
return config::$cache_path . '/folders/' . $name . '.json'; return config::$cache_path . '/folders/' . $name . '.json';
} }
function get_json_cache_url($name){ function get_json_cache_url($name)
{
$file = get_folders_cache_path($name); $file = get_folders_cache_path($name);
return file_exists($file) ? get_url_path($file) : false; return file_exists($file) ? get_url_path($file) : false;
} }
function get_dir_cache_path($dir, $mtime = false){ function get_dir_cache_path($dir, $mtime = false)
{
if (!config::$config['cache'] || !$dir) return; if (!config::$config['cache'] || !$dir) return;
return get_folders_cache_path(get_dir_cache_hash($dir, $mtime)); return get_folders_cache_path(get_dir_cache_hash($dir, $mtime));
} }
function get_dir_cache_hash($dir, $mtime = false){ function get_dir_cache_hash($dir, $mtime = false)
{
return config::$dirs_hash . '.' . substr(md5($dir), 0, 6) . '.' . ($mtime ?: filemtime($dir)); return config::$dirs_hash . '.' . substr(md5($dir), 0, 6) . '.' . ($mtime ?: filemtime($dir));
} }
function header_memory_time(){ function header_memory_time()
{
return (isset($_SERVER['REQUEST_TIME_FLOAT']) ? round(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'], 3) . 's, ' : '') . round(memory_get_peak_usage() / 1048576, 1) . 'M'; return (isset($_SERVER['REQUEST_TIME_FLOAT']) ? round(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'], 3) . 's, ' : '') . round(memory_get_peak_usage() / 1048576, 1) . 'M';
} }
// read file // read file
// todo: add files-date header // todo: add files-date header
function read_file($path, $mime = 'image/jpeg', $msg = false, $props = false, $cache_headers = false){ function read_file($path, $mime = 'image/jpeg', $msg = false, $props = false, $cache_headers = false)
{
if (!$path || !file_exists($path)) return false; if (!$path || !file_exists($path)) return false;
if ($mime == 'image/svg') $mime .= '+xml'; if ($mime == 'image/svg') $mime .= '+xml';
header('content-type: ' . $mime); header('content-type: ' . $mime);
@ -396,7 +422,8 @@ function read_file($path, $mime = 'image/jpeg', $msg = false, $props = false, $c
} }
// get mime // get mime
function get_mime($path){ function get_mime($path)
{
if (function_exists('mime_content_type')) { if (function_exists('mime_content_type')) {
return mime_content_type($path); return mime_content_type($path);
} else { } else {
@ -405,7 +432,8 @@ function get_mime($path){
} }
// set cache headers // set cache headers
function set_cache_headers(){ function set_cache_headers()
{
$seconds = 31536000; // 1 year; $seconds = 31536000; // 1 year;
header('expires: ' . gmdate('D, d M Y H:i:s', time() + $seconds) . ' GMT'); header('expires: ' . gmdate('D, d M Y H:i:s', time() + $seconds) . ' GMT');
header("cache-control: public, max-age=$seconds, s-maxage=$seconds, immutable"); header("cache-control: public, max-age=$seconds, s-maxage=$seconds, immutable");
@ -415,12 +443,14 @@ function set_cache_headers(){
} }
// get image cache path // get image cache path
function get_image_cache_path($path, $image_resize_dimensions, $filesize, $filemtime){ function get_image_cache_path($path, $image_resize_dimensions, $filesize, $filemtime)
{
return config::$cache_path . '/images/' . substr(md5($path), 0, 6) . '.' . $filesize . '.' . $filemtime . '.' . $image_resize_dimensions . '.jpg'; return config::$cache_path . '/images/' . substr(md5($path), 0, 6) . '.' . $filesize . '.' . $filemtime . '.' . $image_resize_dimensions . '.jpg';
} }
// is excluded // is excluded
function is_exclude($path = false, $is_dir = true, $symlinked = false){ function is_exclude($path = false, $is_dir = true, $symlinked = false)
{
// early exit // early exit
if (!$path || $path === config::$root) return; if (!$path || $path === config::$root) return;
@ -449,7 +479,8 @@ function is_exclude($path = false, $is_dir = true, $symlinked = false){
} }
// valid root path // valid root path
function valid_root_path($path, $is_dir = false){ function valid_root_path($path, $is_dir = false)
{
// invalid // invalid
if ($path === false) return; if ($path === false) return;
@ -481,7 +512,8 @@ function valid_root_path($path, $is_dir = false){
} }
// image create from // image create from
function image_create_from($path, $type){ function image_create_from($path, $type)
{
if (!$path || !$type) return; if (!$path || !$type) return;
if ($type === IMAGETYPE_JPEG) { if ($type === IMAGETYPE_JPEG) {
return imagecreatefromjpeg($path); return imagecreatefromjpeg($path);
@ -497,7 +529,8 @@ function image_create_from($path, $type){
} }
// get file (proxy or resize image) // get file (proxy or resize image)
function get_file($path, $resize = false){ function get_file($path, $resize = false)
{
// validate // validate
if (!$path) error('Invalid file request.', 404); if (!$path) error('Invalid file request.', 404);
@ -530,7 +563,8 @@ function get_file($path, $resize = false){
} }
// sharpen resized image // sharpen resized image
function sharpen_image($image){ function sharpen_image($image)
{
$matrix = array( $matrix = array(
array(-1, -1, -1), array(-1, -1, -1),
array(-1, 20, -1), array(-1, 20, -1),
@ -543,7 +577,8 @@ function sharpen_image($image){
// exif orientation // exif orientation
// https://github.com/gumlet/php-image-resize/blob/master/lib/ImageResize.php // https://github.com/gumlet/php-image-resize/blob/master/lib/ImageResize.php
function exif_orientation($orientation, &$image){ function exif_orientation($orientation, &$image)
{
if (empty($orientation) || !is_numeric($orientation) || $orientation < 3 || $orientation > 8) return; if (empty($orientation) || !is_numeric($orientation) || $orientation < 3 || $orientation > 8) return;
$image = imagerotate($image, array(6 => 270, 5 => 270, 3 => 180, 4 => 180, 8 => 90, 7 => 90)[$orientation], null); $image = imagerotate($image, array(6 => 270, 5 => 270, 3 => 180, 4 => 180, 8 => 90, 7 => 90)[$orientation], null);
if (in_array($orientation, array(5, 4, 7)) && function_exists('imageflip')) imageflip($image, IMG_FLIP_HORIZONTAL); if (in_array($orientation, array(5, 4, 7)) && function_exists('imageflip')) imageflip($image, IMG_FLIP_HORIZONTAL);
@ -551,7 +586,8 @@ function exif_orientation($orientation, &$image){
} }
// resize image // resize image
function resize_image($path, $resize_dimensions){ function resize_image($path, $resize_dimensions)
{
// file size // file size
$file_size = filesize($path); $file_size = filesize($path);
@ -644,7 +680,8 @@ function resize_image($path, $resize_dimensions){
// https://www.bitrepository.com/resize-an-image-keeping-its-aspect-ratio-using-php-and-gd.html // https://www.bitrepository.com/resize-an-image-keeping-its-aspect-ratio-using-php-and-gd.html
} }
function get_url_path($dir){ function get_url_path($dir)
{
if (!is_within_docroot($dir)) return false; if (!is_within_docroot($dir)) return false;
// if in __dir__ path, __dir__ relative // if in __dir__ path, __dir__ relative
@ -655,7 +692,8 @@ function get_url_path($dir){
} }
// get dir // get dir
function get_dir($path, $files = false, $json_url = false){ function get_dir($path, $files = false, $json_url = false)
{
// realpath // realpath
$realpath = $path ? real_path($path) : false; $realpath = $path ? real_path($path) : false;
@ -700,7 +738,8 @@ function get_dir($path, $files = false, $json_url = false){
} }
// get menu sort // get menu sort
function get_menu_sort($dirs){ function get_menu_sort($dirs)
{
if (strpos(config::$config['menu_sort'], 'date') === 0) { if (strpos(config::$config['menu_sort'], 'date') === 0) {
usort($dirs, function ($a, $b) { usort($dirs, function ($a, $b) {
return filemtime($a) - filemtime($b); return filemtime($a) - filemtime($b);
@ -715,7 +754,8 @@ function get_menu_sort($dirs){
} }
// recursive directory scan // recursive directory scan
function get_dirs($path = false, &$arr = array(), $depth = 0) { function get_dirs($path = false, &$arr = array(), $depth = 0)
{
// get this dir (ignore root, unless load all ... root already loaded into page) // get this dir (ignore root, unless load all ... root already loaded into page)
if ($depth || config::$config['menu_load_all']) { if ($depth || config::$config['menu_load_all']) {
@ -742,12 +782,14 @@ function get_dirs($path = false, &$arr = array(), $depth = 0) {
return $arr; return $arr;
} }
function safe_iptc_tag($val, $max_str = 1000){ function safe_iptc_tag($val, $max_str = 1000)
{
$val = @substr($val, 0, $max_str); $val = @substr($val, 0, $max_str);
return @mb_detect_encoding($val, 'UTF-8', true) ? $val : @utf8_encode($val); return @mb_detect_encoding($val, 'UTF-8', true) ? $val : @utf8_encode($val);
} }
function get_iptc($image_info){ function get_iptc($image_info)
{
if (!$image_info || !isset($image_info['APP13']) || !function_exists('iptcparse')) return; if (!$image_info || !isset($image_info['APP13']) || !function_exists('iptcparse')) return;
$app13 = @iptcparse($image_info['APP13']); $app13 = @iptcparse($image_info['APP13']);
if (empty($app13)) return; if (empty($app13)) return;
@ -770,7 +812,8 @@ function get_iptc($image_info){
} }
// get exif // get exif
function get_exif($path){ function get_exif($path)
{
if (!function_exists('exif_read_data')) return; if (!function_exists('exif_read_data')) return;
$exif_data = @exif_read_data($path, 'ANY_TAG', 0); // @exif_read_data($path); $exif_data = @exif_read_data($path, 'ANY_TAG', 0); // @exif_read_data($path);
if (empty($exif_data) || !is_array($exif_data)) return; if (empty($exif_data) || !is_array($exif_data)) return;
@ -799,7 +842,8 @@ function get_exif($path){
return $exif; return $exif;
} }
function get_image_location($exif){ function get_image_location($exif)
{
$arr = array('GPSLatitudeRef', 'GPSLatitude', 'GPSLongitudeRef', 'GPSLongitude'); $arr = array('GPSLatitudeRef', 'GPSLatitude', 'GPSLongitudeRef', 'GPSLongitude');
foreach ($arr as $val) { foreach ($arr as $val) {
if (!isset($exif[$val])) return false; if (!isset($exif[$val])) return false;
@ -827,7 +871,8 @@ function get_image_location($exif){
return array($latitude, $longitude); return array($latitude, $longitude);
} }
function gps2Num($coordPart){ function gps2Num($coordPart)
{
$parts = explode('/', $coordPart); $parts = explode('/', $coordPart);
if (count($parts) <= 0) if (count($parts) <= 0)
return 0; return 0;
@ -837,7 +882,8 @@ function gps2Num($coordPart){
} }
// //
function get_files_data($dir, $url_path = false, &$dirsize = 0, &$files_count = 0, &$images_count = 0){ function get_files_data($dir, $url_path = false, &$dirsize = 0, &$files_count = 0, &$images_count = 0)
{
// scandir // scandir
$filenames = scandir($dir, SCANDIR_SORT_NONE); $filenames = scandir($dir, SCANDIR_SORT_NONE);
@ -1003,7 +1049,8 @@ function get_files_data($dir, $url_path = false, &$dirsize = 0, &$files_count =
} }
// get files // get files
function get_files($dir){ function get_files($dir)
{
// invalid $dir // invalid $dir
if (!$dir) json_error('Invalid directory'); if (!$dir) json_error('Invalid directory');
@ -1018,28 +1065,34 @@ function get_files($dir){
} }
/* start here */ /* start here */
function post($param){ function post($param)
{
return isset($_POST[$param]) && !empty($_POST[$param]) ? $_POST[$param] : false; return isset($_POST[$param]) && !empty($_POST[$param]) ? $_POST[$param] : false;
} }
function get($param){ function get($param)
{
return isset($_GET[$param]) && !empty($_GET[$param]) ? $_GET[$param] : false; return isset($_GET[$param]) && !empty($_GET[$param]) ? $_GET[$param] : false;
} }
function json_cache($arr = array(), $msg = false, $cache = true){ function json_cache($arr = array(), $msg = false, $cache = true)
{
header('content-type: application/json'); header('content-type: application/json');
$json = empty($arr) ? '{}' : json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); $json = empty($arr) ? '{}' : json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
if ($cache) @file_put_contents($cache, $json); if ($cache) @file_put_contents($cache, $json);
if ($msg) header('files-msg: ' . $msg . ' [' . header_memory_time() . ']'); if ($msg) header('files-msg: ' . $msg . ' [' . header_memory_time() . ']');
echo $json; echo $json;
} }
function json_error($error = 'Error'){ function json_error($error = 'Error')
{
header('Content-Type: application/json'); header('Content-Type: application/json');
exit('{"error":"' . $error . '"}'); exit('{"error":"' . $error . '"}');
} }
function json_success($success){ function json_success($success)
{
header('Content-Type: application/json'); header('Content-Type: application/json');
exit('{"success":"' . $success . '"}'); exit('{"success":"' . $success . '"}');
} }
function error($msg, $code = false){ function error($msg, $code = false)
{
// 400 Bad Request, 403 Forbidden, 401 Unauthorized, 404 Not Found, 500 Internal Server Error // 400 Bad Request, 403 Forbidden, 401 Unauthorized, 404 Not Found, 500 Internal Server Error
if ($code) http_response_code($code); if ($code) http_response_code($code);
header('content-type: text/html'); header('content-type: text/html');
@ -1051,7 +1104,8 @@ function error($msg, $code = false){
} }
// get valid menu cache // get valid menu cache
function get_valid_menu_cache($cache){ function get_valid_menu_cache($cache)
{
if (!$cache || !file_exists($cache)) return; if (!$cache || !file_exists($cache)) return;
$json = @file_get_contents($cache); $json = @file_get_contents($cache);
if (empty($json)) return; if (empty($json)) return;
@ -1066,7 +1120,8 @@ function get_valid_menu_cache($cache){
} }
// get root dirs // get root dirs
function get_root_dirs(){ function get_root_dirs()
{
$root_dirs = glob(config::$root . '/*', GLOB_ONLYDIR | GLOB_NOSORT); $root_dirs = glob(config::$root . '/*', GLOB_ONLYDIR | GLOB_NOSORT);
if (empty($root_dirs)) return array(); if (empty($root_dirs)) return array();
return array_filter($root_dirs, function ($dir) { return array_filter($root_dirs, function ($dir) {
@ -1075,20 +1130,23 @@ function get_root_dirs(){
} }
// get menu cache hash // get menu cache hash
function get_menu_cache_hash($root_dirs){ function get_menu_cache_hash($root_dirs)
{
$mtime_count = filemtime(config::$root); $mtime_count = filemtime(config::$root);
foreach ($root_dirs as $root_dir) $mtime_count += filemtime($root_dir); foreach ($root_dirs as $root_dir) $mtime_count += filemtime($root_dir);
return substr(md5(config::$doc_root . config::$__dir__ . config::$root), 0, 6) . '.' . substr(md5(config::$version . config::$config['cache_key'] . config::$config['menu_max_depth'] . config::$config['menu_load_all'] . (config::$config['menu_load_all'] ? config::$config['files_exclude'] . config::$image_resize_cache_direct : '') . config::$has_login . config::$config['dirs_exclude'] . config::$config['menu_sort']), 0, 6) . '.' . $mtime_count; return substr(md5(config::$doc_root . config::$__dir__ . config::$root), 0, 6) . '.' . substr(md5(config::$version . config::$config['cache_key'] . config::$config['menu_max_depth'] . config::$config['menu_load_all'] . (config::$config['menu_load_all'] ? config::$config['files_exclude'] . config::$image_resize_cache_direct : '') . config::$has_login . config::$config['dirs_exclude'] . config::$config['menu_sort']), 0, 6) . '.' . $mtime_count;
} }
// get dirs // get dirs
function dirs(){ function dirs()
{
// get menu_cache_hash // get menu_cache_hash
if (config::$config['cache']) { if (config::$config['cache']) {
$menu_cache_hash = post('menu_cache_hash'); // get menu cache hash $menu_cache_hash = post('menu_cache_hash'); // get menu cache hash
$menu_cache_arr = $menu_cache_hash ? explode('.', $menu_cache_hash) : false; $menu_cache_arr = $menu_cache_hash ? explode('.', $menu_cache_hash) : false;
if(!$menu_cache_arr || if (
!$menu_cache_arr ||
count($menu_cache_arr) !== 3 || count($menu_cache_arr) !== 3 ||
strlen($menu_cache_arr[0]) !== 6 || strlen($menu_cache_arr[0]) !== 6 ||
strlen($menu_cache_arr[1]) !== 6 || strlen($menu_cache_arr[1]) !== 6 ||
@ -1111,7 +1169,8 @@ function dirs(){
} }
// custom_script (css + js in storage) // custom_script (css + js in storage)
function custom_script($type){ function custom_script($type)
{
// todo maybe just use one file custom.css/js for easy edit? // todo maybe just use one file custom.css/js for easy edit?
if (!config::$storage_path || !config::$storage_is_within_doc_root) return; if (!config::$storage_path || !config::$storage_is_within_doc_root) return;
$dir = config::$storage_path . '/' . $type; $dir = config::$storage_path . '/' . $type;
@ -1125,9 +1184,11 @@ function custom_script($type){
if (post('action')) { if (post('action')) {
// basic post access security: XMLHttpRequest + post_hash created from server paths // basic post access security: XMLHttpRequest + post_hash created from server paths
if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || if (
!isset($_SERVER['HTTP_X_REQUESTED_WITH']) ||
$_SERVER['HTTP_X_REQUESTED_WITH'] !== 'XMLHttpRequest' || $_SERVER['HTTP_X_REQUESTED_WITH'] !== 'XMLHttpRequest' ||
post('post_hash') !== md5(__FILE__ . $_SERVER['HTTP_HOST'])) json_error('Invalid request hash. Please Refresh browser.'); post('post_hash') !== md5(__FILE__ . $_SERVER['HTTP_HOST'])
) json_error('Invalid request hash. Please Refresh browser.');
// post action // post action
$action = post('action'); $action = post('action');
@ -1183,7 +1244,6 @@ if(post('action')){
exit('{"success":' . ($is_new ? '"' . $latest . '"' : 'false') . ($is_new ? ',"writeable":' . (is_writable(__DIR__) && is_writable(__FILE__) ? 'true' : 'false') : '') . '}'); exit('{"success":' . ($is_new ? '"' . $latest . '"' : 'false') . ($is_new ? ',"writeable":' . (is_writable(__DIR__) && is_writable(__FILE__) ? 'true' : 'false') : '') . '}');
} }
exit('{"error": true }'); exit('{"error": true }');
} else if ($action === 'do_update') { } else if ($action === 'do_update') {
header('Content-Type: application/json'); header('Content-Type: application/json');
$version = post('version'); $version = post('version');
@ -1193,7 +1253,6 @@ if(post('action')){
$get = $writeable ? @file_get_contents($file) : false; $get = $writeable ? @file_get_contents($file) : false;
$put = $get && strpos($get, '<?php') === 0 && substr($get, -2) === '?>' && @file_put_contents(__FILE__, $get); $put = $get && strpos($get, '<?php') === 0 && substr($get, -2) === '?>' && @file_put_contents(__FILE__, $get);
exit('{"success":' . ($put ? 'true' : 'false') . '}'); exit('{"success":' . ($put ? 'true' : 'false') . '}');
} else if ($action === 'license') { } else if ($action === 'license') {
header('Content-Type: application/json'); header('Content-Type: application/json');
$key = isset($_POST['key']) ? trim($_POST['key']) : false; $key = isset($_POST['key']) ? trim($_POST['key']) : false;
@ -1294,7 +1353,8 @@ $query_path_valid = $query_path ? valid_root_path($query_path, true) : false;
$init_path = $query_path ?: $start_path ?: ''; $init_path = $query_path ?: $start_path ?: '';
// init dirs, with files if cache // init dirs, with files if cache
function get_dir_init($dir){ function get_dir_init($dir)
{
$cache = get_dir_cache_path($dir); $cache = get_dir_cache_path($dir);
if (file_exists($cache)) return json_decode(file_get_contents($cache), true); if (file_exists($cache)) return json_decode(file_get_contents($cache), true);
return get_dir($dir); return get_dir($dir);
@ -1354,6 +1414,7 @@ header('files-msg: [' . header_memory_time() . ']');
?> ?>
<!doctype html> <!doctype html>
<html<?php echo ' class="menu-' . ($menu_enabled ? 'enabled' : 'disabled sidebar-closed') . '"'; ?>> <html<?php echo ' class="menu-' . ($menu_enabled ? 'enabled' : 'disabled sidebar-closed') . '"'; ?>>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
@ -1432,7 +1493,9 @@ var CodeMirror = {};
<script src="<?php echo config::$assets ?>js/files.js"></script> <script src="<?php echo config::$assets ?>js/files.js"></script>
</body> </body>
</html> </html>
<?php }} <?php }
}
// htmlend // htmlend
?> ?>