is(...self::ALWAYS_ALLOWED) || Settings::bool('site.public', true)) { return $next($request); } if ($this->isDownload($request)) { return $next($request); } if ($this->fromManagementNetwork($request) || $this->isActiveOperator()) { return $next($request); } return response()->view('coming-soon', [], 503)->withHeaders([ 'Retry-After' => 3600, 'X-Robots-Tag' => 'noindex, nofollow, noarchive', 'Cache-Control' => 'no-store', ]); } /** * Die Datei-Domain bleibt erreichbar, auch solange die Website verborgen ist. * * Sonst bricht jede Host-Übernahme, und zwar unsichtbar: ein Server im * Rettungssystem holt das Archiv mit `curl … | tar xz`, bekäme hier die * 503-Platzhalterseite und schöbe sie in `tar`. Der Betreiber sähe einen * Entpackfehler auf einer Maschine, an die er nur noch über die * Anbieterkonsole kommt — und nichts davon deutete auf einen Schalter in * der Konsole hin. Er ist per Definition weder in einem verwalteten Netz * noch angemeldet: das ist ja gerade der Zustand, den er verlassen will. * * Über den ROUTENNAMEN, nicht über den Pfad: die Route existiert nur, wenn * die Domain gebunden hat. Der Docblock oben warnt zu Recht davor, per * Hostname auszunehmen — dort ginge es aber um das gesamte Portal, und ein * gefälschter Host-Header hätte es aufgedeckt. Hier stehen zwei Routen * dahinter: die Rechtsdokumente, die ohnehin öffentlich sind, und das * Archiv, das ohne gültigen Einmal-Code mit 404 antwortet. Wer den Header * fälscht, gewinnt damit nichts, was er nicht auch nach dem Start hätte. */ private function isDownload(Request $request): bool { return in_array($request->route()?->getName(), ['bootstrap.archive', 'files.public'], true); } private function fromManagementNetwork(Request $request): bool { $ranges = (array) config('admin_access.trusted_ranges', []); return $ranges !== [] && IpUtils::checkIp((string) $request->ip(), $ranges); } /** * Same standard as EnsureAdmin: an active operator holding a console role. * A bare `check()` stays true for a disabled operator's live session — * disabling someone did not sign them out, so it never stopped this gate * from waving them through indefinitely. * * Deliberately checked, not enforced by logging out: this gate only * decides what ONE request sees, and destroying the session would ripple * into whatever else that session is doing (a concurrent console tab, * mid-task) — a much bigger side effect than a visibility check exists to * have. EnsureAdmin sets the precedent: it also 403s a disabled operator * per request without touching their session. */ private function isActiveOperator(): bool { $operator = Auth::guard('operator')->user(); return $operator !== null && $operator->isActive() && $operator->can('console.view'); } }