diff --git a/core/modules/ban/src/BanMiddleware.php b/core/modules/ban/src/BanMiddleware.php index 53778e0..d7f450d 100644 --- a/core/modules/ban/src/BanMiddleware.php +++ b/core/modules/ban/src/BanMiddleware.php @@ -12,9 +12,11 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\HttpKernelInterface; +/** + * Provides a HTTP middleware to implement IP based banning. + */ class BanMiddleware implements HttpKernelInterface { - /** * The decorated kernel. * @@ -30,7 +32,7 @@ class BanMiddleware implements HttpKernelInterface { protected $banIpManager; /** - * Constructs a ReverseProxyMiddleware object. + * Constructs a BanMiddleware object. * * @param \Symfony\Component\HttpKernel\HttpKernelInterface $http_kernel * The decorated kernel. @@ -48,7 +50,7 @@ public function __construct(HttpKernelInterface $http_kernel, BanIpManagerInterf public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = TRUE) { $ip = $request->getClientIp(); if ($this->banIpManager->isBanned($ip)) { - $response = new Response('Sorry, ' . String::checkPlain($ip) . ' has been banned.', 403); + $response = new Response(String::format('Sorry @ip has been banned', ['@ip' => $ip]), 403); return $response; } return $this->httpKernel->handle($request, $type, $catch); diff --git a/core/modules/ban/src/Tests/BanMiddlewareTest.php b/core/modules/ban/src/Tests/BanMiddlewareTest.php index 881e4a5..5ad7125 100644 --- a/core/modules/ban/src/Tests/BanMiddlewareTest.php +++ b/core/modules/ban/src/Tests/BanMiddlewareTest.php @@ -7,7 +7,93 @@ namespace Drupal\ban\Tests; -class BanMiddlewareTest { +use Drupal\ban\BanMiddleware; +use Drupal\Tests\UnitTestCase; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\HttpKernelInterface; -} +/** + * @coversDefaultClass \Drupal\ban\BanMiddleware + * @group ban + */ +class BanMiddlewareTest extends UnitTestCase { + + /** + * The mocked wrapped kernel. + * + * @var \Symfony\Component\HttpKernel\HttpKernelInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $kernel; + + /** + * The mocked ban IP manager. + * + * @var \Drupal\ban\BanIpManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $banManager; + + /** + * The tested ban middleware. + * + * @var \Drupal\ban\BanMiddleware + */ + protected $banMiddleware; + + /** + * {@inheritdoc} + */ + protected function setUp() { + parent::setUp(); + + $this->kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface'); + $this->banManager = $this->getMock('Drupal\ban\BanIpManagerInterface'); + $this->banMiddleware = new BanMiddleware($this->kernel, $this->banManager); + } + + /** + * Tests a banned IP. + */ + public function testBannedIp() { + $banned_ip = '17.0.0.2'; + $this->banManager->expects($this->once()) + ->method('isBanned') + ->with($banned_ip) + ->willReturn(TRUE); + + $this->kernel->expects($this->never()) + ->method('handle'); + $request = Request::create('/test-path'); + $request->server->set('REMOTE_ADDR', $banned_ip); + $response = $this->banMiddleware->handle($request); + + + $this->assertEquals(403, $response->getStatusCode()); + } + + /** + * Tests an unbanned IP. + */ + public function testUnbannedIp() { + $unbanned_ip = '18.0.0.2'; + $this->banManager->expects($this->once()) + ->method('isBanned') + ->with($unbanned_ip) + ->willReturn(FALSE); + + + $request = Request::create('/test-path'); + $request->server->set('REMOTE_ADDR', $unbanned_ip); + $expected_response = new Response(200); + $this->kernel->expects($this->once()) + ->method('handle') + ->with($request, HttpKernelInterface::MASTER_REQUEST, TRUE) + ->willReturn($expected_response); + + $response = $this->banMiddleware->handle($request); + + $this->assertSame($expected_response, $response); + } + +}