Skip to content

Commit c0d360d

Browse files
committed
Update CsrfComponent to use immutable methods.
Use immutable methods in CsrfComponent. This requires changing some protected method return values, but that is within our BC guidelines.
1 parent a48e948 commit c0d360d

File tree

2 files changed

+16
-11
lines changed

2 files changed

+16
-11
lines changed

src/Controller/Component/CsrfComponent.php

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,20 +86,24 @@ public function startup(Event $event)
8686

8787
$cookieData = $request->getCookie($cookieName);
8888
if ($cookieData) {
89-
$request->params['_csrfToken'] = $cookieData;
89+
$request = $request->withParam('_csrfToken', $cookieData);
9090
}
9191

9292
if ($request->is('requested')) {
93+
$controller->request = $request;
94+
9395
return;
9496
}
9597

9698
if ($request->is('get') && $cookieData === null) {
97-
$this->_setCookie($request, $response);
99+
list($request, $response) = $this->_setCookie($request, $response);
100+
$controller->response = $response;
98101
}
99102
if ($request->is(['put', 'post', 'delete', 'patch']) || $request->getData()) {
100103
$this->_validateToken($request);
101-
unset($request->data[$this->_config['field']]);
104+
$request = $request->withoutData($this->_config['field']);
102105
}
106+
$controller->request = $request;
103107
}
104108

105109
/**
@@ -122,22 +126,23 @@ public function implementedEvents()
122126
*
123127
* @param \Cake\Http\ServerRequest $request The request object.
124128
* @param \Cake\Http\Response $response The response object.
125-
* @return void
129+
* @return array An array of the modified request, response.
126130
*/
127131
protected function _setCookie(ServerRequest $request, Response $response)
128132
{
129133
$expiry = new Time($this->_config['expiry']);
130134
$value = hash('sha512', Security::randomBytes(16), false);
131135

132-
$request->params['_csrfToken'] = $value;
133-
$response->cookie([
134-
'name' => $this->_config['cookieName'],
136+
$request = $request->withParam('_csrfToken', $value);
137+
$response = $response->withCookie($this->_config['cookieName'], [
135138
'value' => $value,
136139
'expire' => $expiry->format('U'),
137140
'path' => $request->getAttribute('webroot'),
138141
'secure' => $this->_config['secure'],
139142
'httpOnly' => $this->_config['httpOnly'],
140143
]);
144+
145+
return [$request, $response];
141146
}
142147

143148
/**

tests/TestCase/Controller/Component/CsrfComponentTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,13 @@ public function testSettingCookie()
7575
$event = new Event('Controller.startup', $controller);
7676
$this->component->startup($event);
7777

78-
$cookie = $controller->response->cookie('csrfToken');
78+
$cookie = $controller->response->getCookie('csrfToken');
7979
$this->assertNotEmpty($cookie, 'Should set a token.');
8080
$this->assertRegExp('/^[a-f0-9]+$/', $cookie['value'], 'Should look like a hash.');
8181
$this->assertEquals(0, $cookie['expire'], 'session duration.');
8282
$this->assertEquals('/dir/', $cookie['path'], 'session path.');
8383

84-
$this->assertEquals($cookie['value'], $controller->request->params['_csrfToken']);
84+
$this->assertEquals($cookie['value'], $controller->request->getParam('_csrfToken'));
8585
}
8686

8787
/**
@@ -343,8 +343,8 @@ public function testConfigurationCookieCreate()
343343
$event = new Event('Controller.startup', $controller);
344344
$component->startup($event);
345345

346-
$this->assertEmpty($controller->response->cookie('csrfToken'));
347-
$cookie = $controller->response->cookie('token');
346+
$this->assertEmpty($controller->response->getCookie('csrfToken'));
347+
$cookie = $controller->response->getCookie('token');
348348
$this->assertNotEmpty($cookie, 'Should set a token.');
349349
$this->assertRegExp('/^[a-f0-9]+$/', $cookie['value'], 'Should look like a hash.');
350350
$this->assertWithinRange((new Time('+1 hour'))->format('U'), $cookie['expire'], 1, 'session duration.');

0 commit comments

Comments
 (0)