| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | <?php | 
					
						
							|  |  |  | /******************************** | 
					
						
							|  |  |  | Simple PHP File Manager | 
					
						
							|  |  |  | Copyright John Campbell (jcampbell1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Liscense: MIT | 
					
						
							|  |  |  | ********************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 13:08:01 -05:00
										 |  |  | //Disable error report for undefined superglobals
 | 
					
						
							|  |  |  | error_reporting( error_reporting() & ~E_NOTICE ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 14:30:03 -05:00
										 |  |  | //Security options
 | 
					
						
							|  |  |  | $allow_delete = true; // Set to false to disable delete button and delete POST request.
 | 
					
						
							|  |  |  | $allow_upload = true; // Set to true to allow upload files
 | 
					
						
							| 
									
										
										
										
											2018-04-12 14:17:51 -04:00
										 |  |  | $allow_create_folder = true; // Set to false to disable folder creation
 | 
					
						
							| 
									
										
										
										
											2017-01-17 14:30:03 -05:00
										 |  |  | $allow_direct_link = true; // Set to false to only allow downloads and not direct link
 | 
					
						
							| 
									
										
										
										
											2018-07-14 00:32:24 +02:00
										 |  |  | $allow_show_folders = true; // Set to false to hide all subdirectories
 | 
					
						
							| 
									
										
										
										
											2016-06-22 10:37:55 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-19 08:57:36 +02:00
										 |  |  | $disallowed_extensions = ['php'];  // must be an array. Extensions disallowed to be uploaded
 | 
					
						
							| 
									
										
										
										
											2017-08-02 19:39:55 -04:00
										 |  |  | $hidden_extensions = ['php']; // must be an array of lowercase file extensions. Extensions hidden in directory index
 | 
					
						
							| 
									
										
										
										
											2017-04-18 23:02:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 12:35:36 -05:00
										 |  |  | $PASSWORD = '';  // Set the password, to access the file manager... (optional)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if($PASSWORD) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	session_start(); | 
					
						
							|  |  |  | 	if(!$_SESSION['_sfm_allowed']) { | 
					
						
							|  |  |  | 		// sha1, and random bytes to thwart timing attacks.  Not meant as secure hashing.
 | 
					
						
							| 
									
										
										
										
											2018-05-28 23:38:16 +02:00
										 |  |  | 		$t = bin2hex(openssl_random_pseudo_bytes(10)); | 
					
						
							| 
									
										
										
										
											2017-02-22 12:35:36 -05:00
										 |  |  | 		if($_POST['p'] && sha1($t.$_POST['p']) === sha1($t.$PASSWORD)) { | 
					
						
							|  |  |  | 			$_SESSION['_sfm_allowed'] = true; | 
					
						
							|  |  |  | 			header('Location: ?'); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-05-28 23:38:16 +02:00
										 |  |  | 		echo '<html><body><form action=? method=post>PASSWORD:<input type=password name=p /></form></body></html>'; | 
					
						
							| 
									
										
										
										
											2017-02-22 12:35:36 -05:00
										 |  |  | 		exit; | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // must be in UTF-8 or `basename` doesn't work
 | 
					
						
							|  |  |  | setlocale(LC_ALL,'en_US.UTF-8'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 12:55:28 -05:00
										 |  |  | $tmp_dir = dirname($_SERVER['SCRIPT_FILENAME']); | 
					
						
							| 
									
										
										
										
											2017-03-10 17:58:45 +08:00
										 |  |  | if(DIRECTORY_SEPARATOR==='\\') $tmp_dir = str_replace('/',DIRECTORY_SEPARATOR,$tmp_dir); | 
					
						
							| 
									
										
										
										
											2017-02-22 13:43:02 -05:00
										 |  |  | $tmp = get_absolute_path($tmp_dir . '/' .$_REQUEST['file']); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | if($tmp === false) | 
					
						
							|  |  |  | 	err(404,'File or Directory Not Found'); | 
					
						
							| 
									
										
										
										
											2017-02-22 12:55:28 -05:00
										 |  |  | if(substr($tmp, 0,strlen($tmp_dir)) !== $tmp_dir) | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	err(403,"Forbidden"); | 
					
						
							| 
									
										
										
										
											2018-05-28 23:38:16 +02:00
										 |  |  | if(strpos($_REQUEST['file'], DIRECTORY_SEPARATOR) === 0) | 
					
						
							| 
									
										
										
										
											2017-04-26 11:43:50 -04:00
										 |  |  | 	err(403,"Forbidden"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | if(!$_COOKIE['_sfm_xsrf']) | 
					
						
							|  |  |  | 	setcookie('_sfm_xsrf',bin2hex(openssl_random_pseudo_bytes(16))); | 
					
						
							|  |  |  | if($_POST) { | 
					
						
							|  |  |  | 	if($_COOKIE['_sfm_xsrf'] !== $_POST['xsrf'] || !$_POST['xsrf']) | 
					
						
							|  |  |  | 		err(403,"XSRF Failure"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $file = $_REQUEST['file'] ?: '.'; | 
					
						
							|  |  |  | if($_GET['do'] == 'list') { | 
					
						
							|  |  |  | 	if (is_dir($file)) { | 
					
						
							|  |  |  | 		$directory = $file; | 
					
						
							| 
									
										
										
										
											2017-02-22 13:26:44 -05:00
										 |  |  | 		$result = []; | 
					
						
							|  |  |  | 		$files = array_diff(scandir($directory), ['.','..']); | 
					
						
							| 
									
										
										
										
											2018-07-14 00:32:24 +02:00
										 |  |  | 		foreach ($files as $entry) if (!is_entry_ignored($entry)) { | 
					
						
							|  |  |  | 		$i = $directory . '/' . $entry; | 
					
						
							|  |  |  | 		$stat = stat($i); | 
					
						
							| 
									
										
										
										
											2017-02-22 13:26:44 -05:00
										 |  |  | 	        $result[] = [ | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	        	'mtime' => $stat['mtime'], | 
					
						
							|  |  |  | 	        	'size' => $stat['size'], | 
					
						
							|  |  |  | 	        	'name' => basename($i), | 
					
						
							|  |  |  | 	        	'path' => preg_replace('@^\./@', '', $i), | 
					
						
							|  |  |  | 	        	'is_dir' => is_dir($i), | 
					
						
							| 
									
										
										
										
											2016-06-22 10:37:55 -05:00
										 |  |  | 	        	'is_deleteable' => $allow_delete && ((!is_dir($i) && is_writable($directory)) || | 
					
						
							|  |  |  |                                                            (is_dir($i) && is_writable($directory) && is_recursively_deleteable($i))), | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	        	'is_readable' => is_readable($i), | 
					
						
							|  |  |  | 	        	'is_writable' => is_writable($i), | 
					
						
							|  |  |  | 	        	'is_executable' => is_executable($i), | 
					
						
							| 
									
										
										
										
											2017-02-22 13:26:44 -05:00
										 |  |  | 	        ]; | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	    } | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		err(412,"Not a Directory"); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-02-22 13:26:44 -05:00
										 |  |  | 	echo json_encode(['success' => true, 'is_writable' => is_writable($file), 'results' =>$result]); | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	exit; | 
					
						
							|  |  |  | } elseif ($_POST['do'] == 'delete') { | 
					
						
							| 
									
										
										
										
											2016-06-22 10:37:55 -05:00
										 |  |  | 	if($allow_delete) { | 
					
						
							|  |  |  | 		rmrf($file); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	exit; | 
					
						
							| 
									
										
										
										
											2018-04-12 14:21:26 -04:00
										 |  |  | } elseif ($_POST['do'] == 'mkdir' && $allow_create_folder) { | 
					
						
							| 
									
										
										
										
											2016-01-14 17:05:32 +01:00
										 |  |  | 	// don't allow actions outside root. we also filter out slashes to catch args like './../outside'
 | 
					
						
							|  |  |  | 	$dir = $_POST['name']; | 
					
						
							|  |  |  | 	$dir = str_replace('/', '', $dir); | 
					
						
							|  |  |  | 	if(substr($dir, 0, 2) === '..') | 
					
						
							|  |  |  | 	    exit; | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	chdir($file); | 
					
						
							|  |  |  | 	@mkdir($_POST['name']); | 
					
						
							|  |  |  | 	exit; | 
					
						
							| 
									
										
										
										
											2018-04-12 10:21:48 -04:00
										 |  |  | } elseif ($_POST['do'] == 'upload' && $allow_upload) { | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	var_dump($_POST); | 
					
						
							|  |  |  | 	var_dump($_FILES); | 
					
						
							|  |  |  | 	var_dump($_FILES['file_data']['tmp_name']); | 
					
						
							| 
									
										
										
										
											2018-05-28 23:38:16 +02:00
										 |  |  | 	foreach($disallowed_extensions as $ext) | 
					
						
							|  |  |  | 		if(preg_match(sprintf('/\.%s$/',preg_quote($ext)), $_FILES['file_data']['name'])) | 
					
						
							| 
									
										
										
										
											2017-02-22 13:22:04 -05:00
										 |  |  | 			err(403,"Files of this type are not allowed."); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	var_dump(move_uploaded_file($_FILES['file_data']['tmp_name'], $file.'/'.$_FILES['file_data']['name'])); | 
					
						
							|  |  |  | 	exit; | 
					
						
							|  |  |  | } elseif ($_GET['do'] == 'download') { | 
					
						
							|  |  |  | 	$filename = basename($file); | 
					
						
							|  |  |  | 	header('Content-Type: ' . mime_content_type($file)); | 
					
						
							|  |  |  | 	header('Content-Length: '. filesize($file)); | 
					
						
							|  |  |  | 	header(sprintf('Content-Disposition: attachment; filename=%s', | 
					
						
							|  |  |  | 		strpos('MSIE',$_SERVER['HTTP_REFERER']) ? rawurlencode($filename) : "\"$filename\"" ));
 | 
					
						
							|  |  |  | 	ob_flush(); | 
					
						
							|  |  |  | 	readfile($file); | 
					
						
							|  |  |  | 	exit; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-07-14 00:32:24 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | function is_entry_ignored($entry) { | 
					
						
							|  |  |  | 	if ($entry === basename(__FILE__)) { | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	global $allow_show_folders; | 
					
						
							|  |  |  | 	if (is_dir($entry) && !$allow_show_folders) { | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$ext = strtolower(pathinfo($entry, PATHINFO_EXTENSION)); | 
					
						
							|  |  |  | 	if (in_array($ext, $hidden_extensions)) { | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | function rmrf($dir) { | 
					
						
							|  |  |  | 	if(is_dir($dir)) { | 
					
						
							| 
									
										
										
										
											2017-02-22 13:26:44 -05:00
										 |  |  | 		$files = array_diff(scandir($dir), ['.','..']); | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 		foreach ($files as $file) | 
					
						
							|  |  |  | 			rmrf("$dir/$file"); | 
					
						
							|  |  |  | 		rmdir($dir); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		unlink($dir); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | function is_recursively_deleteable($d) { | 
					
						
							| 
									
										
										
										
											2017-02-22 13:26:44 -05:00
										 |  |  | 	$stack = [$d]; | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	while($dir = array_pop($stack)) { | 
					
						
							| 
									
										
										
										
											2018-05-28 23:38:16 +02:00
										 |  |  | 		if(!is_readable($dir) || !is_writable($dir)) | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 			return false; | 
					
						
							| 
									
										
										
										
											2017-02-22 13:26:44 -05:00
										 |  |  | 		$files = array_diff(scandir($dir), ['.','..']); | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 		foreach($files as $file) if(is_dir($file)) { | 
					
						
							|  |  |  | 			$stack[] = "$dir/$file"; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 13:43:02 -05:00
										 |  |  | // from: http://php.net/manual/en/function.realpath.php#84012
 | 
					
						
							|  |  |  | function get_absolute_path($path) { | 
					
						
							|  |  |  |         $path = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $path); | 
					
						
							|  |  |  |         $parts = explode(DIRECTORY_SEPARATOR, $path); | 
					
						
							|  |  |  |         $absolutes = []; | 
					
						
							|  |  |  |         foreach ($parts as $part) { | 
					
						
							|  |  |  |             if ('.' == $part) continue; | 
					
						
							|  |  |  |             if ('..' == $part) { | 
					
						
							|  |  |  |                 array_pop($absolutes); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 $absolutes[] = $part; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return implode(DIRECTORY_SEPARATOR, $absolutes); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | function err($code,$msg) { | 
					
						
							| 
									
										
										
										
											2017-02-22 13:44:02 -05:00
										 |  |  | 	http_response_code($code); | 
					
						
							| 
									
										
										
										
											2017-02-22 13:26:44 -05:00
										 |  |  | 	echo json_encode(['error' => ['code'=>intval($code), 'msg' => $msg]]); | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	exit; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function asBytes($ini_v) { | 
					
						
							|  |  |  | 	$ini_v = trim($ini_v); | 
					
						
							| 
									
										
										
										
											2017-02-22 13:26:44 -05:00
										 |  |  | 	$s = ['g'=> 1<<30, 'm' => 1<<20, 'k' => 1<<10]; | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	return intval($ini_v) * ($s[strtolower(substr($ini_v,-1))] ?: 1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | $MAX_UPLOAD_SIZE = min(asBytes(ini_get('post_max_size')), asBytes(ini_get('upload_max_filesize'))); | 
					
						
							|  |  |  | ?>
 | 
					
						
							|  |  |  | <!DOCTYPE html> | 
					
						
							|  |  |  | <html><head> | 
					
						
							|  |  |  | <meta http-equiv="content-type" content="text/html; charset=utf-8"> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <style> | 
					
						
							|  |  |  | body {font-family: "lucida grande","Segoe UI",Arial, sans-serif; font-size: 14px;width:1024;padding:1em;margin:0;} | 
					
						
							| 
									
										
										
										
											2018-05-28 23:38:16 +02:00
										 |  |  | th {font-weight: normal; color: #1F75CC; background-color: #F0F9FF; padding:.5em 1em .5em .2em;
 | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	text-align: left;cursor:pointer;user-select: none;} | 
					
						
							|  |  |  | th .indicator {margin-left: 6px } | 
					
						
							|  |  |  | thead {border-top: 1px solid #82CFFA; border-bottom: 1px solid #96C4EA;border-left: 1px solid #E7F2FB;
 | 
					
						
							|  |  |  | 	border-right: 1px solid #E7F2FB; }
 | 
					
						
							|  |  |  | #top {height:52px;}
 | 
					
						
							|  |  |  | #mkdir {display:inline-block;float:right;padding-top:16px;}
 | 
					
						
							|  |  |  | label { display:block; font-size:11px; color:#555;}
 | 
					
						
							|  |  |  | #file_drop_target {width:500px; padding:12px 0; border: 4px dashed #ccc;font-size:12px;color:#ccc;
 | 
					
						
							|  |  |  | 	text-align: center;float:right;margin-right:20px;} | 
					
						
							|  |  |  | #file_drop_target.drag_over {border: 4px dashed #96C4EA; color: #96C4EA;}
 | 
					
						
							|  |  |  | #upload_progress {padding: 4px 0;}
 | 
					
						
							|  |  |  | #upload_progress .error {color:#a00;}
 | 
					
						
							|  |  |  | #upload_progress > div { padding:3px 0;}
 | 
					
						
							|  |  |  | .no_write #mkdir, .no_write #file_drop_target {display: none}
 | 
					
						
							|  |  |  | .progress_track {display:inline-block;width:200px;height:10px;border:1px solid #333;margin: 0 4px 0 10px;}
 | 
					
						
							|  |  |  | .progress {background-color: #82CFFA;height:10px; }
 | 
					
						
							|  |  |  | footer {font-size:11px; color:#bbbbc5; padding:4em 0 0;text-align: left;}
 | 
					
						
							|  |  |  | footer a, footer a:visited {color:#bbbbc5;}
 | 
					
						
							|  |  |  | #breadcrumb { padding-top:34px; font-size:15px; color:#aaa;display:inline-block;float:left;}
 | 
					
						
							|  |  |  | #folder_actions {width: 50%;float:right;}
 | 
					
						
							|  |  |  | a, a:visited { color:#00c; text-decoration: none}
 | 
					
						
							|  |  |  | a:hover {text-decoration: underline} | 
					
						
							|  |  |  | .sort_hide{ display:none;} | 
					
						
							|  |  |  | table {border-collapse: collapse;width:100%;} | 
					
						
							|  |  |  | thead {max-width: 1024px} | 
					
						
							|  |  |  | td { padding:.2em 1em .2em .2em; border-bottom:1px solid #def;height:30px; font-size:12px;white-space: nowrap;}
 | 
					
						
							|  |  |  | td.first {font-size:14px;white-space: normal;} | 
					
						
							|  |  |  | td.empty { color:#777; font-style: italic; text-align: center;padding:3em 0;}
 | 
					
						
							|  |  |  | .is_dir .size {color:transparent;font-size:0;} | 
					
						
							|  |  |  | .is_dir .size:before {content: "--"; font-size:14px;color:#333;}
 | 
					
						
							|  |  |  | .is_dir .download{visibility: hidden} | 
					
						
							|  |  |  | a.delete {display:inline-block; | 
					
						
							|  |  |  | 	background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADtSURBVHjajFC7DkFREJy9iXg0t+EHRKJDJSqRuIVaJT7AF+jR+xuNRiJyS8WlRaHWeOU+kBy7eyKhs8lkJrOzZ3OWzMAD15gxYhB+yzAm0ndez+eYMYLngdkIf2vpSYbCfsNkOx07n8kgWa1UpptNII5VR/M56Nyt6Qq33bbhQsHy6aR0WSyEyEmiCG6vR2ffB65X4HCwYC2e9CTjJGGok4/7Hcjl+ImLBWv1uCRDu3peV5eGQ2C5/P1zq4X9dGpXP+LYhmYz4HbDMQgUosWTnmQoKKf0htVKBZvtFsx6S9bm48ktaV3EXwd/CzAAVjt+gHT5me0AAAAASUVORK5CYII=) no-repeat scroll 0 2px; | 
					
						
							|  |  |  | 	color:#d00;	margin-left: 15px;font-size:11px;padding:0 0 0 13px;
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | .name { | 
					
						
							|  |  |  | 	background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABAklEQVRIie2UMW6DMBSG/4cYkJClIhauwMgx8CnSC9EjJKcwd2HGYmAwEoMREtClEJxYakmcoWq/yX623veebZmWZcFKWZbXyTHeOeeXfWDN69/uzPP8x1mVUmiaBlLKsxACAC6cc2OPd7zYK1EUYRgGZFkG3/fPAE5fIjcCAJimCXEcGxKnAiICERkSIcQmeVoQhiHatoWUEkopJEkCAB/r+t0lHyVN023c9z201qiq6s2ZYA9jDIwx1HW9xZ4+Ihta69cK9vwLvsX6ivYf4FGIyJj/rg5uqwccd2Ar7OUdOL/kPyKY5/mhZJ53/2asgiAIHhLYMARd16EoCozj6EzwCYrrX5dC9FQIAAAAAElFTkSuQmCC) no-repeat scroll 0px 12px; | 
					
						
							|  |  |  | 	padding:15px 0 10px 40px; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | .is_dir .name { | 
					
						
							|  |  |  | 	background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAI0SURBVFiF7Vctb1RRED1nZu5977VQVBEQBKZ1GCDBEwy+ISgCBsMPwOH4CUXgsKQOAxq5CaKChEBqShNK222327f79n0MgpRQ2qC2twKOGjE352TO3Jl76e44S8iZsgOww+Dhi/V3nePOsQRFv679/qsnV96ehgAeWvBged3vXi+OJewMW/Q+T8YCLr18fPnNqQq4fS0/MWlQdviwVqNpp9Mvs7l8Wn50aRH4zQIAqOruxANZAG4thKmQA8D7j5OFw/iIgLXvo6mR/B36K+LNp71vVd1cTMR8BFmwTesc88/uLQ5FKO4+k4aarbuPnq98mbdo2q70hmU0VREkEeCOtqrbMprmFqM1psoYAsg0U9EBtB0YozUWzWpVZQgBxMm3YPoCiLpxRrPaYrBKRSUL5qn2AgFU0koMVlkMOo6G2SIymQCAGE/AGHRsWbCRKc8VmaBN4wBIwkZkFmxkWZDSFCwyommZSABgCmZBSsuiHahA8kA2iZYzSapAsmgHlgfdVyGLTFg3iZqQhAqZB923GGUgQhYRVElmAUXIGGVgedQ9AJJnAkqyClCEkkfdM1Pt13VHdxDpnof0jgxB+mYqO5PaCSDRIAbgDgdpKjtmwm13irsnq4ATdKeYcNvUZAt0dg5NVwEQFKrJlpn45lwh/LpbWdela4K5QsXEN61tytWr81l5YSY/n4wdQH84qjd2J6vEz+W0BOAGgLlE/AMAPQCv6e4gmWYC/QF3d/7zf8P/An4AWL/T1+B2nyIAAAAASUVORK5CYII=) no-repeat scroll 0px 10px; | 
					
						
							|  |  |  | 	padding:15px 0 10px 40px; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | .download { | 
					
						
							|  |  |  | 	background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB2klEQVR4nJ2ST2sTQRiHn5mdmj92t9XmUJIWJGq9NHrRgxQiCtqbl97FqxgaL34CP0FD8Qv07EHEU0Ew6EXEk6ci8Q9JtcXEkHR3k+zujIdUqMkmiANzmJdnHn7vzCuIWbe291tSkvhz1pr+q1L2bBwrRgvFrcZKKinfP9zI2EoKmm7Azstf3V7fXK2Wc3ujvIqzAhglwRJoS2ImQZMEBjgyoDS4hv8QGHA1WICvp9yelsA7ITBTIkwWhGBZ0Iv+MUF+c/cB8PTHt08snb+AGAACZDj8qIN6bSe/uWsBb2qV24/GBLn8yl0plY9AJ9NKeL5ICyEIQkkiZenF5XwBDAZzWItLIIR6LGfk26VVxzltJ2gFw2a0FmQLZ+bcbo/DPbcd+PrDyRb+GqRipbGlZtX92UvzjmUpEGC0JgpC3M9dL+qGz16XsvcmCgCK2/vPtTNzJ1x2kkZIRBSivh8Z2Q4+VkvZy6O8HHvWyGyITvA1qndNpxfguQNkc2CIzM0xNk5QLedCEZm1VKsf2XrAXMNrA2vVcq4ZJ4DhvCSAeSALXASuLBTW129U6oPrT969AK4Bq0AeWARs4BRgieMUEkgDmeO9ANipzDnH//nFB0KgAxwATaAFeID5DQNatLGdaXOWAAAAAElFTkSuQmCC) no-repeat scroll 0px 5px;
 | 
					
						
							|  |  |  | 	padding:4px 0 4px 20px; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | </style> | 
					
						
							|  |  |  | <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> | 
					
						
							|  |  |  | <script> | 
					
						
							|  |  |  | (function($){ | 
					
						
							|  |  |  | 	$.fn.tablesorter = function() { | 
					
						
							|  |  |  | 		var $table = this; | 
					
						
							|  |  |  | 		this.find('th').click(function() { | 
					
						
							|  |  |  | 			var idx = $(this).index(); | 
					
						
							|  |  |  | 			var direction = $(this).hasClass('sort_asc'); | 
					
						
							|  |  |  | 			$table.tablesortby(idx,direction); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 	$.fn.tablesortby = function(idx,direction) { | 
					
						
							|  |  |  | 		var $rows = this.find('tbody tr'); | 
					
						
							|  |  |  | 		function elementToVal(a) { | 
					
						
							|  |  |  | 			var $a_elem = $(a).find('td:nth-child('+(idx+1)+')'); | 
					
						
							|  |  |  | 			var a_val = $a_elem.attr('data-sort') || $a_elem.text(); | 
					
						
							|  |  |  | 			return (a_val == parseInt(a_val) ? parseInt(a_val) : a_val); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		$rows.sort(function(a,b){ | 
					
						
							|  |  |  | 			var a_val = elementToVal(a), b_val = elementToVal(b); | 
					
						
							|  |  |  | 			return (a_val > b_val ? 1 : (a_val == b_val ? 0 : -1)) * (direction ? 1 : -1); | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		this.find('th').removeClass('sort_asc sort_desc'); | 
					
						
							|  |  |  | 		$(this).find('thead th:nth-child('+(idx+1)+')').addClass(direction ? 'sort_desc' : 'sort_asc'); | 
					
						
							|  |  |  | 		for(var i =0;i<$rows.length;i++) | 
					
						
							|  |  |  | 			this.append($rows[i]); | 
					
						
							|  |  |  | 		this.settablesortmarkers(); | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	$.fn.retablesort = function() { | 
					
						
							|  |  |  | 		var $e = this.find('thead th.sort_asc, thead th.sort_desc'); | 
					
						
							|  |  |  | 		if($e.length) | 
					
						
							|  |  |  | 			this.tablesortby($e.index(), $e.hasClass('sort_desc') ); | 
					
						
							| 
									
										
										
										
											2018-05-28 23:38:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	$.fn.settablesortmarkers = function() { | 
					
						
							|  |  |  | 		this.find('thead th span.indicator').remove(); | 
					
						
							|  |  |  | 		this.find('thead th.sort_asc').append('<span class="indicator">↓<span>'); | 
					
						
							|  |  |  | 		this.find('thead th.sort_desc').append('<span class="indicator">↑<span>'); | 
					
						
							|  |  |  | 		return this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | })(jQuery); | 
					
						
							|  |  |  | $(function(){ | 
					
						
							|  |  |  | 	var XSRF = (document.cookie.match('(^|; )_sfm_xsrf=([^;]*)')||0)[2]; | 
					
						
							|  |  |  | 	var MAX_UPLOAD_SIZE = <?php echo $MAX_UPLOAD_SIZE ?>;
 | 
					
						
							|  |  |  | 	var $tbody = $('#list'); | 
					
						
							| 
									
										
										
										
											2018-04-12 17:04:02 -04:00
										 |  |  | 	$(window).on('hashchange',list).trigger('hashchange'); | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	$('#table').tablesorter(); | 
					
						
							| 
									
										
										
										
											2018-05-28 23:38:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-12 15:02:48 -04:00
										 |  |  | 	$('#table').on('click','.delete',function(data) { | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 		$.post("",{'do':'delete',file:$(this).attr('data-file'),xsrf:XSRF},function(response){ | 
					
						
							|  |  |  | 			list(); | 
					
						
							|  |  |  | 		},'json'); | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#mkdir').submit(function(e) { | 
					
						
							| 
									
										
										
										
											2018-04-18 12:30:16 -04:00
										 |  |  | 		var hashval = decodeURIComponent(window.location.hash.substr(1)), | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 			$dir = $(this).find('[name=name]'); | 
					
						
							|  |  |  | 		e.preventDefault(); | 
					
						
							|  |  |  | 		$dir.val().length && $.post('?',{'do':'mkdir',name:$dir.val(),xsrf:XSRF,file:hashval},function(data){ | 
					
						
							|  |  |  | 			list(); | 
					
						
							|  |  |  | 		},'json'); | 
					
						
							|  |  |  | 		$dir.val(''); | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2018-04-12 10:21:48 -04:00
										 |  |  | <?php if($allow_upload): ?>
 | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	// file upload stuff
 | 
					
						
							| 
									
										
										
										
											2018-04-12 17:04:02 -04:00
										 |  |  | 	$('#file_drop_target').on('dragover',function(){ | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 		$(this).addClass('drag_over'); | 
					
						
							|  |  |  | 		return false; | 
					
						
							| 
									
										
										
										
											2018-04-12 17:04:02 -04:00
										 |  |  | 	}).on('dragend',function(){ | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 		$(this).removeClass('drag_over'); | 
					
						
							|  |  |  | 		return false; | 
					
						
							| 
									
										
										
										
											2018-04-12 17:04:02 -04:00
										 |  |  | 	}).on('drop',function(e){ | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 		e.preventDefault(); | 
					
						
							|  |  |  | 		var files = e.originalEvent.dataTransfer.files; | 
					
						
							|  |  |  | 		$.each(files,function(k,file) { | 
					
						
							|  |  |  | 			uploadFile(file); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		$(this).removeClass('drag_over'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 	$('input[type=file]').change(function(e) { | 
					
						
							|  |  |  | 		e.preventDefault(); | 
					
						
							|  |  |  | 		$.each(this.files,function(k,file) { | 
					
						
							|  |  |  | 			uploadFile(file); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function uploadFile(file) { | 
					
						
							| 
									
										
										
										
											2018-04-18 12:30:16 -04:00
										 |  |  | 		var folder = decodeURIComponent(window.location.hash.substr(1)); | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if(file.size > MAX_UPLOAD_SIZE) { | 
					
						
							|  |  |  | 			var $error_row = renderFileSizeErrorRow(file,folder); | 
					
						
							|  |  |  | 			$('#upload_progress').append($error_row); | 
					
						
							|  |  |  | 			window.setTimeout(function(){$error_row.fadeOut();},5000); | 
					
						
							|  |  |  | 			return false; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-05-28 23:38:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 		var $row = renderFileUploadRow(file,folder); | 
					
						
							|  |  |  | 		$('#upload_progress').append($row); | 
					
						
							|  |  |  | 		var fd = new FormData(); | 
					
						
							|  |  |  | 		fd.append('file_data',file); | 
					
						
							|  |  |  | 		fd.append('file',folder); | 
					
						
							|  |  |  | 		fd.append('xsrf',XSRF); | 
					
						
							|  |  |  | 		fd.append('do','upload'); | 
					
						
							|  |  |  | 		var xhr = new XMLHttpRequest(); | 
					
						
							|  |  |  | 		xhr.open('POST', '?'); | 
					
						
							|  |  |  | 		xhr.onload = function() { | 
					
						
							|  |  |  | 			$row.remove(); | 
					
						
							|  |  |  |     		list(); | 
					
						
							|  |  |  |   		}; | 
					
						
							|  |  |  | 		xhr.upload.onprogress = function(e){ | 
					
						
							|  |  |  | 			if(e.lengthComputable) { | 
					
						
							|  |  |  | 				$row.find('.progress').css('width',(e.loaded/e.total*100 | 0)+'%' ); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	    xhr.send(fd); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	function renderFileUploadRow(file,folder) { | 
					
						
							|  |  |  | 		return $row = $('<div/>') | 
					
						
							|  |  |  | 			.append( $('<span class="fileuploadname" />').text( (folder ? folder+'/':'')+file.name)) | 
					
						
							|  |  |  | 			.append( $('<div class="progress_track"><div class="progress"></div></div>')  ) | 
					
						
							|  |  |  | 			.append( $('<span class="size" />').text(formatFileSize(file.size)) ) | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 	function renderFileSizeErrorRow(file,folder) { | 
					
						
							|  |  |  | 		return $row = $('<div class="error" />') | 
					
						
							|  |  |  | 			.append( $('<span class="fileuploadname" />').text( 'Error: ' + (folder ? folder+'/':'')+file.name)) | 
					
						
							|  |  |  | 			.append( $('<span/>').html(' file size - <b>' + formatFileSize(file.size) + '</b>' | 
					
						
							|  |  |  | 				+' exceeds max upload size of <b>' + formatFileSize(MAX_UPLOAD_SIZE) + '</b>')  ); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-17 13:02:58 -05:00
										 |  |  | <?php endif; ?>
 | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	function list() { | 
					
						
							|  |  |  | 		var hashval = window.location.hash.substr(1); | 
					
						
							| 
									
										
										
										
											2018-04-12 17:04:02 -04:00
										 |  |  | 		$.get('?do=list&file='+ hashval,function(data) { | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 			$tbody.empty(); | 
					
						
							|  |  |  | 			$('#breadcrumb').empty().html(renderBreadcrumbs(hashval)); | 
					
						
							|  |  |  | 			if(data.success) { | 
					
						
							|  |  |  | 				$.each(data.results,function(k,v){ | 
					
						
							|  |  |  | 					$tbody.append(renderFileRow(v)); | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2015-12-18 12:02:56 +08:00
										 |  |  | 				!data.results.length && $tbody.append('<tr><td class="empty" colspan=5>This folder is empty</td></tr>') | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 				data.is_writable ? $('body').removeClass('no_write') : $('body').addClass('no_write'); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				console.warn(data.error.msg); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			$('#table').retablesort(); | 
					
						
							|  |  |  | 		},'json'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	function renderFileRow(data) { | 
					
						
							|  |  |  | 		var $link = $('<a class="name" />') | 
					
						
							| 
									
										
										
										
											2018-05-28 23:38:16 +02:00
										 |  |  | 			.attr('href', data.is_dir ? '#' + encodeURIComponent(data.path) : './'+ encodeURIComponent(data.path)) | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 			.text(data.name); | 
					
						
							| 
									
										
										
										
											2017-01-17 14:30:03 -05:00
										 |  |  | 		var allow_direct_link = <?php echo $allow_direct_link?'true':'false'; ?>;
 | 
					
						
							|  |  |  |         	if (!data.is_dir && !allow_direct_link)  $link.css('pointer-events','none'); | 
					
						
							| 
									
										
										
										
											2018-05-28 23:38:16 +02:00
										 |  |  | 		var $dl_link = $('<a/>').attr('href','?do=download&file='+ encodeURIComponent(data.path)) | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 			.addClass('download').text('download'); | 
					
						
							|  |  |  | 		var $delete_link = $('<a href="#" />').attr('data-file',data.path).addClass('delete').text('delete'); | 
					
						
							|  |  |  | 		var perms = []; | 
					
						
							|  |  |  | 		if(data.is_readable) perms.push('read'); | 
					
						
							|  |  |  | 		if(data.is_writable) perms.push('write'); | 
					
						
							|  |  |  | 		if(data.is_executable) perms.push('exec'); | 
					
						
							|  |  |  | 		var $html = $('<tr />') | 
					
						
							|  |  |  | 			.addClass(data.is_dir ? 'is_dir' : '') | 
					
						
							|  |  |  | 			.append( $('<td class="first" />').append($link) ) | 
					
						
							|  |  |  | 			.append( $('<td/>').attr('data-sort',data.is_dir ? -1 : data.size) | 
					
						
							| 
									
										
										
										
											2018-05-28 23:38:16 +02:00
										 |  |  | 				.html($('<span class="size" />').text(formatFileSize(data.size))) ) | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 			.append( $('<td/>').attr('data-sort',data.mtime).text(formatTimestamp(data.mtime)) ) | 
					
						
							|  |  |  | 			.append( $('<td/>').text(perms.join('+')) ) | 
					
						
							|  |  |  | 			.append( $('<td/>').append($dl_link).append( data.is_deleteable ? $delete_link : '') ) | 
					
						
							|  |  |  | 		return $html; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	function renderBreadcrumbs(path) { | 
					
						
							|  |  |  | 		var base = "", | 
					
						
							|  |  |  | 			$html = $('<div/>').append( $('<a href=#>Home</a></div>') ); | 
					
						
							|  |  |  | 		$.each(path.split('/'),function(k,v){ | 
					
						
							|  |  |  | 			if(v) { | 
					
						
							| 
									
										
										
										
											2018-04-12 17:04:02 -04:00
										 |  |  | 				var v_as_text = decodeURIComponent(v); | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 				$html.append( $('<span/>').text(' ▸ ') ) | 
					
						
							| 
									
										
										
										
											2018-04-12 17:04:02 -04:00
										 |  |  | 					.append( $('<a/>').attr('href','#'+base+v).text(v_as_text) ); | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 				base += v + '/'; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		return $html; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	function formatTimestamp(unix_timestamp) { | 
					
						
							| 
									
										
										
										
											2013-10-18 23:27:47 -04:00
										 |  |  | 		var m = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 		var d = new Date(unix_timestamp*1000); | 
					
						
							| 
									
										
										
										
											2013-10-18 23:27:47 -04:00
										 |  |  | 		return [m[d.getMonth()],' ',d.getDate(),', ',d.getFullYear()," ", | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 			(d.getHours() % 12 || 12),":",(d.getMinutes() < 10 ? '0' : '')+d.getMinutes(), | 
					
						
							|  |  |  | 			" ",d.getHours() >= 12 ? 'PM' : 'AM'].join(''); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	function formatFileSize(bytes) { | 
					
						
							|  |  |  | 		var s = ['bytes', 'KB','MB','GB','TB','PB','EB']; | 
					
						
							|  |  |  | 		for(var pos = 0;bytes >= 1000; pos++,bytes /= 1024); | 
					
						
							|  |  |  | 		var d = Math.round(bytes*10); | 
					
						
							|  |  |  | 		return pos ? [parseInt(d/10),".",d%10," ",s[pos]].join('') : bytes + ' bytes'; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </script> | 
					
						
							|  |  |  | </head><body> | 
					
						
							|  |  |  | <div id="top"> | 
					
						
							| 
									
										
										
										
											2018-04-12 14:21:26 -04:00
										 |  |  |    <?php if($allow_create_folder): ?>
 | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	<form action="?" method="post" id="mkdir" /> | 
					
						
							|  |  |  | 		<label for=dirname>Create New Folder</label><input id=dirname type=text name=name value="" /> | 
					
						
							|  |  |  | 		<input type="submit" value="create" /> | 
					
						
							|  |  |  | 	</form> | 
					
						
							| 
									
										
										
										
											2017-01-17 13:39:19 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-17 13:12:25 -05:00
										 |  |  |    <?php endif; ?>
 | 
					
						
							| 
									
										
										
										
											2017-01-17 13:39:19 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-12 10:21:48 -04:00
										 |  |  |    <?php if($allow_upload): ?>
 | 
					
						
							| 
									
										
										
										
											2017-01-17 13:39:19 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	<div id="file_drop_target"> | 
					
						
							|  |  |  | 		Drag Files Here To Upload | 
					
						
							|  |  |  | 		<b>or</b> | 
					
						
							|  |  |  | 		<input type="file" multiple /> | 
					
						
							|  |  |  | 	</div> | 
					
						
							| 
									
										
										
										
											2017-01-17 13:02:58 -05:00
										 |  |  |    <?php endif; ?>
 | 
					
						
							| 
									
										
										
										
											2013-10-18 22:53:53 -04:00
										 |  |  | 	<div id="breadcrumb"> </div> | 
					
						
							|  |  |  | </div> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <div id="upload_progress"></div> | 
					
						
							|  |  |  | <table id="table"><thead><tr> | 
					
						
							|  |  |  | 	<th>Name</th> | 
					
						
							|  |  |  | 	<th>Size</th> | 
					
						
							|  |  |  | 	<th>Modified</th> | 
					
						
							|  |  |  | 	<th>Permissions</th> | 
					
						
							|  |  |  | 	<th>Actions</th> | 
					
						
							|  |  |  | </tr></thead><tbody id="list"> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </tbody></table> | 
					
						
							| 
									
										
										
										
											2015-10-03 19:55:23 +02:00
										 |  |  | <footer>simple php filemanager by <a href="https://github.com/jcampbell1">jcampbell1</a></footer> | 
					
						
							|  |  |  | </body></html> |