2017-11-03 21:57:44 +01:00
< ? php
2018-11-26 19:17:58 +01:00
//Default Configuration
$CONFIG = '{"lang":"en","error_reporting":true,"show_hidden":true}' ;
2017-07-05 08:50:07 +02:00
/**
2018-11-26 19:17:58 +01:00
* H3K | Tiny File Manager V2 . 2.0
2018-10-10 19:27:25 +02:00
* CCP Programmers | ccpprogrammers @ gmail . com
2018-11-05 14:26:35 +01:00
* https :// tinyfilemanager . github . io
2017-07-05 08:50:07 +02:00
*/
// Auth with login/password (set true/false to enable/disable it)
$use_auth = true ;
2018-10-10 19:27:25 +02:00
// Users: array('Username' => 'Password', 'Username2' => 'Password2', ...)
2018-11-05 14:26:35 +01:00
// Generate secure password hash - https://tinyfilemanager.github.io/docs/pwd.html
2017-07-05 08:50:07 +02:00
$auth_users = array (
2018-11-26 19:17:58 +01:00
'admin' => '$2y$10$/K.hjNr84lLNDt8fTXjoI.DBp6PpeyoJ.mGwrrLuCZfAwfSAGqhOW' , //admin@123
2018-10-27 18:36:48 +02:00
'user' => '$2y$10$Fg6Dz8oH9fPoZ2jJan5tZuv6Z4Kp7avtQ9bDfrdRntXtPeiMAZyGO' //12345
2017-07-05 08:50:07 +02:00
);
2018-11-05 14:26:35 +01:00
// Readonly users (username array)
2017-07-05 08:50:07 +02:00
$readonly_users = array (
'user'
);
2018-11-05 14:26:35 +01:00
// user specific directories
// array('Username' => 'Directory path', 'Username2' => 'Directory path', ...)
2018-09-21 12:06:25 +02:00
$directories_users = array ();
2017-07-05 08:50:07 +02:00
// Enable highlight.js (https://highlightjs.org/) on view's page
$use_highlightjs = true ;
// highlight.js style
$highlightjs_style = 'vs' ;
// Enable ace.js (https://ace.c9.io/) on view's page
$edit_files = true ;
// Default timezone for date() and time() - http://php.net/manual/en/timezones.php
2017-10-14 07:33:43 +02:00
$default_timezone = 'Etc/UTC' ; // UTC
2017-07-05 08:50:07 +02:00
// Root path for file manager
$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' ];
// input encoding for iconv
2017-10-14 07:33:43 +02:00
$iconv_input_encoding = 'UTF-8' ;
2017-07-05 08:50:07 +02:00
2017-07-27 11:12:07 +02:00
// date() format for file modification date
$datetime_format = 'd.m.y H:i' ;
2018-11-14 12:37:16 +01:00
// allowed file extensions for upload and rename
$allowed_extensions = '' ; // 'gif,png,jpg'
2017-11-15 07:58:34 +01:00
2018-11-05 14:26:35 +01:00
// Array of files and folders excluded from listing
2018-10-18 11:03:22 +02:00
$GLOBALS [ 'exclude_items' ] = array ();
2017-12-14 09:33:26 +01:00
2018-11-05 14:26:35 +01:00
// Google Docs Viewer
2018-11-02 13:18:54 +01:00
$GLOBALS [ 'online_viewer' ] = true ;
2018-12-22 10:21:06 +01:00
//Sticky Nav bar
$sticky_navbar = true ;
2018-12-13 19:32:25 +01:00
// private key and session name to store to the session
if ( ! defined ( 'FM_SESSION_ID' )) {
define ( 'FM_SESSION_ID' , 'filemanager' );
}
2018-11-08 12:10:58 +01:00
2018-11-26 19:17:58 +01:00
//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 ;
//available languages
$lang_list = array (
'en' => 'English' ,
2018-12-01 04:13:24 +01:00
'fr' => 'Français' ,
2018-12-02 10:19:04 +01:00
'it' => 'Italiano' ,
'ru' => 'Russian'
2018-11-26 19:17:58 +01:00
);
2017-10-14 07:33:43 +02:00
2017-07-05 08:50:07 +02:00
//--- EDIT BELOW CAREFULLY OR DO NOT EDIT AT ALL
2018-11-14 12:37:16 +01:00
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 );
}
2018-12-25 14:12:58 +01:00
// Show Memory Used
function fm_memory ( $size ) {
$unit = array ( 'Byte' , 'KB' , 'MB' , 'GB' , 'TB' , 'PB' );
return @ round ( $size / pow ( 1024 , ( $i = floor ( log ( $size , 1024 )))), 2 ) . ' ' . $unit [ $i ];
}
2018-12-25 14:32:03 +01:00
$memory = fm_memory ( memory_get_usage ( true ));
2018-12-25 14:12:58 +01:00
// Set Cookie
2018-11-26 19:17:58 +01:00
setcookie ( 'fm_cache' , true , 2147483647 , " / " );
2018-11-19 19:10:23 +01:00
2017-07-05 08:50:07 +02:00
// if fm included
if ( defined ( 'FM_EMBED' )) {
$use_auth = false ;
2018-12-22 10:21:06 +01:00
$sticky_navbar = false ;
2017-07-05 08:50:07 +02:00
} 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 ( '' );
2018-12-13 19:32:25 +01:00
session_name ( FM_SESSION_ID );
2018-11-26 19:17:58 +01:00
@ session_start ();
2017-07-05 08:50:07 +02:00
}
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' ;
// 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' ])) {
2018-12-13 19:32:25 +01:00
unset ( $_SESSION [ FM_SESSION_ID ][ 'logged' ]);
2017-07-05 08:50:07 +02:00
fm_redirect ( FM_SELF_URL );
}
// Show image here
if ( isset ( $_GET [ 'img' ])) {
fm_show_image ( $_GET [ 'img' ]);
}
// Auth
if ( $use_auth ) {
2018-12-13 19:32:25 +01:00
if ( isset ( $_SESSION [ FM_SESSION_ID ][ 'logged' ], $auth_users [ $_SESSION [ FM_SESSION_ID ][ 'logged' ]])) {
2017-07-05 08:50:07 +02:00
// Logged
} elseif ( isset ( $_POST [ 'fm_usr' ], $_POST [ 'fm_pwd' ])) {
// Logging In
sleep ( 1 );
2018-12-01 04:13:24 +01:00
if ( function_exists ( 'password_verify' )) {
2018-11-26 19:17:58 +01:00
if ( isset ( $auth_users [ $_POST [ 'fm_usr' ]]) && isset ( $_POST [ 'fm_pwd' ]) && password_verify ( $_POST [ 'fm_pwd' ], $auth_users [ $_POST [ 'fm_usr' ]])) {
2018-12-13 19:32:25 +01:00
$_SESSION [ FM_SESSION_ID ][ 'logged' ] = $_POST [ 'fm_usr' ];
2018-11-26 19:17:58 +01:00
fm_set_msg ( 'You are logged in' );
fm_redirect ( FM_SELF_URL . '?p=' );
} else {
2018-12-13 19:32:25 +01:00
unset ( $_SESSION [ FM_SESSION_ID ][ 'logged' ]);
2018-11-26 19:17:58 +01:00
fm_set_msg ( 'Login failed. Invalid username or password' , 'error' );
fm_redirect ( FM_SELF_URL );
}
2017-07-05 08:50:07 +02:00
} else {
2018-11-26 19:17:58 +01:00
fm_set_msg ( 'password_hash not supported, Upgrade PHP version' , 'error' );;
2017-07-05 08:50:07 +02:00
}
} else {
// Form
2018-12-13 19:32:25 +01:00
unset ( $_SESSION [ FM_SESSION_ID ][ 'logged' ]);
2017-11-06 12:48:05 +01:00
fm_show_header_login ();
2017-07-05 08:50:07 +02:00
fm_show_message ();
?>
2018-11-14 12:37:16 +01:00
< section class = " h-100 " >
< div class = " container h-100 " >
< div class = " row justify-content-md-center h-100 " >
< div class = " card-wrapper " >
< div class = " brand " >
2018-11-26 19:17:58 +01:00
< svg version = " 1.0 " xmlns = " http://www.w3.org/2000/svg " M1008 width = " 100% " height = " 121px " 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 >
2018-11-14 12:37:16 +01:00
</ div >
< div class = " text-center " >
2018-11-26 19:17:58 +01:00
< h1 class = " card-title " >< ? php echo lng ( 'AppName' ); ?> </h1>
2018-11-14 12:37:16 +01:00
</ div >
< div class = " card fat " >
< div class = " card-body " >
< form class = " form-signin " action = " " method = " post " autocomplete = " off " >
< div class = " form-group " >
2018-11-26 19:17:58 +01:00
< label for = " fm_usr " >< ? php echo lng ( 'Username' ); ?> </label>
2018-11-14 12:37:16 +01:00
< input type = " text " class = " form-control " id = " fm_usr " name = " fm_usr " required autofocus >
</ div >
< div class = " form-group " >
2018-11-26 19:17:58 +01:00
< label for = " fm_pwd " >< ? php echo lng ( 'Password' ); ?> </label>
2018-11-14 12:37:16 +01:00
< input type = " password " class = " form-control " id = " fm_pwd " name = " fm_pwd " required >
</ div >
< div class = " form-group " >
< div class = " custom-checkbox custom-control " >
< input type = " checkbox " name = " remember " id = " remember " class = " custom-control-input " >
2018-11-26 19:17:58 +01:00
< label for = " remember " class = " custom-control-label " >< ? php echo lng ( 'RememberMe' ); ?> </label>
2018-11-14 12:37:16 +01:00
</ div >
</ div >
2018-11-26 19:17:58 +01:00
< div class = " form-group " >
2018-11-14 12:37:16 +01:00
< button type = " submit " class = " btn btn-success btn-block " role = " button " >
2018-11-26 19:17:58 +01:00
< ? php echo lng ( 'Login' ); ?>
2018-11-14 12:37:16 +01:00
</ button >
</ div >
</ form >
</ div >
</ div >
< div class = " footer text-center " >
2018-11-26 19:17:58 +01:00
& mdash ; & mdash ; & copy ;
< ? php if ( ! isset ( $_COOKIE [ 'fm_cache' ])) { ?> <img src="https://logs-01.loggly.com/inputs/d8bad570-def7-44d4-922c-a8680d936ae6.gif?s=1" /> <?php } ?>
< a href = " https://tinyfilemanager.github.io/ " target = " _blank " class = " text-muted " > CCP Programmers </ a > & mdash ; & mdash ;
2018-11-14 12:37:16 +01:00
</ div >
</ div >
2018-10-10 19:27:25 +02:00
</ div >
2018-11-14 12:37:16 +01:00
</ div >
</ section >
2017-07-05 08:50:07 +02:00
< ? php
2017-11-06 12:48:05 +01:00
fm_show_footer_login ();
2017-07-05 08:50:07 +02:00
exit ;
}
}
2018-11-05 14:26:35 +01:00
// update root path
2018-12-13 19:32:25 +01:00
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 ;
2018-09-21 12:06:25 +02:00
}
// clean and check $root_path
$root_path = rtrim ( $root_path , '\\/' );
$root_path = str_replace ( '\\' , '/' , $root_path );
if ( !@ is_dir ( $root_path )) {
echo " <h1>Root path \" { $root_path } \" 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 );
2017-07-05 08:50:07 +02:00
defined ( 'FM_LANG' ) || define ( 'FM_LANG' , $lang );
2018-11-14 12:37:16 +01:00
defined ( 'FM_EXTENSION' ) || define ( 'FM_EXTENSION' , $allowed_extensions );
2018-12-13 19:32:25 +01:00
define ( 'FM_READONLY' , $use_auth && ! empty ( $readonly_users ) && isset ( $_SESSION [ FM_SESSION_ID ][ 'logged' ]) && in_array ( $_SESSION [ FM_SESSION_ID ][ 'logged' ], $readonly_users ));
2017-07-05 08:50:07 +02:00
define ( 'FM_IS_WIN' , DIRECTORY_SEPARATOR == '\\' );
// always use ?p=
2018-04-08 12:23:22 +02:00
if ( ! isset ( $_GET [ 'p' ]) && empty ( $_FILES )) {
2017-07-05 08:50:07 +02:00
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 );
// instead globals vars
define ( 'FM_PATH' , $p );
define ( 'FM_USE_AUTH' , $use_auth );
2017-11-06 12:48:05 +01:00
define ( 'FM_EDIT_FILE' , $edit_files );
2017-07-27 11:12:07 +02:00
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 );
2017-07-05 08:50:07 +02:00
unset ( $p , $use_auth , $iconv_input_encoding , $use_highlightjs , $highlightjs_style );
/*************************** ACTIONS ***************************/
2018-11-05 14:26:35 +01:00
// AJAX Request
2017-07-07 12:29:04 +02:00
if ( isset ( $_POST [ 'ajax' ]) && ! FM_READONLY ) {
2018-11-05 14:26:35 +01:00
// backup files
2018-10-10 19:27:25 +02:00
if ( isset ( $_POST [ 'type' ]) && $_POST [ 'type' ] == " backup " ) {
2017-07-07 12:29:04 +02:00
$file = $_POST [ 'file' ];
$path = $_POST [ 'path' ];
$date = date ( " dMy-His " );
2018-10-10 19:27:25 +02:00
$newFile = $file . '-' . $date . '.bak' ;
copy ( $path . '/' . $file , $path . '/' . $newFile ) or die ( " Unable to backup " );
2017-07-07 12:29:04 +02:00
echo " Backup $newFile Created " ;
}
2018-11-26 19:17:58 +01:00
// Save Config
if ( isset ( $_POST [ 'type' ]) && $_POST [ 'type' ] == " settings " ) {
global $cfg , $lang , $report_errors , $show_hidden_files , $lang_list ;
$newLng = $_POST [ 'js-language' ];
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 ;
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 ;
}
$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 ;
}
2018-12-12 20:08:16 +01:00
//upload using url
if ( isset ( $_POST [ 'type' ]) && $_POST [ 'type' ] == " upload " && ! empty ( $_REQUEST [ " uploadurl " ])) {
$path = FM_ROOT_PATH ;
if ( FM_PATH != '' ) {
$path .= '/' . FM_PATH ;
}
$url = ! empty ( $_REQUEST [ " uploadurl " ]) && preg_match ( " |^http(s)?://.+ $ | " , stripslashes ( $_REQUEST [ " uploadurl " ])) ? stripslashes ( $_REQUEST [ " uploadurl " ]) : null ;
2018-12-13 19:32:25 +01:00
$use_curl = false ;
2018-12-12 20:08:16 +01:00
$temp_file = tempnam ( sys_get_temp_dir (), " upload- " );
$fileinfo = new stdClass ();
$fileinfo -> name = trim ( basename ( $url ), " . \x00 .. \x20 " );
function event_callback ( $message ) {
global $callback ;
echo json_encode ( $message );
}
function get_file_path () {
global $path , $fileinfo , $temp_file ;
return $path . " / " . basename ( $fileinfo -> name );
}
$err = false ;
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 ));
}
}
2018-11-14 12:37:16 +01:00
exit ();
2017-07-07 12:29:04 +02:00
}
2017-07-05 08:50:07 +02:00
// Delete file / folder
if ( isset ( $_GET [ 'del' ]) && ! FM_READONLY ) {
2018-12-13 19:32:25 +01:00
$del = str_replace ( '/' , '' , fm_clean_path ( $_GET [ 'del' ] ) );
2017-07-05 08:50:07 +02:00
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 )) {
2017-07-27 11:12:07 +02:00
$msg = $is_dir ? 'Folder <b>%s</b> deleted' : 'File <b>%s</b> deleted' ;
2017-12-13 09:23:51 +01:00
fm_set_msg ( sprintf ( $msg , fm_enc ( $del )));
2017-07-05 08:50:07 +02:00
} else {
2017-07-27 11:12:07 +02:00
$msg = $is_dir ? 'Folder <b>%s</b> not deleted' : 'File <b>%s</b> not deleted' ;
2017-12-13 09:23:51 +01:00
fm_set_msg ( sprintf ( $msg , fm_enc ( $del )), 'error' );
2017-07-05 08:50:07 +02:00
}
} else {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Wrong file or folder name' , 'error' );
2017-07-05 08:50:07 +02:00
}
fm_redirect ( FM_SELF_URL . '?p=' . urlencode ( FM_PATH ));
}
// Create folder
2017-07-05 15:50:26 +02:00
if ( isset ( $_GET [ 'new' ]) && isset ( $_GET [ 'type' ]) && ! FM_READONLY ) {
$type = $_GET [ 'type' ];
2018-12-13 19:32:25 +01:00
$new = str_replace ( '/' , '' , fm_clean_path ( strip_tags ( $_GET [ 'new' ] ) ) );
2017-07-05 08:50:07 +02:00
if ( $new != '' && $new != '..' && $new != '.' ) {
$path = FM_ROOT_PATH ;
if ( FM_PATH != '' ) {
$path .= '/' . FM_PATH ;
}
2018-10-10 19:27:25 +02:00
if ( $_GET [ 'type' ] == " file " ) {
if ( ! file_exists ( $path . '/' . $new )) {
@ fopen ( $path . '/' . $new , 'w' ) or die ( 'Cannot open file: ' . $new );
2017-12-13 09:23:51 +01:00
fm_set_msg ( sprintf ( 'File <b>%s</b> created' , fm_enc ( $new )));
2017-07-05 15:50:26 +02:00
} else {
2017-12-13 09:23:51 +01:00
fm_set_msg ( sprintf ( 'File <b>%s</b> already exists' , fm_enc ( $new )), 'alert' );
2017-07-05 15:50:26 +02:00
}
2017-07-05 08:50:07 +02:00
} else {
2017-07-05 15:50:26 +02:00
if ( fm_mkdir ( $path . '/' . $new , false ) === true ) {
2017-11-03 21:57:44 +01:00
fm_set_msg ( sprintf ( 'Folder <b>%s</b> created' , $new ));
2017-07-05 15:50:26 +02:00
} elseif ( fm_mkdir ( $path . '/' . $new , false ) === $path . '/' . $new ) {
2017-12-13 09:23:51 +01:00
fm_set_msg ( sprintf ( 'Folder <b>%s</b> already exists' , fm_enc ( $new )), 'alert' );
2017-07-05 15:50:26 +02:00
} else {
2017-12-13 09:23:51 +01:00
fm_set_msg ( sprintf ( 'Folder <b>%s</b> not created' , fm_enc ( $new )), 'error' );
2017-07-05 15:50:26 +02:00
}
2017-07-05 08:50:07 +02:00
}
} else {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Wrong folder name' , 'error' );
2017-07-05 08:50:07 +02:00
}
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 == '' ) {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Source path not defined' , 'error' );
2017-07-05 08:50:07 +02:00
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
if ( $from != $dest ) {
$msg_from = trim ( FM_PATH . '/' . basename ( $from ), '/' );
if ( $move ) {
$rename = fm_rename ( $from , $dest );
if ( $rename ) {
2017-12-13 09:23:51 +01:00
fm_set_msg ( sprintf ( 'Moved from <b>%s</b> to <b>%s</b>' , fm_enc ( $copy ), fm_enc ( $msg_from )));
2017-07-05 08:50:07 +02:00
} elseif ( $rename === null ) {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'File or folder with this path already exists' , 'alert' );
2017-07-05 08:50:07 +02:00
} else {
2017-12-13 09:23:51 +01:00
fm_set_msg ( sprintf ( 'Error while moving from <b>%s</b> to <b>%s</b>' , fm_enc ( $copy ), fm_enc ( $msg_from )), 'error' );
2017-07-05 08:50:07 +02:00
}
} else {
if ( fm_rcopy ( $from , $dest )) {
2017-12-13 09:23:51 +01:00
fm_set_msg ( sprintf ( 'Copyied from <b>%s</b> to <b>%s</b>' , fm_enc ( $copy ), fm_enc ( $msg_from )));
2017-07-05 08:50:07 +02:00
} else {
2017-12-13 09:23:51 +01:00
fm_set_msg ( sprintf ( 'Error while copying from <b>%s</b> to <b>%s</b>' , fm_enc ( $copy ), fm_enc ( $msg_from )), 'error' );
2017-07-05 08:50:07 +02:00
}
}
} else {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Paths must be not equal' , 'alert' );
2017-07-05 08:50:07 +02:00
}
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 ) {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Paths must be not equal' , 'alert' );
2017-07-05 08:50:07 +02:00
fm_redirect ( FM_SELF_URL . '?p=' . urlencode ( FM_PATH ));
}
if ( ! is_dir ( $copy_to_path )) {
if ( ! fm_mkdir ( $copy_to_path , true )) {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Unable to create destination folder' , 'error' );
2017-07-05 08:50:07 +02:00
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 ) {
2017-07-27 11:12:07 +02:00
$msg = $move ? 'Selected files and folders moved' : 'Selected files and folders copied' ;
2017-07-05 08:50:07 +02:00
fm_set_msg ( $msg );
} else {
2017-07-27 11:12:07 +02:00
$msg = $move ? 'Error while moving items' : 'Error while copying items' ;
2017-07-05 08:50:07 +02:00
fm_set_msg ( $msg , 'error' );
}
} else {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Nothing selected' , 'alert' );
2017-07-05 08:50:07 +02:00
}
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 ( $new );
$new = str_replace ( '/' , '' , $new );
// path
$path = FM_ROOT_PATH ;
if ( FM_PATH != '' ) {
$path .= '/' . FM_PATH ;
}
// rename
if ( $old != '' && $new != '' ) {
if ( fm_rename ( $path . '/' . $old , $path . '/' . $new )) {
2017-12-13 09:23:51 +01:00
fm_set_msg ( sprintf ( 'Renamed from <b>%s</b> to <b>%s</b>' , fm_enc ( $old ), fm_enc ( $new )));
2017-07-05 08:50:07 +02:00
} else {
2017-12-13 09:23:51 +01:00
fm_set_msg ( sprintf ( 'Error while renaming from <b>%s</b> to <b>%s</b>' , fm_enc ( $old ), fm_enc ( $new )), 'error' );
2017-07-05 08:50:07 +02:00
}
} else {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Names not set' , 'error' );
2017-07-05 08:50:07 +02:00
}
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 )) {
header ( 'Content-Description: File Transfer' );
header ( 'Content-Type: application/octet-stream' );
header ( 'Content-Disposition: attachment; filename="' . basename ( $path . '/' . $dl ) . '"' );
header ( 'Content-Transfer-Encoding: binary' );
header ( 'Connection: Keep-Alive' );
header ( 'Expires: 0' );
header ( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
header ( 'Pragma: public' );
header ( 'Content-Length: ' . filesize ( $path . '/' . $dl ));
readfile ( $path . '/' . $dl );
exit ;
} else {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'File not found' , 'error' );
2017-07-05 08:50:07 +02:00
fm_redirect ( FM_SELF_URL . '?p=' . urlencode ( FM_PATH ));
}
}
// Upload
2018-04-08 12:23:22 +02:00
if ( ! empty ( $_FILES ) && ! FM_READONLY ) {
$f = $_FILES ;
2017-07-05 08:50:07 +02:00
$path = FM_ROOT_PATH ;
2018-08-24 14:31:58 +02:00
$ds = DIRECTORY_SEPARATOR ;
2017-07-05 08:50:07 +02:00
if ( FM_PATH != '' ) {
$path .= '/' . FM_PATH ;
}
$errors = 0 ;
$uploads = 0 ;
2018-04-08 12:23:22 +02:00
$total = count ( $f [ 'file' ][ 'name' ]);
$allowed = ( FM_EXTENSION ) ? explode ( ',' , FM_EXTENSION ) : false ;
2017-07-05 08:50:07 +02:00
2018-04-08 12:23:22 +02:00
$filename = $f [ 'file' ][ 'name' ];
$tmp_name = $f [ 'file' ][ 'tmp_name' ];
$ext = pathinfo ( $filename , PATHINFO_EXTENSION );
$isFileAllowed = ( $allowed ) ? in_array ( $ext , $allowed ) : true ;
2018-08-24 14:31:58 +02:00
$targetPath = $path . $ds ;
2018-10-10 19:27:25 +02:00
$fullPath = $path . '/' . $_REQUEST [ 'fullpath' ];
2018-08-24 14:31:58 +02:00
$folder = substr ( $fullPath , 0 , strrpos ( $fullPath , " / " ));
if ( ! is_dir ( $folder )) {
$old = umask ( 0 );
mkdir ( $folder , 0777 , true );
umask ( $old );
}
2018-04-08 12:23:22 +02:00
if ( empty ( $f [ 'file' ][ 'error' ]) && ! empty ( $tmp_name ) && $tmp_name != 'none' && $isFileAllowed ) {
2018-08-24 14:31:58 +02:00
if ( move_uploaded_file ( $tmp_name , $fullPath )) {
2018-04-08 12:23:22 +02:00
die ( 'Successfully uploaded' );
} else {
die ( sprintf ( 'Error while uploading files. Uploaded files: %s' , $uploads ));
}
2017-07-05 08:50:07 +02:00
}
2018-04-08 12:23:22 +02:00
exit ();
2017-07-05 08:50:07 +02:00
}
// 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 ) {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Selected files and folder deleted' );
2017-07-05 08:50:07 +02:00
} else {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Error while deleting items' , 'error' );
2017-07-05 08:50:07 +02:00
}
} else {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Nothing selected' , 'alert' );
2017-07-05 08:50:07 +02:00
}
fm_redirect ( FM_SELF_URL . '?p=' . urlencode ( FM_PATH ));
}
// Pack files
2018-11-14 12:37:16 +01:00
if ( isset ( $_POST [ 'group' ]) && ( isset ( $_POST [ 'zip' ]) || isset ( $_POST [ 'tar' ])) && ! FM_READONLY ) {
2017-07-05 08:50:07 +02:00
$path = FM_ROOT_PATH ;
2018-11-14 12:37:16 +01:00
$ext = 'zip' ;
2017-07-05 08:50:07 +02:00
if ( FM_PATH != '' ) {
$path .= '/' . FM_PATH ;
}
2018-11-14 12:37:16 +01:00
//set pack type
$ext = isset ( $_POST [ 'tar' ]) ? 'tar' : 'zip' ;
if (( $ext == " zip " && ! class_exists ( 'ZipArchive' )) || ( $ext == " tar " && ! class_exists ( 'PharData' ))) {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Operations with archives are not available' , 'error' );
2017-07-05 08:50:07 +02:00
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 );
2018-11-14 12:37:16 +01:00
$zipname = $one_file . '_' . date ( 'ymd_His' ) . '.' . $ext ;
2017-07-05 08:50:07 +02:00
} else {
2018-11-14 12:37:16 +01:00
$zipname = 'archive_' . date ( 'ymd_His' ) . '.' . $ext ;
2017-07-05 08:50:07 +02:00
}
2018-11-14 12:37:16 +01:00
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 );
}
2017-07-05 08:50:07 +02:00
if ( $res ) {
2017-12-13 09:23:51 +01:00
fm_set_msg ( sprintf ( 'Archive <b>%s</b> created' , fm_enc ( $zipname )));
2017-07-05 08:50:07 +02:00
} else {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Archive not created' , 'error' );
2017-07-05 08:50:07 +02:00
}
} else {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Nothing selected' , 'alert' );
2017-07-05 08:50:07 +02:00
}
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 );
2018-11-14 12:37:16 +01:00
$isValid = false ;
2017-07-05 08:50:07 +02:00
$path = FM_ROOT_PATH ;
if ( FM_PATH != '' ) {
$path .= '/' . FM_PATH ;
}
2018-11-14 12:37:16 +01:00
if ( $unzip != '' && is_file ( $path . '/' . $unzip )) {
$zip_path = $path . '/' . $unzip ;
$ext = pathinfo ( $zip_path , PATHINFO_EXTENSION );
$isValid = true ;
} else {
fm_set_msg ( 'File not found' , 'error' );
}
if (( $ext == " zip " && ! class_exists ( 'ZipArchive' )) || ( $ext == " tar " && ! class_exists ( 'PharData' ))) {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Operations with archives are not available' , 'error' );
2017-07-05 08:50:07 +02:00
fm_redirect ( FM_SELF_URL . '?p=' . urlencode ( FM_PATH ));
}
2018-11-14 12:37:16 +01:00
if ( $isValid ) {
2017-07-05 08:50:07 +02:00
//to folder
$tofolder = '' ;
if ( isset ( $_GET [ 'tofolder' ])) {
$tofolder = pathinfo ( $zip_path , PATHINFO_FILENAME );
if ( fm_mkdir ( $path . '/' . $tofolder , true )) {
$path .= '/' . $tofolder ;
}
}
2018-11-14 12:37:16 +01:00
if ( $ext == " zip " ) {
$zipper = new FM_Zipper ();
$res = $zipper -> unzip ( $zip_path , $path );
} elseif ( $ext == " tar " ) {
$gzipper = new PharData ( $zip_path );
$res = $gzipper -> extractTo ( $path );
}
2017-07-05 08:50:07 +02:00
if ( $res ) {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Archive unpacked' );
2017-07-05 08:50:07 +02:00
} else {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Archive not unpacked' , 'error' );
2017-07-05 08:50:07 +02:00
}
} else {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'File not found' , 'error' );
2017-07-05 08:50:07 +02:00
}
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 ))) {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'File not found' , 'error' );
2017-07-05 08:50:07 +02:00
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 )) {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Permissions changed' );
2017-07-05 08:50:07 +02:00
} else {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Permissions not changed' , 'error' );
2017-07-05 08:50:07 +02:00
}
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 ();
if ( is_array ( $objects )) {
foreach ( $objects as $file ) {
2018-10-18 11:03:22 +02:00
if ( $file == '.' || $file == '..' && in_array ( $file , $GLOBALS [ 'exclude_items' ])) {
2017-07-05 08:50:07 +02:00
continue ;
}
if ( ! FM_SHOW_HIDDEN && substr ( $file , 0 , 1 ) === '.' ) {
continue ;
}
$new_path = $path . '/' . $file ;
2018-11-26 19:17:58 +01:00
if ( @ is_file ( $new_path ) && ! in_array ( $file , $GLOBALS [ 'exclude_items' ])) {
2017-07-05 08:50:07 +02:00
$files [] = $file ;
2018-11-26 19:17:58 +01:00
} elseif ( @ is_dir ( $new_path ) && $file != '.' && $file != '..' && ! in_array ( $file , $GLOBALS [ 'exclude_items' ])) {
2017-07-05 08:50:07 +02:00
$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
?>
2018-04-08 12:23:22 +02:00
2018-11-05 14:26:35 +01:00
< link href = " https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.1/min/dropzone.min.css " rel = " stylesheet " >
2017-07-05 08:50:07 +02:00
< div class = " path " >
2018-12-13 19:32:25 +01:00
< div class = " card mb-2 fm-upload-wrapper " >
< div class = " card-header " >
< ul class = " nav nav-tabs card-header-tabs " >
< li class = " nav-item " >
< a class = " nav-link active " href = " #fileUploader " data - target = " #fileUploader " >< i class = " fa fa-arrow-circle-o-up " ></ i > < ? php echo lng ( 'UploadingFiles' ) ?> </a>
</ li >
< li class = " nav-item " >
< a class = " nav-link " href = " #urlUploader " class = " js-url-upload " data - target = " #urlUploader " >< i class = " fa fa-link " ></ i > Upload from URL </ a >
</ li >
</ ul >
</ div >
2018-11-14 12:37:16 +01:00
< div class = " card-body " >
< p class = " card-text " >
2018-12-13 19:32:25 +01:00
< a href = " ?p=<?php echo FM_PATH ?> " class = " float-right " >< i class = " fa fa-chevron-circle-left go-back " ></ i > < ? php echo lng ( 'Back' ) ?> </a>
2018-11-26 19:17:58 +01:00
< ? php echo lng ( 'DestinationFolder' ) ?> : <?php echo fm_enc(fm_convert_win(FM_ROOT_PATH . '/' . FM_PATH)) ?>
2018-11-14 12:37:16 +01:00
</ p >
2018-12-13 19:32:25 +01:00
< form action = " <?php echo htmlspecialchars( $_SERVER["PHP_SELF"] ) . '?p=' . fm_enc(FM_PATH) ?> " class = " dropzone card-tabs-container " id = " fileUploader " enctype = " multipart/form-data " >
2018-11-14 12:37:16 +01:00
< input type = " hidden " name = " p " value = " <?php echo fm_enc(FM_PATH) ?> " >
< input type = " hidden " name = " fullpath " id = " fullpath " value = " <?php echo fm_enc(FM_PATH) ?> " >
< div class = " fallback " >
< input name = " file " type = " file " multiple />
</ div >
</ form >
2018-12-12 20:08:16 +01:00
2018-12-13 19:32:25 +01:00
< div class = " upload-url-wrapper card-tabs-container hidden " id = " urlUploader " >
2018-12-12 20:08:16 +01:00
< form id = " js-form-url-upload " class = " form-inline " onsubmit = " return upload_from_url(this); " method = " POST " action = " " >
< input type = " hidden " name = " type " value = " upload " aria - label = " hidden " aria - hidden = " true " >
< input type = " url " placeholder = " URL " name = " uploadurl " required class = " form-control " style = " width: 80% " >
< button type = " submit " class = " btn btn-primary ml-3 " >< ? php echo lng ( 'Upload' ) ?> </button>
< div class = " lds-facebook " >< div ></ div >< div ></ div >< div ></ div ></ div >
</ form >
2018-12-13 19:32:25 +01:00
< div id = " js-url-upload__list " class = " col-9 mt-3 " ></ div >
2018-12-12 20:08:16 +01:00
</ div >
2018-04-08 12:23:22 +02:00
</ div >
2018-11-14 12:37:16 +01:00
</ div >
2017-07-05 08:50:07 +02:00
</ div >
2018-12-12 20:08:16 +01:00
< script src = " https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.1/min/dropzone.min.js " ></ script >
< script >
Dropzone . options . fileUploader = {
timeout : 120000 ,
init : function () {
this . on ( " sending " , function ( file , xhr , formData ) {
let _path = ( file . fullPath ) ? file . fullPath : file . name ;
document . getElementById ( " fullpath " ) . value = _path ;
xhr . ontimeout = (() => {
alert ( 'Error: Server Timeout' );
});
}) . on ( " success " , function ( res ) {
console . log ( 'Upload Status >> ' , res . status );
}) . on ( " error " , function ( file , response ) {
alert ( response );
});
}
}
</ script >
2017-07-05 08:50:07 +02:00
< ? php
fm_show_footer ();
exit ;
}
// copy form POST
if ( isset ( $_POST [ 'copy' ]) && ! FM_READONLY ) {
$copy_files = $_POST [ 'file' ];
if ( ! is_array ( $copy_files ) || empty ( $copy_files )) {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'Nothing selected' , 'alert' );
2017-07-05 08:50:07 +02:00
fm_redirect ( FM_SELF_URL . '?p=' . urlencode ( FM_PATH ));
}
fm_show_header (); // HEADER
fm_show_nav_path ( FM_PATH ); // current path
?>
< div class = " path " >
2018-11-26 19:17:58 +01:00
< div class = " card " >
< div class = " card-header " >
< h6 >< ? php echo lng ( 'Copying' ) ?> </h6>
</ div >
< div class = " card-body " >
< form action = " " method = " post " >
< input type = " hidden " name = " p " value = " <?php echo fm_enc(FM_PATH) ?> " >
< input type = " hidden " name = " finish " value = " 1 " >
< ? php
foreach ( $copy_files as $cf ) {
echo '<input type="hidden" name="file[]" value="' . fm_enc ( $cf ) . '">' . PHP_EOL ;
}
?>
< p class = " break-word " >< ? php echo lng ( 'Files' ) ?> : <b><?php echo implode('</b>, <b>', $copy_files) ?></b></p>
< p class = " break-word " >< ? php echo lng ( 'SourceFolder' ) ?> : <?php echo fm_enc(fm_convert_win(FM_ROOT_PATH . '/' . FM_PATH)) ?><br>
< label for = " inp_copy_to " >< ? php echo lng ( 'DestinationFolder' ) ?> :</label>
< ? php echo FM_ROOT_PATH ?> /<input type="text" name="copy_to" id="inp_copy_to" value="<?php echo fm_enc(FM_PATH) ?>">
</ p >
< p class = " custom-checkbox custom-control " >< input type = " checkbox " name = " move " value = " 1 " id = " js-move-files " class = " custom-control-input " >< label for = " js-move-files " class = " custom-control-label " style = " vertical-align: sub " > < ? php echo lng ( 'Move' ) ?> </label></p>
< p >
< button type = " submit " class = " btn btn-success " >< i class = " fa fa-check-circle " ></ i > < ? php echo lng ( 'Copy' ) ?> </button>
< b >< a href = " ?p=<?php echo urlencode(FM_PATH) ?> " class = " btn btn-outline-primary " >< i class = " fa fa-times-circle " ></ i > < ? php echo lng ( 'Cancel' ) ?> </a></b>
</ p >
</ form >
</ div >
</ div >
2017-07-05 08:50:07 +02:00
</ div >
< ? php
fm_show_footer ();
exit ;
}
// copy form
if ( isset ( $_GET [ 'copy' ]) && ! isset ( $_GET [ 'finish' ]) && ! FM_READONLY ) {
$copy = $_GET [ 'copy' ];
$copy = fm_clean_path ( $copy );
if ( $copy == '' || ! file_exists ( FM_ROOT_PATH . '/' . $copy )) {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'File not found' , 'error' );
2017-07-05 08:50:07 +02:00
fm_redirect ( FM_SELF_URL . '?p=' . urlencode ( FM_PATH ));
}
fm_show_header (); // HEADER
fm_show_nav_path ( FM_PATH ); // current path
?>
< div class = " path " >
2017-11-03 21:57:44 +01:00
< p >< b > Copying </ b ></ p >
2017-07-05 08:50:07 +02:00
< p class = " break-word " >
2017-12-13 09:23:51 +01:00
Source path : < ? php echo fm_enc ( fm_convert_win ( FM_ROOT_PATH . '/' . $copy )) ?> <br>
Destination folder : < ? php echo fm_enc ( fm_convert_win ( FM_ROOT_PATH . '/' . FM_PATH )) ?>
2017-07-05 08:50:07 +02:00
</ p >
< p >
2018-11-05 14:26:35 +01:00
< b >< a href = " ?p=<?php echo urlencode(FM_PATH) ?>&copy=<?php echo urlencode( $copy ) ?>&finish=1 " >< i class = " fa fa-check-circle " ></ i > Copy </ a ></ b > & nbsp ;
< b >< a href = " ?p=<?php echo urlencode(FM_PATH) ?>&copy=<?php echo urlencode( $copy ) ?>&finish=1&move=1 " >< i class = " fa fa-check-circle " ></ i > Move </ a ></ b > & nbsp ;
2017-11-03 21:57:44 +01:00
< b >< a href = " ?p=<?php echo urlencode(FM_PATH) ?> " >< i class = " fa fa-times-circle " ></ i > Cancel </ a ></ b >
2017-07-05 08:50:07 +02:00
</ p >
2017-11-03 21:57:44 +01:00
< p >< i > Select folder </ i ></ p >
2017-07-05 08:50:07 +02:00
< ul class = " folders break-word " >
< ? php
if ( $parent !== false ) {
?>
2018-11-05 14:26:35 +01:00
< li >< a href = " ?p=<?php echo urlencode( $parent ) ?>&copy=<?php echo urlencode( $copy ) ?> " >< i class = " fa fa-chevron-circle-left " ></ i > ..</ a ></ li >
2018-10-10 19:27:25 +02:00
< ? php
2017-07-05 08:50:07 +02:00
}
foreach ( $folders as $f ) {
?>
2018-10-10 19:27:25 +02:00
< li >
2018-11-05 14:26:35 +01:00
< a href = " ?p=<?php echo urlencode(trim(FM_PATH . '/' . $f , '/')) ?>&copy=<?php echo urlencode( $copy ) ?> " >< i class = " fa fa-folder-o " ></ i > < ? php echo fm_convert_win ( $f ) ?> </a></li>
2018-10-10 19:27:25 +02:00
< ? php
2017-07-05 08:50:07 +02:00
}
?>
</ ul >
</ div >
< ? php
fm_show_footer ();
exit ;
}
2018-11-26 19:17:58 +01:00
if ( isset ( $_GET [ 'settings' ]) && ! FM_READONLY ) {
fm_show_header (); // HEADER
fm_show_nav_path ( FM_PATH ); // current path
global $cfg , $lang , $lang_list ;
?>
< div class = " col-md-6 offset-md-3 pt-3 " >
< div class = " card mb-2 " >
< h6 class = " card-header " >
< ? php echo lng ( 'Settings' ) ?>
2018-12-13 20:50:25 +01:00
< a href = " ?p=<?php echo FM_PATH ?> " class = " float-right " >< i class = " fa fa-window-close " ></ i > < ? php echo lng ( 'Cancel' ) ?> </a>
2018-11-26 19:17:58 +01:00
</ h6 >
< div class = " card-body " >
< form id = " js-settings-form " action = " " method = " post " data - type = " ajax " onsubmit = " return save_settings(this) " >
< input type = " hidden " name = " type " value = " settings " aria - label = " hidden " aria - hidden = " true " >
< div class = " form-group row " >
2018-12-22 10:21:06 +01:00
< label for = " js-language " class = " col-sm-3 col-form-label " >< ? php echo lng ( 'Language' ) ?> </label>
< div class = " col-sm-9 " >
2018-11-26 19:17:58 +01:00
< select class = " form-control " id = " js-language " name = " js-language " >
< ? php
function getSelected ( $l ) {
global $lang ;
return ( $lang == $l ) ? 'selected' : '' ;
}
foreach ( $lang_list as $k => $v ) {
echo " <option value=' $k ' " . getSelected ( $k ) . " > $v </option> " ;
}
?>
</ select >
</ div >
</ div >
< ? php
//get ON/OFF and active class
function getChecked ( $conf , $val , $txt ) {
if ( $conf == 1 && $val == 1 ) {
return $txt ;
} else if ( $conf == '' && $val == '' ) {
return $txt ;
} else {
return '' ;
}
}
?>
< div class = " form-group row " >
2018-12-22 10:21:06 +01:00
< label for = " js-err-rpt-1 " class = " col-sm-3 col-form-label " > Error Reporting </ label >
< div class = " col-sm-9 " >
2018-11-26 19:17:58 +01:00
< div class = " btn-group btn-group-toggle " data - toggle = " buttons " >
< label class = " btn btn-secondary <?php echo getChecked( $report_errors , 1, 'active') ?> " >
< input type = " radio " name = " js-error-report " id = " js-err-rpt-1 " autocomplete = " off " value = " true " < ? php echo getChecked ( $report_errors , 1 , 'checked' ) ?> > ON
</ label >
< label class = " btn btn-secondary <?php echo getChecked( $report_errors , '', 'active') ?> " >
< input type = " radio " name = " js-error-report " id = " js-err-rpt-0 " autocomplete = " off " value = " false " < ? php echo getChecked ( $report_errors , '' , 'checked' ) ?> > OFF
</ label >
</ div >
</ div >
</ div >
< div class = " form-group row " >
2018-12-22 10:21:06 +01:00
< label for = " js-hdn-1 " class = " col-sm-3 col-form-label " > Show Hidden Files </ label >
< div class = " col-sm-9 " >
2018-11-26 19:17:58 +01:00
< div class = " btn-group btn-group-toggle " data - toggle = " buttons " >
< label class = " btn btn-secondary <?php echo getChecked( $show_hidden_files , 1, 'active') ?> " >
< input type = " radio " name = " js-show-hidden " id = " js-hdn-1 " autocomplete = " off " value = " true " < ? php echo getChecked ( $show_hidden_files , 1 , 'checked' ) ?> > ON
</ label >
< label class = " btn btn-secondary <?php echo getChecked( $show_hidden_files , '', 'active') ?> " >
< input type = " radio " name = " js-show-hidden " id = " js-hdn-0 " autocomplete = " off " value = " false " < ? php echo getChecked ( $show_hidden_files , '' , 'checked' ) ?> > OFF
</ label >
</ div >
</ div >
</ div >
< div class = " form-group row " >
< div class = " col-sm-10 " >
< button type = " submit " class = " btn btn-success " >< ? php echo lng ( 'Save' ); ?> </button>
</ div >
</ div >
</ form >
< hr class = " custom-hr " >
< div class = " row " >
< div class = " col-xs-12 col-sm-6 " >
< p >< h3 >< a href = " https://github.com/prasathmani/tinyfilemanager " target = " _blank " class = " app-v-title " > Tiny File Manager V2 . 2 </ a ></ h3 ></ p >
< p > Author : Prasath Mani </ p >
< p > Mail Us : < a href = " mailto:ccpprogrammers@gmail.com " > ccpprogrammers @ gmail . com </ a > </ p >
</ div >
< div class = " col-xs-12 col-sm-6 " >
< div class = " card " >
< ul class = " list-group list-group-flush " >
< li class = " list-group-item " >< a href = " https://tinyfilemanager.github.io/ " target = " _blank " >< i class = " fa fa-question-circle " ></ i > Help Documents </ a > </ li >
< li class = " list-group-item " >< a href = " https://github.com/prasathmani/tinyfilemanager/issues " target = " _blank " >< i class = " fa fa-bug " ></ i > Report Issue </ a ></ li >
< li class = " list-group-item " >< a href = " javascript:latest_release_info(); " target = " _blank " >< i class = " fa fa-link " ></ i > Get Latest Release </ a ></ li >
2018-12-13 20:50:25 +01:00
< li class = " list-group-item " >< a href = " javascript:show_new_pwd(); " target = " _blank " >< i class = " fa fa-lock " ></ i > Generate new password hash </ a ></ li >
2018-11-26 19:17:58 +01:00
</ ul >
</ div >
</ div >
</ div >
< div class = " row mt-2 " >
< div id = " js-download-latest " ></ div >
</ div >
2018-12-13 20:50:25 +01:00
< div class = " row js-new-pwd hidden mt-2 " >
< div class = " col-12 " >
< form class = " form-inline " onsubmit = " return new_password_hash(this) " method = " POST " action = " " >
< input type = " hidden " name = " type " value = " pwdhash " aria - label = " hidden " aria - hidden = " true " >
< div class = " form-group mb-2 " >
< label for = " staticEmail2 " > Generate new password hash </ label >
</ div >
< div class = " form-group mx-sm-3 mb-2 " >
< label for = " inputPassword2 " class = " sr-only " > Password </ label >
< input type = " text " class = " form-control btn-sm " id = " inputPassword2 " name = " inputPassword2 " placeholder = " Password " >
</ div >
< button type = " submit " class = " btn btn-dark btn-sm mb-2 " > Generate </ button >
</ form >
< textarea class = " form-control " rows = " 2 " readonly id = " js-pwd-result " ></ textarea >
</ div >
</ div >
2018-11-26 19:17:58 +01:00
</ div >
</ div >
</ div >
< ? php
fm_show_footer ();
exit ;
}
2017-07-05 08:50:07 +02:00
// file viewer
if ( isset ( $_GET [ 'view' ])) {
$file = $_GET [ 'view' ];
$file = fm_clean_path ( $file );
$file = str_replace ( '/' , '' , $file );
if ( $file == '' || ! is_file ( $path . '/' . $file )) {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'File not found' , 'error' );
2017-07-05 08:50:07 +02:00
fm_redirect ( FM_SELF_URL . '?p=' . urlencode ( FM_PATH ));
}
fm_show_header (); // HEADER
fm_show_nav_path ( FM_PATH ); // current path
$file_url = FM_ROOT_URL . fm_convert_win (( FM_PATH != '' ? '/' . FM_PATH : '' ) . '/' . $file );
$file_path = $path . '/' . $file ;
$ext = strtolower ( pathinfo ( $file_path , PATHINFO_EXTENSION ));
$mime_type = fm_get_mime_type ( $file_path );
$filesize = filesize ( $file_path );
$is_zip = false ;
2018-11-14 12:37:16 +01:00
$is_gzip = false ;
2017-07-05 08:50:07 +02:00
$is_image = false ;
$is_audio = false ;
$is_video = false ;
$is_text = false ;
2018-11-02 13:18:54 +01:00
$is_onlineViewer = false ;
2017-07-05 08:50:07 +02:00
$view_title = 'File' ;
$filenames = false ; // for zip
$content = '' ; // for text
2018-11-02 13:18:54 +01:00
if ( $GLOBALS [ 'online_viewer' ] && in_array ( $ext , fm_get_onlineViewer_exts ())){
$is_onlineViewer = true ;
}
2018-11-14 12:37:16 +01:00
elseif ( $ext == 'zip' || $ext == 'tar' ) {
2017-07-05 08:50:07 +02:00
$is_zip = true ;
$view_title = 'Archive' ;
2018-11-14 12:37:16 +01:00
$filenames = fm_get_zif_info ( $file_path , $ext );
2017-07-05 08:50:07 +02:00
} elseif ( in_array ( $ext , fm_get_image_exts ())) {
$is_image = true ;
$view_title = 'Image' ;
} elseif ( in_array ( $ext , fm_get_audio_exts ())) {
$is_audio = true ;
$view_title = 'Audio' ;
} elseif ( in_array ( $ext , fm_get_video_exts ())) {
$is_video = true ;
$view_title = 'Video' ;
} elseif ( in_array ( $ext , fm_get_text_exts ()) || substr ( $mime_type , 0 , 4 ) == 'text' || in_array ( $mime_type , fm_get_text_mimes ())) {
$is_text = true ;
$content = file_get_contents ( $file_path );
}
?>
2018-11-14 12:37:16 +01:00
< div class = " row " >
< div class = " col-12 " >
< p class = " break-word " >< b >< ? php echo $view_title ?> "<?php echo fm_enc(fm_convert_win($file)) ?>"</b></p>
< p class = " break-word " >
Full path : < ? php echo fm_enc ( fm_convert_win ( $file_path )) ?> <br>
File
size : < ? php echo fm_get_filesize ( $filesize ) ?> <?php if ($filesize >= 1000): ?> (<?php echo sprintf('%s bytes', $filesize) ?>)<?php endif; ?>
< br >
MIME - type : < ? php echo $mime_type ?> <br>
< ? php
// ZIP info
if (( $is_zip || $is_gzip ) && $filenames !== false ) {
$total_files = 0 ;
$total_comp = 0 ;
$total_uncomp = 0 ;
foreach ( $filenames as $fn ) {
if ( ! $fn [ 'folder' ]) {
$total_files ++ ;
}
$total_comp += $fn [ 'compressed_size' ];
$total_uncomp += $fn [ 'filesize' ];
2017-07-05 08:50:07 +02:00
}
2018-11-14 12:37:16 +01:00
?>
Files in archive : < ? php echo $total_files ?> <br>
Total size : < ? php echo fm_get_filesize ( $total_uncomp ) ?> <br>
Size in archive : < ? php echo fm_get_filesize ( $total_comp ) ?> <br>
Compression : < ? php echo round (( $total_comp / $total_uncomp ) * 100 ) ?> %<br>
< ? php
2017-07-05 08:50:07 +02:00
}
2018-11-14 12:37:16 +01:00
// Image info
if ( $is_image ) {
$image_size = getimagesize ( $file_path );
echo 'Image sizes: ' . ( isset ( $image_size [ 0 ]) ? $image_size [ 0 ] : '0' ) . ' x ' . ( isset ( $image_size [ 1 ]) ? $image_size [ 1 ] : '0' ) . '<br>' ;
}
// 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 );
}
2017-07-05 08:50:07 +02:00
}
2018-11-14 12:37:16 +01:00
echo 'Charset: ' . ( $is_utf8 ? 'utf-8' : '8 bit' ) . '<br>' ;
2017-07-05 08:50:07 +02:00
}
?>
2018-11-14 12:37:16 +01:00
</ p >
< p >
2018-11-26 19:17:58 +01:00
< b >< a href = " ?p=<?php echo urlencode(FM_PATH) ?>&dl=<?php echo urlencode( $file ) ?> " >< i class = " fa fa-cloud-download " ></ i > < ? php echo lng ( 'Download' ) ?> </a></b>
< b >< a href = " <?php echo fm_enc( $file_url ) ?> " target = " _blank " >< i class = " fa fa-external-link-square " ></ i > < ? php echo lng ( 'Open' ) ?> </a></b>
2018-11-14 12:37:16 +01:00
& nbsp ;
2017-07-05 08:50:07 +02:00
< ? php
2018-11-14 12:37:16 +01:00
// ZIP actions
if ( ! FM_READONLY && ( $is_zip || $is_gzip ) && $filenames !== false ) {
$zip_name = pathinfo ( $file_path , PATHINFO_FILENAME );
?>
2018-11-26 19:17:58 +01:00
< b >< a href = " ?p=<?php echo urlencode(FM_PATH) ?>&unzip=<?php echo urlencode( $file ) ?> " >< i class = " fa fa-check-circle " ></ i > < ? php echo lng ( 'UnZip' ) ?> </a></b>
2018-11-14 12:37:16 +01:00
< b >< a href = " ?p=<?php echo urlencode(FM_PATH) ?>&unzip=<?php echo urlencode( $file ) ?>&tofolder=1 " title = " UnZip to <?php echo fm_enc( $zip_name ) ?> " >< i class = " fa fa-check-circle " ></ i >
2018-11-26 19:17:58 +01:00
< ? php echo lng ( 'UnZipToFolder' ) ?> </a></b>
2018-11-14 12:37:16 +01:00
< ? php
}
if ( $is_text && ! FM_READONLY ) {
?>
2018-11-26 19:17:58 +01:00
< b >< a href = " ?p=<?php echo urlencode(trim(FM_PATH)) ?>&edit=<?php echo urlencode( $file ) ?> " class = " edit-file " >< i class = " fa fa-pencil-square " ></ i > < ? php echo lng ( 'Edit' ) ?> </a></b>
2018-12-03 19:28:25 +01:00
< b >< a href = " ?p=<?php echo urlencode(trim(FM_PATH)) ?>&edit=<?php echo urlencode( $file ) ?>&env=ace " class = " edit-file " >< i class = " fa fa-pencil-square-o " ></ i > < ? php echo lng ( 'AdvancedEditor' ) ?> </a></b>
2018-11-14 12:37:16 +01:00
< ? php } ?>
2018-11-26 19:17:58 +01:00
< b >< a href = " ?p=<?php echo urlencode(FM_PATH) ?> " >< i class = " fa fa-chevron-circle-left go-back " ></ i > < ? php echo lng ( 'Back' ) ?> </a></b>
2018-11-14 12:37:16 +01:00
</ p >
< ? php
if ( $is_onlineViewer ) {
// Google docs viewer
echo '<iframe src="https://docs.google.com/viewer?embedded=true&hl=en&url=' . fm_enc ( $file_url ) . '" frameborder="no" style="width:100%;min-height:460px"></iframe>' ;
} elseif ( $is_zip ) {
// ZIP content
if ( $filenames !== false ) {
echo '<code class="maxheight">' ;
foreach ( $filenames as $fn ) {
if ( $fn [ 'folder' ]) {
echo '<b>' . fm_enc ( $fn [ 'name' ]) . '</b><br>' ;
} else {
echo $fn [ 'name' ] . ' (' . fm_get_filesize ( $fn [ 'filesize' ]) . ')<br>' ;
}
2017-07-05 08:50:07 +02:00
}
2018-11-14 12:37:16 +01:00
echo '</code>' ;
} else {
echo '<p>Error while fetching archive info</p>' ;
2017-07-05 08:50:07 +02:00
}
2018-11-14 12:37:16 +01:00
} elseif ( $is_image ) {
// Image content
if ( in_array ( $ext , array ( 'gif' , 'jpg' , 'jpeg' , 'png' , 'bmp' , 'ico' ))) {
echo '<p><img src="' . fm_enc ( $file_url ) . '" alt="" class="preview-img"></p>' ;
2017-07-05 08:50:07 +02:00
}
2018-11-14 12:37:16 +01:00
} elseif ( $is_audio ) {
// Audio content
echo '<p><audio src="' . fm_enc ( $file_url ) . '" controls preload="metadata"></audio></p>' ;
} elseif ( $is_video ) {
// Video content
echo '<div class="preview-video"><video src="' . fm_enc ( $file_url ) . '" width="640" height="360" controls preload="metadata"></video></div>' ;
} 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 = '<pre class="with-hljs"><code class="' . $hljs_class . '">' . fm_enc ( $content ) . '</code></pre>' ;
} elseif ( in_array ( $ext , array ( 'php' , 'php4' , 'php5' , 'phtml' , 'phps' ))) {
// php highlight
$content = highlight_string ( $content , true );
} else {
$content = '<pre>' . fm_enc ( $content ) . '</pre>' ;
}
echo $content ;
2017-07-05 08:50:07 +02:00
}
2018-11-14 12:37:16 +01:00
?>
</ div >
2017-07-05 08:50:07 +02:00
</ div >
< ? php
fm_show_footer ();
exit ;
}
// file editor
if ( isset ( $_GET [ 'edit' ])) {
$file = $_GET [ 'edit' ];
$file = fm_clean_path ( $file );
$file = str_replace ( '/' , '' , $file );
if ( $file == '' || ! is_file ( $path . '/' . $file )) {
2017-11-03 21:57:44 +01:00
fm_set_msg ( 'File not found' , 'error' );
2017-07-05 08:50:07 +02:00
fm_redirect ( FM_SELF_URL . '?p=' . urlencode ( FM_PATH ));
}
2018-12-12 20:08:16 +01:00
header ( 'X-XSS-Protection:0' );
2017-07-05 08:50:07 +02:00
fm_show_header (); // HEADER
fm_show_nav_path ( FM_PATH ); // current path
$file_url = FM_ROOT_URL . fm_convert_win (( FM_PATH != '' ? '/' . FM_PATH : '' ) . '/' . $file );
$file_path = $path . '/' . $file ;
2018-11-05 14:26:35 +01:00
// normal editer
2017-07-05 08:50:07 +02:00
$isNormalEditor = true ;
2018-10-10 19:27:25 +02:00
if ( isset ( $_GET [ 'env' ])) {
if ( $_GET [ 'env' ] == " ace " ) {
2017-07-05 08:50:07 +02:00
$isNormalEditor = false ;
}
}
2018-11-05 14:26:35 +01:00
// Save File
2018-10-10 19:27:25 +02:00
if ( isset ( $_POST [ 'savedata' ])) {
2017-07-05 08:50:07 +02:00
$writedata = $_POST [ 'savedata' ];
2018-10-10 19:27:25 +02:00
$fd = fopen ( $file_path , " w " );
2017-07-05 08:50:07 +02:00
@ fwrite ( $fd , $writedata );
fclose ( $fd );
2017-11-03 21:57:44 +01:00
fm_set_msg ( 'File Saved Successfully' , 'alert' );
2017-07-05 08:50:07 +02:00
}
$ext = strtolower ( pathinfo ( $file_path , PATHINFO_EXTENSION ));
$mime_type = fm_get_mime_type ( $file_path );
$filesize = filesize ( $file_path );
$is_text = false ;
$content = '' ; // for text
if ( in_array ( $ext , fm_get_text_exts ()) || substr ( $mime_type , 0 , 4 ) == 'text' || in_array ( $mime_type , fm_get_text_mimes ())) {
$is_text = true ;
$content = file_get_contents ( $file_path );
}
?>
< div class = " path " >
2018-12-03 19:28:25 +01:00
< div class = " row " >
2018-12-06 08:21:29 +01:00
< div class = " col-xs-12 col-sm-5 col-lg-6 pt-1 " >
2018-12-03 19:28:25 +01:00
< div class = " btn-toolbar " role = " toolbar " >
< ? php if ( ! $isNormalEditor ) { ?>
< div class = " btn-group js-ace-toolbar " >
< button data - cmd = " none " data - option = " fullscreen " class = " btn btn-sm btn-outline-secondary " id = " js-ace-fullscreen " title = " Fullscreen " >< i class = " fa fa-expand " title = " Fullscreen " ></ i ></ button >
< button data - cmd = " find " class = " btn btn-sm btn-outline-secondary " id = " js-ace-search " title = " Search " >< i class = " fa fa-search " title = " Search " ></ i ></ button >
< button data - cmd = " undo " class = " btn btn-sm btn-outline-secondary " id = " js-ace-undo " title = " Undo " >< i class = " fa fa-undo " title = " Undo " ></ i ></ button >
< button data - cmd = " redo " class = " btn btn-sm btn-outline-secondary " id = " js-ace-redo " title = " Redo " >< i class = " fa fa-repeat " title = " Redo " ></ i ></ button >
< button data - cmd = " none " data - option = " wrap " class = " btn btn-sm btn-outline-secondary " id = " js-ace-wordWrap " title = " Word Wrap " >< i class = " fa fa-text-width " title = " Word Wrap " ></ i ></ button >
< button data - cmd = " goToNo " class = " btn btn-sm btn-outline-secondary " id = " js-ace-goLine " title = " Go To Line Number " >< i class = " fa fa-i-cursor " title = " Go To Line Number " ></ i ></ button >
< button data - cmd = " none " data - option = " help " class = " btn btn-sm btn-outline-secondary " id = " js-ace-goLine " title = " Help " >< i class = " fa fa-question " title = " Help " ></ i ></ button >
2018-12-06 08:21:29 +01:00
< select id = " js-ace-mode " data - type = " mode " title = " Select Document Type " class = " btn-outline-secondary border-left-0 d-none d-md-block " >< option value = " ace/mode/abap " > ABAP </ option >< option value = " ace/mode/actionscript " > ActionScript </ option >< option value = " ace/mode/ada " > ADA </ option >< option value = " ace/mode/apache_conf " > Apache Conf </ option >< option value = " ace/mode/asciidoc " > AsciiDoc </ option >< option value = " ace/mode/asl " > ASL </ option >< option value = " ace/mode/assembly_x86 " > Assembly x86 </ option >< option value = " ace/mode/apex " > Apex </ option >< option value = " ace/mode/batchfile " > BatchFile </ option >< option value = " ace/mode/c_cpp " > C and C ++</ option >< option value = " ace/mode/clojure " > Clojure </ option >< option value = " ace/mode/cobol " > Cobol </ option >< option value = " ace/mode/coffee " > CoffeeScript </ option >< option value = " ace/mode/coldfusion " > ColdFusion </ option >< option value = " ace/mode/csharp " > C #</option><option value="ace/mode/css">CSS</option><option value="ace/mode/curly">Curly</option><option value="ace/mode/d">D</option><option value="ace/mode/dart">Dart</option><option value="ace/mode/diff">Diff</option><option value="ace/mode/dockerfile">Dockerfile</option><option value="ace/mode/dot">Dot</option><option value="ace/mode/ejs">EJS</option><option value="ace/mode/erlang">Erlang</option><option value="ace/mode/fortran">Fortran</option><option value="ace/mode/fsharp">FSharp</option><option value="ace/mode/gitignore">Gitignore</option><option value="ace/mode/golang">Go</option><option value="ace/mode/graphqlschema">GraphQLSchema</option><option value="ace/mode/groovy">Groovy</option><option value="ace/mode/haml">HAML</option><option value="ace/mode/handlebars">Handlebars</option><option value="ace/mode/haskell">Haskell</option><option value="ace/mode/haskell_cabal">Haskell Cabal</option><option value="ace/mode/haxe">haXe</option><option value="ace/mode/hjson">Hjson</option><option value="ace/mode/html">HTML</option><option value="ace/mode/html_elixir">HTML (Elixir)</option><option value="ace/mode/html_ruby">HTML (Ruby)</option><option value="ace/mode/ini">INI</option><option value="ace/mode/io">Io</option><option value="ace/mode/jade">Jade</option><option value="ace/mode/java">Java</option><option value="ace/mode/javascript" selected>JavaScript</option><option value="ace/mode/json">JSON</option><option value="ace/mode/jsoniq">JSONiq</option><option value="ace/mode/jsp">JSP</option><option value="ace/mode/jsx">JSX</option><option value="ace/mode/less">LESS</option><option value="ace/mode/markdown">Markdown</option><option value="ace/mode/matlab">MATLAB</option><option value="ace/mode/mysql">MySQL</option><option value="ace/mode/objectivec">Objective-C</option><option value="ace/mode/pascal">Pascal</option><option value="ace/mode/perl">Perl</option><option value="ace/mode/perl6">Perl 6</option><option value="ace/mode/pgsql">pgSQL</option><option value="ace/mode/php_laravel_blade">PHP (Blade Template)</option><option value="ace/mode/php">PHP</option><option value="ace/mode/powershell">Powershell</option><option value="ace/mode/python">Python</option><option value="ace/mode/razor">Razor</option><option value="ace/mode/rdoc">RDoc</option><option value="ace/mode/rhtml">RHTML</option><option value="ace/mode/ruby">Ruby</option><option value="ace/mode/rust">Rust</option><option value="ace/mode/sass">SASS</option><option value="ace/mode/scad">SCAD</option><option value="ace/mode/scala">Scala</option><option value="ace/mode/scheme">Scheme</option><option value="ace/mode/scss">SCSS</option><option value="ace/mode/sh">SH</option><option value="ace/mode/sjs">SJS</option><option value="ace/mode/sql">SQL</option><option value="ace/mode/sqlserver">SQLServer</option><option value="ace/mode/stylus">Stylus</option><option value="ace/mode/svg">SVG</option><option value="ace/mode/swift">Swift</option><option value="ace/mode/terraform">Terraform</option><option value="ace/mode/tex">Tex</option><option value="ace/mode/text">Text</option><option value="ace/mode/textile">Textile</option><option value="ace/mode/toml">Toml</option><option value="ace/mode/tsx">TS
< select id = " js-ace-theme " data - type = " theme " title = " Select Theme " class = " btn-outline-secondary border-left-0 d-none d-lg-block " >< optgroup label = " Bright " >< option value = " ace/theme/chrome " > Chrome </ option >< option value = " ace/theme/clouds " > Clouds </ option >< option value = " ace/theme/crimson_editor " > Crimson Editor </ option >< option value = " ace/theme/dawn " > Dawn </ option >< option value = " ace/theme/dreamweaver " > Dreamweaver </ option >< option value = " ace/theme/eclipse " > Eclipse </ option >< option value = " ace/theme/github " > GitHub </ option >< option value = " ace/theme/iplastic " > IPlastic </ option >< option value = " ace/theme/solarized_light " > Solarized Light </ option >< option value = " ace/theme/textmate " > TextMate </ option >< option value = " ace/theme/tomorrow " > Tomorrow </ option >< option value = " ace/theme/xcode " > XCode </ option >< option value = " ace/theme/kuroir " > Kuroir </ option >< option value = " ace/theme/katzenmilch " > KatzenMilch </ option >< option value = " ace/theme/sqlserver " > SQL Server </ option ></ optgroup >< optgroup label = " Dark " >< option value = " ace/theme/ambiance " > Ambiance </ option >< option value = " ace/theme/chaos " > Chaos </ option >< option value = " ace/theme/clouds_midnight " > Clouds Midnight </ option >< option value = " ace/theme/dracula " > Dracula </ option >< option value = " ace/theme/cobalt " > Cobalt </ option >< option value = " ace/theme/gruvbox " > Gruvbox </ option >< option value = " ace/theme/gob " > Green on Black </ option >< option value = " ace/theme/idle_fingers " > idle Fingers </ option >< option value = " ace/theme/kr_theme " > krTheme </ option >< option value = " ace/theme/merbivore " > Merbivore </ option >< option value = " ace/theme/merbivore_soft " > Merbivore Soft </ option >< option value = " ace/theme/mono_industrial " > Mono Industrial </ option >< option value = " ace/theme/monokai " > Monokai </ option >< option value = " ace/theme/pastel_on_dark " > Pastel on dark </ option >< option value = " ace/theme/solarized_dark " > Solarized Dark </ option >< option value = " ace/theme/terminal " > Terminal </ option >< option value = " ace/theme/tomorrow_night " > Tomorrow Night </ option >< option value = " ace/theme/tomorrow_night_blue " > Tomorrow Night Blue </ option >< option value = " ace/theme/tomorrow_night_bright " > Tomorrow Night Bright </ option >< option value = " ace/theme/tomorrow_night_eighties " > Tomorrow Night 80 s </ option >< option value = " ace/theme/twilight " > Twilight </ option >< option value = " ace/theme/vibrant_ink " > Vibrant Ink </ option ></ optgroup ></ select >
2018-12-03 19:28:25 +01:00
</ div >
< ? php } ?>
</ div >
</ div >
2018-12-06 08:21:29 +01:00
< div class = " edit-file-actions col-xs-12 col-sm-7 col-lg-6 text-right pt-1 " >
2018-12-03 19:28:25 +01:00
< a title = " Back " class = " btn btn-sm btn-outline-primary " href = " ?p=<?php echo urlencode(trim(FM_PATH)) ?>&view=<?php echo urlencode( $file ) ?> " >< i class = " fa fa-reply-all " ></ i > < ? php echo lng ( 'Back' ) ?> </a>
< a title = " Backup " class = " btn btn-sm btn-outline-primary " href = " javascript:backup('<?php echo urlencode( $path ) ?>','<?php echo urlencode( $file ) ?>') " >< i class = " fa fa-database " ></ i > < ? php echo lng ( 'BackUp' ) ?> </a>
< ? php if ( $is_text ) { ?>
< ? php if ( $isNormalEditor ) { ?>
< a title = " Advanced " class = " btn btn-sm btn-outline-primary " href = " ?p=<?php echo urlencode(trim(FM_PATH)) ?>&edit=<?php echo urlencode( $file ) ?>&env=ace " >< i class = " fa fa-pencil-square-o " ></ i > < ? php echo lng ( 'AdvancedEditor' ) ?> </a>
< button type = " button " class = " btn btn-sm btn-outline-primary name= " Save " data-url= " < ? php echo fm_enc ( $file_url ) ?> " onclick="edit_save(this,'nrl')"><i class="fa fa-floppy-o"></i> Save
</ button >
< ? php } else { ?>
< a title = " Plain Editor " class = " btn btn-sm btn-outline-primary " href = " ?p=<?php echo urlencode(trim(FM_PATH)) ?>&edit=<?php echo urlencode( $file ) ?> " >< i class = " fa fa-text-height " ></ i > < ? php echo lng ( 'NormalEditor' ) ?> </a>
< button type = " button " class = " btn btn-sm btn-outline-primary " name = " Save " data - url = " <?php echo fm_enc( $file_url ) ?> " onclick = " edit_save(this,'ace') " >< i class = " fa fa-floppy-o " ></ i > < ? php echo lng ( 'Save' ) ?>
</ button >
< ? php } ?>
2017-07-05 08:50:07 +02:00
< ? php } ?>
2018-12-03 19:28:25 +01:00
</ div >
2017-07-05 08:50:07 +02:00
</ div >
< ? php
if ( $is_text && $isNormalEditor ) {
2018-12-03 19:28:25 +01:00
echo '<textarea class="mt-2" id="normal-editor" rows="33" cols="120" style="width: 99.5%;">' . htmlspecialchars ( $content ) . '</textarea>' ;
2017-07-05 08:50:07 +02:00
} elseif ( $is_text ) {
2018-10-10 19:27:25 +02:00
echo '<div id="editor" contenteditable="true">' . htmlspecialchars ( $content ) . '</div>' ;
2017-07-05 08:50:07 +02:00
} else {
2017-11-03 21:57:44 +01:00
fm_set_msg ( 'FILE EXTENSION HAS NOT SUPPORTED' , 'error' );
2017-07-05 08:50:07 +02:00
}
?>
</ div >
< ? php
fm_show_footer ();
exit ;
}
// chmod (not for Windows)
if ( isset ( $_GET [ 'chmod' ]) && ! FM_READONLY && ! FM_IS_WIN ) {
$file = $_GET [ 'chmod' ];
$file = fm_clean_path ( $file );
$file = str_replace ( '/' , '' , $file );
if ( $file == '' || ( ! is_file ( $path . '/' . $file ) && ! is_dir ( $path . '/' . $file ))) {
2017-07-27 11:12:07 +02:00
fm_set_msg ( 'File not found' , 'error' );
2017-07-05 08:50:07 +02:00
fm_redirect ( FM_SELF_URL . '?p=' . urlencode ( FM_PATH ));
}
fm_show_header (); // HEADER
fm_show_nav_path ( FM_PATH ); // current path
$file_url = FM_ROOT_URL . ( FM_PATH != '' ? '/' . FM_PATH : '' ) . '/' . $file ;
$file_path = $path . '/' . $file ;
$mode = fileperms ( $path . '/' . $file );
?>
< div class = " path " >
2018-11-26 19:17:58 +01:00
< div class = " card mb-2 " >
< h6 class = " card-header " >
< ? php echo lng ( 'ChangePermissions' ) ?>
</ h6 >
< div class = " card-body " >
< p class = " card-text " >
Full path : < ? php echo $file_path ?> <br>
</ p >
< form action = " " method = " post " >
< input type = " hidden " name = " p " value = " <?php echo fm_enc(FM_PATH) ?> " >
< input type = " hidden " name = " chmod " value = " <?php echo fm_enc( $file ) ?> " >
< table class = " table compact-table " >
< tr >
< td ></ td >
< td >< b >< ? php echo lng ( 'Owner' ) ?> </b></td>
< td >< b >< ? php echo lng ( 'Group' ) ?> </b></td>
< td >< b >< ? php echo lng ( 'Other' ) ?> </b></td>
</ tr >
< tr >
< td style = " text-align: right " >< b >< ? php echo lng ( 'Read' ) ?> </b></td>
< td >< label >< input type = " checkbox " name = " ur " value = " 1 " < ? php echo ( $mode & 00400 ) ? ' checked' : '' ?> ></label></td>
< td >< label >< input type = " checkbox " name = " gr " value = " 1 " < ? php echo ( $mode & 00040 ) ? ' checked' : '' ?> ></label></td>
< td >< label >< input type = " checkbox " name = " or " value = " 1 " < ? php echo ( $mode & 00004 ) ? ' checked' : '' ?> ></label></td>
</ tr >
< tr >
< td style = " text-align: right " >< b >< ? php echo lng ( 'Write' ) ?> </b></td>
< td >< label >< input type = " checkbox " name = " uw " value = " 1 " < ? php echo ( $mode & 00200 ) ? ' checked' : '' ?> ></label></td>
< td >< label >< input type = " checkbox " name = " gw " value = " 1 " < ? php echo ( $mode & 00020 ) ? ' checked' : '' ?> ></label></td>
< td >< label >< input type = " checkbox " name = " ow " value = " 1 " < ? php echo ( $mode & 00002 ) ? ' checked' : '' ?> ></label></td>
</ tr >
< tr >
< td style = " text-align: right " >< b >< ? php echo lng ( 'Execute' ) ?> </b></td>
< td >< label >< input type = " checkbox " name = " ux " value = " 1 " < ? php echo ( $mode & 00100 ) ? ' checked' : '' ?> ></label></td>
< td >< label >< input type = " checkbox " name = " gx " value = " 1 " < ? php echo ( $mode & 00010 ) ? ' checked' : '' ?> ></label></td>
< td >< label >< input type = " checkbox " name = " ox " value = " 1 " < ? php echo ( $mode & 00001 ) ? ' checked' : '' ?> ></label></td>
</ tr >
</ table >
< p >
2018-12-25 17:18:41 +01:00
< button type = " submit " class = " btn btn-success " >< i class = " fa fa-check-circle " ></ i > < ? php echo lng ( 'Change' ) ?> </button>
2018-11-26 19:17:58 +01:00
< b >< a href = " ?p=<?php echo urlencode(FM_PATH) ?> " class = " btn btn-outline-primary " >< i class = " fa fa-times-circle " ></ i > < ? php echo lng ( 'Cancel' ) ?> </a></b>
</ p >
</ form >
</ div >
</ div >
2017-07-05 08:50:07 +02:00
</ div >
< ? php
fm_show_footer ();
exit ;
}
//--- FILEMANAGER MAIN
fm_show_header (); // HEADER
fm_show_nav_path ( FM_PATH ); // current path
// messages
fm_show_message ();
$num_files = count ( $files );
$num_folders = count ( $folders );
$all_files_size = 0 ;
?>
2018-10-10 19:27:25 +02:00
< form action = " " method = " post " class = " pt-3 " >
< input type = " hidden " name = " p " value = " <?php echo fm_enc(FM_PATH) ?> " >
< input type = " hidden " name = " group " value = " 1 " >
< div class = " table-responsive " >
< table class = " table table-bordered table-hover table-sm bg-white " id = " main-table " >
2018-11-14 12:37:16 +01:00
< thead class = " thead-white " >
2018-10-10 19:27:25 +02:00
< tr >
< ? php if ( ! FM_READONLY ) : ?>
2018-11-26 19:17:58 +01:00
< th style = " width:3% " class = " custom-checkbox-header " >
2018-10-10 19:27:25 +02:00
< div class = " custom-control custom-checkbox " >
< input type = " checkbox " class = " custom-control-input " id = " js-select-all-items " onclick = " checkbox_toggle() " >
< label class = " custom-control-label " for = " js-select-all-items " ></ label >
</ div >
</ th >< ? php endif ; ?>
2018-11-26 19:17:58 +01:00
< th >< ? php echo lng ( 'Name' ) ?> </th>
< th >< ? php echo lng ( 'Size' ) ?> </th>
< th >< ? php echo lng ( 'Modified' ) ?> </th>
2018-10-10 19:27:25 +02:00
< ? php if ( ! FM_IS_WIN ) : ?>
2018-11-26 19:17:58 +01:00
< th >< ? php echo lng ( 'Perms' ) ?> </th>
< th >< ? php echo lng ( 'Owner' ) ?> </th><?php endif; ?>
< th >< ? php echo lng ( 'Actions' ) ?> </th>
2018-10-10 19:27:25 +02:00
</ tr >
</ thead >
< ? php
// link to parent folder
if ( $parent !== false ) {
?>
< tr >< ? php if ( ! FM_READONLY ) : ?>
2018-11-02 09:50:13 +01:00
< td class = " nosort " ></ td >< ? php endif ; ?>
2018-11-26 19:17:58 +01:00
< td class = " border-0 " >< a href = " ?p=<?php echo urlencode( $parent ) ?> " >< i class = " fa fa-chevron-circle-left go-back " ></ i > ..</ a ></ td >
2018-11-02 09:50:13 +01:00
< td class = " border-0 " ></ td >
< td class = " border-0 " ></ td >
< td class = " border-0 " ></ td >
2018-11-14 13:35:39 +01:00
< ? php if ( ! FM_IS_WIN ) { ?>
2018-11-02 09:50:13 +01:00
< td class = " border-0 " ></ td >
< td class = " border-0 " ></ td >
< ? php } ?>
2018-10-10 19:27:25 +02:00
</ tr >
< ? php
}
$ii = 3399 ;
foreach ( $folders as $f ) {
$is_link = is_link ( $path . '/' . $f );
$img = $is_link ? 'icon-link_folder' : 'fa fa-folder-o' ;
$modif = date ( FM_DATETIME_FORMAT , filemtime ( $path . '/' . $f ));
$perms = substr ( decoct ( fileperms ( $path . '/' . $f )), - 4 );
if ( function_exists ( 'posix_getpwuid' ) && function_exists ( 'posix_getgrgid' )) {
$owner = posix_getpwuid ( fileowner ( $path . '/' . $f ));
$group = posix_getgrgid ( filegroup ( $path . '/' . $f ));
} else {
$owner = array ( 'name' => '?' );
$group = array ( 'name' => '?' );
}
?>
< tr >
< ? php if ( ! FM_READONLY ) : ?>
2018-11-26 19:17:58 +01:00
< td class = " custom-checkbox-td " >
2018-10-10 19:27:25 +02:00
< div class = " custom-control custom-checkbox " >
< input type = " checkbox " class = " custom-control-input " id = " <?php echo $ii ?> " name = " file[] " value = " <?php echo fm_enc( $f ) ?> " >
< label class = " custom-control-label " for = " <?php echo $ii ?> " ></ label >
</ div >
</ td >< ? php endif ; ?>
< td >
2018-11-05 14:26:35 +01:00
< div class = " filename " >< a href = " ?p=<?php echo urlencode(trim(FM_PATH . '/' . $f , '/')) ?> " >< i class = " <?php echo $img ?> " ></ i > < ? php echo fm_convert_win ( $f ) ?>
2018-10-10 19:27:25 +02:00
</ a >< ? php echo ( $is_link ? ' → <i>' . readlink ( $path . '/' . $f ) . '</i>' : '' ) ?> </div>
</ td >
2018-11-26 19:17:58 +01:00
< td >< ? php echo lng ( 'Folder' ) ?> </td>
2018-10-10 19:27:25 +02:00
< td >< ? php echo $modif ?> </td>
< ? php if ( ! FM_IS_WIN ) : ?>
2018-11-05 14:26:35 +01:00
< td >< ? php if ( ! FM_READONLY ) : ?> <a title="Change Permissions" href="?p=<?php echo urlencode(FM_PATH) ?>&chmod=<?php echo urlencode($f) ?>"><?php echo $perms ?></a><?php else: ?><?php echo $perms ?><?php endif; ?>
2018-10-10 19:27:25 +02:00
</ td >
< td >< ? php echo $owner [ 'name' ] . ':' . $group [ 'name' ] ?> </td>
< ? php endif ; ?>
< td class = " inline-actions " >< ? php if ( ! FM_READONLY ) : ?>
2018-11-26 19:17:58 +01:00
< a title = " <?php echo lng('Delete')?> " href = " ?p=<?php echo urlencode(FM_PATH) ?>&del=<?php echo urlencode( $f ) ?> " onclick = " return confirm('Delete folder?'); " >< i class = " fa fa-trash-o " aria - hidden = " true " ></ i ></ a >
2018-12-12 20:08:16 +01:00
< a title = " <?php echo lng('Rename')?> " href = " # " onclick = " rename('<?php echo fm_enc(FM_PATH) ?>', '<?php echo fm_enc(addslashes( $f )) ?>');return false; " >< i class = " fa fa-pencil-square-o " aria - hidden = " true " ></ i ></ a >
2018-11-26 19:17:58 +01:00
< a title = " <?php echo lng('CopyTo')?>... " href = " ?p=&copy=<?php echo urlencode(trim(FM_PATH . '/' . $f , '/')) ?> " >< i class = " fa fa-files-o " aria - hidden = " true " ></ i ></ a >
2018-10-10 19:27:25 +02:00
< ? php endif ; ?>
2018-11-26 19:17:58 +01:00
< a title = " <?php echo lng('DirectLink')?> " href = " <?php echo fm_enc(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f . '/') ?> " target = " _blank " >< i class = " fa fa-link " aria - hidden = " true " ></ i ></ a >
2018-10-10 19:27:25 +02:00
</ td >
</ tr >
< ? php
flush ();
$ii ++ ;
}
$ik = 6070 ;
foreach ( $files as $f ) {
$is_link = is_link ( $path . '/' . $f );
$img = $is_link ? 'fa fa-file-text-o' : fm_get_file_icon_class ( $path . '/' . $f );
$modif = date ( FM_DATETIME_FORMAT , filemtime ( $path . '/' . $f ));
$filesize_raw = filesize ( $path . '/' . $f );
$filesize = fm_get_filesize ( $filesize_raw );
$filelink = '?p=' . urlencode ( FM_PATH ) . '&view=' . urlencode ( $f );
$all_files_size += $filesize_raw ;
$perms = substr ( decoct ( fileperms ( $path . '/' . $f )), - 4 );
if ( function_exists ( 'posix_getpwuid' ) && function_exists ( 'posix_getgrgid' )) {
$owner = posix_getpwuid ( fileowner ( $path . '/' . $f ));
$group = posix_getgrgid ( filegroup ( $path . '/' . $f ));
} else {
$owner = array ( 'name' => '?' );
$group = array ( 'name' => '?' );
}
?>
< tr >
< ? php if ( ! FM_READONLY ) : ?>
2018-11-26 19:17:58 +01:00
< td class = " custom-checkbox-td " >
2018-10-10 19:27:25 +02:00
< div class = " custom-control custom-checkbox " >
< input type = " checkbox " class = " custom-control-input " id = " <?php echo $ik ?> " name = " file[] " value = " <?php echo fm_enc( $f ) ?> " >
< label class = " custom-control-label " for = " <?php echo $ik ?> " ></ label >
</ div >
</ td >< ? php endif ; ?>
< td >
2018-11-05 14:26:35 +01:00
< div class = " filename " >< a href = " <?php echo $filelink ?> " title = " File info " >< i class = " <?php echo $img ?> " ></ i > < ? php echo fm_convert_win ( $f ) ?>
2018-10-10 19:27:25 +02:00
</ a >< ? php echo ( $is_link ? ' → <i>' . readlink ( $path . '/' . $f ) . '</i>' : '' ) ?> </div>
</ td >
< td >< span title = " <?php printf('%s bytes', $filesize_raw ) ?> " >< ? php echo $filesize ?> </span></td>
< td >< ? php echo $modif ?> </td>
< ? php if ( ! FM_IS_WIN ) : ?>
2018-11-05 14:26:35 +01:00
< td >< ? php if ( ! FM_READONLY ) : ?> <a title="<?php echo 'Change Permissions' ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&chmod=<?php echo urlencode($f) ?>"><?php echo $perms ?></a><?php else: ?><?php echo $perms ?><?php endif; ?>
2018-10-10 19:27:25 +02:00
</ td >
< td >< ? php echo fm_enc ( $owner [ 'name' ] . ':' . $group [ 'name' ]) ?> </td>
< ? php endif ; ?>
< td class = " inline-actions " >
< ? php if ( ! FM_READONLY ) : ?>
2018-11-26 19:17:58 +01:00
< a title = " <?php echo lng('Delete') ?> " href = " ?p=<?php echo urlencode(FM_PATH) ?>&del=<?php echo urlencode( $f ) ?> " onclick = " return confirm('Delete file?'); " >< i class = " fa fa-trash-o " ></ i ></ a >
2018-12-12 20:08:16 +01:00
< a title = " <?php echo lng('Rename') ?> " href = " # " onclick = " rename('<?php echo fm_enc(FM_PATH) ?>', '<?php echo fm_enc(addslashes( $f )) ?>');return false; " >< i class = " fa fa-pencil-square-o " ></ i ></ a >
2018-11-26 19:17:58 +01:00
< a title = " <?php echo lng('CopyTo') ?>... "
2018-11-05 14:26:35 +01:00
href = " ?p=<?php echo urlencode(FM_PATH) ?>&copy=<?php echo urlencode(trim(FM_PATH . '/' . $f , '/')) ?> " >< i class = " fa fa-files-o " ></ i ></ a >
2018-10-10 19:27:25 +02:00
< ? php endif ; ?>
2018-11-26 19:17:58 +01:00
< a title = " <?php echo lng('DirectLink') ?> " href = " <?php echo fm_enc(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f ) ?> " target = " _blank " >< i class = " fa fa-link " ></ i ></ a >
< a title = " <?php echo lng('Download') ?> " href = " ?p=<?php echo urlencode(FM_PATH) ?>&dl=<?php echo urlencode( $f ) ?> " >< i class = " fa fa-download " ></ i ></ a >
2018-10-10 19:27:25 +02:00
</ td >
</ tr >
< ? php
flush ();
$ik ++ ;
}
2017-07-05 08:50:07 +02:00
2018-10-10 19:27:25 +02:00
if ( empty ( $folders ) && empty ( $files )) {
?>
< tfoot >
< tr >< ? php if ( ! FM_READONLY ) : ?>
< td ></ td >< ? php endif ; ?>
< td colspan = " <?php echo !FM_IS_WIN ? '6' : '4' ?> " >< em >< ? php echo 'Folder is empty' ?> </em></td>
</ tr >
</ tfoot >
< ? php
} else {
?>
< tfoot >
< tr >< ? php if ( ! FM_READONLY ) : ?>
< td class = " gray " ></ td >< ? php endif ; ?>
< td class = " gray " colspan = " <?php echo !FM_IS_WIN ? '6' : '4' ?> " >
2018-12-25 17:18:41 +01:00
Full size : < span title = " <?php printf('%s bytes', $all_files_size ) ?> " >< ? php echo '<span class="badge badge-light">' . fm_get_filesize ( $all_files_size ) . '</span>' ?> </span>,
< ? php echo lng ( 'File' ) . ': <span class="badge badge-light">' . $num_files . '</span>' ?> ,
< ? php echo lng ( 'Folder' ) . ': <span class="badge badge-light">' . $num_folders . '</span>' ?> ,
< ? php echo lng ( 'MemoryUsed' ) . ': <span class="badge badge-light">' . $memory . '</span>' ?> ,
< ? php echo lng ( 'PartitionSize' ) . ': <span class="badge badge-light">' . fm_get_filesize ( disk_free_space ( $path )) . '</span> free of <span class="badge badge-light">' . fm_get_filesize ( disk_total_space ( $path )) . '</span>' ; ?>
2018-10-10 19:27:25 +02:00
</ td >
</ tr >
</ tfoot >
< ? php
}
?>
</ table >
</ div >
2017-07-05 08:50:07 +02:00
2018-12-22 10:21:06 +01:00
< div class = " row " >
< ? php if ( ! FM_READONLY ) : ?>
< div class = " col-xs-12 col-sm-9 " >
< ul class = " list-inline footer-action " >
< li class = " list-inline-item " > < a href = " #/select-all " class = " btn btn-small btn-outline-primary btn-2 " onclick = " select_all();return false; " >< i class = " fa fa-check-square " ></ i > < ? php echo lng ( 'SelectAll' ) ?> </a></li>
< li class = " list-inline-item " >< a href = " #/unselect-all " class = " btn btn-small btn-outline-primary btn-2 " onclick = " unselect_all();return false; " >< i class = " fa fa-window-close " ></ i > < ? php echo lng ( 'UnSelectAll' ) ?> </a></li>
< li class = " list-inline-item " >< a href = " #/invert-all " class = " btn btn-small btn-outline-primary btn-2 " onclick = " invert_all();return false; " >< i class = " fa fa-th-list " ></ i > < ? php echo lng ( 'InvertSelection' ) ?> </a></li>
< li class = " list-inline-item " >< input type = " submit " class = " hidden " name = " delete " id = " a-delete " value = " Delete " onclick = " return confirm('Delete selected files and folders?') " >
< a href = " javascript:document.getElementById('a-delete').click(); " class = " btn btn-small btn-outline-primary btn-2 " >< i class = " fa fa-trash " ></ i > < ? php echo lng ( 'Delete' ) ?> </a></li>
< li class = " list-inline-item " >< input type = " submit " class = " hidden " name = " zip " id = " a-zip " value = " zip " onclick = " return confirm('Create archive?') " >
< a href = " javascript:document.getElementById('a-zip').click(); " class = " btn btn-small btn-outline-primary btn-2 " >< i class = " fa fa-file-archive-o " ></ i > < ? php echo lng ( 'Zip' ) ?> </a></li>
< li class = " list-inline-item " >< input type = " submit " class = " hidden " name = " tar " id = " a-tar " value = " tar " onclick = " return confirm('Create archive?') " >
< a href = " javascript:document.getElementById('a-tar').click(); " class = " btn btn-small btn-outline-primary btn-2 " >< i class = " fa fa-file-archive-o " ></ i > < ? php echo lng ( 'Tar' ) ?> </a></li>
< li class = " list-inline-item " >< input type = " submit " class = " hidden " name = " copy " id = " a-copy " value = " Copy " >
< a href = " javascript:document.getElementById('a-copy').click(); " class = " btn btn-small btn-outline-primary btn-2 " >< i class = " fa fa-files-o " ></ i > < ? php echo lng ( 'Copy' ) ?> </a></li>
</ ul >
</ div >
< div class = " col-3 d-none d-sm-block " >< a href = " https://tinyfilemanager.github.io " target = " _blank " class = " float-right text-muted " > Tiny File Manager v2 . 2 </ a ></ div >
< ? php else : ?>
< div class = " col-12 " >< a href = " https://tinyfilemanager.github.io " target = " _blank " class = " float-right text-muted " > Tiny File Manager v2 . 2 </ a ></ div >
< ? php endif ; ?>
</ div >
2017-07-05 08:50:07 +02:00
</ form >
< ? php
fm_show_footer ();
//--- END
// Functions
/**
* Delete file or folder ( recursively )
* @ param string $path
* @ return bool
*/
function fm_rdelete ( $path )
{
if ( is_link ( $path )) {
return unlink ( $path );
} elseif ( is_dir ( $path )) {
$objects = scandir ( $path );
$ok = true ;
if ( is_array ( $objects )) {
foreach ( $objects as $file ) {
if ( $file != '.' && $file != '..' ) {
if ( ! fm_rdelete ( $path . '/' . $file )) {
$ok = false ;
}
}
}
}
return ( $ok ) ? rmdir ( $path ) : false ;
} elseif ( is_file ( $path )) {
return unlink ( $path );
}
return false ;
}
/**
* Recursive chmod
* @ param string $path
* @ param int $filemode
* @ param int $dirmode
* @ return bool
* @ todo Will use in mass chmod
*/
function fm_rchmod ( $path , $filemode , $dirmode )
{
if ( is_dir ( $path )) {
if ( ! chmod ( $path , $dirmode )) {
return false ;
}
$objects = scandir ( $path );
if ( is_array ( $objects )) {
foreach ( $objects as $file ) {
if ( $file != '.' && $file != '..' ) {
if ( ! fm_rchmod ( $path . '/' . $file , $filemode , $dirmode )) {
return false ;
}
}
}
}
return true ;
} elseif ( is_link ( $path )) {
return true ;
} elseif ( is_file ( $path )) {
return chmod ( $path , $filemode );
}
return false ;
}
/**
* Safely rename
* @ param string $old
* @ param string $new
* @ return bool | null
*/
function fm_rename ( $old , $new )
{
2018-11-14 12:37:16 +01:00
$allowed = ( FM_EXTENSION ) ? explode ( ',' , FM_EXTENSION ) : false ;
$ext = pathinfo ( $new , PATHINFO_EXTENSION );
$isFileAllowed = ( $allowed ) ? in_array ( $ext , $allowed ) : true ;
if ( ! $isFileAllowed ) return false ;
2017-07-05 08:50:07 +02:00
return ( ! file_exists ( $new ) && file_exists ( $old )) ? rename ( $old , $new ) : null ;
}
/**
* Copy file or folder ( recursively ) .
* @ param string $path
* @ param string $dest
* @ param bool $upd Update files
* @ param bool $force Create folder with same names instead file
* @ return bool
*/
function fm_rcopy ( $path , $dest , $upd = true , $force = true )
{
if ( is_dir ( $path )) {
if ( ! fm_mkdir ( $dest , $force )) {
return false ;
}
$objects = scandir ( $path );
$ok = true ;
if ( is_array ( $objects )) {
foreach ( $objects as $file ) {
if ( $file != '.' && $file != '..' ) {
if ( ! fm_rcopy ( $path . '/' . $file , $dest . '/' . $file )) {
$ok = false ;
}
}
}
}
return $ok ;
} elseif ( is_file ( $path )) {
return fm_copy ( $path , $dest , $upd );
}
return false ;
}
/**
* Safely create folder
* @ param string $dir
* @ param bool $force
* @ return bool
*/
function fm_mkdir ( $dir , $force )
{
if ( file_exists ( $dir )) {
if ( is_dir ( $dir )) {
return $dir ;
} elseif ( ! $force ) {
return false ;
}
unlink ( $dir );
}
return mkdir ( $dir , 0777 , true );
}
/**
* Safely copy file
* @ param string $f1
* @ param string $f2
* @ param bool $upd
* @ return bool
*/
function fm_copy ( $f1 , $f2 , $upd )
{
$time1 = filemtime ( $f1 );
if ( file_exists ( $f2 )) {
$time2 = filemtime ( $f2 );
if ( $time2 >= $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 ;
}
/**
* Clean path
* @ param string $path
* @ return string
*/
function fm_clean_path ( $path )
{
$path = trim ( $path );
$path = trim ( $path , '\\/' );
$path = str_replace ( array ( '../' , '..\\' ), '' , $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 ;
}
/**
* Get nice filesize
* @ param int $size
* @ return string
*/
function fm_get_filesize ( $size )
{
if ( $size < 1000 ) {
2017-07-27 11:12:07 +02:00
return sprintf ( '%s B' , $size );
2017-07-05 08:50:07 +02:00
} elseif (( $size / 1024 ) < 1000 ) {
2018-12-25 17:18:41 +01:00
return sprintf ( '%s KB' , round (( $size / 1024 ), 2 ));
2017-07-05 08:50:07 +02:00
} elseif (( $size / 1024 / 1024 ) < 1000 ) {
2018-12-25 17:18:41 +01:00
return sprintf ( '%s MB' , round (( $size / 1024 / 1024 ), 2 ));
2017-07-27 11:12:07 +02:00
} elseif (( $size / 1024 / 1024 / 1024 ) < 1000 ) {
2018-12-25 17:18:41 +01:00
return sprintf ( '%s GB' , round (( $size / 1024 / 1024 / 1024 ), 2 ));
2017-07-05 08:50:07 +02:00
} else {
2018-12-25 17:18:41 +01:00
return sprintf ( '%s TB' , round (( $size / 1024 / 1024 / 1024 / 1024 ), 2 ));
2017-07-05 08:50:07 +02:00
}
}
/**
* Get info about zip archive
* @ param string $path
* @ return array | bool
*/
2018-11-14 12:37:16 +01:00
function fm_get_zif_info ( $path , $ext ) {
if ( $ext == 'zip' && function_exists ( 'zip_open' )) {
2017-07-05 08:50:07 +02:00
$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 ;
}
2018-11-14 12:37:16 +01:00
} 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 ;
2017-07-05 08:50:07 +02:00
}
return false ;
}
/**
* Encode html entities
* @ param string $text
* @ return string
*/
function fm_enc ( $text )
{
return htmlspecialchars ( $text , ENT_QUOTES , 'UTF-8' );
}
/**
* Save message in session
* @ param string $msg
* @ param string $status
*/
function fm_set_msg ( $msg , $status = 'ok' )
{
2018-12-13 19:32:25 +01:00
$_SESSION [ FM_SESSION_ID ][ 'message' ] = $msg ;
$_SESSION [ FM_SESSION_ID ][ 'status' ] = $status ;
2017-07-05 08:50:07 +02:00
}
/**
* 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 ;
}
2018-11-26 19:17:58 +01:00
/**
* @ 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 );
}
2017-07-05 08:50:07 +02:00
/**
* 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 ) {
2018-10-10 19:27:25 +02:00
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 'svg' :
2017-07-05 08:50:07 +02:00
$img = 'fa fa-picture-o' ;
break ;
2018-10-10 19:27:25 +02:00
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 'map' :
case 'lock' :
case 'dtd' :
2017-07-05 08:50:07 +02:00
$img = 'fa fa-file-code-o' ;
break ;
2018-10-10 19:27:25 +02:00
case 'txt' :
case 'ini' :
case 'conf' :
case 'log' :
case 'htaccess' :
2017-07-05 08:50:07 +02:00
$img = 'fa fa-file-text-o' ;
break ;
2018-10-10 19:27:25 +02:00
case 'css' :
case 'less' :
case 'sass' :
case 'scss' :
2017-07-05 08:50:07 +02:00
$img = 'fa fa-css3' ;
break ;
2018-10-10 19:27:25 +02:00
case 'zip' :
case 'rar' :
case 'gz' :
case 'tar' :
case '7z' :
2017-07-05 08:50:07 +02:00
$img = 'fa fa-file-archive-o' ;
break ;
2018-10-10 19:27:25 +02:00
case 'php' :
case 'php4' :
case 'php5' :
case 'phps' :
case 'phtml' :
2017-07-05 08:50:07 +02:00
$img = 'fa fa-code' ;
break ;
2018-10-10 19:27:25 +02:00
case 'htm' :
case 'html' :
case 'shtml' :
case 'xhtml' :
2017-07-05 08:50:07 +02:00
$img = 'fa fa-html5' ;
break ;
2018-10-10 19:27:25 +02:00
case 'xml' :
case 'xsl' :
2017-07-05 08:50:07 +02:00
$img = 'fa fa-file-excel-o' ;
break ;
2018-10-10 19:27:25 +02:00
case 'wav' :
case 'mp3' :
case 'mp2' :
case 'm4a' :
case 'aac' :
case 'ogg' :
case 'oga' :
case 'wma' :
case 'mka' :
case 'flac' :
case 'ac3' :
case 'tds' :
2017-07-05 08:50:07 +02:00
$img = 'fa fa-music' ;
break ;
2018-10-10 19:27:25 +02:00
case 'm3u' :
case 'm3u8' :
case 'pls' :
case 'cue' :
2017-07-05 08:50:07 +02:00
$img = 'fa fa-headphones' ;
break ;
2018-10-10 19:27:25 +02:00
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' :
2017-07-05 08:50:07 +02:00
$img = 'fa fa-file-video-o' ;
break ;
2018-10-10 19:27:25 +02:00
case 'eml' :
case 'msg' :
2017-07-05 08:50:07 +02:00
$img = 'fa fa-envelope-o' ;
break ;
2018-10-10 19:27:25 +02:00
case 'xls' :
case 'xlsx' :
2017-07-05 08:50:07 +02:00
$img = 'fa fa-file-excel-o' ;
break ;
case 'csv' :
$img = 'fa fa-file-text-o' ;
break ;
2017-07-07 12:29:04 +02:00
case 'bak' :
$img = 'fa fa-clipboard' ;
break ;
2018-10-10 19:27:25 +02:00
case 'doc' :
case 'docx' :
2017-07-05 08:50:07 +02:00
$img = 'fa fa-file-word-o' ;
break ;
2018-10-10 19:27:25 +02:00
case 'ppt' :
case 'pptx' :
2017-07-05 08:50:07 +02:00
$img = 'fa fa-file-powerpoint-o' ;
break ;
2018-10-10 19:27:25 +02:00
case 'ttf' :
case 'ttc' :
case 'otf' :
case 'woff' :
case 'woff2' :
case 'eot' :
case 'fon' :
2017-07-05 08:50:07 +02:00
$img = 'fa fa-font' ;
break ;
case 'pdf' :
$img = 'fa fa-file-pdf-o' ;
break ;
2018-10-10 19:27:25 +02:00
case 'psd' :
case 'ai' :
case 'eps' :
case 'fla' :
case 'swf' :
2017-07-05 08:50:07 +02:00
$img = 'fa fa-file-image-o' ;
break ;
2018-10-10 19:27:25 +02:00
case 'exe' :
case 'msi' :
2017-07-05 08:50:07 +02:00
$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' );
}
/**
* Get video files extensions
* @ return array
*/
function fm_get_video_exts ()
{
return array ( 'webm' , 'mp4' , 'm4v' , 'ogm' , 'ogv' , 'mov' );
}
/**
* 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' ,
);
}
/**
* 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' ,
);
}
2018-11-02 13:18:54 +01:00
/**
2018-11-05 14:26:35 +01:00
* Get online docs viewer supported files extensions
2018-11-02 13:18:54 +01:00
* @ return array
*/
function fm_get_onlineViewer_exts ()
{
return array ( 'doc' , 'docx' , 'xls' , 'xlsx' , 'pdf' , 'ppt' , 'pptx' , 'ai' , 'psd' , 'dxf' , 'xps' , 'rar' );
}
2017-07-05 08:50:07 +02:00
/**
* 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 ;
}
}
2018-11-14 12:37:16 +01:00
/**
* 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 )) {
return $this -> tar -> addFile ( $filename );
} 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 ;
}
}
2018-11-26 19:17:58 +01:00
/**
* 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<br>Error: Cannot load configuration' ;
if ( substr ( $fm_url , - 1 ) == '/' ) {
$fm_url = rtrim ( $fm_url , '/' );
$msg .= '<br>' ;
$msg .= '<br>Seems like you have a trailing slash on the URL.' ;
$msg .= '<br>Try this link: <a href="' . $fm_url . '">' . $fm_url . '</a>' ;
}
die ( $msg );
}
if ( is_array ( $data ) && count ( $data )) $this -> data = $data ;
else $this -> save ();
}
function save ()
{
global $root_path ;
$fm_file = $root_path . $_SERVER [ " PHP_SELF " ];
$var_name = '$CONFIG' ;
$var_value = var_export ( json_encode ( $this -> data ), true );
$config_string = " <?php " . chr ( 13 ) . chr ( 10 ) . " //Default Configuration " . chr ( 13 ) . chr ( 10 ) . " $var_name = $var_value ; " . chr ( 13 ) . chr ( 10 );
if ( file_exists ( $fm_file )) {
$lines = file ( $fm_file );
if ( $fh = @ fopen ( $fm_file , " w " )) {
@ fputs ( $fh , $config_string , strlen ( $config_string ));
for ( $x = 3 ; $x < count ( $lines ); $x ++ ) {
@ fputs ( $fh , $lines [ $x ], strlen ( $lines [ $x ]));
}
@ fclose ( $fh );
}
}
}
}
2017-07-05 08:50:07 +02:00
//--- templates functions
/**
* Show nav block
* @ param string $path
*/
function fm_show_nav_path ( $path )
{
2018-12-22 10:21:06 +01:00
global $lang , $sticky_navbar ;
$isStickyNavBar = $sticky_navbar ? 'fixed-top' : '' ;
2017-07-05 08:50:07 +02:00
?>
2018-12-22 10:21:06 +01:00
< nav class = " navbar navbar-expand-lg navbar-light bg-white mb-4 main-nav <?php echo $isStickyNavBar ?> " >
2018-11-26 19:17:58 +01:00
< a class = " navbar-brand " href = " " > < ? php echo lng ( 'AppTitle' ) ?> </a>
2018-11-05 14:26:35 +01:00
< button class = " navbar-toggler " type = " button " data - toggle = " collapse " data - target = " #navbarSupportedContent " aria - controls = " navbarSupportedContent " aria - expanded = " false " aria - label = " Toggle navigation " >
2018-10-10 19:27:25 +02:00
< span class = " navbar-toggler-icon " ></ span >
</ button >
< div class = " collapse navbar-collapse " id = " navbarSupportedContent " >
2017-07-05 08:50:07 +02:00
2018-10-10 19:27:25 +02:00
< ? php
$path = fm_clean_path ( $path );
$root_url = " <a href='?p='><i class='fa fa-home' aria-hidden='true' title=' " . FM_ROOT_PATH . " '></i></a> " ;
2018-11-26 19:17:58 +01:00
$sep = '<i class="bread-crumb"> / </i>' ;
2018-10-10 19:27:25 +02:00
if ( $path != '' ) {
$exploded = explode ( '/' , $path );
$count = count ( $exploded );
$array = array ();
$parent = '' ;
for ( $i = 0 ; $i < $count ; $i ++ ) {
$parent = trim ( $parent . '/' . $exploded [ $i ], '/' );
$parent_enc = urlencode ( $parent );
$array [] = " <a href='?p= { $parent_enc } '> " . fm_enc ( fm_convert_win ( $exploded [ $i ])) . " </a> " ;
}
$root_url .= $sep . implode ( $sep , $array );
2017-07-05 08:50:07 +02:00
}
2018-12-06 08:21:29 +01:00
echo '<div class="col-xs-6 col-sm-5">' . $root_url . '</div>' ;
2018-10-10 19:27:25 +02:00
?>
2017-07-05 08:50:07 +02:00
2018-12-06 08:21:29 +01:00
< div class = " col-xs-6 col-sm-7 text-right " >
2018-10-10 19:27:25 +02:00
< ul class = " navbar-nav mr-auto float-right " >
< ? php if ( ! FM_READONLY ) : ?>
2018-11-02 09:50:13 +01:00
< li class = " nav-item mr-2 " >
2018-11-26 19:17:58 +01:00
< div class = " input-group input-group-sm mr-1 " style = " margin-top:4px; " >
< input type = " text " class = " form-control " placeholder = " Search " aria - label = " <?php echo lng('Search') ?> " aria - describedby = " search-addon2 " id = " search-addon " >
2018-11-02 09:50:13 +01:00
< div class = " input-group-append " >
< span class = " input-group-text " id = " search-addon2 " >< i class = " fa fa-search " ></ i ></ span >
</ div >
</ div >
2018-10-10 19:27:25 +02:00
</ li >
< li class = " nav-item " >
2018-11-26 19:17:58 +01:00
< a title = " <?php echo lng('Upload') ?> " class = " nav-link " href = " ?p=<?php echo urlencode(FM_PATH) ?>&upload " >< i class = " fa fa-cloud-upload " aria - hidden = " true " ></ i > < ? php echo lng ( 'Upload' ) ?> </a>
2018-10-10 19:27:25 +02:00
</ li >
< li class = " nav-item " >
2018-11-26 19:17:58 +01:00
< a title = " <?php echo lng('NewItem') ?> " class = " nav-link " href = " #createNewItem " data - toggle = " modal " data - target = " #createNewItem " >< i class = " fa fa-plus-square " ></ i > < ? php echo lng ( 'NewItem' ) ?> </a>
2018-10-10 19:27:25 +02:00
</ li >
< ? php endif ; ?>
2018-11-15 13:34:40 +01:00
< ? php if ( FM_USE_AUTH ) : ?>
2018-11-14 12:37:16 +01:00
< li class = " nav-item avatar dropdown " >
2018-12-13 19:32:25 +01:00
< a class = " nav-link dropdown-toggle " id = " navbarDropdownMenuLink-5 " data - toggle = " dropdown " aria - haspopup = " true " aria - expanded = " false " > < i class = " fa fa-user-circle " ></ i > < ? php if ( isset ( $_SESSION [ FM_SESSION_ID ][ 'logged' ])) { echo $_SESSION [ FM_SESSION_ID ][ 'logged' ]; } ?> </a>
2018-11-14 12:37:16 +01:00
< div class = " dropdown-menu dropdown-menu-right " aria - labelledby = " navbarDropdownMenuLink-5 " >
2018-11-26 19:17:58 +01:00
< ? php if ( ! FM_READONLY ) : ?>
< a title = " <?php echo lng('Settings') ?> " class = " dropdown-item nav-link " href = " ?p=<?php echo urlencode(FM_PATH) ?>&settings=1 " >< i class = " fa fa-cog " aria - hidden = " true " ></ i > < ? php echo lng ( 'Settings' ) ?> </a>
< ? php endif ?>
< a title = " <?php echo lng('Logout') ?> " class = " dropdown-item nav-link " href = " ?logout=1 " >< i class = " fa fa-sign-out " aria - hidden = " true " ></ i > < ? php echo lng ( 'Logout' ) ?> </a>
2018-11-14 12:37:16 +01:00
</ div >
2018-10-10 19:27:25 +02:00
</ li >
2018-11-15 13:34:40 +01:00
< ? php endif ; ?>
2018-10-10 19:27:25 +02:00
</ ul >
</ div >
2017-07-05 08:50:07 +02:00
</ div >
2018-10-10 19:27:25 +02:00
</ nav >
< ? php
2017-07-05 08:50:07 +02:00
}
/**
* Show message from session
*/
function fm_show_message ()
{
2018-12-13 19:32:25 +01:00
if ( isset ( $_SESSION [ FM_SESSION_ID ][ 'message' ])) {
$class = isset ( $_SESSION [ FM_SESSION_ID ][ 'status' ]) ? $_SESSION [ FM_SESSION_ID ][ 'status' ] : 'ok' ;
echo '<p class="message ' . $class . '">' . $_SESSION [ FM_SESSION_ID ][ 'message' ] . '</p>' ;
unset ( $_SESSION [ FM_SESSION_ID ][ 'message' ]);
unset ( $_SESSION [ FM_SESSION_ID ][ 'status' ]);
2017-07-05 08:50:07 +02:00
}
}
2017-11-06 12:48:05 +01:00
/**
* Show page header in Login Form
*/
function fm_show_header_login ()
{
2018-10-10 19:27:25 +02:00
$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 " );
2017-11-06 12:48:05 +01:00
2018-10-10 19:27:25 +02:00
global $lang ;
?>
2018-11-26 19:17:58 +01:00
<! DOCTYPE html >
2018-10-10 19:27:25 +02:00
< html lang = " en " >
2017-11-06 12:48:05 +01:00
< head >
2018-10-10 19:27:25 +02:00
< meta charset = " utf-8 " >
< meta name = " viewport " content = " width=device-width, initial-scale=1, shrink-to-fit=no " >
< meta name = " description " content = " Web based File Manager in PHP, Manage your files efficiently and easily with Tiny File Manager " >
< meta name = " author " content = " CCP Programmers " >
2018-10-16 10:01:39 +02:00
< meta name = " robots " content = " noindex, nofollow " >
< meta name = " googlebot " content = " noindex " >
2018-11-26 19:17:58 +01:00
< link rel = " icon " href = " <?php echo FM_SELF_URL ?>?img=favicon " type = " image/png " >
2018-10-18 11:03:22 +02:00
< title > H3K | Tiny File Manager </ title >
2018-10-10 19:27:25 +02:00
< link rel = " stylesheet " href = " https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css " >
< style >
2018-11-26 19:17:58 +01:00
body . fm - login - page { background - color : #f7f9fb;font-size:14px}
. fm - login - page . brand { width : 121 px ; overflow : hidden ; margin : 0 auto ; margin : 40 px auto ; margin - bottom : 0 ; position : relative ; z - index : 1 }
. fm - login - page . brand img { width : 100 % }
. fm - login - page . card - wrapper { width : 360 px }
. fm - login - page . card { border - color : transparent ; box - shadow : 0 4 px 8 px rgba ( 0 , 0 , 0 , . 05 )}
. fm - login - page . card - title { margin - bottom : 1.5 rem ; font - size : 24 px ; font - weight : 300 ; letter - spacing :-. 5 px }
. fm - login - page . form - control { border - width : 2.3 px }
. fm - login - page . form - group label { width : 100 % }
. fm - login - page . btn . btn - block { padding : 12 px 10 px }
. fm - login - page . footer { margin : 40 px 0 ; color : #888;text-align:center}
2018-11-14 12:37:16 +01:00
@ media screen and ( max - width : 425 px ) {
2018-11-26 19:17:58 +01:00
. fm - login - page . card - wrapper { width : 90 % ; margin : 0 auto }
2018-11-14 12:37:16 +01:00
}
@ media screen and ( max - width : 320 px ) {
2018-11-26 19:17:58 +01:00
. fm - login - page . card . fat { padding : 0 }
. fm - login - page . card . fat . card - body { padding : 15 px }
2018-10-10 19:27:25 +02:00
}
2018-11-26 19:17:58 +01:00
. message { padding : 4 px 7 px ; border : 1 px solid #ddd;background-color:#fff}
. message . ok { border - color : green ; color : green }
. message . error { border - color : red ; color : red }
. message . alert { border - color : orange ; color : orange }
2018-10-10 19:27:25 +02:00
</ style >
2017-11-06 12:48:05 +01:00
</ head >
2018-11-14 12:37:16 +01:00
< body class = " fm-login-page " >
2018-10-10 19:27:25 +02:00
< div id = " wrapper " class = " container-fluid " >
2017-11-06 12:48:05 +01:00
2018-10-10 19:27:25 +02:00
< ? php
}
2017-11-06 12:48:05 +01:00
2018-10-10 19:27:25 +02:00
/**
* Show page footer in Login Form
*/
function fm_show_footer_login ()
{
2017-11-06 12:48:05 +01:00
?>
</ div >
2018-10-16 09:35:55 +02:00
< script src = " https://code.jquery.com/jquery-3.2.1.slim.min.js " ></ script >
< script src = " https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js " ></ script >
2017-11-06 12:48:05 +01:00
</ body >
</ html >
< ? php
}
2017-07-05 08:50:07 +02:00
/**
2018-10-10 19:27:25 +02:00
* Show Header after login
2017-07-05 08:50:07 +02:00
*/
function fm_show_header ()
{
2018-10-10 19:27:25 +02:00
$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 " );
2017-09-20 12:08:48 +02:00
2018-12-22 10:21:06 +01:00
global $lang , $sticky_navbar ;
$isStickyNavBar = $sticky_navbar ? 'navbar-fixed' : 'navbar-normal' ;
2018-10-10 19:27:25 +02:00
?>
2018-11-26 19:17:58 +01:00
<! DOCTYPE html >
2017-07-05 08:50:07 +02:00
< html >
< head >
2018-10-10 19:27:25 +02:00
< meta charset = " utf-8 " >
< meta name = " viewport " content = " width=device-width, initial-scale=1, shrink-to-fit=no " >
< meta name = " description " content = " Web based File Manager in PHP, Manage your files efficiently and easily with Tiny File Manager " >
< meta name = " author " content = " CCP Programmers " >
2018-10-16 10:01:39 +02:00
< meta name = " robots " content = " noindex, nofollow " >
< meta name = " googlebot " content = " noindex " >
2018-11-26 19:17:58 +01:00
< link rel = " icon " href = " <?php echo FM_SELF_URL ?>?img=favicon " type = " image/png " >
2018-10-18 11:03:22 +02:00
< title > H3K | Tiny File Manager </ title >
2018-10-10 19:27:25 +02:00
< link rel = " stylesheet " href = " https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css " >
2018-12-03 19:28:25 +01:00
< link rel = " stylesheet " href = " https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css " >
2018-10-10 19:27:25 +02:00
< ? php if ( isset ( $_GET [ 'view' ]) && FM_USE_HIGHLIGHTJS ) : ?>
2018-11-26 19:17:58 +01:00
< link rel = " stylesheet " href = " https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.13.1/styles/<?php echo FM_HIGHLIGHTJS_STYLE ?>.min.css " >
2018-10-10 19:27:25 +02:00
< ? php endif ; ?>
< style >
body {
2018-11-26 19:17:58 +01:00
font - size : 14 px ;
2018-10-10 19:27:25 +02:00
color : #222;
background : #F7F7F7;
}
2018-12-22 10:21:06 +01:00
body . navbar - fixed {
margin - top : 55 px ;
}
2018-11-26 19:17:58 +01:00
a : hover , a : visited , a : focus {
text - decoration : none ! important ;
}
2018-11-14 12:37:16 +01:00
. filename , td , th {
white - space : nowrap
}
2018-10-10 19:27:25 +02:00
. navbar - brand {
font - weight : bold ;
}
2018-11-14 12:37:16 +01:00
. nav - item . avatar a {
cursor : pointer ;
text - transform : capitalize ;
}
. nav - item . avatar a > i {
font - size : 15 px ;
}
. nav - item . avatar . dropdown - menu a {
font - size : 13 px ;
}
2018-11-26 19:17:58 +01:00
#search-addon {
font - size : 12 px ;
border - right - width : 0 ;
}
2018-11-14 12:37:16 +01:00
#search-addon2 {
background : transparent ;
border - left : 0 ;
}
2018-11-26 19:17:58 +01:00
. bread - crumb {
color : #cccccc;
font - style : normal ;
}
#main-table .filename a {
color : #222222;
2018-10-10 19:27:25 +02:00
}
. table td , . table th {
vertical - align : middle ! important ;
}
2018-11-26 19:17:58 +01:00
. table . custom - checkbox - td . custom - control . custom - checkbox , . table . custom - checkbox - header . custom - control . custom - checkbox {
padding : 0 ;
2018-12-01 09:28:28 +01:00
min - width : 18 px ;
2018-11-26 19:17:58 +01:00
}
2018-10-10 19:27:25 +02:00
. hidden {
display : none
}
pre . with - hljs {
padding : 0
}
pre . with - hljs code {
margin : 0 ;
border : 0 ;
overflow : visible
}
code . maxheight , pre . maxheight {
max - height : 512 px
}
. fa . fa - caret - right {
font - size : 1.2 em ;
margin : 0 4 px ;
vertical - align : middle ;
color : #ececec
}
. fa . fa - home {
2018-11-26 19:17:58 +01:00
font - size : 1.3 em ;
2018-10-10 19:27:25 +02:00
vertical - align : bottom
}
. path {
margin - bottom : 10 px
}
2018-11-14 12:37:16 +01:00
form . dropzone {
min - height : 200 px ;
border : 2 px dashed #007bff;
line - height : 6 rem ;
}
2018-10-10 19:27:25 +02:00
. right {
text - align : right
}
. center , . close , . login - form {
text - align : center
}
. message {
padding : 4 px 7 px ;
border : 1 px solid #ddd;
background - color : #fff
}
. message . ok {
border - color : green ;
color : green
}
. message . error {
border - color : red ;
color : red
}
. message . alert {
border - color : orange ;
color : orange
}
. preview - img {
max - width : 100 % ;
background : url ( data : image / png ; base64 , iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAKklEQVR42mL5 //8/Azbw+PFjrOJMDCSCUQ3EABZc4S0rKzsaSvTTABBgAMyfCMsY4B9iAAAAAElFTkSuQmCC)
}
. inline - actions > a > i {
font - size : 1 em ;
margin - left : 5 px ;
background : #3785c1;
color : #fff;
padding : 3 px ;
border - radius : 3 px
}
. preview - video {
position : relative ;
max - width : 100 % ;
height : 0 ;
padding - bottom : 62.5 % ;
margin - bottom : 10 px
}
. preview - video video {
position : absolute ;
width : 100 % ;
height : 100 % ;
left : 0 ;
top : 0 ;
background : #000
}
. compact - table {
border : 0 ;
width : auto
}
. compact - table td , . compact - table th {
width : 100 px ;
border : 0 ;
text - align : center
}
. compact - table tr : hover td {
background - color : #fff
}
. filename {
max - width : 420 px ;
overflow : hidden ;
text - overflow : ellipsis
}
. break - word {
word - wrap : break - word ;
margin - left : 30 px
}
. break - word . float - left a {
color : #7d7d7d
}
. break - word + . float - right {
padding - right : 30 px ;
position : relative
}
. break - word + . float - right > a {
color : #7d7d7d;
font - size : 1.2 em ;
margin - right : 4 px
}
2018-12-01 09:28:28 +01:00
#editor {
2018-10-10 19:27:25 +02:00
position : absolute ;
2018-12-03 19:28:25 +01:00
right : 15 px ;
2018-12-01 09:28:28 +01:00
top : 100 px ;
2018-12-03 19:28:25 +01:00
bottom : 15 px ;
left : 15 px
2018-10-10 19:27:25 +02:00
}
2018-12-01 09:28:28 +01:00
@ media ( max - width : 481 px ) {
#editor {
top : 150 px ;
}
}
2018-11-20 13:22:13 +01:00
#normal-editor {
border - radius : 3 px ;
border - width : 2 px ;
padding : 10 px ;
outline : none ;
}
2018-10-10 19:27:25 +02:00
. btn - 2 {
border - radius : 0 ;
padding : 3 px 6 px ;
font - size : small ;
}
li . file : before , li . folder : before {
font : normal normal normal 14 px / 1 FontAwesome ;
content : " \ f016 " ;
margin - right : 5 px
}
li . folder : before {
content : " \ f114 "
}
i . fa . fa - folder - o {
2018-11-26 19:17:58 +01:00
color : #0157b3
2018-10-10 19:27:25 +02:00
}
i . fa . fa - picture - o {
color : #26b99a
}
i . fa . fa - file - archive - o {
color : #da7d7d
}
. btn - 2 i . fa . fa - file - archive - o {
color : inherit ;
}
i . fa . fa - css3 {
color : #f36fa0
}
i . fa . fa - file - code - o {
2018-11-26 19:17:58 +01:00
color : #007bff
2018-10-10 19:27:25 +02:00
}
i . fa . fa - code {
color : #cc4b4c
}
i . fa . fa - file - text - o {
color : #0096e6
}
i . fa . fa - html5 {
color : #d75e72
}
i . fa . fa - file - excel - o {
color : #09c55d
}
i . fa . fa - file - powerpoint - o {
color : #f6712e
}
2018-11-26 19:17:58 +01:00
i . go - back {
font - size : 1.2 em ;
color : #007bff;
}
2018-10-10 19:27:25 +02:00
. main - nav {
2018-11-26 19:17:58 +01:00
padding : 0.2 rem 1 rem ;
2018-10-10 19:27:25 +02:00
box - shadow : 0 4 px 5 px 0 rgba ( 0 , 0 , 0 , . 14 ), 0 1 px 10 px 0 rgba ( 0 , 0 , 0 , . 12 ), 0 2 px 4 px - 1 px rgba ( 0 , 0 , 0 , . 2 )
}
2018-11-02 09:50:13 +01:00
. dataTables_filter {
display : none ;
}
table . dataTable thead . sorting {
cursor : pointer ;
background - repeat : no - repeat ;
background - position : center right ;
2018-11-26 19:17:58 +01:00
background - image : url ( 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC' );
2018-11-02 09:50:13 +01:00
}
table . dataTable thead . sorting_asc {
cursor : pointer ;
background - repeat : no - repeat ;
background - position : center right ;
2018-11-26 19:17:58 +01:00
background - image : url ( 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==' );
2018-11-02 09:50:13 +01:00
}
table . dataTable thead . sorting_desc {
cursor : pointer ;
background - repeat : no - repeat ;
background - position : center right ;
2018-11-26 19:17:58 +01:00
background - image : url ( 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=' );
2018-11-02 09:50:13 +01:00
}
2018-11-26 19:17:58 +01:00
table . dataTable thead tr : first - child th . custom - checkbox - header : first - child {
2018-11-02 09:50:13 +01:00
background - image : none ;
}
2018-10-10 19:27:25 +02:00
. footer - action li {
margin - bottom : 10 px ;
}
2018-11-26 19:17:58 +01:00
. app - v - title {
font - size : 24 px ;
font - weight : 300 ;
letter - spacing : -. 5 px ;
text - transform : uppercase ;
}
hr . custom - hr {
border - top : 1 px dashed #8c8b8b;
border - bottom : 1 px dashed #fff;
}
2018-12-03 19:28:25 +01:00
. btn . active . focus ,
. btn . active : focus ,
. btn . focus ,
. btn . focus : active ,
. btn : active : focus ,
. btn : focus {
outline : 0 ! important ;
outline - offset : 0 ! important ;
background - image : none ! important ;
- webkit - box - shadow : none ! important ;
box - shadow : none ! important ;
}
2018-12-12 20:08:16 +01:00
. lds - facebook {
display : none ;
position : relative ;
width : 64 px ;
height : 64 px ;
}
. lds - facebook . show - me { display : inline - block ;}
. lds - facebook div {
display : inline - block ;
position : absolute ;
left : 6 px ;
width : 13 px ;
background : #007bff;
animation : lds - facebook 1.2 s cubic - bezier ( 0 , 0.5 , 0.5 , 1 ) infinite ;
}
. lds - facebook div : nth - child ( 1 ) {
left : 6 px ;
animation - delay : - 0.24 s ;
}
. lds - facebook div : nth - child ( 2 ) {
left : 26 px ;
animation - delay : - 0.12 s ;
}
. lds - facebook div : nth - child ( 3 ) {
left : 45 px ;
animation - delay : 0 ;
}
@ keyframes lds - facebook {
0 % {
top : 6 px ;
height : 51 px ;
}
50 % , 100 % {
top : 19 px ;
height : 26 px ;
}
}
2018-10-10 19:27:25 +02:00
</ style >
2017-07-05 08:50:07 +02:00
</ head >
2018-12-22 10:21:06 +01:00
< body class = " <?php echo $isStickyNavBar ; ?> " >
2018-10-10 19:27:25 +02:00
< div id = " wrapper " class = " container-fluid " >
<!-- New Item creation -->
< div class = " modal fade " id = " createNewItem " tabindex = " -1 " role = " dialog " aria - label = " newItemModalLabel " aria - hidden = " true " >
< div class = " modal-dialog " role = " document " >
< div class = " modal-content " >
< div class = " modal-header " >
2018-11-26 19:17:58 +01:00
< h5 class = " modal-title " id = " newItemModalLabel " >< i class = " fa fa-plus-square fa-fw " ></ i >< ? php echo lng ( 'CreateNewItem' ) ?> </h5>
2018-10-10 19:27:25 +02:00
< button type = " button " class = " close " data - dismiss = " modal " aria - label = " Close " >
< span aria - hidden = " true " >& times ; </ span >
</ button >
</ div >
< div class = " modal-body " >
2018-11-26 19:17:58 +01:00
< p >< label for = " newfile " >< ? php echo lng ( 'ItemType' ) ?> </label></p>
2018-10-10 19:27:25 +02:00
< div class = " custom-control custom-radio custom-control-inline " >
< input type = " radio " id = " customRadioInline1 " name = " newfile " value = " file " class = " custom-control-input " >
2018-11-26 19:17:58 +01:00
< label class = " custom-control-label " for = " customRadioInline1 " >< ? php echo lng ( 'File' ) ?> </label>
2018-10-10 19:27:25 +02:00
</ div >
< div class = " custom-control custom-radio custom-control-inline " >
< input type = " radio " id = " customRadioInline2 " name = " newfile " value = " folder " class = " custom-control-input " checked = " " >
2018-11-26 19:17:58 +01:00
< label class = " custom-control-label " for = " customRadioInline2 " >< ? php echo lng ( 'Folder' ) ?> </label>
2018-10-10 19:27:25 +02:00
</ div >
2018-11-26 19:17:58 +01:00
< p class = " mt-3 " >< label for = " newfilename " >< ? php echo lng ( 'ItemName' ) ?> </label></p>
2018-10-10 19:27:25 +02:00
< input type = " text " name = " newfilename " id = " newfilename " value = " " class = " form-control " >
</ div >
< div class = " modal-footer " >
2018-11-26 19:17:58 +01:00
< button type = " button " class = " btn btn-outline-primary " data - dismiss = " modal " >< i class = " fa fa-times-circle " ></ i > < ? php echo lng ( 'Cancel' ) ?> </button>
< button type = " button " class = " btn btn-success " onclick = " newfolder('<?php echo fm_enc(FM_PATH) ?>');return false; " >< i class = " fa fa-check-circle " ></ i > < ? php echo lng ( 'CreateNow' ) ?> </button>
2018-10-10 19:27:25 +02:00
</ div >
</ div >
</ div >
</ div >
2017-07-05 08:50:07 +02:00
2018-10-10 19:27:25 +02:00
< ? php
}
/**
* Show page footer
*/
function fm_show_footer ()
{
2017-07-05 08:50:07 +02:00
?>
</ div >
2018-11-02 09:50:13 +01:00
< script src = " https://code.jquery.com/jquery-3.2.1.min.js " ></ script >
2018-10-10 19:27:25 +02:00
< script src = " https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js " ></ script >
2018-11-02 09:50:13 +01:00
< script src = " https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js " ></ script >
2017-07-05 08:50:07 +02:00
< script >
2018-10-10 19:27:25 +02:00
/**
* Create new Folder / file
* @ param path { String }
*/
function newfolder ( e ) {
2018-12-12 20:08:16 +01:00
var t = document . getElementById ( " newfilename " ) . value , n = document . querySelector ( 'input[name="newfile"]:checked' ) . value ;
2018-10-10 19:27:25 +02:00
null !== t && " " !== t && n && ( window . location . hash = " # " , window . location . search = " p= " + encodeURIComponent ( e ) + " &new= " + encodeURIComponent ( t ) + " &type= " + encodeURIComponent ( n ))
}
2018-12-12 20:08:16 +01:00
function rename ( e , t ) { var n = prompt ( " New name " , t ); null !== n && " " !== n && n != t && ( window . location . search = " p= " + encodeURIComponent ( e ) + " &ren= " + encodeURIComponent ( t ) + " &to= " + encodeURIComponent ( n ))}
function change_checkboxes ( e , t ) { for ( var n = e . length - 1 ; n >= 0 ; n -- ) e [ n ] . checked = " boolean " == typeof t ? t : ! e [ n ] . checked }
function get_checkboxes () { for ( var e = document . getElementsByName ( " file[] " ), t = [], n = e . length - 1 ; n >= 0 ; n -- ) ( e [ n ] . type = " checkbox " ) && t . push ( e [ n ]); return t }
function select_all () { change_checkboxes ( get_checkboxes (), ! 0 ) }
function unselect_all () { change_checkboxes ( get_checkboxes (), ! 1 ) }
function invert_all () { change_checkboxes ( get_checkboxes ()) }
function checkbox_toggle () { var e = get_checkboxes (); e . push ( this ), change_checkboxes ( e ) }
function backup ( e , t ) { //Create file backup with .bck
2018-10-10 19:27:25 +02:00
var n = new XMLHttpRequest ,
a = " path= " + e + " &file= " + t + " &type=backup&ajax=true " ;
return n . open ( " POST " , " " , ! 0 ), n . setRequestHeader ( " Content-type " , " application/x-www-form-urlencoded " ), n . onreadystatechange = function () {
4 == n . readyState && 200 == n . status && alert ( n . responseText )
}, n . send ( a ), ! 1
}
2018-11-02 09:50:13 +01:00
//Save file
2018-10-10 19:27:25 +02:00
function edit_save ( e , t ) {
var n = " ace " == t ? editor . getSession () . getValue () : document . getElementById ( " normal-editor " ) . value ;
if ( n ) {
var a = document . createElement ( " form " );
a . setAttribute ( " method " , " POST " ), a . setAttribute ( " action " , " " );
var o = document . createElement ( " textarea " );
o . setAttribute ( " type " , " textarea " ), o . setAttribute ( " name " , " savedata " );
var c = document . createTextNode ( n );
o . appendChild ( c ), a . appendChild ( o ), document . body . appendChild ( a ), a . submit ()
}
}
2018-12-12 20:08:16 +01:00
//Get latest release from git repo
2018-11-26 19:17:58 +01:00
function latest_release_info () {
$ . getJSON ( " https://api.github.com/repos/prasathmani/tinyfilemanager/releases/latest " ) . done ( function ( release ) {
if ( release ) {
let _html = '<button type="button" class="btn btn-light"> Download ' + release . name + '<span class="badge badge-light"> ' + release . tag_name + '</span></button>' +
'<div class="btn-group" role="group" aria-label="Download latest">\n' +
'<a href="' + release . zipball_url + '"target="_blank" class="btn btn-outline-secondary">Zip</a>\n' +
'<a href="' + release . tarball_url + '" target="_blank" class="btn btn-outline-secondary">Tar</a></div>' ;
$ ( " #js-download-latest " ) . html ( _html );
}
});
}
2018-12-13 20:50:25 +01:00
function show_new_pwd () { $ ( " .js-new-pwd " ) . toggleClass ( 'hidden' ); window . open ( " https://tinyfilemanager.github.io/docs/pwd.html " , '_blank' ); }
2018-12-12 20:08:16 +01:00
//Save Settings
2018-11-26 19:17:58 +01:00
function save_settings ( $this ) {
let form = $ ( $this );
$ . ajax ({
2018-12-12 20:08:16 +01:00
type : form . attr ( 'method' ), url : form . attr ( 'action' ), data : form . serialize () + " &ajax= " + true ,
success : function ( data ) { if ( data ) { window . location . reload ();}}
}); return false ;
2018-11-26 19:17:58 +01:00
}
2018-12-12 20:08:16 +01:00
//Create new password hash
2018-11-26 19:17:58 +01:00
function new_password_hash ( $this ) {
2018-12-12 20:08:16 +01:00
let form = $ ( $this ), $pwd = $ ( " #js-pwd-result " ); $pwd . val ( '' );
2018-11-26 19:17:58 +01:00
$ . ajax ({
2018-12-12 20:08:16 +01:00
type : form . attr ( 'method' ), url : form . attr ( 'action' ), data : form . serialize () + " &ajax= " + true ,
success : function ( data ) { if ( data ) { $pwd . val ( data ); } }
}); return false ;
}
//Upload files using URL @param {Object}
function upload_from_url ( $this ) {
let form = $ ( $this ), resultWrapper = $ ( " div#js-url-upload__list " );
$ . ajax ({
type : form . attr ( 'method' ), url : form . attr ( 'action' ), data : form . serialize () + " &ajax= " + true ,
beforeSend : function () { form . find ( " input[name=uploadurl] " ) . attr ( " disabled " , " disabled " ); form . find ( " button " ) . hide (); form . find ( " .lds-facebook " ) . addClass ( 'show-me' ); },
2018-11-26 19:17:58 +01:00
success : function ( data ) {
if ( data ) {
2018-12-12 20:08:16 +01:00
data = JSON . parse ( data );
if ( data . done ) {
resultWrapper . append ( '<div class="alert alert-success row">Uploaded Successful: ' + data . done . name + '</div>' ); form . find ( " input[name=uploadurl] " ) . val ( '' );
} else if ( data [ 'fail' ]) { resultWrapper . append ( '<div class="alert alert-danger row">Error: ' + data . fail . message + '</div>' ); }
form . find ( " input[name=uploadurl] " ) . removeAttr ( " disabled " ); form . find ( " button " ) . show (); form . find ( " .lds-facebook " ) . removeClass ( 'show-me' );
2018-11-26 19:17:58 +01:00
}
2018-12-12 20:08:16 +01:00
},
error : function ( xhr ) {
form . find ( " input[name=uploadurl] " ) . removeAttr ( " disabled " ); form . find ( " button " ) . show (); form . find ( " .lds-facebook " ) . removeClass ( 'show-me' ); console . error ( xhr );
2018-11-26 19:17:58 +01:00
}
2018-12-12 20:08:16 +01:00
}); return false ;
2018-11-26 19:17:58 +01:00
}
2018-12-12 20:08:16 +01:00
// Dom Ready Event
2018-11-02 09:50:13 +01:00
$ ( document ) . ready ( function () {
//dataTable init
var $table = $ ( '#main-table' ),
tableLng = $table . find ( 'th' ) . length ,
2018-11-26 19:17:58 +01:00
_targets = ( tableLng && tableLng == 7 ) ? [ 0 , 4 , 5 , 6 ] : tableLng == 5 ? [ 0 , 4 ] : [ 3 ],
2018-12-12 20:08:16 +01:00
mainTable = $ ( '#main-table' ) . DataTable ({ " paging " : false , " info " : false , " columnDefs " : [{ " targets " : _targets , " orderable " : false }]
2018-11-02 09:50:13 +01:00
});
2018-12-12 20:08:16 +01:00
$ ( '#search-addon' ) . on ( 'keyup' , function () { //Search using custom input box
2018-11-02 09:50:13 +01:00
mainTable . search ( this . value ) . draw ();
});
2018-12-13 19:32:25 +01:00
//upload nav tabs
$ ( " .fm-upload-wrapper .card-header-tabs " ) . on ( " click " , 'a' , function ( e ){
e . preventDefault ();
let target = $ ( this ) . data ( 'target' );
$ ( " .fm-upload-wrapper .card-header-tabs a " ) . removeClass ( 'active' ); $ ( this ) . addClass ( 'active' );
$ ( " .fm-upload-wrapper .card-tabs-container " ) . addClass ( 'hidden' ); $ ( target ) . removeClass ( 'hidden' );
2018-12-12 20:08:16 +01:00
});
2018-11-02 09:50:13 +01:00
});
2017-07-05 08:50:07 +02:00
</ script >
< ? php if ( isset ( $_GET [ 'view' ]) && FM_USE_HIGHLIGHTJS ) : ?>
2018-11-14 12:37:16 +01:00
< script src = " https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.13.1/highlight.min.js " ></ script >
2018-10-10 19:27:25 +02:00
< script > hljs . initHighlightingOnLoad (); </ script >
2017-07-05 08:50:07 +02:00
< ? php endif ; ?>
< ? php if ( isset ( $_GET [ 'edit' ]) && isset ( $_GET [ 'env' ]) && FM_EDIT_FILE ) : ?>
2018-11-14 12:37:16 +01:00
< script src = " https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.1/ace.js " ></ script >
2018-12-03 19:28:25 +01:00
< script >
var editor = ace . edit ( " editor " );
editor . getSession () . setMode ( " ace/mode/javascript " );
//editor.setTheme("ace/theme/twilight"); //Dark Theme
function ace_commend ( cmd ) { editor . commands . exec ( cmd , editor ); }
editor . commands . addCommands ([{
2018-12-12 20:08:16 +01:00
name : 'save' , bindKey : { win : 'Ctrl-S' , mac : 'Command-S' },
exec : function ( editor ) { edit_save ( this , 'ace' ); }
2018-12-03 19:28:25 +01:00
},{
2018-12-12 20:08:16 +01:00
name : 'goToNo' , bindKey : { win : 'Ctrl-G' , mac : 'Command-G' },
2018-12-03 19:28:25 +01:00
exec : function ( editor ) {
let x = parseInt ( prompt ( " Enter a Line Number [1 - " + editor . session . getLength () + " ] " , " 1 " ), 10 );
editor . gotoLine ( x );
}
}]);
$ ( " .js-ace-toolbar " ) . on ( " click " , 'button' , function ( e ){
e . preventDefault ();
let cmdValue = $ ( this ) . attr ( " data-cmd " );
let editorOption = $ ( this ) . attr ( " data-option " );
if ( cmdValue && cmdValue != " none " ) {
ace_commend ( cmdValue );
} else if ( editorOption ) {
if ( editorOption == " fullscreen " ) {
( void 0 !== document . fullScreenElement && null === document . fullScreenElement || void 0 !== document . msFullscreenElement && null === document . msFullscreenElement || void 0 !== document . mozFullScreen &&! document . mozFullScreen || void 0 !== document . webkitIsFullScreen &&! document . webkitIsFullScreen )
&& ( editor . container . requestFullScreen ? editor . container . requestFullScreen () : editor . container . mozRequestFullScreen ? editor . container . mozRequestFullScreen () : editor . container . webkitRequestFullScreen ? editor . container . webkitRequestFullScreen ( Element . ALLOW_KEYBOARD_INPUT ) : editor . container . msRequestFullscreen && editor . container . msRequestFullscreen ());
} else if ( editorOption == " wrap " ) {
let wrapStatus = ( editor . getSession () . getUseWrapMode ()) ? false : true ;
editor . getSession () . setUseWrapMode ( wrapStatus );
} else if ( editorOption == " help " ) {
alert ( " Editor Shortcuts \n ------------------ \n Save (Ctrl + S) \n Find (Ctrl + F) \n Undo (Ctrl + Z) \n Redo (Ctrl + Y) \n Go to Line (Ctrl + G) \n More - https://github.com/ajaxorg/ace/wiki/Default-Keyboard-Shortcuts " );
}
}
});
$ ( " select#js-ace-mode, select#js-ace-theme " ) . on ( " change " , function ( e ){
e . preventDefault ();
2018-12-12 20:08:16 +01:00
let selectedValue = $ ( this ) . val (), selectionType = $ ( this ) . attr ( " data-type " );
2018-12-03 19:28:25 +01:00
if ( selectedValue && selectionType == " mode " ) {
editor . getSession () . setMode ( selectedValue );
} else if ( selectedValue && selectionType == " theme " ) {
editor . setTheme ( selectedValue );
}
});
</ script >
2017-07-05 08:50:07 +02:00
< ? php endif ; ?>
</ body >
</ html >
< ? php
}
/**
* Show image
* @ param string $img
*/
function fm_show_image ( $img )
{
$modified_time = gmdate ( 'D, d M Y 00:00:00' ) . ' GMT' ;
$expires_time = gmdate ( 'D, d M Y 00:00:00' , strtotime ( '+1 day' )) . ' GMT' ;
$img = trim ( $img );
$images = fm_get_images ();
$image = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAEElEQVR42mL4//8/A0CAAQAI/AL+26JNFgAAAABJRU5ErkJggg==' ;
if ( isset ( $images [ $img ])) {
$image = $images [ $img ];
}
$image = base64_decode ( $image );
if ( function_exists ( 'mb_strlen' )) {
$size = mb_strlen ( $image , '8bit' );
} else {
$size = strlen ( $image );
}
if ( function_exists ( 'header_remove' )) {
header_remove ( 'Cache-Control' );
header_remove ( 'Pragma' );
} else {
header ( 'Cache-Control:' );
header ( 'Pragma:' );
}
header ( 'Last-Modified: ' . $modified_time , true , 200 );
header ( 'Expires: ' . $expires_time );
header ( 'Content-Length: ' . $size );
header ( 'Content-Type: image/png' );
echo $image ;
exit ;
}
2018-11-26 19:17:58 +01:00
/**
* Language Translation System
* @ param string $txt
* @ return string
*/
function lng ( $txt ) {
global $lang ;
// English Language
$tr [ 'en' ][ 'AppName' ] = 'Tiny File Manager' ; $tr [ 'en' ][ 'AppTitle' ] = 'File Manager' ;
$tr [ 'en' ][ 'Login' ] = 'Sign in' ; $tr [ 'en' ][ 'Username' ] = 'Username' ;
$tr [ 'en' ][ 'Password' ] = 'Password' ; $tr [ 'en' ][ 'Logout' ] = 'Sign Out' ;
$tr [ 'en' ][ 'Move' ] = 'Move' ; $tr [ 'en' ][ 'Copy' ] = 'Copy' ;
$tr [ 'en' ][ 'Save' ] = 'Save' ; $tr [ 'en' ][ 'SelectAll' ] = 'Select all' ;
$tr [ 'en' ][ 'UnSelectAll' ] = 'Unselect all' ; $tr [ 'en' ][ 'File' ] = 'File' ;
$tr [ 'en' ][ 'Back' ] = 'Back' ; $tr [ 'en' ][ 'Size' ] = 'Size' ;
$tr [ 'en' ][ 'Perms' ] = 'Perms' ; $tr [ 'en' ][ 'Modified' ] = 'Modified' ;
$tr [ 'en' ][ 'Owner' ] = 'Owner' ; $tr [ 'en' ][ 'Search' ] = 'Search' ;
$tr [ 'en' ][ 'NewItem' ] = 'New Item' ; $tr [ 'en' ][ 'Folder' ] = 'Folder' ;
$tr [ 'en' ][ 'Delete' ] = 'Delete' ; $tr [ 'en' ][ 'Rename' ] = 'Rename' ;
$tr [ 'en' ][ 'CopyTo' ] = 'Copy to' ; $tr [ 'en' ][ 'DirectLink' ] = 'Direct link' ;
2018-12-25 17:18:41 +01:00
$tr [ 'en' ][ 'UploadingFiles' ] = 'Upload Files' ; $tr [ 'en' ][ 'ChangePermissions' ] = 'Change Permissions' ;
2018-11-26 19:17:58 +01:00
$tr [ 'en' ][ 'Copying' ] = 'Copying' ; $tr [ 'en' ][ 'CreateNewItem' ] = 'Create New Item' ;
$tr [ 'en' ][ 'Name' ] = 'Name' ; $tr [ 'en' ][ 'AdvancedEditor' ] = 'Advanced Editor' ;
$tr [ 'en' ][ 'RememberMe' ] = 'Remember Me' ; $tr [ 'en' ][ 'Actions' ] = 'Actions' ;
$tr [ 'en' ][ 'Upload' ] = 'Upload' ; $tr [ 'en' ][ 'Cancel' ] = 'Cancel' ;
$tr [ 'en' ][ 'InvertSelection' ] = 'Invert Selection' ; $tr [ 'en' ][ 'DestinationFolder' ] = 'Destination Folder' ;
$tr [ 'en' ][ 'ItemType' ] = 'Item Type' ; $tr [ 'en' ][ 'ItemName' ] = 'Item Name' ;
$tr [ 'en' ][ 'CreateNow' ] = 'Create Now' ; $tr [ 'en' ][ 'Download' ] = 'Download' ;
$tr [ 'en' ][ 'Open' ] = 'Open' ; $tr [ 'en' ][ 'UnZip' ] = 'UnZip' ;
$tr [ 'en' ][ 'UnZipToFolder' ] = 'UnZip to folder' ; $tr [ 'en' ][ 'Edit' ] = 'Edit' ;
$tr [ 'en' ][ 'NormalEditor' ] = 'Normal Editor' ; $tr [ 'en' ][ 'BackUp' ] = 'Back Up' ;
$tr [ 'en' ][ 'SourceFolder' ] = 'Source Folder' ; $tr [ 'en' ][ 'Files' ] = 'Files' ;
$tr [ 'en' ][ 'Move' ] = 'Move' ; $tr [ 'en' ][ 'Change' ] = 'Change' ;
$tr [ 'en' ][ 'Settings' ] = 'Settings' ; $tr [ 'en' ][ 'Language' ] = 'Language' ;
2018-12-25 17:18:41 +01:00
$tr [ 'en' ][ 'MemoryUsed' ] = 'Memory used' ; $tr [ 'en' ][ 'PartitionSize' ] = 'Partition size' ;
2018-11-26 19:17:58 +01:00
// French Language
$tr [ 'fr' ][ 'AppName' ] = 'Tiny File Manager' ; $tr [ 'fr' ][ 'AppTitle' ] = 'File Manager' ;
$tr [ 'fr' ][ 'Login' ] = 'Connexion' ; $tr [ 'fr' ][ 'Username' ] = 'Utilisateur' ;
$tr [ 'fr' ][ 'Password' ] = 'Mot de passe' ; $tr [ 'fr' ][ 'Logout' ] = 'Déconnexion' ;
$tr [ 'fr' ][ 'Move' ] = 'Déplacer' ; $tr [ 'fr' ][ 'Copy' ] = 'Copier' ;
$tr [ 'fr' ][ 'Save' ] = 'Sauvegarder' ; $tr [ 'fr' ][ 'SelectAll' ] = 'Tout sélectionner' ;
$tr [ 'fr' ][ 'UnSelectAll' ] = 'Tout déselectionner' ; $tr [ 'fr' ][ 'File' ] = 'Fichier' ;
$tr [ 'fr' ][ 'Back' ] = 'Retour' ; $tr [ 'fr' ][ 'Size' ] = 'Taille' ;
2018-11-29 17:31:57 +01:00
$tr [ 'fr' ][ 'Perms' ] = 'Perms' ; $tr [ 'fr' ][ 'Modified' ] = 'Modifié le' ;
2018-11-26 19:17:58 +01:00
$tr [ 'fr' ][ 'Owner' ] = 'Propriétaire' ; $tr [ 'fr' ][ 'Search' ] = 'Recherche' ;
2018-11-29 17:31:57 +01:00
$tr [ 'fr' ][ 'NewItem' ] = 'Nouvel Élément' ; $tr [ 'fr' ][ 'Folder' ] = 'Dossier' ;
2018-11-26 19:17:58 +01:00
$tr [ 'fr' ][ 'Delete' ] = 'Supprimer' ; $tr [ 'fr' ][ 'Rename' ] = 'Renommer' ;
$tr [ 'fr' ][ 'CopyTo' ] = 'Copier vers' ; $tr [ 'fr' ][ 'DirectLink' ] = 'Lien direct' ;
$tr [ 'fr' ][ 'UploadingFiles' ] = 'Envoyer des fichiers' ; $tr [ 'fr' ][ 'ChangePermissions' ] = 'Modifier les permissions' ;
$tr [ 'fr' ][ 'Copying' ] = 'Copier' ; $tr [ 'fr' ][ 'CreateNewItem' ] = 'Créer un nouvel élément' ;
$tr [ 'fr' ][ 'Name' ] = 'Nom' ; $tr [ 'fr' ][ 'AdvancedEditor' ] = 'Editeur avancé' ;
2018-11-29 17:31:57 +01:00
$tr [ 'fr' ][ 'RememberMe' ] = 'Se rappeler de moi' ; $tr [ 'fr' ][ 'Actions' ] = 'Actes' ;
2018-11-26 19:17:58 +01:00
$tr [ 'fr' ][ 'Upload' ] = 'Envoyer' ; $tr [ 'fr' ][ 'Cancel' ] = 'Annuler' ;
$tr [ 'fr' ][ 'InvertSelection' ] = 'Inverser la sélection' ; $tr [ 'fr' ][ 'DestinationFolder' ] = 'Dossier destination' ;
$tr [ 'fr' ][ 'ItemType' ] = 'Type d\'élement' ; $tr [ 'fr' ][ 'ItemName' ] = 'Nom de l\'élément' ;
$tr [ 'fr' ][ 'CreateNow' ] = 'Créer' ; $tr [ 'fr' ][ 'Download' ] = 'Télécharger' ;
$tr [ 'fr' ][ 'Open' ] = 'Ouvrir' ; $tr [ 'fr' ][ 'UnZip' ] = 'Décompressez' ;
2018-11-29 17:31:57 +01:00
$tr [ 'fr' ][ 'UnZipToFolder' ] = 'Décompresser dans un dossier' ; $tr [ 'fr' ][ 'Edit' ] = 'Editeur' ;
2018-11-26 19:17:58 +01:00
$tr [ 'fr' ][ 'NormalEditor' ] = 'Éditeur Normal' ; $tr [ 'fr' ][ 'BackUp' ] = 'Sauvegarder' ;
$tr [ 'fr' ][ 'SourceFolder' ] = 'Dossier Source' ; $tr [ 'fr' ][ 'Files' ] = 'Fichiers' ;
$tr [ 'fr' ][ 'Move' ] = 'Déplacer' ; $tr [ 'fr' ][ 'Change' ] = 'Modifier' ;
2018-11-29 17:31:57 +01:00
$tr [ 'fr' ][ 'Settings' ] = 'Réglages' ; $tr [ 'fr' ][ 'Language' ] = 'Langue' ;
2018-12-25 17:18:41 +01:00
$tr [ 'fr' ][ 'MemoryUsed' ] = 'Mémoire utilisée' ; $tr [ 'fr' ][ 'PartitionSize' ] = 'Taille de la partition' ;
2018-11-26 19:17:58 +01:00
2018-11-29 16:06:41 +01:00
// Italian Language
2018-11-29 19:20:44 +01:00
$tr [ 'it' ][ 'AppName' ] = 'Tiny File Manager' ; $tr [ 'it' ][ 'AppTitle' ] = 'File Manager' ;
$tr [ 'it' ][ 'Login' ] = 'Connettiti' ; $tr [ 'it' ][ 'Username' ] = 'Username' ;
$tr [ 'it' ][ 'Password' ] = 'Password' ; $tr [ 'it' ][ 'Logout' ] = 'Disconnettiti' ;
$tr [ 'it' ][ 'Move' ] = 'Sposta' ; $tr [ 'it' ][ 'Copy' ] = 'Copia' ;
$tr [ 'it' ][ 'Save' ] = 'Salva' ; $tr [ 'it' ][ 'SelectAll' ] = 'Seleziona tutto' ;
$tr [ 'it' ][ 'UnSelectAll' ] = 'Deseleziona tutto' ; $tr [ 'it' ][ 'File' ] = 'File' ;
$tr [ 'it' ][ 'Back' ] = 'Indietro' ; $tr [ 'it' ][ 'Size' ] = 'Dimensione' ;
$tr [ 'it' ][ 'Perms' ] = 'Permessi' ; $tr [ 'it' ][ 'Modified' ] = 'Modificato' ;
$tr [ 'it' ][ 'Owner' ] = 'Proprietario' ; $tr [ 'it' ][ 'Search' ] = 'Cerca' ;
$tr [ 'it' ][ 'NewItem' ] = 'Nuovo Elemento' ; $tr [ 'it' ][ 'Folder' ] = 'Cartella' ;
$tr [ 'it' ][ 'Delete' ] = 'Elimina' ; $tr [ 'it' ][ 'Rename' ] = 'Rinomina' ;
$tr [ 'it' ][ 'CopyTo' ] = 'Copia su' ; $tr [ 'it' ][ 'DirectLink' ] = 'Link diretto' ;
$tr [ 'it' ][ 'UploadingFiles' ] = 'Caricamento file' ; $tr [ 'it' ][ 'ChangePermissions' ] = 'Modifica Permessi' ;
$tr [ 'it' ][ 'Copying' ] = 'Copia in corso' ; $tr [ 'it' ][ 'CreateNewItem' ] = 'Crea Nuovo Elemento' ;
$tr [ 'it' ][ 'Name' ] = 'Nome' ; $tr [ 'it' ][ 'AdvancedEditor' ] = 'Editor Avanzato' ;
$tr [ 'it' ][ 'RememberMe' ] = 'Ricordami' ; $tr [ 'it' ][ 'Actions' ] = 'Azioni' ;
$tr [ 'it' ][ 'Upload' ] = 'Carica' ; $tr [ 'it' ][ 'Cancel' ] = 'Annulla' ;
$tr [ 'it' ][ 'InvertSelection' ] = 'Inverti Selezione' ; $tr [ 'it' ][ 'DestinationFolder' ] = 'Cartella di Destinazione' ;
$tr [ 'it' ][ 'ItemType' ] = 'Tipo Elemento' ; $tr [ 'it' ][ 'ItemName' ] = 'Nome Elemento' ;
$tr [ 'it' ][ 'CreateNow' ] = 'Crea Adesso' ; $tr [ 'it' ][ 'Download' ] = 'Scarica' ;
$tr [ 'it' ][ 'Open' ] = 'Apri' ; $tr [ 'it' ][ 'UnZip' ] = 'Decomprimi' ;
$tr [ 'it' ][ 'UnZipToFolder' ] = 'Decomprimi su cartella' ; $tr [ 'it' ][ 'Edit' ] = 'Modifica' ;
$tr [ 'it' ][ 'NormalEditor' ] = 'Editor Normale' ; $tr [ 'it' ][ 'BackUp' ] = 'Back-Up' ;
$tr [ 'it' ][ 'SourceFolder' ] = 'Cartella di Origine' ; $tr [ 'it' ][ 'Files' ] = 'File' ;
$tr [ 'it' ][ 'Move' ] = 'Sposta' ; $tr [ 'it' ][ 'Change' ] = 'Cambia' ;
2018-12-01 04:13:24 +01:00
$tr [ 'it' ][ 'Settings' ] = 'Impostazioni' ; $tr [ 'it' ][ 'Language' ] = 'Lingua' ;
2018-12-25 17:18:41 +01:00
$tr [ 'it' ][ 'MemoryUsed' ] = 'Memoria utilizzata' ; $tr [ 'it' ][ 'PartitionSize' ] = 'Dimensione della partizione' ;
2018-12-01 04:13:24 +01:00
2018-12-02 10:19:04 +01:00
// Russian Language
$tr [ 'ru' ][ 'AppName' ] = 'Файловый менеджер' ; $tr [ 'ru' ][ 'AppTitle' ] = 'Файловый менеджер' ;
$tr [ 'ru' ][ 'Login' ] = 'Войти' ; $tr [ 'ru' ][ 'Username' ] = 'Пользователь' ;
$tr [ 'ru' ][ 'Password' ] = 'Пароль' ; $tr [ 'ru' ][ 'Logout' ] = 'Выйти' ;
$tr [ 'ru' ][ 'Move' ] = 'Переместить' ; $tr [ 'ru' ][ 'Copy' ] = 'Копировать' ;
$tr [ 'ru' ][ 'Save' ] = 'Сохранить' ; $tr [ 'ru' ][ 'SelectAll' ] = 'Выбрать всё' ;
$tr [ 'ru' ][ 'UnSelectAll' ] = 'Отменить выбор' ; $tr [ 'ru' ][ 'File' ] = 'Файл' ;
$tr [ 'ru' ][ 'Back' ] = 'Вернуться' ; $tr [ 'ru' ][ 'Size' ] = 'Размер' ;
$tr [ 'ru' ][ 'Perms' ] = 'Права доступа' ; $tr [ 'ru' ][ 'Modified' ] = 'Обновление' ;
$tr [ 'ru' ][ 'Owner' ] = 'Создатель' ; $tr [ 'ru' ][ 'Search' ] = 'Поиск' ;
$tr [ 'ru' ][ 'NewItem' ] = 'Создать' ; $tr [ 'ru' ][ 'Folder' ] = 'Папка' ;
$tr [ 'ru' ][ 'Delete' ] = 'Удалить' ; $tr [ 'ru' ][ 'Rename' ] = 'Переименовать' ;
$tr [ 'ru' ][ 'CopyTo' ] = 'Скопировать в' ; $tr [ 'ru' ][ 'DirectLink' ] = 'Ссылка' ;
$tr [ 'ru' ][ 'UploadingFiles' ] = 'Загрузка файлов' ; $tr [ 'ru' ][ 'ChangePermissions' ] = 'Изменить права' ;
$tr [ 'ru' ][ 'Copying' ] = 'Копировать' ; $tr [ 'ru' ][ 'CreateNewItem' ] = 'Создать новый' ;
$tr [ 'ru' ][ 'Name' ] = 'Имя' ; $tr [ 'ru' ][ 'AdvancedEditor' ] = 'Улучшеный редактор' ;
$tr [ 'ru' ][ 'RememberMe' ] = 'Запомнить меня' ; $tr [ 'ru' ][ 'Actions' ] = 'Действия' ;
$tr [ 'ru' ][ 'Upload' ] = 'Загрузить' ; $tr [ 'ru' ][ 'Cancel' ] = 'Отмена' ;
$tr [ 'ru' ][ 'InvertSelection' ] = 'Обратная выборка' ; $tr [ 'ru' ][ 'DestinationFolder' ] = 'Папка назначения' ;
$tr [ 'ru' ][ 'ItemType' ] = 'Тип элемента' ; $tr [ 'ru' ][ 'ItemName' ] = 'Имя элемента' ;
$tr [ 'ru' ][ 'CreateNow' ] = 'Создать сейчас' ; $tr [ 'ru' ][ 'Download' ] = 'Загрузка' ;
$tr [ 'ru' ][ 'Open' ] = 'Открыть' ; $tr [ 'ru' ][ 'UnZip' ] = 'Разархивировать' ;
$tr [ 'ru' ][ 'UnZipToFolder' ] = 'Разархивировать в папку' ; $tr [ 'ru' ][ 'Edit' ] = 'Редактировать' ;
$tr [ 'ru' ][ 'NormalEditor' ] = 'Стандартный редактор' ; $tr [ 'ru' ][ 'BackUp' ] = 'Back Up' ;
$tr [ 'ru' ][ 'SourceFolder' ] = 'Путь папки' ; $tr [ 'ru' ][ 'Files' ] = 'Файлы' ;
$tr [ 'ru' ][ 'Move' ] = 'Переместить' ; $tr [ 'ru' ][ 'Change' ] = 'Изменения' ;
$tr [ 'ru' ][ 'Settings' ] = 'Свойства' ; $tr [ 'ru' ][ 'Language' ] = 'Язык' ;
2018-12-25 17:18:41 +01:00
$tr [ 'ru' ][ 'MemoryUsed' ] = 'Используемая память' ; $tr [ 'ru' ][ 'PartitionSize' ] = 'Размер раздела' ;
2018-12-02 10:19:04 +01:00
2018-11-26 19:17:58 +01:00
if ( ! strlen ( $lang )) $lang = 'en' ;
if ( isset ( $tr [ $lang ][ $txt ])) return fm_enc ( $tr [ $lang ][ $txt ]);
else if ( isset ( $tr [ 'en' ][ $txt ])) return fm_enc ( $tr [ 'en' ][ $txt ]);
else return " $txt " ;
}
2017-07-05 08:50:07 +02:00
/**
* Get base64 - encoded images
* @ return array
*/
function fm_get_images ()
{
return array (
2018-11-26 19:17:58 +01:00
'favicon' => ' Qk04AgAAAAAAADYAAAAoAAAAEAAAABAAAAABABAAAAAAAAICAAASCwAAEgsAAAAAAAAAAAAAIQQhBCEEIQQhBCEEIQQhBCEEIQ
QhBCEEIQQhBCEEIQQhBCEEIQQhBHNO3n / ef95 / vXetNSEEIQQhBCEEIQQhBCEEIQQhBCEEc07ef95 / 3 n / ef95 / 1 lohBCEEIQQhBCEEIQQhBCEEIQ
RzTt5 / 3 n8hBDFG3n / efyEEIQQhBCEEIQQhBCEEIQQhBHNO3n / efyEEMUbef95 / IQQhBCEEIQQhBCEEIQQhBCEErTVzTnNOIQQxRt5 / 3 n8hBCEEIQ
QhBCEEIQQhBCEEIQQhBCEEIQQhBDFG3n / efyEEIQQhBCEEIQQhBCEEIQQhBCEEIQQxRt5 / 3 n + cc2stIQQhBCEEIQQhBCEEIQQhBCEEIQQIIZxz3n
/ ef5xzay0hBCEEIQQhBCEEIQQhBCEEIQQhBCEEIQQhBDFG3n / efyEEIQQhBCEEIQQhBCEEIQQhBK01c05zTiEEMUbef95 / IQQhBCEEIQQhBCEEIQ
QhBCEEc07ef95 / IQQxRt5 / 3 n8hBCEEIQQhBCEEIQQhBCEEIQRzTt5 / 3 n8hBDFG3n / efyEEIQQhBCEEIQQhBCEEIQQhBKUUOWfef95 / 3 n / ef95 / IQ
QhBCEEIQQhBCEEIQQhBCEEIQQhBJRW3n / ef95 / 3 n8hBCEEIQQhBCEEIQQhBCEEIQQhBCEEIQQhBCEEIQQhBCEEIQQhBCEEIQQAAA == '
2017-07-05 08:50:07 +02:00
);
}
2018-10-10 19:27:25 +02:00
2017-11-06 12:48:05 +01:00
?>