- shared/platform-tools: ea3616a → 12f26fd (27 commits). Traz o módulo de audit (f761d99, o pin da frota), «manter sessão iniciada», o registo de segurança da frota (o gancho que o login já tinha passa a funcionar) e a correção do IP do cliente encontrada nesta auditoria (último X-Forwarded-For / X-Real-IP), promovida ao partilhado. client_ip() da app delega nele. - config/functions_audit.php: audit() sobre platform_audit(); tabela audit_log criada no primeiro uso, segredos ocultados, nunca parte a ação. - Registado: login, falha de login, bloqueio por excesso de tentativas, logout, pedidos de recuperação, mudança/definição de palavra-passe, registo e criação de utilizadores, convites, perfil (antes/depois), todas as definições (db_update_setting, com valor anterior), cada passo da lixeira (apagar, restaurar, eliminar de vez) e ações nas mensagens. - Sistema → Auditoria (views/sysadmin/audit.php), só sysadmin. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
83 lines
3.6 KiB
PHP
83 lines
3.6 KiB
PHP
<?php
|
|
/**
|
|
* Configuração partilhada pelos scripts de backup.
|
|
* Assumed location: <host>/shared/platform-tools/backups/config.php
|
|
*
|
|
* Valores vêm do .env na raiz do projecto (<host>/.env, gitignored). Os
|
|
* fallbacks abaixo só são usados se o .env estiver ausente — em produção,
|
|
* mete sempre o .env preenchido.
|
|
*/
|
|
|
|
$host_root = dirname(__DIR__, 3);
|
|
|
|
// Three host patterns coexist:
|
|
// - fotografia-style : config/env.php exposes env_load(), needs an explicit call
|
|
// - dsa/moremio-style: config/env.php auto-loads .env via an IIFE; require is enough
|
|
// - surf-style : no config/env.php -- config/db.php loads .env with
|
|
// vlucas/phpdotenv, and the workers run without it, so
|
|
// they read .env themselves (the fallback below).
|
|
// Requiring config/env.php unconditionally fataled on the third layout.
|
|
if (is_file($host_root . '/config/env.php')) {
|
|
require_once $host_root . '/config/env.php';
|
|
if (function_exists('env_load')) {
|
|
env_load($host_root . '/.env');
|
|
}
|
|
}
|
|
|
|
// Fallback reader for hosts with no config/env.php, and for CLI invocations
|
|
// that run before any framework bootstrap: parse .env directly rather than
|
|
// assuming something else already did.
|
|
if (!function_exists('env')) {
|
|
function env(string $key, $default = null) {
|
|
$v = getenv($key);
|
|
if ($v === false && array_key_exists($key, $_ENV)) $v = $_ENV[$key];
|
|
if ($v !== false && $v !== null) return $v;
|
|
|
|
static $parsed = null;
|
|
if ($parsed === null) {
|
|
$parsed = [];
|
|
$f = dirname(__DIR__, 3) . '/.env';
|
|
if (is_file($f) && is_readable($f)) {
|
|
foreach (file($f, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line) {
|
|
$line = trim($line);
|
|
if ($line === '' || $line[0] === '#' || !str_contains($line, '=')) continue;
|
|
[$k, $val] = array_pad(explode('=', $line, 2), 2, '');
|
|
$parsed[trim($k)] = trim(trim($val), " \"'");
|
|
}
|
|
}
|
|
}
|
|
return array_key_exists($key, $parsed) ? $parsed[$key] : $default;
|
|
}
|
|
}
|
|
|
|
define('BACKUP_TOKEN', env('BACKUP_TOKEN', 'replace_me'));
|
|
// Retenção avô-pai-filho — ver backup_gfs_keep() em functions_backup.php.
|
|
define('BACKUP_KEEP_DAYS', (int) env('BACKUP_KEEP_DAYS', 7));
|
|
define('BACKUP_KEEP_WEEKS', (int) env('BACKUP_KEEP_WEEKS', 4));
|
|
define('BACKUP_KEEP_MONTHS', (int) env('BACKUP_KEEP_MONTHS', 1));
|
|
|
|
// Pasta (relativa à raiz do host) que o backup de ficheiros arquiva. Só os
|
|
// uploads têm informação externa — todo o resto é reconstituível a partir do
|
|
// git — por isso o default é 'uploads'. Overridável no .env se um host
|
|
// guardar os uploads noutro sítio.
|
|
define('BACKUP_FILES_DIR', trim((string) env('BACKUP_FILES_DIR', 'uploads'), '/'));
|
|
|
|
// Credenciais da base de dados — sem fallbacks reais: se o .env faltar, a
|
|
// ligação falha alto em vez de tentar um host/utilizador "mágico".
|
|
define('DB_HOST', env('DB_HOST', 'localhost'));
|
|
define('DB_PORT', (int) env('DB_PORT', 3306));
|
|
define('DB_NAME', env('DB_NAME', ''));
|
|
define('DB_USER', env('DB_USER', ''));
|
|
define('DB_PASS', env('DB_PASS', ''));
|
|
define('DB_CHARSET', 'utf8mb4');
|
|
|
|
/** Poda avô-pai-filho no fim de um worker (ver backup_prune()), com o relatório no output. */
|
|
function backup_prune_report(): void
|
|
{
|
|
$r = backup_prune();
|
|
foreach ($r['deleted'] as $f) echo "Apagado (retenção): $f\n";
|
|
foreach ($r['errors'] as $f) echo "ERRO a apagar: $f\n";
|
|
echo 'Rotação: ' . count($r['deleted']) . ' apagado(s), ' . count($r['kept']) . ' mantido(s) — '
|
|
. backup_retention_summary($r['policy']) . ".\n";
|
|
}
|