43 lines
1.4 KiB
PHP
43 lines
1.4 KiB
PHP
<?php
|
|
|
|
namespace App\Support;
|
|
|
|
/**
|
|
* Ein Name, seine Adressen — A und AAAA.
|
|
*
|
|
* Eine eigene Klasse statt eines nackten `gethostbynamel()` an der
|
|
* Verwendungsstelle, damit ein Test sie im Container ersetzen kann
|
|
* (`app()->instance(DnsLookup::class, …)`, wie FakeRemoteShell und
|
|
* FakeProxmoxClient es für SSH und Proxmox schon vormachen). Ein Test, der für
|
|
* seine Zusicherung echtes DNS bräuchte, prüft nicht die Regel, sondern das
|
|
* Netz des Rechners, auf dem er gerade läuft.
|
|
*
|
|
* Ein Name, der sich nicht auflösen lässt, ergibt ein leeres Feld — kein
|
|
* Fehler. Der einzige Aufrufer (BlockAddress::exemptRanges()) behandelt das
|
|
* wie einen leeren Eintrag.
|
|
*/
|
|
class DnsLookup
|
|
{
|
|
/** @return array<int, string> */
|
|
public function addressesFor(string $name): array
|
|
{
|
|
$v4 = gethostbynamel($name);
|
|
|
|
// Getrennt geholt, weil gethostbynamel() nur A-Records kennt. Ein
|
|
// Endpunkt, der ausschließlich per AAAA existiert, wäre sonst still
|
|
// nicht ausgenommen — genau der Fehler, den dieser Umbau schließt, nur
|
|
// eine Adressfamilie weiter.
|
|
$records = @dns_get_record($name, DNS_AAAA) ?: [];
|
|
|
|
$v6 = array_values(array_filter(array_map(
|
|
fn (array $record): string => (string) ($record['ipv6'] ?? ''),
|
|
$records,
|
|
)));
|
|
|
|
return array_values(array_unique(array_merge(
|
|
is_array($v4) ? $v4 : [],
|
|
$v6,
|
|
)));
|
|
}
|
|
}
|