@strapi/admin 5.56.0 → 5.57.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/components/Filters.js +1 -1
- package/dist/admin/admin/src/components/Filters.js.map +1 -1
- package/dist/admin/admin/src/components/Filters.mjs +1 -1
- package/dist/admin/admin/src/components/Filters.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.js +2 -2
- package/dist/admin/admin/src/components/FormInputs/Enumeration.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs +2 -2
- package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs.map +1 -1
- package/dist/admin/admin/src/components/MediaLibraryBanner.js +38 -2
- package/dist/admin/admin/src/components/MediaLibraryBanner.js.map +1 -1
- package/dist/admin/admin/src/components/MediaLibraryBanner.mjs +18 -2
- package/dist/admin/admin/src/components/MediaLibraryBanner.mjs.map +1 -1
- package/dist/admin/admin/src/components/RelativeTime.js +9 -0
- package/dist/admin/admin/src/components/RelativeTime.js.map +1 -1
- package/dist/admin/admin/src/components/RelativeTime.mjs +10 -1
- package/dist/admin/admin/src/components/RelativeTime.mjs.map +1 -1
- package/dist/admin/admin/src/components/TopBanners.js +52 -0
- package/dist/admin/admin/src/components/TopBanners.js.map +1 -0
- package/dist/admin/admin/src/components/TopBanners.mjs +30 -0
- package/dist/admin/admin/src/components/TopBanners.mjs.map +1 -0
- package/dist/admin/admin/src/features/Tracking.js +28 -8
- package/dist/admin/admin/src/features/Tracking.js.map +1 -1
- package/dist/admin/admin/src/features/Tracking.mjs +29 -10
- package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +4 -20
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +4 -20
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
- package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.js +59 -0
- package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.js.map +1 -0
- package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.mjs +37 -0
- package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.mjs.map +1 -0
- package/dist/admin/admin/src/translations/en.json.js +5 -0
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +5 -0
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.js +3 -3
- package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.mjs +2 -2
- package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +6 -1
- 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 +6 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
- package/dist/admin/src/components/MediaLibraryBanner.d.ts +10 -1
- package/dist/admin/src/components/TopBanners.d.ts +8 -0
- package/dist/admin/src/features/Tracking.d.ts +12 -1
- package/dist/admin/src/layouts/useAuthenticatedAccessTracking.d.ts +6 -0
- package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +5 -0
- package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts +8 -2
- package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/authentication.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/user.d.ts.map +1 -1
- package/dist/ee/server/src/index.d.ts +4 -1
- package/dist/ee/server/src/index.d.ts.map +1 -1
- package/dist/ee/server/src/services/index.d.ts +4 -1
- package/dist/ee/server/src/services/index.d.ts.map +1 -1
- package/dist/ee/server/src/services/metrics.d.ts.map +1 -1
- package/dist/ee/server/src/services/persist-tables.d.ts.map +1 -1
- package/dist/ee/server/src/services/seat-enforcement.d.ts +3 -1
- package/dist/ee/server/src/services/seat-enforcement.d.ts.map +1 -1
- package/dist/server/ee/server/src/controllers/admin.js +3 -4
- package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
- package/dist/server/ee/server/src/controllers/admin.mjs +3 -4
- package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/utils.js +2 -2
- package/dist/server/ee/server/src/controllers/authentication-utils/utils.js.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/utils.mjs +2 -2
- package/dist/server/ee/server/src/controllers/authentication-utils/utils.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication.js +11 -11
- package/dist/server/ee/server/src/controllers/authentication.js.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication.mjs +11 -11
- package/dist/server/ee/server/src/controllers/authentication.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/user.js +7 -8
- package/dist/server/ee/server/src/controllers/user.js.map +1 -1
- package/dist/server/ee/server/src/controllers/user.mjs +8 -9
- package/dist/server/ee/server/src/controllers/user.mjs.map +1 -1
- package/dist/server/ee/server/src/services/metrics.js +9 -7
- package/dist/server/ee/server/src/services/metrics.js.map +1 -1
- package/dist/server/ee/server/src/services/metrics.mjs +9 -7
- package/dist/server/ee/server/src/services/metrics.mjs.map +1 -1
- package/dist/server/ee/server/src/services/persist-tables.js +3 -4
- package/dist/server/ee/server/src/services/persist-tables.js.map +1 -1
- package/dist/server/ee/server/src/services/persist-tables.mjs +3 -4
- package/dist/server/ee/server/src/services/persist-tables.mjs.map +1 -1
- package/dist/server/ee/server/src/services/role.js +2 -2
- package/dist/server/ee/server/src/services/role.js.map +1 -1
- package/dist/server/ee/server/src/services/role.mjs +1 -1
- package/dist/server/ee/server/src/services/role.mjs.map +1 -1
- package/dist/server/ee/server/src/services/seat-enforcement.js +20 -20
- package/dist/server/ee/server/src/services/seat-enforcement.js.map +1 -1
- package/dist/server/ee/server/src/services/seat-enforcement.mjs +20 -20
- package/dist/server/ee/server/src/services/seat-enforcement.mjs.map +1 -1
- package/dist/server/ee/server/src/services/user.js +1 -2
- package/dist/server/ee/server/src/services/user.js.map +1 -1
- package/dist/server/ee/server/src/services/user.mjs +2 -3
- package/dist/server/ee/server/src/services/user.mjs.map +1 -1
- package/dist/server/ee/server/src/utils/sso-lock.js +2 -2
- package/dist/server/ee/server/src/utils/sso-lock.js.map +1 -1
- package/dist/server/ee/server/src/utils/sso-lock.mjs +1 -1
- package/dist/server/ee/server/src/utils/sso-lock.mjs.map +1 -1
- package/dist/server/server/src/audit-logs/admin-users.js +3 -3
- package/dist/server/server/src/audit-logs/admin-users.js.map +1 -1
- package/dist/server/server/src/audit-logs/admin-users.mjs +2 -2
- package/dist/server/server/src/audit-logs/admin-users.mjs.map +1 -1
- package/dist/server/server/src/audit-logs/tokens.js +3 -3
- package/dist/server/server/src/audit-logs/tokens.js.map +1 -1
- package/dist/server/server/src/audit-logs/tokens.mjs +2 -2
- package/dist/server/server/src/audit-logs/tokens.mjs.map +1 -1
- package/dist/server/server/src/audit-logs/webhooks.js +2 -2
- package/dist/server/server/src/audit-logs/webhooks.js.map +1 -1
- package/dist/server/server/src/audit-logs/webhooks.mjs +1 -1
- package/dist/server/server/src/audit-logs/webhooks.mjs.map +1 -1
- package/dist/server/server/src/bootstrap.js +6 -4
- package/dist/server/server/src/bootstrap.js.map +1 -1
- package/dist/server/server/src/bootstrap.mjs +6 -4
- package/dist/server/server/src/bootstrap.mjs.map +1 -1
- package/dist/server/server/src/controllers/admin-token.js +8 -8
- package/dist/server/server/src/controllers/admin-token.js.map +1 -1
- package/dist/server/server/src/controllers/admin-token.mjs +4 -4
- package/dist/server/server/src/controllers/admin-token.mjs.map +1 -1
- package/dist/server/server/src/controllers/admin.js +3 -5
- package/dist/server/server/src/controllers/admin.js.map +1 -1
- package/dist/server/server/src/controllers/admin.mjs +2 -4
- package/dist/server/server/src/controllers/admin.mjs.map +1 -1
- package/dist/server/server/src/controllers/api-token.js +8 -8
- package/dist/server/server/src/controllers/api-token.js.map +1 -1
- package/dist/server/server/src/controllers/api-token.mjs +4 -4
- package/dist/server/server/src/controllers/api-token.mjs.map +1 -1
- package/dist/server/server/src/controllers/formatters/conditions.js +2 -2
- package/dist/server/server/src/controllers/formatters/conditions.js.map +1 -1
- package/dist/server/server/src/controllers/formatters/conditions.mjs +2 -2
- package/dist/server/server/src/controllers/formatters/conditions.mjs.map +1 -1
- package/dist/server/server/src/controllers/transfer/index.js +2 -2
- package/dist/server/server/src/controllers/transfer/index.js.map +1 -1
- package/dist/server/server/src/controllers/transfer/index.mjs +2 -2
- package/dist/server/server/src/controllers/transfer/index.mjs.map +1 -1
- package/dist/server/server/src/controllers/transfer/token.js +8 -8
- package/dist/server/server/src/controllers/transfer/token.js.map +1 -1
- package/dist/server/server/src/controllers/transfer/token.mjs +4 -4
- package/dist/server/server/src/controllers/transfer/token.mjs.map +1 -1
- package/dist/server/server/src/domain/action/index.js +18 -16
- package/dist/server/server/src/domain/action/index.js.map +1 -1
- package/dist/server/server/src/domain/action/index.mjs +16 -14
- package/dist/server/server/src/domain/action/index.mjs.map +1 -1
- package/dist/server/server/src/domain/action/provider.mjs +4 -4
- package/dist/server/server/src/domain/action/provider.mjs.map +1 -1
- package/dist/server/server/src/domain/condition/index.js +7 -4
- package/dist/server/server/src/domain/condition/index.js.map +1 -1
- package/dist/server/server/src/domain/condition/index.mjs +7 -4
- package/dist/server/server/src/domain/condition/index.mjs.map +1 -1
- package/dist/server/server/src/domain/permission/index.js +24 -15
- package/dist/server/server/src/domain/permission/index.js.map +1 -1
- package/dist/server/server/src/domain/permission/index.mjs +21 -12
- package/dist/server/server/src/domain/permission/index.mjs.map +1 -1
- package/dist/server/server/src/middlewares/rateLimit.js +5 -5
- package/dist/server/server/src/middlewares/rateLimit.js.map +1 -1
- package/dist/server/server/src/middlewares/rateLimit.mjs +4 -4
- package/dist/server/server/src/middlewares/rateLimit.mjs.map +1 -1
- package/dist/server/server/src/register.js +6 -0
- package/dist/server/server/src/register.js.map +1 -1
- package/dist/server/server/src/register.mjs +6 -0
- package/dist/server/server/src/register.mjs.map +1 -1
- package/dist/server/server/src/services/action.js +1 -2
- package/dist/server/server/src/services/action.js.map +1 -1
- package/dist/server/server/src/services/action.mjs +1 -2
- package/dist/server/server/src/services/action.mjs.map +1 -1
- package/dist/server/server/src/services/api-token.js +61 -49
- package/dist/server/server/src/services/api-token.js.map +1 -1
- package/dist/server/server/src/services/api-token.mjs +53 -41
- package/dist/server/server/src/services/api-token.mjs.map +1 -1
- package/dist/server/server/src/services/condition.js +2 -2
- package/dist/server/server/src/services/condition.js.map +1 -1
- package/dist/server/server/src/services/condition.mjs +1 -1
- package/dist/server/server/src/services/condition.mjs.map +1 -1
- package/dist/server/server/src/services/content-type.js +5 -4
- package/dist/server/server/src/services/content-type.js.map +1 -1
- package/dist/server/server/src/services/content-type.mjs +8 -7
- package/dist/server/server/src/services/content-type.mjs.map +1 -1
- package/dist/server/server/src/services/homepage.js +2 -1
- package/dist/server/server/src/services/homepage.js.map +1 -1
- package/dist/server/server/src/services/homepage.mjs +2 -1
- package/dist/server/server/src/services/homepage.mjs.map +1 -1
- package/dist/server/server/src/services/passport/local-strategy.js +2 -2
- package/dist/server/server/src/services/passport/local-strategy.js.map +1 -1
- package/dist/server/server/src/services/passport/local-strategy.mjs +1 -1
- package/dist/server/server/src/services/passport/local-strategy.mjs.map +1 -1
- package/dist/server/server/src/services/passport.js +1 -2
- package/dist/server/server/src/services/passport.js.map +1 -1
- package/dist/server/server/src/services/passport.mjs +1 -2
- package/dist/server/server/src/services/passport.mjs.map +1 -1
- package/dist/server/server/src/services/permission/engine.js +4 -4
- package/dist/server/server/src/services/permission/engine.js.map +1 -1
- package/dist/server/server/src/services/permission/engine.mjs +2 -2
- package/dist/server/server/src/services/permission/engine.mjs.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/index.js +2 -3
- package/dist/server/server/src/services/permission/permissions-manager/index.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/index.mjs +1 -2
- package/dist/server/server/src/services/permission/permissions-manager/index.mjs.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js +6 -6
- package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs +4 -4
- package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/sanitize.js +47 -41
- package/dist/server/server/src/services/permission/permissions-manager/sanitize.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs +44 -38
- package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/validate.js +30 -26
- package/dist/server/server/src/services/permission/permissions-manager/validate.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/validate.mjs +28 -24
- package/dist/server/server/src/services/permission/permissions-manager/validate.mjs.map +1 -1
- package/dist/server/server/src/services/permission/queries.js +9 -9
- package/dist/server/server/src/services/permission/queries.js.map +1 -1
- package/dist/server/server/src/services/permission/queries.mjs +9 -9
- package/dist/server/server/src/services/permission/queries.mjs.map +1 -1
- package/dist/server/server/src/services/permission/rename-fields.js +118 -0
- package/dist/server/server/src/services/permission/rename-fields.js.map +1 -0
- package/dist/server/server/src/services/permission/rename-fields.mjs +116 -0
- package/dist/server/server/src/services/permission/rename-fields.mjs.map +1 -0
- package/dist/server/server/src/services/permission/sections-builder/index.js +2 -2
- package/dist/server/server/src/services/permission/sections-builder/index.js.map +1 -1
- package/dist/server/server/src/services/permission/sections-builder/index.mjs +2 -2
- package/dist/server/server/src/services/permission/sections-builder/index.mjs.map +1 -1
- package/dist/server/server/src/services/permission/sections-builder/section.js +1 -2
- package/dist/server/server/src/services/permission/sections-builder/section.js.map +1 -1
- package/dist/server/server/src/services/permission/sections-builder/section.mjs +1 -2
- package/dist/server/server/src/services/permission/sections-builder/section.mjs.map +1 -1
- package/dist/server/server/src/services/permission/sections-builder/utils.js +6 -6
- package/dist/server/server/src/services/permission/sections-builder/utils.js.map +1 -1
- package/dist/server/server/src/services/permission/sections-builder/utils.mjs +4 -4
- package/dist/server/server/src/services/permission/sections-builder/utils.mjs.map +1 -1
- package/dist/server/server/src/services/role.js +20 -19
- package/dist/server/server/src/services/role.js.map +1 -1
- package/dist/server/server/src/services/role.mjs +20 -19
- package/dist/server/server/src/services/role.mjs.map +1 -1
- package/dist/server/server/src/services/transfer/token.js +20 -16
- package/dist/server/server/src/services/transfer/token.js.map +1 -1
- package/dist/server/server/src/services/transfer/token.mjs +14 -10
- package/dist/server/server/src/services/transfer/token.mjs.map +1 -1
- package/dist/server/server/src/services/user.js +2 -3
- package/dist/server/server/src/services/user.js.map +1 -1
- package/dist/server/server/src/services/user.mjs +3 -4
- package/dist/server/server/src/services/user.mjs.map +1 -1
- package/dist/server/server/src/strategies/api-token-utils.js +2 -3
- package/dist/server/server/src/strategies/api-token-utils.js.map +1 -1
- package/dist/server/server/src/strategies/api-token-utils.mjs +2 -3
- package/dist/server/server/src/strategies/api-token-utils.mjs.map +1 -1
- package/dist/server/server/src/strategies/content-api-token.js +3 -3
- package/dist/server/server/src/strategies/content-api-token.js.map +1 -1
- package/dist/server/server/src/strategies/content-api-token.mjs +1 -1
- package/dist/server/server/src/strategies/content-api-token.mjs.map +1 -1
- package/dist/server/server/src/strategies/data-transfer.js +4 -4
- package/dist/server/server/src/strategies/data-transfer.js.map +1 -1
- package/dist/server/server/src/strategies/data-transfer.mjs +3 -3
- package/dist/server/server/src/strategies/data-transfer.mjs.map +1 -1
- package/dist/server/server/src/validation/common-validators.js +9 -10
- package/dist/server/server/src/validation/common-validators.js.map +1 -1
- package/dist/server/server/src/validation/common-validators.mjs +13 -14
- package/dist/server/server/src/validation/common-validators.mjs.map +1 -1
- package/dist/server/server/src/validation/user.js +1 -2
- package/dist/server/server/src/validation/user.js.map +1 -1
- package/dist/server/server/src/validation/user.mjs +1 -2
- package/dist/server/server/src/validation/user.mjs.map +1 -1
- package/dist/server/src/audit-logs/tokens.d.ts.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-token.d.ts.map +1 -1
- package/dist/server/src/controllers/admin.d.ts.map +1 -1
- package/dist/server/src/controllers/api-token.d.ts.map +1 -1
- package/dist/server/src/controllers/formatters/conditions.d.ts +1 -1
- package/dist/server/src/controllers/formatters/conditions.d.ts.map +1 -1
- package/dist/server/src/controllers/homepage.d.ts +1 -1
- package/dist/server/src/controllers/index.d.ts +1 -1
- package/dist/server/src/controllers/transfer/index.d.ts.map +1 -1
- package/dist/server/src/controllers/transfer/token.d.ts.map +1 -1
- package/dist/server/src/domain/action/index.d.ts +1 -0
- package/dist/server/src/domain/action/index.d.ts.map +1 -1
- package/dist/server/src/domain/condition/index.d.ts +2 -2
- package/dist/server/src/domain/condition/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 +3 -3
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/middlewares/index.d.ts.map +1 -1
- package/dist/server/src/middlewares/rateLimit.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/action.d.ts.map +1 -1
- package/dist/server/src/services/api-token.d.ts.map +1 -1
- package/dist/server/src/services/condition.d.ts.map +1 -1
- package/dist/server/src/services/content-type.d.ts.map +1 -1
- package/dist/server/src/services/homepage.d.ts +1 -1
- package/dist/server/src/services/homepage.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +2 -2
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/passport/local-strategy.d.ts.map +1 -1
- package/dist/server/src/services/passport.d.ts.map +1 -1
- package/dist/server/src/services/permission/engine.d.ts.map +1 -1
- package/dist/server/src/services/permission/permissions-manager/permission-fields.d.ts.map +1 -1
- package/dist/server/src/services/permission/permissions-manager/sanitize.d.ts.map +1 -1
- package/dist/server/src/services/permission/permissions-manager/validate.d.ts.map +1 -1
- package/dist/server/src/services/permission/queries.d.ts.map +1 -1
- package/dist/server/src/services/permission/rename-fields.d.ts +21 -0
- package/dist/server/src/services/permission/rename-fields.d.ts.map +1 -0
- package/dist/server/src/services/permission/sections-builder/section.d.ts.map +1 -1
- package/dist/server/src/services/permission/sections-builder/utils.d.ts +1 -1
- package/dist/server/src/services/permission/sections-builder/utils.d.ts.map +1 -1
- package/dist/server/src/services/role.d.ts +1 -1
- package/dist/server/src/services/role.d.ts.map +1 -1
- package/dist/server/src/services/transfer/token.d.ts.map +1 -1
- package/dist/server/src/strategies/content-api-token.d.ts.map +1 -1
- package/dist/server/src/validation/user.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var _ = require('lodash');
|
|
3
4
|
var crypto = require('crypto');
|
|
4
|
-
var fp = require('lodash/fp');
|
|
5
5
|
var utils = require('@strapi/utils');
|
|
6
6
|
var constants = require('./constants.js');
|
|
7
7
|
var index = require('../utils/index.js');
|
|
@@ -95,18 +95,18 @@ const UPDATABLE_FIELDS = [
|
|
|
95
95
|
* Assert that a token's permissions attribute is valid for its type
|
|
96
96
|
*/ const assertCustomTokenPermissionsValidity = (type, permissions)=>{
|
|
97
97
|
// Ensure non-custom tokens doesn't have permissions
|
|
98
|
-
if (type !== constants.API_TOKEN_TYPE.CUSTOM && !
|
|
98
|
+
if (type !== constants.API_TOKEN_TYPE.CUSTOM && !_.isEmpty(permissions)) {
|
|
99
99
|
throw new ValidationError('Non-custom tokens should not reference permissions');
|
|
100
100
|
}
|
|
101
101
|
// Custom type tokens should always have permissions attached to them
|
|
102
|
-
if (type === constants.API_TOKEN_TYPE.CUSTOM && !
|
|
102
|
+
if (type === constants.API_TOKEN_TYPE.CUSTOM && !Array.isArray(permissions)) {
|
|
103
103
|
throw new ValidationError('Missing permissions attribute for custom token');
|
|
104
104
|
}
|
|
105
105
|
// Permissions provided for a custom type token should be valid/registered permissions UID
|
|
106
106
|
if (type === constants.API_TOKEN_TYPE.CUSTOM) {
|
|
107
107
|
const validPermissions = strapi.contentAPI.permissions.providers.action.keys();
|
|
108
|
-
const invalidPermissions =
|
|
109
|
-
if (!
|
|
108
|
+
const invalidPermissions = _.difference(permissions, validPermissions);
|
|
109
|
+
if (!_.isEmpty(invalidPermissions)) {
|
|
110
110
|
throw new ValidationError(`Unknown permissions provided: ${invalidPermissions.join(', ')}`);
|
|
111
111
|
}
|
|
112
112
|
}
|
|
@@ -114,10 +114,10 @@ const UPDATABLE_FIELDS = [
|
|
|
114
114
|
/**
|
|
115
115
|
* Check if a token's lifespan is valid
|
|
116
116
|
*/ const isValidLifespan = (lifespan)=>{
|
|
117
|
-
if (
|
|
117
|
+
if (lifespan == null) {
|
|
118
118
|
return true;
|
|
119
119
|
}
|
|
120
|
-
if (!
|
|
120
|
+
if (!_.isNumber(lifespan) || !Object.values(constants.API_TOKEN_LIFESPANS).includes(lifespan)) {
|
|
121
121
|
return false;
|
|
122
122
|
}
|
|
123
123
|
return true;
|
|
@@ -232,7 +232,9 @@ const UPDATABLE_FIELDS = [
|
|
|
232
232
|
const anyUserPermHasAllFields = matchingUserPerms.some((p)=>!p.properties?.fields || p.properties.fields.length === 0);
|
|
233
233
|
const requestedFields = requested.properties?.fields;
|
|
234
234
|
if (!anyUserPermHasAllFields) {
|
|
235
|
-
const effectiveUserFields =
|
|
235
|
+
const effectiveUserFields = [
|
|
236
|
+
...new Set(matchingUserPerms.flatMap((p)=>p.properties?.fields || []))
|
|
237
|
+
];
|
|
236
238
|
// When the owner is field-restricted, omitting fields would widen access to all fields.
|
|
237
239
|
// Force explicit field selection so token scope can't exceed the owner's ceiling.
|
|
238
240
|
if (requestedFields === undefined || requestedFields === null) {
|
|
@@ -252,7 +254,9 @@ const UPDATABLE_FIELDS = [
|
|
|
252
254
|
// If any matching user perm is unconditional → token gets no conditions.
|
|
253
255
|
// Otherwise → union of conditions across matching perms.
|
|
254
256
|
const anyUserPermIsUnconditional = matchingUserPerms.some((p)=>!p.conditions || p.conditions.length === 0);
|
|
255
|
-
const enforcedConditions = anyUserPermIsUnconditional ? [] :
|
|
257
|
+
const enforcedConditions = anyUserPermIsUnconditional ? [] : [
|
|
258
|
+
...new Set(matchingUserPerms.flatMap((p)=>p.conditions || []))
|
|
259
|
+
];
|
|
256
260
|
return {
|
|
257
261
|
...requested,
|
|
258
262
|
conditions: enforcedConditions
|
|
@@ -292,7 +296,7 @@ const UPDATABLE_FIELDS = [
|
|
|
292
296
|
'action',
|
|
293
297
|
'actionParameters'
|
|
294
298
|
];
|
|
295
|
-
const pickComparableFields =
|
|
299
|
+
const pickComparableFields = (permission)=>_.pick(permission, COMPARABLE_FIELDS);
|
|
296
300
|
/**
|
|
297
301
|
* Helper to clean JSON (remove undefined values)
|
|
298
302
|
*/ const jsonClean = (data)=>JSON.parse(JSON.stringify(data));
|
|
@@ -300,7 +304,7 @@ const pickComparableFields = fp.pick(COMPARABLE_FIELDS);
|
|
|
300
304
|
* Compare two permissions for equality
|
|
301
305
|
*/ const arePermissionsEqual = (p1, p2)=>{
|
|
302
306
|
if (p1.action === p2.action) {
|
|
303
|
-
return
|
|
307
|
+
return _.isEqual(jsonClean(pickComparableFields(p1)), jsonClean(pickComparableFields(p2)));
|
|
304
308
|
}
|
|
305
309
|
return false;
|
|
306
310
|
};
|
|
@@ -323,10 +327,10 @@ const pickComparableFields = fp.pick(COMPARABLE_FIELDS);
|
|
|
323
327
|
}
|
|
324
328
|
}
|
|
325
329
|
});
|
|
326
|
-
const permissionsToAdd =
|
|
327
|
-
const permissionsToDelete =
|
|
330
|
+
const permissionsToAdd = _.differenceWith(permissionsWithToken, existingPermissions, arePermissionsEqual);
|
|
331
|
+
const permissionsToDelete = _.differenceWith(existingPermissions, permissionsWithToken, arePermissionsEqual);
|
|
328
332
|
if (permissionsToDelete.length > 0) {
|
|
329
|
-
await index.getService('permission').deleteByIds(permissionsToDelete.map(
|
|
333
|
+
await index.getService('permission').deleteByIds(permissionsToDelete.map((permission)=>permission?.id));
|
|
330
334
|
}
|
|
331
335
|
if (permissionsToAdd.length > 0) {
|
|
332
336
|
await createApiTokenAdminPermissions(tokenId, permissionsToAdd);
|
|
@@ -363,7 +367,9 @@ const pickComparableFields = fp.pick(COMPARABLE_FIELDS);
|
|
|
363
367
|
const anyUserPermHasAllFields = matchingUserPerms.some((p)=>!p.properties?.fields || p.properties.fields.length === 0);
|
|
364
368
|
const tokenFields = tokenPerm.properties?.fields;
|
|
365
369
|
const fieldCeilingExceeded = !anyUserPermHasAllFields && tokenFields !== undefined && tokenFields !== null && tokenFields.length > 0 && (()=>{
|
|
366
|
-
const effectiveUserFields =
|
|
370
|
+
const effectiveUserFields = [
|
|
371
|
+
...new Set(matchingUserPerms.flatMap((p)=>p.properties?.fields || []))
|
|
372
|
+
];
|
|
367
373
|
return tokenFields.some((f)=>!effectiveUserFields.includes(f));
|
|
368
374
|
})();
|
|
369
375
|
if (fieldCeilingExceeded) {
|
|
@@ -372,7 +378,9 @@ const pickComparableFields = fp.pick(COMPARABLE_FIELDS);
|
|
|
372
378
|
}
|
|
373
379
|
// Condition: force conditions to be the ones of the user permission(s)
|
|
374
380
|
const anyUserPermIsUnconditional = matchingUserPerms.some((p)=>!p.conditions || p.conditions.length === 0);
|
|
375
|
-
const enforcedConditions = anyUserPermIsUnconditional ? [] :
|
|
381
|
+
const enforcedConditions = anyUserPermIsUnconditional ? [] : [
|
|
382
|
+
...new Set(matchingUserPerms.flatMap((p)=>p.conditions || []))
|
|
383
|
+
];
|
|
376
384
|
const currentConditions = tokenPerm.conditions || [];
|
|
377
385
|
const conditionsChanged = enforcedConditions.length !== currentConditions.length || enforcedConditions.some((c)=>!currentConditions.includes(c));
|
|
378
386
|
if (conditionsChanged) {
|
|
@@ -454,7 +462,7 @@ const pickComparableFields = fp.pick(COMPARABLE_FIELDS);
|
|
|
454
462
|
/**
|
|
455
463
|
* Flatten a token's database permissions objects to an array of strings
|
|
456
464
|
*/ const flattenTokenPermissions = (permissions)=>{
|
|
457
|
-
return
|
|
465
|
+
return Array.isArray(permissions) ? Array.from(permissions, (permission)=>permission?.action) : [];
|
|
458
466
|
};
|
|
459
467
|
/**
|
|
460
468
|
* Get a token.
|
|
@@ -479,14 +487,14 @@ const pickComparableFields = fp.pick(COMPARABLE_FIELDS);
|
|
|
479
487
|
}
|
|
480
488
|
// Tokens created before kind introduction case: force kind to be content-api
|
|
481
489
|
const computedKind = token.kind ?? 'content-api';
|
|
482
|
-
const result =
|
|
490
|
+
const result = _.omit(token, [
|
|
483
491
|
'accessKey',
|
|
484
492
|
'encryptedKey',
|
|
485
493
|
'type',
|
|
486
494
|
'permissions',
|
|
487
495
|
'adminPermissions',
|
|
488
496
|
'adminUserOwner'
|
|
489
|
-
]
|
|
497
|
+
]);
|
|
490
498
|
if (computedKind === 'content-api') {
|
|
491
499
|
Object.assign(result, {
|
|
492
500
|
kind: 'content-api',
|
|
@@ -579,8 +587,8 @@ const authenticateAdminToken = async (accessToken)=>{
|
|
|
579
587
|
};
|
|
580
588
|
const getExpirationFields = (lifespan)=>{
|
|
581
589
|
// it must be nil or a finite number >= 0
|
|
582
|
-
const isValidNumber =
|
|
583
|
-
if (!isValidNumber &&
|
|
590
|
+
const isValidNumber = _.isNumber(lifespan) && Number.isFinite(lifespan) && lifespan > 0;
|
|
591
|
+
if (!isValidNumber && lifespan != null) {
|
|
584
592
|
throw new ValidationError('lifespan must be a positive number or null');
|
|
585
593
|
}
|
|
586
594
|
return {
|
|
@@ -604,11 +612,11 @@ const getExpirationFields = (lifespan)=>{
|
|
|
604
612
|
select: SELECT_FIELDS,
|
|
605
613
|
populate: POPULATE_FIELDS,
|
|
606
614
|
data: {
|
|
607
|
-
...
|
|
615
|
+
..._.omit(attributes, [
|
|
608
616
|
'permissions',
|
|
609
617
|
'adminPermissions',
|
|
610
618
|
'adminUserOwner'
|
|
611
|
-
]
|
|
619
|
+
]),
|
|
612
620
|
accessKey: hash(accessKey),
|
|
613
621
|
encryptedKey,
|
|
614
622
|
adminUserOwner: null,
|
|
@@ -622,7 +630,9 @@ const getExpirationFields = (lifespan)=>{
|
|
|
622
630
|
// If this is a custom type token, create the related content-API permissions
|
|
623
631
|
if (castedContentApiApiTokenBody.type === constants.API_TOKEN_TYPE.CUSTOM) {
|
|
624
632
|
// TODO: createMany doesn't seem to create relation properly, implement a better way rather than a ton of queries
|
|
625
|
-
await Promise.all(
|
|
633
|
+
await Promise.all([
|
|
634
|
+
...new Set(castedContentApiApiTokenBody.permissions)
|
|
635
|
+
].map((action)=>strapi.db.query('admin::api-token-permission').create({
|
|
626
636
|
data: {
|
|
627
637
|
action,
|
|
628
638
|
token: apiToken
|
|
@@ -650,10 +660,10 @@ const getExpirationFields = (lifespan)=>{
|
|
|
650
660
|
}
|
|
651
661
|
});
|
|
652
662
|
// Casted to any to avoid complex type duplication
|
|
653
|
-
return
|
|
663
|
+
return _.omit(result, [
|
|
654
664
|
'adminPermissions',
|
|
655
665
|
'adminUserOwner'
|
|
656
|
-
]
|
|
666
|
+
]);
|
|
657
667
|
}
|
|
658
668
|
// kind === 'admin'
|
|
659
669
|
assertAdminKindFields(attributes);
|
|
@@ -676,11 +686,11 @@ const getExpirationFields = (lifespan)=>{
|
|
|
676
686
|
select: SELECT_FIELDS,
|
|
677
687
|
populate: POPULATE_FIELDS,
|
|
678
688
|
data: {
|
|
679
|
-
...
|
|
689
|
+
..._.omit(attributes, [
|
|
680
690
|
'permissions',
|
|
681
691
|
'adminPermissions',
|
|
682
692
|
'adminUserOwner'
|
|
683
|
-
]
|
|
693
|
+
]),
|
|
684
694
|
accessKey: hash(accessKey),
|
|
685
695
|
encryptedKey,
|
|
686
696
|
adminUserOwner: ownerId,
|
|
@@ -715,9 +725,9 @@ const getExpirationFields = (lifespan)=>{
|
|
|
715
725
|
});
|
|
716
726
|
// Casted to any to avoid complex type duplication
|
|
717
727
|
return {
|
|
718
|
-
...
|
|
728
|
+
..._.omit(result, [
|
|
719
729
|
'permissions'
|
|
720
|
-
]
|
|
730
|
+
]),
|
|
721
731
|
adminUserOwner: toAdminTokenOwner(result.adminUserOwner)
|
|
722
732
|
};
|
|
723
733
|
};
|
|
@@ -763,9 +773,9 @@ const regenerate = async (id)=>{
|
|
|
763
773
|
}
|
|
764
774
|
});
|
|
765
775
|
return {
|
|
766
|
-
...
|
|
776
|
+
..._.omit(apiToken, [
|
|
767
777
|
'adminUserOwner'
|
|
768
|
-
]
|
|
778
|
+
]),
|
|
769
779
|
kind: apiToken.kind ?? 'content-api',
|
|
770
780
|
accessKey
|
|
771
781
|
};
|
|
@@ -835,18 +845,18 @@ For security reasons, prefer storing the secret in an environment variable and r
|
|
|
835
845
|
if (!tokens) {
|
|
836
846
|
return tokens;
|
|
837
847
|
}
|
|
838
|
-
return tokens.map((token)=>token.kind === null || token.kind === 'content-api' ?
|
|
839
|
-
'adminPermissions',
|
|
840
|
-
'adminUserOwner'
|
|
841
|
-
], {
|
|
848
|
+
return tokens.map((token)=>token.kind === null || token.kind === 'content-api' ? _.omit({
|
|
842
849
|
...token,
|
|
843
850
|
// Tokens created before kind introduction case: force kind to be content-api
|
|
844
851
|
kind: 'content-api',
|
|
845
852
|
permissions: flattenTokenPermissions(token.permissions)
|
|
846
|
-
}
|
|
847
|
-
|
|
853
|
+
}, [
|
|
854
|
+
'adminPermissions',
|
|
855
|
+
'adminUserOwner'
|
|
856
|
+
]) : {
|
|
857
|
+
..._.omit(token, [
|
|
848
858
|
'permissions'
|
|
849
|
-
]
|
|
859
|
+
]),
|
|
850
860
|
adminUserOwner: token.adminUserOwner !== null && token.adminUserOwner !== undefined ? toAdminTokenOwner(token.adminUserOwner) : null
|
|
851
861
|
});
|
|
852
862
|
};
|
|
@@ -898,14 +908,14 @@ For security reasons, prefer storing the secret in an environment variable and r
|
|
|
898
908
|
};
|
|
899
909
|
}
|
|
900
910
|
// content-api tokens (including legacy null-kind rows): normalise shape
|
|
901
|
-
return
|
|
902
|
-
'adminPermissions',
|
|
903
|
-
'adminUserOwner'
|
|
904
|
-
], {
|
|
911
|
+
return _.omit({
|
|
905
912
|
...deletedToken,
|
|
906
913
|
kind: 'content-api',
|
|
907
914
|
permissions: flattenTokenPermissions(deletedToken.permissions)
|
|
908
|
-
}
|
|
915
|
+
}, [
|
|
916
|
+
'adminPermissions',
|
|
917
|
+
'adminUserOwner'
|
|
918
|
+
]);
|
|
909
919
|
};
|
|
910
920
|
/**
|
|
911
921
|
* Update a token and its permissions
|
|
@@ -998,7 +1008,7 @@ For security reasons, prefer storing the secret in an environment variable and r
|
|
|
998
1008
|
}
|
|
999
1009
|
}
|
|
1000
1010
|
}
|
|
1001
|
-
const baseData =
|
|
1011
|
+
const baseData = _.pick(attributes, UPDATABLE_FIELDS);
|
|
1002
1012
|
// Migrate legacy null-kind rows to the explicit value on first write
|
|
1003
1013
|
if (originalToken.kind === null) {
|
|
1004
1014
|
baseData.kind = 'content-api';
|
|
@@ -1015,10 +1025,12 @@ For security reasons, prefer storing the secret in an environment variable and r
|
|
|
1015
1025
|
// custom tokens need to have their permissions updated as well
|
|
1016
1026
|
if (updatedToken.type === constants.API_TOKEN_TYPE.CUSTOM && incomingPermissions !== undefined) {
|
|
1017
1027
|
const currentPermissionsResult = await strapi.db.query('admin::api-token').load(updatedToken, 'permissions');
|
|
1018
|
-
const currentPermissions =
|
|
1019
|
-
const newPermissions =
|
|
1020
|
-
|
|
1021
|
-
|
|
1028
|
+
const currentPermissions = Array.from(currentPermissionsResult || [], (permission)=>permission?.action);
|
|
1029
|
+
const newPermissions = [
|
|
1030
|
+
...new Set(incomingPermissions || [])
|
|
1031
|
+
];
|
|
1032
|
+
const actionsToDelete = _.difference(currentPermissions, newPermissions);
|
|
1033
|
+
const actionsToAdd = _.difference(newPermissions, currentPermissions);
|
|
1022
1034
|
// TODO: improve efficiency here
|
|
1023
1035
|
await Promise.all(actionsToDelete.map((action)=>strapi.db.query('admin::api-token-permission').delete({
|
|
1024
1036
|
where: {
|