/** * Test the not found exception rendering */ public function testNotFoundException() { // GIVEN // mock exception $exception = $this->getMock('\\Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException'); $exception->expects($this->any())->method('getStatusCode')->will($this->returnValue(404)); $event = $this->getMockEvent($exception); // mock an error page $page = $this->getMock('Sonata\\PageBundle\\Model\\PageInterface'); // mock cms manager to return the mock error page and set it as current page $this->cmsManager = $this->getMock('Sonata\\PageBundle\\CmsManager\\CmsManagerInterface'); $this->cmsManager->expects($this->once())->method('getPageByRouteName')->with($this->anything(), $this->equalTo('route_404'))->will($this->returnValue($page)); $this->cmsManager->expects($this->once())->method('setCurrentPage')->with($this->equalTo($page)); $this->cmsSelector->expects($this->any())->method('retrieve')->will($this->returnValue($this->cmsManager)); // mocked site selector should return a site $this->siteSelector->expects($this->any())->method('retrieve')->will($this->returnValue($this->getMock('Sonata\\PageBundle\\Model\\SiteInterface'))); // mocked decorator strategy should allow decorate $this->decoratorStrategy->expects($this->any())->method('isRouteNameDecorable')->will($this->returnValue(true)); $this->decoratorStrategy->expects($this->any())->method('isRouteUriDecorable')->will($this->returnValue(true)); // mocked page service manager should execute the page and return a response $response = $this->getMock('Symfony\\Component\\HttpFoundation\\Response'); $this->pageServiceManager->expects($this->once())->method('execute')->with($this->equalTo($page))->will($this->returnValue($response)); // WHEN $this->listener->onKernelException($event); // THEN // mock asserts }
/** * Handles a kernel exception. * * @param GetResponseForExceptionEvent $event * * @throws \Exception */ public function onKernelException(GetResponseForExceptionEvent $event) { if ($this->tokenStorage && $this->tokenStorage->getToken() && !$this->tokenStorage->getToken() instanceof \Symfony\Component\Security\Core\Authentication\Token\AnonymousToken && $this->tokenStorage->getToken()->getProviderKey() && $this->tokenStorage->getToken()->getProviderKey() === 'admin' && ($event->getException() instanceof AccessDeniedHttpException || $event->getException() instanceof AccessDeniedException)) { $this->handleAccessDeniedError($event); } parent::onKernelException($event); }
/** * Updates site page routes with all routes available in Symfony router service * * @param SiteInterface $site A page bundle site instance * @param OutputInterface $output A Symfony console output * * @return void */ public function update(SiteInterface $site, OutputInterface $output = null) { $message = sprintf(" > <info>Updating core routes for site</info> : <comment>%s - %s</comment>", $site->getName(), $site->getUrl()); $this->writeln($output, array(str_repeat('=', strlen($message)), "", $message, "", str_repeat('=', strlen($message)))); $knowRoutes = array(); $root = $this->pageManager->getPageByUrl($site, '/'); // no root url for the given website, create one if (!$root) { $root = $this->pageManager->create(array('routeName' => PageInterface::PAGE_ROUTE_CMS_NAME, 'name' => 'Homepage', 'url' => '/', 'site' => $site, 'requestMethod' => isset($requirements['_method']) ? $requirements['_method'] : 'GET|POST|HEAD|DELETE|PUT', 'slug' => '/')); $this->pageManager->save($root); } // Iterate over declared routes from the routing mechanism foreach ($this->router->getRouteCollection()->all() as $name => $route) { $name = trim($name); $knowRoutes[] = $name; $page = $this->pageManager->findOneBy(array('routeName' => $name, 'site' => $site->getId())); $routeHostRegex = $route->compile()->getHostRegex(); if (!$this->decoratorStrategy->isRouteNameDecorable($name) || !$this->decoratorStrategy->isRouteUriDecorable($route->getPath()) || null !== $routeHostRegex && !preg_match($routeHostRegex, $site->getHost())) { if ($page) { $page->setEnabled(false); $this->writeln($output, sprintf(' <error>DISABLE</error> <error>% -50s</error> %s', $name, $route->getPath())); } else { continue; } } $update = true; if (!$page) { $update = false; $requirements = $route->getRequirements(); $page = $this->pageManager->create(array('routeName' => $name, 'name' => $name, 'url' => $route->getPath(), 'site' => $site, 'requestMethod' => isset($requirements['_method']) ? $requirements['_method'] : 'GET|POST|HEAD|DELETE|PUT')); } if (!$page->getParent() && $page->getId() != $root->getId()) { $page->setParent($root); } $page->setSlug($route->getPath()); $page->setUrl($route->getPath()); $page->setRequestMethod(isset($requirements['_method']) ? $requirements['_method'] : 'GET|POST|HEAD|DELETE|PUT'); $this->pageManager->save($page); $this->writeln($output, sprintf(' <info>%s</info> % -50s %s', $update ? 'UPDATE ' : 'CREATE ', $name, $route->getPath())); } // Iterate over error pages foreach ($this->exceptionListener->getHttpErrorCodes() as $name) { $name = trim($name); $knowRoutes[] = $name; $page = $this->pageManager->findOneBy(array('routeName' => $name, 'site' => $site->getId())); if (!$page) { $params = array('routeName' => $name, 'name' => $name, 'decorate' => false, 'site' => $site); $page = $this->pageManager->create($params); $this->writeln($output, sprintf(' <info>%s</info> % -50s %s', 'CREATE ', $name, '')); } // an internal page or an error page should not have any parent (no direct access) $page->setParent(null); $this->pageManager->save($page); } $has = false; foreach ($this->pageManager->getHybridPages($site) as $page) { if (!$page->isHybrid() || $page->isInternal()) { continue; } if (!in_array($page->getRouteName(), $knowRoutes)) { if (!$has) { $has = true; $this->writeln($output, array('', 'Some hybrid pages does not exist anymore', str_repeat('-', 80))); } $this->writeln($output, sprintf(' <error>ERROR</error> %s', $page->getRouteName())); } } if ($has) { $this->writeln($output, <<<MSG <error> *WARNING* : Pages has been updated however some pages do not exist anymore. You must remove them manually. </error> MSG ); } }