// Hermes 管理员认证中间件 — 使用环境变量 HERMES_ADMIN_TOKEN 进行 Bearer token 认证

const crypto = require('crypto');

const DEFAULT_TOKEN = 'dev_only_admin_token_change_me';
const ADMIN_TOKEN = process.env.HERMES_ADMIN_TOKEN;

// P1 修复：生产环境 fail-fast
if (!ADMIN_TOKEN) {
  if (process.env.NODE_ENV === 'production') {
    throw new Error(
      'HERMES_ADMIN_TOKEN 环境变量未设置。请生成一个强随机值（可用 openssl rand -hex 32）并配置到 .env 文件中。'
    );
  }
  console.warn('[安全警告] HERMES_ADMIN_TOKEN 未设置，使用开发环境默认 token。请勿在生产环境使用。');
}

const EFFECTIVE_TOKEN = ADMIN_TOKEN || DEFAULT_TOKEN;

function adminAuthMiddleware(req, res, next) {
  const authHeader = req.headers.authorization;
  if (!authHeader || !authHeader.startsWith('Bearer ')) {
    return res.status(401).json({ error: '需要管理员认证' });
  }
  const token = authHeader.slice(7);

  // P3 修复：恒定时间比较，防止时序攻击
  const a = Buffer.from(token);
  const b = Buffer.from(EFFECTIVE_TOKEN);
  if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
    return res.status(403).json({ error: '管理员 token 无效' });
  }
  next();
}

module.exports = { adminAuthMiddleware };
