Skip to content

Commit 0e317a5

Browse files
committed
Remembered username
1 parent 781fbfd commit 0e317a5

11 files changed

Lines changed: 75 additions & 64 deletions

File tree

resources/templates/_special/login.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
{% set staticEmail = staticEmail ?? null %}
66

77
{% set generalConfig = app.config.craft.general %}
8-
{% set username = staticEmail ?? (generalConfig.rememberUsernameDuration ? craft.app.user.getRememberedUsername(): '') %}
8+
{% set username = staticEmail ?? (generalConfig.rememberUsernameDuration ? rememberedUsername : '') %}
99

1010
{% if generalConfig.useEmailAsUsername %}
1111
{% set usernameLabel = 'Email'|t('app') %}

src/Auth/AuthServiceProvider.php

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ final class AuthServiceProvider extends ServiceProvider
3030
{
3131
#[Override]
3232
public function register(): void
33+
{
34+
$this->registerRedirects();
35+
$this->registerGuard();
36+
$this->registerPermissions();
37+
$this->registerEvents();
38+
}
39+
40+
private function registerRedirects(): void
3341
{
3442
Authenticate::redirectUsing(function (Request $request) {
3543
if ($request->isCpRequest()) {
@@ -40,7 +48,10 @@ public function register(): void
4048
});
4149

4250
RedirectIfAuthenticated::redirectUsing(fn (Request $request) => $request->user()->getDefaultReturnUrl());
51+
}
4352

53+
private function registerGuard(): void
54+
{
4455
Auth::provider('craft', fn (Application $app) => new UserProvider($app->make(Hasher::class)));
4556

4657
if (! Config::has('auth.guards.craft')) {
@@ -57,7 +68,10 @@ public function register(): void
5768
'model' => User::class,
5869
]);
5970
}
71+
}
6072

73+
private function registerPermissions(): void
74+
{
6175
/**
6276
* This hooks our permission system into
6377
* Laravel's Gate authorization system
@@ -92,14 +106,19 @@ public function register(): void
92106

93107
return true;
94108
});
109+
}
95110

111+
private function registerEvents(): void
112+
{
96113
Event::listen(Login::class, function (Login $event) {
97114
if (! $event->user instanceof User) {
98115
return;
99116
}
100117

101118
Users::handleValidLogin($event->user);
102119

120+
RememberedUsername::set($event->user);
121+
103122
Session::passwordConfirmed();
104123
});
105124

@@ -111,7 +130,7 @@ public function register(): void
111130
Users::handleInvalidLogin($event->user);
112131
});
113132

114-
Event::listen(Logout::class, function (Logout $event) {
133+
Event::listen(Logout::class, function () {
115134
app(Impersonation::class)->setImpersonatorId(null);
116135
});
117136
}

src/Auth/RememberedUsername.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CraftCms\Cms\Auth;
6+
7+
use CraftCms\Cms\Cms;
8+
use CraftCms\Cms\User\Elements\User;
9+
use Illuminate\Support\Facades\Cookie;
10+
11+
final readonly class RememberedUsername
12+
{
13+
public static function get(): ?string
14+
{
15+
return Cookie::get(Cookie::craftPrefix().'_username');
16+
}
17+
18+
public static function set(User $user): void
19+
{
20+
$prefix = Cookie::craftPrefix();
21+
22+
if (Cms::config()->rememberUsernameDuration === 0) {
23+
Cookie::forget("{$prefix}_username");
24+
25+
return;
26+
}
27+
28+
Cookie::queue(
29+
name: "{$prefix}_username",
30+
value: $user->username,
31+
minutes: floor(Cms::config()->rememberUsernameDuration / 60),
32+
);
33+
}
34+
}

src/Auth/SessionAuth.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
namespace CraftCms\Cms\Auth;
66

7-
use CraftCms\Cms\Cms;
87
use Illuminate\Support\Facades\Cache;
8+
use Illuminate\Support\Facades\Cookie;
99
use Illuminate\Support\Facades\Session;
1010

1111
final class SessionAuth
@@ -70,8 +70,6 @@ public static function checkAuthorization(string $action): bool
7070

7171
private static function authAccessParam(): string
7272
{
73-
$prefix = md5('CraftSession'.Cms::envId());
74-
75-
return $prefix.self::$authAccessParam;
73+
return Cookie::craftPrefix().self::$authAccessParam;
7674
}
7775
}

src/Providers/AppServiceProvider.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use CraftCms\Cms\Support\Facades\Updates;
1717
use GuzzleHttp\Utils;
1818
use Illuminate\Contracts\Config\Repository as ConfigRepository;
19+
use Illuminate\Cookie\CookieJar;
1920
use Illuminate\Foundation\Application;
2021
use Illuminate\Foundation\Console\AboutCommand;
2122
use Illuminate\Foundation\Events\LocaleUpdated;
@@ -131,6 +132,8 @@ private function registerMacros(): void
131132
return $this;
132133
});
133134

135+
CookieJar::macro('craftPrefix', fn (): string => md5('CraftSession'.Cms::envId()));
136+
134137
Request::macro('isCpRequest', fn (): bool => $this->is(
135138
Cms::config()->cpTrigger, // /admin
136139
Cms::config()->cpTrigger.'/*' // /admin/foo

yii2-adapter/legacy/controllers/UsersController.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
use CraftCms\Cms\Auth\Events\LoginUserRetrieved;
3636
use CraftCms\Cms\Auth\Events\RetrievingLoginUser;
3737
use CraftCms\Cms\Auth\Impersonation;
38+
use CraftCms\Cms\Auth\RememberedUsername;
3839
use CraftCms\Cms\Cms;
3940
use CraftCms\Cms\Edition;
4041
use CraftCms\Cms\Element\Exceptions\InvalidElementException;
@@ -420,7 +421,7 @@ public function actionSetPassword(): Response
420421
/** @var string $code */
421422
[$user, $uid, $code] = $info;
422423

423-
Craft::$app->getUser()->sendUsernameCookie($user);
424+
RememberedUsername::set($user);
424425

425426
// Send them to the set password template.
426427
return $this->_renderSetPasswordTemplate([
@@ -521,7 +522,7 @@ public function actionVerifyEmail(): Response
521522
/** @var string $code */
522523
[$user, $uid, $code] = $info;
523524

524-
Craft::$app->getUser()->sendUsernameCookie($user);
525+
RememberedUsername::set($user);
525526

526527
// Send them to the set verify-email template
527528
return $this->_rerouteWithFallbackTemplate('verify-email.twig', [
@@ -891,7 +892,7 @@ public function actionSaveUser(): ?Response
891892
/** @noinspection PhpUndefinedVariableInspection */
892893
if ($isCurrentUser && $user->username !== $oldUsername) {
893894
// Update the username cookie
894-
$userSession->sendUsernameCookie($user);
895+
RememberedUsername::set($user);
895896
}
896897

897898
// Save the user’s photo, if it was submitted

yii2-adapter/legacy/helpers/App.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
use CraftCms\Cms\Translation\Locale;
3838
use CraftCms\Cms\User\Elements\User;
3939
use CraftCms\Yii2Adapter\Cache;
40+
use Illuminate\Support\Facades\Cookie;
4041
use yii\base\Event;
4142
use yii\base\Exception;
4243
use yii\base\InvalidArgumentException;
@@ -817,16 +818,14 @@ public static function userConfig(): array
817818
$loginUrl = UrlHelper::cpUrl(Request::CP_PATH_LOGIN);
818819
}
819820

820-
$stateKeyPrefix = md5('Craft.' . WebUser::class . '.' . Craft::$app->getEnvId());
821-
822821
return [
823822
'class' => WebUser::class,
824823
'identityClass' => User::class,
825824
'enableAutoLogin' => true,
826825
'autoRenewCookie' => true,
827826
'loginUrl' => $loginUrl,
828827
'authTimeout' => $generalConfig->userSessionDuration ?: null,
829-
'usernameCookie' => Craft::cookieConfig(['name' => $stateKeyPrefix . '_username']),
828+
'usernameCookie' => Craft::cookieConfig(['name' => Cookie::craftPrefix() . '_username']),
830829
];
831830
}
832831

yii2-adapter/legacy/web/Controller.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,7 @@ public function requireLogin(): void
473473
* Redirects the user to the account template if they are logged in.
474474
*
475475
* @since 3.4.0
476+
* @deprecated 6.0.0 use the "guest" middleware instead.
476477
*/
477478
public function requireGuest(): void
478479
{

yii2-adapter/legacy/web/User.php

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use craft\helpers\UrlHelper;
1414
use CraftCms\Cms\Auth\Concerns\ConfirmsPasswords;
1515
use CraftCms\Cms\Auth\Impersonation;
16+
use CraftCms\Cms\Auth\RememberedUsername;
1617
use CraftCms\Cms\Cms;
1718
use CraftCms\Cms\Support\Config;
1819
use CraftCms\Cms\Support\Facades\Users;
@@ -85,17 +86,7 @@ public function loginByUserId(int $userId, int $duration = 0): bool
8586
*/
8687
public function sendUsernameCookie(UserElement $user): void
8788
{
88-
$generalConfig = Cms::config();
89-
90-
if ($generalConfig->rememberUsernameDuration !== 0) {
91-
$cookie = new Cookie($this->usernameCookie);
92-
$cookie->value = $user->username;
93-
$seconds = Config::durationInSeconds($generalConfig->rememberUsernameDuration);
94-
$cookie->expire = DateTimeHelper::currentTimeStamp() + $seconds;
95-
Craft::$app->getResponse()->getCookies()->add($cookie);
96-
} else {
97-
Craft::$app->getResponse()->getCookies()->remove(new Cookie($this->usernameCookie));
98-
}
89+
RememberedUsername::set($user);
9990
}
10091

10192
/**
@@ -180,10 +171,11 @@ public function getToken(): ?string
180171
* ```
181172
*
182173
* @return string|null
174+
* @deprecated 6.0.0 use {@see \Illuminate\Support\Facades\Cookie::getRememberedUsername()} instead.
183175
*/
184176
public function getRememberedUsername(): ?string
185177
{
186-
return Craft::$app->getRequest()->getCookies()->getValue($this->usernameCookie['name']);
178+
return RememberedUsername::get();
187179
}
188180

189181
/**
@@ -219,6 +211,7 @@ public function getIsGuest(): bool
219211
* @return Response the redirection response
220212
* @throws ForbiddenHttpException if the request doesn’t accept a redirect response
221213
* @since 3.4.0
214+
* @deprecated 6.0.0 use the "guest" middleware instead.
222215
*/
223216
public function guestRequired(): Response
224217
{
@@ -382,7 +375,7 @@ protected function afterLogin($identity, $cookieBased, $duration): void
382375
// Save the username cookie if they're not being impersonated
383376
$impersonator = app(Impersonation::class)->getImpersonator();
384377
if (!$impersonator) {
385-
$this->sendUsernameCookie(UserElement::find()->id($identity->getId())->firstOrFail());
378+
RememberedUsername::set(UserElement::find()->id($identity->getId())->firstOrFail());
386379
}
387380

388381
// Update the user record

yii2-adapter/legacy/web/twig/Extension.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
use craft\web\twig\variables\CraftVariable;
5555
use craft\web\View;
5656
use CraftCms\Cms\Address\Addresses;
57+
use CraftCms\Cms\Auth\RememberedUsername;
5758
use CraftCms\Cms\Cms;
5859
use CraftCms\Cms\Database\Queries\AddressQuery;
5960
use CraftCms\Cms\Database\Queries\AssetQuery;
@@ -1845,6 +1846,7 @@ public function getGlobals(): array
18451846
'pluginAssets' => app(Plugins::class)->getAssetsHtml(),
18461847
'currentSite' => $currentSite,
18471848
'currentUser' => $currentUser,
1849+
'rememberedUsername' => RememberedUsername::get(),
18481850
'primarySite' => $primarySite,
18491851
'siteName' => $siteName,
18501852
'siteUrl' => $siteUrl,

0 commit comments

Comments
 (0)