getPrevious() !== null ? get_class($exception->getPrevious()) : self::class; $response = new Response(); if ($baseClassName === MissingEmailException::class) { $this->setErrorMessage($request, __d('cake_d_c/users', 'Please enter your email')); $request->getSession()->write( Configure::read('Users.Key.Session.social'), $exception->getAttributes()['rawData'] ); return $this->responseWithActionLocation($response, 'socialEmail'); } $this->setErrorMessage($request, __d('cake_d_c/users', 'Could not identify your account, please try again')); return $this->responseWithActionLocation($response, 'login'); } /** * Set request error message * * @param \Cake\Http\ServerRequest $request the request with session attribute * @param string $message the message * @return void */ private function setErrorMessage(ServerRequest $request, $message) { $messages = (array)$request->getSession()->read('Flash.flash'); $messages[] = [ 'key' => 'flash', 'element' => 'Flash/error', 'params' => [], 'message' => $message, ]; $request->getSession()->write('Flash.flash', $messages); } /** * Set location header to response using the string action * * @param \Cake\Http\Response $response to set location header * @param string $action action at users controller * @return \Psr\Http\Message\ResponseInterface */ protected function responseWithActionLocation(Response $response, $action) { $url = Router::url(UsersUrl::actionUrl($action)); return $response->withLocation($url); } /** * Go to next handling SocialAuthenticationException * * @param \Cake\Http\ServerRequest $request The request * @param \Psr\Http\Server\RequestHandlerInterface $handler The request handler. * @return \Psr\Http\Message\ResponseInterface */ protected function goNext(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { try { return $handler->handle($request); } catch (SocialAuthenticationException $exception) { return $this->onAuthenticationException($request, $exception); } } /** * Callable implementation for the middleware stack. * * @param \Psr\Http\Message\ServerRequestInterface $request The request. * @param \Psr\Http\Server\RequestHandlerInterface $handler The request handler. * @return \Psr\Http\Message\ResponseInterface A response. */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { if (!(new UsersUrl())->checkActionOnRequest('socialLogin', $request)) { return $handler->handle($request); } $service = (new ServiceFactory())->createFromRequest($request); if (!$service->isGetUserStep($request)) { return (new Response()) ->withLocation($service->getAuthorizationUrl($request)); } $request = $request->withAttribute(SocialAuthenticator::SOCIAL_SERVICE_ATTRIBUTE, $service); return $this->goNext($request, $handler); } }