Skip to content

Commit fda98d0

Browse files
fix: Remember-me token refresh fails in loginView() - missing withCookies() on redirect (#1306)
* Bug: Remember-me token refresh fails in loginView() - missing ->withCookies() on redirect #1305 * test: cover remember-me cookie refresh redirect --------- Co-authored-by: michalsn <michal@sniatala.pl>
1 parent 3b43b3b commit fda98d0

3 files changed

Lines changed: 37 additions & 1 deletion

File tree

phpstan-baseline.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,12 @@
331331
'count' => 1,
332332
'path' => __DIR__ . '/tests/Controllers/ActionsTest.php',
333333
];
334+
$ignoreErrors[] = [
335+
'rawMessage' => 'Call to method setCookie() of internal class CodeIgniter\\Superglobals from outside its root namespace CodeIgniter.',
336+
'identifier' => 'method.internalClass',
337+
'count' => 1,
338+
'path' => __DIR__ . '/tests/Controllers/LoginTest.php',
339+
];
334340
$ignoreErrors[] = [
335341
'rawMessage' => 'Call to method setServer() of internal class CodeIgniter\\Superglobals from outside its root namespace CodeIgniter.',
336342
'identifier' => 'method.internalClass',

src/Controllers/LoginController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class LoginController extends BaseController
3131
public function loginView()
3232
{
3333
if (auth()->loggedIn()) {
34-
return redirect()->to(config('Auth')->loginRedirect());
34+
return redirect()->to(config('Auth')->loginRedirect())->withCookies();
3535
}
3636

3737
/** @var Session $authenticator */

tests/Controllers/LoginTest.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use CodeIgniter\I18n\Time;
1818
use CodeIgniter\Shield\Authentication\Actions\Email2FA;
1919
use CodeIgniter\Shield\Config\Auth;
20+
use CodeIgniter\Shield\Models\RememberModel;
2021
use CodeIgniter\Shield\Models\UserIdentityModel;
2122
use CodeIgniter\Test\FeatureTestTrait;
2223
use CodeIgniter\Test\TestResponse;
@@ -169,6 +170,35 @@ public function testAfterLoggedInNotDisplayLoginPage(): void
169170
$result->assertRedirectTo(config('Auth')->loginRedirect());
170171
}
171172

173+
public function testAfterLoggedInWithRememberCookieReturnsRefreshedCookie(): void
174+
{
175+
$this->user->createEmailIdentity([
176+
'email' => 'foo@example.com',
177+
'password' => 'secret123',
178+
]);
179+
180+
$selector = 'selector';
181+
$validator = 'validator';
182+
$expires = Time::now()
183+
->addSeconds(setting('Auth.sessionConfig')['rememberLength'])
184+
->format('Y-m-d H:i:s');
185+
186+
model(RememberModel::class)->rememberUser(
187+
$this->user,
188+
$selector,
189+
hash('sha256', $validator),
190+
$expires,
191+
);
192+
193+
$cookieName = setting('Auth.sessionConfig')['rememberCookieName'];
194+
service('superglobals')->setCookie($cookieName, $selector . ':' . $validator);
195+
196+
$result = $this->get('/login');
197+
198+
$result->assertRedirectTo(config('Auth')->loginRedirect());
199+
$result->assertCookie($cookieName);
200+
}
201+
172202
public function testLoginActionUsernameSuccess(): void
173203
{
174204
Time::setTestNow('March 10, 2017', 'UTC');

0 commit comments

Comments
 (0)