Ejemplo n.º 1
0
 public function handleRestApiError(MvcEvent $e)
 {
     if (array_key_exists('exception', $e->getParams())) {
         $exception = $e->getParams()['exception'];
         if ($exception instanceof RestApiException) {
             $e->stopPropagation();
             $response = $e->getResponse();
             $response->setStatusCode('400');
             $response->getHeaders()->addHeaderLine('Content-Type', 'application/json');
             $adapter = new Json();
             $errorData = $exception->getErrorData();
             $original = $exception->getOriginal();
             $count = 0;
             while ($original instanceof \Exception) {
                 $errorData['previous-' . $count] = $original->getMessage() . '/' . $original->getFile() . '/' . $original->getLine();
                 $original = $original->getPrevious();
                 $count++;
             }
             $response->setContent($adapter->serialize($errorData));
             $response->sendHeaders();
             $response->sendContent();
             exit;
         }
     }
 }
Ejemplo n.º 2
0
 /**
  * Get the exception and optionally set status code, reason message and additional errors
  *
  * @internal
  * @param  MvcEvent $event
  * @return void
  */
 public function onDispatchError(MvcEvent $event)
 {
     $exception = $event->getParam('exception');
     if (isset($this->exceptionMap[get_class($exception)])) {
         $exception = $this->createHttpException($exception);
     }
     // We just deal with our Http error codes here !
     if (!$exception instanceof HttpExceptionInterface || $event->getResult() instanceof HttpResponse) {
         return;
     }
     // We clear the response for security purpose
     $response = new HttpResponse();
     $response->getHeaders()->addHeaderLine('Content-Type', 'application/json');
     $exception->prepareResponse($response);
     // NOTE: I'd like to return a JsonModel instead, and let ZF handle the request, but I couldn't make
     // it work because for unknown reasons, the Response get replaced "somewhere" in the MVC workflow,
     // so the simplest is simply to do that
     $content = ['status_code' => $response->getStatusCode(), 'message' => $response->getReasonPhrase()];
     if ($errors = $exception->getErrors()) {
         $content['errors'] = $errors;
     }
     $response->setContent(json_encode($content));
     $event->setResponse($response);
     $event->setResult($response);
     $event->stopPropagation(true);
 }
Ejemplo n.º 3
0
 /**
  * Check the domain is a known domain for the CMS.  If not the primary, it will
  * redirect the user to the primary domain.  Useful for multiple domain sites.
  *
  * @param MvcEvent $event Zend MVC Event
  *
  * @return null|Response
  */
 public function checkDomain(MvcEvent $event)
 {
     if ($this->isConsoleRequest()) {
         return null;
     }
     $currentDomain = $this->siteService->getCurrentDomain();
     $site = $this->siteService->getCurrentSite($currentDomain);
     $redirectUrl = $this->domainRedirectService->getSiteNotAvailableRedirectUrl($site);
     if (!$site->isSiteAvailable() && empty($redirectUrl)) {
         $response = new Response();
         $response->setStatusCode(404);
         $event->stopPropagation(true);
         return $response;
     }
     if ($redirectUrl) {
         $response = new Response();
         $response->setStatusCode(302);
         $response->getHeaders()->addHeaderLine('Location', '//' . $redirectUrl);
         $event->stopPropagation(true);
         return $response;
     }
     $redirectUrl = $this->domainRedirectService->getPrimaryRedirectUrl($site);
     if ($redirectUrl) {
         $response = new Response();
         $response->setStatusCode(302);
         $response->getHeaders()->addHeaderLine('Location', '//' . $redirectUrl);
         $event->stopPropagation(true);
         return $response;
     }
     return null;
 }
 public function postRoute(MvcEvent $event)
 {
     // we want to test only parsing of arguments and routing.
     // No real dispatching is needed here
     $event->stopPropagation(true);
     return $event->getResponse()->setContent("stopped");
 }
Ejemplo n.º 5
0
 /**
  * @param MvcEvent $event
  */
 public function renderRequest(MvcEvent $event)
 {
     /** @var Response $zendResponse */
     $zendResponse = $event->getResponse();
     $zendResponse->send();
     $event->stopPropagation();
 }
 public function checkAuthentication(MvcEvent $event)
 {
     if ($event->getRequest() instanceof ConsoleResquest) {
         return;
     }
     $routename = $event->getRouteMatch()->getMatchedRouteName();
     // TODO mettre en conf
     if ($routename == 'zfcuser/login' || $routename == 'zfcuser/logout' || $routename == 'execution') {
         return;
     }
     $zfcUser = $this->getServiceLocator()->get('zfcuser_auth_service');
     $config = $this->getServiceLocator()->get('Config');
     $authorized = false;
     if ($zfcUser->hasIdentity()) {
         $authorized = $this->getFileAuthService()->checkAutorisation($zfcUser->getIdentity()->getUserName(), $routename);
     }
     if (!$zfcUser->hasIdentity() || true !== $authorized) {
         $url = $event->getRouter()->assemble(array(), array('name' => 'zfcuser/login'));
         $response = $event->getResponse();
         $response->getHeaders()->addHeaderLine('Location', $url);
         $response->setStatusCode(302);
         $response->sendHeaders();
         $stopCallBack = function ($event) use($response) {
             $event->stopPropagation();
             return $response;
         };
         $event->getApplication()->getEventManager()->attach(MvcEvent::EVENT_ROUTE, $stopCallBack, -10000);
         return $response;
     }
 }
Ejemplo n.º 7
0
 public function doAuthentication(MvcEvent $event)
 {
     if (!$event->getRequest() instanceof Request) {
         return;
     }
     $application = $event->getApplication();
     $sm = $application->getServiceManager();
     $match = $event->getRouteMatch();
     $controller = $match->getParam('controller');
     $action = $match->getParam('action');
     $plugin = $sm->get('ControllerPluginManager')->get('IsAllowed');
     $hasIdentity = $plugin->getIdentity();
     if (!$plugin->isAllowed($controller, $action)) {
         $router = $event->getRouter();
         $url = $router->assemble([], ['name' => 'guest' === $hasIdentity->getRoleId() ? 'user' : 'home']);
         $response = $event->getResponse();
         $response->setStatusCode(302);
         //redirect to login route...
         // change with header('location: '.$url); if code below not working
         $response->getHeaders()->addHeaderLine('Location', $url);
         $event->stopPropagation();
         return $response;
     }
     return;
 }
 /**
  * Handle rendering errors
  *
  * Rendering errors are usually due to trying to render a template in
  * the PhpRenderer, when we have no templates.
  *
  * As such, report as an unacceptable response.
  *
  * @param  MvcEvent $e
  */
 public function onRenderError(MvcEvent $e)
 {
     $response = $e->getResponse();
     $status = 406;
     $title = 'Not Acceptable';
     $describedBy = 'http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html';
     $detail = 'Your request could not be resolved to an acceptable representation.';
     $details = false;
     $exception = $e->getParam('exception');
     if ($exception instanceof \Exception && !$exception instanceof ViewExceptionInterface) {
         $code = $exception->getCode();
         if ($code >= 100 && $code <= 600) {
             $status = $code;
         } else {
             $status = 500;
         }
         $title = 'Unexpected error';
         $detail = $exception->getMessage();
         $details = ['code' => $exception->getCode(), 'message' => $exception->getMessage(), 'trace' => $exception->getTraceAsString()];
     }
     $payload = ['status' => $status, 'title' => $title, 'describedBy' => $describedBy, 'detail' => $detail];
     if ($details && $this->displayExceptions) {
         $payload['details'] = $details;
     }
     $response->getHeaders()->addHeaderLine('content-type', 'application/problem+json');
     $response->setStatusCode($status);
     $response->setContent(json_encode($payload));
     $e->stopPropagation();
 }
Ejemplo n.º 9
0
 public function onPreBootstrap(MvcEvent $e)
 {
     $application = $e->getApplication();
     $services = $application->getServiceManager();
     $events = $application->getEventManager();
     $config = $services->has('Config') ? $services->get('Config') : [];
     // Check Database connectivity
     if ($services->has('Zend\\Db\\Adapter\\Adapter')) {
         $adapter = $services->get('Zend\\Db\\Adapter\\Adapter');
         try {
             $adapter->getDriver()->getConnection()->connect();
         } catch (\Exception $ex) {
             $viewManagerConfig = $config['view_manager'] ? $config['view_manager'] : [];
             $response = $e->getResponse();
             $viewModel = $e->getViewModel();
             $template = isset($viewManagerConfig['service_unavailable_template']) ? $viewManagerConfig['service_unavailable_template'] : '503';
             $viewModel->setTemplate($template);
             if ($response instanceof HttpResponse) {
                 $response->setStatusCode(503);
             } elseif ($response instanceof ConsoleModel) {
                 $response->setErrorLevel(1);
             } else {
                 echo "Service Unavailable.";
                 exit(1);
             }
             $event = $e;
             $event->setResponse($response);
             $event->setTarget($application);
             $events->trigger(MvcEvent::EVENT_RENDER, $event);
             $events->trigger(MvcEvent::EVENT_FINISH, $event);
             $e->stopPropagation(true);
             exit(1);
         }
     }
     // Maintenance mode
     // Session Management
     if (!$services->has('Zend\\Session\\Config\\ConfigInterface')) {
         if (isset($config['session_config'])) {
             $services->setFactory('Zend\\Session\\ConfigInterface', 'Zend\\Session\\Service\\SessionConfigFactory');
         }
     }
     if (!$services->has('Zend\\Session\\Storage\\StorageInterface')) {
         if (isset($config['session_storage'])) {
             $services->setFactory('Zend\\Session\\StorageInterface', 'Zend\\Session\\Service\\StorageFactory');
         }
     }
     if (!$services->has('Zend\\Session\\SaveHandler\\SaveHandlerInterface')) {
         if ($services->has('Zend\\Db\\Adapter\\Adapter')) {
             $adapter = $services->get('Zend\\Db\\Adapter\\Adapter');
             $tableGateway = new TableGateway('sessions', $adapter);
             $options = new DbTableGatewayOptions();
             $sessionHandler = new DbTableGateway($tableGateway, $options);
             $services->setService('Zend\\Session\\SaveHandler\\SaveHandlerInterface', $sessionHandler);
         }
     }
     if (!$services->has('Zend\\Session\\ManagerInterface')) {
         $services->setFactory('Zend\\Session\\ManagerInterface', 'Zend\\Session\\Service\\SessionManagerFactory');
     }
 }
Ejemplo n.º 10
0
 protected function sendToUrl(MvcEvent $e, $url)
 {
     $response = $e->getResponse();
     $response->getHeaders()->addHeaderLine('Location', $url);
     $response->setStatusCode($this->responseCode);
     $response->sendHeaders();
     return $e->stopPropagation();
 }
Ejemplo n.º 11
0
 protected function terminateEvent(MvcEvent $event, $error, \Exception $exception)
 {
     $eventManager = $event->getApplication()->getEventManager();
     $event->setError($error);
     $event->setParam('exception', $exception);
     $event->stopPropagation(true);
     $eventManager->trigger(MvcEvent::EVENT_DISPATCH_ERROR, $event);
 }
Ejemplo n.º 12
0
 /**
  * Handle locale
  */
 public function handleLocale()
 {
     /** @var PhpRequest $request */
     $request = $this->mvcEvent->getRequest();
     $response = $this->mvcEvent->getResponse();
     $moduleOptions = $this->getModuleOptions();
     if (!$request instanceof PhpRequest || !$moduleOptions->isMultiLanguage()) {
         return null;
     }
     /** @var LocaleNameParserService $localeNameParserService */
     $localeNameParserService = $this->mvcEvent->getApplication()->getServiceManager()->get(LocaleNameParserService::class);
     try {
         $localeFromHost = $localeNameParserService->getLocaleFromHost();
         $this->setAppLocale($localeFromHost);
         if (!$moduleOptions->isMappedDomainRedirectable()) {
             return null;
         }
     } catch (LocaleNotFoundException $exception) {
         //no locale in host? Let's fond them somewhere else!
         $localeFromHost = null;
     }
     try {
         $localeFromPath = $localeNameParserService->getLocaleFromUriPath();
         $this->setAppLocale($localeFromPath);
         return null;
     } catch (LocaleNotFoundException $exception) {
         $localeFromPath = null;
     }
     if (is_null($localeFromPath) && !is_null($localeFromHost)) {
         return null;
     }
     //use browser locale
     try {
         $locale = $localeNameParserService->getLocaleFromBrowser();
     } catch (LocaleNotFoundException $exception) {
         $locale = $localeNameParserService->getDefaultLocale();
     }
     /** @var PhpResponse $response */
     $url = $localeNameParserService->getUrlForLocale($locale);
     $response->getHeaders()->addHeaderLine('Location', $url);
     $response->setStatusCode(PhpResponse::STATUS_CODE_302);
     $response->sendHeaders();
     $this->mvcEvent->stopPropagation(true);
     return $response;
 }
Ejemplo n.º 13
0
 /**
  * @inheritDoc
  */
 public function determineTtl(MvcEvent $e)
 {
     $viewModel = $e->getViewModel();
     $esiOptions = (array) $viewModel->getOption('esi', []);
     if (isset($esiOptions['ttl'])) {
         $this->setTtl($esiOptions['ttl']);
         $e->stopPropagation();
         return $this;
     }
 }
Ejemplo n.º 14
0
 /**
  * @inheritDoc
  */
 public function determineTtl(MvcEvent $e)
 {
     $policy = $this->varnishOptions->getPolicy();
     if ($policy === VarnishOptions::POLICY_ALLOW) {
         $this->setTtl($this->varnishOptions->getDefaultTtl());
     } else {
         $this->setTtl(0);
     }
     $e->stopPropagation();
     return $this;
 }
Ejemplo n.º 15
0
 /**
  * @inheritDoc
  */
 public function determineTtl(MvcEvent $e)
 {
     $routeMatch = $e->getRouteMatch();
     $routeName = $routeMatch->getMatchedRouteName();
     $cacheableRoutes = $this->varnishOptions->getCacheableRoutes();
     $ttl = $this->getTtlFor($cacheableRoutes, $routeName);
     if (false !== $ttl) {
         $this->setTtl($ttl);
         $e->stopPropagation();
         return $this;
     }
 }
Ejemplo n.º 16
0
 private function controlarAcces(MvcEvent $e)
 {
     if (get_class($e->getTarget()) != 'LlistaCompra\\Controller\\SeguretatController') {
         if (!UsuariConnectat::estaConnectat()) {
             $res = [];
             $res[0] = new RespostaTO();
             $res[0]->resultat = "NC";
             $model = new JsonModel($res);
             $e->setViewModel($model);
             $e->stopPropagation();
             return $model;
         }
     }
 }
Ejemplo n.º 17
0
 /**
  * @inheritDoc
  */
 public function determineTtl(MvcEvent $e)
 {
     $routeMatch = $e->getRouteMatch();
     $controller = $routeMatch->getParam('controller');
     $action = $routeMatch->getParam('action');
     $fullAction = $controller . '::' . $action;
     $cacheableActions = $this->varnishOptions->getCacheableActions();
     $ttl = $this->getTtlFor($cacheableActions, $fullAction);
     if (false !== $ttl) {
         $this->setTtl($ttl);
         $e->stopPropagation();
         return $this;
     }
 }
Ejemplo n.º 18
0
 public function onBootstrap(MvcEvent $e)
 {
     $session = $e->getApplication()->getServiceManager()->get('ZendSession\\Session\\SessionManager');
     try {
         $session->start();
     } catch (\Exception $ex) {
         $e->getApplication()->getEventManager()->attach(MvcEvent::EVENT_ROUTE, function (MvcEvent $e) {
             $e->stopPropagation();
             /** @var SessionManager $session */
             $session = $e->getApplication()->getServiceManager()->get('ZendSession\\Session\\SessionManager');
             $session->expireSessionCookie();
             $response = $e->getResponse();
             $response->getHeaders()->addHeaderLine('Location', $e->getRequest()->getUri());
             $response->setStatusCode(302);
             $response->sendHeaders();
             return $response;
         }, -10000);
     }
     $container = new Container('initialized');
     if (!isset($container->init)) {
         $serviceManager = $e->getApplication()->getServiceManager();
         $request = $serviceManager->get('Request');
         $session->regenerateId(true);
         $container->init = 1;
         $container->remoteAddr = $request->getServer()->get('REMOTE_ADDR');
         $container->httpUserAgent = $request->getServer()->get('HTTP_USER_AGENT');
         $config = $serviceManager->get('Config');
         if (!isset($config['session'])) {
             return;
         }
         $sessionConfig = $config['session'];
         if (isset($sessionConfig['validators'])) {
             $chain = $session->getValidatorChain();
             foreach ($sessionConfig['validators'] as $validator) {
                 switch ($validator) {
                     case 'Zend\\Session\\Validator\\HttpUserAgent':
                         $validator = new $validator($container->httpUserAgent);
                         break;
                     case 'Zend\\Session\\Validator\\RemoteAddr':
                         $validator = new $validator($container->remoteAddr);
                         break;
                     default:
                         $validator = new $validator();
                 }
                 $chain->attach('session.validate', array($validator, 'isValid'));
             }
         }
     }
 }
Ejemplo n.º 19
0
 /**
  * Check the domain is a known domain for the CMS.  If not the primary, it will
  * redirect the user to the primary domain.  Useful for multiple domain sites.
  *
  * @param MvcEvent $event Zend MVC Event
  *
  * @return null|Response
  */
 public function checkDomain(MvcEvent $event)
 {
     /** @var \Zend\Http\PhpEnvironment\Request $request */
     $request = $event->getRequest();
     $serverParam = $request->getServer();
     $currentDomain = $serverParam->get('HTTP_HOST');
     if (empty($currentDomain)) {
         // We are on CLI
         return null;
     }
     if (!$this->currentSite->getSiteId() || $this->currentSite->getStatus() != 'A') {
         if (empty($this->config['Rcm']['defaultDomain']) || $this->config['Rcm']['defaultDomain'] == $this->currentSite->getDomain()->getDomainName()) {
             $response = new Response();
             $response->setStatusCode(404);
             $event->stopPropagation(true);
             return $response;
         }
         $response = new Response();
         $response->setStatusCode(302);
         $response->getHeaders()->addHeaderLine('Location', '//' . $this->config['Rcm']['defaultDomain']);
         $event->stopPropagation(true);
         return $response;
     }
     $primaryCheck = $this->currentSite->getDomain()->getPrimary();
     /**
      * If the IP is not a domain and is not the primary, redirect to primary
      */
     if (!$this->ipValidator->isValid($currentDomain) && !empty($primaryCheck) && $primaryCheck->getDomainName() != $currentDomain) {
         $response = new Response();
         $response->setStatusCode(302);
         $response->getHeaders()->addHeaderLine('Location', '//' . $primaryCheck->getDomainName());
         $event->stopPropagation(true);
         return $response;
     }
     return null;
 }
Ejemplo n.º 20
0
 /**
  * 
  * @param MvcEvent $event
  */
 protected function triggerForbiddenEvent(MvcEvent $event)
 {
     $event->setError('route-forbidden');
     $event->setParam('exception', new UnauthorizedException('You are forbidden!', 403));
     $event->stopPropagation(true);
     if ($this->hasErrorViewModel()) {
         $event->setViewModel($this->errorView);
     }
     $response = $event->getResponse();
     $response->setStatusCode(403);
     $event->setResponse($response);
     $application = $event->getApplication();
     $eventManager = $application->getEventManager();
     $eventManager->trigger(MvcEvent::EVENT_DISPATCH_ERROR, $event);
 }
Ejemplo n.º 21
0
 public function checkAuth(MvcEvent $e)
 {
     /* @var $container ContainerInterface */
     $container = $e->getApplication()->getServiceManager();
     /* @var $navigationViewhelper \Zend\View\Helper\Navigation */
     $navigationViewhelper = $container->get('ViewHelperManager')->get('navigation');
     $acl = $navigationViewhelper->getAcl();
     $role = $navigationViewhelper->getRole();
     if (!$acl->isAllowed($role, $e->getRouteMatch()->getMatchedRouteName())) {
         $e->getApplication()->getEventManager()->attach(MvcEvent::EVENT_DISPATCH, function (MvcEvent $e) {
             $e->stopPropagation();
             $response = $e->getResponse();
             $response->setStatusCode(403);
             $viewModel = new \Zend\View\Model\ViewModel();
             $viewModel->setTemplate('error/403');
             $e->getViewModel()->addChild($viewModel);
         }, 2);
     }
 }
Ejemplo n.º 22
0
 public function getActionCache(MvcEvent $event)
 {
     $match = $event->getRouteMatch();
     if (!$match) {
         return;
     }
     if ($match->getParam('actioncache')) {
         $cache = $event->getApplication()->getServiceManager()->get('text-cache');
         $cacheKey = $this->actionCacheKey($match);
         $data = $cache->getItem($cacheKey);
         if (null !== $data) {
             // When data comes from the cache
             // we don`t want the saveActionCache method to refresh this cache
             $match->setParam('actioncache', false);
             $viewModel = $event->getViewModel();
             $viewModel->setVariable($viewModel->captureTo(), $data);
             $event->stopPropagation(true);
             return $viewModel;
         }
     }
 }
Ejemplo n.º 23
0
 /**
  * Handle rendering errors
  *
  * Rendering errors are usually due to trying to render a template in
  * the PhpRenderer, when we have no templates.
  *
  * As such, report as an unacceptable response.
  *
  * @param  MvcEvent $e
  */
 public function onRenderError(MvcEvent $e)
 {
     $response = $e->getResponse();
     $status = 406;
     $errors = 'Your request could not be resolved to an acceptable
     representation.';
     $exception = $e->getParam('exception');
     if ($exception instanceof \Exception && !$exception instanceof ViewExceptionInterface) {
         $code = $exception->getCode();
         if ($code >= 100 && $code <= 600) {
             $status = $code;
         } else {
             $status = 500;
         }
         $errors = array('code' => $exception->getCode(), 'message' => $exception->getMessage(), 'trace' => $exception->getTraceAsString());
     }
     $payload = array('status' => $status, 'errors' => $errors);
     $response->getHeaders()->addHeaderLine('content-type', 'application/problem+json');
     $response->setStatusCode($status);
     $response->setContent(json_encode($payload));
     $e->stopPropagation();
 }
Ejemplo n.º 24
0
 /**
  * Check if user login
  *
  * @param \Zend\Mvc\MvcEvent $event
  * @return bool
  * @throws \Magento\Framework\Exception\LocalizedException
  */
 public function authPreDispatch($event)
 {
     /** @var RouteMatch $routeMatch */
     $routeMatch = $event->getRouteMatch();
     $controller = $routeMatch->getParam('controller');
     if (!in_array($controller, $this->controllersToSkip)) {
         /** @var Application $application */
         $application = $event->getApplication();
         $serviceManager = $application->getServiceManager();
         if ($serviceManager->get('Magento\\Framework\\App\\DeploymentConfig')->isAvailable()) {
             /** @var \Magento\Setup\Model\ObjectManagerProvider $objectManagerProvider */
             $objectManagerProvider = $serviceManager->get('Magento\\Setup\\Model\\ObjectManagerProvider');
             /** @var \Magento\Framework\ObjectManagerInterface $objectManager */
             $objectManager = $objectManagerProvider->get();
             /** @var \Magento\Framework\App\State $adminAppState */
             $adminAppState = $objectManager->get('Magento\\Framework\\App\\State');
             $adminAppState->setAreaCode(\Magento\Framework\App\Area::AREA_ADMIN);
             /** @var \Magento\Backend\Model\Session\AdminConfig $sessionConfig */
             $sessionConfig = $objectManager->get(\Magento\Backend\Model\Session\AdminConfig::class);
             $cookiePath = $this->getSetupCookiePath($objectManager);
             $sessionConfig->setCookiePath($cookiePath);
             /** @var \Magento\Backend\Model\Auth\Session $adminSession */
             $adminSession = $objectManager->create(\Magento\Backend\Model\Auth\Session::class, ['sessionConfig' => $sessionConfig, 'appState' => $adminAppState]);
             if (!$objectManager->get(\Magento\Backend\Model\Auth::class)->isLoggedIn()) {
                 $adminSession->destroy();
                 $response = $event->getResponse();
                 $baseUrl = Http::getDistroBaseUrlPath($_SERVER);
                 $response->getHeaders()->addHeaderLine('Location', $baseUrl . 'index.php/session/unlogin');
                 $response->setStatusCode(302);
                 $event->stopPropagation();
                 return $response;
             }
         }
     }
     return false;
 }
Ejemplo n.º 25
0
 public function onFinish(MvcEvent $e)
 {
     $e->stopPropagation();
     // Silently fall back to ZF1
     $e->getApplication()->getEventManager()->trigger('zf1');
 }
Ejemplo n.º 26
0
 /**
  * If the action is meant to be cached, stops the propagation, and inject the CacheModel to his parent.
  *
  * @param MvcEvent $e
  * @return mixed
  */
 public function onDispatchPre(MvcEvent $e)
 {
     $key = $this->getKey($e->getRouteMatch());
     if (!array_key_exists($key, $this->config)) {
         return $e;
     }
     $cacheKeyConfig = $this->config[$key];
     $key .= self::KEY_SEPARATOR . CountryResolver::getCountry() . self::KEY_SEPARATOR . $this->getLanguageProvider()->getCurrentLanguage();
     if (isset($cacheKeyConfig['count'])) {
         $key .= self::KEY_SEPARATOR . mt_rand(1, $cacheKeyConfig['count']);
     }
     if (isset($cacheKeyConfig['route_params']) && true === $cacheKeyConfig['route_params']) {
         $routeParams = $e->getRouteMatch()->getParams();
         $key .= self::KEY_SEPARATOR . md5(serialize($routeParams));
     }
     $cache = $this->getCacheService($key, $cacheKeyConfig['ttl']);
     // Custom param set to be caught by the onDispatchPost method
     $e->setParam(self::EVENT_PARAM_KEY, $key);
     // If our cache requirements are met
     if (null !== ($html = $cache->getItem($key))) {
         $result = new CacheModel();
         $result->setContent($html);
         $result->setIsFetchable(true);
         $result->setCacheKey($key);
         $e->setResult($result);
         $e->stopPropagation(true);
         $model = $e->getViewModel();
         $model->addChild($result);
         return $e->getResult();
     }
 }
Ejemplo n.º 27
0
 /**
  * General dispatch listener
  *
  * @param \Zend\Mvc\MvcEvent $event
  */
 public function onDispatch(MvcEvent $event)
 {
     if ($this->response) {
         $event->stopPropagation();
         return $this->response;
     }
     $routeMatch = $event->getRouteMatch();
     $sm = $event->getApplication()->getServiceManager();
     // Set current timezone, when first get
     $sm->get('Timezone');
     if ($routeMatch) {
         $locale = $routeMatch->getParam('locale');
     }
     if (!$locale) {
         $request = $event->getRequest();
         if ($request instanceof HttpRequest) {
             $header = $request->getHeader('Accept-Language');
             if ($header) {
                 $availables = null;
                 $controller = $event->getController();
                 if ($controller instanceof LocaleSelectorInterface) {
                     $availables = $controller->getAvailableLocales();
                 }
                 $locale = $sm->get('Locale')->acceptFromHttp($header->getFieldValue(), $availables);
             }
         }
     }
     if ($locale) {
         $sm->get('Locale')->setCurrent($locale);
     }
 }
Ejemplo n.º 28
-1
    /**
     * @param MvcEvent $e
     * @return void|ViewModel
     */
    public function handleDispatchErrors(MvcEvent $e)
    {
        $exception = $e->getParam('exception');
        $routeMatch = $e->getRouteMatch();
        if (!$routeMatch || $exception instanceof UnauthorizedException) {
            // We don't handle permissions errors or unmatched routes
            return;
        }

        // We will do the final handling here
        $e->stopPropagation();

        if (Console::isConsole()) {
            return;
        }
        $error = $e->getError();
        $model = new ViewModel(
            [
                'message' => 'An error occurred. Good luck!<br/><br/><pre>' . $exception->getMessage() . '</pre>',
                'reason' => $error,
                'exception' => $exception,
            ]
        );
        $model->setTemplate('error/404');
        $e->getViewModel()->addChild($model);

        $response = $e->getResponse();
        $response->setStatusCode(404);

        return $model;
    }
Ejemplo n.º 29
-1
 /**
  * Create an exception view model, and set the HTTP status code
  *
  * @todo   dispatch.error does not halt dispatch unless a response is
  *         returned. As such, we likely need to trigger rendering as a low
  *         priority dispatch.error event (or goto a render event) to ensure
  *         rendering occurs, and that munging of view models occurs when
  *         expected.
  * @param  MvcEvent $e
  * @return void
  */
 public function prepareExceptionViewModel(MvcEvent $e)
 {
     // Do nothing if no error in the event
     $error = $e->getError();
     if (empty($error)) {
         return;
     }
     // Do nothing if the result is a response object
     $result = $e->getResult();
     if ($result instanceof Response) {
         return;
     }
     // Do nothing if there is no exception or the exception is not
     // an UnauthorizedAccessException
     $exception = $e->getParam('exception');
     if (!$exception instanceof UnauthorizedAccessException) {
         return;
     }
     $response = $e->getResponse();
     if (!$response) {
         $response = new Response();
         $e->setResponse($response);
     }
     /*
      * Return an image, if an image was requested.
      */
     if ($exception instanceof UnauthorizedImageAccessException) {
         $image = __DIR__ . '/../../../../../public/images/unauthorized-access.png';
         $response->setStatusCode(403)->setContent(file_get_contents($image))->getHeaders()->addHeaderLine('Content-Type', 'image/png');
         $e->stopPropagation();
         $response->sendHeaders();
         //echo file_get_contents($image);
         //$response->stopped = true;
         return $response;
     }
     $auth = $e->getApplication()->getServiceManager()->get('AuthenticationService');
     if (!$auth->hasIdentity()) {
         $response->setStatusCode(Response::STATUS_CODE_403);
         $routeMatch = $e->getRouteMatch();
         $routeMatch->setParam('controller', 'Auth\\Controller\\Index');
         $routeMatch->setParam('action', 'index');
         $query = $e->getRequest()->getQuery();
         $ref = $e->getRequest()->getRequestUri();
         $ref = preg_replace('~^' . preg_quote($e->getRouter()->getBaseUrl()) . '~', '', $ref);
         $query->set('ref', $ref);
         $query->set('req', 1);
         $result = $e->getApplication()->getEventManager()->trigger('dispatch', $e);
         $e->stopPropagation();
         return $result;
     }
     $message = $exception->getMessage();
     $model = new ViewModel(array('message' => empty($message) ? 'You are not permitted to access this resource.' : $message, 'exception' => $e->getParam('exception'), 'display_exceptions' => $this->displayExceptions()));
     $model->setTemplate($this->getExceptionTemplate());
     $e->setResult($model);
     // $statusCode = $response->getStatusCode();
     // if ($statusCode === 200) {
     $response->setStatusCode(403);
     // }
 }
Ejemplo n.º 30
-1
 public function onBootstrap(MvcEvent $event)
 {
     $eventManager = $event->getApplication()->getEventManager();
     $oauth2Closure = $event->getApplication()->getServiceManager()->get(\ZF\OAuth2\Service\OAuth2Server::class);
     $logger = $event->getApplication()->getServiceManager()->get('logger');
     $eventManager->attach(MvcAuthEvent::EVENT_AUTHENTICATION_POST, function (MvcAuthEvent $event) use($oauth2Closure) {
         // Manipulating Identity Data
         $identity = $event->getIdentity();
         if (!!$identity) {
             if ($identity instanceof AuthenticatedIdentity) {
                 $userData = $oauth2Closure()->getStorage('user_credentials')->getUser($identity->getName());
                 if (is_array($identity->getAuthenticationIdentity())) {
                     $userData = array_merge($userData, $identity->getAuthenticationIdentity());
                 }
                 $identity = new AuthenticatedIdentity($userData);
                 $event->setIdentity($identity);
             }
             //MvcEvent did not understand when manipulated MvcAuthEvent identity
             $event->getMvcEvent()->setParam('ZF\\MvcAuth\\Identity', $identity);
         }
         return $event;
     }, 900);
     $moduleRouteListener = new ModuleRouteListener();
     $moduleRouteListener->attach($eventManager);
     $event->getApplication()->getEventManager()->attach(MvcEvent::EVENT_DISPATCH_ERROR, function (MvcEvent $event) use($logger) {
         $problem = null;
         if ($event->isError()) {
             $exception = $event->getParam("exception");
             // There are some other errors like that :
             // "error-controller-cannot-dispatch",
             // "error-controller-invalid",
             // "error-controller-not-found",
             // "error-router-no-match",
             if ($event->getError() === 'error-controller-not-found') {
                 $problem = new ApiProblem(404, "Endpoint controller not found!");
             } elseif ($event->getError() === 'error-router-no-match') {
                 $problem = new ApiProblem(404, "Not found!");
             } elseif ($exception instanceof \Exception) {
                 $className = explode('\\', get_class($exception));
                 $problem = new ApiProblem($exception->getCode(), end($className) . ' error.');
                 $logger->err($exception->getMessage(), array('controller' => $event->getControllerClass()));
             }
         } else {
             $problem = new ApiProblem(500, "Unknown Error!");
         }
         $response = new ApiProblemResponse($problem);
         $event->stopPropagation();
         return $response;
     }, 9000);
 }