@strapi/admin 5.50.0 → 5.50.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/admin/src/components/ConfirmDialog.js +2 -2
- package/dist/admin/admin/src/components/ConfirmDialog.js.map +1 -1
- package/dist/admin/admin/src/components/ContentBox.js +3 -3
- package/dist/admin/admin/src/components/ContentBox.js.map +1 -1
- package/dist/admin/admin/src/components/DescriptionComponentRenderer.js +8 -8
- package/dist/admin/admin/src/components/DescriptionComponentRenderer.js.map +1 -1
- package/dist/admin/admin/src/components/DescriptionComponentRenderer.mjs +8 -8
- package/dist/admin/admin/src/components/DescriptionComponentRenderer.mjs.map +1 -1
- package/dist/admin/admin/src/components/ErrorElement.js +4 -4
- package/dist/admin/admin/src/components/ErrorElement.js.map +1 -1
- package/dist/admin/admin/src/components/Form.js +41 -27
- package/dist/admin/admin/src/components/Form.js.map +1 -1
- package/dist/admin/admin/src/components/Form.mjs +41 -27
- package/dist/admin/admin/src/components/Form.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Date.js +1 -1
- package/dist/admin/admin/src/components/FormInputs/Date.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Date.mjs +1 -1
- package/dist/admin/admin/src/components/FormInputs/Date.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Email.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Email.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.js +4 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs +4 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Json.js +2 -1
- package/dist/admin/admin/src/components/FormInputs/Json.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Json.mjs +2 -1
- package/dist/admin/admin/src/components/FormInputs/Json.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Password.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Password.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Renderer.js +18 -26
- package/dist/admin/admin/src/components/FormInputs/Renderer.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Renderer.mjs +20 -28
- package/dist/admin/admin/src/components/FormInputs/Renderer.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/String.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/String.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Textarea.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Textarea.mjs.map +1 -1
- package/dist/admin/admin/src/components/GapDropZone.js +2 -2
- package/dist/admin/admin/src/components/GapDropZone.js.map +1 -1
- package/dist/admin/admin/src/components/GradientBadge.js +3 -3
- package/dist/admin/admin/src/components/GradientBadge.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Overview.js +8 -8
- package/dist/admin/admin/src/components/GuidedTour/Overview.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js +4 -4
- package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Steps/Step.mjs.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Tours.js +2 -2
- package/dist/admin/admin/src/components/GuidedTour/Tours.js.map +1 -1
- package/dist/admin/admin/src/components/Layouts/ActionLayout.js +2 -2
- package/dist/admin/admin/src/components/Layouts/ActionLayout.js.map +1 -1
- package/dist/admin/admin/src/components/Layouts/GridLayout.js +2 -2
- package/dist/admin/admin/src/components/Layouts/GridLayout.js.map +1 -1
- package/dist/admin/admin/src/components/Layouts/Layout.js +4 -4
- package/dist/admin/admin/src/components/Layouts/Layout.js.map +1 -1
- package/dist/admin/admin/src/components/LeftMenu.js +3 -3
- package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/MainNav.js +2 -2
- package/dist/admin/admin/src/components/MainNav/MainNav.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/MainNavLinks.js +4 -4
- package/dist/admin/admin/src/components/MainNav/MainNavLinks.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/NavBrand.js +2 -2
- package/dist/admin/admin/src/components/MainNav/NavBrand.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.js +3 -3
- package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/NavLink.js +8 -8
- package/dist/admin/admin/src/components/MainNav/NavLink.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/NavUser.js +7 -7
- package/dist/admin/admin/src/components/MainNav/NavUser.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/TrialCountdown.js +3 -3
- package/dist/admin/admin/src/components/MainNav/TrialCountdown.js.map +1 -1
- package/dist/admin/admin/src/components/NpsSurvey.js +2 -2
- package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
- package/dist/admin/admin/src/components/ResizeIndicator.js +6 -6
- package/dist/admin/admin/src/components/ResizeIndicator.js.map +1 -1
- package/dist/admin/admin/src/components/SubNav.js +11 -9
- package/dist/admin/admin/src/components/SubNav.js.map +1 -1
- package/dist/admin/admin/src/components/SubNav.mjs +4 -2
- package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
- package/dist/admin/admin/src/components/Table.js +9 -5
- package/dist/admin/admin/src/components/Table.js.map +1 -1
- package/dist/admin/admin/src/components/Table.mjs +6 -2
- package/dist/admin/admin/src/components/Table.mjs.map +1 -1
- package/dist/admin/admin/src/components/Theme.js +2 -2
- package/dist/admin/admin/src/components/Theme.js.map +1 -1
- package/dist/admin/admin/src/components/UnauthenticatedLogo.js +2 -2
- package/dist/admin/admin/src/components/UnauthenticatedLogo.js.map +1 -1
- package/dist/admin/admin/src/components/UpsellBanner.js +3 -3
- package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
- package/dist/admin/admin/src/components/WidgetRoot.js +4 -7
- package/dist/admin/admin/src/components/WidgetRoot.js.map +1 -1
- package/dist/admin/admin/src/components/WidgetRoot.mjs +1 -1
- package/dist/admin/admin/src/components/WidgetRoot.mjs.map +1 -1
- package/dist/admin/admin/src/components/Widgets.js +5 -5
- package/dist/admin/admin/src/components/Widgets.js.map +1 -1
- package/dist/admin/admin/src/core/apis/Plugin.js.map +1 -1
- package/dist/admin/admin/src/core/apis/Plugin.mjs.map +1 -1
- package/dist/admin/admin/src/core/apis/Widgets.js +1 -1
- package/dist/admin/admin/src/core/apis/Widgets.js.map +1 -1
- package/dist/admin/admin/src/core/apis/Widgets.mjs +1 -1
- package/dist/admin/admin/src/core/apis/Widgets.mjs.map +1 -1
- package/dist/admin/admin/src/core/store/configure.js.map +1 -1
- package/dist/admin/admin/src/core/store/configure.mjs.map +1 -1
- package/dist/admin/admin/src/core/utils/createHook.js.map +1 -1
- package/dist/admin/admin/src/core/utils/createHook.mjs.map +1 -1
- package/dist/admin/admin/src/features/Tracking.js +3 -1
- package/dist/admin/admin/src/features/Tracking.js.map +1 -1
- package/dist/admin/admin/src/features/Tracking.mjs +3 -1
- package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
- package/dist/admin/admin/src/features/Widgets.js.map +1 -1
- package/dist/admin/admin/src/features/Widgets.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useMediaQuery.js +4 -4
- package/dist/admin/admin/src/hooks/useMediaQuery.js.map +1 -1
- package/dist/admin/admin/src/hooks/useMenu.js +5 -3
- package/dist/admin/admin/src/hooks/useMenu.js.map +1 -1
- package/dist/admin/admin/src/hooks/useMenu.mjs +5 -3
- package/dist/admin/admin/src/hooks/useMenu.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useQueryParams.js.map +1 -1
- package/dist/admin/admin/src/hooks/useQueryParams.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useThrottledCallback.js.map +1 -1
- package/dist/admin/admin/src/hooks/useThrottledCallback.mjs.map +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
- package/dist/admin/admin/src/layouts/UnauthenticatedLayout.js +3 -3
- package/dist/admin/admin/src/layouts/UnauthenticatedLayout.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Register.js +17 -9
- package/dist/admin/admin/src/pages/Auth/components/Register.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Register.mjs +15 -7
- package/dist/admin/admin/src/pages/Auth/components/Register.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Home/HomePage.js +2 -2
- package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.js +3 -6
- package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.mjs +1 -1
- package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js +4 -8
- package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.js +4 -8
- package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.mjs +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +2 -2
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js +2 -2
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js +2 -2
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js +2 -2
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js +2 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js +4 -4
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/reducer.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/reducer.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +0 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +0 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js +2 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js +2 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapseLabel.js +2 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapseLabel.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js +10 -10
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsButton.js +3 -3
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsButton.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js +5 -5
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/HiddenAction.js +2 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/HiddenAction.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js +3 -3
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createArrayOfValues.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createArrayOfValues.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/SelectRoles.js +3 -3
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/SelectRoles.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.js +2 -2
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js +2 -2
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.mjs.map +1 -1
- package/dist/admin/admin/src/translations/ja.json.js +693 -687
- package/dist/admin/admin/src/translations/ja.json.js.map +1 -1
- package/dist/admin/admin/src/translations/ja.json.mjs +693 -687
- package/dist/admin/admin/src/translations/ja.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/pl.json.js +22 -0
- package/dist/admin/admin/src/translations/pl.json.js.map +1 -1
- package/dist/admin/admin/src/translations/pl.json.mjs +22 -0
- package/dist/admin/admin/src/translations/pl.json.mjs.map +1 -1
- package/dist/admin/admin/src/utils/arrays.js.map +1 -1
- package/dist/admin/admin/src/utils/arrays.mjs.map +1 -1
- package/dist/admin/admin/src/utils/baseQuery.js +1 -1
- package/dist/admin/admin/src/utils/baseQuery.js.map +1 -1
- package/dist/admin/admin/src/utils/baseQuery.mjs +1 -1
- package/dist/admin/admin/src/utils/baseQuery.mjs.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
- package/dist/admin/admin/src/utils/objects.js +43 -11
- package/dist/admin/admin/src/utils/objects.js.map +1 -1
- package/dist/admin/admin/src/utils/objects.mjs +43 -11
- package/dist/admin/admin/src/utils/objects.mjs.map +1 -1
- package/dist/admin/admin/src/utils/once.js.map +1 -1
- package/dist/admin/admin/src/utils/once.mjs.map +1 -1
- package/dist/admin/admin/src/utils/rulesEngine.js +2 -1
- package/dist/admin/admin/src/utils/rulesEngine.js.map +1 -1
- package/dist/admin/admin/src/utils/rulesEngine.mjs +2 -1
- package/dist/admin/admin/src/utils/rulesEngine.mjs.map +1 -1
- package/dist/admin/admin/src/utils/shims.js.map +1 -1
- package/dist/admin/admin/src/utils/shims.mjs.map +1 -1
- package/dist/admin/admin/src/utils/widgetVisibility.js +16 -1
- package/dist/admin/admin/src/utils/widgetVisibility.js.map +1 -1
- package/dist/admin/admin/src/utils/widgetVisibility.mjs +14 -2
- package/dist/admin/admin/src/utils/widgetVisibility.mjs.map +1 -1
- package/dist/admin/ee/admin/src/components/AuditLogs/Widgets.js +2 -2
- package/dist/admin/ee/admin/src/components/AuditLogs/Widgets.js.map +1 -1
- package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.js +2 -2
- package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.js.map +1 -1
- package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.mjs +2 -2
- package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthPage/components/Login.js +2 -2
- package/dist/admin/ee/admin/src/pages/AuthPage/components/Login.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthPage/components/Providers.js +2 -2
- package/dist/admin/ee/admin/src/pages/AuthPage/components/Providers.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthPage/components/SSOProviders.js +3 -3
- package/dist/admin/ee/admin/src/pages/AuthPage/components/SSOProviders.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +3 -3
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ComboboxFilter.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ComboboxFilter.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/Modal.js +2 -2
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/Modal.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs.map +1 -1
- package/dist/admin/src/StrapiApp.d.ts +2 -2
- package/dist/admin/src/components/DescriptionComponentRenderer.d.ts +2 -1
- package/dist/admin/src/components/Form.d.ts +14 -12
- package/dist/admin/src/components/FormInputs/Renderer.d.ts +1 -1
- package/dist/admin/src/components/GuidedTour/Steps/Step.d.ts +1 -1
- package/dist/admin/src/components/SubNav.d.ts +1 -1
- package/dist/admin/src/components/Table.d.ts +3 -2
- package/dist/admin/src/core/apis/Plugin.d.ts +1 -1
- package/dist/admin/src/core/utils/createHook.d.ts +6 -6
- package/dist/admin/src/hooks/useAdminRoles.d.ts +1 -1
- package/dist/admin/src/hooks/useMenu.d.ts +1 -1
- package/dist/admin/src/hooks/useQueryParams.d.ts +2 -1
- package/dist/admin/src/hooks/useThrottledCallback.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/reducer.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Roles/utils/createArrayOfValues.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +4 -4
- package/dist/admin/src/services/admin.d.ts +6 -6
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/apiTokens.d.ts +2 -2
- package/dist/admin/src/services/auth.d.ts +12 -12
- package/dist/admin/src/services/contentApi.d.ts +1 -1
- package/dist/admin/src/services/contentManager.d.ts +1 -1
- package/dist/admin/src/services/homepage.d.ts +3 -3
- package/dist/admin/src/services/transferTokens.d.ts +1 -1
- package/dist/admin/src/services/users.d.ts +8 -8
- package/dist/admin/src/services/webhooks.d.ts +2 -2
- package/dist/admin/src/utils/arrays.d.ts +1 -1
- package/dist/admin/src/utils/baseQuery.d.ts +1 -1
- package/dist/admin/src/utils/getFetchClient.d.ts +7 -7
- package/dist/admin/src/utils/objects.d.ts +6 -4
- package/dist/admin/src/utils/once.d.ts +1 -1
- package/dist/admin/src/utils/widgetVisibility.d.ts +11 -0
- package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/tableHeaders.d.ts +2 -1
- package/dist/ee/admin/src/services/ai.d.ts +3 -3
- package/dist/ee/admin/src/services/auditLogs.d.ts +1 -1
- package/dist/server/server/src/services/permission/sections-builder/handlers.js +9 -2
- package/dist/server/server/src/services/permission/sections-builder/handlers.js.map +1 -1
- package/dist/server/server/src/services/permission/sections-builder/handlers.mjs +9 -2
- package/dist/server/server/src/services/permission/sections-builder/handlers.mjs.map +1 -1
- package/dist/server/server/src/services/role.js +5 -1
- package/dist/server/server/src/services/role.js.map +1 -1
- package/dist/server/server/src/services/role.mjs +5 -1
- package/dist/server/server/src/services/role.mjs.map +1 -1
- package/dist/server/server/src/validation/common-validators.js +19 -11
- package/dist/server/server/src/validation/common-validators.js.map +1 -1
- package/dist/server/server/src/validation/common-validators.mjs +19 -11
- package/dist/server/server/src/validation/common-validators.mjs.map +1 -1
- package/dist/server/server/src/validation/permission.js +1 -1
- package/dist/server/server/src/validation/permission.js.map +1 -1
- package/dist/server/server/src/validation/permission.mjs +1 -1
- package/dist/server/server/src/validation/permission.mjs.map +1 -1
- package/dist/server/server/src/validation/role.js +2 -2
- package/dist/server/server/src/validation/role.js.map +1 -1
- package/dist/server/server/src/validation/role.mjs +2 -2
- package/dist/server/server/src/validation/role.mjs.map +1 -1
- package/dist/server/src/services/permission/sections-builder/handlers.d.ts.map +1 -1
- package/dist/server/src/services/role.d.ts.map +1 -1
- package/dist/server/src/validation/common-validators.d.ts.map +1 -1
- package/dist/server/src/validation/role.d.ts.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.mjs","sources":["../../../../../../../server/src/services/permission/sections-builder/handlers.ts"],"sourcesContent":["import type { Internal } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\nimport {\n toSubjectTemplate,\n getValidOptions,\n hasProperty,\n isNotInSubjects,\n resolveContentType,\n isOfKind,\n} from './utils';\nimport type { Action } from '../../../domain/action';\n\nconst { isVisibleAttribute } = contentTypes;\n\nexport type ContentTypesSection = {\n actions: Action[];\n subjects: any[];\n};\n\nexport type ActionArraySection = Action[];\n\n/**\n * Transforms & adds the given setting action to the section\n * Note: The action is transformed to a setting specific format\n * @param options\n * @param options.action\n * @param section\n */\nconst settings = ({ action, section }: { action: Action; section: ActionArraySection }) => {\n const { category, subCategory, displayName, actionId } = action;\n\n section.push({\n displayName,\n category,\n subCategory,\n // TODO: Investigate at which point the action property is transformed to actionId\n // @ts-expect-error - action should be actionID\n action: actionId,\n });\n};\n\n/**\n * Transforms & adds the given plugin action to the section\n * Note: The action is transformed to a plugin specific format\n * @param {object} options\n * @param {Action} options.action\n * @param {ActionArraySection} section\n */\nconst plugins = ({ action, section }: { action: Action; section: ActionArraySection }) => {\n const { pluginName, subCategory, displayName, actionId } = action;\n\n section.push({\n displayName,\n // @ts-expect-error - plugin should be pluginName, TODO: Investigate at which point the plugin property\n plugin: pluginName,\n subCategory,\n action: actionId,\n });\n};\n\n/**\n * Transforms & adds the given action to the section's actions field\n * Note: The action is transformed to a content-type specific format\n * @param {object} options\n * @param {Action} options.action\n * @param {ContentTypesSection} section\n */\nconst contentTypesBase = ({\n action,\n section,\n}: {\n action: Action;\n section: ContentTypesSection;\n}) => {\n const { displayName, actionId, subjects, options } = action;\n\n section.actions.push({\n // @ts-expect-error - label should be displayName, TODO: Investigate at which point the label property\n label: displayName,\n actionId,\n subjects,\n ...getValidOptions(options),\n });\n};\n\n/**\n * Initialize the subjects array of a section based on the action's subjects\n */\nconst subjectsHandlerFor =\n (kind: string) =>\n ({ action, section: contentTypesSection }: { action: Action; section: ContentTypesSection }) => {\n // TODO: add a type guard for UID.ContentType\n const subjects = action.subjects as Internal.UID.ContentType[];\n\n if (!subjects?.length) {\n return;\n }\n\n const newSubjects = subjects\n // Ignore already added subjects\n .filter(isNotInSubjects(contentTypesSection.subjects))\n // Transform UIDs into content-types\n .map(resolveContentType)\n // Only keep specific kind of content-types\n .filter(isOfKind(kind))\n // Transform the content-types into section's subjects\n .map(toSubjectTemplate);\n\n contentTypesSection.subjects.push(...newSubjects);\n };\n\nconst buildNode = (model: any, attributeName: string, attribute: any) => {\n if (!isVisibleAttribute(model, attributeName)) {\n return null;\n }\n\n const node = { label: attributeName, value: attributeName };\n\n if (attribute.required) {\n Object.assign(node, { required: true });\n }\n\n if (attribute.type === 'component') {\n const component = strapi.components[attribute.component];\n return { ...node, children: buildDeepAttributesCollection(component) };\n }\n\n return node;\n};\n\nconst buildDeepAttributesCollection = (model: any): unknown => {\n return Object.entries(model.attributes)\n .map(([attributeName, attribute]) => buildNode(model, attributeName, attribute))\n .filter((node) => node !== null);\n};\n\n/**\n * Create and populate the fields property for section's subjects based on the action's subjects list\n */\nconst fieldsProperty = ({ action, section }: { action: Action; section: ContentTypesSection }) => {\n const { subjects } = action;\n\n section.subjects\n .filter((subject) => subjects?.includes(subject.uid))\n .forEach((subject) => {\n const { uid } = subject;\n const contentType = resolveContentType(uid);\n\n if (hasProperty('fields', subject)) {\n return;\n }\n\n const fields = buildDeepAttributesCollection(contentType);\n const fieldsProp = { label: 'Fields', value: 'fields', children: fields };\n\n subject.properties.push(fieldsProp);\n });\n};\n\nexport { plugins, settings, subjectsHandlerFor, contentTypesBase, fieldsProperty };\n"],"names":["isVisibleAttribute","contentTypes","settings","action","section","category","subCategory","displayName","actionId","push","plugins","pluginName","plugin","contentTypesBase","subjects","options","actions","label","getValidOptions","subjectsHandlerFor","kind","contentTypesSection","length","newSubjects","
|
|
1
|
+
{"version":3,"file":"handlers.mjs","sources":["../../../../../../../server/src/services/permission/sections-builder/handlers.ts"],"sourcesContent":["import type { Internal } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\nimport {\n toSubjectTemplate,\n getValidOptions,\n hasProperty,\n isNotInSubjects,\n resolveContentType,\n isOfKind,\n} from './utils';\nimport type { Action } from '../../../domain/action';\n\nconst { isVisibleAttribute } = contentTypes;\n\nexport type ContentTypesSection = {\n actions: Action[];\n subjects: any[];\n};\n\nexport type ActionArraySection = Action[];\n\n/**\n * Transforms & adds the given setting action to the section\n * Note: The action is transformed to a setting specific format\n * @param options\n * @param options.action\n * @param section\n */\nconst settings = ({ action, section }: { action: Action; section: ActionArraySection }) => {\n const { category, subCategory, displayName, actionId } = action;\n\n section.push({\n displayName,\n category,\n subCategory,\n // TODO: Investigate at which point the action property is transformed to actionId\n // @ts-expect-error - action should be actionID\n action: actionId,\n });\n};\n\n/**\n * Transforms & adds the given plugin action to the section\n * Note: The action is transformed to a plugin specific format\n * @param {object} options\n * @param {Action} options.action\n * @param {ActionArraySection} section\n */\nconst plugins = ({ action, section }: { action: Action; section: ActionArraySection }) => {\n const { pluginName, subCategory, displayName, actionId } = action;\n\n section.push({\n displayName,\n // @ts-expect-error - plugin should be pluginName, TODO: Investigate at which point the plugin property\n plugin: pluginName,\n subCategory,\n action: actionId,\n });\n};\n\n/**\n * Transforms & adds the given action to the section's actions field\n * Note: The action is transformed to a content-type specific format\n * @param {object} options\n * @param {Action} options.action\n * @param {ContentTypesSection} section\n */\nconst contentTypesBase = ({\n action,\n section,\n}: {\n action: Action;\n section: ContentTypesSection;\n}) => {\n const { displayName, actionId, subjects, options } = action;\n\n // Strip non-displayed content types so they don't appear as configurable subjects\n // in the roles UI (e.g. plugin::users-permissions.role).\n const allContentTypes = strapi.contentTypes as Record<string, any>;\n const filteredSubjects = subjects?.filter(\n (uid) =>\n (\n allContentTypes[uid as string]?.pluginOptions?.['content-manager'] as\n | { visible?: boolean }\n | undefined\n )?.visible !== false\n );\n\n section.actions.push({\n // @ts-expect-error - label should be displayName, TODO: Investigate at which point the label property\n label: displayName,\n actionId,\n subjects: filteredSubjects,\n ...getValidOptions(options),\n });\n};\n\n/**\n * Initialize the subjects array of a section based on the action's subjects\n */\nconst subjectsHandlerFor =\n (kind: string) =>\n ({ action, section: contentTypesSection }: { action: Action; section: ContentTypesSection }) => {\n // TODO: add a type guard for UID.ContentType\n const subjects = action.subjects as Internal.UID.ContentType[];\n\n if (!subjects?.length) {\n return;\n }\n\n const newSubjects = subjects\n // Ignore already added subjects\n .filter(isNotInSubjects(contentTypesSection.subjects))\n // Transform UIDs into content-types\n .map(resolveContentType)\n // Only keep specific kind of content-types\n .filter(isOfKind(kind))\n // Exclude content types hidden from the content manager (e.g. plugin::users-permissions.role).\n // Those types are valid explorer.read subjects so that super admin can read relation targets,\n // but they should not appear as configurable permissions in the roles UI.\n .filter(\n (ct) =>\n (ct?.pluginOptions?.['content-manager'] as { visible?: boolean } | undefined)?.visible !==\n false\n )\n // Transform the content-types into section's subjects\n .map(toSubjectTemplate);\n\n contentTypesSection.subjects.push(...newSubjects);\n };\n\nconst buildNode = (model: any, attributeName: string, attribute: any) => {\n if (!isVisibleAttribute(model, attributeName)) {\n return null;\n }\n\n const node = { label: attributeName, value: attributeName };\n\n if (attribute.required) {\n Object.assign(node, { required: true });\n }\n\n if (attribute.type === 'component') {\n const component = strapi.components[attribute.component];\n return { ...node, children: buildDeepAttributesCollection(component) };\n }\n\n return node;\n};\n\nconst buildDeepAttributesCollection = (model: any): unknown => {\n return Object.entries(model.attributes)\n .map(([attributeName, attribute]) => buildNode(model, attributeName, attribute))\n .filter((node) => node !== null);\n};\n\n/**\n * Create and populate the fields property for section's subjects based on the action's subjects list\n */\nconst fieldsProperty = ({ action, section }: { action: Action; section: ContentTypesSection }) => {\n const { subjects } = action;\n\n section.subjects\n .filter((subject) => subjects?.includes(subject.uid))\n .forEach((subject) => {\n const { uid } = subject;\n const contentType = resolveContentType(uid);\n\n if (hasProperty('fields', subject)) {\n return;\n }\n\n const fields = buildDeepAttributesCollection(contentType);\n const fieldsProp = { label: 'Fields', value: 'fields', children: fields };\n\n subject.properties.push(fieldsProp);\n });\n};\n\nexport { plugins, settings, subjectsHandlerFor, contentTypesBase, fieldsProperty };\n"],"names":["isVisibleAttribute","contentTypes","settings","action","section","category","subCategory","displayName","actionId","push","plugins","pluginName","plugin","contentTypesBase","subjects","options","allContentTypes","strapi","filteredSubjects","filter","uid","pluginOptions","visible","actions","label","getValidOptions","subjectsHandlerFor","kind","contentTypesSection","length","newSubjects","isNotInSubjects","map","resolveContentType","isOfKind","ct","toSubjectTemplate","buildNode","model","attributeName","attribute","node","value","required","Object","assign","type","component","components","children","buildDeepAttributesCollection","entries","attributes","fieldsProperty","subject","includes","forEach","contentType","hasProperty","fields","fieldsProp","properties"],"mappings":"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"}
|
|
@@ -237,9 +237,13 @@ const jsonClean = (data)=>JSON.parse(JSON.stringify(data));
|
|
|
237
237
|
description: 'Authors can manage the content they have created.'
|
|
238
238
|
});
|
|
239
239
|
// create content-type permissions for each role
|
|
240
|
+
// Exclude non-displayed content types (e.g. plugin::users-permissions.role) from Editor/Author
|
|
241
|
+
// since those types are in explorer.read subjects only for super admin relation reads.
|
|
242
|
+
const nonDisplayedUids = Object.values(strapi.contentTypes).filter((ct)=>ct?.pluginOptions?.['content-manager']?.visible === false).map((ct)=>ct.uid);
|
|
240
243
|
const editorPermissions = index.getService('content-type').getPermissionsWithNestedFields(contentTypesActions, {
|
|
241
244
|
restrictedSubjects: [
|
|
242
|
-
'plugin::users-permissions.user'
|
|
245
|
+
'plugin::users-permissions.user',
|
|
246
|
+
...nonDisplayedUids
|
|
243
247
|
]
|
|
244
248
|
});
|
|
245
249
|
const authorPermissions = editorPermissions.filter(({ action })=>action !== ACTIONS.publish).map((permission)=>index$1.default.create({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"role.js","sources":["../../../../../server/src/services/role.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */ // TODO: TS - Use database parameters interface when they are ready\n/* eslint-disable @typescript-eslint/default-param-last */\nimport _ from 'lodash';\nimport { set, omit, pick, prop, isArray, differenceWith, differenceBy, isEqual } from 'lodash/fp';\n\nimport { dates, arrays, hooks as hooksUtils, errors } from '@strapi/utils';\nimport type { Data } from '@strapi/types';\n\nimport permissionDomain from '../domain/permission';\nimport type { AdminUser, AdminRole, Permission } from '../../../shared/contracts/shared';\nimport type { Action } from '../domain/action';\n\nimport { validatePermissionsExist } from '../validation/permission';\nimport roleConstants from './constants';\nimport { getService } from '../utils';\n\nconst { SUPER_ADMIN_CODE, CONTENT_TYPE_SECTION } = roleConstants;\n\nconst { createAsyncSeriesWaterfallHook } = hooksUtils;\nconst { ApplicationError } = errors;\n\nconst hooks = {\n willResetSuperAdminPermissions: createAsyncSeriesWaterfallHook(),\n willValidateUpdatePermissions: createAsyncSeriesWaterfallHook(),\n};\n\nconst ACTIONS = {\n publish: 'plugin::content-manager.explorer.publish',\n};\n\n// @ts-expect-error lodash types\nconst sanitizeRole: <T extends object>(obj: T) => Omit<T, 'users' | 'permissions'> = omit([\n 'users',\n 'permissions',\n] as const);\n\nexport type AdminRoleWithUsersCount = AdminRole & { usersCount: number };\n\nconst COMPARABLE_FIELDS = ['conditions', 'properties', 'subject', 'action', 'actionParameters'];\nconst pickComparableFields = pick(COMPARABLE_FIELDS);\n\nconst jsonClean = <T extends object>(data: T): T => JSON.parse(JSON.stringify(data));\n\n/**\n * Compare two permissions\n */\nconst arePermissionsEqual = (p1: Permission, p2: Permission): boolean => {\n if (p1.action === p2.action) {\n return isEqual(jsonClean(pickComparableFields(p1)), jsonClean(pickComparableFields(p2)));\n }\n\n return false;\n};\n\n/**\n * Create and save a role in database\n * @param attributes A partial role object\n */\nconst create = async (attributes: Partial<AdminRole>): Promise<AdminRole> => {\n const alreadyExists = await exists({ name: attributes.name });\n\n if (alreadyExists) {\n throw new ApplicationError(\n `The name must be unique and a role with name \\`${attributes.name}\\` already exists.`\n );\n }\n const autoGeneratedCode = `${_.kebabCase(attributes.name)}-${dates.timestampCode()}`;\n\n const rolesWithCode = {\n ...attributes,\n code: attributes.code || autoGeneratedCode,\n };\n\n const result = await strapi.db.query('admin::role').create({ data: rolesWithCode });\n strapi.eventHub.emit('role.create', { role: sanitizeRole(result) });\n\n return result;\n};\n\n/**\n * Find a role in database\n * @param params query params to find the role\n * @param populate\n */\nconst findOne = (params = {}, populate?: unknown): Promise<AdminRole> => {\n return strapi.db.query('admin::role').findOne({ where: params, populate });\n};\n\n/**\n * Find a role in database with usersCounts\n * @param params query params to find the role\n * @param populate\n */\nconst findOneWithUsersCount = async (\n params = {},\n populate?: unknown\n): Promise<AdminRoleWithUsersCount> => {\n const role = await strapi.db.query('admin::role').findOne({ where: params, populate });\n\n if (role) {\n role.usersCount = await getUsersCount(role.id);\n }\n\n return role;\n};\n\n/**\n * Find roles in database\n * @param params query params to find the roles\n * @param populate\n */\nconst find = (params = {}, populate: unknown): Promise<AdminRole[]> => {\n return strapi.db.query('admin::role').findMany({ where: params, populate });\n};\n\n/**\n * Find all roles in database\n */\nconst findAllWithUsersCount = async (params: any): Promise<AdminRoleWithUsersCount[]> => {\n const roles: AdminRoleWithUsersCount[] = await strapi.db\n .query('admin::role')\n .findMany(strapi.get('query-params').transform('admin::role', params));\n\n for (const role of roles) {\n role.usersCount = await getUsersCount(role.id);\n }\n\n return roles;\n};\n\n/**\n * Update a role in database\n * @param params query params to find the role to update\n * @param attributes A partial role object\n */\nconst update = async (params: any, attributes: Partial<AdminRole>): Promise<AdminRole> => {\n const sanitizedAttributes = _.omit(attributes, ['code']);\n\n if (_.has(params, 'id') && _.has(sanitizedAttributes, 'name')) {\n const alreadyExists = await exists({\n name: sanitizedAttributes.name,\n id: { $ne: params.id },\n });\n if (alreadyExists) {\n throw new ApplicationError(\n `The name must be unique and a role with name \\`${sanitizedAttributes.name}\\` already exists.`\n );\n }\n }\n\n const result = await strapi.db\n .query('admin::role')\n .update({ where: params, data: sanitizedAttributes });\n\n strapi.eventHub.emit('role.update', { role: sanitizeRole(result) });\n\n return result;\n};\n\n/**\n * Check if a role exists in database\n * @param params query params to find the role\n */\nconst exists = async (params = {} as unknown): Promise<boolean> => {\n const count = await strapi.db.query('admin::role').count({ where: params });\n return count > 0;\n};\n\n/**\n * Count the number of roles based on search params\n * @param params params used for the query\n */\nconst count = async (params = {} as any): Promise<number> => {\n return strapi.db.query('admin::role').count(params);\n};\n\n/**\n * Check if the given roles id can be deleted safely, throw otherwise\n * @param ids\n */\nconst checkRolesIdForDeletion = async (ids = [] as Data.ID[]) => {\n const superAdminRole = await getSuperAdmin();\n\n if (superAdminRole && arrays.includesString(ids, superAdminRole.id)) {\n throw new ApplicationError('You cannot delete the super admin role');\n }\n\n for (const roleId of ids) {\n const usersCount = await getUsersCount(roleId);\n if (usersCount !== 0) {\n throw new ApplicationError('Some roles are still assigned to some users');\n }\n }\n};\n\n/**\n * Delete roles in database if they have no user assigned\n * @param ids query params to find the roles\n */\nconst deleteByIds = async (ids = [] as Data.ID[]): Promise<AdminRole[]> => {\n await checkRolesIdForDeletion(ids);\n\n await getService('permission').deleteByRolesIds(ids);\n\n const deletedRoles: AdminRole[] = [];\n for (const id of ids) {\n const deletedRole = await strapi.db.query('admin::role').delete({ where: { id } });\n\n if (deletedRole) {\n strapi.eventHub.emit('role.delete', { role: deletedRole });\n deletedRoles.push(deletedRole);\n }\n }\n\n return deletedRoles;\n};\n\n/** Count the number of users for some roles\n */\nconst getUsersCount = async (roleId: Data.ID): Promise<number> => {\n return strapi.db.query('admin::user').count({ where: { roles: { id: roleId } } });\n};\n\n/** Returns admin role\n */\nconst getSuperAdmin = (): Promise<AdminRole | undefined> => findOne({ code: SUPER_ADMIN_CODE });\n\n/** Returns admin role with userCount\n * @returns {Promise<role>}\n */\nconst getSuperAdminWithUsersCount = () => findOneWithUsersCount({ code: SUPER_ADMIN_CODE });\n\n/** Create superAdmin, Author and Editor role is no role already exist\n */\nconst createRolesIfNoneExist = async () => {\n const someRolesExist = await exists();\n if (someRolesExist) {\n return;\n }\n\n const { actionProvider } = getService('permission');\n\n const allActions = actionProvider.values();\n const contentTypesActions = allActions.filter((a) => a.section === 'contentTypes');\n\n // create 3 roles\n const superAdminRole = await create({\n name: 'Super Admin',\n code: 'strapi-super-admin',\n description: 'Super Admins can access and manage all features and settings.',\n });\n\n await getService('user').assignARoleToAll(superAdminRole.id);\n\n const editorRole = await create({\n name: 'Editor',\n code: 'strapi-editor',\n description: 'Editors can manage and publish contents including those of other users.',\n });\n\n const authorRole = await create({\n name: 'Author',\n code: 'strapi-author',\n description: 'Authors can manage the content they have created.',\n });\n\n // create content-type permissions for each role\n const editorPermissions = getService('content-type').getPermissionsWithNestedFields(\n contentTypesActions,\n {\n restrictedSubjects: ['plugin::users-permissions.user'],\n }\n );\n\n const authorPermissions = editorPermissions\n .filter(({ action }: any) => action !== ACTIONS.publish)\n .map((permission: any) =>\n permissionDomain.create({ ...permission, conditions: ['admin::is-creator'] })\n );\n\n editorPermissions.push(...getDefaultPluginPermissions());\n authorPermissions.push(...getDefaultPluginPermissions({ isAuthor: true }));\n\n // assign permissions to roles\n await addPermissions(editorRole.id, editorPermissions);\n await addPermissions(authorRole.id, authorPermissions);\n};\n\nconst getDefaultPluginPermissions = ({ isAuthor = false } = {}) => {\n const conditions = isAuthor ? ['admin::is-creator'] : [];\n\n // add plugin permissions for each role\n return [\n { action: 'plugin::upload.read', conditions },\n { action: 'plugin::upload.configure-view' },\n { action: 'plugin::upload.assets.create' },\n { action: 'plugin::upload.assets.update', conditions },\n { action: 'plugin::upload.assets.download' },\n { action: 'plugin::upload.assets.copy-link' },\n ].map(permissionDomain.create);\n};\n\n/** Display a warning if the role superAdmin doesn't exist\n * or if the role is not assigned to at least one user\n */\nconst displayWarningIfNoSuperAdmin = async () => {\n const superAdminRole = await getSuperAdminWithUsersCount();\n const someUsersExists = await getService('user').exists();\n\n if (!superAdminRole) {\n strapi.log.warn(\"Your application doesn't have a super admin role.\");\n } else if (someUsersExists && superAdminRole.usersCount === 0) {\n strapi.log.warn(\"Your application doesn't have a super admin user.\");\n }\n};\n\n/**\n * Assign permissions to a role\n * @param roleId - role Data.ID\n * @param {Array<Permission{action,subject,fields,conditions}>} permissions - permissions to assign to the role\n */\nconst assignPermissions = async (\n roleId: Data.ID,\n permissions: Array<Pick<Permission, 'action' | 'subject' | 'conditions'>> = []\n) => {\n await validatePermissionsExist(permissions);\n\n // Internal actions are not handled by the role service, so any permission\n // with an internal action is filtered out\n const internalActions = getService('permission')\n .actionProvider.values()\n .filter((action) => action.section === 'internal')\n .map((action) => action.actionId);\n\n const superAdmin = await getService('role').getSuperAdmin();\n const isSuperAdmin = superAdmin && superAdmin.id === roleId;\n const assignRole = set('role', roleId);\n\n const permissionsWithRole = permissions\n // Add the role attribute to every permission\n .map(assignRole)\n // Transform each permission into a Permission instance\n // @ts-expect-error - lodash set doesn't resolve the type appropriately\n .map(permissionDomain.create);\n\n const existingPermissions = await getService('permission').findMany({\n where: { role: { id: roleId } },\n populate: ['role'],\n });\n\n const permissionsToAdd = differenceWith(\n arePermissionsEqual,\n permissionsWithRole,\n existingPermissions\n ).filter((permission: Permission) => !internalActions.includes(permission.action));\n\n const permissionsToDelete = differenceWith(\n arePermissionsEqual,\n existingPermissions,\n permissionsWithRole\n ).filter((permission: Permission) => !internalActions.includes(permission.action));\n\n const permissionsToReturn = differenceBy('id', permissionsToDelete, existingPermissions);\n\n if (permissionsToDelete.length > 0) {\n // @ts-expect-error - lodash prop doesn't resolve the type appropriately\n await getService('permission').deleteByIds(permissionsToDelete.map(prop('id')));\n }\n\n if (permissionsToAdd.length > 0) {\n const newPermissions = await addPermissions(roleId, permissionsToAdd);\n permissionsToReturn.push(...newPermissions);\n }\n\n if (!isSuperAdmin && (permissionsToAdd.length || permissionsToDelete.length)) {\n await getService('metrics').sendDidUpdateRolePermissions();\n }\n\n if (permissionsToAdd.length > 0 || permissionsToDelete.length > 0) {\n await getService('api-token-admin').syncPermissionsForRole(roleId);\n }\n\n return permissionsToReturn;\n};\n\nconst addPermissions = async (roleId: Data.ID, permissions: any) => {\n const { conditionProvider, createMany } = getService('permission');\n const { sanitizeConditions } = permissionDomain;\n\n const permissionsWithRole = permissions\n .map(set('role', roleId))\n // @ts-expect-error - refactor domain/permission Condition type, as it's now expecting\n // a string but it should be a Condition interface\n .map(sanitizeConditions(conditionProvider))\n .map(permissionDomain.create);\n\n return createMany(permissionsWithRole);\n};\n\nconst isContentTypeAction = (action: Action) => action.section === CONTENT_TYPE_SECTION;\n\n/**\n * Reset super admin permissions (giving it all permissions)\n */\nconst resetSuperAdminPermissions = async () => {\n const superAdminRole = await getService('role').getSuperAdmin();\n if (!superAdminRole) {\n return;\n }\n\n const permissionService = getService('permission');\n const contentTypeService = getService('content-type');\n\n const allActions = permissionService.actionProvider.values() as Action[];\n\n const contentTypesActions = allActions.filter((action) => isContentTypeAction(action));\n const otherActions = allActions.filter((action) => !isContentTypeAction(action));\n\n // First, get the content-types permissions\n const permissions = contentTypeService.getPermissionsWithNestedFields(\n contentTypesActions\n ) as Permission[];\n\n // Then add every other permission\n const otherPermissions = otherActions.reduce((acc, action) => {\n const { actionId, subjects } = action;\n\n if (isArray(subjects)) {\n acc.push(\n ...subjects.map((subject) => permissionDomain.create({ action: actionId, subject }))\n );\n } else {\n acc.push(permissionDomain.create({ action: actionId }));\n }\n\n return acc;\n }, [] as Permission[]);\n\n permissions.push(...otherPermissions);\n\n const transformedPermissions = (await hooks.willResetSuperAdminPermissions.call(\n permissions\n )) as Permission[];\n\n await assignPermissions(superAdminRole.id, transformedPermissions);\n};\n\n/**\n * Check if a user object includes the super admin role\n */\nconst hasSuperAdminRole = (user: AdminUser): boolean => {\n const roles = _.get(user, 'roles', []) as AdminRole[];\n\n return roles.map(prop('code')).includes(SUPER_ADMIN_CODE);\n};\n\nconst constants = {\n superAdminCode: SUPER_ADMIN_CODE,\n};\n\nexport default {\n hooks,\n sanitizeRole,\n create,\n findOne,\n findOneWithUsersCount,\n find,\n findAllWithUsersCount,\n update,\n exists,\n count,\n deleteByIds,\n getUsersCount,\n getSuperAdmin,\n getSuperAdminWithUsersCount,\n createRolesIfNoneExist,\n displayWarningIfNoSuperAdmin,\n addPermissions,\n hasSuperAdminRole,\n assignPermissions,\n resetSuperAdminPermissions,\n checkRolesIdForDeletion,\n constants,\n};\n"],"names":["SUPER_ADMIN_CODE","CONTENT_TYPE_SECTION","roleConstants","createAsyncSeriesWaterfallHook","hooksUtils","ApplicationError","errors","hooks","willResetSuperAdminPermissions","willValidateUpdatePermissions","ACTIONS","publish","sanitizeRole","omit","COMPARABLE_FIELDS","pickComparableFields","pick","jsonClean","data","JSON","parse","stringify","arePermissionsEqual","p1","p2","action","isEqual","create","attributes","alreadyExists","exists","name","autoGeneratedCode","_","kebabCase","dates","timestampCode","rolesWithCode","code","result","strapi","db","query","eventHub","emit","role","findOne","params","populate","where","findOneWithUsersCount","usersCount","getUsersCount","id","find","findMany","findAllWithUsersCount","roles","get","transform","update","sanitizedAttributes","has","$ne","count","checkRolesIdForDeletion","ids","superAdminRole","getSuperAdmin","arrays","includesString","roleId","deleteByIds","getService","deleteByRolesIds","deletedRoles","deletedRole","delete","push","getSuperAdminWithUsersCount","createRolesIfNoneExist","someRolesExist","actionProvider","allActions","values","contentTypesActions","filter","a","section","description","assignARoleToAll","editorRole","authorRole","editorPermissions","getPermissionsWithNestedFields","restrictedSubjects","authorPermissions","map","permission","permissionDomain","conditions","getDefaultPluginPermissions","isAuthor","addPermissions","displayWarningIfNoSuperAdmin","someUsersExists","log","warn","assignPermissions","permissions","validatePermissionsExist","internalActions","actionId","superAdmin","isSuperAdmin","assignRole","set","permissionsWithRole","existingPermissions","permissionsToAdd","differenceWith","includes","permissionsToDelete","permissionsToReturn","differenceBy","length","prop","newPermissions","sendDidUpdateRolePermissions","syncPermissionsForRole","conditionProvider","createMany","sanitizeConditions","isContentTypeAction","resetSuperAdminPermissions","permissionService","contentTypeService","otherActions","otherPermissions","reduce","acc","subjects","isArray","subject","transformedPermissions","call","hasSuperAdminRole","user","constants","superAdminCode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"role.js","sources":["../../../../../server/src/services/role.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */ // TODO: TS - Use database parameters interface when they are ready\n/* eslint-disable @typescript-eslint/default-param-last */\nimport _ from 'lodash';\nimport { set, omit, pick, prop, isArray, differenceWith, differenceBy, isEqual } from 'lodash/fp';\n\nimport { dates, arrays, hooks as hooksUtils, errors } from '@strapi/utils';\nimport type { Data } from '@strapi/types';\n\nimport permissionDomain from '../domain/permission';\nimport type { AdminUser, AdminRole, Permission } from '../../../shared/contracts/shared';\nimport type { Action } from '../domain/action';\n\nimport { validatePermissionsExist } from '../validation/permission';\nimport roleConstants from './constants';\nimport { getService } from '../utils';\n\nconst { SUPER_ADMIN_CODE, CONTENT_TYPE_SECTION } = roleConstants;\n\nconst { createAsyncSeriesWaterfallHook } = hooksUtils;\nconst { ApplicationError } = errors;\n\nconst hooks = {\n willResetSuperAdminPermissions: createAsyncSeriesWaterfallHook(),\n willValidateUpdatePermissions: createAsyncSeriesWaterfallHook(),\n};\n\nconst ACTIONS = {\n publish: 'plugin::content-manager.explorer.publish',\n};\n\n// @ts-expect-error lodash types\nconst sanitizeRole: <T extends object>(obj: T) => Omit<T, 'users' | 'permissions'> = omit([\n 'users',\n 'permissions',\n] as const);\n\nexport type AdminRoleWithUsersCount = AdminRole & { usersCount: number };\n\nconst COMPARABLE_FIELDS = ['conditions', 'properties', 'subject', 'action', 'actionParameters'];\nconst pickComparableFields = pick(COMPARABLE_FIELDS);\n\nconst jsonClean = <T extends object>(data: T): T => JSON.parse(JSON.stringify(data));\n\n/**\n * Compare two permissions\n */\nconst arePermissionsEqual = (p1: Permission, p2: Permission): boolean => {\n if (p1.action === p2.action) {\n return isEqual(jsonClean(pickComparableFields(p1)), jsonClean(pickComparableFields(p2)));\n }\n\n return false;\n};\n\n/**\n * Create and save a role in database\n * @param attributes A partial role object\n */\nconst create = async (attributes: Partial<AdminRole>): Promise<AdminRole> => {\n const alreadyExists = await exists({ name: attributes.name });\n\n if (alreadyExists) {\n throw new ApplicationError(\n `The name must be unique and a role with name \\`${attributes.name}\\` already exists.`\n );\n }\n const autoGeneratedCode = `${_.kebabCase(attributes.name)}-${dates.timestampCode()}`;\n\n const rolesWithCode = {\n ...attributes,\n code: attributes.code || autoGeneratedCode,\n };\n\n const result = await strapi.db.query('admin::role').create({ data: rolesWithCode });\n strapi.eventHub.emit('role.create', { role: sanitizeRole(result) });\n\n return result;\n};\n\n/**\n * Find a role in database\n * @param params query params to find the role\n * @param populate\n */\nconst findOne = (params = {}, populate?: unknown): Promise<AdminRole> => {\n return strapi.db.query('admin::role').findOne({ where: params, populate });\n};\n\n/**\n * Find a role in database with usersCounts\n * @param params query params to find the role\n * @param populate\n */\nconst findOneWithUsersCount = async (\n params = {},\n populate?: unknown\n): Promise<AdminRoleWithUsersCount> => {\n const role = await strapi.db.query('admin::role').findOne({ where: params, populate });\n\n if (role) {\n role.usersCount = await getUsersCount(role.id);\n }\n\n return role;\n};\n\n/**\n * Find roles in database\n * @param params query params to find the roles\n * @param populate\n */\nconst find = (params = {}, populate: unknown): Promise<AdminRole[]> => {\n return strapi.db.query('admin::role').findMany({ where: params, populate });\n};\n\n/**\n * Find all roles in database\n */\nconst findAllWithUsersCount = async (params: any): Promise<AdminRoleWithUsersCount[]> => {\n const roles: AdminRoleWithUsersCount[] = await strapi.db\n .query('admin::role')\n .findMany(strapi.get('query-params').transform('admin::role', params));\n\n for (const role of roles) {\n role.usersCount = await getUsersCount(role.id);\n }\n\n return roles;\n};\n\n/**\n * Update a role in database\n * @param params query params to find the role to update\n * @param attributes A partial role object\n */\nconst update = async (params: any, attributes: Partial<AdminRole>): Promise<AdminRole> => {\n const sanitizedAttributes = _.omit(attributes, ['code']);\n\n if (_.has(params, 'id') && _.has(sanitizedAttributes, 'name')) {\n const alreadyExists = await exists({\n name: sanitizedAttributes.name,\n id: { $ne: params.id },\n });\n if (alreadyExists) {\n throw new ApplicationError(\n `The name must be unique and a role with name \\`${sanitizedAttributes.name}\\` already exists.`\n );\n }\n }\n\n const result = await strapi.db\n .query('admin::role')\n .update({ where: params, data: sanitizedAttributes });\n\n strapi.eventHub.emit('role.update', { role: sanitizeRole(result) });\n\n return result;\n};\n\n/**\n * Check if a role exists in database\n * @param params query params to find the role\n */\nconst exists = async (params = {} as unknown): Promise<boolean> => {\n const count = await strapi.db.query('admin::role').count({ where: params });\n return count > 0;\n};\n\n/**\n * Count the number of roles based on search params\n * @param params params used for the query\n */\nconst count = async (params = {} as any): Promise<number> => {\n return strapi.db.query('admin::role').count(params);\n};\n\n/**\n * Check if the given roles id can be deleted safely, throw otherwise\n * @param ids\n */\nconst checkRolesIdForDeletion = async (ids = [] as Data.ID[]) => {\n const superAdminRole = await getSuperAdmin();\n\n if (superAdminRole && arrays.includesString(ids, superAdminRole.id)) {\n throw new ApplicationError('You cannot delete the super admin role');\n }\n\n for (const roleId of ids) {\n const usersCount = await getUsersCount(roleId);\n if (usersCount !== 0) {\n throw new ApplicationError('Some roles are still assigned to some users');\n }\n }\n};\n\n/**\n * Delete roles in database if they have no user assigned\n * @param ids query params to find the roles\n */\nconst deleteByIds = async (ids = [] as Data.ID[]): Promise<AdminRole[]> => {\n await checkRolesIdForDeletion(ids);\n\n await getService('permission').deleteByRolesIds(ids);\n\n const deletedRoles: AdminRole[] = [];\n for (const id of ids) {\n const deletedRole = await strapi.db.query('admin::role').delete({ where: { id } });\n\n if (deletedRole) {\n strapi.eventHub.emit('role.delete', { role: deletedRole });\n deletedRoles.push(deletedRole);\n }\n }\n\n return deletedRoles;\n};\n\n/** Count the number of users for some roles\n */\nconst getUsersCount = async (roleId: Data.ID): Promise<number> => {\n return strapi.db.query('admin::user').count({ where: { roles: { id: roleId } } });\n};\n\n/** Returns admin role\n */\nconst getSuperAdmin = (): Promise<AdminRole | undefined> => findOne({ code: SUPER_ADMIN_CODE });\n\n/** Returns admin role with userCount\n * @returns {Promise<role>}\n */\nconst getSuperAdminWithUsersCount = () => findOneWithUsersCount({ code: SUPER_ADMIN_CODE });\n\n/** Create superAdmin, Author and Editor role is no role already exist\n */\nconst createRolesIfNoneExist = async () => {\n const someRolesExist = await exists();\n if (someRolesExist) {\n return;\n }\n\n const { actionProvider } = getService('permission');\n\n const allActions = actionProvider.values();\n const contentTypesActions = allActions.filter((a) => a.section === 'contentTypes');\n\n // create 3 roles\n const superAdminRole = await create({\n name: 'Super Admin',\n code: 'strapi-super-admin',\n description: 'Super Admins can access and manage all features and settings.',\n });\n\n await getService('user').assignARoleToAll(superAdminRole.id);\n\n const editorRole = await create({\n name: 'Editor',\n code: 'strapi-editor',\n description: 'Editors can manage and publish contents including those of other users.',\n });\n\n const authorRole = await create({\n name: 'Author',\n code: 'strapi-author',\n description: 'Authors can manage the content they have created.',\n });\n\n // create content-type permissions for each role\n // Exclude non-displayed content types (e.g. plugin::users-permissions.role) from Editor/Author\n // since those types are in explorer.read subjects only for super admin relation reads.\n const nonDisplayedUids = Object.values(strapi.contentTypes as Record<string, any>)\n .filter((ct) => ct?.pluginOptions?.['content-manager']?.visible === false)\n .map((ct) => ct.uid as string);\n\n const editorPermissions = getService('content-type').getPermissionsWithNestedFields(\n contentTypesActions,\n {\n restrictedSubjects: ['plugin::users-permissions.user', ...nonDisplayedUids],\n }\n );\n\n const authorPermissions = editorPermissions\n .filter(({ action }: any) => action !== ACTIONS.publish)\n .map((permission: any) =>\n permissionDomain.create({ ...permission, conditions: ['admin::is-creator'] })\n );\n\n editorPermissions.push(...getDefaultPluginPermissions());\n authorPermissions.push(...getDefaultPluginPermissions({ isAuthor: true }));\n\n // assign permissions to roles\n await addPermissions(editorRole.id, editorPermissions);\n await addPermissions(authorRole.id, authorPermissions);\n};\n\nconst getDefaultPluginPermissions = ({ isAuthor = false } = {}) => {\n const conditions = isAuthor ? ['admin::is-creator'] : [];\n\n // add plugin permissions for each role\n return [\n { action: 'plugin::upload.read', conditions },\n { action: 'plugin::upload.configure-view' },\n { action: 'plugin::upload.assets.create' },\n { action: 'plugin::upload.assets.update', conditions },\n { action: 'plugin::upload.assets.download' },\n { action: 'plugin::upload.assets.copy-link' },\n ].map(permissionDomain.create);\n};\n\n/** Display a warning if the role superAdmin doesn't exist\n * or if the role is not assigned to at least one user\n */\nconst displayWarningIfNoSuperAdmin = async () => {\n const superAdminRole = await getSuperAdminWithUsersCount();\n const someUsersExists = await getService('user').exists();\n\n if (!superAdminRole) {\n strapi.log.warn(\"Your application doesn't have a super admin role.\");\n } else if (someUsersExists && superAdminRole.usersCount === 0) {\n strapi.log.warn(\"Your application doesn't have a super admin user.\");\n }\n};\n\n/**\n * Assign permissions to a role\n * @param roleId - role Data.ID\n * @param {Array<Permission{action,subject,fields,conditions}>} permissions - permissions to assign to the role\n */\nconst assignPermissions = async (\n roleId: Data.ID,\n permissions: Array<Pick<Permission, 'action' | 'subject' | 'conditions'>> = []\n) => {\n await validatePermissionsExist(permissions);\n\n // Internal actions are not handled by the role service, so any permission\n // with an internal action is filtered out\n const internalActions = getService('permission')\n .actionProvider.values()\n .filter((action) => action.section === 'internal')\n .map((action) => action.actionId);\n\n const superAdmin = await getService('role').getSuperAdmin();\n const isSuperAdmin = superAdmin && superAdmin.id === roleId;\n const assignRole = set('role', roleId);\n\n const permissionsWithRole = permissions\n // Add the role attribute to every permission\n .map(assignRole)\n // Transform each permission into a Permission instance\n // @ts-expect-error - lodash set doesn't resolve the type appropriately\n .map(permissionDomain.create);\n\n const existingPermissions = await getService('permission').findMany({\n where: { role: { id: roleId } },\n populate: ['role'],\n });\n\n const permissionsToAdd = differenceWith(\n arePermissionsEqual,\n permissionsWithRole,\n existingPermissions\n ).filter((permission: Permission) => !internalActions.includes(permission.action));\n\n const permissionsToDelete = differenceWith(\n arePermissionsEqual,\n existingPermissions,\n permissionsWithRole\n ).filter((permission: Permission) => !internalActions.includes(permission.action));\n\n const permissionsToReturn = differenceBy('id', permissionsToDelete, existingPermissions);\n\n if (permissionsToDelete.length > 0) {\n // @ts-expect-error - lodash prop doesn't resolve the type appropriately\n await getService('permission').deleteByIds(permissionsToDelete.map(prop('id')));\n }\n\n if (permissionsToAdd.length > 0) {\n const newPermissions = await addPermissions(roleId, permissionsToAdd);\n permissionsToReturn.push(...newPermissions);\n }\n\n if (!isSuperAdmin && (permissionsToAdd.length || permissionsToDelete.length)) {\n await getService('metrics').sendDidUpdateRolePermissions();\n }\n\n if (permissionsToAdd.length > 0 || permissionsToDelete.length > 0) {\n await getService('api-token-admin').syncPermissionsForRole(roleId);\n }\n\n return permissionsToReturn;\n};\n\nconst addPermissions = async (roleId: Data.ID, permissions: any) => {\n const { conditionProvider, createMany } = getService('permission');\n const { sanitizeConditions } = permissionDomain;\n\n const permissionsWithRole = permissions\n .map(set('role', roleId))\n // @ts-expect-error - refactor domain/permission Condition type, as it's now expecting\n // a string but it should be a Condition interface\n .map(sanitizeConditions(conditionProvider))\n .map(permissionDomain.create);\n\n return createMany(permissionsWithRole);\n};\n\nconst isContentTypeAction = (action: Action) => action.section === CONTENT_TYPE_SECTION;\n\n/**\n * Reset super admin permissions (giving it all permissions)\n */\nconst resetSuperAdminPermissions = async () => {\n const superAdminRole = await getService('role').getSuperAdmin();\n if (!superAdminRole) {\n return;\n }\n\n const permissionService = getService('permission');\n const contentTypeService = getService('content-type');\n\n const allActions = permissionService.actionProvider.values() as Action[];\n\n const contentTypesActions = allActions.filter((action) => isContentTypeAction(action));\n const otherActions = allActions.filter((action) => !isContentTypeAction(action));\n\n // First, get the content-types permissions\n const permissions = contentTypeService.getPermissionsWithNestedFields(\n contentTypesActions\n ) as Permission[];\n\n // Then add every other permission\n const otherPermissions = otherActions.reduce((acc, action) => {\n const { actionId, subjects } = action;\n\n if (isArray(subjects)) {\n acc.push(\n ...subjects.map((subject) => permissionDomain.create({ action: actionId, subject }))\n );\n } else {\n acc.push(permissionDomain.create({ action: actionId }));\n }\n\n return acc;\n }, [] as Permission[]);\n\n permissions.push(...otherPermissions);\n\n const transformedPermissions = (await hooks.willResetSuperAdminPermissions.call(\n permissions\n )) as Permission[];\n\n await assignPermissions(superAdminRole.id, transformedPermissions);\n};\n\n/**\n * Check if a user object includes the super admin role\n */\nconst hasSuperAdminRole = (user: AdminUser): boolean => {\n const roles = _.get(user, 'roles', []) as AdminRole[];\n\n return roles.map(prop('code')).includes(SUPER_ADMIN_CODE);\n};\n\nconst constants = {\n superAdminCode: SUPER_ADMIN_CODE,\n};\n\nexport default {\n hooks,\n sanitizeRole,\n create,\n findOne,\n findOneWithUsersCount,\n find,\n findAllWithUsersCount,\n update,\n exists,\n count,\n deleteByIds,\n getUsersCount,\n getSuperAdmin,\n getSuperAdminWithUsersCount,\n createRolesIfNoneExist,\n displayWarningIfNoSuperAdmin,\n addPermissions,\n hasSuperAdminRole,\n assignPermissions,\n resetSuperAdminPermissions,\n checkRolesIdForDeletion,\n constants,\n};\n"],"names":["SUPER_ADMIN_CODE","CONTENT_TYPE_SECTION","roleConstants","createAsyncSeriesWaterfallHook","hooksUtils","ApplicationError","errors","hooks","willResetSuperAdminPermissions","willValidateUpdatePermissions","ACTIONS","publish","sanitizeRole","omit","COMPARABLE_FIELDS","pickComparableFields","pick","jsonClean","data","JSON","parse","stringify","arePermissionsEqual","p1","p2","action","isEqual","create","attributes","alreadyExists","exists","name","autoGeneratedCode","_","kebabCase","dates","timestampCode","rolesWithCode","code","result","strapi","db","query","eventHub","emit","role","findOne","params","populate","where","findOneWithUsersCount","usersCount","getUsersCount","id","find","findMany","findAllWithUsersCount","roles","get","transform","update","sanitizedAttributes","has","$ne","count","checkRolesIdForDeletion","ids","superAdminRole","getSuperAdmin","arrays","includesString","roleId","deleteByIds","getService","deleteByRolesIds","deletedRoles","deletedRole","delete","push","getSuperAdminWithUsersCount","createRolesIfNoneExist","someRolesExist","actionProvider","allActions","values","contentTypesActions","filter","a","section","description","assignARoleToAll","editorRole","authorRole","nonDisplayedUids","Object","contentTypes","ct","pluginOptions","visible","map","uid","editorPermissions","getPermissionsWithNestedFields","restrictedSubjects","authorPermissions","permission","permissionDomain","conditions","getDefaultPluginPermissions","isAuthor","addPermissions","displayWarningIfNoSuperAdmin","someUsersExists","log","warn","assignPermissions","permissions","validatePermissionsExist","internalActions","actionId","superAdmin","isSuperAdmin","assignRole","set","permissionsWithRole","existingPermissions","permissionsToAdd","differenceWith","includes","permissionsToDelete","permissionsToReturn","differenceBy","length","prop","newPermissions","sendDidUpdateRolePermissions","syncPermissionsForRole","conditionProvider","createMany","sanitizeConditions","isContentTypeAction","resetSuperAdminPermissions","permissionService","contentTypeService","otherActions","otherPermissions","reduce","acc","subjects","isArray","subject","transformedPermissions","call","hasSuperAdminRole","user","constants","superAdminCode"],"mappings":"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"}
|
|
@@ -231,9 +231,13 @@ const jsonClean = (data)=>JSON.parse(JSON.stringify(data));
|
|
|
231
231
|
description: 'Authors can manage the content they have created.'
|
|
232
232
|
});
|
|
233
233
|
// create content-type permissions for each role
|
|
234
|
+
// Exclude non-displayed content types (e.g. plugin::users-permissions.role) from Editor/Author
|
|
235
|
+
// since those types are in explorer.read subjects only for super admin relation reads.
|
|
236
|
+
const nonDisplayedUids = Object.values(strapi.contentTypes).filter((ct)=>ct?.pluginOptions?.['content-manager']?.visible === false).map((ct)=>ct.uid);
|
|
234
237
|
const editorPermissions = getService('content-type').getPermissionsWithNestedFields(contentTypesActions, {
|
|
235
238
|
restrictedSubjects: [
|
|
236
|
-
'plugin::users-permissions.user'
|
|
239
|
+
'plugin::users-permissions.user',
|
|
240
|
+
...nonDisplayedUids
|
|
237
241
|
]
|
|
238
242
|
});
|
|
239
243
|
const authorPermissions = editorPermissions.filter(({ action })=>action !== ACTIONS.publish).map((permission)=>permissionDomain.create({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"role.mjs","sources":["../../../../../server/src/services/role.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */ // TODO: TS - Use database parameters interface when they are ready\n/* eslint-disable @typescript-eslint/default-param-last */\nimport _ from 'lodash';\nimport { set, omit, pick, prop, isArray, differenceWith, differenceBy, isEqual } from 'lodash/fp';\n\nimport { dates, arrays, hooks as hooksUtils, errors } from '@strapi/utils';\nimport type { Data } from '@strapi/types';\n\nimport permissionDomain from '../domain/permission';\nimport type { AdminUser, AdminRole, Permission } from '../../../shared/contracts/shared';\nimport type { Action } from '../domain/action';\n\nimport { validatePermissionsExist } from '../validation/permission';\nimport roleConstants from './constants';\nimport { getService } from '../utils';\n\nconst { SUPER_ADMIN_CODE, CONTENT_TYPE_SECTION } = roleConstants;\n\nconst { createAsyncSeriesWaterfallHook } = hooksUtils;\nconst { ApplicationError } = errors;\n\nconst hooks = {\n willResetSuperAdminPermissions: createAsyncSeriesWaterfallHook(),\n willValidateUpdatePermissions: createAsyncSeriesWaterfallHook(),\n};\n\nconst ACTIONS = {\n publish: 'plugin::content-manager.explorer.publish',\n};\n\n// @ts-expect-error lodash types\nconst sanitizeRole: <T extends object>(obj: T) => Omit<T, 'users' | 'permissions'> = omit([\n 'users',\n 'permissions',\n] as const);\n\nexport type AdminRoleWithUsersCount = AdminRole & { usersCount: number };\n\nconst COMPARABLE_FIELDS = ['conditions', 'properties', 'subject', 'action', 'actionParameters'];\nconst pickComparableFields = pick(COMPARABLE_FIELDS);\n\nconst jsonClean = <T extends object>(data: T): T => JSON.parse(JSON.stringify(data));\n\n/**\n * Compare two permissions\n */\nconst arePermissionsEqual = (p1: Permission, p2: Permission): boolean => {\n if (p1.action === p2.action) {\n return isEqual(jsonClean(pickComparableFields(p1)), jsonClean(pickComparableFields(p2)));\n }\n\n return false;\n};\n\n/**\n * Create and save a role in database\n * @param attributes A partial role object\n */\nconst create = async (attributes: Partial<AdminRole>): Promise<AdminRole> => {\n const alreadyExists = await exists({ name: attributes.name });\n\n if (alreadyExists) {\n throw new ApplicationError(\n `The name must be unique and a role with name \\`${attributes.name}\\` already exists.`\n );\n }\n const autoGeneratedCode = `${_.kebabCase(attributes.name)}-${dates.timestampCode()}`;\n\n const rolesWithCode = {\n ...attributes,\n code: attributes.code || autoGeneratedCode,\n };\n\n const result = await strapi.db.query('admin::role').create({ data: rolesWithCode });\n strapi.eventHub.emit('role.create', { role: sanitizeRole(result) });\n\n return result;\n};\n\n/**\n * Find a role in database\n * @param params query params to find the role\n * @param populate\n */\nconst findOne = (params = {}, populate?: unknown): Promise<AdminRole> => {\n return strapi.db.query('admin::role').findOne({ where: params, populate });\n};\n\n/**\n * Find a role in database with usersCounts\n * @param params query params to find the role\n * @param populate\n */\nconst findOneWithUsersCount = async (\n params = {},\n populate?: unknown\n): Promise<AdminRoleWithUsersCount> => {\n const role = await strapi.db.query('admin::role').findOne({ where: params, populate });\n\n if (role) {\n role.usersCount = await getUsersCount(role.id);\n }\n\n return role;\n};\n\n/**\n * Find roles in database\n * @param params query params to find the roles\n * @param populate\n */\nconst find = (params = {}, populate: unknown): Promise<AdminRole[]> => {\n return strapi.db.query('admin::role').findMany({ where: params, populate });\n};\n\n/**\n * Find all roles in database\n */\nconst findAllWithUsersCount = async (params: any): Promise<AdminRoleWithUsersCount[]> => {\n const roles: AdminRoleWithUsersCount[] = await strapi.db\n .query('admin::role')\n .findMany(strapi.get('query-params').transform('admin::role', params));\n\n for (const role of roles) {\n role.usersCount = await getUsersCount(role.id);\n }\n\n return roles;\n};\n\n/**\n * Update a role in database\n * @param params query params to find the role to update\n * @param attributes A partial role object\n */\nconst update = async (params: any, attributes: Partial<AdminRole>): Promise<AdminRole> => {\n const sanitizedAttributes = _.omit(attributes, ['code']);\n\n if (_.has(params, 'id') && _.has(sanitizedAttributes, 'name')) {\n const alreadyExists = await exists({\n name: sanitizedAttributes.name,\n id: { $ne: params.id },\n });\n if (alreadyExists) {\n throw new ApplicationError(\n `The name must be unique and a role with name \\`${sanitizedAttributes.name}\\` already exists.`\n );\n }\n }\n\n const result = await strapi.db\n .query('admin::role')\n .update({ where: params, data: sanitizedAttributes });\n\n strapi.eventHub.emit('role.update', { role: sanitizeRole(result) });\n\n return result;\n};\n\n/**\n * Check if a role exists in database\n * @param params query params to find the role\n */\nconst exists = async (params = {} as unknown): Promise<boolean> => {\n const count = await strapi.db.query('admin::role').count({ where: params });\n return count > 0;\n};\n\n/**\n * Count the number of roles based on search params\n * @param params params used for the query\n */\nconst count = async (params = {} as any): Promise<number> => {\n return strapi.db.query('admin::role').count(params);\n};\n\n/**\n * Check if the given roles id can be deleted safely, throw otherwise\n * @param ids\n */\nconst checkRolesIdForDeletion = async (ids = [] as Data.ID[]) => {\n const superAdminRole = await getSuperAdmin();\n\n if (superAdminRole && arrays.includesString(ids, superAdminRole.id)) {\n throw new ApplicationError('You cannot delete the super admin role');\n }\n\n for (const roleId of ids) {\n const usersCount = await getUsersCount(roleId);\n if (usersCount !== 0) {\n throw new ApplicationError('Some roles are still assigned to some users');\n }\n }\n};\n\n/**\n * Delete roles in database if they have no user assigned\n * @param ids query params to find the roles\n */\nconst deleteByIds = async (ids = [] as Data.ID[]): Promise<AdminRole[]> => {\n await checkRolesIdForDeletion(ids);\n\n await getService('permission').deleteByRolesIds(ids);\n\n const deletedRoles: AdminRole[] = [];\n for (const id of ids) {\n const deletedRole = await strapi.db.query('admin::role').delete({ where: { id } });\n\n if (deletedRole) {\n strapi.eventHub.emit('role.delete', { role: deletedRole });\n deletedRoles.push(deletedRole);\n }\n }\n\n return deletedRoles;\n};\n\n/** Count the number of users for some roles\n */\nconst getUsersCount = async (roleId: Data.ID): Promise<number> => {\n return strapi.db.query('admin::user').count({ where: { roles: { id: roleId } } });\n};\n\n/** Returns admin role\n */\nconst getSuperAdmin = (): Promise<AdminRole | undefined> => findOne({ code: SUPER_ADMIN_CODE });\n\n/** Returns admin role with userCount\n * @returns {Promise<role>}\n */\nconst getSuperAdminWithUsersCount = () => findOneWithUsersCount({ code: SUPER_ADMIN_CODE });\n\n/** Create superAdmin, Author and Editor role is no role already exist\n */\nconst createRolesIfNoneExist = async () => {\n const someRolesExist = await exists();\n if (someRolesExist) {\n return;\n }\n\n const { actionProvider } = getService('permission');\n\n const allActions = actionProvider.values();\n const contentTypesActions = allActions.filter((a) => a.section === 'contentTypes');\n\n // create 3 roles\n const superAdminRole = await create({\n name: 'Super Admin',\n code: 'strapi-super-admin',\n description: 'Super Admins can access and manage all features and settings.',\n });\n\n await getService('user').assignARoleToAll(superAdminRole.id);\n\n const editorRole = await create({\n name: 'Editor',\n code: 'strapi-editor',\n description: 'Editors can manage and publish contents including those of other users.',\n });\n\n const authorRole = await create({\n name: 'Author',\n code: 'strapi-author',\n description: 'Authors can manage the content they have created.',\n });\n\n // create content-type permissions for each role\n const editorPermissions = getService('content-type').getPermissionsWithNestedFields(\n contentTypesActions,\n {\n restrictedSubjects: ['plugin::users-permissions.user'],\n }\n );\n\n const authorPermissions = editorPermissions\n .filter(({ action }: any) => action !== ACTIONS.publish)\n .map((permission: any) =>\n permissionDomain.create({ ...permission, conditions: ['admin::is-creator'] })\n );\n\n editorPermissions.push(...getDefaultPluginPermissions());\n authorPermissions.push(...getDefaultPluginPermissions({ isAuthor: true }));\n\n // assign permissions to roles\n await addPermissions(editorRole.id, editorPermissions);\n await addPermissions(authorRole.id, authorPermissions);\n};\n\nconst getDefaultPluginPermissions = ({ isAuthor = false } = {}) => {\n const conditions = isAuthor ? ['admin::is-creator'] : [];\n\n // add plugin permissions for each role\n return [\n { action: 'plugin::upload.read', conditions },\n { action: 'plugin::upload.configure-view' },\n { action: 'plugin::upload.assets.create' },\n { action: 'plugin::upload.assets.update', conditions },\n { action: 'plugin::upload.assets.download' },\n { action: 'plugin::upload.assets.copy-link' },\n ].map(permissionDomain.create);\n};\n\n/** Display a warning if the role superAdmin doesn't exist\n * or if the role is not assigned to at least one user\n */\nconst displayWarningIfNoSuperAdmin = async () => {\n const superAdminRole = await getSuperAdminWithUsersCount();\n const someUsersExists = await getService('user').exists();\n\n if (!superAdminRole) {\n strapi.log.warn(\"Your application doesn't have a super admin role.\");\n } else if (someUsersExists && superAdminRole.usersCount === 0) {\n strapi.log.warn(\"Your application doesn't have a super admin user.\");\n }\n};\n\n/**\n * Assign permissions to a role\n * @param roleId - role Data.ID\n * @param {Array<Permission{action,subject,fields,conditions}>} permissions - permissions to assign to the role\n */\nconst assignPermissions = async (\n roleId: Data.ID,\n permissions: Array<Pick<Permission, 'action' | 'subject' | 'conditions'>> = []\n) => {\n await validatePermissionsExist(permissions);\n\n // Internal actions are not handled by the role service, so any permission\n // with an internal action is filtered out\n const internalActions = getService('permission')\n .actionProvider.values()\n .filter((action) => action.section === 'internal')\n .map((action) => action.actionId);\n\n const superAdmin = await getService('role').getSuperAdmin();\n const isSuperAdmin = superAdmin && superAdmin.id === roleId;\n const assignRole = set('role', roleId);\n\n const permissionsWithRole = permissions\n // Add the role attribute to every permission\n .map(assignRole)\n // Transform each permission into a Permission instance\n // @ts-expect-error - lodash set doesn't resolve the type appropriately\n .map(permissionDomain.create);\n\n const existingPermissions = await getService('permission').findMany({\n where: { role: { id: roleId } },\n populate: ['role'],\n });\n\n const permissionsToAdd = differenceWith(\n arePermissionsEqual,\n permissionsWithRole,\n existingPermissions\n ).filter((permission: Permission) => !internalActions.includes(permission.action));\n\n const permissionsToDelete = differenceWith(\n arePermissionsEqual,\n existingPermissions,\n permissionsWithRole\n ).filter((permission: Permission) => !internalActions.includes(permission.action));\n\n const permissionsToReturn = differenceBy('id', permissionsToDelete, existingPermissions);\n\n if (permissionsToDelete.length > 0) {\n // @ts-expect-error - lodash prop doesn't resolve the type appropriately\n await getService('permission').deleteByIds(permissionsToDelete.map(prop('id')));\n }\n\n if (permissionsToAdd.length > 0) {\n const newPermissions = await addPermissions(roleId, permissionsToAdd);\n permissionsToReturn.push(...newPermissions);\n }\n\n if (!isSuperAdmin && (permissionsToAdd.length || permissionsToDelete.length)) {\n await getService('metrics').sendDidUpdateRolePermissions();\n }\n\n if (permissionsToAdd.length > 0 || permissionsToDelete.length > 0) {\n await getService('api-token-admin').syncPermissionsForRole(roleId);\n }\n\n return permissionsToReturn;\n};\n\nconst addPermissions = async (roleId: Data.ID, permissions: any) => {\n const { conditionProvider, createMany } = getService('permission');\n const { sanitizeConditions } = permissionDomain;\n\n const permissionsWithRole = permissions\n .map(set('role', roleId))\n // @ts-expect-error - refactor domain/permission Condition type, as it's now expecting\n // a string but it should be a Condition interface\n .map(sanitizeConditions(conditionProvider))\n .map(permissionDomain.create);\n\n return createMany(permissionsWithRole);\n};\n\nconst isContentTypeAction = (action: Action) => action.section === CONTENT_TYPE_SECTION;\n\n/**\n * Reset super admin permissions (giving it all permissions)\n */\nconst resetSuperAdminPermissions = async () => {\n const superAdminRole = await getService('role').getSuperAdmin();\n if (!superAdminRole) {\n return;\n }\n\n const permissionService = getService('permission');\n const contentTypeService = getService('content-type');\n\n const allActions = permissionService.actionProvider.values() as Action[];\n\n const contentTypesActions = allActions.filter((action) => isContentTypeAction(action));\n const otherActions = allActions.filter((action) => !isContentTypeAction(action));\n\n // First, get the content-types permissions\n const permissions = contentTypeService.getPermissionsWithNestedFields(\n contentTypesActions\n ) as Permission[];\n\n // Then add every other permission\n const otherPermissions = otherActions.reduce((acc, action) => {\n const { actionId, subjects } = action;\n\n if (isArray(subjects)) {\n acc.push(\n ...subjects.map((subject) => permissionDomain.create({ action: actionId, subject }))\n );\n } else {\n acc.push(permissionDomain.create({ action: actionId }));\n }\n\n return acc;\n }, [] as Permission[]);\n\n permissions.push(...otherPermissions);\n\n const transformedPermissions = (await hooks.willResetSuperAdminPermissions.call(\n permissions\n )) as Permission[];\n\n await assignPermissions(superAdminRole.id, transformedPermissions);\n};\n\n/**\n * Check if a user object includes the super admin role\n */\nconst hasSuperAdminRole = (user: AdminUser): boolean => {\n const roles = _.get(user, 'roles', []) as AdminRole[];\n\n return roles.map(prop('code')).includes(SUPER_ADMIN_CODE);\n};\n\nconst constants = {\n superAdminCode: SUPER_ADMIN_CODE,\n};\n\nexport default {\n hooks,\n sanitizeRole,\n create,\n findOne,\n findOneWithUsersCount,\n find,\n findAllWithUsersCount,\n update,\n exists,\n count,\n deleteByIds,\n getUsersCount,\n getSuperAdmin,\n getSuperAdminWithUsersCount,\n createRolesIfNoneExist,\n displayWarningIfNoSuperAdmin,\n addPermissions,\n hasSuperAdminRole,\n assignPermissions,\n resetSuperAdminPermissions,\n checkRolesIdForDeletion,\n constants,\n};\n"],"names":["SUPER_ADMIN_CODE","CONTENT_TYPE_SECTION","roleConstants","createAsyncSeriesWaterfallHook","hooksUtils","ApplicationError","errors","hooks","willResetSuperAdminPermissions","willValidateUpdatePermissions","ACTIONS","publish","sanitizeRole","omit","COMPARABLE_FIELDS","pickComparableFields","pick","jsonClean","data","JSON","parse","stringify","arePermissionsEqual","p1","p2","action","isEqual","create","attributes","alreadyExists","exists","name","autoGeneratedCode","_","kebabCase","dates","timestampCode","rolesWithCode","code","result","strapi","db","query","eventHub","emit","role","findOne","params","populate","where","findOneWithUsersCount","usersCount","getUsersCount","id","find","findMany","findAllWithUsersCount","roles","get","transform","update","sanitizedAttributes","has","$ne","count","checkRolesIdForDeletion","ids","superAdminRole","getSuperAdmin","arrays","includesString","roleId","deleteByIds","getService","deleteByRolesIds","deletedRoles","deletedRole","delete","push","getSuperAdminWithUsersCount","createRolesIfNoneExist","someRolesExist","actionProvider","allActions","values","contentTypesActions","filter","a","section","description","assignARoleToAll","editorRole","authorRole","editorPermissions","getPermissionsWithNestedFields","restrictedSubjects","authorPermissions","map","permission","permissionDomain","conditions","getDefaultPluginPermissions","isAuthor","addPermissions","displayWarningIfNoSuperAdmin","someUsersExists","log","warn","assignPermissions","permissions","validatePermissionsExist","internalActions","actionId","superAdmin","isSuperAdmin","assignRole","set","permissionsWithRole","existingPermissions","permissionsToAdd","differenceWith","includes","permissionsToDelete","permissionsToReturn","differenceBy","length","prop","newPermissions","sendDidUpdateRolePermissions","syncPermissionsForRole","conditionProvider","createMany","sanitizeConditions","isContentTypeAction","resetSuperAdminPermissions","permissionService","contentTypeService","otherActions","otherPermissions","reduce","acc","subjects","isArray","subject","transformedPermissions","call","hasSuperAdminRole","user","constants","superAdminCode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"role.mjs","sources":["../../../../../server/src/services/role.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */ // TODO: TS - Use database parameters interface when they are ready\n/* eslint-disable @typescript-eslint/default-param-last */\nimport _ from 'lodash';\nimport { set, omit, pick, prop, isArray, differenceWith, differenceBy, isEqual } from 'lodash/fp';\n\nimport { dates, arrays, hooks as hooksUtils, errors } from '@strapi/utils';\nimport type { Data } from '@strapi/types';\n\nimport permissionDomain from '../domain/permission';\nimport type { AdminUser, AdminRole, Permission } from '../../../shared/contracts/shared';\nimport type { Action } from '../domain/action';\n\nimport { validatePermissionsExist } from '../validation/permission';\nimport roleConstants from './constants';\nimport { getService } from '../utils';\n\nconst { SUPER_ADMIN_CODE, CONTENT_TYPE_SECTION } = roleConstants;\n\nconst { createAsyncSeriesWaterfallHook } = hooksUtils;\nconst { ApplicationError } = errors;\n\nconst hooks = {\n willResetSuperAdminPermissions: createAsyncSeriesWaterfallHook(),\n willValidateUpdatePermissions: createAsyncSeriesWaterfallHook(),\n};\n\nconst ACTIONS = {\n publish: 'plugin::content-manager.explorer.publish',\n};\n\n// @ts-expect-error lodash types\nconst sanitizeRole: <T extends object>(obj: T) => Omit<T, 'users' | 'permissions'> = omit([\n 'users',\n 'permissions',\n] as const);\n\nexport type AdminRoleWithUsersCount = AdminRole & { usersCount: number };\n\nconst COMPARABLE_FIELDS = ['conditions', 'properties', 'subject', 'action', 'actionParameters'];\nconst pickComparableFields = pick(COMPARABLE_FIELDS);\n\nconst jsonClean = <T extends object>(data: T): T => JSON.parse(JSON.stringify(data));\n\n/**\n * Compare two permissions\n */\nconst arePermissionsEqual = (p1: Permission, p2: Permission): boolean => {\n if (p1.action === p2.action) {\n return isEqual(jsonClean(pickComparableFields(p1)), jsonClean(pickComparableFields(p2)));\n }\n\n return false;\n};\n\n/**\n * Create and save a role in database\n * @param attributes A partial role object\n */\nconst create = async (attributes: Partial<AdminRole>): Promise<AdminRole> => {\n const alreadyExists = await exists({ name: attributes.name });\n\n if (alreadyExists) {\n throw new ApplicationError(\n `The name must be unique and a role with name \\`${attributes.name}\\` already exists.`\n );\n }\n const autoGeneratedCode = `${_.kebabCase(attributes.name)}-${dates.timestampCode()}`;\n\n const rolesWithCode = {\n ...attributes,\n code: attributes.code || autoGeneratedCode,\n };\n\n const result = await strapi.db.query('admin::role').create({ data: rolesWithCode });\n strapi.eventHub.emit('role.create', { role: sanitizeRole(result) });\n\n return result;\n};\n\n/**\n * Find a role in database\n * @param params query params to find the role\n * @param populate\n */\nconst findOne = (params = {}, populate?: unknown): Promise<AdminRole> => {\n return strapi.db.query('admin::role').findOne({ where: params, populate });\n};\n\n/**\n * Find a role in database with usersCounts\n * @param params query params to find the role\n * @param populate\n */\nconst findOneWithUsersCount = async (\n params = {},\n populate?: unknown\n): Promise<AdminRoleWithUsersCount> => {\n const role = await strapi.db.query('admin::role').findOne({ where: params, populate });\n\n if (role) {\n role.usersCount = await getUsersCount(role.id);\n }\n\n return role;\n};\n\n/**\n * Find roles in database\n * @param params query params to find the roles\n * @param populate\n */\nconst find = (params = {}, populate: unknown): Promise<AdminRole[]> => {\n return strapi.db.query('admin::role').findMany({ where: params, populate });\n};\n\n/**\n * Find all roles in database\n */\nconst findAllWithUsersCount = async (params: any): Promise<AdminRoleWithUsersCount[]> => {\n const roles: AdminRoleWithUsersCount[] = await strapi.db\n .query('admin::role')\n .findMany(strapi.get('query-params').transform('admin::role', params));\n\n for (const role of roles) {\n role.usersCount = await getUsersCount(role.id);\n }\n\n return roles;\n};\n\n/**\n * Update a role in database\n * @param params query params to find the role to update\n * @param attributes A partial role object\n */\nconst update = async (params: any, attributes: Partial<AdminRole>): Promise<AdminRole> => {\n const sanitizedAttributes = _.omit(attributes, ['code']);\n\n if (_.has(params, 'id') && _.has(sanitizedAttributes, 'name')) {\n const alreadyExists = await exists({\n name: sanitizedAttributes.name,\n id: { $ne: params.id },\n });\n if (alreadyExists) {\n throw new ApplicationError(\n `The name must be unique and a role with name \\`${sanitizedAttributes.name}\\` already exists.`\n );\n }\n }\n\n const result = await strapi.db\n .query('admin::role')\n .update({ where: params, data: sanitizedAttributes });\n\n strapi.eventHub.emit('role.update', { role: sanitizeRole(result) });\n\n return result;\n};\n\n/**\n * Check if a role exists in database\n * @param params query params to find the role\n */\nconst exists = async (params = {} as unknown): Promise<boolean> => {\n const count = await strapi.db.query('admin::role').count({ where: params });\n return count > 0;\n};\n\n/**\n * Count the number of roles based on search params\n * @param params params used for the query\n */\nconst count = async (params = {} as any): Promise<number> => {\n return strapi.db.query('admin::role').count(params);\n};\n\n/**\n * Check if the given roles id can be deleted safely, throw otherwise\n * @param ids\n */\nconst checkRolesIdForDeletion = async (ids = [] as Data.ID[]) => {\n const superAdminRole = await getSuperAdmin();\n\n if (superAdminRole && arrays.includesString(ids, superAdminRole.id)) {\n throw new ApplicationError('You cannot delete the super admin role');\n }\n\n for (const roleId of ids) {\n const usersCount = await getUsersCount(roleId);\n if (usersCount !== 0) {\n throw new ApplicationError('Some roles are still assigned to some users');\n }\n }\n};\n\n/**\n * Delete roles in database if they have no user assigned\n * @param ids query params to find the roles\n */\nconst deleteByIds = async (ids = [] as Data.ID[]): Promise<AdminRole[]> => {\n await checkRolesIdForDeletion(ids);\n\n await getService('permission').deleteByRolesIds(ids);\n\n const deletedRoles: AdminRole[] = [];\n for (const id of ids) {\n const deletedRole = await strapi.db.query('admin::role').delete({ where: { id } });\n\n if (deletedRole) {\n strapi.eventHub.emit('role.delete', { role: deletedRole });\n deletedRoles.push(deletedRole);\n }\n }\n\n return deletedRoles;\n};\n\n/** Count the number of users for some roles\n */\nconst getUsersCount = async (roleId: Data.ID): Promise<number> => {\n return strapi.db.query('admin::user').count({ where: { roles: { id: roleId } } });\n};\n\n/** Returns admin role\n */\nconst getSuperAdmin = (): Promise<AdminRole | undefined> => findOne({ code: SUPER_ADMIN_CODE });\n\n/** Returns admin role with userCount\n * @returns {Promise<role>}\n */\nconst getSuperAdminWithUsersCount = () => findOneWithUsersCount({ code: SUPER_ADMIN_CODE });\n\n/** Create superAdmin, Author and Editor role is no role already exist\n */\nconst createRolesIfNoneExist = async () => {\n const someRolesExist = await exists();\n if (someRolesExist) {\n return;\n }\n\n const { actionProvider } = getService('permission');\n\n const allActions = actionProvider.values();\n const contentTypesActions = allActions.filter((a) => a.section === 'contentTypes');\n\n // create 3 roles\n const superAdminRole = await create({\n name: 'Super Admin',\n code: 'strapi-super-admin',\n description: 'Super Admins can access and manage all features and settings.',\n });\n\n await getService('user').assignARoleToAll(superAdminRole.id);\n\n const editorRole = await create({\n name: 'Editor',\n code: 'strapi-editor',\n description: 'Editors can manage and publish contents including those of other users.',\n });\n\n const authorRole = await create({\n name: 'Author',\n code: 'strapi-author',\n description: 'Authors can manage the content they have created.',\n });\n\n // create content-type permissions for each role\n // Exclude non-displayed content types (e.g. plugin::users-permissions.role) from Editor/Author\n // since those types are in explorer.read subjects only for super admin relation reads.\n const nonDisplayedUids = Object.values(strapi.contentTypes as Record<string, any>)\n .filter((ct) => ct?.pluginOptions?.['content-manager']?.visible === false)\n .map((ct) => ct.uid as string);\n\n const editorPermissions = getService('content-type').getPermissionsWithNestedFields(\n contentTypesActions,\n {\n restrictedSubjects: ['plugin::users-permissions.user', ...nonDisplayedUids],\n }\n );\n\n const authorPermissions = editorPermissions\n .filter(({ action }: any) => action !== ACTIONS.publish)\n .map((permission: any) =>\n permissionDomain.create({ ...permission, conditions: ['admin::is-creator'] })\n );\n\n editorPermissions.push(...getDefaultPluginPermissions());\n authorPermissions.push(...getDefaultPluginPermissions({ isAuthor: true }));\n\n // assign permissions to roles\n await addPermissions(editorRole.id, editorPermissions);\n await addPermissions(authorRole.id, authorPermissions);\n};\n\nconst getDefaultPluginPermissions = ({ isAuthor = false } = {}) => {\n const conditions = isAuthor ? ['admin::is-creator'] : [];\n\n // add plugin permissions for each role\n return [\n { action: 'plugin::upload.read', conditions },\n { action: 'plugin::upload.configure-view' },\n { action: 'plugin::upload.assets.create' },\n { action: 'plugin::upload.assets.update', conditions },\n { action: 'plugin::upload.assets.download' },\n { action: 'plugin::upload.assets.copy-link' },\n ].map(permissionDomain.create);\n};\n\n/** Display a warning if the role superAdmin doesn't exist\n * or if the role is not assigned to at least one user\n */\nconst displayWarningIfNoSuperAdmin = async () => {\n const superAdminRole = await getSuperAdminWithUsersCount();\n const someUsersExists = await getService('user').exists();\n\n if (!superAdminRole) {\n strapi.log.warn(\"Your application doesn't have a super admin role.\");\n } else if (someUsersExists && superAdminRole.usersCount === 0) {\n strapi.log.warn(\"Your application doesn't have a super admin user.\");\n }\n};\n\n/**\n * Assign permissions to a role\n * @param roleId - role Data.ID\n * @param {Array<Permission{action,subject,fields,conditions}>} permissions - permissions to assign to the role\n */\nconst assignPermissions = async (\n roleId: Data.ID,\n permissions: Array<Pick<Permission, 'action' | 'subject' | 'conditions'>> = []\n) => {\n await validatePermissionsExist(permissions);\n\n // Internal actions are not handled by the role service, so any permission\n // with an internal action is filtered out\n const internalActions = getService('permission')\n .actionProvider.values()\n .filter((action) => action.section === 'internal')\n .map((action) => action.actionId);\n\n const superAdmin = await getService('role').getSuperAdmin();\n const isSuperAdmin = superAdmin && superAdmin.id === roleId;\n const assignRole = set('role', roleId);\n\n const permissionsWithRole = permissions\n // Add the role attribute to every permission\n .map(assignRole)\n // Transform each permission into a Permission instance\n // @ts-expect-error - lodash set doesn't resolve the type appropriately\n .map(permissionDomain.create);\n\n const existingPermissions = await getService('permission').findMany({\n where: { role: { id: roleId } },\n populate: ['role'],\n });\n\n const permissionsToAdd = differenceWith(\n arePermissionsEqual,\n permissionsWithRole,\n existingPermissions\n ).filter((permission: Permission) => !internalActions.includes(permission.action));\n\n const permissionsToDelete = differenceWith(\n arePermissionsEqual,\n existingPermissions,\n permissionsWithRole\n ).filter((permission: Permission) => !internalActions.includes(permission.action));\n\n const permissionsToReturn = differenceBy('id', permissionsToDelete, existingPermissions);\n\n if (permissionsToDelete.length > 0) {\n // @ts-expect-error - lodash prop doesn't resolve the type appropriately\n await getService('permission').deleteByIds(permissionsToDelete.map(prop('id')));\n }\n\n if (permissionsToAdd.length > 0) {\n const newPermissions = await addPermissions(roleId, permissionsToAdd);\n permissionsToReturn.push(...newPermissions);\n }\n\n if (!isSuperAdmin && (permissionsToAdd.length || permissionsToDelete.length)) {\n await getService('metrics').sendDidUpdateRolePermissions();\n }\n\n if (permissionsToAdd.length > 0 || permissionsToDelete.length > 0) {\n await getService('api-token-admin').syncPermissionsForRole(roleId);\n }\n\n return permissionsToReturn;\n};\n\nconst addPermissions = async (roleId: Data.ID, permissions: any) => {\n const { conditionProvider, createMany } = getService('permission');\n const { sanitizeConditions } = permissionDomain;\n\n const permissionsWithRole = permissions\n .map(set('role', roleId))\n // @ts-expect-error - refactor domain/permission Condition type, as it's now expecting\n // a string but it should be a Condition interface\n .map(sanitizeConditions(conditionProvider))\n .map(permissionDomain.create);\n\n return createMany(permissionsWithRole);\n};\n\nconst isContentTypeAction = (action: Action) => action.section === CONTENT_TYPE_SECTION;\n\n/**\n * Reset super admin permissions (giving it all permissions)\n */\nconst resetSuperAdminPermissions = async () => {\n const superAdminRole = await getService('role').getSuperAdmin();\n if (!superAdminRole) {\n return;\n }\n\n const permissionService = getService('permission');\n const contentTypeService = getService('content-type');\n\n const allActions = permissionService.actionProvider.values() as Action[];\n\n const contentTypesActions = allActions.filter((action) => isContentTypeAction(action));\n const otherActions = allActions.filter((action) => !isContentTypeAction(action));\n\n // First, get the content-types permissions\n const permissions = contentTypeService.getPermissionsWithNestedFields(\n contentTypesActions\n ) as Permission[];\n\n // Then add every other permission\n const otherPermissions = otherActions.reduce((acc, action) => {\n const { actionId, subjects } = action;\n\n if (isArray(subjects)) {\n acc.push(\n ...subjects.map((subject) => permissionDomain.create({ action: actionId, subject }))\n );\n } else {\n acc.push(permissionDomain.create({ action: actionId }));\n }\n\n return acc;\n }, [] as Permission[]);\n\n permissions.push(...otherPermissions);\n\n const transformedPermissions = (await hooks.willResetSuperAdminPermissions.call(\n permissions\n )) as Permission[];\n\n await assignPermissions(superAdminRole.id, transformedPermissions);\n};\n\n/**\n * Check if a user object includes the super admin role\n */\nconst hasSuperAdminRole = (user: AdminUser): boolean => {\n const roles = _.get(user, 'roles', []) as AdminRole[];\n\n return roles.map(prop('code')).includes(SUPER_ADMIN_CODE);\n};\n\nconst constants = {\n superAdminCode: SUPER_ADMIN_CODE,\n};\n\nexport default {\n hooks,\n sanitizeRole,\n create,\n findOne,\n findOneWithUsersCount,\n find,\n findAllWithUsersCount,\n update,\n exists,\n count,\n deleteByIds,\n getUsersCount,\n getSuperAdmin,\n getSuperAdminWithUsersCount,\n createRolesIfNoneExist,\n displayWarningIfNoSuperAdmin,\n addPermissions,\n hasSuperAdminRole,\n assignPermissions,\n resetSuperAdminPermissions,\n checkRolesIdForDeletion,\n constants,\n};\n"],"names":["SUPER_ADMIN_CODE","CONTENT_TYPE_SECTION","roleConstants","createAsyncSeriesWaterfallHook","hooksUtils","ApplicationError","errors","hooks","willResetSuperAdminPermissions","willValidateUpdatePermissions","ACTIONS","publish","sanitizeRole","omit","COMPARABLE_FIELDS","pickComparableFields","pick","jsonClean","data","JSON","parse","stringify","arePermissionsEqual","p1","p2","action","isEqual","create","attributes","alreadyExists","exists","name","autoGeneratedCode","_","kebabCase","dates","timestampCode","rolesWithCode","code","result","strapi","db","query","eventHub","emit","role","findOne","params","populate","where","findOneWithUsersCount","usersCount","getUsersCount","id","find","findMany","findAllWithUsersCount","roles","get","transform","update","sanitizedAttributes","has","$ne","count","checkRolesIdForDeletion","ids","superAdminRole","getSuperAdmin","arrays","includesString","roleId","deleteByIds","getService","deleteByRolesIds","deletedRoles","deletedRole","delete","push","getSuperAdminWithUsersCount","createRolesIfNoneExist","someRolesExist","actionProvider","allActions","values","contentTypesActions","filter","a","section","description","assignARoleToAll","editorRole","authorRole","nonDisplayedUids","Object","contentTypes","ct","pluginOptions","visible","map","uid","editorPermissions","getPermissionsWithNestedFields","restrictedSubjects","authorPermissions","permission","permissionDomain","conditions","getDefaultPluginPermissions","isAuthor","addPermissions","displayWarningIfNoSuperAdmin","someUsersExists","log","warn","assignPermissions","permissions","validatePermissionsExist","internalActions","actionId","superAdmin","isSuperAdmin","assignRole","set","permissionsWithRole","existingPermissions","permissionsToAdd","differenceWith","includes","permissionsToDelete","permissionsToReturn","differenceBy","length","prop","newPermissions","sendDidUpdateRolePermissions","syncPermissionsForRole","conditionProvider","createMany","sanitizeConditions","isContentTypeAction","resetSuperAdminPermissions","permissionService","contentTypeService","otherActions","otherPermissions","reduce","acc","subjects","isArray","subject","transformedPermissions","call","hasSuperAdminRole","user","constants","superAdminCode"],"mappings":"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"}
|
|
@@ -22,13 +22,17 @@ const email = utils.yup.string().email().lowercase();
|
|
|
22
22
|
const firstname = utils.yup.string().trim().min(1);
|
|
23
23
|
const lastname = utils.yup.string();
|
|
24
24
|
const username = utils.yup.string().min(1);
|
|
25
|
-
const password = utils.yup.string().min(8)
|
|
25
|
+
const password = utils.yup.string().min(8)// eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder
|
|
26
|
+
.test('required-byte-size', '${path} must be less than 73 bytes', function checkByteSize(value) {
|
|
26
27
|
if (!value) return true;
|
|
27
28
|
const byteSize = new TextEncoder().encode(value).length;
|
|
28
29
|
return byteSize <= 72;
|
|
29
|
-
})
|
|
30
|
+
})// eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder
|
|
31
|
+
.matches(/[a-z]/, '${path} must contain at least one lowercase character')// eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder
|
|
32
|
+
.matches(/[A-Z]/, '${path} must contain at least one uppercase character')// eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder
|
|
33
|
+
.matches(/\d/, '${path} must contain at least one number');
|
|
30
34
|
const roles = utils.yup.array(utils.yup.strapiID()).min(1);
|
|
31
|
-
const isAPluginName = utils.yup.string().test('is-a-plugin-name', 'is not a plugin name', function(value) {
|
|
35
|
+
const isAPluginName = utils.yup.string().test('is-a-plugin-name', 'is not a plugin name', function checkPluginName(value) {
|
|
32
36
|
return [
|
|
33
37
|
undefined,
|
|
34
38
|
'admin',
|
|
@@ -38,7 +42,7 @@ const isAPluginName = utils.yup.string().test('is-a-plugin-name', 'is not a plug
|
|
|
38
42
|
message: `${this.path} is not an existing plugin`
|
|
39
43
|
});
|
|
40
44
|
});
|
|
41
|
-
utils.yup.array().of(utils.yup.string()).test('is-an-array-of-conditions', 'is not a plugin name', function(value) {
|
|
45
|
+
utils.yup.array().of(utils.yup.string()).test('is-an-array-of-conditions', 'is not a plugin name', function checkConditionNames(value) {
|
|
42
46
|
const ids = strapi.service('admin::permission').conditionProvider.keys();
|
|
43
47
|
return ___default.default.isUndefined(value) || ___default.default.difference(value, ids).length === 0 ? true : this.createError({
|
|
44
48
|
path: this.path,
|
|
@@ -47,25 +51,27 @@ utils.yup.array().of(utils.yup.string()).test('is-an-array-of-conditions', 'is n
|
|
|
47
51
|
});
|
|
48
52
|
const permissionsAreEquals = (a, b)=>a.action === b.action && (a.subject === b.subject || ___default.default.isNil(a.subject) && ___default.default.isNil(b.subject));
|
|
49
53
|
const checkNoDuplicatedPermissions = (permissions)=>!Array.isArray(permissions) || permissions.every((permA, i)=>permissions.slice(i + 1).every((permB)=>!permissionsAreEquals(permA, permB)));
|
|
50
|
-
const checkNilFields = (action)=>function(fields) {
|
|
54
|
+
const checkNilFields = (action)=>function checkNilActionFields(fields) {
|
|
51
55
|
// If the parent has no action field, then we ignore this test
|
|
52
56
|
if (fp.isNil(action)) {
|
|
53
57
|
return true;
|
|
54
58
|
}
|
|
55
59
|
return index.appliesToProperty('fields', action) || fp.isNil(fields);
|
|
56
60
|
};
|
|
57
|
-
const fieldsPropertyValidation = (action)=>utils.yup.array().of(utils.yup.string()).nullable().test('field-nested', 'Fields format are incorrect (bad nesting).', checkFieldsAreCorrectlyNested).test('field-nested', 'Fields format are incorrect (duplicates).', checkFieldsDontHaveDuplicates).test('fields-restriction',
|
|
61
|
+
const fieldsPropertyValidation = (action)=>utils.yup.array().of(utils.yup.string()).nullable().test('field-nested', 'Fields format are incorrect (bad nesting).', checkFieldsAreCorrectlyNested).test('field-nested', 'Fields format are incorrect (duplicates).', checkFieldsDontHaveDuplicates).test('fields-restriction', // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder
|
|
62
|
+
'The permission at ${path} must have fields set to null or undefined', // @ts-expect-error yup types
|
|
58
63
|
checkNilFields(action));
|
|
59
64
|
const permission = utils.yup.object().shape({
|
|
60
|
-
action: utils.yup.string().required().test('action-validity', 'action is not an existing permission action', function(actionId) {
|
|
65
|
+
action: utils.yup.string().required().test('action-validity', 'action is not an existing permission action', function checkActionValidity(actionId) {
|
|
61
66
|
// If the action field is Nil, ignore the test and let the required check handle the error
|
|
62
67
|
if (fp.isNil(actionId)) {
|
|
63
68
|
return true;
|
|
64
69
|
}
|
|
65
|
-
|
|
70
|
+
const action = getActionFromProvider(actionId);
|
|
71
|
+
return action !== undefined && action !== null;
|
|
66
72
|
}),
|
|
67
73
|
actionParameters: utils.yup.object().nullable(),
|
|
68
|
-
subject: utils.yup.string().nullable().test('subject-validity', 'Invalid subject submitted', function(subject) {
|
|
74
|
+
subject: utils.yup.string().nullable().test('subject-validity', 'Invalid subject submitted', function checkSubjectValidity(subject) {
|
|
69
75
|
// @ts-expect-error yup types
|
|
70
76
|
const action = getActionFromProvider(this.options.parent.action);
|
|
71
77
|
if (!action) {
|
|
@@ -79,7 +85,8 @@ const permission = utils.yup.object().shape({
|
|
|
79
85
|
}
|
|
80
86
|
return false;
|
|
81
87
|
}),
|
|
82
|
-
properties: utils.yup.object().test('properties-structure',
|
|
88
|
+
properties: utils.yup.object().test('properties-structure', // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder
|
|
89
|
+
'Invalid property set at ${path}', function checkPropertiesStructure(properties) {
|
|
83
90
|
// @ts-expect-error yup types
|
|
84
91
|
const action = getActionFromProvider(this.options.parent.action);
|
|
85
92
|
const hasNoProperties = fp.isEmpty(properties) || fp.isNil(properties);
|
|
@@ -94,7 +101,8 @@ const permission = utils.yup.object().shape({
|
|
|
94
101
|
return false;
|
|
95
102
|
}
|
|
96
103
|
return Object.keys(properties).every((property)=>applyToProperties.includes(property));
|
|
97
|
-
}).test('fields-property',
|
|
104
|
+
}).test('fields-property', // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder
|
|
105
|
+
'Invalid fields property at ${path}', async function checkFieldsProperty(properties = {}) {
|
|
98
106
|
// @ts-expect-error yup types
|
|
99
107
|
const action = getActionFromProvider(this.options.parent.action);
|
|
100
108
|
if (!action || !properties) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common-validators.js","sources":["../../../../../server/src/validation/common-validators.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\nimport _ from 'lodash';\nimport { isEmpty, has, isNil, isArray } from 'lodash/fp';\nimport { getService } from '../utils';\nimport actionDomain, { type Action } from '../domain/action';\nimport { checkFieldsAreCorrectlyNested, checkFieldsDontHaveDuplicates } from './common-functions';\nimport actions from '../domain/action/index';\n\nconst { actionFields } = actions;\n\nconst getActionFromProvider = (actionId: string) => {\n return getService('permission').actionProvider.get(actionId);\n};\n\nexport const email = yup.string().email().lowercase();\n\nexport const firstname = yup.string().trim().min(1);\n\nexport const lastname = yup.string();\n\nexport const username = yup.string().min(1);\n\nexport const password = yup\n .string()\n .min(8)\n .test('required-byte-size', '${path} must be less than 73 bytes', function (value) {\n if (!value) return true;\n const byteSize = new TextEncoder().encode(value).length;\n return byteSize <= 72;\n })\n .matches(/[a-z]/, '${path} must contain at least one lowercase character')\n .matches(/[A-Z]/, '${path} must contain at least one uppercase character')\n .matches(/\\d/, '${path} must contain at least one number');\n\nexport const roles = yup.array(yup.strapiID()).min(1);\n\nconst isAPluginName = yup\n .string()\n .test('is-a-plugin-name', 'is not a plugin name', function (value) {\n return [undefined, 'admin', ...Object.keys(strapi.plugins)].includes(value)\n ? true\n : this.createError({ path: this.path, message: `${this.path} is not an existing plugin` });\n });\n\nexport const arrayOfConditionNames = yup\n .array()\n .of(yup.string())\n .test('is-an-array-of-conditions', 'is not a plugin name', function (value) {\n const ids = strapi.service('admin::permission').conditionProvider.keys();\n return _.isUndefined(value) || _.difference(value, ids).length === 0\n ? true\n : this.createError({ path: this.path, message: `contains conditions that don't exist` });\n });\n\nexport const permissionsAreEquals = (a: any, b: any) =>\n a.action === b.action && (a.subject === b.subject || (_.isNil(a.subject) && _.isNil(b.subject)));\n\nconst checkNoDuplicatedPermissions = (permissions: unknown) =>\n !Array.isArray(permissions) ||\n permissions.every((permA, i) =>\n permissions.slice(i + 1).every((permB) => !permissionsAreEquals(permA, permB))\n );\n\nconst checkNilFields = (action: Action) =>\n function (fields: typeof actionFields) {\n // If the parent has no action field, then we ignore this test\n if (isNil(action)) {\n return true;\n }\n\n return actionDomain.appliesToProperty('fields', action) || isNil(fields);\n };\n\nconst fieldsPropertyValidation = (action: Action) =>\n yup\n .array()\n .of(yup.string())\n .nullable()\n .test(\n 'field-nested',\n 'Fields format are incorrect (bad nesting).',\n checkFieldsAreCorrectlyNested\n )\n .test(\n 'field-nested',\n 'Fields format are incorrect (duplicates).',\n checkFieldsDontHaveDuplicates\n )\n .test(\n 'fields-restriction',\n 'The permission at ${path} must have fields set to null or undefined',\n // @ts-expect-error yup types\n checkNilFields(action)\n );\n\nexport const permission = yup\n .object()\n .shape({\n action: yup\n .string()\n .required()\n .test('action-validity', 'action is not an existing permission action', function (actionId) {\n // If the action field is Nil, ignore the test and let the required check handle the error\n if (isNil(actionId)) {\n return true;\n }\n\n return !!getActionFromProvider(actionId);\n }),\n actionParameters: yup.object().nullable(),\n subject: yup\n .string()\n .nullable()\n .test('subject-validity', 'Invalid subject submitted', function (subject) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action);\n\n if (!action) {\n return true;\n }\n\n if (isNil(action.subjects)) {\n return isNil(subject);\n }\n\n if (isArray(action.subjects) && !isNil(subject)) {\n return action.subjects.includes(subject);\n }\n\n return false;\n }),\n properties: yup\n .object()\n .test('properties-structure', 'Invalid property set at ${path}', function (properties) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action) as any;\n const hasNoProperties = isEmpty(properties) || isNil(properties);\n\n if (!has('options.applyToProperties', action)) {\n return hasNoProperties;\n }\n\n if (hasNoProperties) {\n return true;\n }\n\n const { applyToProperties } = action.options;\n\n if (!isArray(applyToProperties)) {\n return false;\n }\n\n return Object.keys(properties).every((property) => applyToProperties.includes(property));\n })\n .test(\n 'fields-property',\n 'Invalid fields property at ${path}',\n async function (properties = {}) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action) as any;\n\n if (!action || !properties) {\n return true;\n }\n\n if (!actionDomain.appliesToProperty('fields', action)) {\n return true;\n }\n\n try {\n await fieldsPropertyValidation(action).validate(properties.fields, {\n strict: true,\n abortEarly: false,\n });\n return true;\n } catch (e: any) {\n // Propagate fieldsPropertyValidation error with updated path\n throw this.createError({\n message: e.message,\n path: `${this.path}.fields`,\n });\n }\n }\n ),\n conditions: yup.array().of(yup.string()),\n })\n .noUnknown();\n\nexport const updatePermissions = yup\n .object()\n .shape({\n permissions: yup\n .array()\n .required()\n .of(permission)\n .test(\n 'duplicated-permissions',\n 'Some permissions are duplicated (same action and subject)',\n checkNoDuplicatedPermissions\n ),\n })\n .required()\n .noUnknown();\n\nexport default {\n email,\n firstname,\n lastname,\n username,\n password,\n roles,\n isAPluginName,\n arrayOfConditionNames,\n permission,\n updatePermissions,\n};\n"],"names":["actionFields","actions","getActionFromProvider","actionId","getService","actionProvider","get","email","yup","string","lowercase","firstname","trim","min","lastname","username","password","test","value","byteSize","TextEncoder","encode","length","matches","roles","array","strapiID","isAPluginName","undefined","Object","keys","strapi","plugins","includes","createError","path","message","of","ids","service","conditionProvider","_","isUndefined","difference","permissionsAreEquals","a","b","action","subject","isNil","checkNoDuplicatedPermissions","permissions","Array","isArray","every","permA","i","slice","permB","checkNilFields","fields","actionDomain","appliesToProperty","fieldsPropertyValidation","nullable","checkFieldsAreCorrectlyNested","checkFieldsDontHaveDuplicates","permission","object","shape","required","actionParameters","options","parent","subjects","properties","hasNoProperties","isEmpty","has","applyToProperties","property","validate","strict","abortEarly","e","conditions","noUnknown","updatePermissions","arrayOfConditionNames"],"mappings":";;;;;;;;;;;;;;;;AAQA,MAAM,EAAEA,YAAY,EAAE,GAAGC,KAAAA;AAEzB,MAAMC,wBAAwB,CAACC,QAAAA,GAAAA;AAC7B,IAAA,OAAOC,kBAAAA,CAAW,YAAA,CAAA,CAAcC,cAAc,CAACC,GAAG,CAACH,QAAAA,CAAAA;AACrD,CAAA;AAEO,MAAMI,QAAQC,SAAAA,CAAIC,MAAM,GAAGF,KAAK,EAAA,CAAGG,SAAS;AAE5C,MAAMC,YAAYH,SAAAA,CAAIC,MAAM,GAAGG,IAAI,EAAA,CAAGC,GAAG,CAAC,CAAA;AAE1C,MAAMC,QAAAA,GAAWN,SAAAA,CAAIC,MAAM;MAErBM,QAAAA,GAAWP,SAAAA,CAAIC,MAAM,EAAA,CAAGI,GAAG,CAAC,CAAA;AAElC,MAAMG,QAAAA,GAAWR,SAAAA,CACrBC,MAAM,EAAA,CACNI,GAAG,CAAC,CAAA,CAAA,CACJI,IAAI,CAAC,oBAAA,EAAsB,oCAAA,EAAsC,SAAUC,KAAK,EAAA;IAC/E,IAAI,CAACA,OAAO,OAAO,IAAA;AACnB,IAAA,MAAMC,WAAW,IAAIC,WAAAA,EAAAA,CAAcC,MAAM,CAACH,OAAOI,MAAM;AACvD,IAAA,OAAOH,QAAAA,IAAY,EAAA;AACrB,CAAA,CAAA,CACCI,OAAO,CAAC,OAAA,EAAS,uDAAA,CAAA,CACjBA,OAAO,CAAC,OAAA,EAAS,uDAAA,CAAA,CACjBA,OAAO,CAAC,IAAA,EAAM,0CAAA;AAEV,MAAMC,KAAAA,GAAQhB,SAAAA,CAAIiB,KAAK,CAACjB,UAAIkB,QAAQ,EAAA,CAAA,CAAIb,GAAG,CAAC,CAAA;AAEnD,MAAMc,aAAAA,GAAgBnB,UACnBC,MAAM,EAAA,CACNQ,IAAI,CAAC,kBAAA,EAAoB,sBAAA,EAAwB,SAAUC,KAAK,EAAA;IAC/D,OAAO;AAACU,QAAAA,SAAAA;AAAW,QAAA,OAAA;WAAYC,MAAAA,CAAOC,IAAI,CAACC,MAAAA,CAAOC,OAAO;AAAE,KAAA,CAACC,QAAQ,CAACf,KAAAA,CAAAA,GACjE,OACA,IAAI,CAACgB,WAAW,CAAC;QAAEC,IAAAA,EAAM,IAAI,CAACA,IAAI;AAAEC,QAAAA,OAAAA,EAAS,GAAG,IAAI,CAACD,IAAI,CAAC,0BAA0B;AAAE,KAAA,CAAA;AAC5F,CAAA,CAAA;AAEmC3B,SAAAA,CAClCiB,KAAK,GACLY,EAAE,CAAC7B,SAAAA,CAAIC,MAAM,IACbQ,IAAI,CAAC,2BAAA,EAA6B,sBAAA,EAAwB,SAAUC,KAAK,EAAA;AACxE,IAAA,MAAMoB,MAAMP,MAAAA,CAAOQ,OAAO,CAAC,mBAAA,CAAA,CAAqBC,iBAAiB,CAACV,IAAI,EAAA;AACtE,IAAA,OAAOW,mBAAEC,WAAW,CAACxB,KAAAA,CAAAA,IAAUuB,kBAAAA,CAAEE,UAAU,CAACzB,KAAAA,EAAOoB,GAAAA,CAAAA,CAAKhB,MAAM,KAAK,CAAA,GAC/D,IAAA,GACA,IAAI,CAACY,WAAW,CAAC;QAAEC,IAAAA,EAAM,IAAI,CAACA,IAAI;QAAEC,OAAAA,EAAS,CAAC,oCAAoC;AAAE,KAAA,CAAA;AAC1F,CAAA;AAEK,MAAMQ,oBAAAA,GAAuB,CAACC,CAAAA,EAAQC,CAAAA,GAC3CD,CAAAA,CAAEE,MAAM,KAAKD,CAAAA,CAAEC,MAAM,KAAKF,EAAEG,OAAO,KAAKF,CAAAA,CAAEE,OAAO,IAAKP,kBAAAA,CAAEQ,KAAK,CAACJ,CAAAA,CAAEG,OAAO,CAAA,IAAKP,kBAAAA,CAAEQ,KAAK,CAACH,CAAAA,CAAEE,OAAO,CAAC;AAEhG,MAAME,4BAAAA,GAA+B,CAACC,WAAAA,GACpC,CAACC,KAAAA,CAAMC,OAAO,CAACF,WAAAA,CAAAA,IACfA,WAAAA,CAAYG,KAAK,CAAC,CAACC,OAAOC,CAAAA,GACxBL,WAAAA,CAAYM,KAAK,CAACD,CAAAA,GAAI,CAAA,CAAA,CAAGF,KAAK,CAAC,CAACI,KAAAA,GAAU,CAACd,oBAAAA,CAAqBW,KAAAA,EAAOG,KAAAA,CAAAA,CAAAA,CAAAA;AAG3E,MAAMC,cAAAA,GAAiB,CAACZ,MAAAA,GACtB,SAAUa,MAA2B,EAAA;;AAEnC,QAAA,IAAIX,SAAMF,MAAAA,CAAAA,EAAS;YACjB,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,OAAOc,KAAAA,CAAaC,iBAAiB,CAAC,QAAA,EAAUf,WAAWE,QAAAA,CAAMW,MAAAA,CAAAA;AACnE,IAAA,CAAA;AAEF,MAAMG,wBAAAA,GAA2B,CAAChB,MAAAA,GAChCvC,SAAAA,CACGiB,KAAK,EAAA,CACLY,EAAE,CAAC7B,SAAAA,CAAIC,MAAM,EAAA,CAAA,CACbuD,QAAQ,EAAA,CACR/C,IAAI,CACH,cAAA,EACA,4CAAA,EACAgD,6BAAAA,CAAAA,CAEDhD,IAAI,CACH,cAAA,EACA,2CAAA,EACAiD,6BAAAA,CAAAA,CAEDjD,IAAI,CACH,oBAAA,EACA,qEAAA;IAEA0C,cAAAA,CAAeZ,MAAAA,CAAAA,CAAAA;MAGRoB,UAAAA,GAAa3D,SAAAA,CACvB4D,MAAM,EAAA,CACNC,KAAK,CAAC;IACLtB,MAAAA,EAAQvC,SAAAA,CACLC,MAAM,EAAA,CACN6D,QAAQ,EAAA,CACRrD,IAAI,CAAC,iBAAA,EAAmB,6CAAA,EAA+C,SAAUd,QAAQ,EAAA;;AAExF,QAAA,IAAI8C,SAAM9C,QAAAA,CAAAA,EAAW;YACnB,OAAO,IAAA;AACT,QAAA;QAEA,OAAO,CAAC,CAACD,qBAAAA,CAAsBC,QAAAA,CAAAA;AACjC,IAAA,CAAA,CAAA;IACFoE,gBAAAA,EAAkB/D,SAAAA,CAAI4D,MAAM,EAAA,CAAGJ,QAAQ,EAAA;IACvChB,OAAAA,EAASxC,SAAAA,CACNC,MAAM,EAAA,CACNuD,QAAQ,EAAA,CACR/C,IAAI,CAAC,kBAAA,EAAoB,2BAAA,EAA6B,SAAU+B,OAAO,EAAA;;QAEtE,MAAMD,MAAAA,GAAS7C,sBAAsB,IAAI,CAACsE,OAAO,CAACC,MAAM,CAAC1B,MAAM,CAAA;AAE/D,QAAA,IAAI,CAACA,MAAAA,EAAQ;YACX,OAAO,IAAA;AACT,QAAA;QAEA,IAAIE,QAAAA,CAAMF,MAAAA,CAAO2B,QAAQ,CAAA,EAAG;AAC1B,YAAA,OAAOzB,QAAAA,CAAMD,OAAAA,CAAAA;AACf,QAAA;AAEA,QAAA,IAAIK,WAAQN,MAAAA,CAAO2B,QAAQ,CAAA,IAAK,CAACzB,SAAMD,OAAAA,CAAAA,EAAU;AAC/C,YAAA,OAAOD,MAAAA,CAAO2B,QAAQ,CAACzC,QAAQ,CAACe,OAAAA,CAAAA;AAClC,QAAA;QAEA,OAAO,KAAA;AACT,IAAA,CAAA,CAAA;IACF2B,UAAAA,EAAYnE,SAAAA,CACT4D,MAAM,EAAA,CACNnD,IAAI,CAAC,sBAAA,EAAwB,iCAAA,EAAmC,SAAU0D,UAAU,EAAA;;QAEnF,MAAM5B,MAAAA,GAAS7C,sBAAsB,IAAI,CAACsE,OAAO,CAACC,MAAM,CAAC1B,MAAM,CAAA;QAC/D,MAAM6B,eAAAA,GAAkBC,UAAAA,CAAQF,UAAAA,CAAAA,IAAe1B,QAAAA,CAAM0B,UAAAA,CAAAA;QAErD,IAAI,CAACG,MAAAA,CAAI,2BAAA,EAA6B/B,MAAAA,CAAAA,EAAS;YAC7C,OAAO6B,eAAAA;AACT,QAAA;AAEA,QAAA,IAAIA,eAAAA,EAAiB;YACnB,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,MAAM,EAAEG,iBAAiB,EAAE,GAAGhC,OAAOyB,OAAO;QAE5C,IAAI,CAACnB,WAAQ0B,iBAAAA,CAAAA,EAAoB;YAC/B,OAAO,KAAA;AACT,QAAA;QAEA,OAAOlD,MAAAA,CAAOC,IAAI,CAAC6C,UAAAA,CAAAA,CAAYrB,KAAK,CAAC,CAAC0B,QAAAA,GAAaD,iBAAAA,CAAkB9C,QAAQ,CAAC+C,QAAAA,CAAAA,CAAAA;AAChF,IAAA,CAAA,CAAA,CACC/D,IAAI,CACH,iBAAA,EACA,sCACA,eAAgB0D,UAAAA,GAAa,EAAE,EAAA;;QAE7B,MAAM5B,MAAAA,GAAS7C,sBAAsB,IAAI,CAACsE,OAAO,CAACC,MAAM,CAAC1B,MAAM,CAAA;QAE/D,IAAI,CAACA,MAAAA,IAAU,CAAC4B,UAAAA,EAAY;YAC1B,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,IAAI,CAACd,KAAAA,CAAaC,iBAAiB,CAAC,UAAUf,MAAAA,CAAAA,EAAS;YACrD,OAAO,IAAA;AACT,QAAA;QAEA,IAAI;AACF,YAAA,MAAMgB,yBAAyBhB,MAAAA,CAAAA,CAAQkC,QAAQ,CAACN,UAAAA,CAAWf,MAAM,EAAE;gBACjEsB,MAAAA,EAAQ,IAAA;gBACRC,UAAAA,EAAY;AACd,aAAA,CAAA;YACA,OAAO,IAAA;AACT,QAAA,CAAA,CAAE,OAAOC,CAAAA,EAAQ;;YAEf,MAAM,IAAI,CAAClD,WAAW,CAAC;AACrBE,gBAAAA,OAAAA,EAASgD,EAAEhD,OAAO;AAClBD,gBAAAA,IAAAA,EAAM,GAAG,IAAI,CAACA,IAAI,CAAC,OAAO;AAC5B,aAAA,CAAA;AACF,QAAA;AACF,IAAA,CAAA,CAAA;AAEJkD,IAAAA,UAAAA,EAAY7E,UAAIiB,KAAK,EAAA,CAAGY,EAAE,CAAC7B,UAAIC,MAAM,EAAA;AACvC,CAAA,CAAA,CACC6E,SAAS;MAECC,iBAAAA,GAAoB/E,SAAAA,CAC9B4D,MAAM,EAAA,CACNC,KAAK,CAAC;IACLlB,WAAAA,EAAa3C,SAAAA,CACViB,KAAK,EAAA,CACL6C,QAAQ,EAAA,CACRjC,EAAE,CAAC8B,UAAAA,CAAAA,CACHlD,IAAI,CACH,wBAAA,EACA,2DAAA,EACAiC,4BAAAA;AAEN,CAAA,CAAA,CACCoB,QAAQ,EAAA,CACRgB,SAAS;AAEZ,iBAAe;AACb/E,IAAAA,KAAAA;AACAI,IAAAA,SAAAA;AACAG,IAAAA,QAAAA;AACAC,IAAAA,QAAAA;AACAC,IAAAA,QAAAA;AACAQ,IAAAA,KAAAA;AACAG,IAAAA,aAAAA;AACA6D,IAEAD;AACF,CAAA;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"common-validators.js","sources":["../../../../../server/src/validation/common-validators.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\nimport _ from 'lodash';\nimport { isEmpty, has, isNil, isArray } from 'lodash/fp';\nimport { getService } from '../utils';\nimport actionDomain, { type Action } from '../domain/action';\nimport { checkFieldsAreCorrectlyNested, checkFieldsDontHaveDuplicates } from './common-functions';\nimport actions from '../domain/action/index';\n\nconst { actionFields } = actions;\n\nconst getActionFromProvider = (actionId: string) => {\n return getService('permission').actionProvider.get(actionId);\n};\n\nexport const email = yup.string().email().lowercase();\n\nexport const firstname = yup.string().trim().min(1);\n\nexport const lastname = yup.string();\n\nexport const username = yup.string().min(1);\n\nexport const password = yup\n .string()\n .min(8)\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .test('required-byte-size', '${path} must be less than 73 bytes', function checkByteSize(value) {\n if (!value) return true;\n\n const byteSize = new TextEncoder().encode(value).length;\n return byteSize <= 72;\n })\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .matches(/[a-z]/, '${path} must contain at least one lowercase character')\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .matches(/[A-Z]/, '${path} must contain at least one uppercase character')\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .matches(/\\d/, '${path} must contain at least one number');\n\nexport const roles = yup.array(yup.strapiID()).min(1);\n\nconst isAPluginName = yup\n .string()\n .test('is-a-plugin-name', 'is not a plugin name', function checkPluginName(value) {\n return [undefined, 'admin', ...Object.keys(strapi.plugins)].includes(value)\n ? true\n : this.createError({ path: this.path, message: `${this.path} is not an existing plugin` });\n });\n\nexport const arrayOfConditionNames = yup\n .array()\n .of(yup.string())\n .test('is-an-array-of-conditions', 'is not a plugin name', function checkConditionNames(value) {\n const ids = strapi.service('admin::permission').conditionProvider.keys();\n return _.isUndefined(value) || _.difference(value, ids).length === 0\n ? true\n : this.createError({ path: this.path, message: `contains conditions that don't exist` });\n });\n\nexport const permissionsAreEquals = (a: any, b: any) =>\n a.action === b.action && (a.subject === b.subject || (_.isNil(a.subject) && _.isNil(b.subject)));\n\nconst checkNoDuplicatedPermissions = (permissions: unknown) =>\n !Array.isArray(permissions) ||\n permissions.every((permA, i) =>\n permissions.slice(i + 1).every((permB) => !permissionsAreEquals(permA, permB))\n );\n\nconst checkNilFields = (action: Action) =>\n function checkNilActionFields(fields: typeof actionFields) {\n // If the parent has no action field, then we ignore this test\n if (isNil(action)) {\n return true;\n }\n\n return actionDomain.appliesToProperty('fields', action) || isNil(fields);\n };\n\nconst fieldsPropertyValidation = (action: Action) =>\n yup\n .array()\n .of(yup.string())\n .nullable()\n .test(\n 'field-nested',\n 'Fields format are incorrect (bad nesting).',\n checkFieldsAreCorrectlyNested\n )\n .test(\n 'field-nested',\n 'Fields format are incorrect (duplicates).',\n checkFieldsDontHaveDuplicates\n )\n .test(\n 'fields-restriction',\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n 'The permission at ${path} must have fields set to null or undefined',\n // @ts-expect-error yup types\n checkNilFields(action)\n );\n\nexport const permission = yup\n .object()\n .shape({\n action: yup\n .string()\n .required()\n .test(\n 'action-validity',\n 'action is not an existing permission action',\n function checkActionValidity(actionId) {\n // If the action field is Nil, ignore the test and let the required check handle the error\n if (isNil(actionId)) {\n return true;\n }\n\n const action = getActionFromProvider(actionId);\n\n return action !== undefined && action !== null;\n }\n ),\n actionParameters: yup.object().nullable(),\n subject: yup\n .string()\n .nullable()\n .test(\n 'subject-validity',\n 'Invalid subject submitted',\n function checkSubjectValidity(subject) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action);\n\n if (!action) {\n return true;\n }\n\n if (isNil(action.subjects)) {\n return isNil(subject);\n }\n\n if (isArray(action.subjects) && !isNil(subject)) {\n return action.subjects.includes(subject);\n }\n\n return false;\n }\n ),\n properties: yup\n .object()\n .test(\n 'properties-structure',\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n 'Invalid property set at ${path}',\n function checkPropertiesStructure(properties) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action) as any;\n const hasNoProperties = isEmpty(properties) || isNil(properties);\n\n if (!has('options.applyToProperties', action)) {\n return hasNoProperties;\n }\n\n if (hasNoProperties) {\n return true;\n }\n\n const { applyToProperties } = action.options;\n\n if (!isArray(applyToProperties)) {\n return false;\n }\n\n return Object.keys(properties).every((property) => applyToProperties.includes(property));\n }\n )\n .test(\n 'fields-property',\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n 'Invalid fields property at ${path}',\n async function checkFieldsProperty(properties = {}) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action) as any;\n\n if (!action || !properties) {\n return true;\n }\n\n if (!actionDomain.appliesToProperty('fields', action)) {\n return true;\n }\n\n try {\n await fieldsPropertyValidation(action).validate(properties.fields, {\n strict: true,\n abortEarly: false,\n });\n return true;\n } catch (e: any) {\n // Propagate fieldsPropertyValidation error with updated path\n throw this.createError({\n message: e.message,\n path: `${this.path}.fields`,\n });\n }\n }\n ),\n conditions: yup.array().of(yup.string()),\n })\n .noUnknown();\n\nexport const updatePermissions = yup\n .object()\n .shape({\n permissions: yup\n .array()\n .required()\n .of(permission)\n .test(\n 'duplicated-permissions',\n 'Some permissions are duplicated (same action and subject)',\n checkNoDuplicatedPermissions\n ),\n })\n .required()\n .noUnknown();\n\nexport default {\n email,\n firstname,\n lastname,\n username,\n password,\n roles,\n isAPluginName,\n arrayOfConditionNames,\n permission,\n updatePermissions,\n};\n"],"names":["actionFields","actions","getActionFromProvider","actionId","getService","actionProvider","get","email","yup","string","lowercase","firstname","trim","min","lastname","username","password","test","checkByteSize","value","byteSize","TextEncoder","encode","length","matches","roles","array","strapiID","isAPluginName","checkPluginName","undefined","Object","keys","strapi","plugins","includes","createError","path","message","of","checkConditionNames","ids","service","conditionProvider","_","isUndefined","difference","permissionsAreEquals","a","b","action","subject","isNil","checkNoDuplicatedPermissions","permissions","Array","isArray","every","permA","i","slice","permB","checkNilFields","checkNilActionFields","fields","actionDomain","appliesToProperty","fieldsPropertyValidation","nullable","checkFieldsAreCorrectlyNested","checkFieldsDontHaveDuplicates","permission","object","shape","required","checkActionValidity","actionParameters","checkSubjectValidity","options","parent","subjects","properties","checkPropertiesStructure","hasNoProperties","isEmpty","has","applyToProperties","property","checkFieldsProperty","validate","strict","abortEarly","e","conditions","noUnknown","updatePermissions","arrayOfConditionNames"],"mappings":"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"}
|