custom/plugins/BXK_FancyProtect/src/Subscriber/BXK_FancyProtectSubscriber.php line 33

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace BXK_FancyProtect\Subscriber;
  3. use BXK_FancyProtect\Controller\BXK_FancyProtectController as Controller;
  4. use Shopware\Administration\Controller\AdministrationController;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Shopware\Storefront\Event\StorefrontRenderEvent;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\HttpFoundation\Session\Session;
  9. use Shopware\Core\System\SystemConfig\SystemConfigService;
  10. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  11. use Symfony\Component\HttpKernel\KernelEvents;
  12. use Shopware\Core\Framework\Event\BeforeSendResponseEvent;
  13. use Symfony\Component\Routing\RouterInterface;
  14. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  15. class BXK_FancyProtectSubscriber implements EventSubscriberInterface {
  16.     private $config;
  17.     private $router;
  18.     public function __construct(RouterInterface $routerSystemConfigService $systemConfigService) {
  19.         $this->config $systemConfigService;
  20.         $this->router $router;
  21.     }
  22.     public static function getSubscribedEvents(): array {
  23.         return [
  24.             BeforeSendResponseEvent::class => 'fancyResponseCheck'
  25.         ];
  26.     }
  27.     public function fancyResponseCheck(BeforeSendResponseEvent $event){
  28.         $protectionUri $this->router->generate("frontend.bxk_fancyprotect.entry");
  29.         $maintenanceUri $this->router->generate("frontend.maintenance.page");
  30.         $request $event->getRequest();
  31.         $key $this->getProtectionPassword($request);
  32.         if (!isset($key) || $key == "") {
  33.             return; // no key setted -> allow!
  34.         }
  35.         $releaseDate $this->getConfigValue('unlockTime'$request->attributes->get('sw-sales-channel-id'));
  36.         if (isset($releaseDate)) {
  37.             if (strtotime($releaseDate) <= strtotime('now')) {
  38.                 return; // release date -> allow request
  39.             }
  40.         }  
  41.         $cookie $event->getRequest()->cookies->get("entry");
  42.         if(!is_null($cookie)){
  43.             $md5Key $event->getRequest()->cookies->get("entry");
  44.             if (md5($this->getProtectionPassword($request)) == $md5Key) {
  45.                 // Password in cookies is correct -> allow request
  46.                 return;
  47.             }
  48.         }
  49.         $attributes $request->attributes;
  50.         if(!$attributes->count()){
  51.             // not in storefront -> allow request
  52.             return;
  53.         }
  54.         $isProtectionPage $event->getRequest()->getRequestUri() == $protectionUri;
  55.         $isMaintenancePage $event->getRequest()->getRequestUri() == $maintenanceUri;
  56.         if($request->isXmlHttpRequest() || !$attributes->get("_is_sales_channel") || $isMaintenancePage || $isProtectionPage) {
  57.             // Ajax / XmlHttpRequest request (eg newsletter) or on protection page -> allow request
  58.             return;
  59.         }
  60.         $event->setResponse(
  61.             new RedirectResponse($protectionUri)
  62.         );
  63.     }
  64.     private function getProtectionPassword($request) {
  65.         return $this->getConfigValue('protectionPwd'$request->attributes->get('sw-sales-channel-id'));
  66.     }
  67.     private function getConfigValue($key$default null) {
  68.         $configKey 'BXK_FancyProtect.config.' $key;
  69.         return $this->config->get($configKey$default);
  70.     }
  71. }