Spaces:
No application file
No application file
| declare(strict_types=1); | |
| namespace Mautic\IntegrationsBundle\Helper; | |
| use Mautic\IntegrationsBundle\Event\KeysDecryptionEvent; | |
| use Mautic\IntegrationsBundle\Event\KeysEncryptionEvent; | |
| use Mautic\IntegrationsBundle\Exception\IntegrationNotFoundException; | |
| use Mautic\IntegrationsBundle\Facade\EncryptionService; | |
| use Mautic\IntegrationsBundle\Integration\Interfaces\IntegrationInterface; | |
| use Mautic\IntegrationsBundle\IntegrationEvents; | |
| use Mautic\PluginBundle\Entity\Integration; | |
| use Mautic\PluginBundle\Entity\IntegrationRepository; | |
| use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
| class IntegrationsHelper | |
| { | |
| /** | |
| * @var IntegrationInterface[] | |
| */ | |
| private array $integrations = []; | |
| private array $decryptedIntegrationConfigurations = []; | |
| public function __construct( | |
| private IntegrationRepository $integrationRepository, | |
| private EncryptionService $encryptionService, | |
| private EventDispatcherInterface $eventDispatcher | |
| ) { | |
| } | |
| public function addIntegration(IntegrationInterface $integration): void | |
| { | |
| $this->integrations[$integration->getName()] = $integration; | |
| } | |
| /** | |
| * @return IntegrationInterface | |
| * | |
| * @throws IntegrationNotFoundException | |
| */ | |
| public function getIntegration(string $integration) | |
| { | |
| if (!isset($this->integrations[$integration])) { | |
| throw new IntegrationNotFoundException("$integration either doesn't exist or has not been tagged with mautic.basic_integration"); | |
| } | |
| // Ensure the configuration is hydrated | |
| $this->getIntegrationConfiguration($this->integrations[$integration]); | |
| return $this->integrations[$integration]; | |
| } | |
| public function saveIntegrationConfiguration(Integration $configuration): void | |
| { | |
| // Encrypt the keys before saving | |
| $decryptedApiKeys = $configuration->getApiKeys(); | |
| // Dispatch event before encryption | |
| $encryptionEvent = new KeysEncryptionEvent($configuration, $decryptedApiKeys); | |
| $this->eventDispatcher->dispatch($encryptionEvent, IntegrationEvents::INTEGRATION_KEYS_BEFORE_ENCRYPTION); | |
| // Encrypt and store the keys | |
| $encryptedApiKeys = $this->encryptionService->encrypt($encryptionEvent->getKeys()); | |
| $configuration->setApiKeys($encryptedApiKeys); | |
| // Save | |
| $this->integrationRepository->saveEntity($configuration); | |
| // Restore decrypted for use | |
| $configuration->setApiKeys($decryptedApiKeys); | |
| } | |
| /** | |
| * @throws IntegrationNotFoundException | |
| */ | |
| public function getIntegrationConfiguration(IntegrationInterface $integration): Integration | |
| { | |
| if (!$integration->hasIntegrationConfiguration()) { | |
| /** @var Integration $configuration */ | |
| $configuration = $this->integrationRepository->findOneByName($integration->getName()); | |
| if (!$configuration) { | |
| throw new IntegrationNotFoundException("{$integration->getName()} doesn't exist in the database"); | |
| } | |
| $integration->setIntegrationConfiguration($configuration); | |
| } | |
| // Make sure the keys are decrypted | |
| if (!isset($this->decryptedIntegrationConfigurations[$integration->getName()])) { | |
| $configuration = $integration->getIntegrationConfiguration(); | |
| $encryptedApiKeys = $configuration->getApiKeys(); | |
| $decryptedApiKeys = $this->encryptionService->decrypt($encryptedApiKeys); | |
| // Dispatch event after decryption | |
| $decryptionEvent = new KeysDecryptionEvent($configuration, $decryptedApiKeys); | |
| $this->eventDispatcher->dispatch($decryptionEvent, IntegrationEvents::INTEGRATION_KEYS_AFTER_DECRYPTION); | |
| $configuration->setApiKeys($decryptionEvent->getKeys()); | |
| $this->decryptedIntegrationConfigurations[$integration->getName()] = true; | |
| } | |
| return $integration->getIntegrationConfiguration(); | |
| } | |
| } | |