@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
|
@@ -2,20 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
const CSV_LINE_SEPARATOR = '\r\n';
|
|
4
4
|
const CSV_BOM = '\uFEFF';
|
|
5
|
-
const FORMULA_TRIGGER_CHARACTERS = [
|
|
5
|
+
const FORMULA_TRIGGER_CHARACTERS = new Set([
|
|
6
6
|
'=',
|
|
7
7
|
'+',
|
|
8
8
|
'-',
|
|
9
9
|
'@',
|
|
10
10
|
'\t',
|
|
11
11
|
'\r'
|
|
12
|
-
];
|
|
12
|
+
]);
|
|
13
13
|
const escapeCsvValue = (value)=>{
|
|
14
14
|
if (value === null || value === undefined) {
|
|
15
15
|
return '';
|
|
16
16
|
}
|
|
17
17
|
let stringValue = typeof value === 'string' ? value : String(value);
|
|
18
|
-
if (typeof value === 'string' && FORMULA_TRIGGER_CHARACTERS.
|
|
18
|
+
if (typeof value === 'string' && FORMULA_TRIGGER_CHARACTERS.has(stringValue.charAt(0))) {
|
|
19
19
|
stringValue = `'${stringValue}`;
|
|
20
20
|
}
|
|
21
21
|
if (/[",\r\n]/.test(stringValue)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csv.js","sources":["../../../../../../../ee/server/src/audit-logs/utils/csv.ts"],"sourcesContent":["const CSV_LINE_SEPARATOR = '\\r\\n';\nconst CSV_BOM = '\\uFEFF';\nconst FORMULA_TRIGGER_CHARACTERS = ['=', '+', '-', '@', '\\t', '\\r'];\n\nconst escapeCsvValue = (value: unknown): string => {\n if (value === null || value === undefined) {\n return '';\n }\n\n let stringValue = typeof value === 'string' ? value : String(value);\n\n if (typeof value === 'string' && FORMULA_TRIGGER_CHARACTERS.
|
|
1
|
+
{"version":3,"file":"csv.js","sources":["../../../../../../../ee/server/src/audit-logs/utils/csv.ts"],"sourcesContent":["const CSV_LINE_SEPARATOR = '\\r\\n';\nconst CSV_BOM = '\\uFEFF';\nconst FORMULA_TRIGGER_CHARACTERS = new Set(['=', '+', '-', '@', '\\t', '\\r']);\n\nconst escapeCsvValue = (value: unknown): string => {\n if (value === null || value === undefined) {\n return '';\n }\n\n let stringValue = typeof value === 'string' ? value : String(value);\n\n if (typeof value === 'string' && FORMULA_TRIGGER_CHARACTERS.has(stringValue.charAt(0))) {\n stringValue = `'${stringValue}`;\n }\n\n if (/[\",\\r\\n]/.test(stringValue)) {\n return `\"${stringValue.replace(/\"/g, '\"\"')}\"`;\n }\n\n return stringValue;\n};\n\nconst serializeCsvLine = (values: unknown[]): string => {\n return values.map(escapeCsvValue).join(',') + CSV_LINE_SEPARATOR;\n};\n\nexport { escapeCsvValue, serializeCsvLine, CSV_BOM };\n"],"names":["CSV_LINE_SEPARATOR","CSV_BOM","FORMULA_TRIGGER_CHARACTERS","Set","escapeCsvValue","value","undefined","stringValue","String","has","charAt","test","replace","serializeCsvLine","values","map","join"],"mappings":";;AAAA,MAAMA,kBAAAA,GAAqB,MAAA;AAC3B,MAAMC,OAAAA,GAAU;AAChB,MAAMC,0BAAAA,GAA6B,IAAIC,GAAAA,CAAI;AAAC,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA,IAAA;AAAM,IAAA;AAAK,CAAA,CAAA;AAE3E,MAAMC,iBAAiB,CAACC,KAAAA,GAAAA;IACtB,IAAIA,KAAAA,KAAU,IAAA,IAAQA,KAAAA,KAAUC,SAAAA,EAAW;QACzC,OAAO,EAAA;AACT,IAAA;AAEA,IAAA,IAAIC,WAAAA,GAAc,OAAOF,KAAAA,KAAU,QAAA,GAAWA,QAAQG,MAAAA,CAAOH,KAAAA,CAAAA;IAE7D,IAAI,OAAOA,UAAU,QAAA,IAAYH,0BAAAA,CAA2BO,GAAG,CAACF,WAAAA,CAAYG,MAAM,CAAC,CAAA,CAAA,CAAA,EAAK;QACtFH,WAAAA,GAAc,CAAC,CAAC,EAAEA,WAAAA,CAAAA,CAAa;AACjC,IAAA;IAEA,IAAI,UAAA,CAAWI,IAAI,CAACJ,WAAAA,CAAAA,EAAc;QAChC,OAAO,CAAC,CAAC,EAAEA,WAAAA,CAAYK,OAAO,CAAC,IAAA,EAAM,IAAA,CAAA,CAAM,CAAC,CAAC;AAC/C,IAAA;IAEA,OAAOL,WAAAA;AACT;AAEA,MAAMM,mBAAmB,CAACC,MAAAA,GAAAA;AACxB,IAAA,OAAOA,OAAOC,GAAG,CAACX,cAAAA,CAAAA,CAAgBY,IAAI,CAAC,GAAA,CAAA,GAAOhB,kBAAAA;AAChD;;;;;;"}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
const CSV_LINE_SEPARATOR = '\r\n';
|
|
2
2
|
const CSV_BOM = '\uFEFF';
|
|
3
|
-
const FORMULA_TRIGGER_CHARACTERS = [
|
|
3
|
+
const FORMULA_TRIGGER_CHARACTERS = new Set([
|
|
4
4
|
'=',
|
|
5
5
|
'+',
|
|
6
6
|
'-',
|
|
7
7
|
'@',
|
|
8
8
|
'\t',
|
|
9
9
|
'\r'
|
|
10
|
-
];
|
|
10
|
+
]);
|
|
11
11
|
const escapeCsvValue = (value)=>{
|
|
12
12
|
if (value === null || value === undefined) {
|
|
13
13
|
return '';
|
|
14
14
|
}
|
|
15
15
|
let stringValue = typeof value === 'string' ? value : String(value);
|
|
16
|
-
if (typeof value === 'string' && FORMULA_TRIGGER_CHARACTERS.
|
|
16
|
+
if (typeof value === 'string' && FORMULA_TRIGGER_CHARACTERS.has(stringValue.charAt(0))) {
|
|
17
17
|
stringValue = `'${stringValue}`;
|
|
18
18
|
}
|
|
19
19
|
if (/[",\r\n]/.test(stringValue)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csv.mjs","sources":["../../../../../../../ee/server/src/audit-logs/utils/csv.ts"],"sourcesContent":["const CSV_LINE_SEPARATOR = '\\r\\n';\nconst CSV_BOM = '\\uFEFF';\nconst FORMULA_TRIGGER_CHARACTERS = ['=', '+', '-', '@', '\\t', '\\r'];\n\nconst escapeCsvValue = (value: unknown): string => {\n if (value === null || value === undefined) {\n return '';\n }\n\n let stringValue = typeof value === 'string' ? value : String(value);\n\n if (typeof value === 'string' && FORMULA_TRIGGER_CHARACTERS.
|
|
1
|
+
{"version":3,"file":"csv.mjs","sources":["../../../../../../../ee/server/src/audit-logs/utils/csv.ts"],"sourcesContent":["const CSV_LINE_SEPARATOR = '\\r\\n';\nconst CSV_BOM = '\\uFEFF';\nconst FORMULA_TRIGGER_CHARACTERS = new Set(['=', '+', '-', '@', '\\t', '\\r']);\n\nconst escapeCsvValue = (value: unknown): string => {\n if (value === null || value === undefined) {\n return '';\n }\n\n let stringValue = typeof value === 'string' ? value : String(value);\n\n if (typeof value === 'string' && FORMULA_TRIGGER_CHARACTERS.has(stringValue.charAt(0))) {\n stringValue = `'${stringValue}`;\n }\n\n if (/[\",\\r\\n]/.test(stringValue)) {\n return `\"${stringValue.replace(/\"/g, '\"\"')}\"`;\n }\n\n return stringValue;\n};\n\nconst serializeCsvLine = (values: unknown[]): string => {\n return values.map(escapeCsvValue).join(',') + CSV_LINE_SEPARATOR;\n};\n\nexport { escapeCsvValue, serializeCsvLine, CSV_BOM };\n"],"names":["CSV_LINE_SEPARATOR","CSV_BOM","FORMULA_TRIGGER_CHARACTERS","Set","escapeCsvValue","value","undefined","stringValue","String","has","charAt","test","replace","serializeCsvLine","values","map","join"],"mappings":"AAAA,MAAMA,kBAAAA,GAAqB,MAAA;AAC3B,MAAMC,OAAAA,GAAU;AAChB,MAAMC,0BAAAA,GAA6B,IAAIC,GAAAA,CAAI;AAAC,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA,IAAA;AAAM,IAAA;AAAK,CAAA,CAAA;AAE3E,MAAMC,iBAAiB,CAACC,KAAAA,GAAAA;IACtB,IAAIA,KAAAA,KAAU,IAAA,IAAQA,KAAAA,KAAUC,SAAAA,EAAW;QACzC,OAAO,EAAA;AACT,IAAA;AAEA,IAAA,IAAIC,WAAAA,GAAc,OAAOF,KAAAA,KAAU,QAAA,GAAWA,QAAQG,MAAAA,CAAOH,KAAAA,CAAAA;IAE7D,IAAI,OAAOA,UAAU,QAAA,IAAYH,0BAAAA,CAA2BO,GAAG,CAACF,WAAAA,CAAYG,MAAM,CAAC,CAAA,CAAA,CAAA,EAAK;QACtFH,WAAAA,GAAc,CAAC,CAAC,EAAEA,WAAAA,CAAAA,CAAa;AACjC,IAAA;IAEA,IAAI,UAAA,CAAWI,IAAI,CAACJ,WAAAA,CAAAA,EAAc;QAChC,OAAO,CAAC,CAAC,EAAEA,WAAAA,CAAYK,OAAO,CAAC,IAAA,EAAM,IAAA,CAAA,CAAM,CAAC,CAAC;AAC/C,IAAA;IAEA,OAAOL,WAAAA;AACT;AAEA,MAAMM,mBAAmB,CAACC,MAAAA,GAAAA;AACxB,IAAA,OAAOA,OAAOC,GAAG,CAACX,cAAAA,CAAAA,CAAgBY,IAAI,CAAC,GAAA,CAAA,GAAOhB,kBAAAA;AAChD;;;;"}
|
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
var utils = require('@strapi/utils');
|
|
4
4
|
var index = require('../utils/index.js');
|
|
5
5
|
|
|
6
|
+
const findRetainedFeature = (retainedFeatures, featureName)=>retainedFeatures?.map((entry)=>typeof entry === 'string' ? {
|
|
7
|
+
name: entry
|
|
8
|
+
} : entry).find((entry)=>entry.name === featureName);
|
|
6
9
|
var admin = {
|
|
7
10
|
// NOTE: Overrides CE admin controller
|
|
8
11
|
async getProjectType () {
|
|
@@ -38,6 +41,14 @@ var admin = {
|
|
|
38
41
|
},
|
|
39
42
|
async licenseLimitInformation () {
|
|
40
43
|
const permittedSeats = strapi.ee.seats;
|
|
44
|
+
// Display-only fallback so an expired/unknown license can still show its plan, seats
|
|
45
|
+
// and subscription. Never used for enforcement (permittedSeats above is untouched).
|
|
46
|
+
const retained = strapi.ee.retainedLicense;
|
|
47
|
+
const isActiveLicense = strapi.ee.licenseStatus === 'active';
|
|
48
|
+
const activeEntitlements = strapi.ee.entitlements.list();
|
|
49
|
+
// A lapsed license resolves through the same resolvers against its retained snapshot, so the
|
|
50
|
+
// card shows the defaulted, clamped limits the plan enforced rather than raw options.
|
|
51
|
+
const retainedEntitlements = isActiveLicense ? [] : strapi.ee.entitlements.listRetained();
|
|
41
52
|
let shouldNotify = false;
|
|
42
53
|
let licenseLimitStatus = null;
|
|
43
54
|
let enforcementUserCount;
|
|
@@ -56,17 +67,79 @@ var admin = {
|
|
|
56
67
|
shouldNotify = true;
|
|
57
68
|
licenseLimitStatus = 'AT_LIMIT';
|
|
58
69
|
}
|
|
70
|
+
const eeInformation = await strapi.db.query('strapi::core-store').findOne({
|
|
71
|
+
where: {
|
|
72
|
+
key: 'ee_information'
|
|
73
|
+
}
|
|
74
|
+
}).then((row)=>row ? JSON.parse(row.value) : null).catch(()=>null);
|
|
75
|
+
// disable() wipes the live type on expiry but keeps it on the retained snapshot, so resolve
|
|
76
|
+
// it once here: an expired offline gold license must still report `offline` (and show its
|
|
77
|
+
// real expiry) rather than the online check-in line.
|
|
78
|
+
const licenseType = strapi.ee.type ?? retained?.type ?? null;
|
|
79
|
+
const licenseMode = licenseType === 'gold' && process.env.STRAPI_DISABLE_LICENSE_PING?.toLowerCase() === 'true' ? 'offline' : 'online';
|
|
80
|
+
// Registry re-check cron cadence ('0 0 */12 * * *', shifted to the startup time -> every 12h).
|
|
81
|
+
const REGISTRY_CHECK_INTERVAL_MS = 12 * 60 * 60 * 1000;
|
|
82
|
+
const lastRegistrySyncAt = eeInformation?.lastCheckAt ?? null;
|
|
83
|
+
let nextRegistrySyncAt = null;
|
|
84
|
+
if (licenseMode === 'online' && typeof lastRegistrySyncAt === 'number') {
|
|
85
|
+
// Step forward from the last check-in in 12h increments until we land in the
|
|
86
|
+
// future, so a stale last check-in never reports a "next check-in" in the past.
|
|
87
|
+
const now = Date.now();
|
|
88
|
+
let next = lastRegistrySyncAt + REGISTRY_CHECK_INTERVAL_MS;
|
|
89
|
+
while(next <= now){
|
|
90
|
+
next += REGISTRY_CHECK_INTERVAL_MS;
|
|
91
|
+
}
|
|
92
|
+
nextRegistrySyncAt = next;
|
|
93
|
+
}
|
|
94
|
+
// An offline instance never contacts the registry, so an error (and the cached license that
|
|
95
|
+
// came with it) stored by an earlier online run says nothing about its current state.
|
|
96
|
+
const registryState = licenseMode === 'online' ? eeInformation : null;
|
|
59
97
|
const data = {
|
|
60
98
|
enforcementUserCount,
|
|
61
99
|
currentActiveUserCount,
|
|
62
|
-
|
|
100
|
+
// Typed `number` in the published contract; null at runtime without a seat limit
|
|
101
|
+
permittedSeats: permittedSeats ?? null,
|
|
102
|
+
seats: strapi.ee.seats ?? retained?.seats ?? null,
|
|
103
|
+
subscriptionId: strapi.ee.subscriptionId ?? retained?.subscriptionId ?? null,
|
|
104
|
+
expireAt: strapi.ee.expireAt ?? retained?.expireAt ?? null,
|
|
105
|
+
licenseStatus: strapi.ee.licenseStatus,
|
|
106
|
+
planPriceId: strapi.ee.planPriceId ?? retained?.planPriceId ?? null,
|
|
107
|
+
renewalDate: strapi.ee.renewalDate,
|
|
108
|
+
planEntitlements: strapi.ee.planFeatureCatalog.map((feature)=>{
|
|
109
|
+
if (isActiveLicense) {
|
|
110
|
+
// Every resolver runs for an active license and falls back to its default for a
|
|
111
|
+
// missing feature, so only an included feature keeps its limits.
|
|
112
|
+
const available = strapi.ee.features.isEnabled(feature);
|
|
113
|
+
return {
|
|
114
|
+
feature,
|
|
115
|
+
available,
|
|
116
|
+
limits: available ? activeEntitlements.find((entry)=>entry.feature === feature)?.limits ?? [] : []
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const retainedFeature = findRetainedFeature(retained?.features, feature);
|
|
120
|
+
return {
|
|
121
|
+
feature,
|
|
122
|
+
available: Boolean(retainedFeature),
|
|
123
|
+
limits: retainedFeature ? retainedEntitlements.find((entry)=>entry.feature === feature)?.limits ?? [] : []
|
|
124
|
+
};
|
|
125
|
+
}),
|
|
126
|
+
licenseMode,
|
|
127
|
+
lastRegistrySyncAt,
|
|
128
|
+
nextRegistrySyncAt,
|
|
129
|
+
usingCachedLicense: Boolean(registryState?.error && registryState?.license),
|
|
130
|
+
registrySyncError: registryState?.error ?? null,
|
|
131
|
+
registrySyncErrorKind: registryState?.errorKind ?? null,
|
|
63
132
|
shouldNotify,
|
|
64
133
|
shouldStopCreate: permittedSeats == null ? false : currentActiveUserCount >= permittedSeats,
|
|
65
134
|
licenseLimitStatus,
|
|
66
135
|
isHostedOnStrapiCloud: utils.env('STRAPI_HOSTING', null) === 'strapi.cloud',
|
|
67
|
-
|
|
136
|
+
// Typed `string` in the published contract; null at runtime without a license
|
|
137
|
+
type: licenseType,
|
|
68
138
|
isTrial: strapi.ee.isTrial,
|
|
69
|
-
|
|
139
|
+
// `features.list()` is loosely typed at the source (`{ name: string; [k]: any }[]`);
|
|
140
|
+
// narrow it to the contract's named-feature union so consumers (e.g. useLicenseLimits) keep their types.
|
|
141
|
+
features: strapi.ee.features.list() ?? [],
|
|
142
|
+
entitlements: strapi.ee.entitlements.list()
|
|
70
143
|
};
|
|
71
144
|
return {
|
|
72
145
|
data
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.js","sources":["../../../../../../ee/server/src/controllers/admin.ts"],"sourcesContent":["import { env } from '@strapi/utils';\n\nimport { getService } from '../utils';\n\nimport type { GetProjectType } from '../../../../shared/contracts/admin';\n\nexport default {\n // NOTE: Overrides CE admin controller\n async getProjectType(): Promise<GetProjectType.Response> {\n const flags = strapi.config.get('admin.flags', {});\n\n try {\n return {\n data: {\n // The license fields are nullable internally; the contract is not.\n isEE: Boolean(strapi.EE),\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list(),\n flags,\n type: strapi.ee.type ?? undefined,\n planPriceId: strapi.ee.planPriceId ?? undefined,\n ai: {\n enabled: strapi.ai.admin.isStrapiManagedAiEnabled(),\n },\n },\n };\n } catch {\n return { data: { isEE: false, isTrial: false, features: [], flags, ai: { enabled: false } } };\n }\n },\n\n async licenseLimitInformation() {\n const permittedSeats = strapi.ee.seats;\n\n let shouldNotify = false;\n let licenseLimitStatus = null;\n let enforcementUserCount;\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const eeDisabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (eeDisabledUsers) {\n enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;\n } else {\n enforcementUserCount = currentActiveUserCount;\n }\n\n if (permittedSeats != null && enforcementUserCount > permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'OVER_LIMIT';\n }\n\n if (permittedSeats != null && enforcementUserCount === permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'AT_LIMIT';\n }\n\n const data = {\n enforcementUserCount,\n currentActiveUserCount,\n permittedSeats,\n shouldNotify,\n shouldStopCreate: permittedSeats == null ? false : currentActiveUserCount >= permittedSeats,\n licenseLimitStatus,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n type: strapi.ee.type,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list() ?? [],\n };\n\n return { data };\n },\n};\n"],"names":["getProjectType","flags","strapi","config","get","data","isEE","Boolean","EE","isTrial","ee","features","list","type","undefined","planPriceId","ai","enabled","admin","isStrapiManagedAiEnabled","licenseLimitInformation","permittedSeats","seats","shouldNotify","licenseLimitStatus","enforcementUserCount","currentActiveUserCount","getService","getCurrentActiveUserCount","eeDisabledUsers","getDisabledUserList","length","shouldStopCreate","isHostedOnStrapiCloud","env"],"mappings":";;;;;AAMA,YAAe;;IAEb,MAAMA,cAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAMC,QAAQC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,eAAe,EAAC,CAAA;QAEhD,IAAI;YACF,OAAO;gBACLC,IAAAA,EAAM;;oBAEJC,IAAAA,EAAMC,OAAAA,CAAQL,OAAOM,EAAE,CAAA;oBACvBC,OAAAA,EAASP,MAAAA,CAAOQ,EAAE,CAACD,OAAO;AAC1BE,oBAAAA,QAAAA,EAAUT,MAAAA,CAAOQ,EAAE,CAACC,QAAQ,CAACC,IAAI,EAAA;AACjCX,oBAAAA,KAAAA;AACAY,oBAAAA,IAAAA,EAAMX,MAAAA,CAAOQ,EAAE,CAACG,IAAI,IAAIC,SAAAA;AACxBC,oBAAAA,WAAAA,EAAab,MAAAA,CAAOQ,EAAE,CAACK,WAAW,IAAID,SAAAA;oBACtCE,EAAAA,EAAI;AACFC,wBAAAA,OAAAA,EAASf,MAAAA,CAAOc,EAAE,CAACE,KAAK,CAACC,wBAAwB;AACnD;AACF;AACF,aAAA;AACF,QAAA,CAAA,CAAE,OAAM;YACN,OAAO;gBAAEd,IAAAA,EAAM;oBAAEC,IAAAA,EAAM,KAAA;oBAAOG,OAAAA,EAAS,KAAA;AAAOE,oBAAAA,QAAAA,EAAU,EAAE;AAAEV,oBAAAA,KAAAA;oBAAOe,EAAAA,EAAI;wBAAEC,OAAAA,EAAS;AAAM;AAAE;AAAE,aAAA;AAC9F,QAAA;AACF,IAAA,CAAA;IAEA,MAAMG,uBAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAMC,cAAAA,GAAiBnB,MAAAA,CAAOQ,EAAE,CAACY,KAAK;AAEtC,QAAA,IAAIC,YAAAA,GAAe,KAAA;AACnB,QAAA,IAAIC,kBAAAA,GAAqB,IAAA;QACzB,IAAIC,oBAAAA;AAEJ,QAAA,MAAMC,sBAAAA,GAAyB,MAAMC,gBAAAA,CAAW,MAAA,CAAA,CAAQC,yBAAyB,EAAA;AAEjF,QAAA,MAAMC,eAAAA,GAAkB,MAAMF,gBAAAA,CAAW,kBAAA,CAAA,CAAoBG,mBAAmB,EAAA;AAEhF,QAAA,IAAID,eAAAA,EAAiB;YACnBJ,oBAAAA,GAAuBC,sBAAAA,GAAyBG,gBAAgBE,MAAM;QACxE,CAAA,MAAO;YACLN,oBAAAA,GAAuBC,sBAAAA;AACzB,QAAA;QAEA,IAAIL,cAAAA,IAAkB,IAAA,IAAQI,oBAAAA,GAAuBJ,cAAAA,EAAgB;YACnEE,YAAAA,GAAe,IAAA;YACfC,kBAAAA,GAAqB,YAAA;AACvB,QAAA;QAEA,IAAIH,cAAAA,IAAkB,IAAA,IAAQI,oBAAAA,KAAyBJ,cAAAA,EAAgB;YACrEE,YAAAA,GAAe,IAAA;YACfC,kBAAAA,GAAqB,UAAA;AACvB,QAAA;AAEA,QAAA,MAAMnB,IAAAA,GAAO;AACXoB,YAAAA,oBAAAA;AACAC,YAAAA,sBAAAA;AACAL,YAAAA,cAAAA;AACAE,YAAAA,YAAAA;YACAS,gBAAAA,EAAkBX,cAAAA,IAAkB,IAAA,GAAO,KAAA,GAAQK,sBAAAA,IAA0BL,cAAAA;AAC7EG,YAAAA,kBAAAA;YACAS,qBAAAA,EAAuBC,SAAAA,CAAI,kBAAkB,IAAA,CAAA,KAAU,cAAA;YACvDrB,IAAAA,EAAMX,MAAAA,CAAOQ,EAAE,CAACG,IAAI;YACpBJ,OAAAA,EAASP,MAAAA,CAAOQ,EAAE,CAACD,OAAO;AAC1BE,YAAAA,QAAAA,EAAUT,OAAOQ,EAAE,CAACC,QAAQ,CAACC,IAAI,MAAM;AACzC,SAAA;QAEA,OAAO;AAAEP,YAAAA;AAAK,SAAA;AAChB,IAAA;AACF,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"admin.js","sources":["../../../../../../ee/server/src/controllers/admin.ts"],"sourcesContent":["import { env } from '@strapi/utils';\n\nimport type {\n GetLicenseLimitInformation,\n GetProjectType,\n} from '../../../../shared/contracts/admin';\nimport { getService } from '../utils';\n\ntype RetainedFeature = { name: string; [key: string]: any };\n\nconst findRetainedFeature = (\n retainedFeatures: Array<RetainedFeature | string> | undefined,\n featureName: string\n): RetainedFeature | undefined =>\n retainedFeatures\n ?.map((entry) => (typeof entry === 'string' ? { name: entry } : entry))\n .find((entry) => entry.name === featureName);\n\nexport default {\n // NOTE: Overrides CE admin controller\n async getProjectType(): Promise<GetProjectType.Response> {\n const flags = strapi.config.get('admin.flags', {});\n\n try {\n return {\n data: {\n // The license fields are nullable internally; the contract is not.\n isEE: Boolean(strapi.EE),\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list(),\n flags,\n type: strapi.ee.type ?? undefined,\n planPriceId: strapi.ee.planPriceId ?? undefined,\n ai: {\n enabled: strapi.ai.admin.isStrapiManagedAiEnabled(),\n },\n },\n };\n } catch {\n return { data: { isEE: false, isTrial: false, features: [], flags, ai: { enabled: false } } };\n }\n },\n\n async licenseLimitInformation() {\n const permittedSeats = strapi.ee.seats;\n // Display-only fallback so an expired/unknown license can still show its plan, seats\n // and subscription. Never used for enforcement (permittedSeats above is untouched).\n const retained = strapi.ee.retainedLicense;\n const isActiveLicense = strapi.ee.licenseStatus === 'active';\n const activeEntitlements = strapi.ee.entitlements.list();\n // A lapsed license resolves through the same resolvers against its retained snapshot, so the\n // card shows the defaulted, clamped limits the plan enforced rather than raw options.\n const retainedEntitlements = isActiveLicense ? [] : strapi.ee.entitlements.listRetained();\n\n let shouldNotify = false;\n let licenseLimitStatus = null;\n let enforcementUserCount;\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const eeDisabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (eeDisabledUsers) {\n enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;\n } else {\n enforcementUserCount = currentActiveUserCount;\n }\n\n if (permittedSeats != null && enforcementUserCount > permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'OVER_LIMIT';\n }\n\n if (permittedSeats != null && enforcementUserCount === permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'AT_LIMIT';\n }\n\n const eeInformation = await strapi.db\n .query('strapi::core-store')\n .findOne({ where: { key: 'ee_information' } })\n .then((row: { value: string } | null) =>\n row\n ? (JSON.parse(row.value) as {\n license?: string | null;\n error?: string;\n errorKind?: 'unreachable' | 'rejected';\n lastCheckAt?: number;\n })\n : null\n )\n .catch(() => null);\n\n // disable() wipes the live type on expiry but keeps it on the retained snapshot, so resolve\n // it once here: an expired offline gold license must still report `offline` (and show its\n // real expiry) rather than the online check-in line.\n const licenseType = strapi.ee.type ?? retained?.type ?? null;\n const licenseMode: 'online' | 'offline' =\n licenseType === 'gold' && process.env.STRAPI_DISABLE_LICENSE_PING?.toLowerCase() === 'true'\n ? 'offline'\n : 'online';\n\n // Registry re-check cron cadence ('0 0 */12 * * *', shifted to the startup time -> every 12h).\n const REGISTRY_CHECK_INTERVAL_MS = 12 * 60 * 60 * 1000;\n const lastRegistrySyncAt: number | null = eeInformation?.lastCheckAt ?? null;\n let nextRegistrySyncAt: number | null = null;\n if (licenseMode === 'online' && typeof lastRegistrySyncAt === 'number') {\n // Step forward from the last check-in in 12h increments until we land in the\n // future, so a stale last check-in never reports a \"next check-in\" in the past.\n const now = Date.now();\n let next = lastRegistrySyncAt + REGISTRY_CHECK_INTERVAL_MS;\n while (next <= now) {\n next += REGISTRY_CHECK_INTERVAL_MS;\n }\n nextRegistrySyncAt = next;\n }\n\n // An offline instance never contacts the registry, so an error (and the cached license that\n // came with it) stored by an earlier online run says nothing about its current state.\n const registryState = licenseMode === 'online' ? eeInformation : null;\n\n const data: GetLicenseLimitInformation.Response['data'] = {\n enforcementUserCount,\n currentActiveUserCount,\n // Typed `number` in the published contract; null at runtime without a seat limit\n permittedSeats: (permittedSeats ?? null) as number,\n seats: strapi.ee.seats ?? retained?.seats ?? null,\n subscriptionId: strapi.ee.subscriptionId ?? retained?.subscriptionId ?? null,\n expireAt: strapi.ee.expireAt ?? retained?.expireAt ?? null,\n licenseStatus: strapi.ee.licenseStatus,\n planPriceId: strapi.ee.planPriceId ?? retained?.planPriceId ?? null,\n renewalDate: strapi.ee.renewalDate,\n planEntitlements: strapi.ee.planFeatureCatalog.map((feature) => {\n if (isActiveLicense) {\n // Every resolver runs for an active license and falls back to its default for a\n // missing feature, so only an included feature keeps its limits.\n const available = strapi.ee.features.isEnabled(feature);\n return {\n feature,\n available,\n limits: available\n ? (activeEntitlements.find((entry) => entry.feature === feature)?.limits ?? [])\n : [],\n };\n }\n\n const retainedFeature = findRetainedFeature(retained?.features, feature);\n\n return {\n feature,\n available: Boolean(retainedFeature),\n limits: retainedFeature\n ? (retainedEntitlements.find((entry) => entry.feature === feature)?.limits ?? [])\n : [],\n };\n }),\n licenseMode,\n lastRegistrySyncAt,\n nextRegistrySyncAt,\n usingCachedLicense: Boolean(registryState?.error && registryState?.license),\n registrySyncError: registryState?.error ?? null,\n registrySyncErrorKind: registryState?.errorKind ?? null,\n shouldNotify,\n shouldStopCreate: permittedSeats == null ? false : currentActiveUserCount >= permittedSeats,\n licenseLimitStatus,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n // Typed `string` in the published contract; null at runtime without a license\n type: licenseType as string,\n isTrial: strapi.ee.isTrial,\n // `features.list()` is loosely typed at the source (`{ name: string; [k]: any }[]`);\n // narrow it to the contract's named-feature union so consumers (e.g. useLicenseLimits) keep their types.\n features: (strapi.ee.features.list() ??\n []) as GetLicenseLimitInformation.Response['data']['features'],\n entitlements: strapi.ee.entitlements.list(),\n };\n\n return { data } satisfies GetLicenseLimitInformation.Response;\n },\n};\n"],"names":["findRetainedFeature","retainedFeatures","featureName","map","entry","name","find","getProjectType","flags","strapi","config","get","data","isEE","Boolean","EE","isTrial","ee","features","list","type","undefined","planPriceId","ai","enabled","admin","isStrapiManagedAiEnabled","licenseLimitInformation","permittedSeats","seats","retained","retainedLicense","isActiveLicense","licenseStatus","activeEntitlements","entitlements","retainedEntitlements","listRetained","shouldNotify","licenseLimitStatus","enforcementUserCount","currentActiveUserCount","getService","getCurrentActiveUserCount","eeDisabledUsers","getDisabledUserList","length","eeInformation","db","query","findOne","where","key","then","row","JSON","parse","value","catch","licenseType","licenseMode","process","env","STRAPI_DISABLE_LICENSE_PING","toLowerCase","REGISTRY_CHECK_INTERVAL_MS","lastRegistrySyncAt","lastCheckAt","nextRegistrySyncAt","now","Date","next","registryState","subscriptionId","expireAt","renewalDate","planEntitlements","planFeatureCatalog","feature","available","isEnabled","limits","retainedFeature","usingCachedLicense","error","license","registrySyncError","registrySyncErrorKind","errorKind","shouldStopCreate","isHostedOnStrapiCloud"],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { env } from '@strapi/utils';
|
|
2
2
|
import { getService } from '../utils/index.mjs';
|
|
3
3
|
|
|
4
|
+
const findRetainedFeature = (retainedFeatures, featureName)=>retainedFeatures?.map((entry)=>typeof entry === 'string' ? {
|
|
5
|
+
name: entry
|
|
6
|
+
} : entry).find((entry)=>entry.name === featureName);
|
|
4
7
|
var admin = {
|
|
5
8
|
// NOTE: Overrides CE admin controller
|
|
6
9
|
async getProjectType () {
|
|
@@ -36,6 +39,14 @@ var admin = {
|
|
|
36
39
|
},
|
|
37
40
|
async licenseLimitInformation () {
|
|
38
41
|
const permittedSeats = strapi.ee.seats;
|
|
42
|
+
// Display-only fallback so an expired/unknown license can still show its plan, seats
|
|
43
|
+
// and subscription. Never used for enforcement (permittedSeats above is untouched).
|
|
44
|
+
const retained = strapi.ee.retainedLicense;
|
|
45
|
+
const isActiveLicense = strapi.ee.licenseStatus === 'active';
|
|
46
|
+
const activeEntitlements = strapi.ee.entitlements.list();
|
|
47
|
+
// A lapsed license resolves through the same resolvers against its retained snapshot, so the
|
|
48
|
+
// card shows the defaulted, clamped limits the plan enforced rather than raw options.
|
|
49
|
+
const retainedEntitlements = isActiveLicense ? [] : strapi.ee.entitlements.listRetained();
|
|
39
50
|
let shouldNotify = false;
|
|
40
51
|
let licenseLimitStatus = null;
|
|
41
52
|
let enforcementUserCount;
|
|
@@ -54,17 +65,79 @@ var admin = {
|
|
|
54
65
|
shouldNotify = true;
|
|
55
66
|
licenseLimitStatus = 'AT_LIMIT';
|
|
56
67
|
}
|
|
68
|
+
const eeInformation = await strapi.db.query('strapi::core-store').findOne({
|
|
69
|
+
where: {
|
|
70
|
+
key: 'ee_information'
|
|
71
|
+
}
|
|
72
|
+
}).then((row)=>row ? JSON.parse(row.value) : null).catch(()=>null);
|
|
73
|
+
// disable() wipes the live type on expiry but keeps it on the retained snapshot, so resolve
|
|
74
|
+
// it once here: an expired offline gold license must still report `offline` (and show its
|
|
75
|
+
// real expiry) rather than the online check-in line.
|
|
76
|
+
const licenseType = strapi.ee.type ?? retained?.type ?? null;
|
|
77
|
+
const licenseMode = licenseType === 'gold' && process.env.STRAPI_DISABLE_LICENSE_PING?.toLowerCase() === 'true' ? 'offline' : 'online';
|
|
78
|
+
// Registry re-check cron cadence ('0 0 */12 * * *', shifted to the startup time -> every 12h).
|
|
79
|
+
const REGISTRY_CHECK_INTERVAL_MS = 12 * 60 * 60 * 1000;
|
|
80
|
+
const lastRegistrySyncAt = eeInformation?.lastCheckAt ?? null;
|
|
81
|
+
let nextRegistrySyncAt = null;
|
|
82
|
+
if (licenseMode === 'online' && typeof lastRegistrySyncAt === 'number') {
|
|
83
|
+
// Step forward from the last check-in in 12h increments until we land in the
|
|
84
|
+
// future, so a stale last check-in never reports a "next check-in" in the past.
|
|
85
|
+
const now = Date.now();
|
|
86
|
+
let next = lastRegistrySyncAt + REGISTRY_CHECK_INTERVAL_MS;
|
|
87
|
+
while(next <= now){
|
|
88
|
+
next += REGISTRY_CHECK_INTERVAL_MS;
|
|
89
|
+
}
|
|
90
|
+
nextRegistrySyncAt = next;
|
|
91
|
+
}
|
|
92
|
+
// An offline instance never contacts the registry, so an error (and the cached license that
|
|
93
|
+
// came with it) stored by an earlier online run says nothing about its current state.
|
|
94
|
+
const registryState = licenseMode === 'online' ? eeInformation : null;
|
|
57
95
|
const data = {
|
|
58
96
|
enforcementUserCount,
|
|
59
97
|
currentActiveUserCount,
|
|
60
|
-
|
|
98
|
+
// Typed `number` in the published contract; null at runtime without a seat limit
|
|
99
|
+
permittedSeats: permittedSeats ?? null,
|
|
100
|
+
seats: strapi.ee.seats ?? retained?.seats ?? null,
|
|
101
|
+
subscriptionId: strapi.ee.subscriptionId ?? retained?.subscriptionId ?? null,
|
|
102
|
+
expireAt: strapi.ee.expireAt ?? retained?.expireAt ?? null,
|
|
103
|
+
licenseStatus: strapi.ee.licenseStatus,
|
|
104
|
+
planPriceId: strapi.ee.planPriceId ?? retained?.planPriceId ?? null,
|
|
105
|
+
renewalDate: strapi.ee.renewalDate,
|
|
106
|
+
planEntitlements: strapi.ee.planFeatureCatalog.map((feature)=>{
|
|
107
|
+
if (isActiveLicense) {
|
|
108
|
+
// Every resolver runs for an active license and falls back to its default for a
|
|
109
|
+
// missing feature, so only an included feature keeps its limits.
|
|
110
|
+
const available = strapi.ee.features.isEnabled(feature);
|
|
111
|
+
return {
|
|
112
|
+
feature,
|
|
113
|
+
available,
|
|
114
|
+
limits: available ? activeEntitlements.find((entry)=>entry.feature === feature)?.limits ?? [] : []
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
const retainedFeature = findRetainedFeature(retained?.features, feature);
|
|
118
|
+
return {
|
|
119
|
+
feature,
|
|
120
|
+
available: Boolean(retainedFeature),
|
|
121
|
+
limits: retainedFeature ? retainedEntitlements.find((entry)=>entry.feature === feature)?.limits ?? [] : []
|
|
122
|
+
};
|
|
123
|
+
}),
|
|
124
|
+
licenseMode,
|
|
125
|
+
lastRegistrySyncAt,
|
|
126
|
+
nextRegistrySyncAt,
|
|
127
|
+
usingCachedLicense: Boolean(registryState?.error && registryState?.license),
|
|
128
|
+
registrySyncError: registryState?.error ?? null,
|
|
129
|
+
registrySyncErrorKind: registryState?.errorKind ?? null,
|
|
61
130
|
shouldNotify,
|
|
62
131
|
shouldStopCreate: permittedSeats == null ? false : currentActiveUserCount >= permittedSeats,
|
|
63
132
|
licenseLimitStatus,
|
|
64
133
|
isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',
|
|
65
|
-
|
|
134
|
+
// Typed `string` in the published contract; null at runtime without a license
|
|
135
|
+
type: licenseType,
|
|
66
136
|
isTrial: strapi.ee.isTrial,
|
|
67
|
-
|
|
137
|
+
// `features.list()` is loosely typed at the source (`{ name: string; [k]: any }[]`);
|
|
138
|
+
// narrow it to the contract's named-feature union so consumers (e.g. useLicenseLimits) keep their types.
|
|
139
|
+
features: strapi.ee.features.list() ?? [],
|
|
140
|
+
entitlements: strapi.ee.entitlements.list()
|
|
68
141
|
};
|
|
69
142
|
return {
|
|
70
143
|
data
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.mjs","sources":["../../../../../../ee/server/src/controllers/admin.ts"],"sourcesContent":["import { env } from '@strapi/utils';\n\nimport { getService } from '../utils';\n\nimport type { GetProjectType } from '../../../../shared/contracts/admin';\n\nexport default {\n // NOTE: Overrides CE admin controller\n async getProjectType(): Promise<GetProjectType.Response> {\n const flags = strapi.config.get('admin.flags', {});\n\n try {\n return {\n data: {\n // The license fields are nullable internally; the contract is not.\n isEE: Boolean(strapi.EE),\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list(),\n flags,\n type: strapi.ee.type ?? undefined,\n planPriceId: strapi.ee.planPriceId ?? undefined,\n ai: {\n enabled: strapi.ai.admin.isStrapiManagedAiEnabled(),\n },\n },\n };\n } catch {\n return { data: { isEE: false, isTrial: false, features: [], flags, ai: { enabled: false } } };\n }\n },\n\n async licenseLimitInformation() {\n const permittedSeats = strapi.ee.seats;\n\n let shouldNotify = false;\n let licenseLimitStatus = null;\n let enforcementUserCount;\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const eeDisabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (eeDisabledUsers) {\n enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;\n } else {\n enforcementUserCount = currentActiveUserCount;\n }\n\n if (permittedSeats != null && enforcementUserCount > permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'OVER_LIMIT';\n }\n\n if (permittedSeats != null && enforcementUserCount === permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'AT_LIMIT';\n }\n\n const data = {\n enforcementUserCount,\n currentActiveUserCount,\n permittedSeats,\n shouldNotify,\n shouldStopCreate: permittedSeats == null ? false : currentActiveUserCount >= permittedSeats,\n licenseLimitStatus,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n type: strapi.ee.type,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list() ?? [],\n };\n\n return { data };\n },\n};\n"],"names":["getProjectType","flags","strapi","config","get","data","isEE","Boolean","EE","isTrial","ee","features","list","type","undefined","planPriceId","ai","enabled","admin","isStrapiManagedAiEnabled","licenseLimitInformation","permittedSeats","seats","shouldNotify","licenseLimitStatus","enforcementUserCount","currentActiveUserCount","getService","getCurrentActiveUserCount","eeDisabledUsers","getDisabledUserList","length","shouldStopCreate","isHostedOnStrapiCloud","env"],"mappings":";;;AAMA,YAAe;;IAEb,MAAMA,cAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAMC,QAAQC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,eAAe,EAAC,CAAA;QAEhD,IAAI;YACF,OAAO;gBACLC,IAAAA,EAAM;;oBAEJC,IAAAA,EAAMC,OAAAA,CAAQL,OAAOM,EAAE,CAAA;oBACvBC,OAAAA,EAASP,MAAAA,CAAOQ,EAAE,CAACD,OAAO;AAC1BE,oBAAAA,QAAAA,EAAUT,MAAAA,CAAOQ,EAAE,CAACC,QAAQ,CAACC,IAAI,EAAA;AACjCX,oBAAAA,KAAAA;AACAY,oBAAAA,IAAAA,EAAMX,MAAAA,CAAOQ,EAAE,CAACG,IAAI,IAAIC,SAAAA;AACxBC,oBAAAA,WAAAA,EAAab,MAAAA,CAAOQ,EAAE,CAACK,WAAW,IAAID,SAAAA;oBACtCE,EAAAA,EAAI;AACFC,wBAAAA,OAAAA,EAASf,MAAAA,CAAOc,EAAE,CAACE,KAAK,CAACC,wBAAwB;AACnD;AACF;AACF,aAAA;AACF,QAAA,CAAA,CAAE,OAAM;YACN,OAAO;gBAAEd,IAAAA,EAAM;oBAAEC,IAAAA,EAAM,KAAA;oBAAOG,OAAAA,EAAS,KAAA;AAAOE,oBAAAA,QAAAA,EAAU,EAAE;AAAEV,oBAAAA,KAAAA;oBAAOe,EAAAA,EAAI;wBAAEC,OAAAA,EAAS;AAAM;AAAE;AAAE,aAAA;AAC9F,QAAA;AACF,IAAA,CAAA;IAEA,MAAMG,uBAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAMC,cAAAA,GAAiBnB,MAAAA,CAAOQ,EAAE,CAACY,KAAK;AAEtC,QAAA,IAAIC,YAAAA,GAAe,KAAA;AACnB,QAAA,IAAIC,kBAAAA,GAAqB,IAAA;QACzB,IAAIC,oBAAAA;AAEJ,QAAA,MAAMC,sBAAAA,GAAyB,MAAMC,UAAAA,CAAW,MAAA,CAAA,CAAQC,yBAAyB,EAAA;AAEjF,QAAA,MAAMC,eAAAA,GAAkB,MAAMF,UAAAA,CAAW,kBAAA,CAAA,CAAoBG,mBAAmB,EAAA;AAEhF,QAAA,IAAID,eAAAA,EAAiB;YACnBJ,oBAAAA,GAAuBC,sBAAAA,GAAyBG,gBAAgBE,MAAM;QACxE,CAAA,MAAO;YACLN,oBAAAA,GAAuBC,sBAAAA;AACzB,QAAA;QAEA,IAAIL,cAAAA,IAAkB,IAAA,IAAQI,oBAAAA,GAAuBJ,cAAAA,EAAgB;YACnEE,YAAAA,GAAe,IAAA;YACfC,kBAAAA,GAAqB,YAAA;AACvB,QAAA;QAEA,IAAIH,cAAAA,IAAkB,IAAA,IAAQI,oBAAAA,KAAyBJ,cAAAA,EAAgB;YACrEE,YAAAA,GAAe,IAAA;YACfC,kBAAAA,GAAqB,UAAA;AACvB,QAAA;AAEA,QAAA,MAAMnB,IAAAA,GAAO;AACXoB,YAAAA,oBAAAA;AACAC,YAAAA,sBAAAA;AACAL,YAAAA,cAAAA;AACAE,YAAAA,YAAAA;YACAS,gBAAAA,EAAkBX,cAAAA,IAAkB,IAAA,GAAO,KAAA,GAAQK,sBAAAA,IAA0BL,cAAAA;AAC7EG,YAAAA,kBAAAA;YACAS,qBAAAA,EAAuBC,GAAAA,CAAI,kBAAkB,IAAA,CAAA,KAAU,cAAA;YACvDrB,IAAAA,EAAMX,MAAAA,CAAOQ,EAAE,CAACG,IAAI;YACpBJ,OAAAA,EAASP,MAAAA,CAAOQ,EAAE,CAACD,OAAO;AAC1BE,YAAAA,QAAAA,EAAUT,OAAOQ,EAAE,CAACC,QAAQ,CAACC,IAAI,MAAM;AACzC,SAAA;QAEA,OAAO;AAAEP,YAAAA;AAAK,SAAA;AAChB,IAAA;AACF,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"admin.mjs","sources":["../../../../../../ee/server/src/controllers/admin.ts"],"sourcesContent":["import { env } from '@strapi/utils';\n\nimport type {\n GetLicenseLimitInformation,\n GetProjectType,\n} from '../../../../shared/contracts/admin';\nimport { getService } from '../utils';\n\ntype RetainedFeature = { name: string; [key: string]: any };\n\nconst findRetainedFeature = (\n retainedFeatures: Array<RetainedFeature | string> | undefined,\n featureName: string\n): RetainedFeature | undefined =>\n retainedFeatures\n ?.map((entry) => (typeof entry === 'string' ? { name: entry } : entry))\n .find((entry) => entry.name === featureName);\n\nexport default {\n // NOTE: Overrides CE admin controller\n async getProjectType(): Promise<GetProjectType.Response> {\n const flags = strapi.config.get('admin.flags', {});\n\n try {\n return {\n data: {\n // The license fields are nullable internally; the contract is not.\n isEE: Boolean(strapi.EE),\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list(),\n flags,\n type: strapi.ee.type ?? undefined,\n planPriceId: strapi.ee.planPriceId ?? undefined,\n ai: {\n enabled: strapi.ai.admin.isStrapiManagedAiEnabled(),\n },\n },\n };\n } catch {\n return { data: { isEE: false, isTrial: false, features: [], flags, ai: { enabled: false } } };\n }\n },\n\n async licenseLimitInformation() {\n const permittedSeats = strapi.ee.seats;\n // Display-only fallback so an expired/unknown license can still show its plan, seats\n // and subscription. Never used for enforcement (permittedSeats above is untouched).\n const retained = strapi.ee.retainedLicense;\n const isActiveLicense = strapi.ee.licenseStatus === 'active';\n const activeEntitlements = strapi.ee.entitlements.list();\n // A lapsed license resolves through the same resolvers against its retained snapshot, so the\n // card shows the defaulted, clamped limits the plan enforced rather than raw options.\n const retainedEntitlements = isActiveLicense ? [] : strapi.ee.entitlements.listRetained();\n\n let shouldNotify = false;\n let licenseLimitStatus = null;\n let enforcementUserCount;\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const eeDisabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (eeDisabledUsers) {\n enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;\n } else {\n enforcementUserCount = currentActiveUserCount;\n }\n\n if (permittedSeats != null && enforcementUserCount > permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'OVER_LIMIT';\n }\n\n if (permittedSeats != null && enforcementUserCount === permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'AT_LIMIT';\n }\n\n const eeInformation = await strapi.db\n .query('strapi::core-store')\n .findOne({ where: { key: 'ee_information' } })\n .then((row: { value: string } | null) =>\n row\n ? (JSON.parse(row.value) as {\n license?: string | null;\n error?: string;\n errorKind?: 'unreachable' | 'rejected';\n lastCheckAt?: number;\n })\n : null\n )\n .catch(() => null);\n\n // disable() wipes the live type on expiry but keeps it on the retained snapshot, so resolve\n // it once here: an expired offline gold license must still report `offline` (and show its\n // real expiry) rather than the online check-in line.\n const licenseType = strapi.ee.type ?? retained?.type ?? null;\n const licenseMode: 'online' | 'offline' =\n licenseType === 'gold' && process.env.STRAPI_DISABLE_LICENSE_PING?.toLowerCase() === 'true'\n ? 'offline'\n : 'online';\n\n // Registry re-check cron cadence ('0 0 */12 * * *', shifted to the startup time -> every 12h).\n const REGISTRY_CHECK_INTERVAL_MS = 12 * 60 * 60 * 1000;\n const lastRegistrySyncAt: number | null = eeInformation?.lastCheckAt ?? null;\n let nextRegistrySyncAt: number | null = null;\n if (licenseMode === 'online' && typeof lastRegistrySyncAt === 'number') {\n // Step forward from the last check-in in 12h increments until we land in the\n // future, so a stale last check-in never reports a \"next check-in\" in the past.\n const now = Date.now();\n let next = lastRegistrySyncAt + REGISTRY_CHECK_INTERVAL_MS;\n while (next <= now) {\n next += REGISTRY_CHECK_INTERVAL_MS;\n }\n nextRegistrySyncAt = next;\n }\n\n // An offline instance never contacts the registry, so an error (and the cached license that\n // came with it) stored by an earlier online run says nothing about its current state.\n const registryState = licenseMode === 'online' ? eeInformation : null;\n\n const data: GetLicenseLimitInformation.Response['data'] = {\n enforcementUserCount,\n currentActiveUserCount,\n // Typed `number` in the published contract; null at runtime without a seat limit\n permittedSeats: (permittedSeats ?? null) as number,\n seats: strapi.ee.seats ?? retained?.seats ?? null,\n subscriptionId: strapi.ee.subscriptionId ?? retained?.subscriptionId ?? null,\n expireAt: strapi.ee.expireAt ?? retained?.expireAt ?? null,\n licenseStatus: strapi.ee.licenseStatus,\n planPriceId: strapi.ee.planPriceId ?? retained?.planPriceId ?? null,\n renewalDate: strapi.ee.renewalDate,\n planEntitlements: strapi.ee.planFeatureCatalog.map((feature) => {\n if (isActiveLicense) {\n // Every resolver runs for an active license and falls back to its default for a\n // missing feature, so only an included feature keeps its limits.\n const available = strapi.ee.features.isEnabled(feature);\n return {\n feature,\n available,\n limits: available\n ? (activeEntitlements.find((entry) => entry.feature === feature)?.limits ?? [])\n : [],\n };\n }\n\n const retainedFeature = findRetainedFeature(retained?.features, feature);\n\n return {\n feature,\n available: Boolean(retainedFeature),\n limits: retainedFeature\n ? (retainedEntitlements.find((entry) => entry.feature === feature)?.limits ?? [])\n : [],\n };\n }),\n licenseMode,\n lastRegistrySyncAt,\n nextRegistrySyncAt,\n usingCachedLicense: Boolean(registryState?.error && registryState?.license),\n registrySyncError: registryState?.error ?? null,\n registrySyncErrorKind: registryState?.errorKind ?? null,\n shouldNotify,\n shouldStopCreate: permittedSeats == null ? false : currentActiveUserCount >= permittedSeats,\n licenseLimitStatus,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n // Typed `string` in the published contract; null at runtime without a license\n type: licenseType as string,\n isTrial: strapi.ee.isTrial,\n // `features.list()` is loosely typed at the source (`{ name: string; [k]: any }[]`);\n // narrow it to the contract's named-feature union so consumers (e.g. useLicenseLimits) keep their types.\n features: (strapi.ee.features.list() ??\n []) as GetLicenseLimitInformation.Response['data']['features'],\n entitlements: strapi.ee.entitlements.list(),\n };\n\n return { data } satisfies GetLicenseLimitInformation.Response;\n },\n};\n"],"names":["findRetainedFeature","retainedFeatures","featureName","map","entry","name","find","getProjectType","flags","strapi","config","get","data","isEE","Boolean","EE","isTrial","ee","features","list","type","undefined","planPriceId","ai","enabled","admin","isStrapiManagedAiEnabled","licenseLimitInformation","permittedSeats","seats","retained","retainedLicense","isActiveLicense","licenseStatus","activeEntitlements","entitlements","retainedEntitlements","listRetained","shouldNotify","licenseLimitStatus","enforcementUserCount","currentActiveUserCount","getService","getCurrentActiveUserCount","eeDisabledUsers","getDisabledUserList","length","eeInformation","db","query","findOne","where","key","then","row","JSON","parse","value","catch","licenseType","licenseMode","process","env","STRAPI_DISABLE_LICENSE_PING","toLowerCase","REGISTRY_CHECK_INTERVAL_MS","lastRegistrySyncAt","lastCheckAt","nextRegistrySyncAt","now","Date","next","registryState","subscriptionId","expireAt","renewalDate","planEntitlements","planFeatureCatalog","feature","available","isEnabled","limits","retainedFeature","usingCachedLicense","error","license","registrySyncError","registrySyncErrorKind","errorKind","shouldStopCreate","isHostedOnStrapiCloud"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var passport = require('koa-passport');
|
|
6
6
|
var index = require('../../utils/index.js');
|
|
7
7
|
var utils = require('./utils.js');
|
|
8
|
+
var auth = require('../../../../../server/src/audit-logs/auth.js');
|
|
8
9
|
var sessionAuth = require('../../../../../shared/utils/session-auth.js');
|
|
9
10
|
|
|
10
11
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -21,9 +22,12 @@ const authenticate = async (ctx, next)=>{
|
|
|
21
22
|
if (error) {
|
|
22
23
|
strapi.log.error(error);
|
|
23
24
|
}
|
|
24
|
-
|
|
25
|
+
auth.emitLoginFailure({
|
|
26
|
+
strapi
|
|
27
|
+
}, {
|
|
25
28
|
error: error || defaultConnectionError(),
|
|
26
|
-
provider
|
|
29
|
+
provider,
|
|
30
|
+
reason: 'sso_connection_error'
|
|
27
31
|
});
|
|
28
32
|
return ctx.redirect(redirectUrls.error);
|
|
29
33
|
}
|
|
@@ -35,9 +39,13 @@ const authenticate = async (ctx, next)=>{
|
|
|
35
39
|
const existingUserScenario = (ctx, next)=>async (user, provider)=>{
|
|
36
40
|
const redirectUrls = utils.default.getPrefixedRedirectUrls();
|
|
37
41
|
if (!user.isActive) {
|
|
38
|
-
|
|
42
|
+
auth.emitLoginFailure({
|
|
43
|
+
strapi
|
|
44
|
+
}, {
|
|
39
45
|
error: new Error(`Deactivated user tried to login (${user.id})`),
|
|
40
|
-
provider
|
|
46
|
+
provider,
|
|
47
|
+
reason: 'account_inactive',
|
|
48
|
+
user
|
|
41
49
|
});
|
|
42
50
|
return ctx.redirect(redirectUrls.error);
|
|
43
51
|
}
|
|
@@ -54,9 +62,12 @@ const nonExistingUserScenario = (ctx, next)=>async (profile, provider)=>{
|
|
|
54
62
|
// We need at least the username or the firstname/lastname combination to register a new user
|
|
55
63
|
const isMissingRegisterFields = !username && (!firstname || !lastname);
|
|
56
64
|
if (!providers.autoRegister || !providers.defaultRole || isMissingRegisterFields) {
|
|
57
|
-
|
|
65
|
+
auth.emitLoginFailure({
|
|
66
|
+
strapi
|
|
67
|
+
}, {
|
|
58
68
|
error: defaultConnectionError(),
|
|
59
|
-
provider
|
|
69
|
+
provider,
|
|
70
|
+
reason: 'sso_registration_disabled'
|
|
60
71
|
});
|
|
61
72
|
return ctx.redirect(redirectUrls.error);
|
|
62
73
|
}
|
|
@@ -65,9 +76,12 @@ const nonExistingUserScenario = (ctx, next)=>async (profile, provider)=>{
|
|
|
65
76
|
});
|
|
66
77
|
// If the default role has been misconfigured, redirect with an error
|
|
67
78
|
if (!defaultRole) {
|
|
68
|
-
|
|
79
|
+
auth.emitLoginFailure({
|
|
80
|
+
strapi
|
|
81
|
+
}, {
|
|
69
82
|
error: defaultConnectionError(),
|
|
70
|
-
provider
|
|
83
|
+
provider,
|
|
84
|
+
reason: 'sso_role_misconfigured'
|
|
71
85
|
});
|
|
72
86
|
return ctx.redirect(redirectUrls.error);
|
|
73
87
|
}
|
|
@@ -136,9 +150,13 @@ const redirectWithAuth = async (ctx)=>{
|
|
|
136
150
|
ctx.redirect(redirectUrls.success);
|
|
137
151
|
} catch (error) {
|
|
138
152
|
strapi.log.error('SSO authentication failed during token generation', error);
|
|
139
|
-
|
|
153
|
+
auth.emitLoginFailure({
|
|
154
|
+
strapi
|
|
155
|
+
}, {
|
|
140
156
|
error: error instanceof Error ? error : new Error('Unknown SSO error'),
|
|
141
|
-
provider
|
|
157
|
+
provider,
|
|
158
|
+
reason: 'unexpected_error',
|
|
159
|
+
user
|
|
142
160
|
});
|
|
143
161
|
return ctx.redirect(redirectUrls.error);
|
|
144
162
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middlewares.js","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.js","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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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import passport from 'koa-passport';
|
|
2
2
|
import { getService } from '../../utils/index.mjs';
|
|
3
3
|
import utils from './utils.mjs';
|
|
4
|
+
import { emitLoginFailure } from '../../../../../server/src/audit-logs/auth.mjs';
|
|
4
5
|
import { getSessionManager, generateDeviceId, buildSessionMetadataFromContext, buildCookieOptionsWithExpiry, REFRESH_COOKIE_NAME, getAccessCookieDomain, getAccessCookiePath, getAccessCookieName } from '../../../../../shared/utils/session-auth.mjs';
|
|
5
6
|
|
|
6
7
|
const defaultConnectionError = ()=>new Error('Invalid connection payload');
|
|
@@ -13,9 +14,12 @@ const authenticate = async (ctx, next)=>{
|
|
|
13
14
|
if (error) {
|
|
14
15
|
strapi.log.error(error);
|
|
15
16
|
}
|
|
16
|
-
|
|
17
|
+
emitLoginFailure({
|
|
18
|
+
strapi
|
|
19
|
+
}, {
|
|
17
20
|
error: error || defaultConnectionError(),
|
|
18
|
-
provider
|
|
21
|
+
provider,
|
|
22
|
+
reason: 'sso_connection_error'
|
|
19
23
|
});
|
|
20
24
|
return ctx.redirect(redirectUrls.error);
|
|
21
25
|
}
|
|
@@ -27,9 +31,13 @@ const authenticate = async (ctx, next)=>{
|
|
|
27
31
|
const existingUserScenario = (ctx, next)=>async (user, provider)=>{
|
|
28
32
|
const redirectUrls = utils.getPrefixedRedirectUrls();
|
|
29
33
|
if (!user.isActive) {
|
|
30
|
-
|
|
34
|
+
emitLoginFailure({
|
|
35
|
+
strapi
|
|
36
|
+
}, {
|
|
31
37
|
error: new Error(`Deactivated user tried to login (${user.id})`),
|
|
32
|
-
provider
|
|
38
|
+
provider,
|
|
39
|
+
reason: 'account_inactive',
|
|
40
|
+
user
|
|
33
41
|
});
|
|
34
42
|
return ctx.redirect(redirectUrls.error);
|
|
35
43
|
}
|
|
@@ -46,9 +54,12 @@ const nonExistingUserScenario = (ctx, next)=>async (profile, provider)=>{
|
|
|
46
54
|
// We need at least the username or the firstname/lastname combination to register a new user
|
|
47
55
|
const isMissingRegisterFields = !username && (!firstname || !lastname);
|
|
48
56
|
if (!providers.autoRegister || !providers.defaultRole || isMissingRegisterFields) {
|
|
49
|
-
|
|
57
|
+
emitLoginFailure({
|
|
58
|
+
strapi
|
|
59
|
+
}, {
|
|
50
60
|
error: defaultConnectionError(),
|
|
51
|
-
provider
|
|
61
|
+
provider,
|
|
62
|
+
reason: 'sso_registration_disabled'
|
|
52
63
|
});
|
|
53
64
|
return ctx.redirect(redirectUrls.error);
|
|
54
65
|
}
|
|
@@ -57,9 +68,12 @@ const nonExistingUserScenario = (ctx, next)=>async (profile, provider)=>{
|
|
|
57
68
|
});
|
|
58
69
|
// If the default role has been misconfigured, redirect with an error
|
|
59
70
|
if (!defaultRole) {
|
|
60
|
-
|
|
71
|
+
emitLoginFailure({
|
|
72
|
+
strapi
|
|
73
|
+
}, {
|
|
61
74
|
error: defaultConnectionError(),
|
|
62
|
-
provider
|
|
75
|
+
provider,
|
|
76
|
+
reason: 'sso_role_misconfigured'
|
|
63
77
|
});
|
|
64
78
|
return ctx.redirect(redirectUrls.error);
|
|
65
79
|
}
|
|
@@ -128,9 +142,13 @@ const redirectWithAuth = async (ctx)=>{
|
|
|
128
142
|
ctx.redirect(redirectUrls.success);
|
|
129
143
|
} catch (error) {
|
|
130
144
|
strapi.log.error('SSO authentication failed during token generation', error);
|
|
131
|
-
|
|
145
|
+
emitLoginFailure({
|
|
146
|
+
strapi
|
|
147
|
+
}, {
|
|
132
148
|
error: error instanceof Error ? error : new Error('Unknown SSO error'),
|
|
133
|
-
provider
|
|
149
|
+
provider,
|
|
150
|
+
reason: 'unexpected_error',
|
|
151
|
+
user
|
|
134
152
|
});
|
|
135
153
|
return ctx.redirect(redirectUrls.error);
|
|
136
154
|
}
|