vendor/shopware/storefront/Framework/Routing/StorefrontSubscriber.php line 412

  1.             return;
  2.         }
  3.         if (!$master->attributes->get(SalesChannelRequest::ATTRIBUTE_IS_SALES_CHANNEL_REQUEST)) {
  4.             return;
  5.         }
  6.         if (!$master->hasSession()) {
  7.             return;
  8.         }
  9.         $session $master->getSession();
  10.         if (!$session->isStarted()) {
  11.             $session->setName('session-');
  12.             $session->start();
  13.             $session->set('sessionId'$session->getId());
  14.         }
  15.         $salesChannelId $master->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID);
  16.         if ($salesChannelId === null) {
  17.             /** @var SalesChannelContext|null $salesChannelContext */
  18.             $salesChannelContext $master->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
  19.             if ($salesChannelContext !== null) {
  20.                 $salesChannelId $salesChannelContext->getSalesChannel()->getId();
  21.             }
  22.         }
  23.         if ($this->shouldRenewToken($session$salesChannelId)) {
  24.             $token Random::getAlphanumericString(32);
  25.             $session->set(PlatformRequest::HEADER_CONTEXT_TOKEN$token);
  26.             $session->set(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID$salesChannelId);
  27.         }
  28.         $master->headers->set(
  29.             PlatformRequest::HEADER_CONTEXT_TOKEN,
  30.             $session->get(PlatformRequest::HEADER_CONTEXT_TOKEN)
  31.         );
  32.     }
  33.     public function updateSessionAfterLogin(CustomerLoginEvent $event): void
  34.     {
  35.         $token $event->getContextToken();
  36.         $this->updateSession($token);
  37.     }
  38.     public function updateSessionAfterLogout(): void
  39.     {
  40.         $newToken Random::getAlphanumericString(32);
  41.         $this->updateSession($newTokentrue);
  42.     }
  43.     public function updateSession(string $tokenbool $destroyOldSession false): void
  44.     {
  45.         $master $this->requestStack->getMainRequest();
  46.         if (!$master) {
  47.             return;
  48.         }
  49.         if (!$master->attributes->get(SalesChannelRequest::ATTRIBUTE_IS_SALES_CHANNEL_REQUEST)) {
  50.             return;
  51.         }
  52.         if (!$master->hasSession()) {
  53.             return;
  54.         }
  55.         $session $master->getSession();
  56.         $session->migrate($destroyOldSession);
  57.         $session->set('sessionId'$session->getId());
  58.         $session->set(PlatformRequest::HEADER_CONTEXT_TOKEN$token);
  59.         $master->headers->set(PlatformRequest::HEADER_CONTEXT_TOKEN$token);
  60.     }
  61.     public function customerNotLoggedInHandler(ExceptionEvent $event): void
  62.     {
  63.         if (!$event->getRequest()->attributes->has(SalesChannelRequest::ATTRIBUTE_IS_SALES_CHANNEL_REQUEST)) {
  64.             return;
  65.         }
  66.         if (!$event->getThrowable() instanceof CustomerNotLoggedInException) {
  67.             return;
  68.         }
  69.         $request $event->getRequest();
  70.         $parameters = [
  71.             'redirectTo' => $request->attributes->get('_route'),
  72.             'redirectParameters' => json_encode($request->attributes->get('_route_params'), \JSON_THROW_ON_ERROR),
  73.         ];
  74.         $redirectResponse = new RedirectResponse($this->router->generate('frontend.account.login.page'$parameters));
  75.         $event->setResponse($redirectResponse);
  76.     }
  77.     public function maintenanceResolver(RequestEvent $event): void
  78.     {
  79.         if ($this->maintenanceModeResolver->shouldRedirect($event->getRequest())) {
  80.             $event->setResponse(
  81.                 new RedirectResponse(
  82.                     $this->router->generate('frontend.maintenance.page'),
  83.                     RedirectResponse::HTTP_TEMPORARY_REDIRECT
  84.                 )
  85.             );
  86.         }
  87.     }
  88.     public function preventPageLoadingFromXmlHttpRequest(ControllerEvent $event): void
  89.     {
  90.         if (!$event->getRequest()->isXmlHttpRequest()) {
  91.             return;
  92.         }
  93.         /** @var list<string> $scope */
  94.         $scope $event->getRequest()->attributes->get(PlatformRequest::ATTRIBUTE_ROUTE_SCOPE, []);
  95.         if (!\in_array(StorefrontRouteScope::ID$scopetrue)) {
  96.             return;
  97.         }
  98.         /** @var callable(): Response $controller */
  99.         $controller $event->getController();
  100.         // happens if Controller is a closure
  101.         if (!\is_array($controller)) {
  102.             return;
  103.         }
  104.         $isAllowed $event->getRequest()->attributes->getBoolean('XmlHttpRequest');
  105.         if ($isAllowed) {
  106.             return;
  107.         }
  108.         throw new AccessDeniedHttpException('PageController can\'t be requested via XmlHttpRequest.');
  109.     }
  110.     // used to switch session token - when the context token expired
  111.     public function replaceContextToken(SalesChannelContextResolvedEvent $event): void
  112.     {
  113.         $context $event->getSalesChannelContext();
  114.         // only update session if token expired and switched
  115.         if ($event->getUsedToken() === $context->getToken()) {
  116.             return;
  117.         }
  118.         $this->updateSession($context->getToken());
  119.     }
  120.     public function addHreflang(StorefrontRenderEvent $event): void
  121.     {
  122.         $request $event->getRequest();
  123.         $route $request->attributes->get('_route');
  124.         if ($route === null) {
  125.             return;
  126.         }
  127.         $routeParams $request->attributes->get('_route_params', []);
  128.         $salesChannelContext $request->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
  129.         $parameter = new HreflangLoaderParameter($route$routeParams$salesChannelContext);
  130.         $event->setParameter('hrefLang'$this->hreflangLoader->load($parameter));
  131.     }
  132.     public function addShopIdParameter(StorefrontRenderEvent $event): void
  133.     {
  134.         if (!$this->activeAppsLoader->getActiveApps()) {
  135.             return;
  136.         }
  137.         try {
  138.             $shopId $this->shopIdProvider->getShopId();
  139.         } catch (AppUrlChangeDetectedException) {
  140.             return;
  141.         }
  142.         $event->setParameter('appShopId'$shopId);
  143.     }
  144.     public function addIconSetConfig(StorefrontRenderEvent $event): void
  145.     {
  146.         $request $event->getRequest();
  147.         // get name if theme is not inherited
  148.         $theme $request->attributes->get(SalesChannelRequest::ATTRIBUTE_THEME_NAME);
  149.         if (!$theme) {
  150.             // get theme name from base theme because for inherited themes the name is always null
  151.             $theme $request->attributes->get(SalesChannelRequest::ATTRIBUTE_THEME_BASE_NAME);
  152.         }
  153.         if (!$theme) {
  154.             return;
  155.         }
  156.         $themeConfig $this->themeRegistry->getConfigurations()->getByTechnicalName($theme);
  157.         if (!$themeConfig) {
  158.             return;
  159.         }
  160.         $iconConfig = [];
  161.         foreach ($themeConfig->getIconSets() as $pack => $path) {
  162.             $iconConfig[$pack] = [
  163.                 'path' => $path,
  164.                 'namespace' => $theme,
  165.             ];
  166.         }
  167.         $event->setParameter('themeIconConfig'$iconConfig);
  168.     }
  169.     private function shouldRenewToken(SessionInterface $session, ?string $salesChannelId null): bool
  170.     {
  171.         if (!$session->has(PlatformRequest::HEADER_CONTEXT_TOKEN) || $salesChannelId === null) {
  172.             return true;
  173.         }
  174.         if ($this->systemConfigService->get('core.systemWideLoginRegistration.isCustomerBoundToSalesChannel')) {
  175.             return $session->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID) !== $salesChannelId;
  176.         }
  177.         return false;
  178.     }
  179. }