t('devices.title'), 'devices' => TrustedDeviceService::devices(), 'currentSelector' => TrustedDeviceService::currentSelector(), 'saved' => isset($_GET['saved']), ]); } public static function revoke(): void { self::postOnly(); $id = (int) ($_POST['id'] ?? 0); TrustedDeviceService::revoke($id, (int) Auth::id()); AuditService::log( 'trusted_device_revoked', '/account/devices/revoke', 'Appareil de confiance révoqué', 'trusted_device', $id, ); header('Location: /account/devices?saved=1'); exit(); } public static function revokeAll(): void { self::postOnly(); DB::pdo() ->prepare("UPDATE trusted_devices SET revoked_at=datetime('now') WHERE user_id=? AND revoked_at IS NULL") ->execute([Auth::id()]); AuditService::log( 'trusted_devices_revoked', '/account/devices/revoke-all', 'Tous les appareils de confiance ont été révoqués', ); Auth::logout(); header('Location: /login'); exit(); } private static function postOnly(): void { if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') { http_response_code(405); header('Allow: POST'); exit(); } if (!Auth::validCsrf($_POST['csrf'] ?? null)) { http_response_code(419); echo h(t('auth.session_expired')); exit(); } } }