Files
domain-watchdog/src/Controller/TestController.php

202 lines
7.2 KiB
PHP
Raw Normal View History

2024-07-12 13:16:40 +02:00
<?php
namespace App\Controller;
use App\Config\DomainRole;
use App\Config\DomainStatus;
use App\Config\EventAction;
use App\Entity\Domain;
use App\Entity\DomainEntity;
use App\Entity\DomainEvent;
use App\Entity\Entity;
use App\Entity\EntityEvent;
use App\Entity\Nameserver;
use App\Entity\NameserverEntity;
use App\Repository\DomainEntityRepository;
use App\Repository\DomainEventRepository;
use App\Repository\DomainRepository;
use App\Repository\EntityEventRepository;
use App\Repository\EntityRepository;
use App\Repository\NameserverEntityRepository;
use App\Repository\NameserverRepository;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
2024-07-12 13:16:40 +02:00
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Contracts\HttpClient\HttpClientInterface;
2024-07-12 13:16:40 +02:00
class TestController extends AbstractController
{
public function __construct(private HttpClientInterface $client,
private readonly EntityRepository $entityRepository,
private readonly DomainRepository $domainRepository,
private readonly DomainEventRepository $domainEventRepository,
private readonly NameserverRepository $nameserverRepository,
private readonly NameserverEntityRepository $nameserverEntityRepository,
private readonly EntityEventRepository $entityEventRepository,
private readonly DomainEntityRepository $domainEntityRepository,
private readonly EntityManagerInterface $em)
2024-07-12 19:03:06 +02:00
{
}
2024-07-12 15:32:48 +02:00
#[Route(path: '/test/{fqdn}', name: 'test')]
2024-07-12 19:03:06 +02:00
public function testRoute(string $fqdn): Response
2024-07-12 13:16:40 +02:00
{
2024-07-13 15:52:52 +02:00
$tld = $this->getTld($fqdn);
$rdapServer = $this->getRdapServer($tld);
$res = $this->client->request(
'GET', $rdapServer . 'domain/' . $fqdn
)->toArray();
2024-07-12 15:20:24 +02:00
2024-07-13 12:49:11 +02:00
$domain = $this->domainRepository->findOneBy(["ldhName" => strtolower($res['ldhName'])]);
2024-07-12 13:16:40 +02:00
if ($domain === null) $domain = new Domain();
$domain
->setLdhName($res['ldhName'])
2024-07-12 13:16:40 +02:00
->setHandle($res['handle'])
->setStatus(array_map(fn($str): DomainStatus => DomainStatus::from($str), $res['status']));
2024-07-12 13:16:40 +02:00
foreach ($res['events'] as $rdapEvent) {
2024-07-12 19:03:06 +02:00
$event = $this->domainEventRepository->findOneBy([
2024-07-12 13:16:40 +02:00
"action" => EventAction::from($rdapEvent["eventAction"]),
"date" => new DateTimeImmutable($rdapEvent["eventDate"]),
"domain" => $res['handle']
]);
if ($event === null) $event = new DomainEvent();
$domain->addEvent($event
->setAction(EventAction::from($rdapEvent['eventAction']))
->setDate(new DateTimeImmutable($rdapEvent['eventDate'])));
}
foreach ($res['entities'] as $rdapEntity) {
if (!array_key_exists('handle', $rdapEntity)) continue;
2024-07-13 15:52:52 +02:00
$entity = $this->processEntity($rdapEntity, $tld);
$this->em->persist($entity);
$this->em->flush();
2024-07-12 13:16:40 +02:00
2024-07-12 19:03:06 +02:00
$domainEntity = $this->domainEntityRepository->findOneBy([
2024-07-12 13:16:40 +02:00
"domain" => $domain,
"entity" => $entity
]);
2024-07-12 15:32:48 +02:00
2024-07-12 13:16:40 +02:00
if ($domainEntity === null) $domainEntity = new DomainEntity();
$domain->addDomainEntity($domainEntity
->setDomain($domain)
->setEntity($entity)
->setRoles(array_map(fn($str): DomainRole => DomainRole::from($str), $rdapEntity['roles'])));
2024-07-13 15:52:52 +02:00
$this->em->persist($domainEntity);
2024-07-12 19:03:06 +02:00
$this->em->flush();
2024-07-12 13:16:40 +02:00
}
foreach ($res['nameservers'] as $rdapNameserver) {
2024-07-12 19:03:06 +02:00
$nameserver = $this->nameserverRepository->findOneBy([
"ldhName" => strtolower($rdapNameserver['ldhName'])
2024-07-12 13:16:40 +02:00
]);
if ($nameserver === null) $nameserver = new Nameserver();
$nameserver->setLdhName($rdapNameserver['ldhName']);
if (!array_key_exists('entities', $rdapNameserver)) {
$domain->addNameserver($nameserver);
continue;
}
2024-07-12 13:16:40 +02:00
foreach ($rdapNameserver['entities'] as $rdapEntity) {
if (!array_key_exists('handle', $rdapEntity)) continue;
2024-07-13 15:52:52 +02:00
$entity = $this->processEntity($rdapEntity, $tld);
$this->em->persist($entity);
$this->em->flush();
2024-07-12 13:16:40 +02:00
2024-07-12 19:03:06 +02:00
$nameserverEntity = $this->nameserverEntityRepository->findOneBy([
2024-07-12 13:16:40 +02:00
"nameserver" => $nameserver,
"entity" => $entity
]);
if ($nameserverEntity === null) $nameserverEntity = new NameserverEntity();
$nameserver->addNameserverEntity($nameserverEntity
->setNameserver($nameserver)
->setStatus(array_map(fn($str): DomainStatus => DomainStatus::from($str), $rdapNameserver['status']))
->setEntity($entity)
->setRoles(array_map(fn($str): DomainRole => DomainRole::from($str), $rdapEntity['roles'])));
}
2024-07-13 15:52:52 +02:00
2024-07-12 13:16:40 +02:00
$domain->addNameserver($nameserver);
}
2024-07-12 19:03:06 +02:00
$this->em->persist($domain);
$this->em->flush();
2024-07-12 13:16:40 +02:00
return new Response(null, Response::HTTP_OK);
}
2024-07-12 15:20:24 +02:00
2024-07-13 15:52:52 +02:00
private function getTld($domain): string
{
$lastDotPosition = strrpos($domain, '.');
if ($lastDotPosition === false) {
throw new Exception("Domain must contain at least one dot.");
}
return strtolower(substr($domain, $lastDotPosition + 1));
}
private function getRdapServer(string $tld)
{
$dnsRoot = json_decode(file_get_contents($this->getParameter('kernel.project_dir') . '/src/Config/dns.json'))->services;
foreach ($dnsRoot as $dns) {
if (in_array($tld, $dns[0])) return $dns[1][0];
}
throw new Exception("This TLD ($tld) is not supported.");
}
2024-07-13 15:52:52 +02:00
private function processEntity(array $rdapEntity, string $tld): Entity
2024-07-12 19:03:06 +02:00
{
$entity = $this->entityRepository->findOneBy([
2024-07-13 15:52:52 +02:00
"handle" => $rdapEntity['handle'],
"tld" => $tld
2024-07-12 19:03:06 +02:00
]);
if ($entity === null) $entity = new Entity();
$entity
2024-07-13 15:52:52 +02:00
->setTld($tld)
2024-07-12 19:03:06 +02:00
->setHandle($rdapEntity['handle'])
->setJCard($rdapEntity['vcardArray']);
if (!array_key_exists('events', $rdapEntity)) return $entity;
2024-07-12 19:03:06 +02:00
foreach ($rdapEntity['events'] as $rdapEntityEvent) {
$event = $this->entityEventRepository->findOneBy([
"action" => EventAction::from($rdapEntityEvent["eventAction"]),
2024-07-13 15:52:52 +02:00
"date" => new DateTimeImmutable($rdapEntityEvent["eventDate"])
2024-07-12 19:03:06 +02:00
]);
if ($event !== null) continue;
$entity->addEvent(
(new EntityEvent())
->setEntity($entity)
->setAction(EventAction::from($rdapEntityEvent['eventAction']))
->setDate(new DateTimeImmutable($rdapEntityEvent['eventDate'])));
}
return $entity;
}
2024-07-12 13:16:40 +02:00
}