5, 'window_seconds' => 60], ['max' => 20, 'window_seconds' => 3600], ]); define('RATE_LIMIT_AUTH_REGISTER', [ ['max' => 3, 'window_seconds' => 600], ]); // Password reset (Fase 3 / G08): 3 richieste/h per IP+email define('RATE_LIMIT_AUTH_FORGOT', [ ['max' => 3, 'window_seconds' => 3600], ]); // TTL token reset password (decisione utente §10.4: 30 min) define('PASSWORD_RESET_TTL_SECONDS', 1800); define('RATE_LIMIT_AI', [ ['max' => 10, 'window_seconds' => 60], ['max' => 100, 'window_seconds' => 3600], ]); // ═══════════════════════════════════════════════════════════════════════════ // AI (ANTHROPIC) // ═══════════════════════════════════════════════════════════════════════════ define('ANTHROPIC_API_KEY', Env::get('ANTHROPIC_API_KEY', '')); define('ANTHROPIC_MODEL', Env::get('ANTHROPIC_MODEL', 'claude-sonnet-4-5-20250929')); define('ANTHROPIC_MAX_TOKENS', Env::int('ANTHROPIC_MAX_TOKENS', 4096)); // ═══════════════════════════════════════════════════════════════════════════ // VOCEA (Whistleblowing zero-knowledge — integrazione, DISABILITATA di default) // ═══════════════════════════════════════════════════════════════════════════ // SCAFFOLD DORMIENTE: con VOCEA_ENABLED=false (default) VoceaService non effettua // nessuna chiamata di rete. Attivazione a MS live: applicare migrate_063 + // VOCEA_ENABLED=true + VOCEA_API_KEY (vault tier1__nis2-agile__vocea__*) + // slug del canale su organizations.vocea_tenant_slug (status='active'). define('VOCEA_ENABLED', filter_var(Env::get('VOCEA_ENABLED', 'false'), FILTER_VALIDATE_BOOLEAN)); define('VOCEA_BASE_URL', Env::get('VOCEA_BASE_URL', 'https://api.vocea.cloud/api/wb/v1')); // API integratori (X-API-Key) define('VOCEA_API_KEY', Env::get('VOCEA_API_KEY', '')); // wbk_... per-tenant (da vault) define('VOCEA_PORTAL_URL', Env::get('VOCEA_PORTAL_URL', 'https://app.vocea.cloud')); // portale embed via wb-link.js // ═══════════════════════════════════════════════════════════════════════════ // CERTISOURCE (atti-service.php) // ═══════════════════════════════════════════════════════════════════════════ define('CERTISOURCE_API_URL', Env::get('CERTISOURCE_API_URL', 'https://certisource.it/atti-service.php')); define('CERTISOURCE_API_KEY', Env::get('CERTISOURCE_API_KEY', '')); // cs_pat_... define('CERTISOURCE_POLL_MAX', Env::int('CERTISOURCE_POLL_MAX', 30)); // max tentativi polling define('CERTISOURCE_POLL_SEC', Env::int('CERTISOURCE_POLL_SEC', 3)); // secondi tra poll // ═══════════════════════════════════════════════════════════════════════════ // FEEDBACK & SEGNALAZIONI // ═══════════════════════════════════════════════════════════════════════════ define('FEEDBACK_RESOLVE_PASSWORD', Env::get('FEEDBACK_RESOLVE_PASSWORD', '')); define('FEEDBACK_WORKER_LOG', Env::get('FEEDBACK_WORKER_LOG', '/var/log/nis2/feedback-worker.log')); // ═══════════════════════════════════════════════════════════════════════════ // TIMEZONE // ═══════════════════════════════════════════════════════════════════════════ date_default_timezone_set('Europe/Rome');