@strapi/admin 5.57.0 → 5.59.0
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/ConfirmDialog.js +10 -9
- package/dist/admin/admin/src/components/ConfirmDialog.js.map +1 -1
- package/dist/admin/admin/src/components/ConfirmDialog.mjs +10 -9
- package/dist/admin/admin/src/components/ConfirmDialog.mjs.map +1 -1
- package/dist/admin/admin/src/components/Filters.js +57 -12
- package/dist/admin/admin/src/components/Filters.js.map +1 -1
- package/dist/admin/admin/src/components/Filters.mjs +57 -12
- package/dist/admin/admin/src/components/Filters.mjs.map +1 -1
- package/dist/admin/admin/src/components/Form.js +3 -1
- package/dist/admin/admin/src/components/Form.js.map +1 -1
- package/dist/admin/admin/src/components/Form.mjs +3 -1
- package/dist/admin/admin/src/components/Form.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Boolean.js +3 -2
- package/dist/admin/admin/src/components/FormInputs/Boolean.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Boolean.mjs +3 -2
- package/dist/admin/admin/src/components/FormInputs/Boolean.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.js +2 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs +2 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs.map +1 -1
- package/dist/admin/admin/src/components/LeftMenu.js +5 -1
- package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
- package/dist/admin/admin/src/components/LeftMenu.mjs +5 -1
- package/dist/admin/admin/src/components/LeftMenu.mjs.map +1 -1
- package/dist/admin/admin/src/components/PageHelpers.js +2 -1
- package/dist/admin/admin/src/components/PageHelpers.js.map +1 -1
- package/dist/admin/admin/src/components/PageHelpers.mjs +2 -1
- package/dist/admin/admin/src/components/PageHelpers.mjs.map +1 -1
- package/dist/admin/admin/src/components/Pagination.js +7 -6
- package/dist/admin/admin/src/components/Pagination.js.map +1 -1
- package/dist/admin/admin/src/components/Pagination.mjs +7 -6
- package/dist/admin/admin/src/components/Pagination.mjs.map +1 -1
- package/dist/admin/admin/src/components/RelativeTime.js +2 -1
- package/dist/admin/admin/src/components/RelativeTime.js.map +1 -1
- package/dist/admin/admin/src/components/RelativeTime.mjs +2 -1
- package/dist/admin/admin/src/components/RelativeTime.mjs.map +1 -1
- package/dist/admin/admin/src/components/SubNav.js +6 -12
- package/dist/admin/admin/src/components/SubNav.js.map +1 -1
- package/dist/admin/admin/src/components/SubNav.mjs +7 -13
- package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
- package/dist/admin/admin/src/components/Table.js +3 -1
- package/dist/admin/admin/src/components/Table.js.map +1 -1
- package/dist/admin/admin/src/components/Table.mjs +3 -1
- package/dist/admin/admin/src/components/Table.mjs.map +1 -1
- package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
- package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
- package/dist/admin/admin/src/components/WidgetRoot.js.map +1 -1
- package/dist/admin/admin/src/components/WidgetRoot.mjs.map +1 -1
- package/dist/admin/admin/src/constants.js +14 -0
- package/dist/admin/admin/src/constants.js.map +1 -1
- package/dist/admin/admin/src/constants.mjs +14 -0
- package/dist/admin/admin/src/constants.mjs.map +1 -1
- package/dist/admin/admin/src/core/apis/Plugin.js.map +1 -1
- package/dist/admin/admin/src/core/apis/Plugin.mjs.map +1 -1
- package/dist/admin/admin/src/features/Auth.js +2 -1
- package/dist/admin/admin/src/features/Auth.js.map +1 -1
- package/dist/admin/admin/src/features/Auth.mjs +2 -1
- package/dist/admin/admin/src/features/Auth.mjs.map +1 -1
- package/dist/admin/admin/src/features/StrapiApp.js.map +1 -1
- package/dist/admin/admin/src/features/StrapiApp.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/pages/Auth/components/ResetPassword.js +6 -12
- package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/ResetPassword.mjs +6 -12
- package/dist/admin/admin/src/pages/Auth/components/ResetPassword.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs.map +1 -1
- package/dist/admin/admin/src/pages/ProfilePage.js +2 -2
- package/dist/admin/admin/src/pages/ProfilePage.js.map +1 -1
- package/dist/admin/admin/src/pages/ProfilePage.mjs +2 -2
- package/dist/admin/admin/src/pages/ProfilePage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +10 -2
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs +10 -2
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.js +4 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.mjs +4 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js +3 -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 +3 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenTypeSelect.js +2 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenTypeSelect.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenTypeSelect.mjs +2 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenTypeSelect.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js +6 -5
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.mjs +6 -5
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js +2 -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 +2 -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 +4 -4
- 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 +4 -4
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +7 -58
- 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 +7 -58
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.js +217 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.js.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.mjs +195 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.mjs.map +1 -0
- 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/components/PlanCard.js +185 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.js.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.mjs +162 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.mjs.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.js +342 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.js.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.mjs +320 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.mjs.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js +9 -4
- 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 +9 -4
- 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 +15 -9
- 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 +15 -9
- 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 +5 -2
- 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 +5 -2
- 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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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/hooks/usePermissionsDataManager.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js +3 -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 +3 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.mjs.map +1 -1
- 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.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/NewUserForm.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/NewUserForm.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.js +4 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.mjs +4 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js +18 -3
- 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 +18 -3
- 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.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.mjs.map +1 -1
- package/dist/admin/admin/src/router.js.map +1 -1
- package/dist/admin/admin/src/router.mjs.map +1 -1
- package/dist/admin/admin/src/services/admin.js +11 -1
- package/dist/admin/admin/src/services/admin.js.map +1 -1
- package/dist/admin/admin/src/services/admin.mjs +11 -2
- package/dist/admin/admin/src/services/admin.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/translations/en.json.js +71 -4
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +71 -4
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/eu.json.js +1 -1
- package/dist/admin/admin/src/translations/eu.json.mjs +1 -1
- package/dist/admin/admin/src/utils/browserStrapi.js +1 -1
- package/dist/admin/admin/src/utils/browserStrapi.js.map +1 -1
- package/dist/admin/admin/src/utils/browserStrapi.mjs +1 -1
- package/dist/admin/admin/src/utils/browserStrapi.mjs.map +1 -1
- package/dist/admin/admin/src/utils/cookies.js +7 -6
- package/dist/admin/admin/src/utils/cookies.js.map +1 -1
- package/dist/admin/admin/src/utils/cookies.mjs +7 -6
- package/dist/admin/admin/src/utils/cookies.mjs.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.js +24 -0
- package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.mjs +24 -1
- package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
- package/dist/admin/admin/tests/utils.js +2 -1
- package/dist/admin/admin/tests/utils.js.map +1 -1
- package/dist/admin/admin/tests/utils.mjs +2 -1
- package/dist/admin/admin/tests/utils.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +52 -22
- 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 +53 -23
- 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/ApplicationInfoPage/components/AdminSeatInfo.js +16 -29
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs +18 -31
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.js +473 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.js.map +1 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.mjs +471 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.mjs.map +1 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +2 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +2 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
- package/dist/admin/index.js +1 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/admin/shared/utils/auth-cookie-path.js +13 -10
- package/dist/admin/shared/utils/auth-cookie-path.js.map +1 -1
- package/dist/admin/shared/utils/auth-cookie-path.mjs +13 -10
- package/dist/admin/shared/utils/auth-cookie-path.mjs.map +1 -1
- package/dist/admin/shared/utils/get-project-type.js +49 -0
- package/dist/admin/shared/utils/get-project-type.js.map +1 -0
- package/dist/admin/shared/utils/get-project-type.mjs +46 -0
- package/dist/admin/shared/utils/get-project-type.mjs.map +1 -0
- package/dist/admin/src/components/Filters.d.ts +1 -1
- package/dist/admin/src/components/Form.d.ts +1 -1
- package/dist/admin/src/constants.d.ts +10 -0
- package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.d.ts +12 -0
- package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.d.ts +14 -0
- package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.d.ts +2 -0
- package/dist/admin/src/services/admin.d.ts +2 -2
- package/dist/admin/src/types/permissions.d.ts +1 -0
- package/dist/admin/src/utils/cookies.d.ts +7 -6
- package/dist/admin/src/utils/getFetchClient.d.ts +25 -0
- package/dist/ee/admin/src/hooks/useLicenseLimits.d.ts +29 -0
- package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.d.ts +6 -1
- package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.d.ts +2 -0
- package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +2 -0
- package/dist/ee/server/src/audit-logs/entitlements.d.ts +8 -0
- package/dist/ee/server/src/audit-logs/entitlements.d.ts.map +1 -0
- package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +16 -0
- package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/admin.d.ts +36 -10
- package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/authentication-utils/middlewares.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/index.d.ts +36 -10
- package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
- package/dist/ee/server/src/index.d.ts +36 -10
- package/dist/ee/server/src/index.d.ts.map +1 -1
- package/dist/ee/server/src/services/seat-enforcement.d.ts.map +1 -1
- package/dist/ee/server/src/validation/role.d.ts.map +1 -1
- package/dist/server/ee/server/src/audit-logs/entitlements.js +25 -0
- package/dist/server/ee/server/src/audit-logs/entitlements.js.map +1 -0
- package/dist/server/ee/server/src/audit-logs/entitlements.mjs +23 -0
- package/dist/server/ee/server/src/audit-logs/entitlements.mjs.map +1 -0
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +20 -8
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +19 -9
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
- package/dist/server/ee/server/src/audit-logs/utils/csv.js +3 -3
- package/dist/server/ee/server/src/audit-logs/utils/csv.js.map +1 -1
- package/dist/server/ee/server/src/audit-logs/utils/csv.mjs +3 -3
- package/dist/server/ee/server/src/audit-logs/utils/csv.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/admin.js +76 -3
- package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
- package/dist/server/ee/server/src/controllers/admin.mjs +76 -3
- package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js +28 -10
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs +28 -10
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs.map +1 -1
- package/dist/server/ee/server/src/index.js +2 -0
- package/dist/server/ee/server/src/index.js.map +1 -1
- package/dist/server/ee/server/src/index.mjs +2 -0
- package/dist/server/ee/server/src/index.mjs.map +1 -1
- package/dist/server/ee/server/src/services/seat-enforcement.js.map +1 -1
- package/dist/server/ee/server/src/services/seat-enforcement.mjs.map +1 -1
- package/dist/server/ee/server/src/validation/role.js +4 -2
- package/dist/server/ee/server/src/validation/role.js.map +1 -1
- package/dist/server/ee/server/src/validation/role.mjs +4 -2
- package/dist/server/ee/server/src/validation/role.mjs.map +1 -1
- package/dist/server/server/src/ai/services/ai.js.map +1 -1
- package/dist/server/server/src/ai/services/ai.mjs.map +1 -1
- package/dist/server/server/src/audit-logs/auth.js +72 -0
- package/dist/server/server/src/audit-logs/auth.js.map +1 -0
- package/dist/server/server/src/audit-logs/auth.mjs +67 -0
- package/dist/server/server/src/audit-logs/auth.mjs.map +1 -0
- package/dist/server/server/src/config/admin-actions.js +7 -0
- package/dist/server/server/src/config/admin-actions.js.map +1 -1
- package/dist/server/server/src/config/admin-actions.mjs +7 -0
- package/dist/server/server/src/config/admin-actions.mjs.map +1 -1
- package/dist/server/server/src/controllers/admin.js +17 -12
- package/dist/server/server/src/controllers/admin.js.map +1 -1
- package/dist/server/server/src/controllers/admin.mjs +17 -12
- package/dist/server/server/src/controllers/admin.mjs.map +1 -1
- package/dist/server/server/src/controllers/authentication.js +34 -8
- package/dist/server/server/src/controllers/authentication.js.map +1 -1
- package/dist/server/server/src/controllers/authentication.mjs +34 -8
- package/dist/server/server/src/controllers/authentication.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/register.js +4 -0
- package/dist/server/server/src/register.js.map +1 -1
- package/dist/server/server/src/register.mjs +4 -0
- package/dist/server/server/src/register.mjs.map +1 -1
- package/dist/server/server/src/routes/admin.js +18 -0
- package/dist/server/server/src/routes/admin.js.map +1 -1
- package/dist/server/server/src/routes/admin.mjs +18 -0
- package/dist/server/server/src/routes/admin.mjs.map +1 -1
- package/dist/server/server/src/services/api-token.js +4 -8
- package/dist/server/server/src/services/api-token.js.map +1 -1
- package/dist/server/server/src/services/api-token.mjs +4 -8
- package/dist/server/server/src/services/api-token.mjs.map +1 -1
- package/dist/server/server/src/services/auth.js +4 -2
- package/dist/server/server/src/services/auth.js.map +1 -1
- package/dist/server/server/src/services/auth.mjs +4 -3
- package/dist/server/server/src/services/auth.mjs.map +1 -1
- package/dist/server/server/src/services/constants.js +4 -0
- package/dist/server/server/src/services/constants.js.map +1 -1
- package/dist/server/server/src/services/constants.mjs +4 -0
- package/dist/server/server/src/services/constants.mjs.map +1 -1
- package/dist/server/server/src/services/debug-dump.js +173 -0
- package/dist/server/server/src/services/debug-dump.js.map +1 -0
- package/dist/server/server/src/services/debug-dump.mjs +166 -0
- package/dist/server/server/src/services/debug-dump.mjs.map +1 -0
- package/dist/server/server/src/services/index.js +3 -1
- package/dist/server/server/src/services/index.js.map +1 -1
- package/dist/server/server/src/services/index.mjs +3 -1
- package/dist/server/server/src/services/index.mjs.map +1 -1
- package/dist/server/server/src/services/permission/rename-fields.js.map +1 -1
- package/dist/server/server/src/services/permission/rename-fields.mjs.map +1 -1
- package/dist/server/server/src/services/permission/sections-builder/handlers.js.map +1 -1
- package/dist/server/server/src/services/permission/sections-builder/handlers.mjs.map +1 -1
- package/dist/server/server/src/services/role.js +8 -5
- package/dist/server/server/src/services/role.js.map +1 -1
- package/dist/server/server/src/services/role.mjs +8 -5
- package/dist/server/server/src/services/role.mjs.map +1 -1
- package/dist/server/server/src/utils/debug-dump/redact.js +197 -0
- package/dist/server/server/src/utils/debug-dump/redact.js.map +1 -0
- package/dist/server/server/src/utils/debug-dump/redact.mjs +194 -0
- package/dist/server/server/src/utils/debug-dump/redact.mjs.map +1 -0
- package/dist/server/server/src/validation/admin-tokens.js +4 -4
- package/dist/server/server/src/validation/admin-tokens.js.map +1 -1
- package/dist/server/server/src/validation/admin-tokens.mjs +4 -4
- package/dist/server/server/src/validation/admin-tokens.mjs.map +1 -1
- package/dist/server/server/src/validation/api-tokens.js +4 -4
- package/dist/server/server/src/validation/api-tokens.js.map +1 -1
- package/dist/server/server/src/validation/api-tokens.mjs +4 -4
- package/dist/server/server/src/validation/api-tokens.mjs.map +1 -1
- package/dist/server/server/src/validation/role.js +6 -4
- package/dist/server/server/src/validation/role.js.map +1 -1
- package/dist/server/server/src/validation/role.mjs +6 -4
- package/dist/server/server/src/validation/role.mjs.map +1 -1
- package/dist/server/server/src/validation/transfer/token.js +4 -4
- package/dist/server/server/src/validation/transfer/token.js.map +1 -1
- package/dist/server/server/src/validation/transfer/token.mjs +4 -4
- package/dist/server/server/src/validation/transfer/token.mjs.map +1 -1
- package/dist/server/shared/utils/auth-cookie-path.js +13 -10
- package/dist/server/shared/utils/auth-cookie-path.js.map +1 -1
- package/dist/server/shared/utils/auth-cookie-path.mjs +13 -10
- package/dist/server/shared/utils/auth-cookie-path.mjs.map +1 -1
- package/dist/server/shared/utils/get-project-type.js +49 -0
- package/dist/server/shared/utils/get-project-type.js.map +1 -0
- package/dist/server/shared/utils/get-project-type.mjs +46 -0
- package/dist/server/shared/utils/get-project-type.mjs.map +1 -0
- package/dist/server/shared/utils/session-auth.js +70 -3
- package/dist/server/shared/utils/session-auth.js.map +1 -1
- package/dist/server/shared/utils/session-auth.mjs +70 -4
- package/dist/server/shared/utils/session-auth.mjs.map +1 -1
- package/dist/server/src/ai/services/ai.d.ts.map +1 -1
- package/dist/server/src/audit-logs/auth.d.ts +72 -0
- package/dist/server/src/audit-logs/auth.d.ts.map +1 -0
- package/dist/server/src/config/admin-actions.d.ts.map +1 -1
- package/dist/server/src/controllers/admin.d.ts +3 -0
- package/dist/server/src/controllers/admin.d.ts.map +1 -1
- package/dist/server/src/controllers/authentication.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +3 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/domain/permission/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +8 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/routes/admin.d.ts.map +1 -1
- package/dist/server/src/services/auth.d.ts +6 -0
- package/dist/server/src/services/auth.d.ts.map +1 -1
- package/dist/server/src/services/constants.d.ts +2 -0
- package/dist/server/src/services/constants.d.ts.map +1 -1
- package/dist/server/src/services/debug-dump.d.ts +9 -0
- package/dist/server/src/services/debug-dump.d.ts.map +1 -0
- package/dist/server/src/services/index.d.ts +5 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/permission/rename-fields.d.ts.map +1 -1
- package/dist/server/src/services/permission/sections-builder/handlers.d.ts.map +1 -1
- package/dist/server/src/services/role.d.ts.map +1 -1
- package/dist/server/src/utils/debug-dump/redact.d.ts +8 -0
- package/dist/server/src/utils/debug-dump/redact.d.ts.map +1 -0
- package/dist/server/src/validation/role.d.ts.map +1 -1
- package/dist/shared/contracts/admin.d.ts +106 -0
- package/dist/shared/contracts/admin.d.ts.map +1 -1
- package/dist/shared/contracts/transfer.d.ts.map +1 -1
- package/dist/shared/utils/__tests__/get-project-type.test.d.ts +1 -0
- package/dist/shared/utils/__tests__/get-project-type.test.d.ts.map +1 -0
- package/dist/shared/utils/auth-cookie-path.d.ts +13 -10
- package/dist/shared/utils/auth-cookie-path.d.ts.map +1 -1
- package/dist/shared/utils/get-project-type.d.ts +37 -0
- package/dist/shared/utils/get-project-type.d.ts.map +1 -0
- package/dist/shared/utils/session-auth.d.ts +16 -0
- package/dist/shared/utils/session-auth.d.ts.map +1 -1
- package/package.json +8 -8
- package/dist/admin/admin/src/utils/getProjectType.js +0 -22
- package/dist/admin/admin/src/utils/getProjectType.js.map +0 -1
- package/dist/admin/admin/src/utils/getProjectType.mjs +0 -20
- package/dist/admin/admin/src/utils/getProjectType.mjs.map +0 -1
- package/dist/admin/src/utils/getProjectType.d.ts +0 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middlewares.mjs","sources":["../../../../../../../ee/server/src/controllers/authentication-utils/middlewares.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport passport from 'koa-passport';\nimport { getService } from '../../utils';\nimport utils from './utils';\nimport {\n REFRESH_COOKIE_NAME,\n buildCookieOptionsWithExpiry,\n buildSessionMetadataFromContext,\n getAccessCookieName,\n getAccessCookiePath,\n getAccessCookieDomain,\n getSessionManager,\n generateDeviceId,\n} from '../../../../../shared/utils/session-auth';\n\nconst defaultConnectionError = () => new Error('Invalid connection payload');\n\nexport const authenticate: Core.MiddlewareHandler = async (ctx, next) => {\n const {\n params: { provider },\n } = ctx;\n const redirectUrls = utils.getPrefixedRedirectUrls();\n\n // @ts-expect-error - can not use null to authenticate\n return passport.authenticate(provider, null, async (error, profile) => {\n if (error || !profile || !profile.email) {\n if (error) {\n strapi.log.error(error);\n }\n\n strapi.eventHub.emit('admin.auth.error', {\n error: error || defaultConnectionError(),\n provider,\n });\n\n return ctx.redirect(redirectUrls.error);\n }\n\n const user = await getService('user').findOneByEmail(profile.email);\n const scenario = user ? existingUserScenario : nonExistingUserScenario;\n\n return scenario(ctx, next)(user || profile, provider);\n })(ctx, next);\n};\n\nconst existingUserScenario: Core.MiddlewareHandler =\n (ctx, next) => async (user: any, provider: any) => {\n const redirectUrls = utils.getPrefixedRedirectUrls();\n\n if (!user.isActive) {\n strapi.eventHub.emit('admin.auth.error', {\n error: new Error(`Deactivated user tried to login (${user.id})`),\n provider,\n });\n return ctx.redirect(redirectUrls.error);\n }\n\n ctx.state.user = user;\n return next();\n };\n\nconst nonExistingUserScenario: Core.MiddlewareHandler =\n (ctx, next) => async (profile: any, provider: any) => {\n const { email, firstname, lastname, username } = profile;\n const redirectUrls = utils.getPrefixedRedirectUrls();\n const adminStore = await utils.getAdminStore();\n const { providers } = (await adminStore.get({ key: 'auth' })) as any;\n\n // We need at least the username or the firstname/lastname combination to register a new user\n const isMissingRegisterFields = !username && (!firstname || !lastname);\n\n if (!providers.autoRegister || !providers.defaultRole || isMissingRegisterFields) {\n strapi.eventHub.emit('admin.auth.error', { error: defaultConnectionError(), provider });\n return ctx.redirect(redirectUrls.error);\n }\n\n const defaultRole = await getService('role').findOne({ id: providers.defaultRole });\n\n // If the default role has been misconfigured, redirect with an error\n if (!defaultRole) {\n strapi.eventHub.emit('admin.auth.error', { error: defaultConnectionError(), provider });\n return ctx.redirect(redirectUrls.error);\n }\n\n // Register a new user with the information given by the provider and login with it\n ctx.state.user = await getService('user').create({\n email,\n username,\n firstname,\n lastname,\n roles: [defaultRole.id],\n isActive: true,\n registrationToken: null,\n });\n\n strapi.eventHub.emit('admin.auth.autoRegistration', {\n user: ctx.state.user,\n provider,\n });\n\n return next();\n };\n\nexport const redirectWithAuth: Core.MiddlewareHandler = async (ctx) => {\n const {\n params: { provider },\n } = ctx;\n const redirectUrls = utils.getPrefixedRedirectUrls();\n const { user } = ctx.state;\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n strapi.log.error('SessionManager not available for SSO authentication');\n return ctx.redirect(redirectUrls.error);\n }\n\n const userId = String(user.id);\n const deviceId = generateDeviceId();\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, {\n type: 'refresh',\n metadata: buildSessionMetadataFromContext(ctx),\n });\n\n const cookieOptions = buildCookieOptionsWithExpiry('refresh', absoluteExpiresAt);\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n strapi.log.error('Failed to generate access token for SSO user');\n return ctx.redirect(redirectUrls.error);\n }\n\n const { token: accessToken } = accessResult;\n\n const configuredSecure = strapi.config.get('admin.auth.cookie.secure');\n const isProduction = process.env.NODE_ENV === 'production';\n const isSecure = typeof configuredSecure === 'boolean' ? configuredSecure : isProduction;\n\n // Resolve through the shared helpers so the server write agrees with the\n // client set/delete (which read the same config inlined at build time);\n // any divergence leaves a cookie the admin panel cannot clear on logout.\n const domain = getAccessCookieDomain();\n const path = getAccessCookiePath();\n\n ctx.cookies.set(getAccessCookieName(), accessToken, {\n httpOnly: false,\n secure: isSecure,\n overwrite: true,\n domain,\n path,\n });\n\n const sanitizedUser = getService('user').sanitizeUser(user);\n strapi.eventHub.emit('admin.auth.success', { user: sanitizedUser, provider });\n\n ctx.redirect(redirectUrls.success);\n } catch (error) {\n strapi.log.error('SSO authentication failed during token generation', error);\n strapi.eventHub.emit('admin.auth.error', {\n error: error instanceof Error ? error : new Error('Unknown SSO error'),\n provider,\n });\n return ctx.redirect(redirectUrls.error);\n }\n};\n\nexport default {\n authenticate,\n redirectWithAuth,\n};\n"],"names":["defaultConnectionError","Error","authenticate","ctx","next","params","provider","redirectUrls","utils","getPrefixedRedirectUrls","passport","error","profile","email","strapi","log","eventHub","emit","redirect","user","getService","findOneByEmail","scenario","existingUserScenario","nonExistingUserScenario","isActive","id","state","firstname","lastname","username","adminStore","getAdminStore","providers","get","key","isMissingRegisterFields","autoRegister","defaultRole","findOne","create","roles","registrationToken","redirectWithAuth","sessionManager","getSessionManager","userId","String","deviceId","generateDeviceId","token","refreshToken","absoluteExpiresAt","generateRefreshToken","type","metadata","buildSessionMetadataFromContext","cookieOptions","buildCookieOptionsWithExpiry","cookies","set","REFRESH_COOKIE_NAME","accessResult","generateAccessToken","accessToken","configuredSecure","config","isProduction","process","env","NODE_ENV","isSecure","domain","getAccessCookieDomain","path","getAccessCookiePath","getAccessCookieName","httpOnly","secure","overwrite","sanitizedUser","sanitizeUser","success"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"middlewares.mjs","sources":["../../../../../../../ee/server/src/controllers/authentication-utils/middlewares.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport passport from 'koa-passport';\nimport { getService } from '../../utils';\nimport utils from './utils';\nimport { emitLoginFailure } from '../../../../../server/src/audit-logs/auth';\nimport {\n REFRESH_COOKIE_NAME,\n buildCookieOptionsWithExpiry,\n buildSessionMetadataFromContext,\n getAccessCookieName,\n getAccessCookiePath,\n getAccessCookieDomain,\n getSessionManager,\n generateDeviceId,\n} from '../../../../../shared/utils/session-auth';\n\nconst defaultConnectionError = () => new Error('Invalid connection payload');\n\nexport const authenticate: Core.MiddlewareHandler = async (ctx, next) => {\n const {\n params: { provider },\n } = ctx;\n const redirectUrls = utils.getPrefixedRedirectUrls();\n\n // @ts-expect-error - can not use null to authenticate\n return passport.authenticate(provider, null, async (error, profile) => {\n if (error || !profile || !profile.email) {\n if (error) {\n strapi.log.error(error);\n }\n\n emitLoginFailure(\n { strapi },\n { error: error || defaultConnectionError(), provider, reason: 'sso_connection_error' }\n );\n\n return ctx.redirect(redirectUrls.error);\n }\n\n const user = await getService('user').findOneByEmail(profile.email);\n const scenario = user ? existingUserScenario : nonExistingUserScenario;\n\n return scenario(ctx, next)(user || profile, provider);\n })(ctx, next);\n};\n\nconst existingUserScenario: Core.MiddlewareHandler =\n (ctx, next) => async (user: any, provider: any) => {\n const redirectUrls = utils.getPrefixedRedirectUrls();\n\n if (!user.isActive) {\n emitLoginFailure(\n { strapi },\n {\n error: new Error(`Deactivated user tried to login (${user.id})`),\n provider,\n reason: 'account_inactive',\n user,\n }\n );\n return ctx.redirect(redirectUrls.error);\n }\n\n ctx.state.user = user;\n return next();\n };\n\nconst nonExistingUserScenario: Core.MiddlewareHandler =\n (ctx, next) => async (profile: any, provider: any) => {\n const { email, firstname, lastname, username } = profile;\n const redirectUrls = utils.getPrefixedRedirectUrls();\n const adminStore = await utils.getAdminStore();\n const { providers } = (await adminStore.get({ key: 'auth' })) as any;\n\n // We need at least the username or the firstname/lastname combination to register a new user\n const isMissingRegisterFields = !username && (!firstname || !lastname);\n\n if (!providers.autoRegister || !providers.defaultRole || isMissingRegisterFields) {\n emitLoginFailure(\n { strapi },\n { error: defaultConnectionError(), provider, reason: 'sso_registration_disabled' }\n );\n return ctx.redirect(redirectUrls.error);\n }\n\n const defaultRole = await getService('role').findOne({ id: providers.defaultRole });\n\n // If the default role has been misconfigured, redirect with an error\n if (!defaultRole) {\n emitLoginFailure(\n { strapi },\n { error: defaultConnectionError(), provider, reason: 'sso_role_misconfigured' }\n );\n return ctx.redirect(redirectUrls.error);\n }\n\n // Register a new user with the information given by the provider and login with it\n ctx.state.user = await getService('user').create({\n email,\n username,\n firstname,\n lastname,\n roles: [defaultRole.id],\n isActive: true,\n registrationToken: null,\n });\n\n strapi.eventHub.emit('admin.auth.autoRegistration', {\n user: ctx.state.user,\n provider,\n });\n\n return next();\n };\n\nexport const redirectWithAuth: Core.MiddlewareHandler = async (ctx) => {\n const {\n params: { provider },\n } = ctx;\n const redirectUrls = utils.getPrefixedRedirectUrls();\n const { user } = ctx.state;\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n strapi.log.error('SessionManager not available for SSO authentication');\n return ctx.redirect(redirectUrls.error);\n }\n\n const userId = String(user.id);\n const deviceId = generateDeviceId();\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, {\n type: 'refresh',\n metadata: buildSessionMetadataFromContext(ctx),\n });\n\n const cookieOptions = buildCookieOptionsWithExpiry('refresh', absoluteExpiresAt);\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n strapi.log.error('Failed to generate access token for SSO user');\n return ctx.redirect(redirectUrls.error);\n }\n\n const { token: accessToken } = accessResult;\n\n const configuredSecure = strapi.config.get('admin.auth.cookie.secure');\n const isProduction = process.env.NODE_ENV === 'production';\n const isSecure = typeof configuredSecure === 'boolean' ? configuredSecure : isProduction;\n\n // Resolve through the shared helpers so the server write agrees with the\n // client set/delete (which read the same config inlined at build time);\n // any divergence leaves a cookie the admin panel cannot clear on logout.\n const domain = getAccessCookieDomain();\n const path = getAccessCookiePath();\n\n ctx.cookies.set(getAccessCookieName(), accessToken, {\n httpOnly: false,\n secure: isSecure,\n overwrite: true,\n domain,\n path,\n });\n\n const sanitizedUser = getService('user').sanitizeUser(user);\n strapi.eventHub.emit('admin.auth.success', { user: sanitizedUser, provider });\n\n ctx.redirect(redirectUrls.success);\n } catch (error) {\n strapi.log.error('SSO authentication failed during token generation', error);\n emitLoginFailure(\n { strapi },\n {\n error: error instanceof Error ? error : new Error('Unknown SSO error'),\n provider,\n reason: 'unexpected_error',\n user,\n }\n );\n return ctx.redirect(redirectUrls.error);\n }\n};\n\nexport default {\n authenticate,\n redirectWithAuth,\n};\n"],"names":["defaultConnectionError","Error","authenticate","ctx","next","params","provider","redirectUrls","utils","getPrefixedRedirectUrls","passport","error","profile","email","strapi","log","emitLoginFailure","reason","redirect","user","getService","findOneByEmail","scenario","existingUserScenario","nonExistingUserScenario","isActive","id","state","firstname","lastname","username","adminStore","getAdminStore","providers","get","key","isMissingRegisterFields","autoRegister","defaultRole","findOne","create","roles","registrationToken","eventHub","emit","redirectWithAuth","sessionManager","getSessionManager","userId","String","deviceId","generateDeviceId","token","refreshToken","absoluteExpiresAt","generateRefreshToken","type","metadata","buildSessionMetadataFromContext","cookieOptions","buildCookieOptionsWithExpiry","cookies","set","REFRESH_COOKIE_NAME","accessResult","generateAccessToken","accessToken","configuredSecure","config","isProduction","process","env","NODE_ENV","isSecure","domain","getAccessCookieDomain","path","getAccessCookiePath","getAccessCookieName","httpOnly","secure","overwrite","sanitizedUser","sanitizeUser","success"],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ var auditLogExport = require('../../../shared/utils/audit-log-export.js');
|
|
|
16
16
|
var tokens = require('../../../server/src/audit-logs/tokens.js');
|
|
17
17
|
var adminUsers = require('../../../server/src/audit-logs/admin-users.js');
|
|
18
18
|
var webhooks = require('../../../server/src/audit-logs/webhooks.js');
|
|
19
|
+
var auth = require('../../../server/src/audit-logs/auth.js');
|
|
19
20
|
|
|
20
21
|
const getAdminEE = ()=>{
|
|
21
22
|
const eeAdmin = {
|
|
@@ -69,6 +70,7 @@ const getAdminEE = ()=>{
|
|
|
69
70
|
tokens.registerTokenAuditEvents(auditLogsLifecycle);
|
|
70
71
|
adminUsers.registerAdminUserAuditEvents(auditLogsLifecycle);
|
|
71
72
|
webhooks.registerWebhookAuditEvents(auditLogsLifecycle);
|
|
73
|
+
auth.registerAuthAuditEvents(auditLogsLifecycle);
|
|
72
74
|
await auditLogsLifecycle.register();
|
|
73
75
|
}
|
|
74
76
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../ee/server/src/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport register from './register';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport adminContentTypes from './content-types';\nimport services from './services';\nimport controllers from './controllers';\nimport routes from './routes';\nimport auditLogsRoutes from './audit-logs/routes/audit-logs';\nimport auditLogsController from './audit-logs/controllers/audit-logs';\nimport { createAuditLogsService } from './audit-logs/services/audit-logs';\nimport { createAuditLogsLifecycleService } from './audit-logs/services/lifecycles';\nimport { auditLog } from './audit-logs/content-types/audit-log';\nimport { AUDIT_LOG_EXPORT_EVENT } from '../../../shared/utils/audit-log-export';\nimport { registerTokenAuditEvents } from '../../../server/src/audit-logs/tokens';\nimport { registerAdminUserAuditEvents } from '../../../server/src/audit-logs/admin-users';\nimport { registerWebhookAuditEvents } from '../../../server/src/audit-logs/webhooks';\n\nconst getAdminEE = () => {\n const eeAdmin = {\n register,\n bootstrap,\n destroy,\n contentTypes: {\n // Always register the audit-log content type to prevent data loss\n 'audit-log': auditLog,\n ...adminContentTypes,\n },\n services,\n controllers,\n routes,\n };\n\n const isAuditLogsEnabled =\n strapi.config.get('admin.auditLogs.enabled', true) &&\n strapi.ee.features.isEnabled('audit-logs');\n return {\n ...eeAdmin,\n controllers: {\n ...eeAdmin.controllers,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsController } : {}),\n },\n routes: {\n ...eeAdmin.routes,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsRoutes } : {}),\n },\n async register({ strapi }: { strapi: Core.Strapi }) {\n // Run the default registration\n await eeAdmin.register({ strapi });\n\n if (isAuditLogsEnabled) {\n // Register an internal audit logs service\n strapi.add('audit-logs', createAuditLogsService(strapi));\n // Register an internal audit logs lifecycle service\n const auditLogsLifecycle = createAuditLogsLifecycleService(strapi);\n strapi.add('audit-logs-lifecycle', auditLogsLifecycle);\n\n auditLogsLifecycle.registerEvent(\n AUDIT_LOG_EXPORT_EVENT,\n (event: { filters?: unknown }) => ({\n resource: { type: 'audit-log' },\n details: { format: 'csv', filters: event?.filters ?? null },\n })\n );\n\n registerTokenAuditEvents(auditLogsLifecycle);\n registerAdminUserAuditEvents(auditLogsLifecycle);\n registerWebhookAuditEvents(auditLogsLifecycle);\n\n await auditLogsLifecycle.register();\n }\n },\n async destroy({ strapi }: { strapi: Core.Strapi }) {\n if (isAuditLogsEnabled) {\n strapi.get('audit-logs-lifecycle').destroy();\n }\n await eeAdmin.destroy();\n },\n };\n};\n\nexport default getAdminEE;\n"],"names":["getAdminEE","eeAdmin","register","bootstrap","destroy","contentTypes","auditLog","adminContentTypes","services","controllers","routes","isAuditLogsEnabled","strapi","config","get","ee","features","isEnabled","auditLogsController","auditLogsRoutes","add","createAuditLogsService","auditLogsLifecycle","createAuditLogsLifecycleService","registerEvent","AUDIT_LOG_EXPORT_EVENT","event","resource","type","details","format","filters","registerTokenAuditEvents","registerAdminUserAuditEvents","registerWebhookAuditEvents"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../ee/server/src/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport register from './register';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport adminContentTypes from './content-types';\nimport services from './services';\nimport controllers from './controllers';\nimport routes from './routes';\nimport auditLogsRoutes from './audit-logs/routes/audit-logs';\nimport auditLogsController from './audit-logs/controllers/audit-logs';\nimport { createAuditLogsService } from './audit-logs/services/audit-logs';\nimport { createAuditLogsLifecycleService } from './audit-logs/services/lifecycles';\nimport { auditLog } from './audit-logs/content-types/audit-log';\nimport { AUDIT_LOG_EXPORT_EVENT } from '../../../shared/utils/audit-log-export';\nimport { registerTokenAuditEvents } from '../../../server/src/audit-logs/tokens';\nimport { registerAdminUserAuditEvents } from '../../../server/src/audit-logs/admin-users';\nimport { registerWebhookAuditEvents } from '../../../server/src/audit-logs/webhooks';\nimport { registerAuthAuditEvents } from '../../../server/src/audit-logs/auth';\n\nconst getAdminEE = () => {\n const eeAdmin = {\n register,\n bootstrap,\n destroy,\n contentTypes: {\n // Always register the audit-log content type to prevent data loss\n 'audit-log': auditLog,\n ...adminContentTypes,\n },\n services,\n controllers,\n routes,\n };\n\n const isAuditLogsEnabled =\n strapi.config.get('admin.auditLogs.enabled', true) &&\n strapi.ee.features.isEnabled('audit-logs');\n return {\n ...eeAdmin,\n controllers: {\n ...eeAdmin.controllers,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsController } : {}),\n },\n routes: {\n ...eeAdmin.routes,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsRoutes } : {}),\n },\n async register({ strapi }: { strapi: Core.Strapi }) {\n // Run the default registration\n await eeAdmin.register({ strapi });\n\n if (isAuditLogsEnabled) {\n // Register an internal audit logs service\n strapi.add('audit-logs', createAuditLogsService(strapi));\n // Register an internal audit logs lifecycle service\n const auditLogsLifecycle = createAuditLogsLifecycleService(strapi);\n strapi.add('audit-logs-lifecycle', auditLogsLifecycle);\n\n auditLogsLifecycle.registerEvent(\n AUDIT_LOG_EXPORT_EVENT,\n (event: { filters?: unknown }) => ({\n resource: { type: 'audit-log' },\n details: { format: 'csv', filters: event?.filters ?? null },\n })\n );\n\n registerTokenAuditEvents(auditLogsLifecycle);\n registerAdminUserAuditEvents(auditLogsLifecycle);\n registerWebhookAuditEvents(auditLogsLifecycle);\n registerAuthAuditEvents(auditLogsLifecycle);\n\n await auditLogsLifecycle.register();\n }\n },\n async destroy({ strapi }: { strapi: Core.Strapi }) {\n if (isAuditLogsEnabled) {\n strapi.get('audit-logs-lifecycle').destroy();\n }\n await eeAdmin.destroy();\n },\n };\n};\n\nexport default getAdminEE;\n"],"names":["getAdminEE","eeAdmin","register","bootstrap","destroy","contentTypes","auditLog","adminContentTypes","services","controllers","routes","isAuditLogsEnabled","strapi","config","get","ee","features","isEnabled","auditLogsController","auditLogsRoutes","add","createAuditLogsService","auditLogsLifecycle","createAuditLogsLifecycleService","registerEvent","AUDIT_LOG_EXPORT_EVENT","event","resource","type","details","format","filters","registerTokenAuditEvents","registerAdminUserAuditEvents","registerWebhookAuditEvents","registerAuthAuditEvents"],"mappings":";;;;;;;;;;;;;;;;;;;;AAmBA,MAAMA,UAAAA,GAAa,IAAA;AACjB,IAAA,MAAMC,OAAAA,GAAU;AACdC,QAAAA,QAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA,OAAAA;QACAC,YAAAA,EAAc;;YAEZ,WAAA,EAAaC,iBAAAA;AACb,YAAA,GAAGC;AACL,SAAA;AACAC,kBAAAA,OAAAA;AACAC,qBAAAA,OAAAA;AACAC,gBAAAA;AACF,KAAA;AAEA,IAAA,MAAMC,kBAAAA,GACJC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,yBAAA,EAA2B,IAAA,CAAA,IAC7CF,MAAAA,CAAOG,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,YAAA,CAAA;IAC/B,OAAO;AACL,QAAA,GAAGhB,OAAO;QACVQ,WAAAA,EAAa;AACX,YAAA,GAAGR,QAAQQ,WAAW;AACtB,YAAA,GAAIE,kBAAAA,GAAqB;gBAAE,YAAA,EAAcO;AAAoB,aAAA,GAAI;AACnE,SAAA;QACAR,MAAAA,EAAQ;AACN,YAAA,GAAGT,QAAQS,MAAM;AACjB,YAAA,GAAIC,kBAAAA,GAAqB;gBAAE,YAAA,EAAcQ;AAAgB,aAAA,GAAI;AAC/D,SAAA;AACA,QAAA,MAAMjB,QAAAA,CAAAA,CAAS,EAAEU,MAAAA,EAAAA,OAAM,EAA2B,EAAA;;YAEhD,MAAMX,OAAAA,CAAQC,QAAQ,CAAC;gBAAEU,MAAAA,EAAAA;AAAO,aAAA,CAAA;AAEhC,YAAA,IAAID,kBAAAA,EAAoB;;gBAEtBC,OAAAA,CAAOQ,GAAG,CAAC,YAAA,EAAcC,kCAAAA,CAAuBT,OAAAA,CAAAA,CAAAA;;AAEhD,gBAAA,MAAMU,qBAAqBC,0CAAAA,CAAgCX,OAAAA,CAAAA;gBAC3DA,OAAAA,CAAOQ,GAAG,CAAC,sBAAA,EAAwBE,kBAAAA,CAAAA;AAEnCA,gBAAAA,kBAAAA,CAAmBE,aAAa,CAC9BC,qCAAAA,EACA,CAACC,SAAkC;wBACjCC,QAAAA,EAAU;4BAAEC,IAAAA,EAAM;AAAY,yBAAA;wBAC9BC,OAAAA,EAAS;4BAAEC,MAAAA,EAAQ,KAAA;AAAOC,4BAAAA,OAAAA,EAASL,OAAOK,OAAAA,IAAW;AAAK;qBAC5D,CAAA,CAAA;gBAGFC,+BAAAA,CAAyBV,kBAAAA,CAAAA;gBACzBW,uCAAAA,CAA6BX,kBAAAA,CAAAA;gBAC7BY,mCAAAA,CAA2BZ,kBAAAA,CAAAA;gBAC3Ba,4BAAAA,CAAwBb,kBAAAA,CAAAA;AAExB,gBAAA,MAAMA,mBAAmBpB,QAAQ,EAAA;AACnC,YAAA;AACF,QAAA,CAAA;AACA,QAAA,MAAME,OAAAA,CAAAA,CAAQ,EAAEQ,MAAAA,EAAAA,OAAM,EAA2B,EAAA;AAC/C,YAAA,IAAID,kBAAAA,EAAoB;gBACtBC,OAAAA,CAAOE,GAAG,CAAC,sBAAA,CAAA,CAAwBV,OAAO,EAAA;AAC5C,YAAA;AACA,YAAA,MAAMH,QAAQG,OAAO,EAAA;AACvB,QAAA;AACF,KAAA;AACF;;;;"}
|
|
@@ -14,6 +14,7 @@ import { AUDIT_LOG_EXPORT_EVENT } from '../../../shared/utils/audit-log-export.m
|
|
|
14
14
|
import { registerTokenAuditEvents } from '../../../server/src/audit-logs/tokens.mjs';
|
|
15
15
|
import { registerAdminUserAuditEvents } from '../../../server/src/audit-logs/admin-users.mjs';
|
|
16
16
|
import { registerWebhookAuditEvents } from '../../../server/src/audit-logs/webhooks.mjs';
|
|
17
|
+
import { registerAuthAuditEvents } from '../../../server/src/audit-logs/auth.mjs';
|
|
17
18
|
|
|
18
19
|
const getAdminEE = ()=>{
|
|
19
20
|
const eeAdmin = {
|
|
@@ -67,6 +68,7 @@ const getAdminEE = ()=>{
|
|
|
67
68
|
registerTokenAuditEvents(auditLogsLifecycle);
|
|
68
69
|
registerAdminUserAuditEvents(auditLogsLifecycle);
|
|
69
70
|
registerWebhookAuditEvents(auditLogsLifecycle);
|
|
71
|
+
registerAuthAuditEvents(auditLogsLifecycle);
|
|
70
72
|
await auditLogsLifecycle.register();
|
|
71
73
|
}
|
|
72
74
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../../ee/server/src/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport register from './register';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport adminContentTypes from './content-types';\nimport services from './services';\nimport controllers from './controllers';\nimport routes from './routes';\nimport auditLogsRoutes from './audit-logs/routes/audit-logs';\nimport auditLogsController from './audit-logs/controllers/audit-logs';\nimport { createAuditLogsService } from './audit-logs/services/audit-logs';\nimport { createAuditLogsLifecycleService } from './audit-logs/services/lifecycles';\nimport { auditLog } from './audit-logs/content-types/audit-log';\nimport { AUDIT_LOG_EXPORT_EVENT } from '../../../shared/utils/audit-log-export';\nimport { registerTokenAuditEvents } from '../../../server/src/audit-logs/tokens';\nimport { registerAdminUserAuditEvents } from '../../../server/src/audit-logs/admin-users';\nimport { registerWebhookAuditEvents } from '../../../server/src/audit-logs/webhooks';\n\nconst getAdminEE = () => {\n const eeAdmin = {\n register,\n bootstrap,\n destroy,\n contentTypes: {\n // Always register the audit-log content type to prevent data loss\n 'audit-log': auditLog,\n ...adminContentTypes,\n },\n services,\n controllers,\n routes,\n };\n\n const isAuditLogsEnabled =\n strapi.config.get('admin.auditLogs.enabled', true) &&\n strapi.ee.features.isEnabled('audit-logs');\n return {\n ...eeAdmin,\n controllers: {\n ...eeAdmin.controllers,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsController } : {}),\n },\n routes: {\n ...eeAdmin.routes,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsRoutes } : {}),\n },\n async register({ strapi }: { strapi: Core.Strapi }) {\n // Run the default registration\n await eeAdmin.register({ strapi });\n\n if (isAuditLogsEnabled) {\n // Register an internal audit logs service\n strapi.add('audit-logs', createAuditLogsService(strapi));\n // Register an internal audit logs lifecycle service\n const auditLogsLifecycle = createAuditLogsLifecycleService(strapi);\n strapi.add('audit-logs-lifecycle', auditLogsLifecycle);\n\n auditLogsLifecycle.registerEvent(\n AUDIT_LOG_EXPORT_EVENT,\n (event: { filters?: unknown }) => ({\n resource: { type: 'audit-log' },\n details: { format: 'csv', filters: event?.filters ?? null },\n })\n );\n\n registerTokenAuditEvents(auditLogsLifecycle);\n registerAdminUserAuditEvents(auditLogsLifecycle);\n registerWebhookAuditEvents(auditLogsLifecycle);\n\n await auditLogsLifecycle.register();\n }\n },\n async destroy({ strapi }: { strapi: Core.Strapi }) {\n if (isAuditLogsEnabled) {\n strapi.get('audit-logs-lifecycle').destroy();\n }\n await eeAdmin.destroy();\n },\n };\n};\n\nexport default getAdminEE;\n"],"names":["getAdminEE","eeAdmin","register","bootstrap","destroy","contentTypes","auditLog","adminContentTypes","services","controllers","routes","isAuditLogsEnabled","strapi","config","get","ee","features","isEnabled","auditLogsController","auditLogsRoutes","add","createAuditLogsService","auditLogsLifecycle","createAuditLogsLifecycleService","registerEvent","AUDIT_LOG_EXPORT_EVENT","event","resource","type","details","format","filters","registerTokenAuditEvents","registerAdminUserAuditEvents","registerWebhookAuditEvents"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../../ee/server/src/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport register from './register';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport adminContentTypes from './content-types';\nimport services from './services';\nimport controllers from './controllers';\nimport routes from './routes';\nimport auditLogsRoutes from './audit-logs/routes/audit-logs';\nimport auditLogsController from './audit-logs/controllers/audit-logs';\nimport { createAuditLogsService } from './audit-logs/services/audit-logs';\nimport { createAuditLogsLifecycleService } from './audit-logs/services/lifecycles';\nimport { auditLog } from './audit-logs/content-types/audit-log';\nimport { AUDIT_LOG_EXPORT_EVENT } from '../../../shared/utils/audit-log-export';\nimport { registerTokenAuditEvents } from '../../../server/src/audit-logs/tokens';\nimport { registerAdminUserAuditEvents } from '../../../server/src/audit-logs/admin-users';\nimport { registerWebhookAuditEvents } from '../../../server/src/audit-logs/webhooks';\nimport { registerAuthAuditEvents } from '../../../server/src/audit-logs/auth';\n\nconst getAdminEE = () => {\n const eeAdmin = {\n register,\n bootstrap,\n destroy,\n contentTypes: {\n // Always register the audit-log content type to prevent data loss\n 'audit-log': auditLog,\n ...adminContentTypes,\n },\n services,\n controllers,\n routes,\n };\n\n const isAuditLogsEnabled =\n strapi.config.get('admin.auditLogs.enabled', true) &&\n strapi.ee.features.isEnabled('audit-logs');\n return {\n ...eeAdmin,\n controllers: {\n ...eeAdmin.controllers,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsController } : {}),\n },\n routes: {\n ...eeAdmin.routes,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsRoutes } : {}),\n },\n async register({ strapi }: { strapi: Core.Strapi }) {\n // Run the default registration\n await eeAdmin.register({ strapi });\n\n if (isAuditLogsEnabled) {\n // Register an internal audit logs service\n strapi.add('audit-logs', createAuditLogsService(strapi));\n // Register an internal audit logs lifecycle service\n const auditLogsLifecycle = createAuditLogsLifecycleService(strapi);\n strapi.add('audit-logs-lifecycle', auditLogsLifecycle);\n\n auditLogsLifecycle.registerEvent(\n AUDIT_LOG_EXPORT_EVENT,\n (event: { filters?: unknown }) => ({\n resource: { type: 'audit-log' },\n details: { format: 'csv', filters: event?.filters ?? null },\n })\n );\n\n registerTokenAuditEvents(auditLogsLifecycle);\n registerAdminUserAuditEvents(auditLogsLifecycle);\n registerWebhookAuditEvents(auditLogsLifecycle);\n registerAuthAuditEvents(auditLogsLifecycle);\n\n await auditLogsLifecycle.register();\n }\n },\n async destroy({ strapi }: { strapi: Core.Strapi }) {\n if (isAuditLogsEnabled) {\n strapi.get('audit-logs-lifecycle').destroy();\n }\n await eeAdmin.destroy();\n },\n };\n};\n\nexport default getAdminEE;\n"],"names":["getAdminEE","eeAdmin","register","bootstrap","destroy","contentTypes","auditLog","adminContentTypes","services","controllers","routes","isAuditLogsEnabled","strapi","config","get","ee","features","isEnabled","auditLogsController","auditLogsRoutes","add","createAuditLogsService","auditLogsLifecycle","createAuditLogsLifecycleService","registerEvent","AUDIT_LOG_EXPORT_EVENT","event","resource","type","details","format","filters","registerTokenAuditEvents","registerAdminUserAuditEvents","registerWebhookAuditEvents","registerAuthAuditEvents"],"mappings":";;;;;;;;;;;;;;;;;;AAmBA,MAAMA,UAAAA,GAAa,IAAA;AACjB,IAAA,MAAMC,OAAAA,GAAU;AACdC,QAAAA,QAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA,OAAAA;QACAC,YAAAA,EAAc;;YAEZ,WAAA,EAAaC,QAAAA;AACb,YAAA,GAAGC;AACL,SAAA;AACAC,QAAAA,QAAAA;AACAC,QAAAA,WAAAA;AACAC,QAAAA;AACF,KAAA;AAEA,IAAA,MAAMC,kBAAAA,GACJC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,yBAAA,EAA2B,IAAA,CAAA,IAC7CF,MAAAA,CAAOG,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,YAAA,CAAA;IAC/B,OAAO;AACL,QAAA,GAAGhB,OAAO;QACVQ,WAAAA,EAAa;AACX,YAAA,GAAGR,QAAQQ,WAAW;AACtB,YAAA,GAAIE,kBAAAA,GAAqB;gBAAE,YAAA,EAAcO;AAAoB,aAAA,GAAI;AACnE,SAAA;QACAR,MAAAA,EAAQ;AACN,YAAA,GAAGT,QAAQS,MAAM;AACjB,YAAA,GAAIC,kBAAAA,GAAqB;gBAAE,YAAA,EAAcQ;AAAgB,aAAA,GAAI;AAC/D,SAAA;AACA,QAAA,MAAMjB,QAAAA,CAAAA,CAAS,EAAEU,MAAAA,EAAAA,OAAM,EAA2B,EAAA;;YAEhD,MAAMX,OAAAA,CAAQC,QAAQ,CAAC;gBAAEU,MAAAA,EAAAA;AAAO,aAAA,CAAA;AAEhC,YAAA,IAAID,kBAAAA,EAAoB;;gBAEtBC,OAAAA,CAAOQ,GAAG,CAAC,YAAA,EAAcC,sBAAAA,CAAuBT,OAAAA,CAAAA,CAAAA;;AAEhD,gBAAA,MAAMU,qBAAqBC,+BAAAA,CAAgCX,OAAAA,CAAAA;gBAC3DA,OAAAA,CAAOQ,GAAG,CAAC,sBAAA,EAAwBE,kBAAAA,CAAAA;AAEnCA,gBAAAA,kBAAAA,CAAmBE,aAAa,CAC9BC,sBAAAA,EACA,CAACC,SAAkC;wBACjCC,QAAAA,EAAU;4BAAEC,IAAAA,EAAM;AAAY,yBAAA;wBAC9BC,OAAAA,EAAS;4BAAEC,MAAAA,EAAQ,KAAA;AAAOC,4BAAAA,OAAAA,EAASL,OAAOK,OAAAA,IAAW;AAAK;qBAC5D,CAAA,CAAA;gBAGFC,wBAAAA,CAAyBV,kBAAAA,CAAAA;gBACzBW,4BAAAA,CAA6BX,kBAAAA,CAAAA;gBAC7BY,0BAAAA,CAA2BZ,kBAAAA,CAAAA;gBAC3Ba,uBAAAA,CAAwBb,kBAAAA,CAAAA;AAExB,gBAAA,MAAMA,mBAAmBpB,QAAQ,EAAA;AACnC,YAAA;AACF,QAAA,CAAA;AACA,QAAA,MAAME,OAAAA,CAAAA,CAAQ,EAAEQ,MAAAA,EAAAA,OAAM,EAA2B,EAAA;AAC/C,YAAA,IAAID,kBAAAA,EAAoB;gBACtBC,OAAAA,CAAOE,GAAG,CAAC,sBAAA,CAAA,CAAwBV,OAAO,EAAA;AAC5C,YAAA;AACA,YAAA,MAAMH,QAAQG,OAAO,EAAA;AACvB,QAAA;AACF,KAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seat-enforcement.js","sources":["../../../../../../ee/server/src/services/seat-enforcement.ts"],"sourcesContent":["import { pick, take, drop } from 'lodash';\n\nimport { getService } from '../utils';\nimport constants from '../../../../server/src/services/constants';\nimport type { AdminUser } from '../../../../shared/contracts/shared';\n\nconst { SUPER_ADMIN_CODE } = constants;\n\ntype DisabledUser = Pick<AdminUser, 'id' | 'isActive'>;\n\n/**\n * Returns users disabled by seat enforcement, or an empty list when none are stored.\n */\nconst getDisabledUserList = async (): Promise<DisabledUser[]> => {\n const disabledUsers = (await strapi.store.get({ type: 'ee', key: 'disabled_users' })) as\n
|
|
1
|
+
{"version":3,"file":"seat-enforcement.js","sources":["../../../../../../ee/server/src/services/seat-enforcement.ts"],"sourcesContent":["import { pick, take, drop } from 'lodash';\n\nimport { getService } from '../utils';\nimport constants from '../../../../server/src/services/constants';\nimport type { AdminUser } from '../../../../shared/contracts/shared';\n\nconst { SUPER_ADMIN_CODE } = constants;\n\ntype DisabledUser = Pick<AdminUser, 'id' | 'isActive'>;\n\n/**\n * Returns users disabled by seat enforcement, or an empty list when none are stored.\n */\nconst getDisabledUserList = async (): Promise<DisabledUser[]> => {\n const disabledUsers = (await strapi.store.get({ type: 'ee', key: 'disabled_users' })) as\n DisabledUser[] | null | undefined;\n\n return disabledUsers ?? [];\n};\n\nconst enableMaximumUserCount = async (numberOfUsersToEnable: number) => {\n const disabledUsers = await getDisabledUserList();\n const orderedDisabledUsers = [...disabledUsers].reverse();\n\n const usersToEnable = take(orderedDisabledUsers, numberOfUsersToEnable);\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: usersToEnable.map((user) => user?.id) },\n data: { isActive: true },\n });\n\n const remainingDisabledUsers = drop(orderedDisabledUsers, numberOfUsersToEnable);\n\n await strapi.store.set({\n type: 'ee',\n key: 'disabled_users',\n value: remainingDisabledUsers,\n });\n};\n\nconst disableUsersAboveLicenseLimit = async (numberOfUsersToDisable: number) => {\n const currentlyDisabledUsers = await getDisabledUserList();\n\n const usersToDisable = [];\n const nonSuperAdminUsersToDisable = await strapi.db.query('admin::user').findMany({\n where: {\n isActive: true,\n roles: {\n code: { $ne: SUPER_ADMIN_CODE },\n },\n },\n orderBy: { createdAt: 'DESC' },\n limit: numberOfUsersToDisable,\n });\n\n usersToDisable.push(...nonSuperAdminUsersToDisable);\n\n if (nonSuperAdminUsersToDisable.length < numberOfUsersToDisable) {\n const superAdminUsersToDisable = await strapi.db.query('admin::user').findMany({\n where: {\n isActive: true,\n roles: { code: SUPER_ADMIN_CODE },\n },\n orderBy: { createdAt: 'DESC' },\n limit: numberOfUsersToDisable - nonSuperAdminUsersToDisable.length,\n });\n\n usersToDisable.push(...superAdminUsersToDisable);\n }\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: usersToDisable.map((user) => user?.id) },\n data: { isActive: false },\n });\n\n await strapi.store.set({\n type: 'ee',\n key: 'disabled_users',\n value: currentlyDisabledUsers.concat(\n usersToDisable.map((user) => pick(user, ['id', 'isActive']))\n ),\n });\n};\n\nconst syncDisabledUserRecords = async () => {\n const disabledUsers = await getDisabledUserList();\n\n if (disabledUsers.length === 0) {\n return;\n }\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: Array.from(disabledUsers, (user) => user?.id) },\n data: { isActive: false },\n });\n};\n\nconst seatEnforcementWorkflow = async () => {\n const adminSeats = strapi.ee.seats;\n if (adminSeats == null) {\n return;\n }\n\n // TODO: we need to make sure an admin can decide to disable specific user and reactivate others\n await syncDisabledUserRecords();\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const adminSeatsLeft = adminSeats - currentActiveUserCount;\n\n if (adminSeatsLeft > 0) {\n await enableMaximumUserCount(adminSeatsLeft);\n } else if (adminSeatsLeft < 0) {\n await disableUsersAboveLicenseLimit(-adminSeatsLeft);\n }\n};\n\nexport default {\n seatEnforcementWorkflow,\n getDisabledUserList,\n};\n"],"names":["SUPER_ADMIN_CODE","constants","getDisabledUserList","disabledUsers","strapi","store","get","type","key","enableMaximumUserCount","numberOfUsersToEnable","orderedDisabledUsers","reverse","usersToEnable","take","db","query","updateMany","where","id","map","user","data","isActive","remainingDisabledUsers","drop","set","value","disableUsersAboveLicenseLimit","numberOfUsersToDisable","currentlyDisabledUsers","usersToDisable","nonSuperAdminUsersToDisable","findMany","roles","code","$ne","orderBy","createdAt","limit","push","length","superAdminUsersToDisable","concat","pick","syncDisabledUserRecords","Array","from","seatEnforcementWorkflow","adminSeats","ee","seats","currentActiveUserCount","getService","getCurrentActiveUserCount","adminSeatsLeft"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seat-enforcement.mjs","sources":["../../../../../../ee/server/src/services/seat-enforcement.ts"],"sourcesContent":["import { pick, take, drop } from 'lodash';\n\nimport { getService } from '../utils';\nimport constants from '../../../../server/src/services/constants';\nimport type { AdminUser } from '../../../../shared/contracts/shared';\n\nconst { SUPER_ADMIN_CODE } = constants;\n\ntype DisabledUser = Pick<AdminUser, 'id' | 'isActive'>;\n\n/**\n * Returns users disabled by seat enforcement, or an empty list when none are stored.\n */\nconst getDisabledUserList = async (): Promise<DisabledUser[]> => {\n const disabledUsers = (await strapi.store.get({ type: 'ee', key: 'disabled_users' })) as\n
|
|
1
|
+
{"version":3,"file":"seat-enforcement.mjs","sources":["../../../../../../ee/server/src/services/seat-enforcement.ts"],"sourcesContent":["import { pick, take, drop } from 'lodash';\n\nimport { getService } from '../utils';\nimport constants from '../../../../server/src/services/constants';\nimport type { AdminUser } from '../../../../shared/contracts/shared';\n\nconst { SUPER_ADMIN_CODE } = constants;\n\ntype DisabledUser = Pick<AdminUser, 'id' | 'isActive'>;\n\n/**\n * Returns users disabled by seat enforcement, or an empty list when none are stored.\n */\nconst getDisabledUserList = async (): Promise<DisabledUser[]> => {\n const disabledUsers = (await strapi.store.get({ type: 'ee', key: 'disabled_users' })) as\n DisabledUser[] | null | undefined;\n\n return disabledUsers ?? [];\n};\n\nconst enableMaximumUserCount = async (numberOfUsersToEnable: number) => {\n const disabledUsers = await getDisabledUserList();\n const orderedDisabledUsers = [...disabledUsers].reverse();\n\n const usersToEnable = take(orderedDisabledUsers, numberOfUsersToEnable);\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: usersToEnable.map((user) => user?.id) },\n data: { isActive: true },\n });\n\n const remainingDisabledUsers = drop(orderedDisabledUsers, numberOfUsersToEnable);\n\n await strapi.store.set({\n type: 'ee',\n key: 'disabled_users',\n value: remainingDisabledUsers,\n });\n};\n\nconst disableUsersAboveLicenseLimit = async (numberOfUsersToDisable: number) => {\n const currentlyDisabledUsers = await getDisabledUserList();\n\n const usersToDisable = [];\n const nonSuperAdminUsersToDisable = await strapi.db.query('admin::user').findMany({\n where: {\n isActive: true,\n roles: {\n code: { $ne: SUPER_ADMIN_CODE },\n },\n },\n orderBy: { createdAt: 'DESC' },\n limit: numberOfUsersToDisable,\n });\n\n usersToDisable.push(...nonSuperAdminUsersToDisable);\n\n if (nonSuperAdminUsersToDisable.length < numberOfUsersToDisable) {\n const superAdminUsersToDisable = await strapi.db.query('admin::user').findMany({\n where: {\n isActive: true,\n roles: { code: SUPER_ADMIN_CODE },\n },\n orderBy: { createdAt: 'DESC' },\n limit: numberOfUsersToDisable - nonSuperAdminUsersToDisable.length,\n });\n\n usersToDisable.push(...superAdminUsersToDisable);\n }\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: usersToDisable.map((user) => user?.id) },\n data: { isActive: false },\n });\n\n await strapi.store.set({\n type: 'ee',\n key: 'disabled_users',\n value: currentlyDisabledUsers.concat(\n usersToDisable.map((user) => pick(user, ['id', 'isActive']))\n ),\n });\n};\n\nconst syncDisabledUserRecords = async () => {\n const disabledUsers = await getDisabledUserList();\n\n if (disabledUsers.length === 0) {\n return;\n }\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: Array.from(disabledUsers, (user) => user?.id) },\n data: { isActive: false },\n });\n};\n\nconst seatEnforcementWorkflow = async () => {\n const adminSeats = strapi.ee.seats;\n if (adminSeats == null) {\n return;\n }\n\n // TODO: we need to make sure an admin can decide to disable specific user and reactivate others\n await syncDisabledUserRecords();\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const adminSeatsLeft = adminSeats - currentActiveUserCount;\n\n if (adminSeatsLeft > 0) {\n await enableMaximumUserCount(adminSeatsLeft);\n } else if (adminSeatsLeft < 0) {\n await disableUsersAboveLicenseLimit(-adminSeatsLeft);\n }\n};\n\nexport default {\n seatEnforcementWorkflow,\n getDisabledUserList,\n};\n"],"names":["SUPER_ADMIN_CODE","constants","getDisabledUserList","disabledUsers","strapi","store","get","type","key","enableMaximumUserCount","numberOfUsersToEnable","orderedDisabledUsers","reverse","usersToEnable","take","db","query","updateMany","where","id","map","user","data","isActive","remainingDisabledUsers","drop","set","value","disableUsersAboveLicenseLimit","numberOfUsersToDisable","currentlyDisabledUsers","usersToDisable","nonSuperAdminUsersToDisable","findMany","roles","code","$ne","orderBy","createdAt","limit","push","length","superAdminUsersToDisable","concat","pick","syncDisabledUserRecords","Array","from","seatEnforcementWorkflow","adminSeats","ee","seats","currentActiveUserCount","getService","getCurrentActiveUserCount","adminSeatsLeft"],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var utils = require('@strapi/utils');
|
|
4
|
+
var constants = require('../../../../server/src/services/constants.js');
|
|
4
5
|
|
|
6
|
+
const { ROLE_TEXT_MAX_LENGTH } = constants;
|
|
5
7
|
const roleCreateSchema = utils.yup.object().shape({
|
|
6
|
-
name: utils.yup.string().min(1).required(),
|
|
7
|
-
description: utils.yup.string().nullable()
|
|
8
|
+
name: utils.yup.string().min(1).max(ROLE_TEXT_MAX_LENGTH).required(),
|
|
9
|
+
description: utils.yup.string().max(ROLE_TEXT_MAX_LENGTH).nullable()
|
|
8
10
|
}).noUnknown();
|
|
9
11
|
const rolesDeleteSchema = utils.yup.object().shape({
|
|
10
12
|
ids: utils.yup.array().of(utils.yup.strapiID()).min(1).required().test('roles-deletion-checks', 'Roles deletion checks have failed', async function rolesDeletionChecks(ids) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"role.js","sources":["../../../../../../ee/server/src/validation/role.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\n\nconst roleCreateSchema = yup\n .object()\n .shape({\n name: yup.string().min(1).required(),\n description: yup.string().nullable(),\n })\n .noUnknown();\n\nconst rolesDeleteSchema = yup\n .object()\n .shape({\n ids: yup\n .array()\n .of(yup.strapiID())\n .min(1)\n .required()\n .test(\n 'roles-deletion-checks',\n 'Roles deletion checks have failed',\n async function rolesDeletionChecks(ids) {\n try {\n await strapi.service('admin::role').checkRolesIdForDeletion(ids);\n\n if (strapi.ee.features.isEnabled('sso')) {\n await strapi.service('admin::role').ssoCheckRolesIdForDeletion(ids);\n }\n } catch (e: any) {\n return this.createError({ path: 'ids', message: e.message });\n }\n\n return true;\n }\n ),\n })\n .noUnknown();\n\nconst roleDeleteSchema = yup\n .strapiID()\n .required()\n .test(\n 'no-admin-single-delete',\n 'Role deletion checks have failed',\n async function noAdminSingleDelete(id) {\n try {\n await strapi.service('admin::role').checkRolesIdForDeletion([id]);\n\n if (strapi.ee.features.isEnabled('sso')) {\n await strapi.service('admin::role').ssoCheckRolesIdForDeletion([id]);\n }\n } catch (e: any) {\n return this.createError({ path: 'id', message: e.message });\n }\n\n return true;\n }\n );\n\nexport const validateRoleCreateInput = validateYupSchema(roleCreateSchema);\nexport const validateRolesDeleteInput = validateYupSchema(rolesDeleteSchema);\nexport const validateRoleDeleteInput = validateYupSchema(roleDeleteSchema);\n\nexport default {\n validateRoleCreateInput,\n validateRolesDeleteInput,\n validateRoleDeleteInput,\n};\n"],"names":["roleCreateSchema","yup","object","shape","name","string","min","required","description","nullable","noUnknown","rolesDeleteSchema","ids","array","of","strapiID","test","rolesDeletionChecks","strapi","service","checkRolesIdForDeletion","ee","features","isEnabled","ssoCheckRolesIdForDeletion","e","createError","path","message","roleDeleteSchema","noAdminSingleDelete","id","validateRoleCreateInput","validateYupSchema","validateRolesDeleteInput","validateRoleDeleteInput"],"mappings":"
|
|
1
|
+
{"version":3,"file":"role.js","sources":["../../../../../../ee/server/src/validation/role.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport constants from '../../../../server/src/services/constants';\n\nconst { ROLE_TEXT_MAX_LENGTH } = constants;\n\nconst roleCreateSchema = yup\n .object()\n .shape({\n name: yup.string().min(1).max(ROLE_TEXT_MAX_LENGTH).required(),\n description: yup.string().max(ROLE_TEXT_MAX_LENGTH).nullable(),\n })\n .noUnknown();\n\nconst rolesDeleteSchema = yup\n .object()\n .shape({\n ids: yup\n .array()\n .of(yup.strapiID())\n .min(1)\n .required()\n .test(\n 'roles-deletion-checks',\n 'Roles deletion checks have failed',\n async function rolesDeletionChecks(ids) {\n try {\n await strapi.service('admin::role').checkRolesIdForDeletion(ids);\n\n if (strapi.ee.features.isEnabled('sso')) {\n await strapi.service('admin::role').ssoCheckRolesIdForDeletion(ids);\n }\n } catch (e: any) {\n return this.createError({ path: 'ids', message: e.message });\n }\n\n return true;\n }\n ),\n })\n .noUnknown();\n\nconst roleDeleteSchema = yup\n .strapiID()\n .required()\n .test(\n 'no-admin-single-delete',\n 'Role deletion checks have failed',\n async function noAdminSingleDelete(id) {\n try {\n await strapi.service('admin::role').checkRolesIdForDeletion([id]);\n\n if (strapi.ee.features.isEnabled('sso')) {\n await strapi.service('admin::role').ssoCheckRolesIdForDeletion([id]);\n }\n } catch (e: any) {\n return this.createError({ path: 'id', message: e.message });\n }\n\n return true;\n }\n );\n\nexport const validateRoleCreateInput = validateYupSchema(roleCreateSchema);\nexport const validateRolesDeleteInput = validateYupSchema(rolesDeleteSchema);\nexport const validateRoleDeleteInput = validateYupSchema(roleDeleteSchema);\n\nexport default {\n validateRoleCreateInput,\n validateRolesDeleteInput,\n validateRoleDeleteInput,\n};\n"],"names":["ROLE_TEXT_MAX_LENGTH","constants","roleCreateSchema","yup","object","shape","name","string","min","max","required","description","nullable","noUnknown","rolesDeleteSchema","ids","array","of","strapiID","test","rolesDeletionChecks","strapi","service","checkRolesIdForDeletion","ee","features","isEnabled","ssoCheckRolesIdForDeletion","e","createError","path","message","roleDeleteSchema","noAdminSingleDelete","id","validateRoleCreateInput","validateYupSchema","validateRolesDeleteInput","validateRoleDeleteInput"],"mappings":";;;;;AAGA,MAAM,EAAEA,oBAAoB,EAAE,GAAGC,SAAAA;AAEjC,MAAMC,gBAAAA,GAAmBC,SAAAA,CACtBC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLC,IAAAA,EAAMH,SAAAA,CAAII,MAAM,EAAA,CAAGC,GAAG,CAAC,CAAA,CAAA,CAAGC,GAAG,CAACT,oBAAAA,CAAAA,CAAsBU,QAAQ,EAAA;AAC5DC,IAAAA,WAAAA,EAAaR,UAAII,MAAM,EAAA,CAAGE,GAAG,CAACT,sBAAsBY,QAAQ;AAC9D,CAAA,CAAA,CACCC,SAAS,EAAA;AAEZ,MAAMC,iBAAAA,GAAoBX,SAAAA,CACvBC,MAAM,EAAA,CACNC,KAAK,CAAC;AACLU,IAAAA,GAAAA,EAAKZ,UACFa,KAAK,EAAA,CACLC,EAAE,CAACd,SAAAA,CAAIe,QAAQ,EAAA,CAAA,CACfV,GAAG,CAAC,CAAA,CAAA,CACJE,QAAQ,GACRS,IAAI,CACH,yBACA,mCAAA,EACA,eAAeC,oBAAoBL,GAAG,EAAA;QACpC,IAAI;AACF,YAAA,MAAMM,MAAAA,CAAOC,OAAO,CAAC,aAAA,CAAA,CAAeC,uBAAuB,CAACR,GAAAA,CAAAA;AAE5D,YAAA,IAAIM,OAAOG,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,KAAA,CAAA,EAAQ;AACvC,gBAAA,MAAML,MAAAA,CAAOC,OAAO,CAAC,aAAA,CAAA,CAAeK,0BAA0B,CAACZ,GAAAA,CAAAA;AACjE,YAAA;AACF,QAAA,CAAA,CAAE,OAAOa,CAAAA,EAAQ;YACf,OAAO,IAAI,CAACC,WAAW,CAAC;gBAAEC,IAAAA,EAAM,KAAA;AAAOC,gBAAAA,OAAAA,EAASH,EAAEG;AAAQ,aAAA,CAAA;AAC5D,QAAA;QAEA,OAAO,IAAA;AACT,IAAA,CAAA;AAEN,CAAA,CAAA,CACClB,SAAS,EAAA;AAEZ,MAAMmB,gBAAAA,GAAmB7B,SAAAA,CACtBe,QAAQ,EAAA,CACRR,QAAQ,EAAA,CACRS,IAAI,CACH,wBAAA,EACA,kCAAA,EACA,eAAec,mBAAAA,CAAoBC,EAAE,EAAA;IACnC,IAAI;AACF,QAAA,MAAMb,MAAAA,CAAOC,OAAO,CAAC,aAAA,CAAA,CAAeC,uBAAuB,CAAC;AAACW,YAAAA;AAAG,SAAA,CAAA;AAEhE,QAAA,IAAIb,OAAOG,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,KAAA,CAAA,EAAQ;AACvC,YAAA,MAAML,MAAAA,CAAOC,OAAO,CAAC,aAAA,CAAA,CAAeK,0BAA0B,CAAC;AAACO,gBAAAA;AAAG,aAAA,CAAA;AACrE,QAAA;AACF,IAAA,CAAA,CAAE,OAAON,CAAAA,EAAQ;QACf,OAAO,IAAI,CAACC,WAAW,CAAC;YAAEC,IAAAA,EAAM,IAAA;AAAMC,YAAAA,OAAAA,EAASH,EAAEG;AAAQ,SAAA,CAAA;AAC3D,IAAA;IAEA,OAAO,IAAA;AACT,CAAA,CAAA;AAGG,MAAMI,uBAAAA,GAA0BC,uBAAAA,CAAkBlC,gBAAAA;AAClD,MAAMmC,wBAAAA,GAA2BD,uBAAAA,CAAkBtB,iBAAAA;AACnD,MAAMwB,uBAAAA,GAA0BF,uBAAAA,CAAkBJ,gBAAAA;;;;;;"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { yup, validateYupSchema } from '@strapi/utils';
|
|
2
|
+
import constants from '../../../../server/src/services/constants.mjs';
|
|
2
3
|
|
|
4
|
+
const { ROLE_TEXT_MAX_LENGTH } = constants;
|
|
3
5
|
const roleCreateSchema = yup.object().shape({
|
|
4
|
-
name: yup.string().min(1).required(),
|
|
5
|
-
description: yup.string().nullable()
|
|
6
|
+
name: yup.string().min(1).max(ROLE_TEXT_MAX_LENGTH).required(),
|
|
7
|
+
description: yup.string().max(ROLE_TEXT_MAX_LENGTH).nullable()
|
|
6
8
|
}).noUnknown();
|
|
7
9
|
const rolesDeleteSchema = yup.object().shape({
|
|
8
10
|
ids: yup.array().of(yup.strapiID()).min(1).required().test('roles-deletion-checks', 'Roles deletion checks have failed', async function rolesDeletionChecks(ids) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"role.mjs","sources":["../../../../../../ee/server/src/validation/role.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\n\nconst roleCreateSchema = yup\n .object()\n .shape({\n name: yup.string().min(1).required(),\n description: yup.string().nullable(),\n })\n .noUnknown();\n\nconst rolesDeleteSchema = yup\n .object()\n .shape({\n ids: yup\n .array()\n .of(yup.strapiID())\n .min(1)\n .required()\n .test(\n 'roles-deletion-checks',\n 'Roles deletion checks have failed',\n async function rolesDeletionChecks(ids) {\n try {\n await strapi.service('admin::role').checkRolesIdForDeletion(ids);\n\n if (strapi.ee.features.isEnabled('sso')) {\n await strapi.service('admin::role').ssoCheckRolesIdForDeletion(ids);\n }\n } catch (e: any) {\n return this.createError({ path: 'ids', message: e.message });\n }\n\n return true;\n }\n ),\n })\n .noUnknown();\n\nconst roleDeleteSchema = yup\n .strapiID()\n .required()\n .test(\n 'no-admin-single-delete',\n 'Role deletion checks have failed',\n async function noAdminSingleDelete(id) {\n try {\n await strapi.service('admin::role').checkRolesIdForDeletion([id]);\n\n if (strapi.ee.features.isEnabled('sso')) {\n await strapi.service('admin::role').ssoCheckRolesIdForDeletion([id]);\n }\n } catch (e: any) {\n return this.createError({ path: 'id', message: e.message });\n }\n\n return true;\n }\n );\n\nexport const validateRoleCreateInput = validateYupSchema(roleCreateSchema);\nexport const validateRolesDeleteInput = validateYupSchema(rolesDeleteSchema);\nexport const validateRoleDeleteInput = validateYupSchema(roleDeleteSchema);\n\nexport default {\n validateRoleCreateInput,\n validateRolesDeleteInput,\n validateRoleDeleteInput,\n};\n"],"names":["roleCreateSchema","yup","object","shape","name","string","min","required","description","nullable","noUnknown","rolesDeleteSchema","ids","array","of","strapiID","test","rolesDeletionChecks","strapi","service","checkRolesIdForDeletion","ee","features","isEnabled","ssoCheckRolesIdForDeletion","e","createError","path","message","roleDeleteSchema","noAdminSingleDelete","id","validateRoleCreateInput","validateYupSchema","validateRolesDeleteInput","validateRoleDeleteInput"],"mappings":"
|
|
1
|
+
{"version":3,"file":"role.mjs","sources":["../../../../../../ee/server/src/validation/role.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport constants from '../../../../server/src/services/constants';\n\nconst { ROLE_TEXT_MAX_LENGTH } = constants;\n\nconst roleCreateSchema = yup\n .object()\n .shape({\n name: yup.string().min(1).max(ROLE_TEXT_MAX_LENGTH).required(),\n description: yup.string().max(ROLE_TEXT_MAX_LENGTH).nullable(),\n })\n .noUnknown();\n\nconst rolesDeleteSchema = yup\n .object()\n .shape({\n ids: yup\n .array()\n .of(yup.strapiID())\n .min(1)\n .required()\n .test(\n 'roles-deletion-checks',\n 'Roles deletion checks have failed',\n async function rolesDeletionChecks(ids) {\n try {\n await strapi.service('admin::role').checkRolesIdForDeletion(ids);\n\n if (strapi.ee.features.isEnabled('sso')) {\n await strapi.service('admin::role').ssoCheckRolesIdForDeletion(ids);\n }\n } catch (e: any) {\n return this.createError({ path: 'ids', message: e.message });\n }\n\n return true;\n }\n ),\n })\n .noUnknown();\n\nconst roleDeleteSchema = yup\n .strapiID()\n .required()\n .test(\n 'no-admin-single-delete',\n 'Role deletion checks have failed',\n async function noAdminSingleDelete(id) {\n try {\n await strapi.service('admin::role').checkRolesIdForDeletion([id]);\n\n if (strapi.ee.features.isEnabled('sso')) {\n await strapi.service('admin::role').ssoCheckRolesIdForDeletion([id]);\n }\n } catch (e: any) {\n return this.createError({ path: 'id', message: e.message });\n }\n\n return true;\n }\n );\n\nexport const validateRoleCreateInput = validateYupSchema(roleCreateSchema);\nexport const validateRolesDeleteInput = validateYupSchema(rolesDeleteSchema);\nexport const validateRoleDeleteInput = validateYupSchema(roleDeleteSchema);\n\nexport default {\n validateRoleCreateInput,\n validateRolesDeleteInput,\n validateRoleDeleteInput,\n};\n"],"names":["ROLE_TEXT_MAX_LENGTH","constants","roleCreateSchema","yup","object","shape","name","string","min","max","required","description","nullable","noUnknown","rolesDeleteSchema","ids","array","of","strapiID","test","rolesDeletionChecks","strapi","service","checkRolesIdForDeletion","ee","features","isEnabled","ssoCheckRolesIdForDeletion","e","createError","path","message","roleDeleteSchema","noAdminSingleDelete","id","validateRoleCreateInput","validateYupSchema","validateRolesDeleteInput","validateRoleDeleteInput"],"mappings":";;;AAGA,MAAM,EAAEA,oBAAoB,EAAE,GAAGC,SAAAA;AAEjC,MAAMC,gBAAAA,GAAmBC,GAAAA,CACtBC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLC,IAAAA,EAAMH,GAAAA,CAAII,MAAM,EAAA,CAAGC,GAAG,CAAC,CAAA,CAAA,CAAGC,GAAG,CAACT,oBAAAA,CAAAA,CAAsBU,QAAQ,EAAA;AAC5DC,IAAAA,WAAAA,EAAaR,IAAII,MAAM,EAAA,CAAGE,GAAG,CAACT,sBAAsBY,QAAQ;AAC9D,CAAA,CAAA,CACCC,SAAS,EAAA;AAEZ,MAAMC,iBAAAA,GAAoBX,GAAAA,CACvBC,MAAM,EAAA,CACNC,KAAK,CAAC;AACLU,IAAAA,GAAAA,EAAKZ,IACFa,KAAK,EAAA,CACLC,EAAE,CAACd,GAAAA,CAAIe,QAAQ,EAAA,CAAA,CACfV,GAAG,CAAC,CAAA,CAAA,CACJE,QAAQ,GACRS,IAAI,CACH,yBACA,mCAAA,EACA,eAAeC,oBAAoBL,GAAG,EAAA;QACpC,IAAI;AACF,YAAA,MAAMM,MAAAA,CAAOC,OAAO,CAAC,aAAA,CAAA,CAAeC,uBAAuB,CAACR,GAAAA,CAAAA;AAE5D,YAAA,IAAIM,OAAOG,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,KAAA,CAAA,EAAQ;AACvC,gBAAA,MAAML,MAAAA,CAAOC,OAAO,CAAC,aAAA,CAAA,CAAeK,0BAA0B,CAACZ,GAAAA,CAAAA;AACjE,YAAA;AACF,QAAA,CAAA,CAAE,OAAOa,CAAAA,EAAQ;YACf,OAAO,IAAI,CAACC,WAAW,CAAC;gBAAEC,IAAAA,EAAM,KAAA;AAAOC,gBAAAA,OAAAA,EAASH,EAAEG;AAAQ,aAAA,CAAA;AAC5D,QAAA;QAEA,OAAO,IAAA;AACT,IAAA,CAAA;AAEN,CAAA,CAAA,CACClB,SAAS,EAAA;AAEZ,MAAMmB,gBAAAA,GAAmB7B,GAAAA,CACtBe,QAAQ,EAAA,CACRR,QAAQ,EAAA,CACRS,IAAI,CACH,wBAAA,EACA,kCAAA,EACA,eAAec,mBAAAA,CAAoBC,EAAE,EAAA;IACnC,IAAI;AACF,QAAA,MAAMb,MAAAA,CAAOC,OAAO,CAAC,aAAA,CAAA,CAAeC,uBAAuB,CAAC;AAACW,YAAAA;AAAG,SAAA,CAAA;AAEhE,QAAA,IAAIb,OAAOG,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,KAAA,CAAA,EAAQ;AACvC,YAAA,MAAML,MAAAA,CAAOC,OAAO,CAAC,aAAA,CAAA,CAAeK,0BAA0B,CAAC;AAACO,gBAAAA;AAAG,aAAA,CAAA;AACrE,QAAA;AACF,IAAA,CAAA,CAAE,OAAON,CAAAA,EAAQ;QACf,OAAO,IAAI,CAACC,WAAW,CAAC;YAAEC,IAAAA,EAAM,IAAA;AAAMC,YAAAA,OAAAA,EAASH,EAAEG;AAAQ,SAAA,CAAA;AAC3D,IAAA;IAEA,OAAO,IAAA;AACT,CAAA,CAAA;AAGG,MAAMI,uBAAAA,GAA0BC,iBAAAA,CAAkBlC,gBAAAA;AAClD,MAAMmC,wBAAAA,GAA2BD,iBAAAA,CAAkBtB,iBAAAA;AACnD,MAAMwB,uBAAAA,GAA0BF,iBAAAA,CAAkBJ,gBAAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.js","sources":["../../../../../../server/src/ai/services/ai.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport crypto from 'crypto';\nimport fs from 'fs';\nimport path from 'path';\nimport { AdminUser } from '../../../../shared/contracts/shared';\n\nconst STRAPI_MANAGED_AI_LICENSE_FEATURE = 'cms-ai';\nconst CUSTOM_AI_PROVIDER_LICENSE_FEATURE = 'cms-byok-ai';\n\nconst createAiAdminService = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * In-memory cache for AI tokens\n * Key format: `${projectId}:${userId}`\n */\n const aiTokenCache = new Map<\n string,\n {\n token: string;\n expiresAt?: string;\n expiresAtMs?: number;\n }\n >();\n\n let isCustomProviderRejected = false;\n\n const isConfigEnabled = (): boolean => strapi.config.get('admin.ai.enabled', true) === true;\n\n const isAvailable = (): boolean =>\n isConfigEnabled() && strapi.ee?.isEE === true && !isCustomProviderRejected;\n\n const isStrapiManagedAiEnabled = (): boolean =>\n isConfigEnabled() &&\n !isCustomProviderRejected &&\n strapi.ee?.features?.isEnabled(STRAPI_MANAGED_AI_LICENSE_FEATURE) === true;\n\n const authorizeCustomProvider = (): boolean => {\n if (!isConfigEnabled()) {\n strapi.log.info(\n 'A custom AI provider was ignored: AI is disabled by the \"admin.ai.enabled\" config.'\n );\n return false;\n }\n\n if (strapi.ee?.features?.isEnabled(CUSTOM_AI_PROVIDER_LICENSE_FEATURE) === true) {\n return true;\n }\n\n isCustomProviderRejected = true;\n strapi.log.warn(\n `A custom AI provider was rejected: the Strapi license does not include the \"${CUSTOM_AI_PROVIDER_LICENSE_FEATURE}\" feature. All AI features are disabled.`\n );\n return false;\n };\n\n const isPluginAiFeatureConfigured = async (plugin: string, service: string): Promise<boolean> => {\n const aiService = strapi.plugin(plugin)?.service(service) as\n | { isEnabled?: () => Promise<boolean> | boolean }\n | undefined;\n\n if (typeof aiService?.isEnabled !== 'function') {\n return false;\n }\n\n return (await aiService.isEnabled()) === true;\n };\n\n const getAiFeatureConfig = async () => {\n if (!isAvailable()) {\n return {\n isAiI18nConfigured: false,\n isAiMediaLibraryConfigured: false,\n };\n }\n\n const [isAiI18nConfigured, isAiMediaLibraryConfigured] = await Promise.all([\n isPluginAiFeatureConfigured('i18n', 'ai-localizations'),\n isPluginAiFeatureConfigured('upload', 'aiMetadata'),\n ]);\n\n return { isAiI18nConfigured, isAiMediaLibraryConfigured };\n };\n\n /**\n * Resolves the shared context required by both getAiToken and getAiUsage:\n * EE license, project ID, and AI server URL.\n */\n const resolveAiContext = (errorPrefix: string) => {\n if (!isStrapiManagedAiEnabled()) {\n strapi.log.error(`${errorPrefix} AI is not enabled`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n if (!strapi.ee?.isEE) {\n strapi.log.error(`${errorPrefix} Enterprise Edition features are not enabled`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n let eeLicense = process.env.STRAPI_LICENSE;\n\n if (!eeLicense) {\n try {\n const licensePath = path.join(strapi.dirs.app.root, 'license.txt');\n eeLicense = fs.readFileSync(licensePath).toString();\n } catch {\n // License file doesn't exist or can't be read\n }\n }\n\n if (!eeLicense) {\n strapi.log.error(\n `${errorPrefix} No EE license found. Please ensure STRAPI_LICENSE environment variable is set or license.txt file exists.`\n );\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n const projectId = strapi.config.get('uuid');\n if (!projectId) {\n strapi.log.error(`${errorPrefix} Project ID not configured`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n const aiServerUrl = process.env.STRAPI_AI_URL || 'https://strapi-ai.apps.strapi.io';\n\n return { eeLicense, projectId, aiServerUrl };\n };\n\n const getAiToken = async () => {\n const ERROR_PREFIX = 'AI token request failed:';\n\n const { eeLicense, projectId, aiServerUrl } = resolveAiContext(ERROR_PREFIX);\n\n // Get the current user\n const user = strapi.requestContext.get()?.state?.user as AdminUser | undefined;\n if (!user) {\n strapi.log.error(`${ERROR_PREFIX} No authenticated user in request context`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n // Create a secure user identifier using only user ID\n const userIdentifier = user.id.toString();\n\n // Check cache for existing valid token\n const cacheKey = `${projectId}:${userIdentifier}`;\n const cachedToken = aiTokenCache.get(cacheKey);\n\n if (cachedToken) {\n const now = Date.now();\n // Check if token is still valid (with buffer so it has time to be used)\n const bufferMs = 2 * 60 * 1000; // 2 minutes\n\n if (cachedToken.expiresAtMs && cachedToken.expiresAtMs - bufferMs > now) {\n strapi.log.info('Using cached AI token');\n\n return {\n token: cachedToken.token,\n expiresAt: cachedToken.expiresAt,\n };\n }\n\n // Token expired or will expire soon, remove from cache\n aiTokenCache.delete(cacheKey);\n }\n\n strapi.log.http('Contacting AI Server for token generation');\n\n try {\n const response = await fetch(`${aiServerUrl}/auth/getAiJWT`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Request-Id': crypto.randomUUID(),\n },\n body: JSON.stringify({\n eeLicense,\n userIdentifier,\n projectId,\n }),\n });\n\n if (!response.ok) {\n let errorData;\n let errorText;\n try {\n errorText = await response.text();\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { error: errorText || 'Failed to parse error response' };\n }\n\n strapi.log.error(`${ERROR_PREFIX} ${errorData?.error || 'Unknown error'}`, {\n status: response.status,\n statusText: response.statusText,\n error: errorData,\n errorText,\n projectId,\n });\n\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n let data;\n try {\n data = (await response.json()) as {\n jwt: string;\n expiresAt?: string;\n };\n } catch (parseError) {\n strapi.log.error(`${ERROR_PREFIX} Failed to parse AI server response`, parseError);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n if (!data.jwt) {\n strapi.log.error(`${ERROR_PREFIX} Invalid response: missing JWT token`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n strapi.log.info('AI token generated successfully', {\n userId: user.id,\n expiresAt: data.expiresAt,\n });\n\n // Cache the token if it has an expiration time\n if (data.expiresAt) {\n const expiresAtMs = new Date(data.expiresAt).getTime();\n aiTokenCache.set(cacheKey, {\n token: data.jwt,\n expiresAt: data.expiresAt,\n expiresAtMs,\n });\n }\n\n // Note: Token expires in 1 hour, client should handle refresh\n return {\n token: data.jwt,\n expiresAt: data.expiresAt,\n };\n } catch (fetchError) {\n if (fetchError instanceof Error && fetchError.name === 'AbortError') {\n strapi.log.error(`${ERROR_PREFIX} Request to AI server timed out`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n throw fetchError;\n }\n };\n\n const getAiUsage = async () => {\n const ERROR_PREFIX = 'AI usage data request failed:';\n\n const { eeLicense, projectId, aiServerUrl } = resolveAiContext(ERROR_PREFIX);\n\n strapi.log.http('Contacting AI Server for usage data');\n\n try {\n const response = await fetch(`${aiServerUrl}/cms/ai-data`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Request-Id': crypto.randomUUID(),\n },\n body: JSON.stringify({\n eeKey: eeLicense,\n projectId,\n }),\n });\n\n if (!response.ok) {\n let errorData;\n let errorText;\n try {\n errorText = await response.text();\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { error: errorText || 'Failed to parse error response' };\n }\n\n strapi.log.error(`${ERROR_PREFIX} ${errorData?.error || 'Unknown error'}`, {\n status: response.status,\n statusText: response.statusText,\n error: errorData,\n errorText,\n projectId,\n });\n\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n let data;\n try {\n data = (await response.json()) as {\n data: { cmsAiCreditsUsed: number };\n subscription: {\n subscriptionId: string;\n planPriceId: string;\n subscriptionStatus: string;\n isActiveSubscription: boolean;\n cmsAiEnabled: boolean;\n cmsAiCreditsBase: number;\n cmsAiCreditsMaxUsage: number;\n currentTermStart: string;\n currentTermEnd: string;\n };\n };\n } catch (parseError) {\n strapi.log.error(`${ERROR_PREFIX} Failed to parse AI server response`, parseError);\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n return {\n ...data.data,\n subscription: data.subscription,\n };\n } catch (fetchError) {\n if (fetchError instanceof Error && fetchError.name === 'AbortError') {\n strapi.log.error(`${ERROR_PREFIX} Request to AI server timed out`);\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n throw fetchError;\n }\n };\n\n return {\n /* Requires `ai.enabled=true` + license + no failed AI provider registration */\n isAvailable,\n /* `true` only when the license has the `cms-ai` entitlement to globally enable AI features.\n TODO: once all AI features are migrated to the providers architecture, consider removing this flag */\n isStrapiManagedAiEnabled,\n authorizeCustomProvider,\n /* Returns the status of each AI feature, flagging which are enabled. */\n getAiFeatureConfig,\n getAiToken,\n getAiUsage,\n };\n};\n\nexport { createAiAdminService };\n"],"names":["STRAPI_MANAGED_AI_LICENSE_FEATURE","CUSTOM_AI_PROVIDER_LICENSE_FEATURE","createAiAdminService","strapi","aiTokenCache","Map","isCustomProviderRejected","isConfigEnabled","config","get","isAvailable","ee","isEE","isStrapiManagedAiEnabled","features","isEnabled","authorizeCustomProvider","log","info","warn","isPluginAiFeatureConfigured","plugin","service","aiService","getAiFeatureConfig","isAiI18nConfigured","isAiMediaLibraryConfigured","Promise","all","resolveAiContext","errorPrefix","error","Error","replace","eeLicense","process","env","STRAPI_LICENSE","licensePath","path","join","dirs","app","root","fs","readFileSync","toString","projectId","aiServerUrl","STRAPI_AI_URL","getAiToken","ERROR_PREFIX","user","requestContext","state","userIdentifier","id","cacheKey","cachedToken","now","Date","bufferMs","expiresAtMs","token","expiresAt","delete","http","response","fetch","method","headers","crypto","randomUUID","body","JSON","stringify","ok","errorData","errorText","text","parse","status","statusText","data","json","parseError","jwt","userId","getTime","set","fetchError","name","getAiUsage","eeKey","subscription"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai.js","sources":["../../../../../../server/src/ai/services/ai.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport crypto from 'crypto';\nimport fs from 'fs';\nimport path from 'path';\nimport { AdminUser } from '../../../../shared/contracts/shared';\n\nconst STRAPI_MANAGED_AI_LICENSE_FEATURE = 'cms-ai';\nconst CUSTOM_AI_PROVIDER_LICENSE_FEATURE = 'cms-byok-ai';\n\nconst createAiAdminService = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * In-memory cache for AI tokens\n * Key format: `${projectId}:${userId}`\n */\n const aiTokenCache = new Map<\n string,\n {\n token: string;\n expiresAt?: string;\n expiresAtMs?: number;\n }\n >();\n\n let isCustomProviderRejected = false;\n\n const isConfigEnabled = (): boolean => strapi.config.get('admin.ai.enabled', true) === true;\n\n const isAvailable = (): boolean =>\n isConfigEnabled() && strapi.ee?.isEE === true && !isCustomProviderRejected;\n\n const isStrapiManagedAiEnabled = (): boolean =>\n isConfigEnabled() &&\n !isCustomProviderRejected &&\n strapi.ee?.features?.isEnabled(STRAPI_MANAGED_AI_LICENSE_FEATURE) === true;\n\n const authorizeCustomProvider = (): boolean => {\n if (!isConfigEnabled()) {\n strapi.log.info(\n 'A custom AI provider was ignored: AI is disabled by the \"admin.ai.enabled\" config.'\n );\n return false;\n }\n\n if (strapi.ee?.features?.isEnabled(CUSTOM_AI_PROVIDER_LICENSE_FEATURE) === true) {\n return true;\n }\n\n isCustomProviderRejected = true;\n strapi.log.warn(\n `A custom AI provider was rejected: the Strapi license does not include the \"${CUSTOM_AI_PROVIDER_LICENSE_FEATURE}\" feature. All AI features are disabled.`\n );\n return false;\n };\n\n const isPluginAiFeatureConfigured = async (plugin: string, service: string): Promise<boolean> => {\n const aiService = strapi.plugin(plugin)?.service(service) as\n { isEnabled?: () => Promise<boolean> | boolean } | undefined;\n\n if (typeof aiService?.isEnabled !== 'function') {\n return false;\n }\n\n return (await aiService.isEnabled()) === true;\n };\n\n const getAiFeatureConfig = async () => {\n if (!isAvailable()) {\n return {\n isAiI18nConfigured: false,\n isAiMediaLibraryConfigured: false,\n };\n }\n\n const [isAiI18nConfigured, isAiMediaLibraryConfigured] = await Promise.all([\n isPluginAiFeatureConfigured('i18n', 'ai-localizations'),\n isPluginAiFeatureConfigured('upload', 'aiMetadata'),\n ]);\n\n return { isAiI18nConfigured, isAiMediaLibraryConfigured };\n };\n\n /**\n * Resolves the shared context required by both getAiToken and getAiUsage:\n * EE license, project ID, and AI server URL.\n */\n const resolveAiContext = (errorPrefix: string) => {\n if (!isStrapiManagedAiEnabled()) {\n strapi.log.error(`${errorPrefix} AI is not enabled`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n if (!strapi.ee?.isEE) {\n strapi.log.error(`${errorPrefix} Enterprise Edition features are not enabled`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n let eeLicense = process.env.STRAPI_LICENSE;\n\n if (!eeLicense) {\n try {\n const licensePath = path.join(strapi.dirs.app.root, 'license.txt');\n eeLicense = fs.readFileSync(licensePath).toString();\n } catch {\n // License file doesn't exist or can't be read\n }\n }\n\n if (!eeLicense) {\n strapi.log.error(\n `${errorPrefix} No EE license found. Please ensure STRAPI_LICENSE environment variable is set or license.txt file exists.`\n );\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n const projectId = strapi.config.get('uuid');\n if (!projectId) {\n strapi.log.error(`${errorPrefix} Project ID not configured`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n const aiServerUrl = process.env.STRAPI_AI_URL || 'https://strapi-ai.apps.strapi.io';\n\n return { eeLicense, projectId, aiServerUrl };\n };\n\n const getAiToken = async () => {\n const ERROR_PREFIX = 'AI token request failed:';\n\n const { eeLicense, projectId, aiServerUrl } = resolveAiContext(ERROR_PREFIX);\n\n // Get the current user\n const user = strapi.requestContext.get()?.state?.user as AdminUser | undefined;\n if (!user) {\n strapi.log.error(`${ERROR_PREFIX} No authenticated user in request context`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n // Create a secure user identifier using only user ID\n const userIdentifier = user.id.toString();\n\n // Check cache for existing valid token\n const cacheKey = `${projectId}:${userIdentifier}`;\n const cachedToken = aiTokenCache.get(cacheKey);\n\n if (cachedToken) {\n const now = Date.now();\n // Check if token is still valid (with buffer so it has time to be used)\n const bufferMs = 2 * 60 * 1000; // 2 minutes\n\n if (cachedToken.expiresAtMs && cachedToken.expiresAtMs - bufferMs > now) {\n strapi.log.info('Using cached AI token');\n\n return {\n token: cachedToken.token,\n expiresAt: cachedToken.expiresAt,\n };\n }\n\n // Token expired or will expire soon, remove from cache\n aiTokenCache.delete(cacheKey);\n }\n\n strapi.log.http('Contacting AI Server for token generation');\n\n try {\n const response = await fetch(`${aiServerUrl}/auth/getAiJWT`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Request-Id': crypto.randomUUID(),\n },\n body: JSON.stringify({\n eeLicense,\n userIdentifier,\n projectId,\n }),\n });\n\n if (!response.ok) {\n let errorData;\n let errorText;\n try {\n errorText = await response.text();\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { error: errorText || 'Failed to parse error response' };\n }\n\n strapi.log.error(`${ERROR_PREFIX} ${errorData?.error || 'Unknown error'}`, {\n status: response.status,\n statusText: response.statusText,\n error: errorData,\n errorText,\n projectId,\n });\n\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n let data;\n try {\n data = (await response.json()) as {\n jwt: string;\n expiresAt?: string;\n };\n } catch (parseError) {\n strapi.log.error(`${ERROR_PREFIX} Failed to parse AI server response`, parseError);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n if (!data.jwt) {\n strapi.log.error(`${ERROR_PREFIX} Invalid response: missing JWT token`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n strapi.log.info('AI token generated successfully', {\n userId: user.id,\n expiresAt: data.expiresAt,\n });\n\n // Cache the token if it has an expiration time\n if (data.expiresAt) {\n const expiresAtMs = new Date(data.expiresAt).getTime();\n aiTokenCache.set(cacheKey, {\n token: data.jwt,\n expiresAt: data.expiresAt,\n expiresAtMs,\n });\n }\n\n // Note: Token expires in 1 hour, client should handle refresh\n return {\n token: data.jwt,\n expiresAt: data.expiresAt,\n };\n } catch (fetchError) {\n if (fetchError instanceof Error && fetchError.name === 'AbortError') {\n strapi.log.error(`${ERROR_PREFIX} Request to AI server timed out`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n throw fetchError;\n }\n };\n\n const getAiUsage = async () => {\n const ERROR_PREFIX = 'AI usage data request failed:';\n\n const { eeLicense, projectId, aiServerUrl } = resolveAiContext(ERROR_PREFIX);\n\n strapi.log.http('Contacting AI Server for usage data');\n\n try {\n const response = await fetch(`${aiServerUrl}/cms/ai-data`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Request-Id': crypto.randomUUID(),\n },\n body: JSON.stringify({\n eeKey: eeLicense,\n projectId,\n }),\n });\n\n if (!response.ok) {\n let errorData;\n let errorText;\n try {\n errorText = await response.text();\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { error: errorText || 'Failed to parse error response' };\n }\n\n strapi.log.error(`${ERROR_PREFIX} ${errorData?.error || 'Unknown error'}`, {\n status: response.status,\n statusText: response.statusText,\n error: errorData,\n errorText,\n projectId,\n });\n\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n let data;\n try {\n data = (await response.json()) as {\n data: { cmsAiCreditsUsed: number };\n subscription: {\n subscriptionId: string;\n planPriceId: string;\n subscriptionStatus: string;\n isActiveSubscription: boolean;\n cmsAiEnabled: boolean;\n cmsAiCreditsBase: number;\n cmsAiCreditsMaxUsage: number;\n currentTermStart: string;\n currentTermEnd: string;\n };\n };\n } catch (parseError) {\n strapi.log.error(`${ERROR_PREFIX} Failed to parse AI server response`, parseError);\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n return {\n ...data.data,\n subscription: data.subscription,\n };\n } catch (fetchError) {\n if (fetchError instanceof Error && fetchError.name === 'AbortError') {\n strapi.log.error(`${ERROR_PREFIX} Request to AI server timed out`);\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n throw fetchError;\n }\n };\n\n return {\n /* Requires `ai.enabled=true` + license + no failed AI provider registration */\n isAvailable,\n /* `true` only when the license has the `cms-ai` entitlement to globally enable AI features.\n TODO: once all AI features are migrated to the providers architecture, consider removing this flag */\n isStrapiManagedAiEnabled,\n authorizeCustomProvider,\n /* Returns the status of each AI feature, flagging which are enabled. */\n getAiFeatureConfig,\n getAiToken,\n getAiUsage,\n };\n};\n\nexport { createAiAdminService };\n"],"names":["STRAPI_MANAGED_AI_LICENSE_FEATURE","CUSTOM_AI_PROVIDER_LICENSE_FEATURE","createAiAdminService","strapi","aiTokenCache","Map","isCustomProviderRejected","isConfigEnabled","config","get","isAvailable","ee","isEE","isStrapiManagedAiEnabled","features","isEnabled","authorizeCustomProvider","log","info","warn","isPluginAiFeatureConfigured","plugin","service","aiService","getAiFeatureConfig","isAiI18nConfigured","isAiMediaLibraryConfigured","Promise","all","resolveAiContext","errorPrefix","error","Error","replace","eeLicense","process","env","STRAPI_LICENSE","licensePath","path","join","dirs","app","root","fs","readFileSync","toString","projectId","aiServerUrl","STRAPI_AI_URL","getAiToken","ERROR_PREFIX","user","requestContext","state","userIdentifier","id","cacheKey","cachedToken","now","Date","bufferMs","expiresAtMs","token","expiresAt","delete","http","response","fetch","method","headers","crypto","randomUUID","body","JSON","stringify","ok","errorData","errorText","text","parse","status","statusText","data","json","parseError","jwt","userId","getTime","set","fetchError","name","getAiUsage","eeKey","subscription"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.mjs","sources":["../../../../../../server/src/ai/services/ai.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport crypto from 'crypto';\nimport fs from 'fs';\nimport path from 'path';\nimport { AdminUser } from '../../../../shared/contracts/shared';\n\nconst STRAPI_MANAGED_AI_LICENSE_FEATURE = 'cms-ai';\nconst CUSTOM_AI_PROVIDER_LICENSE_FEATURE = 'cms-byok-ai';\n\nconst createAiAdminService = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * In-memory cache for AI tokens\n * Key format: `${projectId}:${userId}`\n */\n const aiTokenCache = new Map<\n string,\n {\n token: string;\n expiresAt?: string;\n expiresAtMs?: number;\n }\n >();\n\n let isCustomProviderRejected = false;\n\n const isConfigEnabled = (): boolean => strapi.config.get('admin.ai.enabled', true) === true;\n\n const isAvailable = (): boolean =>\n isConfigEnabled() && strapi.ee?.isEE === true && !isCustomProviderRejected;\n\n const isStrapiManagedAiEnabled = (): boolean =>\n isConfigEnabled() &&\n !isCustomProviderRejected &&\n strapi.ee?.features?.isEnabled(STRAPI_MANAGED_AI_LICENSE_FEATURE) === true;\n\n const authorizeCustomProvider = (): boolean => {\n if (!isConfigEnabled()) {\n strapi.log.info(\n 'A custom AI provider was ignored: AI is disabled by the \"admin.ai.enabled\" config.'\n );\n return false;\n }\n\n if (strapi.ee?.features?.isEnabled(CUSTOM_AI_PROVIDER_LICENSE_FEATURE) === true) {\n return true;\n }\n\n isCustomProviderRejected = true;\n strapi.log.warn(\n `A custom AI provider was rejected: the Strapi license does not include the \"${CUSTOM_AI_PROVIDER_LICENSE_FEATURE}\" feature. All AI features are disabled.`\n );\n return false;\n };\n\n const isPluginAiFeatureConfigured = async (plugin: string, service: string): Promise<boolean> => {\n const aiService = strapi.plugin(plugin)?.service(service) as\n | { isEnabled?: () => Promise<boolean> | boolean }\n | undefined;\n\n if (typeof aiService?.isEnabled !== 'function') {\n return false;\n }\n\n return (await aiService.isEnabled()) === true;\n };\n\n const getAiFeatureConfig = async () => {\n if (!isAvailable()) {\n return {\n isAiI18nConfigured: false,\n isAiMediaLibraryConfigured: false,\n };\n }\n\n const [isAiI18nConfigured, isAiMediaLibraryConfigured] = await Promise.all([\n isPluginAiFeatureConfigured('i18n', 'ai-localizations'),\n isPluginAiFeatureConfigured('upload', 'aiMetadata'),\n ]);\n\n return { isAiI18nConfigured, isAiMediaLibraryConfigured };\n };\n\n /**\n * Resolves the shared context required by both getAiToken and getAiUsage:\n * EE license, project ID, and AI server URL.\n */\n const resolveAiContext = (errorPrefix: string) => {\n if (!isStrapiManagedAiEnabled()) {\n strapi.log.error(`${errorPrefix} AI is not enabled`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n if (!strapi.ee?.isEE) {\n strapi.log.error(`${errorPrefix} Enterprise Edition features are not enabled`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n let eeLicense = process.env.STRAPI_LICENSE;\n\n if (!eeLicense) {\n try {\n const licensePath = path.join(strapi.dirs.app.root, 'license.txt');\n eeLicense = fs.readFileSync(licensePath).toString();\n } catch {\n // License file doesn't exist or can't be read\n }\n }\n\n if (!eeLicense) {\n strapi.log.error(\n `${errorPrefix} No EE license found. Please ensure STRAPI_LICENSE environment variable is set or license.txt file exists.`\n );\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n const projectId = strapi.config.get('uuid');\n if (!projectId) {\n strapi.log.error(`${errorPrefix} Project ID not configured`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n const aiServerUrl = process.env.STRAPI_AI_URL || 'https://strapi-ai.apps.strapi.io';\n\n return { eeLicense, projectId, aiServerUrl };\n };\n\n const getAiToken = async () => {\n const ERROR_PREFIX = 'AI token request failed:';\n\n const { eeLicense, projectId, aiServerUrl } = resolveAiContext(ERROR_PREFIX);\n\n // Get the current user\n const user = strapi.requestContext.get()?.state?.user as AdminUser | undefined;\n if (!user) {\n strapi.log.error(`${ERROR_PREFIX} No authenticated user in request context`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n // Create a secure user identifier using only user ID\n const userIdentifier = user.id.toString();\n\n // Check cache for existing valid token\n const cacheKey = `${projectId}:${userIdentifier}`;\n const cachedToken = aiTokenCache.get(cacheKey);\n\n if (cachedToken) {\n const now = Date.now();\n // Check if token is still valid (with buffer so it has time to be used)\n const bufferMs = 2 * 60 * 1000; // 2 minutes\n\n if (cachedToken.expiresAtMs && cachedToken.expiresAtMs - bufferMs > now) {\n strapi.log.info('Using cached AI token');\n\n return {\n token: cachedToken.token,\n expiresAt: cachedToken.expiresAt,\n };\n }\n\n // Token expired or will expire soon, remove from cache\n aiTokenCache.delete(cacheKey);\n }\n\n strapi.log.http('Contacting AI Server for token generation');\n\n try {\n const response = await fetch(`${aiServerUrl}/auth/getAiJWT`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Request-Id': crypto.randomUUID(),\n },\n body: JSON.stringify({\n eeLicense,\n userIdentifier,\n projectId,\n }),\n });\n\n if (!response.ok) {\n let errorData;\n let errorText;\n try {\n errorText = await response.text();\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { error: errorText || 'Failed to parse error response' };\n }\n\n strapi.log.error(`${ERROR_PREFIX} ${errorData?.error || 'Unknown error'}`, {\n status: response.status,\n statusText: response.statusText,\n error: errorData,\n errorText,\n projectId,\n });\n\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n let data;\n try {\n data = (await response.json()) as {\n jwt: string;\n expiresAt?: string;\n };\n } catch (parseError) {\n strapi.log.error(`${ERROR_PREFIX} Failed to parse AI server response`, parseError);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n if (!data.jwt) {\n strapi.log.error(`${ERROR_PREFIX} Invalid response: missing JWT token`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n strapi.log.info('AI token generated successfully', {\n userId: user.id,\n expiresAt: data.expiresAt,\n });\n\n // Cache the token if it has an expiration time\n if (data.expiresAt) {\n const expiresAtMs = new Date(data.expiresAt).getTime();\n aiTokenCache.set(cacheKey, {\n token: data.jwt,\n expiresAt: data.expiresAt,\n expiresAtMs,\n });\n }\n\n // Note: Token expires in 1 hour, client should handle refresh\n return {\n token: data.jwt,\n expiresAt: data.expiresAt,\n };\n } catch (fetchError) {\n if (fetchError instanceof Error && fetchError.name === 'AbortError') {\n strapi.log.error(`${ERROR_PREFIX} Request to AI server timed out`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n throw fetchError;\n }\n };\n\n const getAiUsage = async () => {\n const ERROR_PREFIX = 'AI usage data request failed:';\n\n const { eeLicense, projectId, aiServerUrl } = resolveAiContext(ERROR_PREFIX);\n\n strapi.log.http('Contacting AI Server for usage data');\n\n try {\n const response = await fetch(`${aiServerUrl}/cms/ai-data`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Request-Id': crypto.randomUUID(),\n },\n body: JSON.stringify({\n eeKey: eeLicense,\n projectId,\n }),\n });\n\n if (!response.ok) {\n let errorData;\n let errorText;\n try {\n errorText = await response.text();\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { error: errorText || 'Failed to parse error response' };\n }\n\n strapi.log.error(`${ERROR_PREFIX} ${errorData?.error || 'Unknown error'}`, {\n status: response.status,\n statusText: response.statusText,\n error: errorData,\n errorText,\n projectId,\n });\n\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n let data;\n try {\n data = (await response.json()) as {\n data: { cmsAiCreditsUsed: number };\n subscription: {\n subscriptionId: string;\n planPriceId: string;\n subscriptionStatus: string;\n isActiveSubscription: boolean;\n cmsAiEnabled: boolean;\n cmsAiCreditsBase: number;\n cmsAiCreditsMaxUsage: number;\n currentTermStart: string;\n currentTermEnd: string;\n };\n };\n } catch (parseError) {\n strapi.log.error(`${ERROR_PREFIX} Failed to parse AI server response`, parseError);\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n return {\n ...data.data,\n subscription: data.subscription,\n };\n } catch (fetchError) {\n if (fetchError instanceof Error && fetchError.name === 'AbortError') {\n strapi.log.error(`${ERROR_PREFIX} Request to AI server timed out`);\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n throw fetchError;\n }\n };\n\n return {\n /* Requires `ai.enabled=true` + license + no failed AI provider registration */\n isAvailable,\n /* `true` only when the license has the `cms-ai` entitlement to globally enable AI features.\n TODO: once all AI features are migrated to the providers architecture, consider removing this flag */\n isStrapiManagedAiEnabled,\n authorizeCustomProvider,\n /* Returns the status of each AI feature, flagging which are enabled. */\n getAiFeatureConfig,\n getAiToken,\n getAiUsage,\n };\n};\n\nexport { createAiAdminService };\n"],"names":["STRAPI_MANAGED_AI_LICENSE_FEATURE","CUSTOM_AI_PROVIDER_LICENSE_FEATURE","createAiAdminService","strapi","aiTokenCache","Map","isCustomProviderRejected","isConfigEnabled","config","get","isAvailable","ee","isEE","isStrapiManagedAiEnabled","features","isEnabled","authorizeCustomProvider","log","info","warn","isPluginAiFeatureConfigured","plugin","service","aiService","getAiFeatureConfig","isAiI18nConfigured","isAiMediaLibraryConfigured","Promise","all","resolveAiContext","errorPrefix","error","Error","replace","eeLicense","process","env","STRAPI_LICENSE","licensePath","path","join","dirs","app","root","fs","readFileSync","toString","projectId","aiServerUrl","STRAPI_AI_URL","getAiToken","ERROR_PREFIX","user","requestContext","state","userIdentifier","id","cacheKey","cachedToken","now","Date","bufferMs","expiresAtMs","token","expiresAt","delete","http","response","fetch","method","headers","crypto","randomUUID","body","JSON","stringify","ok","errorData","errorText","text","parse","status","statusText","data","json","parseError","jwt","userId","getTime","set","fetchError","name","getAiUsage","eeKey","subscription"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai.mjs","sources":["../../../../../../server/src/ai/services/ai.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport crypto from 'crypto';\nimport fs from 'fs';\nimport path from 'path';\nimport { AdminUser } from '../../../../shared/contracts/shared';\n\nconst STRAPI_MANAGED_AI_LICENSE_FEATURE = 'cms-ai';\nconst CUSTOM_AI_PROVIDER_LICENSE_FEATURE = 'cms-byok-ai';\n\nconst createAiAdminService = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * In-memory cache for AI tokens\n * Key format: `${projectId}:${userId}`\n */\n const aiTokenCache = new Map<\n string,\n {\n token: string;\n expiresAt?: string;\n expiresAtMs?: number;\n }\n >();\n\n let isCustomProviderRejected = false;\n\n const isConfigEnabled = (): boolean => strapi.config.get('admin.ai.enabled', true) === true;\n\n const isAvailable = (): boolean =>\n isConfigEnabled() && strapi.ee?.isEE === true && !isCustomProviderRejected;\n\n const isStrapiManagedAiEnabled = (): boolean =>\n isConfigEnabled() &&\n !isCustomProviderRejected &&\n strapi.ee?.features?.isEnabled(STRAPI_MANAGED_AI_LICENSE_FEATURE) === true;\n\n const authorizeCustomProvider = (): boolean => {\n if (!isConfigEnabled()) {\n strapi.log.info(\n 'A custom AI provider was ignored: AI is disabled by the \"admin.ai.enabled\" config.'\n );\n return false;\n }\n\n if (strapi.ee?.features?.isEnabled(CUSTOM_AI_PROVIDER_LICENSE_FEATURE) === true) {\n return true;\n }\n\n isCustomProviderRejected = true;\n strapi.log.warn(\n `A custom AI provider was rejected: the Strapi license does not include the \"${CUSTOM_AI_PROVIDER_LICENSE_FEATURE}\" feature. All AI features are disabled.`\n );\n return false;\n };\n\n const isPluginAiFeatureConfigured = async (plugin: string, service: string): Promise<boolean> => {\n const aiService = strapi.plugin(plugin)?.service(service) as\n { isEnabled?: () => Promise<boolean> | boolean } | undefined;\n\n if (typeof aiService?.isEnabled !== 'function') {\n return false;\n }\n\n return (await aiService.isEnabled()) === true;\n };\n\n const getAiFeatureConfig = async () => {\n if (!isAvailable()) {\n return {\n isAiI18nConfigured: false,\n isAiMediaLibraryConfigured: false,\n };\n }\n\n const [isAiI18nConfigured, isAiMediaLibraryConfigured] = await Promise.all([\n isPluginAiFeatureConfigured('i18n', 'ai-localizations'),\n isPluginAiFeatureConfigured('upload', 'aiMetadata'),\n ]);\n\n return { isAiI18nConfigured, isAiMediaLibraryConfigured };\n };\n\n /**\n * Resolves the shared context required by both getAiToken and getAiUsage:\n * EE license, project ID, and AI server URL.\n */\n const resolveAiContext = (errorPrefix: string) => {\n if (!isStrapiManagedAiEnabled()) {\n strapi.log.error(`${errorPrefix} AI is not enabled`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n if (!strapi.ee?.isEE) {\n strapi.log.error(`${errorPrefix} Enterprise Edition features are not enabled`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n let eeLicense = process.env.STRAPI_LICENSE;\n\n if (!eeLicense) {\n try {\n const licensePath = path.join(strapi.dirs.app.root, 'license.txt');\n eeLicense = fs.readFileSync(licensePath).toString();\n } catch {\n // License file doesn't exist or can't be read\n }\n }\n\n if (!eeLicense) {\n strapi.log.error(\n `${errorPrefix} No EE license found. Please ensure STRAPI_LICENSE environment variable is set or license.txt file exists.`\n );\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n const projectId = strapi.config.get('uuid');\n if (!projectId) {\n strapi.log.error(`${errorPrefix} Project ID not configured`);\n throw new Error(`${errorPrefix.replace(/:$/, '')}. Check server logs for details.`);\n }\n\n const aiServerUrl = process.env.STRAPI_AI_URL || 'https://strapi-ai.apps.strapi.io';\n\n return { eeLicense, projectId, aiServerUrl };\n };\n\n const getAiToken = async () => {\n const ERROR_PREFIX = 'AI token request failed:';\n\n const { eeLicense, projectId, aiServerUrl } = resolveAiContext(ERROR_PREFIX);\n\n // Get the current user\n const user = strapi.requestContext.get()?.state?.user as AdminUser | undefined;\n if (!user) {\n strapi.log.error(`${ERROR_PREFIX} No authenticated user in request context`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n // Create a secure user identifier using only user ID\n const userIdentifier = user.id.toString();\n\n // Check cache for existing valid token\n const cacheKey = `${projectId}:${userIdentifier}`;\n const cachedToken = aiTokenCache.get(cacheKey);\n\n if (cachedToken) {\n const now = Date.now();\n // Check if token is still valid (with buffer so it has time to be used)\n const bufferMs = 2 * 60 * 1000; // 2 minutes\n\n if (cachedToken.expiresAtMs && cachedToken.expiresAtMs - bufferMs > now) {\n strapi.log.info('Using cached AI token');\n\n return {\n token: cachedToken.token,\n expiresAt: cachedToken.expiresAt,\n };\n }\n\n // Token expired or will expire soon, remove from cache\n aiTokenCache.delete(cacheKey);\n }\n\n strapi.log.http('Contacting AI Server for token generation');\n\n try {\n const response = await fetch(`${aiServerUrl}/auth/getAiJWT`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Request-Id': crypto.randomUUID(),\n },\n body: JSON.stringify({\n eeLicense,\n userIdentifier,\n projectId,\n }),\n });\n\n if (!response.ok) {\n let errorData;\n let errorText;\n try {\n errorText = await response.text();\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { error: errorText || 'Failed to parse error response' };\n }\n\n strapi.log.error(`${ERROR_PREFIX} ${errorData?.error || 'Unknown error'}`, {\n status: response.status,\n statusText: response.statusText,\n error: errorData,\n errorText,\n projectId,\n });\n\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n let data;\n try {\n data = (await response.json()) as {\n jwt: string;\n expiresAt?: string;\n };\n } catch (parseError) {\n strapi.log.error(`${ERROR_PREFIX} Failed to parse AI server response`, parseError);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n if (!data.jwt) {\n strapi.log.error(`${ERROR_PREFIX} Invalid response: missing JWT token`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n strapi.log.info('AI token generated successfully', {\n userId: user.id,\n expiresAt: data.expiresAt,\n });\n\n // Cache the token if it has an expiration time\n if (data.expiresAt) {\n const expiresAtMs = new Date(data.expiresAt).getTime();\n aiTokenCache.set(cacheKey, {\n token: data.jwt,\n expiresAt: data.expiresAt,\n expiresAtMs,\n });\n }\n\n // Note: Token expires in 1 hour, client should handle refresh\n return {\n token: data.jwt,\n expiresAt: data.expiresAt,\n };\n } catch (fetchError) {\n if (fetchError instanceof Error && fetchError.name === 'AbortError') {\n strapi.log.error(`${ERROR_PREFIX} Request to AI server timed out`);\n throw new Error('AI token request failed. Check server logs for details.');\n }\n\n throw fetchError;\n }\n };\n\n const getAiUsage = async () => {\n const ERROR_PREFIX = 'AI usage data request failed:';\n\n const { eeLicense, projectId, aiServerUrl } = resolveAiContext(ERROR_PREFIX);\n\n strapi.log.http('Contacting AI Server for usage data');\n\n try {\n const response = await fetch(`${aiServerUrl}/cms/ai-data`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Request-Id': crypto.randomUUID(),\n },\n body: JSON.stringify({\n eeKey: eeLicense,\n projectId,\n }),\n });\n\n if (!response.ok) {\n let errorData;\n let errorText;\n try {\n errorText = await response.text();\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { error: errorText || 'Failed to parse error response' };\n }\n\n strapi.log.error(`${ERROR_PREFIX} ${errorData?.error || 'Unknown error'}`, {\n status: response.status,\n statusText: response.statusText,\n error: errorData,\n errorText,\n projectId,\n });\n\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n let data;\n try {\n data = (await response.json()) as {\n data: { cmsAiCreditsUsed: number };\n subscription: {\n subscriptionId: string;\n planPriceId: string;\n subscriptionStatus: string;\n isActiveSubscription: boolean;\n cmsAiEnabled: boolean;\n cmsAiCreditsBase: number;\n cmsAiCreditsMaxUsage: number;\n currentTermStart: string;\n currentTermEnd: string;\n };\n };\n } catch (parseError) {\n strapi.log.error(`${ERROR_PREFIX} Failed to parse AI server response`, parseError);\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n return {\n ...data.data,\n subscription: data.subscription,\n };\n } catch (fetchError) {\n if (fetchError instanceof Error && fetchError.name === 'AbortError') {\n strapi.log.error(`${ERROR_PREFIX} Request to AI server timed out`);\n throw new Error('AI usage data request failed. Check server logs for details.');\n }\n\n throw fetchError;\n }\n };\n\n return {\n /* Requires `ai.enabled=true` + license + no failed AI provider registration */\n isAvailable,\n /* `true` only when the license has the `cms-ai` entitlement to globally enable AI features.\n TODO: once all AI features are migrated to the providers architecture, consider removing this flag */\n isStrapiManagedAiEnabled,\n authorizeCustomProvider,\n /* Returns the status of each AI feature, flagging which are enabled. */\n getAiFeatureConfig,\n getAiToken,\n getAiUsage,\n };\n};\n\nexport { createAiAdminService };\n"],"names":["STRAPI_MANAGED_AI_LICENSE_FEATURE","CUSTOM_AI_PROVIDER_LICENSE_FEATURE","createAiAdminService","strapi","aiTokenCache","Map","isCustomProviderRejected","isConfigEnabled","config","get","isAvailable","ee","isEE","isStrapiManagedAiEnabled","features","isEnabled","authorizeCustomProvider","log","info","warn","isPluginAiFeatureConfigured","plugin","service","aiService","getAiFeatureConfig","isAiI18nConfigured","isAiMediaLibraryConfigured","Promise","all","resolveAiContext","errorPrefix","error","Error","replace","eeLicense","process","env","STRAPI_LICENSE","licensePath","path","join","dirs","app","root","fs","readFileSync","toString","projectId","aiServerUrl","STRAPI_AI_URL","getAiToken","ERROR_PREFIX","user","requestContext","state","userIdentifier","id","cacheKey","cachedToken","now","Date","bufferMs","expiresAtMs","token","expiresAt","delete","http","response","fetch","method","headers","crypto","randomUUID","body","JSON","stringify","ok","errorData","errorText","text","parse","status","statusText","data","json","parseError","jwt","userId","getTime","set","fetchError","name","getAiUsage","eeKey","subscription"],"mappings":"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"}
|