From a06b6fd76a9358ec3a9a39e321c9a51bd2f7beef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Gangloff?= Date: Sat, 22 Feb 2025 18:57:50 +0100 Subject: [PATCH] feat: EPP protocol implementation --- src/Controller/ConnectorController.php | 66 ++++++++++++++++++--- src/Entity/Connector.php | 4 +- src/Service/Connector/EppClientProvider.php | 2 + 3 files changed, 62 insertions(+), 10 deletions(-) diff --git a/src/Controller/ConnectorController.php b/src/Controller/ConnectorController.php index 08c7e92..6e37fe8 100644 --- a/src/Controller/ConnectorController.php +++ b/src/Controller/ConnectorController.php @@ -6,6 +6,7 @@ use App\Config\ConnectorProvider; use App\Entity\Connector; use App\Entity\User; use App\Service\Connector\AbstractProvider; +use App\Service\Connector\EppClientProvider; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\EntityManagerInterface; use Psr\Log\LoggerInterface; @@ -48,6 +49,7 @@ class ConnectorController extends AbstractController /** * @throws \Exception + * @throws \Throwable */ #[Route( path: '/api/connectors', @@ -81,27 +83,41 @@ class ConnectorController extends AbstractController $directory = sprintf('../var/epp-certificates/%s/', $connector->getId()); $filesystem = new Filesystem(); - $filesystem->mkdir($directory); + $filesystem->mkdir($directory, 0755); $authData = $connector->getAuthData(); if (!isset($authData['certificate_pem'], $authData['certificate_key'])) { throw new BadRequestHttpException('EPP certificates are required'); } - $pemPath = $directory.'certificate.pem'; - $keyPath = $directory.'certificate.key'; + $pemPath = $directory.'client.pem'; + $keyPath = $directory.'client.key'; $filesystem->dumpFile($pemPath, urldecode($authData['certificate_pem'])); $filesystem->dumpFile($keyPath, urldecode($authData['certificate_key'])); $connector->setAuthData([...$authData, 'files' => ['pem' => $pemPath, 'key' => $keyPath]]); - } - /** @var AbstractProvider $providerClient */ - $providerClient = $this->locator->get($provider->getConnectorProvider()); - $authData = $providerClient->verifyAuthData($connector->getAuthData()); - $connector->setAuthData($authData); - $providerClient->authenticate($authData); + /** @var AbstractProvider $providerClient */ + $providerClient = $this->locator->get($provider->getConnectorProvider()); + $authData = $providerClient->verifyAuthData($connector->getAuthData()); + + $connector->setAuthData($authData); + + try { + $providerClient->authenticate($authData); + } catch (\Throwable $exception) { + $filesystem->remove($directory); + throw $exception; + } + } else { + /** @var AbstractProvider $providerClient */ + $providerClient = $this->locator->get($provider->getConnectorProvider()); + $authData = $providerClient->verifyAuthData($connector->getAuthData()); + $connector->setAuthData($authData); + + $providerClient->authenticate($authData); + } $this->logger->info('User {username} authentication data with the {provider} provider has been validated.', [ 'username' => $user->getUserIdentifier(), @@ -118,4 +134,36 @@ class ConnectorController extends AbstractController return $connector; } + + /** + * @throws \Exception + */ + #[Route( + path: '/api/connectors/{id}', + name: 'connector_delete', + defaults: [ + '_api_resource_class' => Connector::class, + '_api_operation_name' => 'delete', + ], + methods: ['DELETE'] + )] + public function deleteConnector(Connector $connector): void + { + foreach ($connector->getWatchLists()->getIterator() as $watchlist) { + $watchlist->setConnector(null); + } + + $provider = $connector->getProvider(); + + if (null === $provider) { + throw new BadRequestHttpException('Provider not found'); + } + + if (ConnectorProvider::EPP === $provider) { + (new Filesystem())->remove(sprintf('%s/%s/', EppClientProvider::EPP_CERTIFICATES_PATH, $connector->getId())); + } + + $this->em->remove($connector); + $this->em->flush(); + } } diff --git a/src/Entity/Connector.php b/src/Entity/Connector.php index 7b13068..5b58cd7 100644 --- a/src/Entity/Connector.php +++ b/src/Entity/Connector.php @@ -34,7 +34,9 @@ use Symfony\Component\Uid\Uuid; name: 'create' ), new Delete( - security: 'object.user == user' + routeName: 'connector_delete', + security: 'object.user == user', + name: 'delete' ), ] )] diff --git a/src/Service/Connector/EppClientProvider.php b/src/Service/Connector/EppClientProvider.php index d9a3363..367b12f 100644 --- a/src/Service/Connector/EppClientProvider.php +++ b/src/Service/Connector/EppClientProvider.php @@ -17,6 +17,8 @@ use Psr\Cache\InvalidArgumentException; class EppClientProvider extends AbstractProvider implements CheckDomainProviderInterface { + public const EPP_CERTIFICATES_PATH = '../var/epp-certificates/'; + private eppConnection $eppClient; public function __construct(