diff --git a/docker-compose.yml b/docker-compose.yml index fa84f33..1d9314a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,7 +16,7 @@ services: - ./sql/schema.sql:/docker-entrypoint-initdb.d/01_schema.sql - ./sql/schema_auth.sql:/docker-entrypoint-initdb.d/02_schema_auth.sql ports: - - "3307:3306" + - "3308:3306" networks: - prodmais healthcheck: @@ -34,7 +34,7 @@ services: PMA_PORT: 3306 MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASS:-root} ports: - - "8081:80" + - "8082:80" depends_on: - db networks: @@ -82,7 +82,7 @@ services: container_name: prodmais_web restart: always ports: - - "8080:80" + - "8090:80" volumes: - .:/var/www/html - /var/www/html/vendor diff --git a/public/login.php b/public/login.php index 9e48334..3e0826e 100644 --- a/public/login.php +++ b/public/login.php @@ -14,16 +14,46 @@ session_start(); } -$error = ''; +// Redirecionar se já autenticado +if (!empty($_SESSION['user_id'])) { + $papel_atual = $_SESSION['papel'] ?? ''; + $dest_already = in_array($papel_atual, ['admin', 'pesquisador']) ? '/admin.php' : '/dashboard.php'; + header('Location: ' . $dest_already); + exit; +} + +require_once __DIR__ . '/../src/Domain/Security/AuthManager.php'; + +$error = ''; +$success = ''; -// Lógica de Autenticação (Exemplo simplificado) if ($_SERVER['REQUEST_METHOD'] === 'POST') { - $user = $_POST['user'] ?? ''; - $pass = $_POST['password'] ?? ''; - - // Aqui viria a chamada ao AuthManager - $error = 'Credenciais incorretas para demonstração.'; + $username = filter_input(INPUT_POST, 'user', FILTER_SANITIZE_SPECIAL_CHARS) ?? ''; + $password = $_POST['password'] ?? ''; + + $host = getenv('MYSQL_HOST') ?: 'db'; + $db_name = getenv('MYSQL_DB') ?: 'prodmais_umc'; + $db_user = getenv('MYSQL_USER') ?: 'prodmais'; + $db_pass = getenv('MYSQL_PASS') ?: 'prodmais123'; + + try { + $pdo = new PDO("mysql:host=$host;dbname=$db_name;charset=utf8mb4", $db_user, $db_pass); + $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + $auth = new AuthManager($pdo); + $result = $auth->login($username, $password); + + if ($result['sucesso']) { + $destino = in_array($_SESSION['papel'] ?? '', ['admin', 'pesquisador']) ? '/admin.php' : '/dashboard.php'; + header('Location: ' . $destino); + exit; + } + + $error = $result['mensagem']; + } catch (PDOException $e) { + error_log('Login DB error: ' . $e->getMessage()); + $error = 'Erro de conexão com o banco de dados. Tente novamente.'; + } } -// Renderizar a página usando o Componente Modular LoginPage::display(['error' => $error]); diff --git a/public/logout.php b/public/logout.php new file mode 100644 index 0000000..99b8aa6 --- /dev/null +++ b/public/logout.php @@ -0,0 +1,12 @@ +db->prepare(" - SELECT id, username, email, password_hash, tentativas_login, bloqueado_ate, nome_completo - FROM usuarios_admin + SELECT id, username, email, password_hash, tentativas_login, bloqueado_ate, nome_completo, status, papel + FROM usuarios_admin WHERE username = ? OR email = ? "); $stmt->execute([$username, $username]); $usuario = $stmt->fetch(PDO::FETCH_ASSOC); - + if (!$usuario) { $this->registrarTentativa(null, $username, false, 'Usuario nao encontrado'); return ['sucesso' => false, 'mensagem' => 'Usuario ou senha invalidos']; } - + + // Verificar status da conta + if ($usuario['status'] === 'pendente') { + return ['sucesso' => false, 'mensagem' => 'Sua conta aguarda aprovação de um administrador']; + } + if ($usuario['status'] === 'inativo') { + return ['sucesso' => false, 'mensagem' => 'Conta desativada. Entre em contato com o administrador']; + } + // Verificar bloqueio if ($usuario['bloqueado_ate'] && strtotime($usuario['bloqueado_ate']) > time()) { $tempo_restante = ceil((strtotime($usuario['bloqueado_ate']) - time()) / 60); @@ -107,10 +115,12 @@ public function login($username, $password) { // Configurar sessao session_regenerate_id(true); - $_SESSION['user_id'] = $usuario['id']; - $_SESSION['username'] = $usuario['username']; + $_SESSION['user_id'] = $usuario['id']; + $_SESSION['username'] = $usuario['username']; + $_SESSION['user'] = $usuario['username']; // compatibilidade com admin.php $_SESSION['nome_completo'] = $usuario['nome_completo']; - $_SESSION['criado_em'] = time(); + $_SESSION['papel'] = $usuario['papel']; + $_SESSION['criado_em'] = time(); $_SESSION['ultima_atividade'] = time(); $this->registrarTentativa($usuario['id'], $username, true, null); diff --git a/src/UmcFunctions.php b/src/UmcFunctions.php index 82d7293..5525217 100644 --- a/src/UmcFunctions.php +++ b/src/UmcFunctions.php @@ -419,6 +419,42 @@ function isDebugMode() { } } +/** + * Renderiza badge de usuário logado após o Navbar. + * Injeta JS que modifica o botão "Área Admin" dinamicamente. + */ +function renderNavbarAuthBadge(): void { + if (session_status() === PHP_SESSION_NONE) { + return; + } + $user_id = $_SESSION['user_id'] ?? null; + $username = htmlspecialchars($_SESSION['username'] ?? '', ENT_QUOTES); + $nome = htmlspecialchars($_SESSION['nome_completo'] ?? $username, ENT_QUOTES); + $papel = $_SESSION['papel'] ?? ''; + + if (!$user_id) { + return; + } + + $admin_href = in_array($papel, ['admin', 'pesquisador']) ? '/admin.php' : '/dashboard.php'; + echo << +(function(){ + document.addEventListener('DOMContentLoaded', function() { + var btn = document.querySelector('.nav-cta-admin'); + if (!btn) return; + btn.href = '{$admin_href}'; + btn.innerHTML = ' {$nome}'; + btn.title = 'Logado como {$username}'; + btn.insertAdjacentHTML('afterend', + '' + ); + }); +})(); + +HTML; +} + /** * Log de acesso (LGPD) */ diff --git a/src/View/Pages/Auth/ChangePasswordPage.php b/src/View/Pages/Auth/ChangePasswordPage.php index 0e683fb..b69989f 100644 --- a/src/View/Pages/Auth/ChangePasswordPage.php +++ b/src/View/Pages/Auth/ChangePasswordPage.php @@ -1,12 +1,10 @@ setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { - die("Erro de conexao: " . $e->getMessage()); + die("Erro de conexão: " . $e->getMessage()); } -$auth = new AuthManager($db); -$mensagem = ''; -$tipo_mensagem = ''; +$auth = new AuthManager($db); +$mensagem = ''; +$tipo = ''; +$concluido = false; if ($_SERVER['REQUEST_METHOD'] === 'POST') { - $senha_atual = $_POST['senha_atual'] ?? ''; - $nova_senha = $_POST['nova_senha'] ?? ''; + $senha_atual = $_POST['senha_atual'] ?? ''; + $nova_senha = $_POST['nova_senha'] ?? ''; $confirmar_senha = $_POST['confirmar_senha'] ?? ''; - - if ($nova_senha !== $confirmar_senha) { - $mensagem = 'As senhas nao coincidem'; - $tipo_mensagem = 'danger'; + + if (strlen($nova_senha) < 8) { + $mensagem = 'A nova senha deve ter pelo menos 8 caracteres.'; + $tipo = 'error'; + } elseif ($nova_senha !== $confirmar_senha) { + $mensagem = 'As senhas não coincidem.'; + $tipo = 'error'; } else { $resultado = $auth->trocarSenha($_SESSION['user_id'], $senha_atual, $nova_senha); - $mensagem = $resultado['mensagem']; - $tipo_mensagem = $resultado['sucesso'] ? 'success' : 'danger'; + $mensagem = $resultado['mensagem']; + $tipo = $resultado['sucesso'] ? 'success' : 'error'; + $concluido = $resultado['sucesso']; } } $usuario = $auth->getUsuarioLogado(); +$nome_exibido = $usuario['nome_completo'] ?? $usuario['username'] ?? 'Usuário'; ?> @@ -50,297 +58,629 @@ -