<?php
// =============================================================
// AUTH — простая защита паролем через сессию
// =============================================================

// --- Защита от деплоя с заводскими секретами ---
// Тот же guard, что и в bot.php: dashboard подключает config.php+auth.php
// (не bot.php), поэтому без этой проверки вход по дефолтному паролю
// 'change_me_please' остался бы открыт, даже когда сам бот отказывается
// стартовать. Блокируем ЛЮБУЮ страницу dashboard, пока секреты заводские.
if (defined('DASHBOARD_PASSWORD') && DASHBOARD_PASSWORD === 'change_me_please') {
    http_response_code(500);
    die('FATAL: Смените DASHBOARD_PASSWORD в config.php перед использованием dashboard.');
}
if (defined('CRON_SECRET') && CRON_SECRET === 'change_me_too_please') {
    http_response_code(500);
    die('FATAL: Смените CRON_SECRET в config.php перед использованием dashboard.');
}

// --- Параметры сессионной cookie (до session_start) ---
// httponly — недоступна JS (защита от кражи через XSS);
// samesite=Lax — cookie не уходит при кросс-сайтовых POST (доп. слой к CSRF);
// secure — только по HTTPS (если соединение зашифровано);
// use_strict_mode — отвергаем неинициализированные session id (анти-fixation).
ini_set('session.use_strict_mode', '1');
$secure = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
    || (($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '') === 'https');
session_set_cookie_params([
    'httponly' => true,
    'samesite' => 'Lax',
    'secure'   => $secure,
]);

session_start();

// --- Security headers ---
header('X-Frame-Options: DENY');
header('X-Content-Type-Options: nosniff');
header('Referrer-Policy: strict-origin-when-cross-origin');

/**
 * Проверяет авторизацию. Если не авторизован — редирект на login.
 * Подключать в начале каждой защищённой страницы.
 */
function require_auth(): void
{
    if (empty($_SESSION['authenticated']) || $_SESSION['authenticated'] !== true) {
        header('Location: login.php');
        exit;
    }
}

/**
 * Выход из сессии.
 */
function logout(): void
{
    $_SESSION = [];
    session_destroy();
}

// ---------------------------------------------------------------
// CSRF-защита
// ---------------------------------------------------------------

/**
 * Возвращает CSRF-токен из сессии (создаёт если нет).
 * Вставлять в каждую форму: <?= csrf_field() ?>
 */
function csrf_token(): string
{
    if (empty($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }
    return $_SESSION['csrf_token'];
}

/**
 * Готовый hidden-input для вставки в форму.
 */
function csrf_field(): string
{
    return '<input type="hidden" name="csrf_token" value="' . htmlspecialchars(csrf_token()) . '">';
}

/**
 * Проверяет CSRF-токен из POST. При провале — 403 и exit.
 * Вызывать в начале каждого POST-обработчика.
 */
function csrf_verify(): void
{
    $token = $_POST['csrf_token'] ?? '';
    if (!hash_equals(csrf_token(), $token)) {
        http_response_code(403);
        echo 'CSRF token mismatch';
        exit;
    }
}
