69 lines
2.4 KiB
PHP
69 lines
2.4 KiB
PHP
<?php
|
|
|
|
namespace App\Support;
|
|
|
|
/**
|
|
* Die Hostnamen, die diese Installation ohnehin schon bedient.
|
|
*
|
|
* Abgeleitet, nie getippt. Genau das war der Fehler in der ersten Fassung der
|
|
* Hostnamen-Seite: sie war ein leeres Register und zeigte deshalb nichts —
|
|
* während die Installation längst ein halbes Dutzend Namen bediente, deren
|
|
* Zertifikate der Betreiber gerade sehen wollte. Eine Übersicht, die erst
|
|
* befüllt werden muss, beantwortet die Frage „was habe ich" nicht.
|
|
*
|
|
* Die Quellen sind dieselben, aus denen `routes/web.php` seine Domain-Bindungen
|
|
* baut. Steht ein Name in der Umgebung, antwortet die Anwendung darauf — und
|
|
* dann gehört er in diese Liste, ohne dass jemand ihn ein zweites Mal einträgt.
|
|
*/
|
|
final class KnownHostnames
|
|
{
|
|
/**
|
|
* @return array<string, string> hostname => Zweck ('public' | 'console')
|
|
*/
|
|
public static function all(): array
|
|
{
|
|
$found = [];
|
|
|
|
foreach ((array) config('admin_access.site_hosts', []) as $host) {
|
|
self::add($found, $host, 'public');
|
|
}
|
|
|
|
foreach ([
|
|
'admin_access.app_host',
|
|
'admin_access.status_host',
|
|
'admin_access.files_host',
|
|
] as $key) {
|
|
self::add($found, (string) config($key, ''), 'public');
|
|
}
|
|
|
|
// Die Konsole und ihre Ausweichnamen. `console`, weil sie hinter der
|
|
// Netzsperre liegen — ein Name mit dem falschen Zweck sähe hier aus wie
|
|
// eine funktionierende Seite und wäre eine offene Konsole.
|
|
foreach ((array) config('admin_access.hosts', []) as $host) {
|
|
self::add($found, $host, 'console');
|
|
}
|
|
|
|
ksort($found);
|
|
|
|
return $found;
|
|
}
|
|
|
|
private static function add(array &$found, string $host, string $purpose): void
|
|
{
|
|
$host = strtolower(trim($host));
|
|
|
|
// Kein Schema, kein Pfad, kein Port — und mindestens ein Punkt. Ein
|
|
// blanker Name wie `localhost` ist ein Entwicklungsrest und hat kein
|
|
// Zertifikat, das jemand überwachen wollte.
|
|
if ($host === '' || ! str_contains($host, '.') || preg_match('/[^a-z0-9.\-]/', $host)) {
|
|
return;
|
|
}
|
|
|
|
// Konsole gewinnt gegen öffentlich, wenn ein Name in beiden Listen
|
|
// steht: die engere Aussage ist die richtige.
|
|
if (($found[$host] ?? null) !== 'console') {
|
|
$found[$host] = $purpose;
|
|
}
|
|
}
|
|
}
|