Files
domain-watchdog/src/Service/Connector/EppClientProvider.php

156 lines
4.5 KiB
PHP
Raw Normal View History

2025-02-21 16:20:19 +01:00
<?php
namespace App\Service\Connector;
2025-02-23 00:47:51 +01:00
use App\Dto\Connector\EppClientProviderDto;
2025-02-21 16:20:19 +01:00
use App\Entity\Domain;
2025-02-22 01:30:35 +01:00
use Metaregistrar\EPP\eppCheckDomainRequest;
use Metaregistrar\EPP\eppCheckDomainResponse;
use Metaregistrar\EPP\eppConnection;
use Metaregistrar\EPP\eppContactHandle;
use Metaregistrar\EPP\eppCreateDomainRequest;
use Metaregistrar\EPP\eppDomain;
use Metaregistrar\EPP\eppException;
use Metaregistrar\EPP\eppHelloRequest;
2025-02-21 16:20:19 +01:00
use Psr\Cache\CacheItemInterface;
use Psr\Cache\CacheItemPoolInterface;
use Psr\Cache\InvalidArgumentException;
2025-02-23 00:47:51 +01:00
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;
2025-02-21 16:20:19 +01:00
2025-02-22 13:36:10 +01:00
class EppClientProvider extends AbstractProvider implements CheckDomainProviderInterface
2025-02-21 16:20:19 +01:00
{
2025-02-22 18:57:50 +01:00
public const EPP_CERTIFICATES_PATH = '../var/epp-certificates/';
2025-02-23 00:47:51 +01:00
protected string $dtoClass = EppClientProviderDto::class;
2025-02-22 01:30:35 +01:00
private eppConnection $eppClient;
2025-02-21 16:20:19 +01:00
public function __construct(
CacheItemPoolInterface $cacheItemPool,
2025-02-23 00:47:51 +01:00
DenormalizerInterface&NormalizerInterface $serializer,
ValidatorInterface $validator,
2025-02-22 01:30:35 +01:00
) {
2025-02-23 00:47:51 +01:00
parent::__construct($cacheItemPool, $serializer, $validator);
2025-02-21 16:20:19 +01:00
}
protected function assertAuthentication(): void
{
2025-02-22 01:30:35 +01:00
$this->connect($this->authData);
$this->eppClient->login();
$this->eppClient->request(new eppHelloRequest());
$this->eppClient->logout();
$this->eppClient->disconnect();
2025-02-21 16:20:19 +01:00
}
2025-02-22 01:30:35 +01:00
/**
* @throws eppException
*/
2025-02-21 16:20:19 +01:00
public function orderDomain(Domain $domain, bool $dryRun): void
{
2025-02-22 01:30:35 +01:00
$this->connect($this->authData);
$d = new eppDomain($domain->getLdhName());
$d->setRegistrant($this->authData['domain']['registrant']);
$d->setPeriodUnit($this->authData['domain']['unit']);
$d->setPeriod($this->authData['domain']['period']);
$d->setAuthorisationCode($this->authData['domain']['password']);
foreach ($this->authData['domain']['contacts'] as $type => $contact) {
$d->addContact(new eppContactHandle($contact, $type));
}
2025-02-22 13:36:10 +01:00
if (!$dryRun) {
$this->eppClient->request(new eppCreateDomainRequest($d));
}
2025-02-22 01:30:35 +01:00
$this->eppClient->logout();
$this->eppClient->disconnect();
2025-02-21 16:20:19 +01:00
}
/**
* @throws InvalidArgumentException
*/
protected function getCachedTldList(): CacheItemInterface
{
return $this->cacheItemPool->getItem('app.provider.epp.supported-tld');
}
protected function getSupportedTldList(): array
{
return [];
}
public function isSupported(Domain ...$domainList): bool
{
if (0 === count($domainList)) {
return true;
}
$tld = $domainList[0]->getTld();
foreach ($domainList as $domain) {
if ($domain->getTld() !== $tld) {
return false;
}
}
return true;
}
2025-02-22 01:30:35 +01:00
/**
2025-02-23 16:35:57 +01:00
* @return string[]
*
2025-02-22 01:30:35 +01:00
* @throws eppException
*/
public function checkDomains(string ...$domains): array
{
$this->connect($this->authData);
$this->eppClient->login();
$check = new eppCheckDomainRequest($domains);
/** @var eppCheckDomainResponse $response */
$response = $this->eppClient->request($check);
$checkedDomains = $response->getCheckedDomains();
$return = array_map(
fn (array $d) => $d['domainname'],
array_filter($checkedDomains, fn (array $d) => true === $d['available'])
);
$this->eppClient->logout();
$this->eppClient->disconnect();
return $return;
}
/**
* @throws eppException
*/
private function connect(array $authData): void
2025-02-21 16:20:19 +01:00
{
2025-02-22 01:30:35 +01:00
$conn = new eppConnection(false, null);
$conn->setHostname($authData['hostname']);
$conn->setVersion($authData['version']);
$conn->setLanguage($authData['language']);
$conn->setPort($authData['port']);
$conn->setUsername($authData['auth']['username']);
$conn->setPassword($authData['auth']['password']);
$conn->setSslContext(stream_context_create(['ssl' => [
...$authData['auth']['ssl'],
'local_cert' => $authData['files']['pem'],
'local_pk' => $authData['files']['key'],
]]));
$conn->setXpathExtensions($authData['xPathURI']);
$conn->setExtensions($authData['extURI']);
$conn->setServices($authData['objURI']);
$conn->connect();
$this->eppClient = $conn;
2025-02-21 16:20:19 +01:00
}
}