currentRequest = $request; try { $response = $handler->handle($request); } catch (VerificationRequiredException $exception) { $response = $this->handleVerificationRequired($exception, $request); } catch (RequestGrantedException $exception) { $response = $this->handleRequestGrantedException($exception, $request); } $this->currentRequest = null; return $response; } /** * Redirects to the sudo mode controller, and renders the password verification dialog. */ private function handleVerificationRequired( VerificationRequiredException $exception, ServerRequestInterface $request, ): ResponseInterface { $claim = $exception->getClaim(); $this->logger->info('Confirmation required', ['claim' => $claim->id]); $this->storage->addClaim($claim); $isAjaxCall = (bool)($request->getAttribute('route')?->getOption('ajax') ?? false); if ($isAjaxCall) { return (new JsonResponse([ 'sudoModeInitialization' => [ 'verifyActionUri' => (string)$this->controller->buildVerifyActionUriForClaim($claim), 'allowInstallToolPassword' => $GLOBALS['BE_USER']->isSystemMaintainer(), 'isAjax' => true, 'labels' => $GLOBALS['LANG']->getLabelsFromResource('EXT:backend/Resources/Private/Language/SudoMode.xlf'), ], ]))->withStatus(422, 'Step-Up required: A different authentication level is required'); } $uri = $this->controller->buildModuleActionUriForClaim($claim); return new RedirectResponse($uri, 401); } /** * Redirects (GET) or Subrequests (non GET HTTP methods) to the URI that * was originally requested (prior to this sudo mode interception). */ private function handleRequestGrantedException( RequestGrantedException $exception, ServerRequestInterface $request, ): ResponseInterface { $instruction = $exception->getInstruction(); if ($instruction->getMethod() === 'GET') { return new RedirectResponse($instruction->getUri(), 303); } $request = $this->serverRequestFactory ->createServerRequest( $instruction->getMethod(), $instruction->getUri(), $instruction->getServerParams() ) ->withBody($instruction->getBody()) ->withParsedBody($instruction->getParsedBody()) ->withQueryParams($instruction->getQueryParams()) ->withRequestTarget($instruction->getRequestTarget()) // Use cookie params from current request, as cookies might have been updated in the meantime ->withCookieParams($request->getCookieParams()); foreach ($instruction->getHeaders() as $name => $values) { foreach ($values as $value) { $request = $request->withAddedHeader($name, $value); } } return $this->application->handle($request); } }