Version 1.7.3 — ein Tor, eine Liste
tests / pest (push) Waiting to run Details
tests / assets (push) Waiting to run Details
tests / release (push) Blocked by required conditions Details

Bei verborgener Website kam der Betreiber auf admin. und stand auf www., app.
und status. vor der Baustellenseite seines eigenen Portals — obwohl er im VPN
war und seine Adresse in der Konsole freigegeben hatte.

Zwei Tore hatten zwei Vorstellungen davon, wer "wir" sind:

  RestrictConsoleNetwork  VPN-Subnetz + die Freigabeliste aus der Konsole
  PublicSiteGate          nur admin_access.trusted_ranges

Wer seine Bueroadresse eintrug, oeffnete damit nur das eine Tor. Das andere
kannte die Liste nicht und liess ihn stehen — was wie ein kaputtes VPN aussah
und keines war.

Jetzt fragt das Seiten-Tor dieselbe Stelle wie das Konsolentor. Eine Liste, ein
Begriff davon, wer hereindarf: wer die Konsole sehen darf, darf die versteckte
Seite auch sehen. Das ist dieselbe Person.

2901 Tests gruen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat/versandtakt v1.7.3
nexxo 2026-08-04 11:17:05 +02:00
parent 24a0f64128
commit 104ac46d45
3 changed files with 28 additions and 5 deletions

View File

@ -1 +1 @@
1.7.2
1.7.3

View File

@ -7,7 +7,6 @@ use App\Support\Settings;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\IpUtils;
use Symfony\Component\HttpFoundation\Response;
/**
@ -96,11 +95,22 @@ class PublicSiteGate
return in_array($request->route()?->getName(), ['bootstrap.archive', 'files.public'], true);
}
/**
* Dieselbe Frage wie das Konsolentor, aus derselben Quelle.
*
* Hier stand eine EIGENE Liste (`admin_access.trusted_ranges`), während
* `RestrictConsoleNetwork` das VPN-Subnetz PLUS die Freigabeliste liest,
* die der Betreiber in der Konsole pflegt. Zwei Vorstellungen davon, wer
* „wir" sind — und wer seine Büroadresse eingetragen hatte, kam auf
* `admin.` und auf `www.`/`app.`/`status.` nicht. Er stand also vor der
* Baustellenseite seines eigenen Portals und hielt das VPN für kaputt.
*
* Eine Liste, ein Tor. Wer die Konsole sehen darf, darf die versteckte
* Seite auch sehen das ist dieselbe Person.
*/
private function fromManagementNetwork(Request $request): bool
{
$ranges = (array) config('admin_access.trusted_ranges', []);
return $ranges !== [] && IpUtils::checkIp((string) $request->ip(), $ranges);
return RestrictConsoleNetwork::allows((string) $request->ip());
}
/**

View File

@ -163,3 +163,16 @@ it('does not leave the portal drivable through Livewire while hidden', function
expect($status)->not->toBe(503);
});
it('lets the address the operator allowlisted through the hidden site, not only the VPN', function () {
// Zwei Tore hatten zwei Vorstellungen davon, wer „wir" sind: Die Konsole
// las VPN-Subnetz PLUS die Freigabeliste, dieses Tor nur eine eigene
// Konfigurationsliste. Wer seine Büroadresse eingetragen hatte, kam auf
// `admin.` und stand auf `www.`/`app.` vor der Baustellenseite seines
// eigenen Portals — und hielt das VPN für kaputt.
Settings::set('site.public', false);
Settings::set('console.allowed_ips', ['203.0.113.77']);
$this->withServerVariables(['REMOTE_ADDR' => '203.0.113.77'])->get('/')->assertOk();
$this->withServerVariables(['REMOTE_ADDR' => '198.51.100.9'])->get('/')->assertStatus(503);
});