@strapi/admin 5.30.0 → 5.30.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/StrapiApp.js.map +1 -1
- package/dist/admin/admin/src/StrapiApp.mjs.map +1 -1
- package/dist/admin/admin/src/components/ContentBox.js.map +1 -1
- package/dist/admin/admin/src/components/ContentBox.mjs.map +1 -1
- package/dist/admin/admin/src/components/DescriptionComponentRenderer.js.map +1 -1
- package/dist/admin/admin/src/components/DescriptionComponentRenderer.mjs.map +1 -1
- package/dist/admin/admin/src/components/Filters.js +1 -1
- package/dist/admin/admin/src/components/Filters.js.map +1 -1
- package/dist/admin/admin/src/components/Filters.mjs +1 -1
- package/dist/admin/admin/src/components/Filters.mjs.map +1 -1
- package/dist/admin/admin/src/components/Form.js +8 -3
- package/dist/admin/admin/src/components/Form.js.map +1 -1
- package/dist/admin/admin/src/components/Form.mjs +8 -3
- package/dist/admin/admin/src/components/Form.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.js +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Number.js +1 -1
- package/dist/admin/admin/src/components/FormInputs/Number.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Number.mjs +1 -1
- package/dist/admin/admin/src/components/FormInputs/Number.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Renderer.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Renderer.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Time.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Time.mjs.map +1 -1
- package/dist/admin/admin/src/components/GapDropZone.js.map +1 -1
- package/dist/admin/admin/src/components/GapDropZone.mjs.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Overview.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Overview.mjs.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.mjs.map +1 -1
- 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/Layouts/GridLayout.js.map +1 -1
- package/dist/admin/admin/src/components/Layouts/GridLayout.mjs.map +1 -1
- package/dist/admin/admin/src/components/Layouts/HeaderLayout.js +8 -4
- package/dist/admin/admin/src/components/Layouts/HeaderLayout.js.map +1 -1
- package/dist/admin/admin/src/components/Layouts/HeaderLayout.mjs +8 -4
- package/dist/admin/admin/src/components/Layouts/HeaderLayout.mjs.map +1 -1
- package/dist/admin/admin/src/components/NpsSurvey.js +5 -3
- package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
- package/dist/admin/admin/src/components/NpsSurvey.mjs +5 -3
- package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
- package/dist/admin/admin/src/components/PageHelpers.js.map +1 -1
- package/dist/admin/admin/src/components/PageHelpers.mjs.map +1 -1
- package/dist/admin/admin/src/components/PrivateRoute.js.map +1 -1
- package/dist/admin/admin/src/components/PrivateRoute.mjs.map +1 -1
- package/dist/admin/admin/src/components/RelativeTime.js.map +1 -1
- package/dist/admin/admin/src/components/RelativeTime.mjs.map +1 -1
- package/dist/admin/admin/src/components/ResizeIndicator.js.map +1 -1
- package/dist/admin/admin/src/components/ResizeIndicator.mjs.map +1 -1
- package/dist/admin/admin/src/components/Table.js +1 -1
- package/dist/admin/admin/src/components/Table.js.map +1 -1
- package/dist/admin/admin/src/components/Table.mjs +1 -1
- package/dist/admin/admin/src/components/Table.mjs.map +1 -1
- package/dist/admin/admin/src/components/Widgets.js.map +1 -1
- package/dist/admin/admin/src/components/Widgets.mjs.map +1 -1
- package/dist/admin/admin/src/core/apis/CustomFields.js.map +1 -1
- package/dist/admin/admin/src/core/apis/CustomFields.mjs.map +1 -1
- package/dist/admin/admin/src/core/apis/Plugin.js +0 -1
- package/dist/admin/admin/src/core/apis/Plugin.js.map +1 -1
- package/dist/admin/admin/src/core/apis/Plugin.mjs +0 -1
- package/dist/admin/admin/src/core/apis/Plugin.mjs.map +1 -1
- package/dist/admin/admin/src/core/apis/Widgets.js.map +1 -1
- package/dist/admin/admin/src/core/apis/Widgets.mjs.map +1 -1
- package/dist/admin/admin/src/core/apis/rbac.js.map +1 -1
- package/dist/admin/admin/src/core/apis/rbac.mjs.map +1 -1
- package/dist/admin/admin/src/core/apis/router.js.map +1 -1
- package/dist/admin/admin/src/core/apis/router.mjs.map +1 -1
- package/dist/admin/admin/src/features/BackButton.js.map +1 -1
- package/dist/admin/admin/src/features/BackButton.mjs.map +1 -1
- package/dist/admin/admin/src/features/Tracking.js.map +1 -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/usePersistentState.js.map +1 -1
- package/dist/admin/admin/src/hooks/usePersistentState.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useRBAC.js.map +1 -1
- package/dist/admin/admin/src/hooks/useRBAC.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Register.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Register.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.js +2 -2
- package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.mjs +2 -2
- package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/components/NpmPackageCard.js.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/components/NpmPackageCard.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.js.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/components/PageHeader.js.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/components/PageHeader.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/hooks/useMarketplaceData.js.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/hooks/useMarketplaceData.mjs.map +1 -1
- 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 +8 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs +9 -2
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs.map +1 -1
- 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/components/CollapsableContentType.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js +2 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs +2 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs.map +1 -1
- 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.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/utils/files.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/utils/files.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js +9 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs +9 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js +9 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs +9 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.mjs.map +1 -1
- 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/CollapsePropertyMatrix.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.mjs.map +1 -1
- 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/ContentTypeCollapses.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/forms.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/forms.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/permissions.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/permissions.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.js +2 -0
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.mjs +2 -0
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.js +9 -2
- package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.mjs +9 -2
- package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js +3 -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 +3 -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/MagicLinkCE.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/MagicLinkCE.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/SelectRoles.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/SelectRoles.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/EditPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/EditPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.mjs.map +1 -1
- 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/pages/Settings/pages/Webhooks/components/WebhookForm.js +9 -2
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.mjs +9 -2
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.mjs.map +1 -1
- package/dist/admin/admin/src/pages/UseCasePage.js.map +1 -1
- package/dist/admin/admin/src/pages/UseCasePage.mjs.map +1 -1
- package/dist/admin/admin/src/services/api.js +2 -1
- package/dist/admin/admin/src/services/api.js.map +1 -1
- package/dist/admin/admin/src/services/api.mjs +2 -1
- package/dist/admin/admin/src/services/api.mjs.map +1 -1
- package/dist/admin/admin/src/services/apiTokens.js.map +1 -1
- package/dist/admin/admin/src/services/apiTokens.mjs.map +1 -1
- package/dist/admin/admin/src/services/transferTokens.js.map +1 -1
- package/dist/admin/admin/src/services/transferTokens.mjs.map +1 -1
- package/dist/admin/admin/src/services/users.js.map +1 -1
- package/dist/admin/admin/src/services/users.mjs.map +1 -1
- package/dist/admin/admin/src/services/webhooks.js.map +1 -1
- package/dist/admin/admin/src/services/webhooks.mjs.map +1 -1
- package/dist/admin/admin/src/utils/cookies.js.map +1 -1
- package/dist/admin/admin/src/utils/cookies.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/getPrefixedId.js.map +1 -1
- package/dist/admin/admin/src/utils/getPrefixedId.mjs.map +1 -1
- package/dist/admin/admin/src/utils/rulesEngine.js.map +1 -1
- package/dist/admin/admin/src/utils/rulesEngine.mjs.map +1 -1
- package/dist/admin/admin/src/utils/urls.js.map +1 -1
- package/dist/admin/admin/src/utils/urls.mjs.map +1 -1
- package/dist/admin/admin/src/utils/users.js.map +1 -1
- package/dist/admin/admin/src/utils/users.mjs.map +1 -1
- package/dist/admin/ee/admin/src/components/AuditLogs/Widgets.js.map +1 -1
- package/dist/admin/ee/admin/src/components/AuditLogs/Widgets.mjs.map +1 -1
- package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.js.map +1 -1
- package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthPage/components/SSOProviders.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthPage/components/SSOProviders.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthResponse.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthResponse.mjs.map +1 -1
- 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/AIUsage.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.js +3 -3
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.mjs +3 -3
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.mjs.map +1 -1
- 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/AuditLogs/components/Modal.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useFormatTimeStamp.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useFormatTimeStamp.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/MagicLinkEE.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/MagicLinkEE.mjs.map +1 -1
- package/dist/admin/ee/admin/src/services/ai.js +14 -1
- package/dist/admin/ee/admin/src/services/ai.js.map +1 -1
- package/dist/admin/ee/admin/src/services/ai.mjs +14 -2
- package/dist/admin/ee/admin/src/services/ai.mjs.map +1 -1
- package/dist/admin/ee/admin/src/services/auditLogs.js.map +1 -1
- package/dist/admin/ee/admin/src/services/auditLogs.mjs.map +1 -1
- package/dist/admin/ee.js +1 -0
- package/dist/admin/ee.js.map +1 -1
- package/dist/admin/ee.mjs +1 -1
- package/dist/admin/src/components/Form.d.ts +1 -1
- package/dist/admin/src/core/store/configure.d.ts +2 -2
- package/dist/admin/src/core/store/hooks.d.ts +2 -2
- package/dist/admin/src/ee.d.ts +1 -1
- package/dist/admin/src/hooks/useAdminRoles.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +4 -4
- package/dist/admin/src/selectors.d.ts +2 -2
- 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 +1 -1
- package/dist/admin/src/services/auth.d.ts +13 -13
- 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/tests/utils.d.ts +1 -1
- package/dist/ee/admin/src/services/ai.d.ts +6 -3
- package/dist/ee/admin/src/services/auditLogs.d.ts +1 -1
- package/dist/ee/server/src/ai/containers/ai.d.ts +11 -0
- package/dist/ee/server/src/ai/containers/ai.d.ts.map +1 -0
- package/dist/ee/server/src/ai/controllers/ai.d.ts +1 -0
- package/dist/ee/server/src/ai/controllers/ai.d.ts.map +1 -1
- package/dist/ee/server/src/ai/routes/ai.d.ts.map +1 -1
- package/dist/ee/server/src/index.d.ts +1 -0
- package/dist/ee/server/src/index.d.ts.map +1 -1
- package/dist/server/ee/server/src/ai/containers/ai.js +18 -0
- package/dist/server/ee/server/src/ai/containers/ai.js.map +1 -0
- package/dist/server/ee/server/src/ai/containers/ai.mjs +16 -0
- package/dist/server/ee/server/src/ai/containers/ai.mjs.map +1 -0
- package/dist/server/ee/server/src/ai/controllers/ai.js +6 -0
- package/dist/server/ee/server/src/ai/controllers/ai.js.map +1 -1
- package/dist/server/ee/server/src/ai/controllers/ai.mjs +6 -0
- package/dist/server/ee/server/src/ai/controllers/ai.mjs.map +1 -1
- package/dist/server/ee/server/src/ai/routes/ai.js +11 -0
- package/dist/server/ee/server/src/ai/routes/ai.js.map +1 -1
- package/dist/server/ee/server/src/ai/routes/ai.mjs +11 -0
- package/dist/server/ee/server/src/ai/routes/ai.mjs.map +1 -1
- package/dist/server/ee/server/src/audit-logs/services/audit-logs.js.map +1 -1
- package/dist/server/ee/server/src/audit-logs/services/audit-logs.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/constants.js.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/constants.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/utils.js.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/utils.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication.js.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/user.js.map +1 -1
- package/dist/server/ee/server/src/controllers/user.mjs.map +1 -1
- package/dist/server/ee/server/src/index.js +7 -0
- package/dist/server/ee/server/src/index.js.map +1 -1
- package/dist/server/ee/server/src/index.mjs +7 -0
- package/dist/server/ee/server/src/index.mjs.map +1 -1
- package/dist/server/ee/server/src/services/auth.js.map +1 -1
- package/dist/server/ee/server/src/services/auth.mjs.map +1 -1
- package/dist/server/ee/server/src/services/passport/sso.js.map +1 -1
- package/dist/server/ee/server/src/services/passport/sso.mjs.map +1 -1
- package/dist/server/ee/server/src/utils/index.js.map +1 -1
- package/dist/server/ee/server/src/utils/index.mjs.map +1 -1
- package/dist/server/server/src/controllers/transfer/index.js.map +1 -1
- package/dist/server/server/src/controllers/transfer/index.mjs.map +1 -1
- package/dist/server/server/src/controllers/user.js +10 -0
- package/dist/server/server/src/controllers/user.js.map +1 -1
- package/dist/server/server/src/controllers/user.mjs +10 -0
- package/dist/server/server/src/controllers/user.mjs.map +1 -1
- package/dist/server/server/src/domain/action/index.js.map +1 -1
- package/dist/server/server/src/domain/action/index.mjs.map +1 -1
- package/dist/server/server/src/domain/condition/index.js.map +1 -1
- package/dist/server/server/src/domain/condition/index.mjs.map +1 -1
- package/dist/server/server/src/domain/permission/index.js.map +1 -1
- package/dist/server/server/src/domain/permission/index.mjs.map +1 -1
- package/dist/server/server/src/middlewares/rateLimit.js.map +1 -1
- package/dist/server/server/src/middlewares/rateLimit.mjs.map +1 -1
- package/dist/server/server/src/routes/serve-admin-panel.js.map +1 -1
- package/dist/server/server/src/routes/serve-admin-panel.mjs.map +1 -1
- package/dist/server/server/src/services/api-token.js.map +1 -1
- package/dist/server/server/src/services/api-token.mjs.map +1 -1
- package/dist/server/server/src/services/auth.js.map +1 -1
- package/dist/server/server/src/services/auth.mjs.map +1 -1
- package/dist/server/server/src/services/content-type.js.map +1 -1
- package/dist/server/server/src/services/content-type.mjs.map +1 -1
- package/dist/server/server/src/services/encryption.js.map +1 -1
- package/dist/server/server/src/services/encryption.mjs.map +1 -1
- package/dist/server/server/src/services/homepage.js.map +1 -1
- package/dist/server/server/src/services/homepage.mjs.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/sanitize.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/validate.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/validate.mjs.map +1 -1
- package/dist/server/server/src/services/role.js.map +1 -1
- package/dist/server/server/src/services/role.mjs.map +1 -1
- package/dist/server/server/src/services/transfer/token.js.map +1 -1
- package/dist/server/server/src/services/transfer/token.mjs.map +1 -1
- package/dist/server/server/src/services/user.js.map +1 -1
- package/dist/server/server/src/services/user.mjs.map +1 -1
- package/dist/server/server/src/utils/index.js.map +1 -1
- package/dist/server/server/src/utils/index.mjs.map +1 -1
- package/dist/server/server/src/validation/action-provider.js.map +1 -1
- package/dist/server/server/src/validation/action-provider.mjs.map +1 -1
- package/dist/server/server/src/validation/common-functions/check-fields-are-correctly-nested.js.map +1 -1
- package/dist/server/server/src/validation/common-functions/check-fields-are-correctly-nested.mjs.map +1 -1
- package/dist/server/server/src/validation/common-validators.js.map +1 -1
- package/dist/server/server/src/validation/common-validators.mjs.map +1 -1
- package/dist/server/src/controllers/user.d.ts.map +1 -1
- package/dist/shared/contracts/ai.d.ts +16 -0
- package/dist/shared/contracts/ai.d.ts.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.mjs","sources":["../../../../../../../server/src/services/permission/permissions-manager/validate.ts"],"sourcesContent":["import { subject as asSubject, detectSubjectType } from '@casl/ability';\nimport { permittedFieldsOf } from '@casl/ability/extra';\nimport {\n defaults,\n omit,\n isArray,\n isEmpty,\n isNil,\n flatMap,\n some,\n prop,\n uniq,\n intersection,\n getOr,\n isObject,\n} from 'lodash/fp';\n\nimport { contentTypes, traverseEntity, traverse, validate, async, errors } from '@strapi/utils';\nimport { ADMIN_USER_ALLOWED_FIELDS } from '../../../domain/user';\n\nconst { ValidationError } = errors;\nconst { throwPassword, throwDisallowedFields } = validate.visitors;\n\nconst { constants, isScalarAttribute, getNonVisibleAttributes, getWritableAttributes } =\n contentTypes;\nconst {\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n} = constants;\n\nconst COMPONENT_FIELDS = ['__component'];\n\nconst STATIC_FIELDS = [ID_ATTRIBUTE, DOC_ID_ATTRIBUTE];\n\nconst throwInvalidKey = ({ key, path }: { key: string; path?: string | null }) => {\n const msg = path && path !== key ? `Invalid key ${key} at ${path}` : `Invalid key ${key}`;\n\n throw new ValidationError(msg);\n};\n\nexport default ({ action, ability, model }: any) => {\n const schema = strapi.getModel(model);\n\n const ctx = {\n schema,\n getModel: strapi.getModel.bind(strapi),\n };\n\n const createValidateQuery = (options = {} as any) => {\n const { fields } = options;\n\n // TODO: validate relations to admin users in all validators\n const permittedFields = fields.shouldIncludeAll ? null : getQueryFields(fields.permitted);\n\n const validateFilters = async.pipe(\n traverse.traverseQueryFilters(throwDisallowedFields(permittedFields), ctx),\n traverse.traverseQueryFilters(throwDisallowedAdminUserFields, ctx),\n traverse.traverseQueryFilters(throwPassword, ctx),\n traverse.traverseQueryFilters(({ key, value, path }) => {\n if (isObject(value) && isEmpty(value)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }, ctx)\n );\n\n const validateSort = async.pipe(\n traverse.traverseQuerySort(throwDisallowedFields(permittedFields), ctx),\n traverse.traverseQuerySort(throwDisallowedAdminUserFields, ctx),\n traverse.traverseQuerySort(throwPassword, ctx),\n traverse.traverseQuerySort(({ key, attribute, value, path }) => {\n if (!isScalarAttribute(attribute) && isEmpty(value)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }, ctx)\n );\n\n const validateFields = async.pipe(\n traverse.traverseQueryFields(throwDisallowedFields(permittedFields), ctx),\n traverse.traverseQueryFields(throwPassword, ctx)\n );\n\n const validatePopulate = async.pipe(\n traverse.traverseQueryPopulate(throwDisallowedFields(permittedFields), ctx),\n traverse.traverseQueryPopulate(throwDisallowedAdminUserFields, ctx),\n traverse.traverseQueryPopulate(throwHiddenFields, ctx),\n traverse.traverseQueryPopulate(throwPassword, ctx)\n );\n\n return async (query: any) => {\n if (query.filters) {\n await validateFilters(query.filters);\n }\n\n if (query.sort) {\n await validateSort(query.sort);\n }\n\n if (query.fields) {\n await validateFields(query.fields);\n }\n\n // a wildcard is always valid; its conversion will be handled by the entity service and can be optimized with sanitizer\n if (query.populate && query.populate !== '*') {\n await validatePopulate(query.populate);\n }\n\n return true;\n };\n };\n\n const createValidateInput = (options = {} as any) => {\n const { fields } = options;\n\n const permittedFields = fields.shouldIncludeAll ? null : getInputFields(fields.permitted);\n\n return async.pipe(\n // Remove fields hidden from the admin\n traverseEntity(throwHiddenFields, ctx),\n // Remove not allowed fields (RBAC)\n traverseEntity(throwDisallowedFields(permittedFields), ctx),\n // Remove roles from createdBy & updatedBy fields\n omitCreatorRoles\n );\n };\n\n const wrapValidate = (createValidateFunction: any) => {\n // TODO\n // @ts-expect-error define the correct return type\n const wrappedValidate = async (data, options = {}): Promise<unknown> => {\n if (isArray(data)) {\n return Promise.all(data.map((entity: unknown) => wrappedValidate(entity, options)));\n }\n\n const { subject, action: actionOverride } = getDefaultOptions(data, options);\n\n const permittedFields = permittedFieldsOf(ability, actionOverride, subject, {\n fieldsFrom: (rule) => rule.fields || [],\n });\n\n const hasAtLeastOneRegistered = some(\n (fields) => !isNil(fields),\n flatMap(prop('fields'), ability.rulesFor(actionOverride, detectSubjectType(subject)))\n );\n const shouldIncludeAllFields = isEmpty(permittedFields) && !hasAtLeastOneRegistered;\n\n const validateOptions = {\n ...options,\n fields: {\n shouldIncludeAll: shouldIncludeAllFields,\n permitted: permittedFields,\n hasAtLeastOneRegistered,\n },\n };\n\n const validateFunction = createValidateFunction(validateOptions);\n\n return validateFunction(data);\n };\n\n return wrappedValidate;\n };\n\n const getDefaultOptions = (data: any, options: unknown) => {\n return defaults({ subject: asSubject(model, data), action }, options);\n };\n\n /**\n * Omit creator fields' (createdBy & updatedBy) roles from the admin API responses\n */\n const omitCreatorRoles = omit([`${CREATED_BY_ATTRIBUTE}.roles`, `${UPDATED_BY_ATTRIBUTE}.roles`]);\n\n /**\n * Visitor used to remove hidden fields from the admin API responses\n */\n const throwHiddenFields = ({ key, schema, path }: any) => {\n const isHidden = getOr(false, ['config', 'attributes', key, 'hidden'], schema);\n\n if (isHidden) {\n throwInvalidKey({ key, path: path.attribute });\n }\n };\n\n /**\n * Visitor used to omit disallowed fields from the admin users entities & avoid leaking sensitive information\n */\n const throwDisallowedAdminUserFields = ({ key, attribute, schema, path }: any) => {\n if (schema.uid === 'admin::user' && attribute && !ADMIN_USER_ALLOWED_FIELDS.includes(key)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n };\n\n const getInputFields = (fields = []) => {\n const nonVisibleAttributes = getNonVisibleAttributes(schema);\n const writableAttributes = getWritableAttributes(schema);\n\n const nonVisibleWritableAttributes = intersection(nonVisibleAttributes, writableAttributes);\n\n return uniq([...fields, ...COMPONENT_FIELDS, ...nonVisibleWritableAttributes]);\n };\n\n const getQueryFields = (fields = []) => {\n return uniq([\n ...fields,\n ...STATIC_FIELDS,\n ...COMPONENT_FIELDS,\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n ]);\n };\n\n return {\n validateQuery: wrapValidate(createValidateQuery),\n validateInput: wrapValidate(createValidateInput),\n };\n};\n"],"names":["ValidationError","errors","throwPassword","throwDisallowedFields","validate","visitors","constants","isScalarAttribute","getNonVisibleAttributes","getWritableAttributes","contentTypes","ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","COMPONENT_FIELDS","STATIC_FIELDS","throwInvalidKey","key","path","msg","action","ability","model","schema","strapi","getModel","ctx","bind","createValidateQuery","options","fields","permittedFields","shouldIncludeAll","getQueryFields","permitted","validateFilters","async","pipe","traverse","traverseQueryFilters","throwDisallowedAdminUserFields","value","isObject","isEmpty","attribute","validateSort","traverseQuerySort","validateFields","traverseQueryFields","validatePopulate","traverseQueryPopulate","throwHiddenFields","query","filters","sort","populate","createValidateInput","getInputFields","traverseEntity","omitCreatorRoles","wrapValidate","createValidateFunction","wrappedValidate","data","isArray","Promise","all","map","entity","subject","actionOverride","getDefaultOptions","permittedFieldsOf","fieldsFrom","rule","hasAtLeastOneRegistered","some","isNil","flatMap","prop","rulesFor","detectSubjectType","shouldIncludeAllFields","validateOptions","validateFunction","defaults","asSubject","omit","isHidden","getOr","uid","ADMIN_USER_ALLOWED_FIELDS","includes","nonVisibleAttributes","writableAttributes","nonVisibleWritableAttributes","intersection","uniq","validateQuery","validateInput"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validate.mjs","sources":["../../../../../../../server/src/services/permission/permissions-manager/validate.ts"],"sourcesContent":["import { subject as asSubject, detectSubjectType } from '@casl/ability';\nimport { permittedFieldsOf } from '@casl/ability/extra';\nimport {\n defaults,\n omit,\n isArray,\n isEmpty,\n isNil,\n flatMap,\n some,\n prop,\n uniq,\n intersection,\n getOr,\n isObject,\n} from 'lodash/fp';\n\nimport { contentTypes, traverseEntity, traverse, validate, async, errors } from '@strapi/utils';\nimport { ADMIN_USER_ALLOWED_FIELDS } from '../../../domain/user';\n\nconst { ValidationError } = errors;\nconst { throwPassword, throwDisallowedFields } = validate.visitors;\n\nconst { constants, isScalarAttribute, getNonVisibleAttributes, getWritableAttributes } =\n contentTypes;\nconst {\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n} = constants;\n\nconst COMPONENT_FIELDS = ['__component'];\n\nconst STATIC_FIELDS = [ID_ATTRIBUTE, DOC_ID_ATTRIBUTE];\n\nconst throwInvalidKey = ({ key, path }: { key: string; path?: string | null }) => {\n const msg = path && path !== key ? `Invalid key ${key} at ${path}` : `Invalid key ${key}`;\n\n throw new ValidationError(msg);\n};\n\nexport default ({ action, ability, model }: any) => {\n const schema = strapi.getModel(model);\n\n const ctx = {\n schema,\n getModel: strapi.getModel.bind(strapi),\n };\n\n const createValidateQuery = (options = {} as any) => {\n const { fields } = options;\n\n // TODO: validate relations to admin users in all validators\n const permittedFields = fields.shouldIncludeAll ? null : getQueryFields(fields.permitted);\n\n const validateFilters = async.pipe(\n traverse.traverseQueryFilters(throwDisallowedFields(permittedFields), ctx),\n traverse.traverseQueryFilters(throwDisallowedAdminUserFields, ctx),\n traverse.traverseQueryFilters(throwPassword, ctx),\n traverse.traverseQueryFilters(({ key, value, path }) => {\n if (isObject(value) && isEmpty(value)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }, ctx)\n );\n\n const validateSort = async.pipe(\n traverse.traverseQuerySort(throwDisallowedFields(permittedFields), ctx),\n traverse.traverseQuerySort(throwDisallowedAdminUserFields, ctx),\n traverse.traverseQuerySort(throwPassword, ctx),\n traverse.traverseQuerySort(({ key, attribute, value, path }) => {\n if (!isScalarAttribute(attribute) && isEmpty(value)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }, ctx)\n );\n\n const validateFields = async.pipe(\n traverse.traverseQueryFields(throwDisallowedFields(permittedFields), ctx),\n traverse.traverseQueryFields(throwPassword, ctx)\n );\n\n const validatePopulate = async.pipe(\n traverse.traverseQueryPopulate(throwDisallowedFields(permittedFields), ctx),\n traverse.traverseQueryPopulate(throwDisallowedAdminUserFields, ctx),\n traverse.traverseQueryPopulate(throwHiddenFields, ctx),\n traverse.traverseQueryPopulate(throwPassword, ctx)\n );\n\n return async (query: any) => {\n if (query.filters) {\n await validateFilters(query.filters);\n }\n\n if (query.sort) {\n await validateSort(query.sort);\n }\n\n if (query.fields) {\n await validateFields(query.fields);\n }\n\n // a wildcard is always valid; its conversion will be handled by the entity service and can be optimized with sanitizer\n if (query.populate && query.populate !== '*') {\n await validatePopulate(query.populate);\n }\n\n return true;\n };\n };\n\n const createValidateInput = (options = {} as any) => {\n const { fields } = options;\n\n const permittedFields = fields.shouldIncludeAll ? null : getInputFields(fields.permitted);\n\n return async.pipe(\n // Remove fields hidden from the admin\n traverseEntity(throwHiddenFields, ctx),\n // Remove not allowed fields (RBAC)\n traverseEntity(throwDisallowedFields(permittedFields), ctx),\n // Remove roles from createdBy & updatedBy fields\n omitCreatorRoles\n );\n };\n\n const wrapValidate = (createValidateFunction: any) => {\n // TODO\n // @ts-expect-error define the correct return type\n const wrappedValidate = async (data, options = {}): Promise<unknown> => {\n if (isArray(data)) {\n return Promise.all(data.map((entity: unknown) => wrappedValidate(entity, options)));\n }\n\n const { subject, action: actionOverride } = getDefaultOptions(data, options);\n\n const permittedFields = permittedFieldsOf(ability, actionOverride, subject, {\n fieldsFrom: (rule) => rule.fields || [],\n });\n\n const hasAtLeastOneRegistered = some(\n (fields) => !isNil(fields),\n flatMap(prop('fields'), ability.rulesFor(actionOverride, detectSubjectType(subject)))\n );\n const shouldIncludeAllFields = isEmpty(permittedFields) && !hasAtLeastOneRegistered;\n\n const validateOptions = {\n ...options,\n fields: {\n shouldIncludeAll: shouldIncludeAllFields,\n permitted: permittedFields,\n hasAtLeastOneRegistered,\n },\n };\n\n const validateFunction = createValidateFunction(validateOptions);\n\n return validateFunction(data);\n };\n\n return wrappedValidate;\n };\n\n const getDefaultOptions = (data: any, options: unknown) => {\n return defaults({ subject: asSubject(model, data), action }, options);\n };\n\n /**\n * Omit creator fields' (createdBy & updatedBy) roles from the admin API responses\n */\n const omitCreatorRoles = omit([`${CREATED_BY_ATTRIBUTE}.roles`, `${UPDATED_BY_ATTRIBUTE}.roles`]);\n\n /**\n * Visitor used to remove hidden fields from the admin API responses\n */\n const throwHiddenFields = ({ key, schema, path }: any) => {\n const isHidden = getOr(false, ['config', 'attributes', key, 'hidden'], schema);\n\n if (isHidden) {\n throwInvalidKey({ key, path: path.attribute });\n }\n };\n\n /**\n * Visitor used to omit disallowed fields from the admin users entities & avoid leaking sensitive information\n */\n const throwDisallowedAdminUserFields = ({ key, attribute, schema, path }: any) => {\n if (schema.uid === 'admin::user' && attribute && !ADMIN_USER_ALLOWED_FIELDS.includes(key)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n };\n\n const getInputFields = (fields = []) => {\n const nonVisibleAttributes = getNonVisibleAttributes(schema);\n const writableAttributes = getWritableAttributes(schema);\n\n const nonVisibleWritableAttributes = intersection(nonVisibleAttributes, writableAttributes);\n\n return uniq([...fields, ...COMPONENT_FIELDS, ...nonVisibleWritableAttributes]);\n };\n\n const getQueryFields = (fields = []) => {\n return uniq([\n ...fields,\n ...STATIC_FIELDS,\n ...COMPONENT_FIELDS,\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n ]);\n };\n\n return {\n validateQuery: wrapValidate(createValidateQuery),\n validateInput: wrapValidate(createValidateInput),\n };\n};\n"],"names":["ValidationError","errors","throwPassword","throwDisallowedFields","validate","visitors","constants","isScalarAttribute","getNonVisibleAttributes","getWritableAttributes","contentTypes","ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","COMPONENT_FIELDS","STATIC_FIELDS","throwInvalidKey","key","path","msg","action","ability","model","schema","strapi","getModel","ctx","bind","createValidateQuery","options","fields","permittedFields","shouldIncludeAll","getQueryFields","permitted","validateFilters","async","pipe","traverse","traverseQueryFilters","throwDisallowedAdminUserFields","value","isObject","isEmpty","attribute","validateSort","traverseQuerySort","validateFields","traverseQueryFields","validatePopulate","traverseQueryPopulate","throwHiddenFields","query","filters","sort","populate","createValidateInput","getInputFields","traverseEntity","omitCreatorRoles","wrapValidate","createValidateFunction","wrappedValidate","data","isArray","Promise","all","map","entity","subject","actionOverride","getDefaultOptions","permittedFieldsOf","fieldsFrom","rule","hasAtLeastOneRegistered","some","isNil","flatMap","prop","rulesFor","detectSubjectType","shouldIncludeAllFields","validateOptions","validateFunction","defaults","asSubject","omit","isHidden","getOr","uid","ADMIN_USER_ALLOWED_FIELDS","includes","nonVisibleAttributes","writableAttributes","nonVisibleWritableAttributes","intersection","uniq","validateQuery","validateInput"],"mappings":"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"}
|
|
@@ -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};\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 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","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","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};\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 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","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","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 +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};\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 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","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","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};\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 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","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","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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sources":["../../../../../../server/src/services/transfer/token.ts"],"sourcesContent":["import crypto from 'crypto';\nimport assert from 'assert';\nimport { map, isArray, omit, uniq, isNil, difference, isEmpty, isNumber } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport '@strapi/types';\nimport constants from '../constants';\nimport { getService } from '../../utils';\nimport {\n DatabaseTransferToken,\n SanitizedTransferToken,\n TokenCreatePayload,\n TokenUpdatePayload,\n TransferToken,\n TransferTokenPermission,\n} from '../../../../shared/contracts/transfer';\n\nconst { ValidationError, NotFoundError } = errors;\n\nconst TRANSFER_TOKEN_UID = 'admin::transfer-token';\nconst TRANSFER_TOKEN_PERMISSION_UID = 'admin::transfer-token-permission';\n\nconst SELECT_FIELDS = [\n 'id',\n 'name',\n 'description',\n 'lastUsedAt',\n 'lifespan',\n 'expiresAt',\n 'createdAt',\n 'updatedAt',\n] as const;\n\nconst POPULATE_FIELDS = ['permissions'] as const;\n\n/**\n * Return a list of all tokens and their permissions\n */\nconst list = async (): Promise<SanitizedTransferToken[]> => {\n const tokens: DatabaseTransferToken[] = await strapi.db.query(TRANSFER_TOKEN_UID).findMany({\n select: SELECT_FIELDS,\n populate: POPULATE_FIELDS,\n orderBy: { name: 'ASC' },\n });\n\n if (!tokens) return tokens;\n return tokens.map((token) => flattenTokenPermissions(token));\n};\n\n/**\n * Create a random token's access key\n */\nconst generateRandomAccessKey = (): string => crypto.randomBytes(128).toString('hex');\n\n/**\n * Validate the given access key's format and returns it if valid\n */\nconst validateAccessKey = (accessKey: string): string => {\n assert(typeof accessKey === 'string', 'Access key needs to be a string');\n assert(accessKey.length >= 15, 'Access key needs to have at least 15 characters');\n\n return accessKey;\n};\n\nexport const hasAccessKey = <T extends { accessKey?: string }>(\n attributes: T\n): attributes is T & { accessKey: string } => {\n return 'accessKey' in attributes;\n};\n\n/**\n * Create a token and its permissions\n */\nconst create = async (attributes: TokenCreatePayload): Promise<TransferToken> => {\n const accessKey = hasAccessKey(attributes)\n ? validateAccessKey(attributes.accessKey)\n : generateRandomAccessKey();\n\n // Make sure the access key isn't picked up directly from the attributes for the next steps\n delete attributes.accessKey;\n\n assertTokenPermissionsValidity(attributes);\n assertValidLifespan(attributes.lifespan);\n\n const result = (await strapi.db.transaction(async () => {\n const transferToken = await strapi.db.query(TRANSFER_TOKEN_UID).create({\n select: SELECT_FIELDS,\n populate: POPULATE_FIELDS,\n data: {\n ...omit('permissions', attributes),\n accessKey: hash(accessKey),\n ...getExpirationFields(attributes.lifespan),\n },\n });\n\n await Promise.all(\n uniq(attributes.permissions).map((action) =>\n strapi.db\n .query(TRANSFER_TOKEN_PERMISSION_UID)\n .create({ data: { action, token: transferToken } })\n )\n );\n\n const currentPermissions: TransferTokenPermission[] = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(transferToken, 'permissions');\n\n if (currentPermissions) {\n Object.assign(transferToken, { permissions: map('action', currentPermissions) });\n }\n\n return transferToken;\n })) as TransferToken;\n\n return { ...result, accessKey };\n};\n\n/**\n * Update a token and its permissions\n */\nconst update = async (\n id: string | number,\n attributes: TokenUpdatePayload\n): Promise<SanitizedTransferToken> => {\n // retrieve token without permissions\n const originalToken = await strapi.db.query(TRANSFER_TOKEN_UID).findOne({ where: { id } });\n\n if (!originalToken) {\n throw new NotFoundError('Token not found');\n }\n\n assertTokenPermissionsValidity(attributes);\n assertValidLifespan(attributes.lifespan);\n\n return strapi.db.transaction(async () => {\n const updatedToken = await strapi.db.query(TRANSFER_TOKEN_UID).update({\n select: SELECT_FIELDS,\n where: { id },\n data: {\n ...omit('permissions', attributes),\n },\n });\n\n if (attributes.permissions) {\n const currentPermissionsResult = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(updatedToken, 'permissions');\n\n const currentPermissions = map('action', currentPermissionsResult || []);\n const newPermissions = uniq(attributes.permissions);\n\n const actionsToDelete = difference(currentPermissions, newPermissions);\n const actionsToAdd = difference(newPermissions, currentPermissions);\n\n // TODO: improve efficiency here\n // method using a loop -- works but very inefficient\n await Promise.all(\n actionsToDelete.map((action) =>\n strapi.db.query(TRANSFER_TOKEN_PERMISSION_UID).delete({\n where: { action, token: id },\n })\n )\n );\n\n // TODO: improve efficiency here\n // using a loop -- works but very inefficient\n await Promise.all(\n actionsToAdd.map((action) =>\n strapi.db.query(TRANSFER_TOKEN_PERMISSION_UID).create({\n data: { action, token: id },\n })\n )\n );\n }\n\n // retrieve permissions\n const permissionsFromDb: TransferTokenPermission[] = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(updatedToken, 'permissions');\n\n return {\n ...updatedToken,\n permissions: permissionsFromDb ? permissionsFromDb.map((p) => p.action) : undefined,\n };\n }) as unknown as Promise<SanitizedTransferToken>;\n};\n\n/**\n * Revoke (delete) a token\n */\nconst revoke = async (id: string | number): Promise<SanitizedTransferToken> => {\n return strapi.db.transaction(async () =>\n strapi.db\n .query(TRANSFER_TOKEN_UID)\n .delete({ select: SELECT_FIELDS, populate: POPULATE_FIELDS, where: { id } })\n ) as unknown as Promise<SanitizedTransferToken>;\n};\n\n/**\n * Get a token\n */\nconst getBy = async (\n whereParams = {} as {\n id?: string | number;\n name?: string;\n lastUsedAt?: number;\n description?: string;\n accessKey?: string;\n }\n): Promise<SanitizedTransferToken | null> => {\n if (Object.keys(whereParams).length === 0) {\n return null;\n }\n\n const token = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .findOne({ select: SELECT_FIELDS, populate: POPULATE_FIELDS, where: whereParams });\n\n if (!token) {\n return token;\n }\n\n return flattenTokenPermissions(token);\n};\n\n/**\n * Retrieve a token by id\n */\nconst getById = async (id: string | number): Promise<SanitizedTransferToken | null> => {\n return getBy({ id });\n};\n\n/**\n * Retrieve a token by name\n */\nconst getByName = async (name: string): Promise<SanitizedTransferToken | null> => {\n return getBy({ name });\n};\n\n/**\n * Check if token exists\n */\nconst exists = async (\n whereParams = {} as {\n id?: string | number;\n name?: string;\n lastUsedAt?: number;\n description?: string;\n accessKey?: string;\n }\n): Promise<boolean> => {\n const transferToken = await getBy(whereParams);\n\n return !!transferToken;\n};\n\nconst regenerate = async (id: string | number): Promise<TransferToken> => {\n const accessKey = crypto.randomBytes(128).toString('hex');\n const transferToken = (await strapi.db.transaction(async () =>\n strapi.db.query(TRANSFER_TOKEN_UID).update({\n select: ['id', 'accessKey'],\n where: { id },\n data: {\n accessKey: hash(accessKey),\n },\n })\n )) as Promise<TransferToken>;\n\n if (!transferToken) {\n throw new NotFoundError('The provided token id does not exist');\n }\n\n return {\n ...transferToken,\n accessKey,\n };\n};\n\nconst getExpirationFields = (lifespan: TransferToken['lifespan']) => {\n // it must be nil or a finite number >= 0\n const isValidNumber = isNumber(lifespan) && Number.isFinite(lifespan) && lifespan > 0;\n if (!isValidNumber && !isNil(lifespan)) {\n throw new ValidationError('lifespan must be a positive number or null');\n }\n\n return {\n lifespan: lifespan || null,\n expiresAt: lifespan ? Date.now() + lifespan : null,\n };\n};\n\n/**\n * Return a secure sha512 hash of an accessKey\n */\nconst hash = (accessKey: string): string => {\n const { hasValidTokenSalt } = getService('transfer').utils;\n\n if (!hasValidTokenSalt()) {\n throw new TypeError('Required token salt is not defined');\n }\n\n return crypto\n .createHmac('sha512', strapi.config.get('admin.transfer.token.salt'))\n .update(accessKey)\n .digest('hex');\n};\n\nconst checkSaltIsDefined = () => {\n const { hasValidTokenSalt } = getService('transfer').utils;\n\n // Ignore the check if the data-transfer feature is manually disabled\n if (!strapi.config.get('server.transfer.remote.enabled')) {\n return;\n }\n\n if (!hasValidTokenSalt()) {\n process.emitWarning(\n `Missing transfer.token.salt: Data transfer features have been disabled.\nPlease set transfer.token.salt in config/admin.js (ex: you can generate one using Node with \\`crypto.randomBytes(16).toString('base64')\\`)\nFor security reasons, prefer storing the secret in an environment variable and read it in config/admin.js. See https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/configurations/optional/environment.html#configuration-using-environment-variables.`\n );\n }\n};\n\n/**\n * Flatten a token's database permissions objects to an array of strings\n */\nconst flattenTokenPermissions = (token: DatabaseTransferToken): TransferToken => {\n if (!token) {\n return token;\n }\n\n return {\n ...token,\n permissions: isArray(token.permissions)\n ? map('action', token.permissions as TransferTokenPermission[])\n : token.permissions,\n };\n};\n\n/**\n * Assert that a token's permissions are valid\n */\nconst assertTokenPermissionsValidity = (attributes: TokenUpdatePayload) => {\n const permissionService = strapi.service('admin::transfer').permission;\n const validPermissions = permissionService.providers.action.keys();\n const invalidPermissions = difference(attributes.permissions, validPermissions);\n\n if (!isEmpty(invalidPermissions)) {\n throw new ValidationError(`Unknown permissions provided: ${invalidPermissions.join(', ')}`);\n }\n};\n\n/**\n * Check if a token's lifespan is valid\n */\nconst isValidLifespan = (lifespan: unknown) => {\n if (isNil(lifespan)) {\n return true;\n }\n\n if (\n !isNumber(lifespan) ||\n !Object.values(constants.TRANSFER_TOKEN_LIFESPANS).includes(lifespan)\n ) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Assert that a token's lifespan is valid\n */\nconst assertValidLifespan = (lifespan: unknown) => {\n if (!isValidLifespan(lifespan)) {\n throw new ValidationError(\n `lifespan must be one of the following values:\n ${Object.values(constants.TRANSFER_TOKEN_LIFESPANS).join(', ')}`\n );\n }\n};\n\nexport {\n create,\n list,\n exists,\n getBy,\n getById,\n getByName,\n update,\n revoke,\n regenerate,\n hash,\n checkSaltIsDefined,\n};\n"],"names":["ValidationError","NotFoundError","errors","TRANSFER_TOKEN_UID","TRANSFER_TOKEN_PERMISSION_UID","SELECT_FIELDS","POPULATE_FIELDS","list","tokens","strapi","db","query","findMany","select","populate","orderBy","name","map","token","flattenTokenPermissions","generateRandomAccessKey","crypto","randomBytes","toString","validateAccessKey","accessKey","assert","length","hasAccessKey","attributes","create","assertTokenPermissionsValidity","assertValidLifespan","lifespan","result","transaction","transferToken","data","omit","hash","getExpirationFields","Promise","all","uniq","permissions","action","currentPermissions","load","Object","assign","update","id","originalToken","findOne","where","updatedToken","currentPermissionsResult","newPermissions","actionsToDelete","difference","actionsToAdd","delete","permissionsFromDb","p","undefined","revoke","getBy","whereParams","keys","getById","getByName","exists","regenerate","isValidNumber","isNumber","Number","isFinite","isNil","expiresAt","Date","now","hasValidTokenSalt","getService","utils","TypeError","createHmac","config","get","digest","checkSaltIsDefined","process","emitWarning","isArray","permissionService","service","permission","validPermissions","providers","invalidPermissions","isEmpty","join","isValidLifespan","values","constants","TRANSFER_TOKEN_LIFESPANS","includes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"token.js","sources":["../../../../../../server/src/services/transfer/token.ts"],"sourcesContent":["import crypto from 'crypto';\nimport assert from 'assert';\nimport { map, isArray, omit, uniq, isNil, difference, isEmpty, isNumber } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport '@strapi/types';\nimport constants from '../constants';\nimport { getService } from '../../utils';\nimport {\n DatabaseTransferToken,\n SanitizedTransferToken,\n TokenCreatePayload,\n TokenUpdatePayload,\n TransferToken,\n TransferTokenPermission,\n} from '../../../../shared/contracts/transfer';\n\nconst { ValidationError, NotFoundError } = errors;\n\nconst TRANSFER_TOKEN_UID = 'admin::transfer-token';\nconst TRANSFER_TOKEN_PERMISSION_UID = 'admin::transfer-token-permission';\n\nconst SELECT_FIELDS = [\n 'id',\n 'name',\n 'description',\n 'lastUsedAt',\n 'lifespan',\n 'expiresAt',\n 'createdAt',\n 'updatedAt',\n] as const;\n\nconst POPULATE_FIELDS = ['permissions'] as const;\n\n/**\n * Return a list of all tokens and their permissions\n */\nconst list = async (): Promise<SanitizedTransferToken[]> => {\n const tokens: DatabaseTransferToken[] = await strapi.db.query(TRANSFER_TOKEN_UID).findMany({\n select: SELECT_FIELDS,\n populate: POPULATE_FIELDS,\n orderBy: { name: 'ASC' },\n });\n\n if (!tokens) return tokens;\n return tokens.map((token) => flattenTokenPermissions(token));\n};\n\n/**\n * Create a random token's access key\n */\nconst generateRandomAccessKey = (): string => crypto.randomBytes(128).toString('hex');\n\n/**\n * Validate the given access key's format and returns it if valid\n */\nconst validateAccessKey = (accessKey: string): string => {\n assert(typeof accessKey === 'string', 'Access key needs to be a string');\n assert(accessKey.length >= 15, 'Access key needs to have at least 15 characters');\n\n return accessKey;\n};\n\nexport const hasAccessKey = <T extends { accessKey?: string }>(\n attributes: T\n): attributes is T & { accessKey: string } => {\n return 'accessKey' in attributes;\n};\n\n/**\n * Create a token and its permissions\n */\nconst create = async (attributes: TokenCreatePayload): Promise<TransferToken> => {\n const accessKey = hasAccessKey(attributes)\n ? validateAccessKey(attributes.accessKey)\n : generateRandomAccessKey();\n\n // Make sure the access key isn't picked up directly from the attributes for the next steps\n delete attributes.accessKey;\n\n assertTokenPermissionsValidity(attributes);\n assertValidLifespan(attributes.lifespan);\n\n const result = (await strapi.db.transaction(async () => {\n const transferToken = await strapi.db.query(TRANSFER_TOKEN_UID).create({\n select: SELECT_FIELDS,\n populate: POPULATE_FIELDS,\n data: {\n ...omit('permissions', attributes),\n accessKey: hash(accessKey),\n ...getExpirationFields(attributes.lifespan),\n },\n });\n\n await Promise.all(\n uniq(attributes.permissions).map((action) =>\n strapi.db\n .query(TRANSFER_TOKEN_PERMISSION_UID)\n .create({ data: { action, token: transferToken } })\n )\n );\n\n const currentPermissions: TransferTokenPermission[] = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(transferToken, 'permissions');\n\n if (currentPermissions) {\n Object.assign(transferToken, { permissions: map('action', currentPermissions) });\n }\n\n return transferToken;\n })) as TransferToken;\n\n return { ...result, accessKey };\n};\n\n/**\n * Update a token and its permissions\n */\nconst update = async (\n id: string | number,\n attributes: TokenUpdatePayload\n): Promise<SanitizedTransferToken> => {\n // retrieve token without permissions\n const originalToken = await strapi.db.query(TRANSFER_TOKEN_UID).findOne({ where: { id } });\n\n if (!originalToken) {\n throw new NotFoundError('Token not found');\n }\n\n assertTokenPermissionsValidity(attributes);\n assertValidLifespan(attributes.lifespan);\n\n return strapi.db.transaction(async () => {\n const updatedToken = await strapi.db.query(TRANSFER_TOKEN_UID).update({\n select: SELECT_FIELDS,\n where: { id },\n data: {\n ...omit('permissions', attributes),\n },\n });\n\n if (attributes.permissions) {\n const currentPermissionsResult = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(updatedToken, 'permissions');\n\n const currentPermissions = map('action', currentPermissionsResult || []);\n const newPermissions = uniq(attributes.permissions);\n\n const actionsToDelete = difference(currentPermissions, newPermissions);\n const actionsToAdd = difference(newPermissions, currentPermissions);\n\n // TODO: improve efficiency here\n // method using a loop -- works but very inefficient\n await Promise.all(\n actionsToDelete.map((action) =>\n strapi.db.query(TRANSFER_TOKEN_PERMISSION_UID).delete({\n where: { action, token: id },\n })\n )\n );\n\n // TODO: improve efficiency here\n // using a loop -- works but very inefficient\n await Promise.all(\n actionsToAdd.map((action) =>\n strapi.db.query(TRANSFER_TOKEN_PERMISSION_UID).create({\n data: { action, token: id },\n })\n )\n );\n }\n\n // retrieve permissions\n const permissionsFromDb: TransferTokenPermission[] = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(updatedToken, 'permissions');\n\n return {\n ...updatedToken,\n permissions: permissionsFromDb ? permissionsFromDb.map((p) => p.action) : undefined,\n };\n }) as unknown as Promise<SanitizedTransferToken>;\n};\n\n/**\n * Revoke (delete) a token\n */\nconst revoke = async (id: string | number): Promise<SanitizedTransferToken> => {\n return strapi.db.transaction(async () =>\n strapi.db\n .query(TRANSFER_TOKEN_UID)\n .delete({ select: SELECT_FIELDS, populate: POPULATE_FIELDS, where: { id } })\n ) as unknown as Promise<SanitizedTransferToken>;\n};\n\n/**\n * Get a token\n */\nconst getBy = async (\n whereParams = {} as {\n id?: string | number;\n name?: string;\n lastUsedAt?: number;\n description?: string;\n accessKey?: string;\n }\n): Promise<SanitizedTransferToken | null> => {\n if (Object.keys(whereParams).length === 0) {\n return null;\n }\n\n const token = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .findOne({ select: SELECT_FIELDS, populate: POPULATE_FIELDS, where: whereParams });\n\n if (!token) {\n return token;\n }\n\n return flattenTokenPermissions(token);\n};\n\n/**\n * Retrieve a token by id\n */\nconst getById = async (id: string | number): Promise<SanitizedTransferToken | null> => {\n return getBy({ id });\n};\n\n/**\n * Retrieve a token by name\n */\nconst getByName = async (name: string): Promise<SanitizedTransferToken | null> => {\n return getBy({ name });\n};\n\n/**\n * Check if token exists\n */\nconst exists = async (\n whereParams = {} as {\n id?: string | number;\n name?: string;\n lastUsedAt?: number;\n description?: string;\n accessKey?: string;\n }\n): Promise<boolean> => {\n const transferToken = await getBy(whereParams);\n\n return !!transferToken;\n};\n\nconst regenerate = async (id: string | number): Promise<TransferToken> => {\n const accessKey = crypto.randomBytes(128).toString('hex');\n const transferToken = (await strapi.db.transaction(async () =>\n strapi.db.query(TRANSFER_TOKEN_UID).update({\n select: ['id', 'accessKey'],\n where: { id },\n data: {\n accessKey: hash(accessKey),\n },\n })\n )) as Promise<TransferToken>;\n\n if (!transferToken) {\n throw new NotFoundError('The provided token id does not exist');\n }\n\n return {\n ...transferToken,\n accessKey,\n };\n};\n\nconst getExpirationFields = (lifespan: TransferToken['lifespan']) => {\n // it must be nil or a finite number >= 0\n const isValidNumber = isNumber(lifespan) && Number.isFinite(lifespan) && lifespan > 0;\n if (!isValidNumber && !isNil(lifespan)) {\n throw new ValidationError('lifespan must be a positive number or null');\n }\n\n return {\n lifespan: lifespan || null,\n expiresAt: lifespan ? Date.now() + lifespan : null,\n };\n};\n\n/**\n * Return a secure sha512 hash of an accessKey\n */\nconst hash = (accessKey: string): string => {\n const { hasValidTokenSalt } = getService('transfer').utils;\n\n if (!hasValidTokenSalt()) {\n throw new TypeError('Required token salt is not defined');\n }\n\n return crypto\n .createHmac('sha512', strapi.config.get('admin.transfer.token.salt'))\n .update(accessKey)\n .digest('hex');\n};\n\nconst checkSaltIsDefined = () => {\n const { hasValidTokenSalt } = getService('transfer').utils;\n\n // Ignore the check if the data-transfer feature is manually disabled\n if (!strapi.config.get('server.transfer.remote.enabled')) {\n return;\n }\n\n if (!hasValidTokenSalt()) {\n process.emitWarning(\n `Missing transfer.token.salt: Data transfer features have been disabled.\nPlease set transfer.token.salt in config/admin.js (ex: you can generate one using Node with \\`crypto.randomBytes(16).toString('base64')\\`)\nFor security reasons, prefer storing the secret in an environment variable and read it in config/admin.js. See https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/configurations/optional/environment.html#configuration-using-environment-variables.`\n );\n }\n};\n\n/**\n * Flatten a token's database permissions objects to an array of strings\n */\nconst flattenTokenPermissions = (token: DatabaseTransferToken): TransferToken => {\n if (!token) {\n return token;\n }\n\n return {\n ...token,\n permissions: isArray(token.permissions)\n ? map('action', token.permissions as TransferTokenPermission[])\n : token.permissions,\n };\n};\n\n/**\n * Assert that a token's permissions are valid\n */\nconst assertTokenPermissionsValidity = (attributes: TokenUpdatePayload) => {\n const permissionService = strapi.service('admin::transfer').permission;\n const validPermissions = permissionService.providers.action.keys();\n const invalidPermissions = difference(attributes.permissions, validPermissions);\n\n if (!isEmpty(invalidPermissions)) {\n throw new ValidationError(`Unknown permissions provided: ${invalidPermissions.join(', ')}`);\n }\n};\n\n/**\n * Check if a token's lifespan is valid\n */\nconst isValidLifespan = (lifespan: unknown) => {\n if (isNil(lifespan)) {\n return true;\n }\n\n if (\n !isNumber(lifespan) ||\n !Object.values(constants.TRANSFER_TOKEN_LIFESPANS).includes(lifespan)\n ) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Assert that a token's lifespan is valid\n */\nconst assertValidLifespan = (lifespan: unknown) => {\n if (!isValidLifespan(lifespan)) {\n throw new ValidationError(\n `lifespan must be one of the following values:\n ${Object.values(constants.TRANSFER_TOKEN_LIFESPANS).join(', ')}`\n );\n }\n};\n\nexport {\n create,\n list,\n exists,\n getBy,\n getById,\n getByName,\n update,\n revoke,\n regenerate,\n hash,\n checkSaltIsDefined,\n};\n"],"names":["ValidationError","NotFoundError","errors","TRANSFER_TOKEN_UID","TRANSFER_TOKEN_PERMISSION_UID","SELECT_FIELDS","POPULATE_FIELDS","list","tokens","strapi","db","query","findMany","select","populate","orderBy","name","map","token","flattenTokenPermissions","generateRandomAccessKey","crypto","randomBytes","toString","validateAccessKey","accessKey","assert","length","hasAccessKey","attributes","create","assertTokenPermissionsValidity","assertValidLifespan","lifespan","result","transaction","transferToken","data","omit","hash","getExpirationFields","Promise","all","uniq","permissions","action","currentPermissions","load","Object","assign","update","id","originalToken","findOne","where","updatedToken","currentPermissionsResult","newPermissions","actionsToDelete","difference","actionsToAdd","delete","permissionsFromDb","p","undefined","revoke","getBy","whereParams","keys","getById","getByName","exists","regenerate","isValidNumber","isNumber","Number","isFinite","isNil","expiresAt","Date","now","hasValidTokenSalt","getService","utils","TypeError","createHmac","config","get","digest","checkSaltIsDefined","process","emitWarning","isArray","permissionService","service","permission","validPermissions","providers","invalidPermissions","isEmpty","join","isValidLifespan","values","constants","TRANSFER_TOKEN_LIFESPANS","includes"],"mappings":"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"}
|