Skip to content

Commit 6703724

Browse files
authored
Merge pull request #3316 from tangix/bugfix-filter
Pass filter arguments to after() and before() methods
2 parents 38b2e34 + 374ddf3 commit 6703724

File tree

17 files changed

+135
-29
lines changed

17 files changed

+135
-29
lines changed

system/Filters/CSRF.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
*/
5858
class CSRF implements FilterInterface
5959
{
60+
6061
/**
6162
* Do whatever processing this filter needs to do.
6263
* By default it should not return anything during
@@ -68,11 +69,12 @@ class CSRF implements FilterInterface
6869
* redirects, etc.
6970
*
7071
* @param RequestInterface|\CodeIgniter\HTTP\IncomingRequest $request
72+
* @param array|null $arguments
7173
*
7274
* @return mixed
7375
* @throws \CodeIgniter\Security\Exceptions\SecurityException
7476
*/
75-
public function before(RequestInterface $request)
77+
public function before(RequestInterface $request, $arguments = null)
7678
{
7779
if ($request->isCLI())
7880
{
@@ -103,10 +105,11 @@ public function before(RequestInterface $request)
103105
*
104106
* @param RequestInterface|\CodeIgniter\HTTP\IncomingRequest $request
105107
* @param ResponseInterface|\CodeIgniter\HTTP\Response $response
108+
* @param array|null $arguments
106109
*
107110
* @return mixed
108111
*/
109-
public function after(RequestInterface $request, ResponseInterface $response)
112+
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
110113
{
111114
}
112115

system/Filters/DebugToolbar.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,16 @@
4848
*/
4949
class DebugToolbar implements FilterInterface
5050
{
51+
5152
/**
5253
* We don't need to do anything here.
5354
*
5455
* @param RequestInterface|\CodeIgniter\HTTP\IncomingRequest $request
56+
* @param array|null $arguments
5557
*
5658
* @return void
5759
*/
58-
public function before(RequestInterface $request)
60+
public function before(RequestInterface $request, $arguments = null)
5961
{
6062
}
6163

@@ -67,10 +69,11 @@ public function before(RequestInterface $request)
6769
*
6870
* @param RequestInterface|\CodeIgniter\HTTP\IncomingRequest $request
6971
* @param ResponseInterface|\CodeIgniter\HTTP\Response $response
72+
* @param array|null $arguments
7073
*
7174
* @return void
7275
*/
73-
public function after(RequestInterface $request, ResponseInterface $response)
76+
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
7477
{
7578
Services::toolbar()->prepare($request, $response);
7679
}

system/Filters/FilterInterface.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,11 @@ interface FilterInterface
5959
* redirects, etc.
6060
*
6161
* @param \CodeIgniter\HTTP\RequestInterface $request
62+
* @param null $arguments
6263
*
6364
* @return mixed
6465
*/
65-
public function before(RequestInterface $request);
66+
public function before(RequestInterface $request, $arguments = null);
6667

6768
//--------------------------------------------------------------------
6869

@@ -74,10 +75,11 @@ public function before(RequestInterface $request);
7475
*
7576
* @param \CodeIgniter\HTTP\RequestInterface $request
7677
* @param \CodeIgniter\HTTP\ResponseInterface $response
78+
* @param null $arguments
7779
*
7880
* @return mixed
7981
*/
80-
public function after(RequestInterface $request, ResponseInterface $response);
82+
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null);
8183

8284
//--------------------------------------------------------------------
8385
}

system/Filters/Filters.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ public function run(string $uri, string $position = 'before')
196196
}
197197
elseif ($position === 'after')
198198
{
199-
$result = $class->after($this->request, $this->response);
199+
$result = $class->after($this->request, $this->response, $this->arguments[$alias] ?? null);
200200

201201
if ($result instanceof ResponseInterface)
202202
{

system/Filters/Honeypot.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ class Honeypot implements FilterInterface
5555
* then the requester is a bot
5656
*
5757
* @param \CodeIgniter\HTTP\RequestInterface $request
58+
* @param array|null $arguments
5859
*
5960
* @return void
60-
* @throws \CodeIgniter\Honeypot\Exceptions\HoneypotException
6161
*/
62-
public function before(RequestInterface $request)
62+
public function before(RequestInterface $request, $arguments = null)
6363
{
6464
$honeypot = Services::honeypot(new \Config\Honeypot());
6565
if ($honeypot->hasContent($request))
@@ -73,10 +73,11 @@ public function before(RequestInterface $request)
7373
*
7474
* @param \CodeIgniter\HTTP\RequestInterface $request
7575
* @param \CodeIgniter\HTTP\ResponseInterface $response
76+
* @param array|null $arguments
7677
*
7778
* @return void
7879
*/
79-
public function after(RequestInterface $request, ResponseInterface $response)
80+
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
8081
{
8182
$honeypot = Services::honeypot(new \Config\Honeypot());
8283
$honeypot->attachHoneypot($response);

tests/system/Filters/FiltersTest.php

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
require_once __DIR__ . '/fixtures/InvalidClass.php';
1313
require_once __DIR__ . '/fixtures/Multiple1.php';
1414
require_once __DIR__ . '/fixtures/Multiple2.php';
15+
require_once __DIR__ . '/fixtures/Role.php';
1516

1617
/**
1718
* @backupGlobals enabled
@@ -25,6 +26,7 @@ class FiltersTest extends \CodeIgniter\Test\CIUnitTestCase
2526
protected function setUp(): void
2627
{
2728
parent::setUp();
29+
Services::reset();
2830

2931
$this->request = Services::request();
3032
$this->response = Services::response();
@@ -623,17 +625,54 @@ public function testEnableFilterWithArguments()
623625
],
624626
];
625627

626-
$filters = new Filters((object) $config, $this->request, $this->response);
628+
$filters = new Filters((object)$config, $this->request, $this->response);
627629

628630
$filters = $filters->initialize('admin/foo/bar');
629631

630632
$filters->enableFilter('role:admin , super', 'before');
633+
$filters->enableFilter('role:admin , super', 'after');
631634

632635
$found = $filters->getFilters();
633636

634637
$this->assertTrue(in_array('role', $found['before']));
635638
$this->assertEquals(['admin', 'super'], $filters->getArguments('role'));
636639
$this->assertEquals(['role' => ['admin', 'super']], $filters->getArguments());
640+
641+
$response = $filters->run('admin/foo/bar', 'before');
642+
$this->assertEquals('admin;super', $response);
643+
644+
$response = $filters->run('admin/foo/bar', 'after');
645+
$this->assertEquals('admin;super', $response->getBody());
646+
}
647+
648+
public function testEnableFilterWithNoArguments()
649+
{
650+
$_SERVER['REQUEST_METHOD'] = 'GET';
651+
652+
$config = [
653+
'aliases' => ['role' => 'CodeIgniter\Filters\fixtures\Role'],
654+
'globals' => [
655+
'before' => [],
656+
'after' => [],
657+
],
658+
];
659+
660+
$filters = new Filters((object)$config, $this->request, $this->response);
661+
662+
$filters = $filters->initialize('admin/foo/bar');
663+
664+
$filters->enableFilter('role', 'before');
665+
$filters->enableFilter('role', 'after');
666+
667+
$found = $filters->getFilters();
668+
669+
$this->assertTrue(in_array('role', $found['before']));
670+
671+
$response = $filters->run('admin/foo/bar', 'before');
672+
$this->assertEquals('Is null', $response);
673+
674+
$response = $filters->run('admin/foo/bar', 'after');
675+
$this->assertEquals('Is null', $response->getBody());
637676
}
638677

639678
public function testEnableNonFilter()

tests/system/Filters/fixtures/GoogleCurious.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
class GoogleCurious implements FilterInterface
88
{
99

10-
public function before(RequestInterface $request)
10+
public function before(RequestInterface $request, $arguments = null)
1111
{
1212
return 'This is curious';
1313
}
1414

15-
public function after(RequestInterface $request, ResponseInterface $response)
15+
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
1616
{
1717
}
1818

tests/system/Filters/fixtures/GoogleEmpty.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
class GoogleEmpty implements FilterInterface
88
{
99

10-
public function before(RequestInterface $request)
10+
public function before(RequestInterface $request, $arguments = null)
1111
{
1212
$request = '';
1313
return $request;
1414
}
1515

16-
public function after(RequestInterface $request, ResponseInterface $response)
16+
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
1717
{
1818
}
1919

tests/system/Filters/fixtures/GoogleMe.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
class GoogleMe implements FilterInterface
88
{
9-
public function before(RequestInterface $request)
9+
public function before(RequestInterface $request, $arguments = null)
1010
{
1111
$request->url = 'http://google.com';
1212

@@ -15,7 +15,7 @@ public function before(RequestInterface $request)
1515

1616
//--------------------------------------------------------------------
1717

18-
public function after(RequestInterface $request, ResponseInterface $response)
18+
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
1919
{
2020
$response->csp = 'http://google.com';
2121

tests/system/Filters/fixtures/GoogleYou.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
class GoogleYou implements FilterInterface
99
{
1010

11-
public function before(RequestInterface $request)
11+
public function before(RequestInterface $request, $arguments = null)
1212
{
1313
$response = Services::response();
1414
$response->csp = 'http://google.com';
1515
return $response;
1616
}
1717

18-
public function after(RequestInterface $request, ResponseInterface $response)
18+
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
1919
{
2020
}
2121

0 commit comments

Comments
 (0)