custom/plugins/SwagPlatformSecurity/src/SwagPlatformSecurity.php line 22

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Swag\Security;
  3. use Shopware\Core\Framework\Plugin;
  4. use Shopware\Core\Framework\Plugin\Context\InstallContext;
  5. use Shopware\Core\Framework\Plugin\Context\UpdateContext;
  6. use Shopware\Core\Kernel;
  7. use Swag\Security\Components\RemoveDisabledServicesCompilerPass;
  8. use Swag\Security\DependencyInjection\Configuration;
  9. use Swag\Security\DependencyInjection\FrameworkExtension;
  10. use Swag\Security\Components\State;
  11. use Swag\Security\Components\UpdateHtaccess;
  12. use Symfony\Component\Config\FileLocator;
  13. use Symfony\Component\DependencyInjection\ContainerBuilder;
  14. use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
  15. use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
  16. require_once __DIR__ '/Fixes/NEXT15858/init.php';
  17. require_once __DIR__ '/Fixes/NEXT21077/init.php';
  18. class SwagPlatformSecurity extends Plugin
  19. {
  20.     public const PLUGIN_NAME 'SwagPlatformSecurity';
  21.     public function build(ContainerBuilder $container): void
  22.     {
  23.         $loader = new PhpFileLoader($container, new FileLocator([__DIR__ '/Resources/config']));
  24.         $loader->load('services.php');
  25.         $this->fetchPluginConfig($container);
  26.         $container->addCompilerPass(new RemoveDisabledServicesCompilerPass());
  27.     }
  28.     public function boot(): void
  29.     {
  30.         parent::boot();
  31.         foreach ($this->container->getParameter('SwagPlatformSecurity.activeFixes') as $securityFix) {
  32.             $securityFix::boot($this->container);
  33.         }
  34.     }
  35.     public function getContainerExtension(): ?ExtensionInterface
  36.     {
  37.         // Decide if we should override the Shopware config because we have a missing configuration
  38.         $shouldOverrideShopwareConfig = !Configuration::hasSearchSection();
  39.         if ($shouldOverrideShopwareConfig) {
  40.             return new FrameworkExtension();
  41.         }
  42.         return null;
  43.     }
  44.     public function install(InstallContext $installContext): void
  45.     {
  46.         $this->copyHtaccess();
  47.     }
  48.     public function update(UpdateContext $updateContext): void
  49.     {
  50.         $this->copyHtaccess();
  51.     }
  52.     private function fetchPluginConfig(ContainerBuilder $container): void
  53.     {
  54.         try {
  55.             $qb Kernel::getConnection()->createQueryBuilder();
  56.             $config $qb
  57.                 ->select(['ticket''active'])
  58.                 ->from('swag_security_config''config')
  59.                 ->execute()
  60.                 ->fetchAll(\PDO::FETCH_KEY_PAIR);
  61.         } catch (\Throwable $e) {
  62.             $config = [];
  63.         }
  64.         foreach ($config as &$item) {
  65.             $item = (bool) $item;
  66.         }
  67.         unset($item);
  68.         $shopwareVersion $_SERVER['SHOPWARE_FAKE_VERSION'] ?? $container->getParameter('kernel.shopware_version');
  69.         $availableFixes = [];
  70.         $activeFixes = [];
  71.         foreach (State::KNOWN_ISSUES as $knownIssue) {
  72.             if (!$knownIssue::isValidForVersion($shopwareVersion)) {
  73.                 continue;
  74.             }
  75.             $availableFixes[] = $knownIssue;
  76.             if (array_key_exists($knownIssue::getTicket(), $config) && !$config[$knownIssue::getTicket()]) {
  77.                 continue;
  78.             }
  79.             $knownIssue::buildContainer($container);
  80.             $activeFixes[] = $knownIssue;
  81.         }
  82.         $container->setParameter('SwagPlatformSecurity.activeFixes'$activeFixes);
  83.         $container->setParameter('SwagPlatformSecurity.availableFixes'$availableFixes);
  84.     }
  85.     private function copyHtaccess(): void
  86.     {
  87.         $projectDirHtaccess $this->container->getParameter('kernel.project_dir'). '/.htaccess';
  88.         copy(__DIR__ '/../root_htaccess.dist'$projectDirHtaccess);
  89.         $knownFolders = [
  90.             $this->container->getParameter('kernel.project_dir'). '/bin',
  91.             $this->container->getParameter('kernel.project_dir'). '/config',
  92.             $this->container->getParameter('kernel.project_dir'). '/custom',
  93.             $this->container->getParameter('kernel.project_dir'). '/files',
  94.             $this->container->getParameter('kernel.project_dir'). '/src',
  95.             $this->container->getParameter('kernel.project_dir'). '/var',
  96.             $this->container->getParameter('kernel.project_dir'). '/vendor',
  97.         ];
  98.         foreach ($knownFolders as $knownFolder) {
  99.             if (file_exists($knownFolder)) {
  100.                 copy(__DIR__ '/../block_directory_access_htaccess.dist'$knownFolder '/.htaccess');
  101.             }
  102.         }
  103.         $shopwareVersion $_SERVER['SHOPWARE_FAKE_VERSION'] ?? $this->container->getParameter('kernel.shopware_version');
  104.         $updateService = new UpdateHtaccess();
  105.         // Only update the .htaccess if we are on a older shopware version
  106.         if (version_compare($shopwareVersion$updateService->getMaxVersion(), '<')) {
  107.             $publicHtaccess $this->container->getParameter('kernel.project_dir'). '/public/.htaccess';
  108.             $updateService->updateHtaccess($publicHtaccess__DIR__ '/../current_public_htaccess.dist');
  109.         }
  110.     }
  111. }