Version 1.7.3 — ein Tor, eine Liste
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
parent
24a0f64128
commit
104ac46d45
|
|
@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in New Issue