domain-watchdog/src/Controller/ConnectorController.php

155 lines
5.2 KiB
PHP
Raw Normal View History

2024-07-29 15:28:05 +02:00
<?php
namespace App\Controller;
2025-02-21 16:20:19 +01:00
use App\Config\ConnectorProvider;
2024-07-29 15:28:05 +02:00
use App\Entity\Connector;
use App\Entity\User;
2024-09-18 13:37:07 +02:00
use App\Service\Connector\AbstractProvider;
2025-02-22 18:57:50 +01:00
use App\Service\Connector\EppClientProvider;
2024-07-29 15:28:05 +02:00
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\EntityManagerInterface;
2024-08-04 14:45:27 +02:00
use Psr\Log\LoggerInterface;
2024-07-29 15:28:05 +02:00
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
2024-09-30 13:48:15 +02:00
use Symfony\Component\DependencyInjection\Attribute\Autowire;
use Symfony\Component\DependencyInjection\ContainerInterface;
2025-02-21 16:20:19 +01:00
use Symfony\Component\Filesystem\Filesystem;
2024-08-30 12:54:42 +02:00
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
2025-03-03 14:27:05 +01:00
use Symfony\Component\HttpKernel\KernelInterface;
2024-07-29 15:28:05 +02:00
use Symfony\Component\Routing\Attribute\Route;
2025-02-27 09:01:05 +01:00
use Symfony\Component\Serializer\Exception\ExceptionInterface;
2024-07-29 15:28:05 +02:00
class ConnectorController extends AbstractController
{
public function __construct(
2024-08-04 14:45:27 +02:00
private readonly EntityManagerInterface $em,
2025-02-22 01:30:35 +01:00
private readonly LoggerInterface $logger,
2024-09-30 13:48:15 +02:00
#[Autowire(service: 'service_container')]
2025-02-22 01:30:35 +01:00
private readonly ContainerInterface $locator,
2025-03-03 14:27:05 +01:00
private readonly KernelInterface $kernel,
2025-02-22 01:30:35 +01:00
) {
2024-07-29 15:28:05 +02:00
}
#[Route(
path: '/api/connectors',
name: 'connector_get_all_mine',
defaults: [
'_api_resource_class' => Connector::class,
'_api_operation_name' => 'get_all_mine',
],
methods: ['GET']
)]
public function getConnector(): Collection
{
/** @var User $user */
$user = $this->getUser();
2024-08-02 23:24:52 +02:00
2024-07-29 15:28:05 +02:00
return $user->getConnectors();
}
/**
2025-02-27 09:01:05 +01:00
* @throws ExceptionInterface
2025-02-22 18:57:50 +01:00
* @throws \Throwable
2024-07-29 15:28:05 +02:00
*/
#[Route(
path: '/api/connectors',
name: 'connector_create',
defaults: [
'_api_resource_class' => Connector::class,
'_api_operation_name' => 'create',
],
methods: ['POST']
)]
public function createConnector(Connector $connector): Connector
2024-07-29 15:28:05 +02:00
{
2024-08-03 00:06:38 +02:00
/** @var User $user */
$user = $this->getUser();
$connector->setUser($user);
2024-07-29 15:28:05 +02:00
2024-08-04 14:45:27 +02:00
$provider = $connector->getProvider();
$this->logger->info('User {username} wants to register a connector from provider {provider}.', [
'username' => $user->getUserIdentifier(),
'provider' => $provider->value,
]);
2024-08-07 01:10:56 +02:00
if (null === $provider) {
2024-08-30 12:54:42 +02:00
throw new BadRequestHttpException('Provider not found');
2024-08-02 23:24:52 +02:00
}
2025-02-27 09:03:22 +01:00
$authData = $connector->getAuthData();
2024-07-29 15:28:05 +02:00
2025-02-24 23:19:11 +01:00
if (ConnectorProvider::EPP === $provider) {
$filesystem = new Filesystem();
2025-03-03 14:27:05 +01:00
$directory = EppClientProvider::buildEppCertificateFolder($this->kernel->getProjectDir(), $connector->getId());
2025-02-24 23:19:11 +01:00
unset($authData['file_certificate_pem'], $authData['file_certificate_key']); // Prevent alteration from user
if (isset($authData['certificate_pem'], $authData['certificate_key'])) {
$pemPath = $directory.'client.pem';
$keyPath = $directory.'client.key';
$filesystem->mkdir($directory, 0755);
$filesystem->dumpFile($pemPath, $authData['certificate_pem']);
$filesystem->dumpFile($keyPath, $authData['certificate_key']);
$connector->setAuthData([...$authData, 'file_certificate_pem' => $pemPath, 'file_certificate_key' => $keyPath]);
}
/** @var AbstractProvider $providerClient */
$providerClient = $this->locator->get($provider->getConnectorProvider());
try {
2025-02-27 09:03:22 +01:00
$connector->setAuthData($providerClient->authenticate($authData));
2025-02-24 23:19:11 +01:00
} catch (\Throwable $exception) {
$filesystem->remove($directory);
throw $exception;
}
} else {
/** @var AbstractProvider $providerClient */
$providerClient = $this->locator->get($provider->getConnectorProvider());
2025-02-27 09:03:22 +01:00
$connector->setAuthData($providerClient->authenticate($authData));
2025-02-24 23:19:11 +01:00
}
2024-08-06 03:38:00 +02:00
$this->logger->info('User {username} authentication data with the {provider} provider has been validated.', [
'username' => $user->getUserIdentifier(),
'provider' => $provider->value,
]);
2025-02-22 01:30:35 +01:00
$connector->setCreatedAt(new \DateTimeImmutable('now'));
2024-07-29 15:28:05 +02:00
$this->em->persist($connector);
$this->em->flush();
return $connector;
}
2025-02-22 18:57:50 +01:00
/**
* @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) {
2025-03-03 14:27:05 +01:00
(new Filesystem())->remove(EppClientProvider::buildEppCertificateFolder($this->kernel->getProjectDir(), $connector->getId()));
2025-02-22 18:57:50 +01:00
}
$this->em->remove($connector);
$this->em->flush();
}
2024-08-02 23:24:52 +02:00
}