CluPilotCloud/app/Support/DnsLookup.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,
)));
}
}