forked from robsalasco/simple-file-manager
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathindex.min.php
2 lines (2 loc) · 18.6 KB
/
index.min.php
1
2
<?php
setlocale(LC_ALL,'en_US.UTF-8');if(!isset($_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=isset($_REQUEST['file'])?urldecode($_REQUEST['file']):'.';if(isset($_GET['do'])&&$_GET['do']=='list'){if(is_dir($file)){$directory=$file;$result=array();$files=array_diff(scandir($directory),array('.','..'));foreach($files as $entry)if($entry!==basename(__FILE__)){$i=$directory.'/'.$entry;$stat=stat($i);$result[]=array('mtime'=>$stat['mtime'],'size'=>$stat['size'],'name'=>basename($i),'path'=>preg_replace('@^\./@','',$i),'ext'=>pathinfo($i,PATHINFO_EXTENSION),'is_dir'=>is_dir($i),'is_deleteable'=>(!is_dir($i)&&is_writable($directory))||(is_dir($i)&&is_writable($directory)&&is_recursively_deleteable($i)),'is_readable'=>is_readable($i),'is_writable'=>is_writable($i),'is_executable'=>is_executable($i),);}}else {err(412,"Not a Directory");}echo json_encode(array('success'=>true,'is_writable'=>is_writable($file),'results'=>$result));exit;}elseif(isset($_POST['do'])&&$_POST['do']=='delete'){rmrf($file);echo json_encode(array('success'=>true));exit;}elseif(isset($_POST['do'])&&$_POST['do']=='mkdir'){chdir($file);@mkdir($_POST['name']);echo json_encode(array('success'=>true));exit;}elseif(isset($_POST['do'])&&$_POST['do']=='upload'){var_dump($_POST);var_dump($_FILES);var_dump($_FILES['file_data']['tmp_name']);var_dump(move_uploaded_file($_FILES['file_data']['tmp_name'],$file.'/'.$_FILES['file_data']['name']));exit;}elseif(isset($_GET['do'])&&$_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;}elseif(isset($_GET['do'])&&$_GET['do']=='view'){header('Content-Type: text/plain');echo file_get_contents($file);exit;}elseif(isset($_POST['do'])&&$_POST['do']=='rename'){$newname=$_POST['name'];$newname=strip_tags($newname);$newname=stripslashes($newname);$newname=preg_replace('/\n|\s|\t/','',$newname);$newname=trim($newname);rename($file,realpath(dirname($file)).'/'.$newname);echo json_encode(array('success'=>true));exit;}elseif(isset($_POST['do'])&&$_POST['do']=='content'){header('Content-Type: text/plain');echo get_editable_content($file);echo '<textarea id="editable" rows="20" style="height: 100%; box-sizing: border-box;width:100%">';echo htmlentities(file_get_contents($file),ENT_QUOTES,'utf-8');echo '</textarea>';exit;}elseif(isset($_POST['do'])&&$_POST['do']=='content-save'){file_put_contents($file,html_entity_decode($_POST['content']));echo json_encode(array('success'=>true));exit;}elseif(isset($_POST['do'])&&$_POST['do']=='zip'){$filename=basename($file);$zip=new ZipArchive();$zip->open($file.time().".zip",ZipArchive::CREATE|ZipArchive::OVERWRITE);$files=new RecursiveIteratorIterator(new RecursiveDirectoryIterator(realpath($file)),RecursiveIteratorIterator::LEAVES_ONLY);foreach($files as $name=>$filez){if(!$filez->isDir()){$filePath=$filez->getRealPath();$relativePath=substr($filePath,strlen(realpath($file))+1);$zip->addFile($filePath,$relativePath);}}$zip->close();echo json_encode(array('success'=>true));exit;}elseif(isset($_POST['do'])&&$_POST['do']=='unzip'){$zip=new ZipArchive();$zip->open($file);$path=dirname(realpath($file)).DIRECTORY_SEPARATOR.basename($file,'.zip');if(!file_exists($path)){mkdir($path);}$zip->extractTo($path);$zip->close();echo json_encode(array('success'=>true));exit;}function get_editable_content($file){echo '<style>body{margin-top:30px;}.always-top{position:fixed;top:5px;}</style>';echo '<span class="always-top">';echo '<button id="#save-inside" onclick="';echo 'window.opener.jQuery(window.opener.document).trigger(';echo '\'save.popup\',';echo "['".htmlentities($file,ENT_QUOTES,'utf-8')."',";echo 'document.getElementById(\'editable\').value]';echo ');';echo 'window.close();">save</button><button id="#cancel-inside" onclick="window.close();">cancel</button></span>';}function rmrf($dir){if(is_dir($dir)){$files=array_diff(scandir($dir),array('.','..'));foreach($files as $file)rmrf("$dir".DIRECTORY_SEPARATOR."$file");rmdir($dir);}else {unlink($dir);}}function is_recursively_deleteable($d){$stack=array($d);while($dir=array_pop($stack)){if(!is_readable($dir)||!is_writable($dir))return false;$files=array_diff(scandir($dir),array('.','..'));foreach($files as $file)if(is_dir($file)){$stack[]="$dir".DIRECTORY_SEPARATOR."$file";}}return true;}function err($code,$msg){echo json_encode(array('error'=>array('code'=>intval($code),'msg'=>$msg)));exit;}function asBytes($ini_v){$ini_v=trim($ini_v);$s=array('g'=>1<<30,'m'=>1<<20,'k'=>1<<10);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;}th{font-weight: normal; color: #1F75CC; background-color: #F0F9FF; padding:.5em 1em .5em .2em; 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%;}table th{cursor: pointer;}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}.is_dir .edit{display: none}.is_dir .zip{display: inline}.zip{display: none}.ext-zip .unzip{display: inline}.unzip{display: none}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;}.first .save, .first .cancel{display: none;}.first .save.is-visible, .first .cancel.is-visible{display: inline-block;}.saved{color: green; display: none; font-weight: bold;}td.last{text-align: right;}</style><script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script><script>var MAX_UPLOAD_SIZE = <?php echo $MAX_UPLOAD_SIZE ?>;!function(t){function e(e,n){var a=t(e).find("td:nth-child("+(n+1)+")"),s=a.attr("data-sort")||a.text();return s==parseInt(s)?parseInt(s):s}t.fn.tablesorter=function(){var e=this;return this.find("th").click(function(){var n=t(this),a=n.index(),s=n.hasClass("sort_asc");e.tablesortby(a,s)}),this},t.fn.tablesortby=function(n,a){var s=t(this);s.find("thead th:nth-child("+(n+1)+")").addClass(a?"sort_desc":"sort_asc");var r=s.find("tbody tr");return r.sort(function(t,s){var r=e(t,n),i=e(s,n);return(r>i?1:r==i?0:-1)*(a?1:-1)}),s.find("th").removeClass("sort_asc sort_desc"),s.append(r),this.settablesortmarkers(),this},t.fn.retablesort=function(){var e=t(this).find("thead th.sort_asc, thead th.sort_desc");return e.length&&this.tablesortby(e.index(),e.hasClass("sort_desc")),this},t.fn.settablesortmarkers=function(){var e=t(this);return e.find("thead th span.indicator").remove(),e.find("thead th.sort_asc").append('<span class="indicator">↓<span>'),e.find("thead th.sort_desc").append('<span class="indicator">↑<span>'),this}}(jQuery),$(function(){function t(t){t.find(".save").removeClass("is-visible"),t.find(".cancel").removeClass("is-visible"),t.find(".name").attr("contentEditable",!1)}function e(t){t.find(".save").addClass("is-visible"),t.find(".cancel").addClass("is-visible"),t.find(".name").attr("contentEditable",!0).focus()}function n(t){var e=window.location.hash.substr(1);if(t.size>MAX_UPLOAD_SIZE){var n=s(t,e);return $("#upload_progress").append(n),window.setTimeout(function(){n.fadeOut()},5e3),!1}var i=a(t,e);$("#upload_progress").append(i);var o=new FormData;o.append("file_data",t),o.append("file",e),o.append("xsrf",l),o.append("do","upload");var d=new XMLHttpRequest;d.open("POST","?"),d.onload=function(){i.remove(),r()},d.upload.onprogress=function(t){t.lengthComputable&&i.find(".progress").css("width",(t.loaded/t.total*100|0)+"%")},d.send(o)}function a(t,e){return $("<div/>").append($('<span class="fileuploadname"></span>').text((e?e+"/":"")+t.name)).append($('<div class="progress_track"><div class="progress"></div></div>')).append($('<span class="size"></span>').text(p(t.size)))}function s(t,e){return $('<div class="error" />').append($('<span class="fileuploadname"></span>').text("Error: "+(e?e+"/":"")+t.name)).append($("<span></span>").html(" file size - <b>"+p(t.size)+"</b> exceeds max upload size of <b>"+p(MAX_UPLOAD_SIZE)+"</b>"))}function r(){var t=window.location.hash.substr(1);t=t?t:".",$.get("?",{"do":"list",file:t},function(e){c.empty(),$("#breadcrumb").empty().html(o(t)),e.success?($.each(e.results,function(t,e){c.append(i(e))}),!e.results.length&&c.append('<tr><td class="empty" colspan=5>This folder is empty</td></tr>'),e.is_writable?$("body").removeClass("no_write"):$("body").addClass("no_write")):console.warn(e.error.msg),$("#table").retablesort()},"json")}function i(t){var e;e=t.is_dir?$('<a class="name" />').attr("href",t.is_dir?"#"+t.path:"./"+t.path).text(t.name):$('<a class="name" target="_BLANK" />').attr("href","?do=view&file="+encodeURIComponent(t.path)).text(t.name);var n=$('<span class="rename"> | <button>rename</button></span>'),a=$('<span class="save"> | <button>save</button></span>');a.find("button").attr("data-file",t.path);var s=$('<span class="cancel"> | <button>cancel</button></span>'),r=$('<span class="edit"> | <button>edit</button></span>');r.find("button").attr("data-file",t.path);var i=$("<a/>").attr("href","?do=download&file="+encodeURIComponent(t.path)).addClass("download").text("download"),o=$('<a href="#" data-file="'+t.path+'" class="zip">zip</a>'),l=$('<span> <a href="#" data-file="'+t.path+'" class="unzip">unzip</a></span>'),c=$('<a href="#" />').attr("data-file",t.path).addClass("delete").text("delete"),u=[];t.is_readable&&u.push("read"),t.is_writable&&u.push("write"),t.is_executable&&u.push("exec");var f=$("<tr />").addClass(t.is_dir?"is_dir":"").addClass("ext-"+t.ext).append($('<td class="first"></td>').append(e).append(n).append(a).append(s).append(r)).append($("<td></td>").attr("data-sort",t.is_dir?-1:t.size).html($('<span class="size"></span>').text(p(t.size)))).append($("<td></td>").attr("data-sort",t.mtime).text(d(t.mtime))).append($("<td></td>").text(u.join("+"))).append($('<td class="last"></td>').append(i).append(o).append(l).append(t.is_deleteable?c:""));return f}function o(t){var e="",n=$("<div/>").append($("<a href=#>Home</a></div>")).append($("<span> ▸ </span><a href=#..>|..</a></div>")).append($('<span> ▸ </span><a class="back-link" href="#">|../*</a></div>')),a=n.find(".back-link");return a.attr("href","#"+t+"/.."),$.each(t.split("/"),function(t,a){a&&(n.append($("<span/>").text(" ▸ ")).append($("<a/>").attr("href","#"+e+a).text(a)),e+=a+"/")}),n}function d(t){var e=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],n=new Date(1e3*t);return[e[n.getMonth()]," ",n.getDate(),", ",n.getFullYear()," ",n.getHours()%12||12,":",(n.getMinutes()<10?"0":"")+n.getMinutes()," ",n.getHours()>=12?"PM":"AM"].join("")}function p(t){for(var e=["bytes","KB","MB","GB","TB","PB","EB"],n=0;t>=1e3;n++,t/=1024);var a=Math.round(10*t);return n?[parseInt(a/10),".",a%10," ",e[n]].join(""):t+" bytes"}var l=(document.cookie.match("(^|; )_sfm_xsrf=([^;]*)")||0)[2],c=$("#list");$(window).bind("hashchange",r).trigger("hashchange"),$("#table").tablesorter(),$(document).on("click.delete",".delete",function(t){var e=confirm("are you sure want to delete?");return e?($.post("",{"do":"delete",file:$(this).attr("data-file"),xsrf:l},function(t){r()},"json"),!1):!1}),$(document).on("keydown.name",".name",function(t){return 13==t.keyCode?(t&&t.preventDefault&&t.preventDefault(),$(this).closest(".first").find(".save button").trigger("click.save"),!1):27==t.keyCode?(t&&t.preventDefault&&t.preventDefault(),$(this).closest(".first").find(".cancel button").trigger("click.cancel"),!1):void 0}),$(document).on("click",".zip",function(t){return $.post("",{"do":"zip",file:$(this).attr("data-file"),xsrf:l},function(t){r()},"json"),!1}),$(document).on("click",".unzip",function(t){return $.post("",{"do":"unzip",file:$(this).attr("data-file"),xsrf:l},function(t){r()},"json"),!1}),$(document).on("click.rename",".rename button",function(t){var n=$(this),a=n.closest(".first");return e(a),!1}),$(document).on("click.save",".save button",function(e){var n=$(this),a=n.closest(".first");return t(a),$.post("",{"do":"rename",file:$(this).attr("data-file"),name:a.find(".name").text(),xsrf:l},function(t){r()},"json"),!1}),$(document).on("click.cancel",".cancel button",function(e){var n=$(this),a=n.closest(".first");return document.execCommand("undo"),a.find(".name").blur(),t(a),!1}),jQuery(document).on("save.popup",function(t,e,n){$.post("",{"do":"content-save",file:e,content:n,xsrf:l},function(t){var n=$('<span class="saved"> | Saved!</span>').insertAfter($('.edit [data-file="'+e+'"]').parent()).fadeIn();window.setTimeout(function(){n.fadeOut()},5e3)},"json")}),$(document).on("click.edit",".edit button",function(t){var e=$(this),n=(e.closest(".first"),window.open("","","resizable=1;width=400,height=400"));return n&&n.document?$.post("",{"do":"content",file:e.attr("data-file"),xsrf:l},function(t){n.document.write(t)}):alert("please enable a popup showing"),!1}),$("#mkdir").submit(function(t){var e=window.location.hash.substr(1),n=$(this).find("[name=name]");return t.preventDefault(),n.val().length&&$.post("?",{"do":"mkdir",name:n.val(),xsrf:l,file:e},function(t){r()},"json"),n.val(""),!1}),$("#file_drop_target").on("dragover",function(){return $(this).addClass("drag_over"),!1}).on("dragend",function(){return $(this).removeClass("drag_over"),!1}).on("drop",function(t){t.preventDefault();var e=t.originalEvent.dataTransfer.files;$.each(e,function(t,e){n(e)}),$(this).removeClass("drag_over")}),$("input[type=file]").change(function(t){t.preventDefault(),$.each(this.files,function(t,e){n(e)})})});</script></head><body><div id="top"><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><div id="file_drop_target">Drag Files Here To Upload<b>or</b><input type="file" multiple/></div><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><footer>simple php filemanager by <a href="https://github.com/jcampbell1">jcampbell1</a></footer></body></html>