withProviders([ TinkerServiceProvider::class, GravatarServiceProvider::class, ]) ->withRouting( web: __DIR__.'/../routes/web.php', api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', channels: __DIR__.'/../routes/channels.php', health: '/up', then: static function (): void { Route::middleware('api') ->prefix('rss') ->group(base_path('routes/rss.php')); }, ) ->withMiddleware(function (Middleware $middleware) { $middleware->redirectGuestsTo(fn () => route('login')); $middleware->redirectUsersTo('/'); $middleware->validateCsrfTokens(except: [ 'failed', 'admin/*', 'btcpay/webhook', 'logout', 'register', 'contact-us', 'forgottenpassword', 'login', 'cart', 'cart/*', ]); $middleware->append([ PreventRequestsDuringMaintenance::class, ForceJsonOnAPI::class, BlockAbusiveServices::class, // Block AIOStreams, Oracle Cloud, UsenetStreamer, Cloudflare WARP ]); $middleware->replace( BaseTrustProxies::class, AppTrustProxies::class ); $middleware->web([ AuthenticateSession::class, TrustedDevice2FAMiddleware::class, // Add our new trusted device middleware ContentSecurityPolicy::class, // Add CSP middleware for security SetUserTimezone::class, // Set user timezone NoCacheForAuthenticatedUsers::class, // Prevent Cloudflare/CDN caching of authenticated pages ]); $middleware->throttleApi('60,1'); $middleware->alias([ '2fa' => Google2FAMiddleware::class, 'bindings' => SubstituteBindings::class, 'clearance' => ClearanceMiddleware::class, 'apiRateLimit' => ThrottleApiRequestsByToken::class, 'isVerified' => EnsureAuthenticatedUsersAreVerified::class, 'permission' => PermissionMiddleware::class, 'role' => RoleMiddleware::class, 'role_or_permission' => RoleOrPermissionMiddleware::class, ]); }) ->withExceptions(function (Exceptions $exceptions) { Integration::handles($exceptions); })->create();