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

  1. <?php declare(strict_types=1);
  2. namespace Swag\Security;
  3. use Shopware\Core\Framework\Log\Package;
  4. use Shopware\Core\Framework\Plugin;
  5. use Shopware\Core\Kernel;
  6. use Swag\Security\Components\AbstractSecurityFix;
  7. use Swag\Security\Components\RemoveDisabledServicesCompilerPass;
  8. use Swag\Security\DependencyInjection\Configuration;
  9. use Swag\Security\DependencyInjection\FrameworkExtension;
  10. use Symfony\Component\Config\FileLocator;
  11. use Symfony\Component\DependencyInjection\ContainerBuilder;
  12. use Symfony\Component\DependencyInjection\ContainerInterface;
  13. use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
  14. use Symfony\Component\Routing\Loader\YamlFileLoader;
  15. #[Package('services-settings')]
  16. class SwagPlatformSecurity extends Plugin
  17. {
  18.     final public const PLUGIN_NAME 'SwagPlatformSecurity';
  19.     public function build(ContainerBuilder $container): void
  20.     {
  21.         parent::build($container);
  22.         $this->fetchPluginConfig($container);
  23.         $container->addCompilerPass(new RemoveDisabledServicesCompilerPass());
  24.     }
  25.     public function getContainerExtension(): ?ExtensionInterface
  26.     {
  27.         // Decide if we should override the Shopware config because we have a missing configuration
  28.         $shouldOverrideShopwareConfig = !Configuration::hasSearchSection();
  29.         if ($shouldOverrideShopwareConfig) {
  30.             return new FrameworkExtension();
  31.         }
  32.         return null;
  33.     }
  34.     public function boot(): void
  35.     {
  36.         parent::boot();
  37.         \assert($this->container instanceof ContainerInterface'Container is not set yet, please call setContainer() before calling boot(), see `platform/Core/Kernel.php:186`.');
  38.         foreach ((array) $this->container->getParameter('SwagPlatformSecurity.activeFixes') as $securityFix) {
  39.             $securityFix::boot($this->container);
  40.         }
  41.     }
  42.     private function fetchPluginConfig(ContainerBuilder $container): void
  43.     {
  44.         try {
  45.             $qb Kernel::getConnection();
  46.             $config $qb->fetchAllKeyValue('SELECT ticket, active FROM swag_security_config');
  47.         } catch (\Throwable $e) {
  48.             $config = [];
  49.         }
  50.         foreach ($config as &$item) {
  51.             $item = (bool) $item;
  52.         }
  53.         unset($item);
  54.         $shopwareVersion $_SERVER['SHOPWARE_FAKE_VERSION'] ?? $container->getParameter('kernel.shopware_version');
  55.         /** @var class-string<AbstractSecurityFix>[] $knownIssues */
  56.         $knownIssues $container->getParameter('SwagPlatformSecurity.knownIssues');
  57.         $availableFixes = [];
  58.         $activeFixes = [];
  59.         foreach ($knownIssues as $knownIssue) {
  60.             if (!$knownIssue::isValidForVersion($shopwareVersion)) {
  61.                 continue;
  62.             }
  63.             $availableFixes[] = $knownIssue;
  64.             if (\array_key_exists($knownIssue::getTicket(), $config) && !$config[$knownIssue::getTicket()]) {
  65.                 continue;
  66.             }
  67.             $knownIssue::buildContainer($container);
  68.             $activeFixes[] = $knownIssue;
  69.         }
  70.         $container->setParameter('SwagPlatformSecurity.activeFixes'$activeFixes);
  71.         $container->setParameter('SwagPlatformSecurity.availableFixes'$availableFixes);
  72.     }
  73. }