Merge pull request #1925 from wallabag/fix-redirect-without-referer

Redirect to homepage if referer is null
This commit is contained in:
Nicolas Lœuillet 2016-04-15 17:52:33 +02:00
commit d1f4996b77
5 changed files with 111 additions and 4 deletions

View File

@ -344,7 +344,9 @@ class EntryController extends Controller
$message $message
); );
return $this->redirect($request->headers->get('referer')); $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer'));
return $this->redirect($redirectUrl);
} }
/** /**
@ -374,7 +376,9 @@ class EntryController extends Controller
$message $message
); );
return $this->redirect($request->headers->get('referer')); $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer'));
return $this->redirect($redirectUrl);
} }
/** /**
@ -408,7 +412,11 @@ class EntryController extends Controller
); );
// don't redirect user to the deleted entry // don't redirect user to the deleted entry
return $this->redirect($url !== $request->headers->get('referer') ? $request->headers->get('referer') : $this->generateUrl('homepage')); $to = ($url !== $request->headers->get('referer') ? $request->headers->get('referer') : null);
$redirectUrl = $this->get('wallabag_core.helper.redirect')->to($to);
return $this->redirect($redirectUrl);
} }
/** /**

View File

@ -65,7 +65,9 @@ class TagController extends Controller
} }
$em->flush(); $em->flush();
return $this->redirect($request->headers->get('referer')); $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer'));
return $this->redirect($redirectUrl);
} }
/** /**

View File

@ -0,0 +1,37 @@
<?php
namespace Wallabag\CoreBundle\Helper;
use Symfony\Component\Routing\Router;
/**
* Manage redirections to avoid redirecting to empty routes.
*/
class Redirect
{
private $router;
public function __construct(Router $router)
{
$this->router = $router;
}
/**
* @param string $url URL to redirect
* @param string $fallback Fallback URL if $url is null
*
* @return string
*/
public function to($url, $fallback = '')
{
if (null !== $url) {
return $url;
}
if ('' === $fallback) {
return $this->router->generate('homepage');
}
return $fallback;
}
}

View File

@ -114,3 +114,8 @@ services:
class: Wallabag\CoreBundle\Operator\Doctrine\Matches class: Wallabag\CoreBundle\Operator\Doctrine\Matches
tags: tags:
- { name: rulerz.operator, executor: rulerz.executor.doctrine, operator: matches, inline: true } - { name: rulerz.operator, executor: rulerz.executor.doctrine, operator: matches, inline: true }
wallabag_core.helper.redirect:
class: Wallabag\CoreBundle\Helper\Redirect
arguments:
- "@router"

View File

@ -0,0 +1,55 @@
<?php
namespace Wallabag\CoreBundle\Tests\Helper;
use Wallabag\CoreBundle\Helper\Redirect;
class RedirectTest extends \PHPUnit_Framework_TestCase
{
/** @var \PHPUnit_Framework_MockObject_MockObject */
private $routerMock;
/** @var Redirect */
private $redirect;
public function setUp()
{
$this->routerMock = $this->getRouterMock();
$this->redirect = new Redirect($this->routerMock);
}
public function testRedirectToNullWithFallback()
{
$redirectUrl = $this->redirect->to(null, 'fallback');
$this->assertEquals('fallback', $redirectUrl);
}
public function testRedirectToNullWithoutFallback()
{
$redirectUrl = $this->redirect->to(null);
$this->assertEquals($this->routerMock->generate('homepage'), $redirectUrl);
}
public function testRedirectToValidUrl()
{
$redirectUrl = $this->redirect->to('/unread/list');
$this->assertEquals('/unread/list', $redirectUrl);
}
private function getRouterMock()
{
$mock = $this->getMockBuilder('Symfony\Component\Routing\Router')
->disableOriginalConstructor()
->getMock();
$mock->expects($this->any())
->method('generate')
->with('homepage')
->willReturn('homepage');
return $mock;
}
}