| Server IP : 202.61.199.114 / Your IP : 216.73.217.139 Web Server : nginx/1.22.1 System : Linux de.arni-solutions.de 6.1.0-49-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64 User : web20 ( 1018) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/clients/client2/web21/web/api/lib/ |
Upload File : |
<?php
/**
* RDAP-Abfragen (Registrierungsdaten) für Domains und IPs via rdap.org-Bootstrap.
*
* @package SafeMyIdent\Api
*/
declare(strict_types=1);
require_once __DIR__ . '/net.php';
/**
* RDAP-Rohabfrage mit Cache.
*
* @param string $path 'domain/example.com' oder 'ip/1.2.3.4'.
* @param int $ttl Cache-Sekunden.
* @return array<string,mixed>|null
*/
function smi_rdap_raw(string $path, int $ttl = 3600): ?array
{
$key = 'rdap|' . $path;
$hit = smi_cache_get($key);
if ($hit !== null) {
return $hit ?: null;
}
$body = smi_provider_get('https://rdap.org/' . $path, 7, ['Accept' => 'application/rdap+json, application/json']);
$data = null;
if ($body !== '') {
$dec = json_decode($body, true);
if (is_array($dec) && !isset($dec['errorCode'])) {
$data = $dec;
}
}
smi_cache_set($key, $data ?? [], $ttl);
return $data;
}
/**
* Registrar-/Kontaktnamen aus RDAP-Entities extrahieren.
*
* @param array<string,mixed> $data RDAP-Antwort.
* @param string $role Gesuchte Rolle (z. B. 'registrar').
* @return string
*/
function smi_rdap_entity_name(array $data, string $role): string
{
foreach ((array) ($data['entities'] ?? []) as $ent) {
if (in_array($role, (array) ($ent['roles'] ?? []), true)) {
// vCard: fn.
foreach ((array) ($ent['vcardArray'][1] ?? []) as $v) {
if (($v[0] ?? '') === 'fn' && !empty($v[3])) {
return (string) $v[3];
}
}
if (!empty($ent['handle'])) {
return (string) $ent['handle'];
}
}
}
return '';
}
/**
* Domain-RDAP aufbereiten.
*
* @param string $domain Domain (bereits validiert).
* @return array<string,mixed>
*/
function smi_rdap_domain(string $domain): array
{
$data = smi_rdap_domain_raw($domain);
$out = [
'available' => $data === null,
'domain' => $domain,
'registrar' => '',
'created' => '', 'updated' => '', 'expires' => '',
'statuses' => [],
'nameservers' => [],
'dnssec' => null,
'source' => '',
];
if ($data === null) {
return $out;
}
$out['registrar'] = smi_rdap_entity_name($data, 'registrar');
foreach ((array) ($data['events'] ?? []) as $ev) {
$action = strtolower((string) ($ev['eventAction'] ?? ''));
$date = (string) ($ev['eventDate'] ?? '');
if ($action === 'registration') { $out['created'] = $date; }
elseif ($action === 'expiration') { $out['expires'] = $date; }
elseif (in_array($action, ['last changed', 'last update of rdap database', 'last update'], true) && $out['updated'] === '') { $out['updated'] = $date; }
}
$out['statuses'] = array_values(array_map('strval', (array) ($data['status'] ?? [])));
foreach ((array) ($data['nameservers'] ?? []) as $ns) {
if (!empty($ns['ldhName'])) {
$out['nameservers'][] = strtolower((string) $ns['ldhName']);
}
}
if (isset($data['secureDNS'])) {
$out['dnssec'] = (bool) ($data['secureDNS']['delegationSigned'] ?? false);
}
$out['source'] = (string) ($data['port43'] ?? 'RDAP');
return $out;
}
/**
* Domain-RDAP roh (auch für Rohdaten-Ausgabe).
*
* @param string $domain Domain.
* @return array<string,mixed>|null
*/
function smi_rdap_domain_raw(string $domain): ?array
{
return smi_rdap_raw('domain/' . rawurlencode($domain));
}
/**
* IP-RDAP aufbereiten (Netname/Org/Country/Abuse).
*
* @param string $ip IP.
* @return array<string,mixed>
*/
function smi_rdap_ip(string $ip): array
{
$data = smi_rdap_raw('ip/' . rawurlencode($ip)) ?? [];
$out = [
'netname' => (string) ($data['name'] ?? ''),
'handle' => (string) ($data['handle'] ?? ''),
'country' => (string) ($data['country'] ?? ''),
'type' => (string) ($data['type'] ?? ''),
'start' => (string) ($data['startAddress'] ?? ''),
'end' => (string) ($data['endAddress'] ?? ''),
'org' => smi_rdap_entity_name($data, 'registrant') ?: smi_rdap_entity_name($data, 'administrative'),
'abuse' => '',
];
// Abuse-Mail suchen.
foreach ((array) ($data['entities'] ?? []) as $ent) {
if (in_array('abuse', (array) ($ent['roles'] ?? []), true)) {
foreach ((array) ($ent['vcardArray'][1] ?? []) as $v) {
if (($v[0] ?? '') === 'email' && !empty($v[3])) {
$out['abuse'] = (string) $v[3];
break 2;
}
}
}
}
return $out;
}