mirror of
https://github.com/maelgangloff/domain-watchdog.git
synced 2025-12-29 16:15:04 +00:00
feat: update entities to comply with RDAP
This commit is contained in:
@@ -39,6 +39,7 @@ enum DomainStatus: string
|
||||
case ServerRenewProhibited = 'server renew prohibited';
|
||||
case ServerTransferProhibited = 'server transfer prohibited';
|
||||
case ServerUpdateProhibited = 'server update prohibited';
|
||||
case ServerRecoverProhibited = 'server recover prohibited';
|
||||
case ServerHold = 'server hold';
|
||||
case TransferPeriod = 'transfer period';
|
||||
case Administrative = 'administrative';
|
||||
|
||||
5426
src/Config/dns.json
Normal file
5426
src/Config/dns.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -22,25 +22,25 @@ use App\Repository\NameserverEntityRepository;
|
||||
use App\Repository\NameserverRepository;
|
||||
use DateTimeImmutable;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Juanparati\RDAPLib\Exceptions\RDAPWrongRequest;
|
||||
use Juanparati\RDAPLib\RDAPClient;
|
||||
use Psr\Http\Client\ClientExceptionInterface;
|
||||
use Exception;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\Routing\Attribute\Route;
|
||||
use Symfony\Contracts\HttpClient\HttpClientInterface;
|
||||
|
||||
|
||||
class TestController extends AbstractController
|
||||
{
|
||||
|
||||
public function __construct(private EntityRepository $entityRepository,
|
||||
private DomainRepository $domainRepository,
|
||||
private DomainEventRepository $domainEventRepository,
|
||||
private NameserverRepository $nameserverRepository,
|
||||
private NameserverEntityRepository $nameserverEntityRepository,
|
||||
private EntityEventRepository $entityEventRepository,
|
||||
private DomainEntityRepository $domainEntityRepository,
|
||||
private EntityManagerInterface $em)
|
||||
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)
|
||||
{
|
||||
|
||||
}
|
||||
@@ -48,22 +48,19 @@ class TestController extends AbstractController
|
||||
#[Route(path: '/test/{fqdn}', name: 'test')]
|
||||
public function testRoute(string $fqdn): Response
|
||||
{
|
||||
$rdap = new RDAPClient(['domain' => 'https://rdap.nic.fr/domain/']);
|
||||
try {
|
||||
$res = $rdap->domainLookup($fqdn, RDAPClient::ARRAY_OUTPUT);
|
||||
} catch (RDAPWrongRequest $e) {
|
||||
return new Response(null, Response::HTTP_BAD_REQUEST);
|
||||
} catch (ClientExceptionInterface $e) {
|
||||
return new Response(null, Response::HTTP_INTERNAL_SERVER_ERROR);
|
||||
}
|
||||
$rdapServer = $this->getRdapServer($fqdn);
|
||||
|
||||
$res = $this->client->request(
|
||||
'GET', $rdapServer . 'domain/' . $fqdn
|
||||
)->toArray();
|
||||
|
||||
$domain = $this->domainRepository->findOneBy(["handle" => $res['handle']]);
|
||||
if ($domain === null) $domain = new Domain();
|
||||
|
||||
$domain->setLdhName($res['ldhName'])
|
||||
$domain
|
||||
->setLdhName($res['ldhName'])
|
||||
->setHandle($res['handle'])
|
||||
->setStatus(array_map(fn($str): DomainStatus => DomainStatus::from($str), $res['status']))
|
||||
->setWhoisStatus($res['whoisStatus']);
|
||||
->setStatus(array_map(fn($str): DomainStatus => DomainStatus::from($str), $res['status']));
|
||||
|
||||
|
||||
foreach ($res['events'] as $rdapEvent) {
|
||||
@@ -80,8 +77,8 @@ class TestController extends AbstractController
|
||||
|
||||
}
|
||||
|
||||
|
||||
foreach ($res['entities'] as $rdapEntity) {
|
||||
if (!array_key_exists('handle', $rdapEntity)) continue;
|
||||
$entity = $this->processEntity($rdapEntity);
|
||||
|
||||
$domainEntity = $this->domainEntityRepository->findOneBy([
|
||||
@@ -107,16 +104,20 @@ class TestController extends AbstractController
|
||||
|
||||
foreach ($res['nameservers'] as $rdapNameserver) {
|
||||
$nameserver = $this->nameserverRepository->findOneBy([
|
||||
"handle" => $rdapNameserver['handle']
|
||||
"ldhName" => strtolower($rdapNameserver['ldhName'])
|
||||
]);
|
||||
if ($nameserver === null) $nameserver = new Nameserver();
|
||||
|
||||
$nameserver
|
||||
->setHandle($rdapNameserver['handle'])
|
||||
->setLdhName($rdapNameserver['ldhName'])
|
||||
->setStatus(array_map(fn($str): DomainStatus => DomainStatus::from($str), $rdapNameserver['status']));
|
||||
$nameserver->setLdhName($rdapNameserver['ldhName']);
|
||||
|
||||
if (!array_key_exists('entities', $rdapNameserver)) {
|
||||
$domain->addNameserver($nameserver);
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($rdapNameserver['entities'] as $rdapEntity) {
|
||||
if (!array_key_exists('handle', $rdapEntity)) continue;
|
||||
|
||||
$entity = $this->processEntity($rdapEntity);
|
||||
|
||||
$nameserverEntity = $this->nameserverEntityRepository->findOneBy([
|
||||
@@ -132,6 +133,8 @@ class TestController extends AbstractController
|
||||
->setEntity($entity)
|
||||
->setRoles(array_map(fn($str): DomainRole => DomainRole::from($str), $rdapEntity['roles'])));
|
||||
|
||||
$this->em->persist($entity);
|
||||
$this->em->flush();
|
||||
}
|
||||
$domain->addNameserver($nameserver);
|
||||
}
|
||||
@@ -143,6 +146,26 @@ class TestController extends AbstractController
|
||||
return new Response(null, Response::HTTP_OK);
|
||||
}
|
||||
|
||||
private function getRdapServer(string $fqdn)
|
||||
{
|
||||
$tld = $this->getTld($fqdn);
|
||||
|
||||
$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.");
|
||||
}
|
||||
|
||||
private function getTld($domain)
|
||||
{
|
||||
$lastDotPosition = strrpos($domain, '.');
|
||||
if ($lastDotPosition === false) {
|
||||
throw new Exception("Domain must contain at least one dot.");
|
||||
}
|
||||
return substr($domain, $lastDotPosition + 1);
|
||||
}
|
||||
|
||||
private function processEntity(array $rdapEntity): Entity
|
||||
{
|
||||
$entity = $this->entityRepository->findOneBy([
|
||||
@@ -154,6 +177,7 @@ class TestController extends AbstractController
|
||||
->setHandle($rdapEntity['handle'])
|
||||
->setJCard($rdapEntity['vcardArray']);
|
||||
|
||||
if (!array_key_exists('events', $rdapEntity)) return $entity;
|
||||
|
||||
foreach ($rdapEntity['events'] as $rdapEntityEvent) {
|
||||
$event = $this->entityEventRepository->findOneBy([
|
||||
|
||||
@@ -31,9 +31,6 @@ class Domain
|
||||
#[ORM\OneToMany(targetEntity: DomainEntity::class, mappedBy: 'domain', cascade: ['persist'], orphanRemoval: true)]
|
||||
private Collection $domainEntities;
|
||||
|
||||
#[ORM\Column(length: 255)]
|
||||
private ?string $whoisStatus = null;
|
||||
|
||||
#[ORM\Column(type: Types::SIMPLE_ARRAY, enumType: DomainStatus::class)]
|
||||
private array $status = [];
|
||||
|
||||
@@ -49,7 +46,7 @@ class Domain
|
||||
#[ORM\ManyToMany(targetEntity: Nameserver::class, inversedBy: 'domains', cascade: ['persist'])]
|
||||
#[ORM\JoinTable(name: 'domain_nameservers',
|
||||
joinColumns: [new ORM\JoinColumn(name: 'domain_handle', referencedColumnName: 'handle')],
|
||||
inverseJoinColumns: [new ORM\JoinColumn(name: 'nameserver_handle', referencedColumnName: 'handle')]
|
||||
inverseJoinColumns: [new ORM\JoinColumn(name: 'nameserver_ldh_name', referencedColumnName: 'ldh_name')]
|
||||
)]
|
||||
private Collection $nameservers;
|
||||
|
||||
@@ -68,7 +65,7 @@ class Domain
|
||||
|
||||
public function setLdhName(string $ldhName): static
|
||||
{
|
||||
$this->ldhName = $ldhName;
|
||||
$this->ldhName = strtolower($ldhName);
|
||||
|
||||
return $this;
|
||||
}
|
||||
@@ -145,18 +142,6 @@ class Domain
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getWhoisStatus(): ?string
|
||||
{
|
||||
return $this->whoisStatus;
|
||||
}
|
||||
|
||||
public function setWhoisStatus(string $whoisStatus): static
|
||||
{
|
||||
$this->whoisStatus = $whoisStatus;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return DomainStatus[]
|
||||
*/
|
||||
|
||||
@@ -12,10 +12,8 @@ use Doctrine\ORM\Mapping as ORM;
|
||||
#[ORM\Entity(repositoryClass: NameserverRepository::class)]
|
||||
class Nameserver
|
||||
{
|
||||
#[ORM\Id]
|
||||
#[ORM\Column(length: 255)]
|
||||
private ?string $handle = null;
|
||||
|
||||
#[ORM\Id]
|
||||
#[ORM\Column(length: 255)]
|
||||
private ?string $ldhName = null;
|
||||
|
||||
@@ -25,9 +23,6 @@ class Nameserver
|
||||
#[ORM\OneToMany(targetEntity: NameserverEntity::class, mappedBy: 'nameserver', cascade: ['persist'], orphanRemoval: true)]
|
||||
private Collection $nameserverEntities;
|
||||
|
||||
#[ORM\Column(type: Types::SIMPLE_ARRAY, enumType: DomainStatus::class)]
|
||||
private array $status = [];
|
||||
|
||||
/**
|
||||
* @var Collection<int, Domain>
|
||||
*/
|
||||
@@ -40,18 +35,6 @@ class Nameserver
|
||||
$this->domains = new ArrayCollection();
|
||||
}
|
||||
|
||||
public function getHandle(): ?string
|
||||
{
|
||||
return $this->handle;
|
||||
}
|
||||
|
||||
public function setHandle(string $handle): static
|
||||
{
|
||||
$this->handle = $handle;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getLdhName(): ?string
|
||||
{
|
||||
return $this->ldhName;
|
||||
@@ -59,7 +42,7 @@ class Nameserver
|
||||
|
||||
public function setLdhName(string $ldhName): static
|
||||
{
|
||||
$this->ldhName = $ldhName;
|
||||
$this->ldhName = strtolower($ldhName);
|
||||
|
||||
return $this;
|
||||
}
|
||||
@@ -94,21 +77,6 @@ class Nameserver
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return DomainStatus[]
|
||||
*/
|
||||
public function getStatus(): array
|
||||
{
|
||||
return $this->status;
|
||||
}
|
||||
|
||||
public function setStatus(array $status): static
|
||||
{
|
||||
$this->status = $status;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Collection<int, Domain>
|
||||
*/
|
||||
|
||||
@@ -13,7 +13,7 @@ class NameserverEntity
|
||||
{
|
||||
#[ORM\Id]
|
||||
#[ORM\ManyToOne(targetEntity: Nameserver::class, cascade: ['persist'], inversedBy: 'nameserverEntities')]
|
||||
#[ORM\JoinColumn(referencedColumnName: 'handle', nullable: false)]
|
||||
#[ORM\JoinColumn(referencedColumnName: 'ldh_name', nullable: false)]
|
||||
private ?Nameserver $nameserver = null;
|
||||
|
||||
#[ORM\Id]
|
||||
|
||||
Reference in New Issue
Block a user