🧩 PEDRO SILVA - Diagnóstico Completo


1. Servidor

Software: Apache

Sistema Operativo: Linux webm009.cluster121.gra.hosting.ovh.net 5.15.167-ovh-vps-grsec-zfs-classid #1 SMP Tue Sep 17 08:14:20 UTC 2024 x86_64

IP do Servidor: 10.121.20.9

Porta: 443

Protocolo: HTTP/1.1

2. PHP

Versão: 8.2.29

SAPI: fpm-fcgi

Limite de memória: 512M

Tempo máximo de execução: 165s

Upload máximo: 128M

3. Extensões Necessárias

pdo: Instalada

pdo_mysql: Instalada

pdo_sqlite: Instalada

4. Ficheiros Necessários

index.php encontrado em .

config.php encontrado em ../core

setup-database.php encontrado em ../database

.htaccess não encontrado

.env encontrado em ../core

login.html encontrado em ../auth

styles.css encontrado em ../assets/css

theme.js encontrado em ../assets/css

5. Ficheiro .env

Ficheiro .env existe

<?php
/**
 * PEDRO SILVA - Database Configuration
 * 
 * Este ficheiro contém as configurações de ligação à base de dados.
 * Altere os valores abaixo de acordo com a sua hospedagem.
 */

// ============================================
// CARREGAR VARIÁVEIS DE AMBIENTE (.env)
// ============================================

$envFile = __DIR__ . '/.env';
if (file_exists($envFile)) {
    $lines = file($envFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    foreach ($lines as $line) {
        if (strpos($line, '=') !== false && strpos($line, '#') !== 0) {
            list($key, $value) = explode('=', $line, 2);
            $key = trim($key);
            $value = trim($value);
            // Remover aspas se existirem
            $value = trim($value, '"\'');
            putenv("$key=$value");
        }
    }
}

// ============================================
// CONFIGURAÇÃO DA BASE DE DADOS
// ============================================

// Tipo de base de dados: 'sqlite' ou 'mysql'
// Pode ser definido via variável de ambiente DB_TYPE

define('DB_TYPE', getenv('DB_TYPE') ?: 'mysql');

// ============================================
// CONFIGURAÇÃO MySQL
// ============================================
if (DB_TYPE === 'mysql') {
    define('DB_HOST', getenv('DB_HOST') ?: 'localhost');
    define('DB_USER', getenv('DB_USER') ?: 'root');
    define('DB_PASS', getenv('DB_PASS') ?: '');
    define('DB_NAME', getenv('DB_NAME') ?: 'barmanager');
    define('DB_PORT', getenv('DB_PORT') ?: 3306);
}


// CONFIGURAÇÕES GERAIS
// ============================================

// Chave de sessão (altere para um valor aleatório seguro)
define('SESSION_SECRET', getenv('SESSION_SECRET') ?: 'seu-secret-key-aleatorio-aqui-' . md5(__FILE__));

// Timezone
date_default_timezone_set(getenv('TIMEZONE') ?: 'Europe/Lisbon');

// Modo de debug (true para desenvolvimento, false para produção)
define('DEBUG_MODE', getenv('DEBUG_MODE') === 'true' ? true : false);

// ============================================
// FUNÇÃO DE LIGAÇÃO À BASE DE DADOS
// ============================================

function getDatabase() {
    if (DB_TYPE === 'sqlite') {
        try {
            $db = new PDO('sqlite:' . DB_PATH, null, null, [PDO::ATTR_TIMEOUT => 5]);
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            return $db;
        } catch (PDOException $e) {
            die('Erro ao conectar à base de dados SQLite: ' . $e->getMessage());
        }
    } elseif (DB_TYPE === 'mysql') {
        try {
            $dsn = 'mysql:host=' . DB_HOST . ';port=' . DB_PORT . ';dbname=' . DB_NAME . ';charset=utf8mb4';
            $db = new PDO($dsn, DB_USER, DB_PASS, [PDO::ATTR_TIMEOUT => 5]);
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            return $db;
        } catch (PDOException $e) {
            die('Erro ao conectar à base de dados MySQL: ' . $e->getMessage());
        }
    }
}

// ============================================
// INICIALIZAR BASE DE DADOS
// ============================================

function initializeDatabase() {
    $db = getDatabase();
    
    // Determinar tipo de BD
    $dbType = DB_TYPE;
    
    if ($dbType === 'mysql') {
        // Criar tabela para MySQL
        $db->exec("
            CREATE TABLE IF NOT EXISTS users (
                id INT AUTO_INCREMENT PRIMARY KEY,
                username VARCHAR(255) UNIQUE NOT NULL,
                email VARCHAR(255) UNIQUE NOT NULL,
                password VARCHAR(255) NOT NULL,
                failed_attempts INT DEFAULT 0,
                last_failed_login DATETIME NULL,
                role VARCHAR(50) DEFAULT 'user',
                last_login_ip VARCHAR(45) NULL,
                last_login_agent TEXT NULL,
                last_login_at DATETIME NULL,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
        ");
        
        // Criar tabela para preco salvo
        $db->exec("
            CREATE TABLE IF NOT EXISTS user_saved_price (
                id INT AUTO_INCREMENT PRIMARY KEY,
                user_id INT NOT NULL,
                price DECIMAL(10, 2) NOT NULL,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
                UNIQUE KEY unique_user (user_id)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
        ");
    } else {
        // Criar tabela para SQLite
        $db->exec("
            CREATE TABLE IF NOT EXISTS users (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                username TEXT UNIQUE NOT NULL,
                email TEXT UNIQUE NOT NULL,
                password TEXT NOT NULL,
                failed_attempts INTEGER DEFAULT 0,
                last_failed_login DATETIME NULL,
                role TEXT DEFAULT 'user',
                last_login_ip TEXT NULL,
                last_login_agent TEXT NULL,
                last_login_at DATETIME NULL,
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP
            )
        ");
        
        // Criar tabela para preco salvo
        $db->exec("
            CREATE TABLE IF NOT EXISTS user_saved_price (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                user_id INTEGER NOT NULL UNIQUE,
                price REAL NOT NULL,
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
                updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
                FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
            )
        ");
    }
    
    // Não criar utilizador admin automaticamente
    // O utilizador admin deve ser criado apenas através do setup-database.php ou reset-database.php
    
    return $db;
}

?>

6. Base de Dados

Tipo: mysql

Servidor: frompeo811.mysql.db

Base de dados: frompeo811

7. Permissões de Ficheiros

index.php (Ficheiro): 0604

8. Caminhos & Diretórios

Local atual: /home/frompeo/www/modules

Root do servidor: /home/frompeo/www

Script atual: /modules/diagnose.php

9. Estado de Segurança

✅ HTTPS: Ativo

✅ Database: Senhas encriptadas

✅ Sessions: Secure

✅ Input validation: Active