2025-02-21 16:20:19 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Service\Connector;
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
class EppClientProvider extends AbstractProvider implements EppClientProviderInterface
|
|
|
|
|
{
|
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-22 01:30:35 +01:00
|
|
|
) {
|
2025-02-21 16:20:19 +01:00
|
|
|
parent::__construct($cacheItemPool);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected function verifySpecificAuthData(array $authData): array
|
|
|
|
|
{
|
|
|
|
|
// TODO: Create DTO for each authData schema
|
2025-02-22 01:30:35 +01:00
|
|
|
unset($authData['certificate_pem']);
|
|
|
|
|
unset($authData['certificate_key']);
|
2025-02-21 16:20:19 +01:00
|
|
|
|
|
|
|
|
return $authData;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->eppClient->request(new eppCreateDomainRequest($d));
|
|
|
|
|
|
|
|
|
|
$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
|
|
|
/**
|
|
|
|
|
* @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
|
|
|
}
|
|
|
|
|
}
|