@strapi/admin 5.55.1 → 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/components/UpsellBanner.js +9 -16
- package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
- package/dist/admin/admin/src/components/UpsellBanner.mjs +11 -18
- package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
- 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/render.js +4 -69
- package/dist/admin/admin/src/render.js.map +1 -1
- package/dist/admin/admin/src/render.mjs +4 -69
- package/dist/admin/admin/src/render.mjs.map +1 -1
- package/dist/admin/admin/src/translations/en.json.js +15 -0
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +15 -0
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/admin/admin/src/utils/browserStrapi.js +93 -0
- package/dist/admin/admin/src/utils/browserStrapi.js.map +1 -0
- package/dist/admin/admin/src/utils/browserStrapi.mjs +91 -0
- package/dist/admin/admin/src/utils/browserStrapi.mjs.map +1 -0
- 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/hooks/useExportAuditLogs.js +2 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.mjs +2 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +16 -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 +16 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.js +3 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.mjs +3 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.js +64 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.js.map +1 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.mjs +60 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.mjs.map +1 -0
- package/dist/admin/ee/admin/src/services/auditLogs.js +2 -1
- package/dist/admin/ee/admin/src/services/auditLogs.js.map +1 -1
- package/dist/admin/ee/admin/src/services/auditLogs.mjs +2 -1
- package/dist/admin/ee/admin/src/services/auditLogs.mjs.map +1 -1
- package/dist/admin/src/components/MediaLibraryBanner.d.ts +10 -1
- package/dist/admin/src/components/SubNav.d.ts +2 -2
- 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/admin/src/utils/browserStrapi.d.ts +11 -0
- package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +15 -0
- package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.d.ts +14 -0
- package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +10 -1
- package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/admin.d.ts +2 -28
- 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/index.d.ts +1 -28
- package/dist/ee/server/src/controllers/index.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 +6 -30
- package/dist/ee/server/src/index.d.ts.map +1 -1
- package/dist/ee/server/src/services/auth.d.ts +1 -1
- package/dist/ee/server/src/services/auth.d.ts.map +1 -1
- package/dist/ee/server/src/services/index.d.ts +5 -2
- 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/ee/server/src/services/user.d.ts.map +1 -1
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +37 -21
- 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 +37 -21
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/admin.js +8 -7
- package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
- package/dist/server/ee/server/src/controllers/admin.mjs +8 -7
- 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/index.js +4 -0
- package/dist/server/ee/server/src/index.js.map +1 -1
- package/dist/server/ee/server/src/index.mjs +4 -0
- package/dist/server/ee/server/src/index.mjs.map +1 -1
- package/dist/server/ee/server/src/services/auth.js +1 -6
- package/dist/server/ee/server/src/services/auth.js.map +1 -1
- package/dist/server/ee/server/src/services/auth.mjs +2 -7
- package/dist/server/ee/server/src/services/auth.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 +37 -6
- package/dist/server/ee/server/src/services/user.js.map +1 -1
- package/dist/server/ee/server/src/services/user.mjs +38 -7
- 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 +169 -0
- package/dist/server/server/src/audit-logs/admin-users.js.map +1 -0
- package/dist/server/server/src/audit-logs/admin-users.mjs +157 -0
- package/dist/server/server/src/audit-logs/admin-users.mjs.map +1 -0
- 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 +106 -0
- package/dist/server/server/src/audit-logs/webhooks.js.map +1 -0
- package/dist/server/server/src/audit-logs/webhooks.mjs +100 -0
- package/dist/server/server/src/audit-logs/webhooks.mjs.map +1 -0
- 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 +4 -5
- package/dist/server/server/src/controllers/admin.js.map +1 -1
- package/dist/server/server/src/controllers/admin.mjs +3 -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/authentication.js +8 -1
- package/dist/server/server/src/controllers/authentication.js.map +1 -1
- package/dist/server/server/src/controllers/authentication.mjs +8 -1
- package/dist/server/server/src/controllers/authentication.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/controllers/webhooks.js +26 -0
- package/dist/server/server/src/controllers/webhooks.js.map +1 -1
- package/dist/server/server/src/controllers/webhooks.mjs +27 -1
- package/dist/server/server/src/controllers/webhooks.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/auth.js +27 -6
- package/dist/server/server/src/services/auth.js.map +1 -1
- package/dist/server/server/src/services/auth.mjs +28 -8
- package/dist/server/server/src/services/auth.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 +50 -12
- package/dist/server/server/src/services/user.js.map +1 -1
- package/dist/server/server/src/services/user.mjs +52 -14
- 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/admin-users.d.ts +119 -0
- package/dist/server/src/audit-logs/admin-users.d.ts.map +1 -0
- package/dist/server/src/audit-logs/tokens.d.ts.map +1 -1
- package/dist/server/src/audit-logs/webhooks.d.ts +59 -0
- package/dist/server/src/audit-logs/webhooks.d.ts.map +1 -0
- 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 +2 -11
- 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/authentication.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 +2 -11
- package/dist/server/src/controllers/index.d.ts.map +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/controllers/webhooks.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/domain/user.d.ts +2 -2
- package/dist/server/src/index.d.ts +4 -13
- 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/auth.d.ts +6 -1
- package/dist/server/src/services/auth.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/services/user.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/dist/shared/contracts/admin.d.ts +36 -2
- package/dist/shared/contracts/admin.d.ts.map +1 -1
- package/package.json +13 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-api-token.mjs","sources":["../../../../../server/src/strategies/content-api-token.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { castArray } from 'lodash
|
|
1
|
+
{"version":3,"file":"content-api-token.mjs","sources":["../../../../../server/src/strategies/content-api-token.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { castArray } from 'lodash';\n\nimport { errors } from '@strapi/utils';\nimport constants from '../services/constants';\nimport { getService } from '../utils';\nimport { extractToken, checkExpiry, updateLastUsedAt } from './api-token-utils';\nimport '@strapi/types';\n\nconst { UnauthorizedError, ForbiddenError } = errors;\n\nconst isReadScope = (scope: string) => scope.endsWith('find') || scope.endsWith('findOne');\n\n/**\n * Authenticate a content-api token. Rejects tokens with kind !== 'content-api'.\n */\nexport const authenticate = async (ctx: Context) => {\n const apiTokenService = getService('api-token-content-api');\n const token = extractToken(ctx);\n\n if (token === null) {\n return { authenticated: false };\n }\n\n const apiToken = await apiTokenService.getByAccessKey(apiTokenService.hash(token));\n\n if (apiToken === null || apiToken === undefined) {\n return { authenticated: false };\n }\n\n // Defensive kind check — only handle content-api tokens.\n // null kind is allowed: tokens created before the kind field was introduced are implicitly content-api.\n if (apiToken.kind !== 'content-api' && apiToken.kind !== null) {\n return { authenticated: false };\n }\n\n const expiryError = checkExpiry(apiToken);\n if (expiryError !== null) {\n return { authenticated: false, error: expiryError };\n }\n\n await updateLastUsedAt(apiToken);\n\n if (apiToken.type === constants.API_TOKEN_TYPE.CUSTOM) {\n const ability = await strapi.contentAPI.permissions.engine.generateAbility(\n apiToken.permissions.map((action: string) => ({ action }))\n );\n\n return { authenticated: true, ability, credentials: apiToken };\n }\n\n return { authenticated: true, credentials: apiToken };\n};\n\n/**\n * Verify the token has the required abilities for the requested scope.\n *\n * @type {import('.').VerifyFunction}\n */\nexport const verify = (auth: any, config: any) => {\n const { credentials: apiToken, ability } = auth;\n\n if (apiToken === null || apiToken === undefined) {\n throw new UnauthorizedError('Token not found');\n }\n\n const expiryError = checkExpiry(apiToken);\n if (expiryError !== null) {\n throw expiryError;\n }\n\n // Full access\n if (apiToken.type === constants.API_TOKEN_TYPE.FULL_ACCESS) {\n return;\n }\n\n // Read only\n if (apiToken.type === constants.API_TOKEN_TYPE.READ_ONLY) {\n const scopes = castArray(config.scope);\n\n if (config.scope && scopes.every(isReadScope)) {\n return;\n }\n }\n\n // Custom\n else if (apiToken.type === constants.API_TOKEN_TYPE.CUSTOM) {\n if (ability === null || ability === undefined) {\n throw new ForbiddenError();\n }\n\n const scopes = castArray(config.scope);\n const isAllowed = scopes.every((scope: string) => ability.can(scope));\n\n if (isAllowed === true) {\n return;\n }\n }\n\n throw new ForbiddenError();\n};\n\nexport default {\n name: 'content-api-token',\n authenticate,\n verify,\n};\n"],"names":["UnauthorizedError","ForbiddenError","errors","isReadScope","scope","endsWith","authenticate","ctx","apiTokenService","getService","token","extractToken","authenticated","apiToken","getByAccessKey","hash","undefined","kind","expiryError","checkExpiry","error","updateLastUsedAt","type","constants","API_TOKEN_TYPE","CUSTOM","ability","strapi","contentAPI","permissions","engine","generateAbility","map","action","credentials","verify","auth","config","FULL_ACCESS","READ_ONLY","scopes","castArray","every","isAllowed","can","name"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var dateFns = require('date-fns');
|
|
6
6
|
var utils = require('@strapi/utils');
|
|
7
|
-
var
|
|
7
|
+
var _ = require('lodash');
|
|
8
8
|
var index = require('../utils/index.js');
|
|
9
9
|
|
|
10
10
|
const { UnauthorizedError, ForbiddenError } = utils.errors;
|
|
@@ -41,7 +41,7 @@ const extractToken = (ctx)=>{
|
|
|
41
41
|
}
|
|
42
42
|
// Check if the token has expired
|
|
43
43
|
const currentDate = new Date();
|
|
44
|
-
if (
|
|
44
|
+
if (transferToken.expiresAt != null) {
|
|
45
45
|
const expirationDate = new Date(transferToken.expiresAt);
|
|
46
46
|
if (expirationDate < currentDate) {
|
|
47
47
|
return {
|
|
@@ -83,7 +83,7 @@ const extractToken = (ctx)=>{
|
|
|
83
83
|
throw new UnauthorizedError('Token not found');
|
|
84
84
|
}
|
|
85
85
|
const currentDate = new Date();
|
|
86
|
-
if (
|
|
86
|
+
if (transferToken.expiresAt != null) {
|
|
87
87
|
const expirationDate = new Date(transferToken.expiresAt);
|
|
88
88
|
// token has expired
|
|
89
89
|
if (expirationDate < currentDate) {
|
|
@@ -93,7 +93,7 @@ const extractToken = (ctx)=>{
|
|
|
93
93
|
if (!ability) {
|
|
94
94
|
throw new ForbiddenError();
|
|
95
95
|
}
|
|
96
|
-
const scopes =
|
|
96
|
+
const scopes = _.castArray(config.scope ?? []);
|
|
97
97
|
const isAllowed = scopes.every((scope)=>ability.can(scope));
|
|
98
98
|
if (!isAllowed) {
|
|
99
99
|
throw new ForbiddenError();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-transfer.js","sources":["../../../../../server/src/strategies/data-transfer.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { differenceInHours, parseISO } from 'date-fns';\nimport { errors } from '@strapi/utils';\nimport { castArray
|
|
1
|
+
{"version":3,"file":"data-transfer.js","sources":["../../../../../server/src/strategies/data-transfer.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { differenceInHours, parseISO } from 'date-fns';\nimport { errors } from '@strapi/utils';\nimport { castArray } from 'lodash';\n\nimport { getService } from '../utils';\n\nconst { UnauthorizedError, ForbiddenError } = errors;\n\nconst extractToken = (ctx: Context) => {\n if (ctx.request && ctx.request.header && ctx.request.header.authorization) {\n const parts = ctx.request.header.authorization.split(/\\s+/);\n\n if (parts[0].toLowerCase() !== 'bearer' || parts.length !== 2) {\n return null;\n }\n\n return parts[1];\n }\n\n return null;\n};\n\n/**\n * Authenticate the validity of the token\n *\n * @type {import('.').AuthenticateFunction}\n */\nexport const authenticate = async (ctx: Context) => {\n const { token: tokenService } = getService('transfer');\n const token = extractToken(ctx);\n\n if (!token) {\n return { authenticated: false };\n }\n\n const transferToken = await tokenService.getBy({ accessKey: tokenService.hash(token) });\n\n // Check if the token exists\n if (!transferToken) {\n return { authenticated: false };\n }\n\n // Check if the token has expired\n const currentDate = new Date();\n\n if (transferToken.expiresAt != null) {\n const expirationDate = new Date(transferToken.expiresAt);\n\n if (expirationDate < currentDate) {\n return { authenticated: false, error: new UnauthorizedError('Token expired') };\n }\n }\n\n // Update token metadata if the token has not been used in the last hour\n // @ts-expect-error - FIXME: verify lastUsedAt is defined\n const hoursSinceLastUsed = differenceInHours(currentDate, parseISO(transferToken.lastUsedAt));\n if (hoursSinceLastUsed >= 1) {\n await strapi.db.query('admin::api-token').update({\n where: { id: transferToken.id },\n data: { lastUsedAt: currentDate },\n });\n }\n\n // Generate an ability based on the token permissions\n const ability = await getService('transfer').permission.engine.generateAbility(\n transferToken.permissions.map((action: any) => ({ action }))\n );\n\n return { authenticated: true, ability, credentials: transferToken };\n};\n\n/**\n * Verify the token has the required abilities for the requested scope\n *\n * @type {import('.').VerifyFunction}\n */\nexport const verify = async (auth: any, config: any = {}) => {\n const { credentials: transferToken, ability } = auth;\n\n if (!transferToken) {\n throw new UnauthorizedError('Token not found');\n }\n\n const currentDate = new Date();\n\n if (transferToken.expiresAt != null) {\n const expirationDate = new Date(transferToken.expiresAt);\n // token has expired\n if (expirationDate < currentDate) {\n throw new UnauthorizedError('Token expired');\n }\n }\n\n if (!ability) {\n throw new ForbiddenError();\n }\n\n const scopes = castArray(config.scope ?? []);\n\n const isAllowed = scopes.every((scope) => ability.can(scope));\n\n if (!isAllowed) {\n throw new ForbiddenError();\n }\n};\n\nexport const name = 'data-transfer';\n\n/** @type {import('.').AuthStrategy} */\nexport default {\n name,\n authenticate,\n verify,\n};\n"],"names":["UnauthorizedError","ForbiddenError","errors","extractToken","ctx","request","header","authorization","parts","split","toLowerCase","length","authenticate","token","tokenService","getService","authenticated","transferToken","getBy","accessKey","hash","currentDate","Date","expiresAt","expirationDate","error","hoursSinceLastUsed","differenceInHours","parseISO","lastUsedAt","strapi","db","query","update","where","id","data","ability","permission","engine","generateAbility","permissions","map","action","credentials","verify","auth","config","scopes","castArray","scope","isAllowed","every","can","name"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { differenceInHours, parseISO } from 'date-fns';
|
|
2
2
|
import { errors } from '@strapi/utils';
|
|
3
|
-
import {
|
|
3
|
+
import { castArray } from 'lodash';
|
|
4
4
|
import { getService } from '../utils/index.mjs';
|
|
5
5
|
|
|
6
6
|
const { UnauthorizedError, ForbiddenError } = errors;
|
|
@@ -37,7 +37,7 @@ const extractToken = (ctx)=>{
|
|
|
37
37
|
}
|
|
38
38
|
// Check if the token has expired
|
|
39
39
|
const currentDate = new Date();
|
|
40
|
-
if (
|
|
40
|
+
if (transferToken.expiresAt != null) {
|
|
41
41
|
const expirationDate = new Date(transferToken.expiresAt);
|
|
42
42
|
if (expirationDate < currentDate) {
|
|
43
43
|
return {
|
|
@@ -79,7 +79,7 @@ const extractToken = (ctx)=>{
|
|
|
79
79
|
throw new UnauthorizedError('Token not found');
|
|
80
80
|
}
|
|
81
81
|
const currentDate = new Date();
|
|
82
|
-
if (
|
|
82
|
+
if (transferToken.expiresAt != null) {
|
|
83
83
|
const expirationDate = new Date(transferToken.expiresAt);
|
|
84
84
|
// token has expired
|
|
85
85
|
if (expirationDate < currentDate) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-transfer.mjs","sources":["../../../../../server/src/strategies/data-transfer.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { differenceInHours, parseISO } from 'date-fns';\nimport { errors } from '@strapi/utils';\nimport { castArray
|
|
1
|
+
{"version":3,"file":"data-transfer.mjs","sources":["../../../../../server/src/strategies/data-transfer.ts"],"sourcesContent":["import type { Context } from 'koa';\nimport { differenceInHours, parseISO } from 'date-fns';\nimport { errors } from '@strapi/utils';\nimport { castArray } from 'lodash';\n\nimport { getService } from '../utils';\n\nconst { UnauthorizedError, ForbiddenError } = errors;\n\nconst extractToken = (ctx: Context) => {\n if (ctx.request && ctx.request.header && ctx.request.header.authorization) {\n const parts = ctx.request.header.authorization.split(/\\s+/);\n\n if (parts[0].toLowerCase() !== 'bearer' || parts.length !== 2) {\n return null;\n }\n\n return parts[1];\n }\n\n return null;\n};\n\n/**\n * Authenticate the validity of the token\n *\n * @type {import('.').AuthenticateFunction}\n */\nexport const authenticate = async (ctx: Context) => {\n const { token: tokenService } = getService('transfer');\n const token = extractToken(ctx);\n\n if (!token) {\n return { authenticated: false };\n }\n\n const transferToken = await tokenService.getBy({ accessKey: tokenService.hash(token) });\n\n // Check if the token exists\n if (!transferToken) {\n return { authenticated: false };\n }\n\n // Check if the token has expired\n const currentDate = new Date();\n\n if (transferToken.expiresAt != null) {\n const expirationDate = new Date(transferToken.expiresAt);\n\n if (expirationDate < currentDate) {\n return { authenticated: false, error: new UnauthorizedError('Token expired') };\n }\n }\n\n // Update token metadata if the token has not been used in the last hour\n // @ts-expect-error - FIXME: verify lastUsedAt is defined\n const hoursSinceLastUsed = differenceInHours(currentDate, parseISO(transferToken.lastUsedAt));\n if (hoursSinceLastUsed >= 1) {\n await strapi.db.query('admin::api-token').update({\n where: { id: transferToken.id },\n data: { lastUsedAt: currentDate },\n });\n }\n\n // Generate an ability based on the token permissions\n const ability = await getService('transfer').permission.engine.generateAbility(\n transferToken.permissions.map((action: any) => ({ action }))\n );\n\n return { authenticated: true, ability, credentials: transferToken };\n};\n\n/**\n * Verify the token has the required abilities for the requested scope\n *\n * @type {import('.').VerifyFunction}\n */\nexport const verify = async (auth: any, config: any = {}) => {\n const { credentials: transferToken, ability } = auth;\n\n if (!transferToken) {\n throw new UnauthorizedError('Token not found');\n }\n\n const currentDate = new Date();\n\n if (transferToken.expiresAt != null) {\n const expirationDate = new Date(transferToken.expiresAt);\n // token has expired\n if (expirationDate < currentDate) {\n throw new UnauthorizedError('Token expired');\n }\n }\n\n if (!ability) {\n throw new ForbiddenError();\n }\n\n const scopes = castArray(config.scope ?? []);\n\n const isAllowed = scopes.every((scope) => ability.can(scope));\n\n if (!isAllowed) {\n throw new ForbiddenError();\n }\n};\n\nexport const name = 'data-transfer';\n\n/** @type {import('.').AuthStrategy} */\nexport default {\n name,\n authenticate,\n verify,\n};\n"],"names":["UnauthorizedError","ForbiddenError","errors","extractToken","ctx","request","header","authorization","parts","split","toLowerCase","length","authenticate","token","tokenService","getService","authenticated","transferToken","getBy","accessKey","hash","currentDate","Date","expiresAt","expirationDate","error","hoursSinceLastUsed","differenceInHours","parseISO","lastUsedAt","strapi","db","query","update","where","id","data","ability","permission","engine","generateAbility","permissions","map","action","credentials","verify","auth","config","scopes","castArray","scope","isAllowed","every","can","name"],"mappings":"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"}
|
|
@@ -4,7 +4,6 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var utils = require('@strapi/utils');
|
|
6
6
|
var _ = require('lodash');
|
|
7
|
-
var fp = require('lodash/fp');
|
|
8
7
|
var index$1 = require('../utils/index.js');
|
|
9
8
|
var index = require('../domain/action/index.js');
|
|
10
9
|
var checkFieldsAreCorrectlyNested = require('./common-functions/check-fields-are-correctly-nested.js');
|
|
@@ -53,10 +52,10 @@ const permissionsAreEquals = (a, b)=>a.action === b.action && (a.subject === b.s
|
|
|
53
52
|
const checkNoDuplicatedPermissions = (permissions)=>!Array.isArray(permissions) || permissions.every((permA, i)=>permissions.slice(i + 1).every((permB)=>!permissionsAreEquals(permA, permB)));
|
|
54
53
|
const checkNilFields = (action)=>function checkNilActionFields(fields) {
|
|
55
54
|
// If the parent has no action field, then we ignore this test
|
|
56
|
-
if (
|
|
55
|
+
if (action == null) {
|
|
57
56
|
return true;
|
|
58
57
|
}
|
|
59
|
-
return index.appliesToProperty('fields', action) ||
|
|
58
|
+
return index.appliesToProperty('fields', action) || fields == null;
|
|
60
59
|
};
|
|
61
60
|
const fieldsPropertyValidation = (action)=>utils.yup.array().of(utils.yup.string()).nullable().test('field-nested', 'Fields format are incorrect (bad nesting).', checkFieldsAreCorrectlyNested).test('field-nested', 'Fields format are incorrect (duplicates).', checkFieldsDontHaveDuplicates).test('fields-restriction', // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder
|
|
62
61
|
'The permission at ${path} must have fields set to null or undefined', // @ts-expect-error yup types
|
|
@@ -64,7 +63,7 @@ const fieldsPropertyValidation = (action)=>utils.yup.array().of(utils.yup.string
|
|
|
64
63
|
const permission = utils.yup.object().shape({
|
|
65
64
|
action: utils.yup.string().required().test('action-validity', 'action is not an existing permission action', function checkActionValidity(actionId) {
|
|
66
65
|
// If the action field is Nil, ignore the test and let the required check handle the error
|
|
67
|
-
if (
|
|
66
|
+
if (actionId == null) {
|
|
68
67
|
return true;
|
|
69
68
|
}
|
|
70
69
|
const action = getActionFromProvider(actionId);
|
|
@@ -77,10 +76,10 @@ const permission = utils.yup.object().shape({
|
|
|
77
76
|
if (!action) {
|
|
78
77
|
return true;
|
|
79
78
|
}
|
|
80
|
-
if (
|
|
81
|
-
return
|
|
79
|
+
if (action.subjects == null) {
|
|
80
|
+
return subject == null;
|
|
82
81
|
}
|
|
83
|
-
if (
|
|
82
|
+
if (Array.isArray(action.subjects) && subject != null) {
|
|
84
83
|
return action.subjects.includes(subject);
|
|
85
84
|
}
|
|
86
85
|
return false;
|
|
@@ -89,15 +88,15 @@ const permission = utils.yup.object().shape({
|
|
|
89
88
|
'Invalid property set at ${path}', function checkPropertiesStructure(properties) {
|
|
90
89
|
// @ts-expect-error yup types
|
|
91
90
|
const action = getActionFromProvider(this.options.parent.action);
|
|
92
|
-
const hasNoProperties =
|
|
93
|
-
if (!
|
|
91
|
+
const hasNoProperties = _.isEmpty(properties) || properties == null;
|
|
92
|
+
if (!_.has(action, 'options.applyToProperties')) {
|
|
94
93
|
return hasNoProperties;
|
|
95
94
|
}
|
|
96
95
|
if (hasNoProperties) {
|
|
97
96
|
return true;
|
|
98
97
|
}
|
|
99
98
|
const { applyToProperties } = action.options;
|
|
100
|
-
if (!
|
|
99
|
+
if (!Array.isArray(applyToProperties)) {
|
|
101
100
|
return false;
|
|
102
101
|
}
|
|
103
102
|
return Object.keys(properties).every((property)=>applyToProperties.includes(property));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common-validators.js","sources":["../../../../../server/src/validation/common-validators.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\nimport _ from 'lodash';\nimport { isEmpty, has, isNil, isArray } from 'lodash/fp';\nimport { getService } from '../utils';\nimport actionDomain, { type Action } from '../domain/action';\nimport { checkFieldsAreCorrectlyNested, checkFieldsDontHaveDuplicates } from './common-functions';\nimport actions from '../domain/action/index';\n\nconst { actionFields } = actions;\n\nconst getActionFromProvider = (actionId: string) => {\n return getService('permission').actionProvider.get(actionId);\n};\n\nexport const email = yup.string().email().lowercase();\n\nexport const firstname = yup.string().trim().min(1);\n\nexport const lastname = yup.string();\n\nexport const username = yup.string().min(1);\n\nexport const password = yup\n .string()\n .min(8)\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .test('required-byte-size', '${path} must be less than 73 bytes', function checkByteSize(value) {\n if (!value) return true;\n\n const byteSize = new TextEncoder().encode(value).length;\n return byteSize <= 72;\n })\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .matches(/[a-z]/, '${path} must contain at least one lowercase character')\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .matches(/[A-Z]/, '${path} must contain at least one uppercase character')\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .matches(/\\d/, '${path} must contain at least one number');\n\nexport const roles = yup.array(yup.strapiID()).min(1);\n\nconst isAPluginName = yup\n .string()\n .test('is-a-plugin-name', 'is not a plugin name', function checkPluginName(value) {\n return [undefined, 'admin', ...Object.keys(strapi.plugins)].includes(value)\n ? true\n : this.createError({ path: this.path, message: `${this.path} is not an existing plugin` });\n });\n\nexport const arrayOfConditionNames = yup\n .array()\n .of(yup.string())\n .test('is-an-array-of-conditions', 'is not a plugin name', function checkConditionNames(value) {\n const ids = strapi.service('admin::permission').conditionProvider.keys();\n return _.isUndefined(value) || _.difference(value, ids).length === 0\n ? true\n : this.createError({ path: this.path, message: `contains conditions that don't exist` });\n });\n\nexport const permissionsAreEquals = (a: any, b: any) =>\n a.action === b.action && (a.subject === b.subject || (_.isNil(a.subject) && _.isNil(b.subject)));\n\nconst checkNoDuplicatedPermissions = (permissions: unknown) =>\n !Array.isArray(permissions) ||\n permissions.every((permA, i) =>\n permissions.slice(i + 1).every((permB) => !permissionsAreEquals(permA, permB))\n );\n\nconst checkNilFields = (action: Action) =>\n function checkNilActionFields(fields: typeof actionFields) {\n // If the parent has no action field, then we ignore this test\n if (isNil(action)) {\n return true;\n }\n\n return actionDomain.appliesToProperty('fields', action) || isNil(fields);\n };\n\nconst fieldsPropertyValidation = (action: Action) =>\n yup\n .array()\n .of(yup.string())\n .nullable()\n .test(\n 'field-nested',\n 'Fields format are incorrect (bad nesting).',\n checkFieldsAreCorrectlyNested\n )\n .test(\n 'field-nested',\n 'Fields format are incorrect (duplicates).',\n checkFieldsDontHaveDuplicates\n )\n .test(\n 'fields-restriction',\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n 'The permission at ${path} must have fields set to null or undefined',\n // @ts-expect-error yup types\n checkNilFields(action)\n );\n\nexport const permission = yup\n .object()\n .shape({\n action: yup\n .string()\n .required()\n .test(\n 'action-validity',\n 'action is not an existing permission action',\n function checkActionValidity(actionId) {\n // If the action field is Nil, ignore the test and let the required check handle the error\n if (isNil(actionId)) {\n return true;\n }\n\n const action = getActionFromProvider(actionId);\n\n return action !== undefined && action !== null;\n }\n ),\n actionParameters: yup.object().nullable(),\n subject: yup\n .string()\n .nullable()\n .test(\n 'subject-validity',\n 'Invalid subject submitted',\n function checkSubjectValidity(subject) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action);\n\n if (!action) {\n return true;\n }\n\n if (isNil(action.subjects)) {\n return isNil(subject);\n }\n\n if (isArray(action.subjects) && !isNil(subject)) {\n return action.subjects.includes(subject);\n }\n\n return false;\n }\n ),\n properties: yup\n .object()\n .test(\n 'properties-structure',\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n 'Invalid property set at ${path}',\n function checkPropertiesStructure(properties) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action) as any;\n const hasNoProperties = isEmpty(properties) || isNil(properties);\n\n if (!has('options.applyToProperties', action)) {\n return hasNoProperties;\n }\n\n if (hasNoProperties) {\n return true;\n }\n\n const { applyToProperties } = action.options;\n\n if (!isArray(applyToProperties)) {\n return false;\n }\n\n return Object.keys(properties).every((property) => applyToProperties.includes(property));\n }\n )\n .test(\n 'fields-property',\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n 'Invalid fields property at ${path}',\n async function checkFieldsProperty(properties = {}) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action) as any;\n\n if (!action || !properties) {\n return true;\n }\n\n if (!actionDomain.appliesToProperty('fields', action)) {\n return true;\n }\n\n try {\n await fieldsPropertyValidation(action).validate(properties.fields, {\n strict: true,\n abortEarly: false,\n });\n return true;\n } catch (e: any) {\n // Propagate fieldsPropertyValidation error with updated path\n throw this.createError({\n message: e.message,\n path: `${this.path}.fields`,\n });\n }\n }\n ),\n conditions: yup.array().of(yup.string()),\n })\n .noUnknown();\n\nexport const updatePermissions = yup\n .object()\n .shape({\n permissions: yup\n .array()\n .required()\n .of(permission)\n .test(\n 'duplicated-permissions',\n 'Some permissions are duplicated (same action and subject)',\n checkNoDuplicatedPermissions\n ),\n })\n .required()\n .noUnknown();\n\nexport default {\n email,\n firstname,\n lastname,\n username,\n password,\n roles,\n isAPluginName,\n arrayOfConditionNames,\n permission,\n updatePermissions,\n};\n"],"names":["actionFields","actions","getActionFromProvider","actionId","getService","actionProvider","get","email","yup","string","lowercase","firstname","trim","min","lastname","username","password","test","checkByteSize","value","byteSize","TextEncoder","encode","length","matches","roles","array","strapiID","isAPluginName","checkPluginName","undefined","Object","keys","strapi","plugins","includes","createError","path","message","of","checkConditionNames","ids","service","conditionProvider","_","isUndefined","difference","permissionsAreEquals","a","b","action","subject","isNil","checkNoDuplicatedPermissions","permissions","Array","isArray","every","permA","i","slice","permB","checkNilFields","checkNilActionFields","fields","actionDomain","appliesToProperty","fieldsPropertyValidation","nullable","checkFieldsAreCorrectlyNested","checkFieldsDontHaveDuplicates","permission","object","shape","required","checkActionValidity","actionParameters","checkSubjectValidity","options","parent","subjects","properties","checkPropertiesStructure","hasNoProperties","isEmpty","has","applyToProperties","property","checkFieldsProperty","validate","strict","abortEarly","e","conditions","noUnknown","updatePermissions","arrayOfConditionNames"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"common-validators.js","sources":["../../../../../server/src/validation/common-validators.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\nimport _, { isEmpty, has } from 'lodash';\n\nimport { getService } from '../utils';\nimport actionDomain, { type Action } from '../domain/action';\nimport { checkFieldsAreCorrectlyNested, checkFieldsDontHaveDuplicates } from './common-functions';\nimport actions from '../domain/action/index';\n\nconst { actionFields } = actions;\n\nconst getActionFromProvider = (actionId: string) => {\n return getService('permission').actionProvider.get(actionId);\n};\n\nexport const email = yup.string().email().lowercase();\n\nexport const firstname = yup.string().trim().min(1);\n\nexport const lastname = yup.string();\n\nexport const username = yup.string().min(1);\n\nexport const password = yup\n .string()\n .min(8)\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .test('required-byte-size', '${path} must be less than 73 bytes', function checkByteSize(value) {\n if (!value) return true;\n\n const byteSize = new TextEncoder().encode(value).length;\n return byteSize <= 72;\n })\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .matches(/[a-z]/, '${path} must contain at least one lowercase character')\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .matches(/[A-Z]/, '${path} must contain at least one uppercase character')\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .matches(/\\d/, '${path} must contain at least one number');\n\nexport const roles = yup.array(yup.strapiID()).min(1);\n\nconst isAPluginName = yup\n .string()\n .test('is-a-plugin-name', 'is not a plugin name', function checkPluginName(value) {\n return [undefined, 'admin', ...Object.keys(strapi.plugins)].includes(value)\n ? true\n : this.createError({ path: this.path, message: `${this.path} is not an existing plugin` });\n });\n\nexport const arrayOfConditionNames = yup\n .array()\n .of(yup.string())\n .test('is-an-array-of-conditions', 'is not a plugin name', function checkConditionNames(value) {\n const ids = strapi.service('admin::permission').conditionProvider.keys();\n return _.isUndefined(value) || _.difference(value, ids).length === 0\n ? true\n : this.createError({ path: this.path, message: `contains conditions that don't exist` });\n });\n\nexport const permissionsAreEquals = (a: any, b: any) =>\n a.action === b.action && (a.subject === b.subject || (_.isNil(a.subject) && _.isNil(b.subject)));\n\nconst checkNoDuplicatedPermissions = (permissions: unknown) =>\n !Array.isArray(permissions) ||\n permissions.every((permA, i) =>\n permissions.slice(i + 1).every((permB) => !permissionsAreEquals(permA, permB))\n );\n\nconst checkNilFields = (action: Action) =>\n function checkNilActionFields(fields: typeof actionFields) {\n // If the parent has no action field, then we ignore this test\n if (action == null) {\n return true;\n }\n\n return actionDomain.appliesToProperty('fields', action) || fields == null;\n };\n\nconst fieldsPropertyValidation = (action: Action) =>\n yup\n .array()\n .of(yup.string())\n .nullable()\n .test(\n 'field-nested',\n 'Fields format are incorrect (bad nesting).',\n checkFieldsAreCorrectlyNested\n )\n .test(\n 'field-nested',\n 'Fields format are incorrect (duplicates).',\n checkFieldsDontHaveDuplicates\n )\n .test(\n 'fields-restriction',\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n 'The permission at ${path} must have fields set to null or undefined',\n // @ts-expect-error yup types\n checkNilFields(action)\n );\n\nexport const permission = yup\n .object()\n .shape({\n action: yup\n .string()\n .required()\n .test(\n 'action-validity',\n 'action is not an existing permission action',\n function checkActionValidity(actionId) {\n // If the action field is Nil, ignore the test and let the required check handle the error\n if (actionId == null) {\n return true;\n }\n\n const action = getActionFromProvider(actionId);\n\n return action !== undefined && action !== null;\n }\n ),\n actionParameters: yup.object().nullable(),\n subject: yup\n .string()\n .nullable()\n .test(\n 'subject-validity',\n 'Invalid subject submitted',\n function checkSubjectValidity(subject) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action);\n\n if (!action) {\n return true;\n }\n\n if (action.subjects == null) {\n return subject == null;\n }\n\n if (Array.isArray(action.subjects) && subject != null) {\n return action.subjects.includes(subject);\n }\n\n return false;\n }\n ),\n properties: yup\n .object()\n .test(\n 'properties-structure',\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n 'Invalid property set at ${path}',\n function checkPropertiesStructure(properties) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action) as any;\n const hasNoProperties = isEmpty(properties) || properties == null;\n\n if (!has(action, 'options.applyToProperties')) {\n return hasNoProperties;\n }\n\n if (hasNoProperties) {\n return true;\n }\n\n const { applyToProperties } = action.options;\n\n if (!Array.isArray(applyToProperties)) {\n return false;\n }\n\n return Object.keys(properties).every((property) => applyToProperties.includes(property));\n }\n )\n .test(\n 'fields-property',\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n 'Invalid fields property at ${path}',\n async function checkFieldsProperty(properties = {}) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action) as any;\n\n if (!action || !properties) {\n return true;\n }\n\n if (!actionDomain.appliesToProperty('fields', action)) {\n return true;\n }\n\n try {\n await fieldsPropertyValidation(action).validate(properties.fields, {\n strict: true,\n abortEarly: false,\n });\n return true;\n } catch (e: any) {\n // Propagate fieldsPropertyValidation error with updated path\n throw this.createError({\n message: e.message,\n path: `${this.path}.fields`,\n });\n }\n }\n ),\n conditions: yup.array().of(yup.string()),\n })\n .noUnknown();\n\nexport const updatePermissions = yup\n .object()\n .shape({\n permissions: yup\n .array()\n .required()\n .of(permission)\n .test(\n 'duplicated-permissions',\n 'Some permissions are duplicated (same action and subject)',\n checkNoDuplicatedPermissions\n ),\n })\n .required()\n .noUnknown();\n\nexport default {\n email,\n firstname,\n lastname,\n username,\n password,\n roles,\n isAPluginName,\n arrayOfConditionNames,\n permission,\n updatePermissions,\n};\n"],"names":["actionFields","actions","getActionFromProvider","actionId","getService","actionProvider","get","email","yup","string","lowercase","firstname","trim","min","lastname","username","password","test","checkByteSize","value","byteSize","TextEncoder","encode","length","matches","roles","array","strapiID","isAPluginName","checkPluginName","undefined","Object","keys","strapi","plugins","includes","createError","path","message","of","checkConditionNames","ids","service","conditionProvider","_","isUndefined","difference","permissionsAreEquals","a","b","action","subject","isNil","checkNoDuplicatedPermissions","permissions","Array","isArray","every","permA","i","slice","permB","checkNilFields","checkNilActionFields","fields","actionDomain","appliesToProperty","fieldsPropertyValidation","nullable","checkFieldsAreCorrectlyNested","checkFieldsDontHaveDuplicates","permission","object","shape","required","checkActionValidity","actionParameters","checkSubjectValidity","options","parent","subjects","properties","checkPropertiesStructure","hasNoProperties","isEmpty","has","applyToProperties","property","checkFieldsProperty","validate","strict","abortEarly","e","conditions","noUnknown","updatePermissions","arrayOfConditionNames"],"mappings":";;;;;;;;;;;;;;;AAQA,MAAM,EAAEA,YAAY,EAAE,GAAGC,KAAAA;AAEzB,MAAMC,wBAAwB,CAACC,QAAAA,GAAAA;AAC7B,IAAA,OAAOC,kBAAAA,CAAW,YAAA,CAAA,CAAcC,cAAc,CAACC,GAAG,CAACH,QAAAA,CAAAA;AACrD,CAAA;AAEO,MAAMI,QAAQC,SAAAA,CAAIC,MAAM,GAAGF,KAAK,EAAA,CAAGG,SAAS;AAE5C,MAAMC,YAAYH,SAAAA,CAAIC,MAAM,GAAGG,IAAI,EAAA,CAAGC,GAAG,CAAC,CAAA;AAE1C,MAAMC,QAAAA,GAAWN,SAAAA,CAAIC,MAAM;MAErBM,QAAAA,GAAWP,SAAAA,CAAIC,MAAM,EAAA,CAAGI,GAAG,CAAC,CAAA;AAElC,MAAMG,WAAWR,SAAAA,CACrBC,MAAM,GACNI,GAAG,CAAC,EACL;AACCI,CAAAA,IAAI,CAAC,oBAAA,EAAsB,oCAAA,EAAsC,SAASC,cAAcC,KAAK,EAAA;IAC5F,IAAI,CAACA,OAAO,OAAO,IAAA;AAEnB,IAAA,MAAMC,WAAW,IAAIC,WAAAA,EAAAA,CAAcC,MAAM,CAACH,OAAOI,MAAM;AACvD,IAAA,OAAOH,QAAAA,IAAY,EAAA;AACrB,CAAA,CACA;CACCI,OAAO,CAAC,OAAA,EAAS,uDAAA,CAClB;CACCA,OAAO,CAAC,OAAA,EAAS,uDAAA,CAClB;CACCA,OAAO,CAAC,MAAM,0CAAA;AAEV,MAAMC,KAAAA,GAAQjB,SAAAA,CAAIkB,KAAK,CAAClB,UAAImB,QAAQ,EAAA,CAAA,CAAId,GAAG,CAAC,CAAA;AAEnD,MAAMe,aAAAA,GAAgBpB,SAAAA,CACnBC,MAAM,EAAA,CACNQ,IAAI,CAAC,kBAAA,EAAoB,sBAAA,EAAwB,SAASY,eAAAA,CAAgBV,KAAK,EAAA;IAC9E,OAAO;AAACW,QAAAA,SAAAA;AAAW,QAAA,OAAA;WAAYC,MAAAA,CAAOC,IAAI,CAACC,MAAAA,CAAOC,OAAO;AAAE,KAAA,CAACC,QAAQ,CAAChB,KAAAA,CAAAA,GACjE,OACA,IAAI,CAACiB,WAAW,CAAC;QAAEC,IAAAA,EAAM,IAAI,CAACA,IAAI;AAAEC,QAAAA,OAAAA,EAAS,GAAG,IAAI,CAACD,IAAI,CAAC,0BAA0B;AAAE,KAAA,CAAA;AAC5F,CAAA,CAAA;AAEmC7B,SAAAA,CAClCkB,KAAK,EAAA,CACLa,EAAE,CAAC/B,SAAAA,CAAIC,MAAM,EAAA,CAAA,CACbQ,IAAI,CAAC,2BAAA,EAA6B,sBAAA,EAAwB,SAASuB,oBAAoBrB,KAAK,EAAA;AAC3F,IAAA,MAAMsB,MAAMR,MAAAA,CAAOS,OAAO,CAAC,mBAAA,CAAA,CAAqBC,iBAAiB,CAACX,IAAI,EAAA;AACtE,IAAA,OAAOY,mBAAEC,WAAW,CAAC1B,KAAAA,CAAAA,IAAUyB,kBAAAA,CAAEE,UAAU,CAAC3B,KAAAA,EAAOsB,GAAAA,CAAAA,CAAKlB,MAAM,KAAK,CAAA,GAC/D,IAAA,GACA,IAAI,CAACa,WAAW,CAAC;QAAEC,IAAAA,EAAM,IAAI,CAACA,IAAI;QAAEC,OAAAA,EAAS,CAAC,oCAAoC;AAAE,KAAA,CAAA;AAC1F,CAAA;AAEK,MAAMS,oBAAAA,GAAuB,CAACC,CAAAA,EAAQC,CAAAA,GAC3CD,CAAAA,CAAEE,MAAM,KAAKD,CAAAA,CAAEC,MAAM,KAAKF,EAAEG,OAAO,KAAKF,CAAAA,CAAEE,OAAO,IAAKP,kBAAAA,CAAEQ,KAAK,CAACJ,CAAAA,CAAEG,OAAO,CAAA,IAAKP,kBAAAA,CAAEQ,KAAK,CAACH,CAAAA,CAAEE,OAAO,CAAC;AAEhG,MAAME,4BAAAA,GAA+B,CAACC,WAAAA,GACpC,CAACC,KAAAA,CAAMC,OAAO,CAACF,WAAAA,CAAAA,IACfA,WAAAA,CAAYG,KAAK,CAAC,CAACC,OAAOC,CAAAA,GACxBL,WAAAA,CAAYM,KAAK,CAACD,CAAAA,GAAI,CAAA,CAAA,CAAGF,KAAK,CAAC,CAACI,KAAAA,GAAU,CAACd,oBAAAA,CAAqBW,KAAAA,EAAOG,KAAAA,CAAAA,CAAAA,CAAAA;AAG3E,MAAMC,cAAAA,GAAiB,CAACZ,MAAAA,GACtB,SAASa,qBAAqBC,MAA2B,EAAA;;AAEvD,QAAA,IAAId,UAAU,IAAA,EAAM;YAClB,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,OAAOe,KAAAA,CAAaC,iBAAiB,CAAC,QAAA,EAAUhB,WAAWc,MAAAA,IAAU,IAAA;AACvE,IAAA,CAAA;AAEF,MAAMG,wBAAAA,GAA2B,CAACjB,MAAAA,GAChC1C,SAAAA,CACGkB,KAAK,EAAA,CACLa,EAAE,CAAC/B,SAAAA,CAAIC,MAAM,EAAA,CAAA,CACb2D,QAAQ,EAAA,CACRnD,IAAI,CACH,cAAA,EACA,4CAAA,EACAoD,6BAAAA,CAAAA,CAEDpD,IAAI,CACH,cAAA,EACA,2CAAA,EACAqD,6BAAAA,CAAAA,CAEDrD,IAAI,CACH,oBAAA;AAEA,IAAA,qEAAA;IAEA6C,cAAAA,CAAeZ,MAAAA,CAAAA,CAAAA;MAGRqB,UAAAA,GAAa/D,SAAAA,CACvBgE,MAAM,EAAA,CACNC,KAAK,CAAC;IACLvB,MAAAA,EAAQ1C,SAAAA,CACLC,MAAM,EAAA,CACNiE,QAAQ,EAAA,CACRzD,IAAI,CACH,iBAAA,EACA,6CAAA,EACA,SAAS0D,mBAAAA,CAAoBxE,QAAQ,EAAA;;AAEnC,QAAA,IAAIA,YAAY,IAAA,EAAM;YACpB,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,MAAM+C,SAAShD,qBAAAA,CAAsBC,QAAAA,CAAAA;QAErC,OAAO+C,MAAAA,KAAWpB,aAAaoB,MAAAA,KAAW,IAAA;AAC5C,IAAA,CAAA,CAAA;IAEJ0B,gBAAAA,EAAkBpE,SAAAA,CAAIgE,MAAM,EAAA,CAAGJ,QAAQ,EAAA;IACvCjB,OAAAA,EAAS3C,SAAAA,CACNC,MAAM,EAAA,CACN2D,QAAQ,EAAA,CACRnD,IAAI,CACH,kBAAA,EACA,2BAAA,EACA,SAAS4D,oBAAAA,CAAqB1B,OAAO,EAAA;;QAEnC,MAAMD,MAAAA,GAAShD,sBAAsB,IAAI,CAAC4E,OAAO,CAACC,MAAM,CAAC7B,MAAM,CAAA;AAE/D,QAAA,IAAI,CAACA,MAAAA,EAAQ;YACX,OAAO,IAAA;AACT,QAAA;QAEA,IAAIA,MAAAA,CAAO8B,QAAQ,IAAI,IAAA,EAAM;AAC3B,YAAA,OAAO7B,OAAAA,IAAW,IAAA;AACpB,QAAA;AAEA,QAAA,IAAII,MAAMC,OAAO,CAACN,OAAO8B,QAAQ,CAAA,IAAK7B,WAAW,IAAA,EAAM;AACrD,YAAA,OAAOD,MAAAA,CAAO8B,QAAQ,CAAC7C,QAAQ,CAACgB,OAAAA,CAAAA;AAClC,QAAA;QAEA,OAAO,KAAA;AACT,IAAA,CAAA,CAAA;AAEJ8B,IAAAA,UAAAA,EAAYzE,UACTgE,MAAM,EAAA,CACNvD,IAAI,CACH;IAEA,iCAAA,EACA,SAASiE,yBAAyBD,UAAU,EAAA;;QAE1C,MAAM/B,MAAAA,GAAShD,sBAAsB,IAAI,CAAC4E,OAAO,CAACC,MAAM,CAAC7B,MAAM,CAAA;QAC/D,MAAMiC,eAAAA,GAAkBC,SAAAA,CAAQH,UAAAA,CAAAA,IAAeA,UAAAA,IAAc,IAAA;QAE7D,IAAI,CAACI,KAAAA,CAAInC,MAAAA,EAAQ,2BAAA,CAAA,EAA8B;YAC7C,OAAOiC,eAAAA;AACT,QAAA;AAEA,QAAA,IAAIA,eAAAA,EAAiB;YACnB,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,MAAM,EAAEG,iBAAiB,EAAE,GAAGpC,OAAO4B,OAAO;AAE5C,QAAA,IAAI,CAACvB,KAAAA,CAAMC,OAAO,CAAC8B,iBAAAA,CAAAA,EAAoB;YACrC,OAAO,KAAA;AACT,QAAA;QAEA,OAAOvD,MAAAA,CAAOC,IAAI,CAACiD,UAAAA,CAAAA,CAAYxB,KAAK,CAAC,CAAC8B,QAAAA,GAAaD,iBAAAA,CAAkBnD,QAAQ,CAACoD,QAAAA,CAAAA,CAAAA;IAChF,CAAA,CAAA,CAEDtE,IAAI,CACH,iBAAA;AAEA,IAAA,oCAAA,EACA,eAAeuE,mBAAAA,CAAoBP,UAAAA,GAAa,EAAE,EAAA;;QAEhD,MAAM/B,MAAAA,GAAShD,sBAAsB,IAAI,CAAC4E,OAAO,CAACC,MAAM,CAAC7B,MAAM,CAAA;QAE/D,IAAI,CAACA,MAAAA,IAAU,CAAC+B,UAAAA,EAAY;YAC1B,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,IAAI,CAAChB,KAAAA,CAAaC,iBAAiB,CAAC,UAAUhB,MAAAA,CAAAA,EAAS;YACrD,OAAO,IAAA;AACT,QAAA;QAEA,IAAI;AACF,YAAA,MAAMiB,yBAAyBjB,MAAAA,CAAAA,CAAQuC,QAAQ,CAACR,UAAAA,CAAWjB,MAAM,EAAE;gBACjE0B,MAAAA,EAAQ,IAAA;gBACRC,UAAAA,EAAY;AACd,aAAA,CAAA;YACA,OAAO,IAAA;AACT,QAAA,CAAA,CAAE,OAAOC,CAAAA,EAAQ;;YAEf,MAAM,IAAI,CAACxD,WAAW,CAAC;AACrBE,gBAAAA,OAAAA,EAASsD,EAAEtD,OAAO;AAClBD,gBAAAA,IAAAA,EAAM,GAAG,IAAI,CAACA,IAAI,CAAC,OAAO;AAC5B,aAAA,CAAA;AACF,QAAA;AACF,IAAA,CAAA,CAAA;AAEJwD,IAAAA,UAAAA,EAAYrF,UAAIkB,KAAK,EAAA,CAAGa,EAAE,CAAC/B,UAAIC,MAAM,EAAA;AACvC,CAAA,CAAA,CACCqF,SAAS;MAECC,iBAAAA,GAAoBvF,SAAAA,CAC9BgE,MAAM,EAAA,CACNC,KAAK,CAAC;IACLnB,WAAAA,EAAa9C,SAAAA,CACVkB,KAAK,EAAA,CACLgD,QAAQ,EAAA,CACRnC,EAAE,CAACgC,UAAAA,CAAAA,CACHtD,IAAI,CACH,wBAAA,EACA,2DAAA,EACAoC,4BAAAA;AAEN,CAAA,CAAA,CACCqB,QAAQ,EAAA,CACRoB,SAAS;AAEZ,iBAAe;AACbvF,IAAAA,KAAAA;AACAI,IAAAA,SAAAA;AACAG,IAAAA,QAAAA;AACAC,IAAAA,QAAAA;AACAC,IAAAA,QAAAA;AACAS,IAAAA,KAAAA;AACAG,IAAAA,aAAAA;AACAoE,IAEAD;AACF,CAAA;;;;;;;;;;;;;"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { yup } from '@strapi/utils';
|
|
2
|
-
import ___default from 'lodash';
|
|
3
|
-
import { isEmpty, isNil, has, isArray } from 'lodash/fp';
|
|
2
|
+
import ___default, { isEmpty, has } from 'lodash';
|
|
4
3
|
import { getService } from '../utils/index.mjs';
|
|
5
|
-
import
|
|
4
|
+
import domain from '../domain/action/index.mjs';
|
|
6
5
|
import checkFieldsAreCorrectlyNested from './common-functions/check-fields-are-correctly-nested.mjs';
|
|
7
6
|
import checkFieldsDontHaveDuplicates from './common-functions/check-fields-dont-have-duplicates.mjs';
|
|
8
7
|
|
|
9
|
-
const { actionFields } =
|
|
8
|
+
const { actionFields } = domain;
|
|
10
9
|
const getActionFromProvider = (actionId)=>{
|
|
11
10
|
return getService('permission').actionProvider.get(actionId);
|
|
12
11
|
};
|
|
@@ -45,10 +44,10 @@ const permissionsAreEquals = (a, b)=>a.action === b.action && (a.subject === b.s
|
|
|
45
44
|
const checkNoDuplicatedPermissions = (permissions)=>!Array.isArray(permissions) || permissions.every((permA, i)=>permissions.slice(i + 1).every((permB)=>!permissionsAreEquals(permA, permB)));
|
|
46
45
|
const checkNilFields = (action)=>function checkNilActionFields(fields) {
|
|
47
46
|
// If the parent has no action field, then we ignore this test
|
|
48
|
-
if (
|
|
47
|
+
if (action == null) {
|
|
49
48
|
return true;
|
|
50
49
|
}
|
|
51
|
-
return
|
|
50
|
+
return domain.appliesToProperty('fields', action) || fields == null;
|
|
52
51
|
};
|
|
53
52
|
const fieldsPropertyValidation = (action)=>yup.array().of(yup.string()).nullable().test('field-nested', 'Fields format are incorrect (bad nesting).', checkFieldsAreCorrectlyNested).test('field-nested', 'Fields format are incorrect (duplicates).', checkFieldsDontHaveDuplicates).test('fields-restriction', // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder
|
|
54
53
|
'The permission at ${path} must have fields set to null or undefined', // @ts-expect-error yup types
|
|
@@ -56,7 +55,7 @@ const fieldsPropertyValidation = (action)=>yup.array().of(yup.string()).nullable
|
|
|
56
55
|
const permission = yup.object().shape({
|
|
57
56
|
action: yup.string().required().test('action-validity', 'action is not an existing permission action', function checkActionValidity(actionId) {
|
|
58
57
|
// If the action field is Nil, ignore the test and let the required check handle the error
|
|
59
|
-
if (
|
|
58
|
+
if (actionId == null) {
|
|
60
59
|
return true;
|
|
61
60
|
}
|
|
62
61
|
const action = getActionFromProvider(actionId);
|
|
@@ -69,10 +68,10 @@ const permission = yup.object().shape({
|
|
|
69
68
|
if (!action) {
|
|
70
69
|
return true;
|
|
71
70
|
}
|
|
72
|
-
if (
|
|
73
|
-
return
|
|
71
|
+
if (action.subjects == null) {
|
|
72
|
+
return subject == null;
|
|
74
73
|
}
|
|
75
|
-
if (isArray(action.subjects) &&
|
|
74
|
+
if (Array.isArray(action.subjects) && subject != null) {
|
|
76
75
|
return action.subjects.includes(subject);
|
|
77
76
|
}
|
|
78
77
|
return false;
|
|
@@ -81,15 +80,15 @@ const permission = yup.object().shape({
|
|
|
81
80
|
'Invalid property set at ${path}', function checkPropertiesStructure(properties) {
|
|
82
81
|
// @ts-expect-error yup types
|
|
83
82
|
const action = getActionFromProvider(this.options.parent.action);
|
|
84
|
-
const hasNoProperties = isEmpty(properties) ||
|
|
85
|
-
if (!has('options.applyToProperties'
|
|
83
|
+
const hasNoProperties = isEmpty(properties) || properties == null;
|
|
84
|
+
if (!has(action, 'options.applyToProperties')) {
|
|
86
85
|
return hasNoProperties;
|
|
87
86
|
}
|
|
88
87
|
if (hasNoProperties) {
|
|
89
88
|
return true;
|
|
90
89
|
}
|
|
91
90
|
const { applyToProperties } = action.options;
|
|
92
|
-
if (!isArray(applyToProperties)) {
|
|
91
|
+
if (!Array.isArray(applyToProperties)) {
|
|
93
92
|
return false;
|
|
94
93
|
}
|
|
95
94
|
return Object.keys(properties).every((property)=>applyToProperties.includes(property));
|
|
@@ -100,7 +99,7 @@ const permission = yup.object().shape({
|
|
|
100
99
|
if (!action || !properties) {
|
|
101
100
|
return true;
|
|
102
101
|
}
|
|
103
|
-
if (!
|
|
102
|
+
if (!domain.appliesToProperty('fields', action)) {
|
|
104
103
|
return true;
|
|
105
104
|
}
|
|
106
105
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common-validators.mjs","sources":["../../../../../server/src/validation/common-validators.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\nimport _ from 'lodash';\nimport { isEmpty, has, isNil, isArray } from 'lodash/fp';\nimport { getService } from '../utils';\nimport actionDomain, { type Action } from '../domain/action';\nimport { checkFieldsAreCorrectlyNested, checkFieldsDontHaveDuplicates } from './common-functions';\nimport actions from '../domain/action/index';\n\nconst { actionFields } = actions;\n\nconst getActionFromProvider = (actionId: string) => {\n return getService('permission').actionProvider.get(actionId);\n};\n\nexport const email = yup.string().email().lowercase();\n\nexport const firstname = yup.string().trim().min(1);\n\nexport const lastname = yup.string();\n\nexport const username = yup.string().min(1);\n\nexport const password = yup\n .string()\n .min(8)\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .test('required-byte-size', '${path} must be less than 73 bytes', function checkByteSize(value) {\n if (!value) return true;\n\n const byteSize = new TextEncoder().encode(value).length;\n return byteSize <= 72;\n })\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .matches(/[a-z]/, '${path} must contain at least one lowercase character')\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .matches(/[A-Z]/, '${path} must contain at least one uppercase character')\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .matches(/\\d/, '${path} must contain at least one number');\n\nexport const roles = yup.array(yup.strapiID()).min(1);\n\nconst isAPluginName = yup\n .string()\n .test('is-a-plugin-name', 'is not a plugin name', function checkPluginName(value) {\n return [undefined, 'admin', ...Object.keys(strapi.plugins)].includes(value)\n ? true\n : this.createError({ path: this.path, message: `${this.path} is not an existing plugin` });\n });\n\nexport const arrayOfConditionNames = yup\n .array()\n .of(yup.string())\n .test('is-an-array-of-conditions', 'is not a plugin name', function checkConditionNames(value) {\n const ids = strapi.service('admin::permission').conditionProvider.keys();\n return _.isUndefined(value) || _.difference(value, ids).length === 0\n ? true\n : this.createError({ path: this.path, message: `contains conditions that don't exist` });\n });\n\nexport const permissionsAreEquals = (a: any, b: any) =>\n a.action === b.action && (a.subject === b.subject || (_.isNil(a.subject) && _.isNil(b.subject)));\n\nconst checkNoDuplicatedPermissions = (permissions: unknown) =>\n !Array.isArray(permissions) ||\n permissions.every((permA, i) =>\n permissions.slice(i + 1).every((permB) => !permissionsAreEquals(permA, permB))\n );\n\nconst checkNilFields = (action: Action) =>\n function checkNilActionFields(fields: typeof actionFields) {\n // If the parent has no action field, then we ignore this test\n if (isNil(action)) {\n return true;\n }\n\n return actionDomain.appliesToProperty('fields', action) || isNil(fields);\n };\n\nconst fieldsPropertyValidation = (action: Action) =>\n yup\n .array()\n .of(yup.string())\n .nullable()\n .test(\n 'field-nested',\n 'Fields format are incorrect (bad nesting).',\n checkFieldsAreCorrectlyNested\n )\n .test(\n 'field-nested',\n 'Fields format are incorrect (duplicates).',\n checkFieldsDontHaveDuplicates\n )\n .test(\n 'fields-restriction',\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n 'The permission at ${path} must have fields set to null or undefined',\n // @ts-expect-error yup types\n checkNilFields(action)\n );\n\nexport const permission = yup\n .object()\n .shape({\n action: yup\n .string()\n .required()\n .test(\n 'action-validity',\n 'action is not an existing permission action',\n function checkActionValidity(actionId) {\n // If the action field is Nil, ignore the test and let the required check handle the error\n if (isNil(actionId)) {\n return true;\n }\n\n const action = getActionFromProvider(actionId);\n\n return action !== undefined && action !== null;\n }\n ),\n actionParameters: yup.object().nullable(),\n subject: yup\n .string()\n .nullable()\n .test(\n 'subject-validity',\n 'Invalid subject submitted',\n function checkSubjectValidity(subject) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action);\n\n if (!action) {\n return true;\n }\n\n if (isNil(action.subjects)) {\n return isNil(subject);\n }\n\n if (isArray(action.subjects) && !isNil(subject)) {\n return action.subjects.includes(subject);\n }\n\n return false;\n }\n ),\n properties: yup\n .object()\n .test(\n 'properties-structure',\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n 'Invalid property set at ${path}',\n function checkPropertiesStructure(properties) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action) as any;\n const hasNoProperties = isEmpty(properties) || isNil(properties);\n\n if (!has('options.applyToProperties', action)) {\n return hasNoProperties;\n }\n\n if (hasNoProperties) {\n return true;\n }\n\n const { applyToProperties } = action.options;\n\n if (!isArray(applyToProperties)) {\n return false;\n }\n\n return Object.keys(properties).every((property) => applyToProperties.includes(property));\n }\n )\n .test(\n 'fields-property',\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n 'Invalid fields property at ${path}',\n async function checkFieldsProperty(properties = {}) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action) as any;\n\n if (!action || !properties) {\n return true;\n }\n\n if (!actionDomain.appliesToProperty('fields', action)) {\n return true;\n }\n\n try {\n await fieldsPropertyValidation(action).validate(properties.fields, {\n strict: true,\n abortEarly: false,\n });\n return true;\n } catch (e: any) {\n // Propagate fieldsPropertyValidation error with updated path\n throw this.createError({\n message: e.message,\n path: `${this.path}.fields`,\n });\n }\n }\n ),\n conditions: yup.array().of(yup.string()),\n })\n .noUnknown();\n\nexport const updatePermissions = yup\n .object()\n .shape({\n permissions: yup\n .array()\n .required()\n .of(permission)\n .test(\n 'duplicated-permissions',\n 'Some permissions are duplicated (same action and subject)',\n checkNoDuplicatedPermissions\n ),\n })\n .required()\n .noUnknown();\n\nexport default {\n email,\n firstname,\n lastname,\n username,\n password,\n roles,\n isAPluginName,\n arrayOfConditionNames,\n permission,\n updatePermissions,\n};\n"],"names":["actionFields","actions","getActionFromProvider","actionId","getService","actionProvider","get","email","yup","string","lowercase","firstname","trim","min","lastname","username","password","test","checkByteSize","value","byteSize","TextEncoder","encode","length","matches","roles","array","strapiID","isAPluginName","checkPluginName","undefined","Object","keys","strapi","plugins","includes","createError","path","message","of","checkConditionNames","ids","service","conditionProvider","_","isUndefined","difference","permissionsAreEquals","a","b","action","subject","isNil","checkNoDuplicatedPermissions","permissions","Array","isArray","every","permA","i","slice","permB","checkNilFields","checkNilActionFields","fields","actionDomain","appliesToProperty","fieldsPropertyValidation","nullable","checkFieldsAreCorrectlyNested","checkFieldsDontHaveDuplicates","permission","object","shape","required","checkActionValidity","actionParameters","checkSubjectValidity","options","parent","subjects","properties","checkPropertiesStructure","hasNoProperties","isEmpty","has","applyToProperties","property","checkFieldsProperty","validate","strict","abortEarly","e","conditions","noUnknown","updatePermissions","arrayOfConditionNames"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"common-validators.mjs","sources":["../../../../../server/src/validation/common-validators.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\nimport _, { isEmpty, has } from 'lodash';\n\nimport { getService } from '../utils';\nimport actionDomain, { type Action } from '../domain/action';\nimport { checkFieldsAreCorrectlyNested, checkFieldsDontHaveDuplicates } from './common-functions';\nimport actions from '../domain/action/index';\n\nconst { actionFields } = actions;\n\nconst getActionFromProvider = (actionId: string) => {\n return getService('permission').actionProvider.get(actionId);\n};\n\nexport const email = yup.string().email().lowercase();\n\nexport const firstname = yup.string().trim().min(1);\n\nexport const lastname = yup.string();\n\nexport const username = yup.string().min(1);\n\nexport const password = yup\n .string()\n .min(8)\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .test('required-byte-size', '${path} must be less than 73 bytes', function checkByteSize(value) {\n if (!value) return true;\n\n const byteSize = new TextEncoder().encode(value).length;\n return byteSize <= 72;\n })\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .matches(/[a-z]/, '${path} must contain at least one lowercase character')\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .matches(/[A-Z]/, '${path} must contain at least one uppercase character')\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n .matches(/\\d/, '${path} must contain at least one number');\n\nexport const roles = yup.array(yup.strapiID()).min(1);\n\nconst isAPluginName = yup\n .string()\n .test('is-a-plugin-name', 'is not a plugin name', function checkPluginName(value) {\n return [undefined, 'admin', ...Object.keys(strapi.plugins)].includes(value)\n ? true\n : this.createError({ path: this.path, message: `${this.path} is not an existing plugin` });\n });\n\nexport const arrayOfConditionNames = yup\n .array()\n .of(yup.string())\n .test('is-an-array-of-conditions', 'is not a plugin name', function checkConditionNames(value) {\n const ids = strapi.service('admin::permission').conditionProvider.keys();\n return _.isUndefined(value) || _.difference(value, ids).length === 0\n ? true\n : this.createError({ path: this.path, message: `contains conditions that don't exist` });\n });\n\nexport const permissionsAreEquals = (a: any, b: any) =>\n a.action === b.action && (a.subject === b.subject || (_.isNil(a.subject) && _.isNil(b.subject)));\n\nconst checkNoDuplicatedPermissions = (permissions: unknown) =>\n !Array.isArray(permissions) ||\n permissions.every((permA, i) =>\n permissions.slice(i + 1).every((permB) => !permissionsAreEquals(permA, permB))\n );\n\nconst checkNilFields = (action: Action) =>\n function checkNilActionFields(fields: typeof actionFields) {\n // If the parent has no action field, then we ignore this test\n if (action == null) {\n return true;\n }\n\n return actionDomain.appliesToProperty('fields', action) || fields == null;\n };\n\nconst fieldsPropertyValidation = (action: Action) =>\n yup\n .array()\n .of(yup.string())\n .nullable()\n .test(\n 'field-nested',\n 'Fields format are incorrect (bad nesting).',\n checkFieldsAreCorrectlyNested\n )\n .test(\n 'field-nested',\n 'Fields format are incorrect (duplicates).',\n checkFieldsDontHaveDuplicates\n )\n .test(\n 'fields-restriction',\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n 'The permission at ${path} must have fields set to null or undefined',\n // @ts-expect-error yup types\n checkNilFields(action)\n );\n\nexport const permission = yup\n .object()\n .shape({\n action: yup\n .string()\n .required()\n .test(\n 'action-validity',\n 'action is not an existing permission action',\n function checkActionValidity(actionId) {\n // If the action field is Nil, ignore the test and let the required check handle the error\n if (actionId == null) {\n return true;\n }\n\n const action = getActionFromProvider(actionId);\n\n return action !== undefined && action !== null;\n }\n ),\n actionParameters: yup.object().nullable(),\n subject: yup\n .string()\n .nullable()\n .test(\n 'subject-validity',\n 'Invalid subject submitted',\n function checkSubjectValidity(subject) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action);\n\n if (!action) {\n return true;\n }\n\n if (action.subjects == null) {\n return subject == null;\n }\n\n if (Array.isArray(action.subjects) && subject != null) {\n return action.subjects.includes(subject);\n }\n\n return false;\n }\n ),\n properties: yup\n .object()\n .test(\n 'properties-structure',\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n 'Invalid property set at ${path}',\n function checkPropertiesStructure(properties) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action) as any;\n const hasNoProperties = isEmpty(properties) || properties == null;\n\n if (!has(action, 'options.applyToProperties')) {\n return hasNoProperties;\n }\n\n if (hasNoProperties) {\n return true;\n }\n\n const { applyToProperties } = action.options;\n\n if (!Array.isArray(applyToProperties)) {\n return false;\n }\n\n return Object.keys(properties).every((property) => applyToProperties.includes(property));\n }\n )\n .test(\n 'fields-property',\n // eslint-disable-next-line no-template-curly-in-string -- Yup interpolation placeholder\n 'Invalid fields property at ${path}',\n async function checkFieldsProperty(properties = {}) {\n // @ts-expect-error yup types\n const action = getActionFromProvider(this.options.parent.action) as any;\n\n if (!action || !properties) {\n return true;\n }\n\n if (!actionDomain.appliesToProperty('fields', action)) {\n return true;\n }\n\n try {\n await fieldsPropertyValidation(action).validate(properties.fields, {\n strict: true,\n abortEarly: false,\n });\n return true;\n } catch (e: any) {\n // Propagate fieldsPropertyValidation error with updated path\n throw this.createError({\n message: e.message,\n path: `${this.path}.fields`,\n });\n }\n }\n ),\n conditions: yup.array().of(yup.string()),\n })\n .noUnknown();\n\nexport const updatePermissions = yup\n .object()\n .shape({\n permissions: yup\n .array()\n .required()\n .of(permission)\n .test(\n 'duplicated-permissions',\n 'Some permissions are duplicated (same action and subject)',\n checkNoDuplicatedPermissions\n ),\n })\n .required()\n .noUnknown();\n\nexport default {\n email,\n firstname,\n lastname,\n username,\n password,\n roles,\n isAPluginName,\n arrayOfConditionNames,\n permission,\n updatePermissions,\n};\n"],"names":["actionFields","actions","getActionFromProvider","actionId","getService","actionProvider","get","email","yup","string","lowercase","firstname","trim","min","lastname","username","password","test","checkByteSize","value","byteSize","TextEncoder","encode","length","matches","roles","array","strapiID","isAPluginName","checkPluginName","undefined","Object","keys","strapi","plugins","includes","createError","path","message","of","checkConditionNames","ids","service","conditionProvider","_","isUndefined","difference","permissionsAreEquals","a","b","action","subject","isNil","checkNoDuplicatedPermissions","permissions","Array","isArray","every","permA","i","slice","permB","checkNilFields","checkNilActionFields","fields","actionDomain","appliesToProperty","fieldsPropertyValidation","nullable","checkFieldsAreCorrectlyNested","checkFieldsDontHaveDuplicates","permission","object","shape","required","checkActionValidity","actionParameters","checkSubjectValidity","options","parent","subjects","properties","checkPropertiesStructure","hasNoProperties","isEmpty","has","applyToProperties","property","checkFieldsProperty","validate","strict","abortEarly","e","conditions","noUnknown","updatePermissions","arrayOfConditionNames"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var fp = require('lodash/fp');
|
|
4
3
|
var utils = require('@strapi/utils');
|
|
5
4
|
var commonValidators = require('./common-validators.js');
|
|
6
5
|
|
|
@@ -17,7 +16,7 @@ const profileUpdateSchema = utils.yup.object().shape({
|
|
|
17
16
|
lastname: commonValidators.default.lastname.nullable(),
|
|
18
17
|
username: commonValidators.default.username.nullable(),
|
|
19
18
|
password: commonValidators.default.password.notNull(),
|
|
20
|
-
currentPassword: utils.yup.string().when('password', (password, schema)
|
|
19
|
+
currentPassword: utils.yup.string().when('password', (password, schema)=>password !== undefined ? schema.required() : schema).notNull(),
|
|
21
20
|
preferedLanguage: utils.yup.string().nullable()
|
|
22
21
|
}).noUnknown();
|
|
23
22
|
const userUpdateSchema = utils.yup.object().shape({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.js","sources":["../../../../../server/src/validation/user.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"user.js","sources":["../../../../../server/src/validation/user.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport validators from './common-validators';\n\nconst userCreationSchema = yup\n .object()\n .shape({\n email: validators.email.required(),\n firstname: validators.firstname.required(),\n lastname: validators.lastname,\n roles: validators.roles.min(1),\n preferedLanguage: yup.string().nullable(),\n })\n .noUnknown();\n\nconst profileUpdateSchema = yup\n .object()\n .shape({\n email: validators.email.notNull(),\n firstname: validators.firstname.notNull(),\n lastname: validators.lastname.nullable(),\n username: validators.username.nullable(),\n password: validators.password.notNull(),\n currentPassword: yup\n .string()\n .when('password', (password: string, schema: any) =>\n password !== undefined ? schema.required() : schema\n )\n .notNull(),\n preferedLanguage: yup.string().nullable(),\n })\n .noUnknown();\n\nconst userUpdateSchema = yup\n .object()\n .shape({\n email: validators.email.notNull(),\n firstname: validators.firstname.notNull(),\n lastname: validators.lastname.nullable(),\n username: validators.username.nullable(),\n password: validators.password.notNull(),\n isActive: yup.bool().notNull(),\n roles: validators.roles.min(1).notNull(),\n })\n .noUnknown();\n\nconst usersDeleteSchema = yup\n .object()\n .shape({\n ids: yup.array().of(yup.strapiID()).min(1).required(),\n })\n .noUnknown();\n\nexport const validateUserCreationInput = validateYupSchema(userCreationSchema);\nexport const validateProfileUpdateInput = validateYupSchema(profileUpdateSchema);\nexport const validateUserUpdateInput = validateYupSchema(userUpdateSchema);\nexport const validateUsersDeleteInput = validateYupSchema(usersDeleteSchema);\nexport const schemas = {\n userCreationSchema,\n usersDeleteSchema,\n userUpdateSchema,\n};\n\nexport default {\n validateUserCreationInput,\n validateProfileUpdateInput,\n validateUserUpdateInput,\n validateUsersDeleteInput,\n schemas,\n};\n"],"names":["userCreationSchema","yup","object","shape","email","validators","required","firstname","lastname","roles","min","preferedLanguage","string","nullable","noUnknown","profileUpdateSchema","notNull","username","password","currentPassword","when","schema","undefined","userUpdateSchema","isActive","bool","usersDeleteSchema","ids","array","of","strapiID","validateUserCreationInput","validateYupSchema","validateProfileUpdateInput","validateUserUpdateInput","validateUsersDeleteInput","schemas"],"mappings":";;;;;AAGA,MAAMA,kBAAAA,GAAqBC,SAAAA,CACxBC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLC,KAAAA,EAAOC,wBAAAA,CAAWD,KAAK,CAACE,QAAQ,EAAA;IAChCC,SAAAA,EAAWF,wBAAAA,CAAWE,SAAS,CAACD,QAAQ,EAAA;AACxCE,IAAAA,QAAAA,EAAUH,yBAAWG,QAAQ;AAC7BC,IAAAA,KAAAA,EAAOJ,wBAAAA,CAAWI,KAAK,CAACC,GAAG,CAAC,CAAA,CAAA;IAC5BC,gBAAAA,EAAkBV,SAAAA,CAAIW,MAAM,EAAA,CAAGC,QAAQ;AACzC,CAAA,CAAA,CACCC,SAAS,EAAA;AAEZ,MAAMC,mBAAAA,GAAsBd,SAAAA,CACzBC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLC,KAAAA,EAAOC,wBAAAA,CAAWD,KAAK,CAACY,OAAO,EAAA;IAC/BT,SAAAA,EAAWF,wBAAAA,CAAWE,SAAS,CAACS,OAAO,EAAA;IACvCR,QAAAA,EAAUH,wBAAAA,CAAWG,QAAQ,CAACK,QAAQ,EAAA;IACtCI,QAAAA,EAAUZ,wBAAAA,CAAWY,QAAQ,CAACJ,QAAQ,EAAA;IACtCK,QAAAA,EAAUb,wBAAAA,CAAWa,QAAQ,CAACF,OAAO,EAAA;AACrCG,IAAAA,eAAAA,EAAiBlB,SAAAA,CACdW,MAAM,EAAA,CACNQ,IAAI,CAAC,UAAA,EAAY,CAACF,QAAAA,EAAkBG,MAAAA,GACnCH,aAAaI,SAAAA,GAAYD,MAAAA,CAAOf,QAAQ,EAAA,GAAKe,QAE9CL,OAAO,EAAA;IACVL,gBAAAA,EAAkBV,SAAAA,CAAIW,MAAM,EAAA,CAAGC,QAAQ;AACzC,CAAA,CAAA,CACCC,SAAS,EAAA;AAEZ,MAAMS,gBAAAA,GAAmBtB,SAAAA,CACtBC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLC,KAAAA,EAAOC,wBAAAA,CAAWD,KAAK,CAACY,OAAO,EAAA;IAC/BT,SAAAA,EAAWF,wBAAAA,CAAWE,SAAS,CAACS,OAAO,EAAA;IACvCR,QAAAA,EAAUH,wBAAAA,CAAWG,QAAQ,CAACK,QAAQ,EAAA;IACtCI,QAAAA,EAAUZ,wBAAAA,CAAWY,QAAQ,CAACJ,QAAQ,EAAA;IACtCK,QAAAA,EAAUb,wBAAAA,CAAWa,QAAQ,CAACF,OAAO,EAAA;IACrCQ,QAAAA,EAAUvB,SAAAA,CAAIwB,IAAI,EAAA,CAAGT,OAAO,EAAA;AAC5BP,IAAAA,KAAAA,EAAOJ,yBAAWI,KAAK,CAACC,GAAG,CAAC,GAAGM,OAAO;AACxC,CAAA,CAAA,CACCF,SAAS,EAAA;AAEZ,MAAMY,iBAAAA,GAAoBzB,SAAAA,CACvBC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLwB,GAAAA,EAAK1B,SAAAA,CAAI2B,KAAK,EAAA,CAAGC,EAAE,CAAC5B,SAAAA,CAAI6B,QAAQ,EAAA,CAAA,CAAIpB,GAAG,CAAC,CAAA,CAAA,CAAGJ,QAAQ;AACrD,CAAA,CAAA,CACCQ,SAAS,EAAA;AAEL,MAAMiB,yBAAAA,GAA4BC,uBAAAA,CAAkBhC,kBAAAA;AACpD,MAAMiC,0BAAAA,GAA6BD,uBAAAA,CAAkBjB,mBAAAA;AACrD,MAAMmB,uBAAAA,GAA0BF,uBAAAA,CAAkBT,gBAAAA;AAClD,MAAMY,wBAAAA,GAA2BH,uBAAAA,CAAkBN,iBAAAA;MAC7CU,OAAAA,GAAU;AACrBpC,IAAAA,kBAGF;;;;;;;;"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { isUndefined } from 'lodash/fp';
|
|
2
1
|
import { yup, validateYupSchema } from '@strapi/utils';
|
|
3
2
|
import validators from './common-validators.mjs';
|
|
4
3
|
|
|
@@ -15,7 +14,7 @@ const profileUpdateSchema = yup.object().shape({
|
|
|
15
14
|
lastname: validators.lastname.nullable(),
|
|
16
15
|
username: validators.username.nullable(),
|
|
17
16
|
password: validators.password.notNull(),
|
|
18
|
-
currentPassword: yup.string().when('password', (password, schema)
|
|
17
|
+
currentPassword: yup.string().when('password', (password, schema)=>password !== undefined ? schema.required() : schema).notNull(),
|
|
19
18
|
preferedLanguage: yup.string().nullable()
|
|
20
19
|
}).noUnknown();
|
|
21
20
|
const userUpdateSchema = yup.object().shape({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.mjs","sources":["../../../../../server/src/validation/user.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"user.mjs","sources":["../../../../../server/src/validation/user.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport validators from './common-validators';\n\nconst userCreationSchema = yup\n .object()\n .shape({\n email: validators.email.required(),\n firstname: validators.firstname.required(),\n lastname: validators.lastname,\n roles: validators.roles.min(1),\n preferedLanguage: yup.string().nullable(),\n })\n .noUnknown();\n\nconst profileUpdateSchema = yup\n .object()\n .shape({\n email: validators.email.notNull(),\n firstname: validators.firstname.notNull(),\n lastname: validators.lastname.nullable(),\n username: validators.username.nullable(),\n password: validators.password.notNull(),\n currentPassword: yup\n .string()\n .when('password', (password: string, schema: any) =>\n password !== undefined ? schema.required() : schema\n )\n .notNull(),\n preferedLanguage: yup.string().nullable(),\n })\n .noUnknown();\n\nconst userUpdateSchema = yup\n .object()\n .shape({\n email: validators.email.notNull(),\n firstname: validators.firstname.notNull(),\n lastname: validators.lastname.nullable(),\n username: validators.username.nullable(),\n password: validators.password.notNull(),\n isActive: yup.bool().notNull(),\n roles: validators.roles.min(1).notNull(),\n })\n .noUnknown();\n\nconst usersDeleteSchema = yup\n .object()\n .shape({\n ids: yup.array().of(yup.strapiID()).min(1).required(),\n })\n .noUnknown();\n\nexport const validateUserCreationInput = validateYupSchema(userCreationSchema);\nexport const validateProfileUpdateInput = validateYupSchema(profileUpdateSchema);\nexport const validateUserUpdateInput = validateYupSchema(userUpdateSchema);\nexport const validateUsersDeleteInput = validateYupSchema(usersDeleteSchema);\nexport const schemas = {\n userCreationSchema,\n usersDeleteSchema,\n userUpdateSchema,\n};\n\nexport default {\n validateUserCreationInput,\n validateProfileUpdateInput,\n validateUserUpdateInput,\n validateUsersDeleteInput,\n schemas,\n};\n"],"names":["userCreationSchema","yup","object","shape","email","validators","required","firstname","lastname","roles","min","preferedLanguage","string","nullable","noUnknown","profileUpdateSchema","notNull","username","password","currentPassword","when","schema","undefined","userUpdateSchema","isActive","bool","usersDeleteSchema","ids","array","of","strapiID","validateUserCreationInput","validateYupSchema","validateProfileUpdateInput","validateUserUpdateInput","validateUsersDeleteInput","schemas"],"mappings":";;;AAGA,MAAMA,kBAAAA,GAAqBC,GAAAA,CACxBC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLC,KAAAA,EAAOC,UAAAA,CAAWD,KAAK,CAACE,QAAQ,EAAA;IAChCC,SAAAA,EAAWF,UAAAA,CAAWE,SAAS,CAACD,QAAQ,EAAA;AACxCE,IAAAA,QAAAA,EAAUH,WAAWG,QAAQ;AAC7BC,IAAAA,KAAAA,EAAOJ,UAAAA,CAAWI,KAAK,CAACC,GAAG,CAAC,CAAA,CAAA;IAC5BC,gBAAAA,EAAkBV,GAAAA,CAAIW,MAAM,EAAA,CAAGC,QAAQ;AACzC,CAAA,CAAA,CACCC,SAAS,EAAA;AAEZ,MAAMC,mBAAAA,GAAsBd,GAAAA,CACzBC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLC,KAAAA,EAAOC,UAAAA,CAAWD,KAAK,CAACY,OAAO,EAAA;IAC/BT,SAAAA,EAAWF,UAAAA,CAAWE,SAAS,CAACS,OAAO,EAAA;IACvCR,QAAAA,EAAUH,UAAAA,CAAWG,QAAQ,CAACK,QAAQ,EAAA;IACtCI,QAAAA,EAAUZ,UAAAA,CAAWY,QAAQ,CAACJ,QAAQ,EAAA;IACtCK,QAAAA,EAAUb,UAAAA,CAAWa,QAAQ,CAACF,OAAO,EAAA;AACrCG,IAAAA,eAAAA,EAAiBlB,GAAAA,CACdW,MAAM,EAAA,CACNQ,IAAI,CAAC,UAAA,EAAY,CAACF,QAAAA,EAAkBG,MAAAA,GACnCH,aAAaI,SAAAA,GAAYD,MAAAA,CAAOf,QAAQ,EAAA,GAAKe,QAE9CL,OAAO,EAAA;IACVL,gBAAAA,EAAkBV,GAAAA,CAAIW,MAAM,EAAA,CAAGC,QAAQ;AACzC,CAAA,CAAA,CACCC,SAAS,EAAA;AAEZ,MAAMS,gBAAAA,GAAmBtB,GAAAA,CACtBC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLC,KAAAA,EAAOC,UAAAA,CAAWD,KAAK,CAACY,OAAO,EAAA;IAC/BT,SAAAA,EAAWF,UAAAA,CAAWE,SAAS,CAACS,OAAO,EAAA;IACvCR,QAAAA,EAAUH,UAAAA,CAAWG,QAAQ,CAACK,QAAQ,EAAA;IACtCI,QAAAA,EAAUZ,UAAAA,CAAWY,QAAQ,CAACJ,QAAQ,EAAA;IACtCK,QAAAA,EAAUb,UAAAA,CAAWa,QAAQ,CAACF,OAAO,EAAA;IACrCQ,QAAAA,EAAUvB,GAAAA,CAAIwB,IAAI,EAAA,CAAGT,OAAO,EAAA;AAC5BP,IAAAA,KAAAA,EAAOJ,WAAWI,KAAK,CAACC,GAAG,CAAC,GAAGM,OAAO;AACxC,CAAA,CAAA,CACCF,SAAS,EAAA;AAEZ,MAAMY,iBAAAA,GAAoBzB,GAAAA,CACvBC,MAAM,EAAA,CACNC,KAAK,CAAC;IACLwB,GAAAA,EAAK1B,GAAAA,CAAI2B,KAAK,EAAA,CAAGC,EAAE,CAAC5B,GAAAA,CAAI6B,QAAQ,EAAA,CAAA,CAAIpB,GAAG,CAAC,CAAA,CAAA,CAAGJ,QAAQ;AACrD,CAAA,CAAA,CACCQ,SAAS,EAAA;AAEL,MAAMiB,yBAAAA,GAA4BC,iBAAAA,CAAkBhC,kBAAAA;AACpD,MAAMiC,0BAAAA,GAA6BD,iBAAAA,CAAkBjB,mBAAAA;AACrD,MAAMmB,uBAAAA,GAA0BF,iBAAAA,CAAkBT,gBAAAA;AAClD,MAAMY,wBAAAA,GAA2BH,iBAAAA,CAAkBN,iBAAAA;MAC7CU,OAAAA,GAAU;AACrBpC,IAAAA,kBAGF;;;;"}
|