![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/mautic.corals.io/app/bundles/MarketplaceBundle/Controller/ |
<?php declare(strict_types=1); namespace Mautic\MarketplaceBundle\Controller; use Doctrine\Persistence\ManagerRegistry; use Mautic\CoreBundle\Controller\AjaxController as CommonAjaxController; use Mautic\CoreBundle\Factory\MauticFactory; use Mautic\CoreBundle\Factory\ModelFactory; use Mautic\CoreBundle\Helper\CacheHelper; use Mautic\CoreBundle\Helper\ComposerHelper; use Mautic\CoreBundle\Helper\CoreParametersHelper; use Mautic\CoreBundle\Helper\UserHelper; use Mautic\CoreBundle\Security\Permissions\CorePermissions; use Mautic\CoreBundle\Service\FlashBag; use Mautic\CoreBundle\Translation\Translator; use Psr\Log\LoggerInterface; use Symfony\Component\Console\Command\Command; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; class AjaxController extends CommonAjaxController { public function __construct( private ComposerHelper $composer, private CacheHelper $cacheHelper, private LoggerInterface $logger, ManagerRegistry $doctrine, MauticFactory $factory, ModelFactory $modelFactory, UserHelper $userHelper, CoreParametersHelper $coreParametersHelper, EventDispatcherInterface $dispatcher, Translator $translator, FlashBag $flashBag, RequestStack $requestStack, CorePermissions $security ) { parent::__construct($doctrine, $factory, $modelFactory, $userHelper, $coreParametersHelper, $dispatcher, $translator, $flashBag, $requestStack, $security); } public function installPackageAction(Request $request): JsonResponse { $data = json_decode($request->getContent(), true); if (empty($data['vendor']) || empty($data['package'])) { return $this->sendJsonResponse([ 'error' => $this->translator->trans('marketplace.package.request.details.missing'), ], 400); } $packageName = $data['vendor'].'/'.$data['package']; if ($this->composer->isInstalled($packageName)) { return $this->sendJsonResponse([ 'error' => $this->translator->trans('marketplace.package.install.already.installed'), ], 400); } try { $installResult = $this->composer->install($packageName); if (Command::SUCCESS !== $installResult->exitCode) { return $this->installError(new \Exception($installResult->output)); } } catch (\Exception $e) { return $this->installError($e); } // Note: do not do anything except returning a response after clearing the cache to prevent errors $clearCacheResult = $this->clearCacheOrReturnError(); if (null !== $clearCacheResult) { return $clearCacheResult; } return new JsonResponse(['success' => true]); } public function removePackageAction(Request $request): JsonResponse { $data = json_decode($request->getContent(), true); if (empty($data['vendor']) || empty($data['package'])) { return $this->sendJsonResponse([ 'error' => $this->translator->trans('marketplace.package.request.details.missing'), ], 400); } $packageName = $data['vendor'].'/'.$data['package']; if (!$this->composer->isInstalled($packageName)) { return $this->sendJsonResponse([ 'error' => $this->translator->trans('marketplace.package.remove.not.installed'), ], 400); } try { $removeResult = $this->composer->remove($packageName); if (0 !== $removeResult->exitCode) { return $this->removeError(new \Exception($removeResult->output)); } } catch (\Exception $e) { return $this->removeError($e); } // Note: do not do anything except returning a response after clearing the cache to prevent errors $clearCacheResult = $this->clearCacheOrReturnError(); if (null !== $clearCacheResult) { return $clearCacheResult; } return new JsonResponse(['success' => true]); } private function clearCacheOrReturnError(): ?JsonResponse { try { $exitCode = $this->cacheHelper->clearSymfonyCache(); if (0 !== $exitCode) { $this->logger->error('Could not clear Mautic\'s cache. Please try again.'); return $this->sendJsonResponse([ 'error' => $this->translator->trans('marketplace.package.cache.clear.failed'), ], 500); } } catch (\Exception $e) { $this->logger->error('Could not clear Mautic\'s cache. Details: '.$e->getMessage()); return $this->sendJsonResponse([ 'error' => $this->translator->trans('marketplace.package.cache.clear.failed'), ], 500); } return null; } private function installError(\Exception $e): JsonResponse { $this->logger->error('Installation of plugin through Composer has failed: '.$e->getMessage()); return $this->sendJsonResponse([ 'error' => $this->translator->trans('marketplace.package.install.failed'), ], 500); } private function removeError(\Exception $e): JsonResponse { $this->logger->error('Error while removing package through Composer: '.$e->getMessage()); return $this->sendJsonResponse([ 'error' => $this->translator->trans('marketplace.package.remove.failed'), ], 500); } }