require_once __DIR__ . '/includes/admin_security.php';
panelSession();
require_once __DIR__ . '/includes/functions.php';
header('Cache-Control: no-store');
$log_check = $db->select('users', '*', 'id = :id', '', [':id' => 1]);
$loggedinuser = $log_check[0]['username'] ?? null;
if ($loggedinuser && !empty($_SESSION['loggedin']) && isset($_SESSION['name'])
&& hash_equals((string)$loggedinuser, (string)$_SESSION['name'])) {
panelRedirect('dns.php');
}
if (!$loggedinuser) {
// Sem credenciais padrão: provisione a primeira conta via variáveis de ambiente.
$initialUser = getenv('PANEL_BOOTSTRAP_USERNAME');
$initialPass = getenv('PANEL_BOOTSTRAP_PASSWORD');
if ($initialUser && $initialPass && strlen($initialPass) >= 12) {
$db->insert('users', ['id'=>1,'username'=>(string)$initialUser,
'password'=>password_hash((string)$initialPass, PASSWORD_DEFAULT)]);
$loggedinuser = (string)$initialUser;
} else {
http_response_code(503);
exit('Painel sem administrador inicial. Defina PANEL_BOOTSTRAP_USERNAME e PANEL_BOOTSTRAP_PASSWORD (mínimo 12 caracteres) no PHP-FPM.');
}
}
$loginError = false;
if (($_SERVER['REQUEST_METHOD'] ?? '') === 'POST' && isset($_POST['login'])) {
$now = time();
$failures = (int)($_SESSION['login_failures'] ?? 0);
$blockedUntil = (int)($_SESSION['blocked_until'] ?? 0);
if ($blockedUntil > $now) {
http_response_code(429); $loginError = true;
} else {
$username = is_string($_POST['username'] ?? null) ? $_POST['username'] : '';
$password = is_string($_POST['password'] ?? null) ? $_POST['password'] : '';
$record = $db->select('users', '*', 'id = :id', '', [':id'=>1]);
$user = $record[0] ?? [];
$stored = (string)($user['password'] ?? '');
$hashed = password_get_info($stored)['algo'] !== null;
$ok = is_string($user['username'] ?? null) && hash_equals($user['username'], $username)
&& ($hashed ? password_verify($password, $stored) : hash_equals($stored, $password));
if ($ok) {
if (!$hashed || password_needs_rehash($stored, PASSWORD_DEFAULT)) {
$db->update('users', ['password'=>password_hash($password, PASSWORD_DEFAULT)], 'id = :id', [':id'=>1]);
}
session_regenerate_id(true);
$_SESSION['loggedin'] = true;
$_SESSION['name'] = $user['username'];
$_SESSION['panel_last_activity'] = $now;
$_SESSION['login_failures'] = 0;
unset($_SESSION['blocked_until']);
panelRedirect($username === 'admin' ? 'user.php' : 'dns.php');
}
$_SESSION['login_failures'] = ++$failures;
if ($failures >= 5) { $_SESSION['blocked_until'] = $now + 600; }
http_response_code(401);
$loginError = true;
}
}
// Variáveis para descrição e links
$descriptionText1 = <<
Mod do Painel e Aplicativo idealizado por
Léo Customizações
e equipe
Start 3D Midia
HTML;
$descriptionLink = "https://contato.s3dmidia.com.br"; // Adicione o link desejado aqui
$descriptionLinkText = <<
Clique aqui para suporte
HTML;
$descriptionText2 = <<
Este é o segundo campo de descrição. Você pode copiar este texto.
HTML;
$file_name = './codigo_json.json';
$json_data = file_get_contents($file_name);
if ($json_data === false) {
die("Erro ao ler o arquivo JSON.");
}
// 2. Converter a String JSON para um Array PHP
$data = json_decode($json_data, true); // Passar true para obter um array associativo
$codigo = $data['codigo'];
// HTML da página
echo <<