From 41c141e98e987262ad9b89b6cb82581564a6a224 Mon Sep 17 00:00:00 2001 From: Rias Date: Sun, 31 May 2026 21:56:50 +0200 Subject: [PATCH 1/7] Move Laravel auth off of User element into CraftUser interface --- .../_components/fieldtypes/Matrix/block.twig | 4 +- .../widgets/CraftSupport/body.twig | 2 +- .../_includes/forms/autosuggest.twig | 2 +- resources/templates/_includes/forms/text.twig | 2 +- resources/templates/_layouts/base.twig | 6 +- .../_layouts/components/global-sidebar.twig | 2 +- .../_layouts/components/header-photo.twig | 2 +- resources/templates/_layouts/cp.twig | 8 +- resources/templates/users/_index.twig | 2 +- resources/templates/users/_permissions.twig | 7 +- resources/templates/users/_preferences.twig | 22 +-- src/Address/Elements/Address.php | 2 +- src/Address/Policies/AddressPolicy.php | 14 +- src/Announcement/Announcements.php | 4 +- src/Asset/Assets.php | 5 +- src/Asset/Data/Volume.php | 2 +- src/Asset/Elements/Asset.php | 14 +- src/Asset/Policies/AssetPolicy.php | 18 ++- src/Auth/AuthMethods.php | 72 ++++++--- src/Auth/AuthServiceProvider.php | 47 +++--- src/Auth/Concerns/EnforcesPermissions.php | 4 +- src/Auth/Events/ElementAuthorizing.php | 4 +- src/Auth/Events/LoginUserRetrieved.php | 4 +- src/Auth/Events/LoginUserRetrieving.php | 6 +- src/Auth/Passkeys/CredentialRepository.php | 3 +- src/Auth/Passkeys/Passkeys.php | 28 +++- src/Auth/UserProvider.php | 107 ------------- src/Cms.php | 2 +- .../Concerns/MissingComponentTrait.php | 2 +- src/Cp/Alerts.php | 4 +- src/Cp/FormFields.php | 4 +- src/Cp/Html/ElementHtml.php | 2 +- src/Cp/Navigation.php | 2 +- src/Dashboard/Dashboard.php | 19 +-- src/Dashboard/Widgets/CraftSupport.php | 4 +- src/Dashboard/Widgets/MyDrafts.php | 2 +- src/Dashboard/Widgets/QuickPost.php | 2 +- src/Dashboard/Widgets/Updates.php | 4 +- src/Edition.php | 2 +- .../Conditions/HintableConditionRuleTrait.php | 2 +- src/Element/Drafts.php | 7 +- src/Element/ElementActivity.php | 5 +- src/Element/ElementHelper.php | 6 +- src/Element/ElementSources.php | 6 +- src/Element/NestedElementManager.php | 2 +- src/Element/Operations/ElementDuplicates.php | 6 +- src/Element/Operations/ElementWrites.php | 4 +- src/Element/Policies/ElementPolicy.php | 30 ++-- src/Element/Queries/AssetQuery.php | 18 ++- .../Concerns/QueriesDraftsAndRevisions.php | 6 +- src/Element/Queries/EntryQuery.php | 12 +- src/Element/Revisions.php | 2 +- src/Entry/Data/EntryType.php | 4 +- src/Entry/Elements/Entry.php | 33 ++-- src/Entry/Policies/EntryPolicy.php | 42 +++--- src/Field/Addresses.php | 2 +- .../Conditions/FieldConditionRuleTrait.php | 2 +- src/Field/Email.php | 2 +- src/Field/Field.php | 4 +- src/Field/Policies/ContentBlockPolicy.php | 14 +- src/FieldLayout/FieldLayoutComponent.php | 4 +- .../Addresses/CountryCodeField.php | 2 +- .../LayoutElements/Addresses/LatLongField.php | 2 +- .../LayoutElements/CustomField.php | 5 +- .../LayoutElements/FullNameField.php | 2 +- src/FieldLayout/LayoutElements/TextField.php | 2 +- .../LayoutElements/TextareaField.php | 2 +- src/FieldLayout/LayoutElements/TitleField.php | 2 +- .../Users/AffiliatedSiteField.php | 2 +- .../LayoutElements/Users/PhotoField.php | 2 +- .../Controllers/App/CpAlertsController.php | 2 +- .../Assets/ImageEditorController.php | 2 +- .../Controllers/Assets/PreviewController.php | 2 +- .../Controllers/Assets/UploadController.php | 2 +- .../Auth/AuthenticationController.php | 22 +-- src/Http/Controllers/Auth/LoginController.php | 43 ++++-- .../Controllers/Auth/PasskeyController.php | 11 +- .../Auth/SessionInfoController.php | 13 +- .../Auth/SetPasswordController.php | 6 +- .../Auth/VerifyEmailController.php | 2 +- .../Widgets/CraftSupportController.php | 2 +- .../Dashboard/WidgetsController.php | 8 +- .../Elements/Concerns/SavesElement.php | 3 +- .../Elements/CreateElementController.php | 2 +- .../Elements/EditElementController.php | 4 +- .../Elements/ElementActivityController.php | 9 +- .../Elements/ElementDraftsController.php | 14 +- .../ElementIndex/ElementIndexController.php | 2 +- .../Elements/ElementRevisionsController.php | 2 +- .../Elements/SaveElementController.php | 2 +- .../Entries/CreateEntryController.php | 11 +- .../Entries/MoveEntryToSectionController.php | 2 +- .../Entries/StoreEntryController.php | 22 ++- src/Http/Controllers/Gql/ApiController.php | 2 +- src/Http/Controllers/MatrixController.php | 2 +- .../PluginStore/PluginStoreController.php | 2 +- src/Http/Controllers/PreviewController.php | 2 +- .../Settings/EmailSettingsController.php | 3 +- .../Controllers/Updates/UpdaterController.php | 2 +- .../Controllers/Updates/UpdatesController.php | 4 +- .../Controllers/Users/ActivateController.php | 4 +- .../Controllers/Users/AddressesController.php | 7 +- src/Http/Controllers/Users/EditUserTrait.php | 40 ++++- .../Users/ImpersonationController.php | 17 ++- .../Controllers/Users/PasskeysController.php | 35 ++++- .../Controllers/Users/PasswordController.php | 15 +- .../Users/PermissionsController.php | 24 ++- .../Controllers/Users/PhotoController.php | 2 +- .../Users/PreferencesController.php | 14 +- .../Users/RecoveryCodesController.php | 13 +- .../Controllers/Users/SaveUserController.php | 7 +- .../Controllers/Users/SuspendController.php | 4 +- .../Controllers/Users/UnlockController.php | 2 +- .../Controllers/Users/UsersController.php | 4 +- src/Http/Middleware/AddLogContext.php | 2 +- src/Http/Middleware/EnforceLicenses.php | 2 +- src/Http/Middleware/HandleInertiaRequests.php | 3 +- src/Http/Middleware/RequireAdmin.php | 2 +- src/Http/Mixins/RequestMixin.php | 24 +++ src/Http/Requests/ElementRequest.php | 14 +- src/Http/Responses/ElementResponse.php | 4 +- src/Providers/AppServiceProvider.php | 15 ++ src/Section/Data/Section.php | 2 +- src/Section/Sections.php | 2 +- src/Site/Sites.php | 2 +- src/Support/DateTimeHelper.php | 2 +- src/Support/Facades/Users.php | 6 +- src/Translation/I18N.php | 7 +- src/Twig/Extensions/CoreTwigExtension.php | 12 +- .../Actions/GetImpersonationUrlAction.php | 2 +- src/User/Actions/SuspendUsers.php | 9 +- src/User/Actions/UnsuspendUsers.php | 7 +- src/User/Concerns/CraftUserTrait.php | 94 ++++++++++++ src/User/Contracts/CraftUser.php | 22 +++ src/User/Data/UserGroup.php | 4 +- src/User/Elements/User.php | 142 ++++-------------- src/User/Models/User.php | 117 +++++++++------ .../Notifications/ActivationNotification.php | 6 +- .../ResetPasswordNotification.php | 6 +- .../Notifications/VerifyEmailNotification.php | 6 +- src/User/Policies/UserPolicy.php | 44 ++++-- src/User/UserGroups.php | 4 +- src/User/UserPermissions.php | 4 +- src/User/Users.php | 26 ++-- src/Utility/Utilities.php | 2 +- src/View/LegacyAssets/CpAsset.php | 4 +- src/View/TemplateGlobals.php | 4 +- src/View/TemplateProfiler.php | 4 +- src/helpers.php | 12 ++ .../Asset/Policies/AssetPolicyTest.php | 2 +- tests/Feature/Auth/AuthCraftUserMacroTest.php | 68 +++++++++ tests/Feature/Auth/UserProviderTest.php | 137 ----------------- tests/Feature/Dashboard/DashboardTest.php | 4 +- .../Element/Policies/ElementPolicyTest.php | 54 +++---- .../Field/Policies/ContentBlockPolicyTest.php | 14 +- .../AnnouncementsControllerTest.php | 2 +- .../Controllers/Auth/LoginControllerTest.php | 40 +++++ .../Elements/ElementDraftsControllerTest.php | 11 +- .../Entries/StoreEntryControllerTest.php | 2 +- .../PluginStore/PluginStoreControllerTest.php | 2 +- .../User/AddressesControllerTest.php | 2 +- .../User/PasswordControllerTest.php | 8 +- .../User/PermissionsControllerTest.php | 10 +- .../User/PreferencesControllerTest.php | 16 +- .../User/RecoveryCodesControllerTest.php | 2 +- .../PublicRegistrationTest.php | 2 +- .../Http/Middleware/EnforceLicensesTest.php | 7 +- .../Http/Requests/ElementRequestTest.php | 6 +- .../Twig/Tags/RequireLoginGuestTagTest.php | 4 +- .../User/Actions/SuspendUsersActionTest.php | 2 +- .../User/Actions/UnsuspendUsersActionTest.php | 2 +- tests/Feature/User/PasswordResetTest.php | 2 +- .../Feature/User/Policies/UserPolicyTest.php | 83 +++++----- .../Address/Policies/AddressPolicyTest.php | 9 +- tests/Unit/Asset/AssetsHelperTest.php | 4 + tests/Unit/CmsTest.php | 41 +---- tests/Unit/Cp/NavigationTest.php | 29 +--- tests/Unit/Entry/Policies/EntryPolicyTest.php | 2 +- tests/Unit/Http/RequestMixinTest.php | 60 ++++++++ yii2-adapter/src/Mixins/UserMixin.php | 2 +- 180 files changed, 1272 insertions(+), 1044 deletions(-) delete mode 100644 src/Auth/UserProvider.php create mode 100644 src/User/Concerns/CraftUserTrait.php create mode 100644 src/User/Contracts/CraftUser.php create mode 100644 tests/Feature/Auth/AuthCraftUserMacroTest.php delete mode 100644 tests/Feature/Auth/UserProviderTest.php diff --git a/resources/templates/_components/fieldtypes/Matrix/block.twig b/resources/templates/_components/fieldtypes/Matrix/block.twig index caebb4dc1d6..9f7a726f831 100644 --- a/resources/templates/_components/fieldtypes/Matrix/block.twig +++ b/resources/templates/_components/fieldtypes/Matrix/block.twig @@ -72,7 +72,7 @@ ]) %} {% endif %} -{% if entry.id or (Auth.user.admin and config('craft.general.allowAdminChanges')) %} +{% if entry.id or (currentUser.admin and config('craft.general.allowAdminChanges')) %} {% set actionMenuItems = actionMenuItems|push({hr: true}) %} {% if entry.id and not static %} @@ -84,7 +84,7 @@ }) %} {% endif %} - {% if Auth.user.admin and config('craft.general.allowAdminChanges') %} + {% if currentUser.admin and config('craft.general.allowAdminChanges') %} {% set actionMenuItems = actionMenuItems|push({ icon: 'gear', label: 'Entry type settings'|t('app'), diff --git a/resources/templates/_components/widgets/CraftSupport/body.twig b/resources/templates/_components/widgets/CraftSupport/body.twig index 723af6848cd..66e9d165c88 100644 --- a/resources/templates/_components/widgets/CraftSupport/body.twig +++ b/resources/templates/_components/widgets/CraftSupport/body.twig @@ -101,7 +101,7 @@ {{ hiddenInput('widgetId', widget.id) }} {{ hiddenInput('message', '', {class: 'cs-support-message'}) }} - {% set email = Auth.user.email %} + {% set email = currentUser.email %} {% if email in ['support@pixelandtonic.com', 'support@craftcms.com'] %} {% set email = '' %} {% endif %} diff --git a/resources/templates/_includes/forms/autosuggest.twig b/resources/templates/_includes/forms/autosuggest.twig index 97d1cc52f4d..50c78298a32 100644 --- a/resources/templates/_includes/forms/autosuggest.twig +++ b/resources/templates/_includes/forms/autosuggest.twig @@ -77,7 +77,7 @@ new Vue({ name: (name ?? '')|namespaceInputName, size: size ?? '', maxlength: maxlength ?? '', - autofocus: (autofocus ?? false) and Auth.user and Auth.user.getAutofocusPreferred() and not Request.isMobileBrowser(true), + autofocus: (autofocus ?? false) and currentUser and currentUser.getAutofocusPreferred() and not Request.isMobileBrowser(true), disabled: disabled ?? false, title: title ?? '', placeholder: placeholder ?? '', diff --git a/resources/templates/_includes/forms/text.twig b/resources/templates/_includes/forms/text.twig index f534191119c..7b8e86671f6 100644 --- a/resources/templates/_includes/forms/text.twig +++ b/resources/templates/_includes/forms/text.twig @@ -23,7 +23,7 @@ name: name ?? false, value: value ?? false, maxlength: maxlength ?? false, - autofocus: (autofocus ?? false) and Auth.user and Auth.user.getAutofocusPreferred() and not Request.isMobileBrowser(true), + autofocus: (autofocus ?? false) and currentUser and currentUser.getAutofocusPreferred() and not Request.isMobileBrowser(true), autocomplete: autocomplete is boolean ? (autocomplete ? 'on' : 'off') : autocomplete, autocorrect: (autocorrect ?? true) ? false : 'off', autocapitalize: (autocapitalize ?? true) ? false : 'none', diff --git a/resources/templates/_layouts/base.twig b/resources/templates/_layouts/base.twig index 8277d12543d..4fa74360c2c 100644 --- a/resources/templates/_layouts/base.twig +++ b/resources/templates/_layouts/base.twig @@ -6,9 +6,9 @@ {% set bodyClass = (bodyClass ?? [])|explodeClass|merge([ orientation, - (Auth.user.getPreference('useShapes') ?? a11yDefaults['useShapes'] ?? false) ? 'use-shapes', - (Auth.user.getPreference('underlineLinks') ?? a11yDefaults['underlineLinks'] ?? false) ? 'underline-links', - "notifications--#{Auth.user.getPreference('notificationPosition') ?? a11yDefaults['notificationPosition'] ?? 'end-start'}", + (currentUser.getPreference('useShapes') ?? a11yDefaults['useShapes'] ?? false) ? 'use-shapes', + (currentUser.getPreference('underlineLinks') ?? a11yDefaults['underlineLinks'] ?? false) ? 'underline-links', + "notifications--#{currentUser.getPreference('notificationPosition') ?? a11yDefaults['notificationPosition'] ?? 'end-start'}", requestedSite ? "site--#{requestedSite.handle}", 'cp-legacy-reset', 'cp-legacy' diff --git a/resources/templates/_layouts/components/global-sidebar.twig b/resources/templates/_layouts/components/global-sidebar.twig index 669ae6ff92a..71effd7eee1 100644 --- a/resources/templates/_layouts/components/global-sidebar.twig +++ b/resources/templates/_layouts/components/global-sidebar.twig @@ -87,7 +87,7 @@ } %} - {% if Auth.user.admin and devMode %} + {% if currentUser.admin and devMode %} {% set devModeText = 'Craft CMS is running in Dev Mode.'|t('app') %}
{% tag 'span' with { diff --git a/resources/templates/_layouts/components/header-photo.twig b/resources/templates/_layouts/components/header-photo.twig index bb7d0207323..c0439702216 100644 --- a/resources/templates/_layouts/components/header-photo.twig +++ b/resources/templates/_layouts/components/header-photo.twig @@ -1,3 +1,3 @@
- {{ Auth.user.getThumbHtml(30)|raw }} + {{ currentUser.getThumbHtml(30)|raw }}
diff --git a/resources/templates/_layouts/cp.twig b/resources/templates/_layouts/cp.twig index dfc2b2db945..fdb3e0cf551 100644 --- a/resources/templates/_layouts/cp.twig +++ b/resources/templates/_layouts/cp.twig @@ -164,13 +164,13 @@ history.replaceState(undefined, undefined, window.location.href.match(/^[^#]*/)[