const crypto = require('crypto');

const API_KEY = process.env.INTERNAL_API_KEY;

/**
 * Middleware di autenticazione per servizi interni (container-to-container).
 * Verifica l'header 'x-internal-api-key' contro INTERNAL_API_KEY nell'env.
 * 
 * SICUREZZA:
 * - Se INTERNAL_API_KEY non è configurata, TUTTE le richieste vengono rifiutate
 * - Usa timingSafeEqual per prevenire attacchi timing side-channel
 */
const internalAuth = (req, res, next) => {
    // Se la chiave non è configurata nel server, blocca tutto
    if (!API_KEY) {
        console.error('[SECURITY] INTERNAL_API_KEY absent! All internal requests blocked.');
        return res.status(503).json({ error: 'Service not configured correctly' });
    }

    const internalToken = req.headers['x-internal-api-key'];

    if (!internalToken || typeof internalToken !== 'string') {
        return res.status(403).json({ error: 'unauthorized' });
    }

    // Confronto timing-safe per prevenire timing attacks
    try {
        const tokenBuffer = Buffer.from(internalToken, 'utf8');
        const keyBuffer = Buffer.from(API_KEY, 'utf8');

        if (tokenBuffer.length !== keyBuffer.length || !crypto.timingSafeEqual(tokenBuffer, keyBuffer)) {
            return res.status(403).json({ error: 'Accesso negato' });
        }
    } catch {
        return res.status(403).json({ error: 'Accesso negato' });
    }

    req.user = { id: 'system', role: 'internal_service' };
    return next();
};

module.exports = internalAuth;
