diff --git a/phpstan-baseline.php b/phpstan-baseline.php index 8f7fd4fac..1cf96992f 100644 --- a/phpstan-baseline.php +++ b/phpstan-baseline.php @@ -331,6 +331,12 @@ 'count' => 1, 'path' => __DIR__ . '/tests/Controllers/ActionsTest.php', ]; +$ignoreErrors[] = [ + 'rawMessage' => 'Call to method setCookie() of internal class CodeIgniter\\Superglobals from outside its root namespace CodeIgniter.', + 'identifier' => 'method.internalClass', + 'count' => 1, + 'path' => __DIR__ . '/tests/Controllers/LoginTest.php', +]; $ignoreErrors[] = [ 'rawMessage' => 'Call to method setServer() of internal class CodeIgniter\\Superglobals from outside its root namespace CodeIgniter.', 'identifier' => 'method.internalClass', diff --git a/src/Controllers/LoginController.php b/src/Controllers/LoginController.php index 8c07f8b75..4d42b74c6 100644 --- a/src/Controllers/LoginController.php +++ b/src/Controllers/LoginController.php @@ -31,7 +31,7 @@ class LoginController extends BaseController public function loginView() { if (auth()->loggedIn()) { - return redirect()->to(config('Auth')->loginRedirect()); + return redirect()->to(config('Auth')->loginRedirect())->withCookies(); } /** @var Session $authenticator */ diff --git a/tests/Controllers/LoginTest.php b/tests/Controllers/LoginTest.php index 09de25823..bc0851406 100644 --- a/tests/Controllers/LoginTest.php +++ b/tests/Controllers/LoginTest.php @@ -17,6 +17,7 @@ use CodeIgniter\I18n\Time; use CodeIgniter\Shield\Authentication\Actions\Email2FA; use CodeIgniter\Shield\Config\Auth; +use CodeIgniter\Shield\Models\RememberModel; use CodeIgniter\Shield\Models\UserIdentityModel; use CodeIgniter\Test\FeatureTestTrait; use CodeIgniter\Test\TestResponse; @@ -169,6 +170,35 @@ public function testAfterLoggedInNotDisplayLoginPage(): void $result->assertRedirectTo(config('Auth')->loginRedirect()); } + public function testAfterLoggedInWithRememberCookieReturnsRefreshedCookie(): void + { + $this->user->createEmailIdentity([ + 'email' => 'foo@example.com', + 'password' => 'secret123', + ]); + + $selector = 'selector'; + $validator = 'validator'; + $expires = Time::now() + ->addSeconds(setting('Auth.sessionConfig')['rememberLength']) + ->format('Y-m-d H:i:s'); + + model(RememberModel::class)->rememberUser( + $this->user, + $selector, + hash('sha256', $validator), + $expires, + ); + + $cookieName = setting('Auth.sessionConfig')['rememberCookieName']; + service('superglobals')->setCookie($cookieName, $selector . ':' . $validator); + + $result = $this->get('/login'); + + $result->assertRedirectTo(config('Auth')->loginRedirect()); + $result->assertCookie($cookieName); + } + public function testLoginActionUsernameSuccess(): void { Time::setTestNow('March 10, 2017', 'UTC');