query("SHOW TABLES LIKE " . $pdo->quote($s['table']))->fetchColumn() !== false; } catch (Throwable $e) { $usersTableExists = true; // cannot tell -> assume configured } if (!$usersTableExists) { $sysadminExists = false; // fresh install: nobody to authenticate yet } else { try { $sysadminExists = (bool) $pdo->query( "SELECT 1 FROM `{$s['table']}` WHERE `{$s['role']}` = 'sysadmin' LIMIT 1" )->fetchColumn(); } catch (Throwable $e) { error_log('[setup] sysadmin check failed, denying access: ' . $e->getMessage()); $sysadminExists = true; } } $isSysadmin = function_exists('auth_is_sysadmin') ? auth_is_sysadmin() : (($_SESSION['user']['role'] ?? '') === 'sysadmin'); if ($sysadminExists && !$isSysadmin) { http_response_code(403); exit('Configuração já concluída. Entre como sysadmin para a alterar.'); } // ─── Actions ──────────────────────────────────────────────────────────────── $errors = []; $saved = false; $test = null; $state = platform_setup_state($pdo); if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!platform_csrf_ok()) { $errors[] = 'Pedido rejeitado (token CSRF ausente ou inválido). Recarregue a página.'; } else { $action = (string) ($_POST['_action'] ?? 'save'); $uid = isset($_SESSION['user']['id']) ? (int) $_SESSION['user']['id'] : null; $r = platform_setup_save_smtp($pdo, $_POST, $uid); if (!$r['ok']) { $errors = $r['errors']; } else { $saved = true; $state = platform_setup_state($pdo); if ($action === 'save_test') { $test = platform_setup_test_smtp($pdo, $repo_root); } } } } $c = $state['config']; $h = fn($v) => htmlspecialchars((string) $v, ENT_QUOTES, 'UTF-8'); ?> <?= $h($setup_title) ?>

Falta configurar o envio de email. A plataforma fica retida aqui até estar feito.

Configuração guardada. A plataforma já pode enviar email.
Guardado, mas ainda falta: .
APP_SECRET_KEY não está definida no .env. A palavra-passe de SMTP seria guardada em claro na base de dados — e a base de dados vai para dentro de cada backup. Defina a chave antes de continuar.

587 para TLS, 465 para SSL.

Porque é obrigatório: sem SMTP ninguém recupera a palavra-passe, nenhum aviso chega e nenhum formulário de contacto é entregue — e nada disso falha de forma visível. Falha como silêncio, semanas depois.