@strapi/admin 5.0.0-rc.3 → 5.0.0-rc.30
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/{AdminSeatInfo-E8azTFQY.js → AdminSeatInfo-8vtNB3ck.js} +4 -4
- package/dist/admin/AdminSeatInfo-8vtNB3ck.js.map +1 -0
- package/dist/admin/{AdminSeatInfo-Q_hUNC5B.mjs → AdminSeatInfo-qIgh5-QA.mjs} +5 -5
- package/dist/admin/AdminSeatInfo-qIgh5-QA.mjs.map +1 -0
- package/dist/admin/{ApplicationInfoPage-noPIfujW.js → ApplicationInfoPage-ezUPoomC.js} +10 -10
- package/dist/admin/ApplicationInfoPage-ezUPoomC.js.map +1 -0
- package/dist/admin/{ApplicationInfoPage-kEld-u0P.mjs → ApplicationInfoPage-hvwQQDfu.mjs} +10 -10
- package/dist/admin/ApplicationInfoPage-hvwQQDfu.mjs.map +1 -0
- package/dist/admin/{AuthResponse-J8A48xdo.mjs → AuthResponse-HYXVuTDF.mjs} +2 -2
- package/dist/admin/{AuthResponse-J8A48xdo.mjs.map → AuthResponse-HYXVuTDF.mjs.map} +1 -1
- package/dist/admin/{AuthResponse-KlTDmm2i.js → AuthResponse-R8kR_yqS.js} +2 -2
- package/dist/admin/{AuthResponse-KlTDmm2i.js.map → AuthResponse-R8kR_yqS.js.map} +1 -1
- package/dist/admin/{AuthenticatedLayout-zYfAXNPg.mjs → AuthenticatedLayout-L-NNsHI6.mjs} +69 -82
- package/dist/admin/AuthenticatedLayout-L-NNsHI6.mjs.map +1 -0
- package/dist/admin/{AuthenticatedLayout-kLMmhrNQ.js → AuthenticatedLayout-U_Y1i-L-.js} +68 -81
- package/dist/admin/AuthenticatedLayout-U_Y1i-L-.js.map +1 -0
- package/dist/admin/{CreateActionEE-Yfp4hs7a.mjs → CreateActionEE-X2nnG2dm.mjs} +2 -2
- package/dist/admin/{CreateActionEE-Yfp4hs7a.mjs.map → CreateActionEE-X2nnG2dm.mjs.map} +1 -1
- package/dist/admin/{CreatePage-I7iAq1hY.mjs → CreatePage-J5u689Z3.mjs} +3 -3
- package/dist/admin/{CreatePage-I7iAq1hY.mjs.map → CreatePage-J5u689Z3.mjs.map} +1 -1
- package/dist/admin/{CreatePage-CUxfLM1W.js → CreatePage-hVCdmn57.js} +3 -3
- package/dist/admin/{CreatePage-CUxfLM1W.js.map → CreatePage-hVCdmn57.js.map} +1 -1
- package/dist/admin/{CreatePage-bJgO6DND.mjs → CreatePage-kEk8SJfP.mjs} +7 -7
- package/dist/admin/CreatePage-kEk8SJfP.mjs.map +1 -0
- package/dist/admin/{CreatePage-0dG6JVsn.js → CreatePage-wgAv5nl3.js} +6 -6
- package/dist/admin/CreatePage-wgAv5nl3.js.map +1 -0
- package/dist/admin/{CreateView-_K_RroGC.js → CreateView-jmN888jP.js} +3 -3
- package/dist/admin/{CreateView-_K_RroGC.js.map → CreateView-jmN888jP.js.map} +1 -1
- package/dist/admin/{CreateView-uZSogyWz.mjs → CreateView-jyUut1x5.mjs} +3 -3
- package/dist/admin/{CreateView-uZSogyWz.mjs.map → CreateView-jyUut1x5.mjs.map} +1 -1
- package/dist/admin/{CreateView-dpvub7Dn.mjs → CreateView-m1DVHo7c.mjs} +3 -3
- package/dist/admin/{CreateView-dpvub7Dn.mjs.map → CreateView-m1DVHo7c.mjs.map} +1 -1
- package/dist/admin/{CreateView-8WdBrUg7.js → CreateView-ormHpP1q.js} +3 -3
- package/dist/admin/{CreateView-8WdBrUg7.js.map → CreateView-ormHpP1q.js.map} +1 -1
- package/dist/admin/{EditPage-T7HhMiw2.js → EditPage-5io6Tp6t.js} +8 -8
- package/dist/admin/EditPage-5io6Tp6t.js.map +1 -0
- package/dist/admin/{EditPage-D5r0GV3j.mjs → EditPage-Od_v4_be.mjs} +42 -29
- package/dist/admin/EditPage-Od_v4_be.mjs.map +1 -0
- package/dist/admin/{EditPage-X8jnX0_l.js → EditPage-Pt5W8neh.js} +40 -27
- package/dist/admin/EditPage-Pt5W8neh.js.map +1 -0
- package/dist/admin/{EditPage-iksJke6K.js → EditPage-Q95nrnV7.js} +25 -16
- package/dist/admin/EditPage-Q95nrnV7.js.map +1 -0
- package/dist/admin/{EditPage-Bx_qeoOF.mjs → EditPage-lgiRfwaF.mjs} +26 -17
- package/dist/admin/EditPage-lgiRfwaF.mjs.map +1 -0
- package/dist/admin/{EditPage-yBDiueEy.mjs → EditPage-tOIK-Cfa.mjs} +9 -9
- package/dist/admin/EditPage-tOIK-Cfa.mjs.map +1 -0
- package/dist/admin/{EditView-9nfADKvX.mjs → EditView-C2YwNWBO.mjs} +11 -12
- package/dist/admin/EditView-C2YwNWBO.mjs.map +1 -0
- package/dist/admin/{EditView-kxg0Wurs.js → EditView-gMzPUOqp.js} +9 -10
- package/dist/admin/EditView-gMzPUOqp.js.map +1 -0
- package/dist/admin/{EditViewPage-PmrZwoCk.mjs → EditViewPage-BgCS0-PW.mjs} +77 -54
- package/dist/admin/EditViewPage-BgCS0-PW.mjs.map +1 -0
- package/dist/admin/{EditViewPage-I5bq_bCv.js → EditViewPage-ejtUKO-R.js} +76 -53
- package/dist/admin/EditViewPage-ejtUKO-R.js.map +1 -0
- package/dist/admin/{EventsTable-uNKFTehG.js → EventsTable-A7mZRfim.js} +2 -2
- package/dist/admin/{EventsTable-uNKFTehG.js.map → EventsTable-A7mZRfim.js.map} +1 -1
- package/dist/admin/{EventsTable-d03-9tkm.mjs → EventsTable-t4y4yZXc.mjs} +2 -2
- package/dist/admin/{EventsTable-d03-9tkm.mjs.map → EventsTable-t4y4yZXc.mjs.map} +1 -1
- package/dist/admin/{HomePage-183EKMLK.mjs → HomePage-1wvgf7Va.mjs} +3 -3
- package/dist/admin/{HomePage-183EKMLK.mjs.map → HomePage-1wvgf7Va.mjs.map} +1 -1
- package/dist/admin/{HomePage-n2buy2O4.mjs → HomePage-Uy655P1o.mjs} +11 -14
- package/dist/admin/HomePage-Uy655P1o.mjs.map +1 -0
- package/dist/admin/{HomePage-XakoaT95.js → HomePage-l2K5VEES.js} +19 -22
- package/dist/admin/HomePage-l2K5VEES.js.map +1 -0
- package/dist/admin/{HomePage-8mwfR9nn.js → HomePage-zvRCtbch.js} +3 -3
- package/dist/admin/{HomePage-8mwfR9nn.js.map → HomePage-zvRCtbch.js.map} +1 -1
- package/dist/admin/{InstalledPluginsPage--BdpZuNa.js → InstalledPlugins-SpFdFYND.js} +9 -11
- package/dist/admin/InstalledPlugins-SpFdFYND.js.map +1 -0
- package/dist/admin/{InstalledPluginsPage-nFNbVJPm.mjs → InstalledPlugins-wPRaVeug.mjs} +9 -11
- package/dist/admin/InstalledPlugins-wPRaVeug.mjs.map +1 -0
- package/dist/admin/{Layout-2ucTUD08.js → Layout-1pNNiYP1.js} +5 -5
- package/dist/admin/{Layout-2ucTUD08.js.map → Layout-1pNNiYP1.js.map} +1 -1
- package/dist/admin/{Layout-rXyzByjE.mjs → Layout-WNZbvlel.mjs} +5 -5
- package/dist/admin/{Layout-rXyzByjE.mjs.map → Layout-WNZbvlel.mjs.map} +1 -1
- package/dist/admin/{ListPage-iBPceR0S.mjs → ListPage-9efPpe0f.mjs} +7 -7
- package/dist/admin/ListPage-9efPpe0f.mjs.map +1 -0
- package/dist/admin/{ListPage-U0JQnpSG.js → ListPage-C9_pjixy.js} +3 -3
- package/dist/admin/{ListPage-U0JQnpSG.js.map → ListPage-C9_pjixy.js.map} +1 -1
- package/dist/admin/{ListPage-vZsQ_8fm.mjs → ListPage-RaBcFl-9.mjs} +3 -3
- package/dist/admin/{ListPage-vZsQ_8fm.mjs.map → ListPage-RaBcFl-9.mjs.map} +1 -1
- package/dist/admin/{ListPage-pwMqUvh3.js → ListPage-SNyqdq5P.js} +46 -28
- package/dist/admin/ListPage-SNyqdq5P.js.map +1 -0
- package/dist/admin/{ListPage-SnKebmiT.js → ListPage-UJdwjcJg.js} +5 -5
- package/dist/admin/ListPage-UJdwjcJg.js.map +1 -0
- package/dist/admin/{ListPage-nXLMZNTC.js → ListPage-dkI5xNaW.js} +7 -7
- package/dist/admin/ListPage-dkI5xNaW.js.map +1 -0
- package/dist/admin/{ListPage-j-5j-VkL.mjs → ListPage-jfLUMF0B.mjs} +5 -5
- package/dist/admin/{ListPage-j-5j-VkL.mjs.map → ListPage-jfLUMF0B.mjs.map} +1 -1
- package/dist/admin/{ListPage-GUI-KsYW.js → ListPage-vWxKV7tW.js} +6 -6
- package/dist/admin/{ListPage-GUI-KsYW.js.map → ListPage-vWxKV7tW.js.map} +1 -1
- package/dist/admin/{ListPage-k3F774YE.mjs → ListPage-wxodcCqH.mjs} +6 -6
- package/dist/admin/ListPage-wxodcCqH.mjs.map +1 -0
- package/dist/admin/{ListPage-pdwlNZO5.mjs → ListPage-z_lGScc3.mjs} +48 -30
- package/dist/admin/ListPage-z_lGScc3.mjs.map +1 -0
- package/dist/admin/{ListView-6t08ndE1.js → ListView-96suJOx8.js} +4 -4
- package/dist/admin/{ListView-6t08ndE1.js.map → ListView-96suJOx8.js.map} +1 -1
- package/dist/admin/{ListView-mhOmYiYT.js → ListView-9c2btOtu.js} +5 -5
- package/dist/admin/{ListView-mhOmYiYT.js.map → ListView-9c2btOtu.js.map} +1 -1
- package/dist/admin/{ListView-vbeM6zm_.mjs → ListView-WuLI8P9g.mjs} +5 -5
- package/dist/admin/{ListView-vbeM6zm_.mjs.map → ListView-WuLI8P9g.mjs.map} +1 -1
- package/dist/admin/{ListView-gd-uUYo3.mjs → ListView-Xh4ewfST.mjs} +5 -5
- package/dist/admin/{ListView-gd-uUYo3.mjs.map → ListView-Xh4ewfST.mjs.map} +1 -1
- package/dist/admin/{Login-VnmdXnMj.mjs → Login-Che5xFmG.mjs} +4 -4
- package/dist/admin/{Login-VnmdXnMj.mjs.map → Login-Che5xFmG.mjs.map} +1 -1
- package/dist/admin/{Login-KEjxL7NL.js → Login-FibrFNCh.js} +4 -4
- package/dist/admin/{Login-KEjxL7NL.js.map → Login-FibrFNCh.js.map} +1 -1
- package/dist/admin/{MagicLinkEE-lbZ8IiEW.mjs → MagicLinkEE-FrMh9qpI.mjs} +3 -3
- package/dist/admin/{MagicLinkEE-lbZ8IiEW.mjs.map → MagicLinkEE-FrMh9qpI.mjs.map} +1 -1
- package/dist/admin/{MagicLinkEE-_uF-eBZl.js → MagicLinkEE-XeVNxSHy.js} +3 -3
- package/dist/admin/{MagicLinkEE-_uF-eBZl.js.map → MagicLinkEE-XeVNxSHy.js.map} +1 -1
- package/dist/admin/{MarketplacePage-Pwwe_Pr9.js → MarketplacePage-BPe_3jP4.js} +87 -74
- package/dist/admin/MarketplacePage-BPe_3jP4.js.map +1 -0
- package/dist/admin/{MarketplacePage--aN208CJ.mjs → MarketplacePage-hQE7ybnf.mjs} +86 -73
- package/dist/admin/MarketplacePage-hQE7ybnf.mjs.map +1 -0
- package/dist/admin/{Permissions-oxdduJgE.mjs → Permissions-aSGK8VGG.mjs} +3 -3
- package/dist/admin/{Permissions-oxdduJgE.mjs.map → Permissions-aSGK8VGG.mjs.map} +1 -1
- package/dist/admin/{Permissions-SuZE5tW3.js → Permissions-bmMBmcv7.js} +3 -3
- package/dist/admin/{Permissions-SuZE5tW3.js.map → Permissions-bmMBmcv7.js.map} +1 -1
- package/dist/admin/{PrivateRoute-ndqg7K6H.js → PrivateRoute-LO9G_pCJ.js} +2 -2
- package/dist/admin/{PrivateRoute-ndqg7K6H.js.map → PrivateRoute-LO9G_pCJ.js.map} +1 -1
- package/dist/admin/{PrivateRoute-4oRTB_tX.mjs → PrivateRoute-S4Lol0B9.mjs} +2 -2
- package/dist/admin/{PrivateRoute-4oRTB_tX.mjs.map → PrivateRoute-S4Lol0B9.mjs.map} +1 -1
- package/dist/admin/{ProfilePage-wo_TrDuQ.mjs → ProfilePage-RM2Dol_b.mjs} +9 -9
- package/dist/admin/ProfilePage-RM2Dol_b.mjs.map +1 -0
- package/dist/admin/{ProfilePage-9GtyEQef.js → ProfilePage-kBO5al50.js} +8 -8
- package/dist/admin/ProfilePage-kBO5al50.js.map +1 -0
- package/dist/admin/{PurchaseAuditLogs-YYOVsNMr.js → PurchaseAuditLogs-2mIURI7O.js} +2 -2
- package/dist/admin/{PurchaseAuditLogs-YYOVsNMr.js.map → PurchaseAuditLogs-2mIURI7O.js.map} +1 -1
- package/dist/admin/{PurchaseAuditLogs-KuzDXxa_.mjs → PurchaseAuditLogs-Mzq8o-DK.mjs} +2 -2
- package/dist/admin/{PurchaseAuditLogs-KuzDXxa_.mjs.map → PurchaseAuditLogs-Mzq8o-DK.mjs.map} +1 -1
- package/dist/admin/{PurchaseSingleSignOn-UF2SMczk.js → PurchaseSingleSignOn-P_X-9MEx.js} +2 -2
- package/dist/admin/{PurchaseSingleSignOn-UF2SMczk.js.map → PurchaseSingleSignOn-P_X-9MEx.js.map} +1 -1
- package/dist/admin/{PurchaseSingleSignOn-4m19d5bJ.mjs → PurchaseSingleSignOn-cMTLeK2B.mjs} +2 -2
- package/dist/admin/{PurchaseSingleSignOn-4m19d5bJ.mjs.map → PurchaseSingleSignOn-cMTLeK2B.mjs.map} +1 -1
- package/dist/admin/{SSOProviders-QBcyB9VI.js → SSOProviders-9-d1vYXb.js} +4 -4
- package/dist/admin/SSOProviders-9-d1vYXb.js.map +1 -0
- package/dist/admin/{SSOProviders-nMmBLr8g.mjs → SSOProviders-sy3Xon2A.mjs} +4 -4
- package/dist/admin/SSOProviders-sy3Xon2A.mjs.map +1 -0
- package/dist/admin/{SelectRoles-82KlaNv9.mjs → SelectRoles-MZNlONGM.mjs} +7 -7
- package/dist/admin/SelectRoles-MZNlONGM.mjs.map +1 -0
- package/dist/admin/{SelectRoles-iUoQ1i46.js → SelectRoles-W7y7odaY.js} +8 -8
- package/dist/admin/SelectRoles-W7y7odaY.js.map +1 -0
- package/dist/admin/{SingleSignOnPage-xBAVG_IK.js → SingleSignOnPage-OwgCN2hp.js} +14 -5
- package/dist/admin/SingleSignOnPage-OwgCN2hp.js.map +1 -0
- package/dist/admin/{SingleSignOnPage-N3e0bw3O.mjs → SingleSignOnPage-gvYva6J8.mjs} +15 -6
- package/dist/admin/SingleSignOnPage-gvYva6J8.mjs.map +1 -0
- package/dist/admin/{Table-YZ9eQlTc.mjs → Table-a9i0e2LJ.mjs} +13 -20
- package/dist/admin/Table-a9i0e2LJ.mjs.map +1 -0
- package/dist/admin/{Table-M_g0IUVs.js → Table-mhCUTq4S.js} +13 -20
- package/dist/admin/Table-mhCUTq4S.js.map +1 -0
- package/dist/admin/{Theme-PrUuuGtN.mjs → Theme-frC82ceE.mjs} +221 -20
- package/dist/admin/Theme-frC82ceE.mjs.map +1 -0
- package/dist/admin/{Theme-7W0we6BI.js → Theme-y_rWTknM.js} +225 -19
- package/dist/admin/Theme-y_rWTknM.js.map +1 -0
- package/dist/admin/{TokenTypeSelect-vAeDNBmG.mjs → TokenTypeSelect-WifdoxkK.mjs} +5 -6
- package/dist/admin/TokenTypeSelect-WifdoxkK.mjs.map +1 -0
- package/dist/admin/{TokenTypeSelect-HMyBvTwA.js → TokenTypeSelect-XdGVptL-.js} +5 -6
- package/dist/admin/TokenTypeSelect-XdGVptL-.js.map +1 -0
- package/dist/admin/{UseCasePage-VlWOTc-k.js → UseCasePage-MjT4gpNe.js} +14 -8
- package/dist/admin/UseCasePage-MjT4gpNe.js.map +1 -0
- package/dist/admin/{UseCasePage-GupUMZgN.mjs → UseCasePage-URqtqwgm.mjs} +14 -8
- package/dist/admin/{UseCasePage-GupUMZgN.mjs.map → UseCasePage-URqtqwgm.mjs.map} +1 -1
- package/dist/admin/{admin-B6AW0Kov.mjs → admin-GZ-AP2T0.mjs} +2 -2
- package/dist/admin/{admin-B6AW0Kov.mjs.map → admin-GZ-AP2T0.mjs.map} +1 -1
- package/dist/admin/{apiTokens-YMUmHnrH.mjs → apiTokens-GQe-GqwZ.mjs} +2 -2
- package/dist/admin/{apiTokens-YMUmHnrH.mjs.map → apiTokens-GQe-GqwZ.mjs.map} +1 -1
- package/dist/admin/{constants-hpTrGuiB.mjs → constants-HotVFBqh.mjs} +4 -4
- package/dist/admin/{constants-hpTrGuiB.mjs.map → constants-HotVFBqh.mjs.map} +1 -1
- package/dist/admin/{constants-2ESPgM_p.js → constants-j8FcH7FB.js} +4 -4
- package/dist/admin/{constants-2ESPgM_p.js.map → constants-j8FcH7FB.js.map} +1 -1
- package/dist/admin/ee.mjs +1 -1
- package/dist/admin/{en-TbnMBjZf.js → en-_1-Nn7iH.js} +3 -2
- package/dist/admin/{en-TbnMBjZf.js.map → en-_1-Nn7iH.js.map} +1 -1
- package/dist/admin/{en-0Ld-ipyI.mjs → en-lDO5lPD0.mjs} +3 -2
- package/dist/admin/{en-0Ld-ipyI.mjs.map → en-lDO5lPD0.mjs.map} +1 -1
- package/dist/admin/{index-qf9IxVeZ.js → index-h7R8mHHX.js} +145 -291
- package/dist/admin/index-h7R8mHHX.js.map +1 -0
- package/dist/admin/{index-6pjQxyB0.mjs → index-ukxNzreH.mjs} +141 -284
- package/dist/admin/index-ukxNzreH.mjs.map +1 -0
- package/dist/admin/index.js +5 -4
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +3 -3
- package/dist/admin/{selectors-ZpHhvPK4.mjs → selectors--muHmKGe.mjs} +2 -2
- package/dist/admin/{selectors-ZpHhvPK4.mjs.map → selectors--muHmKGe.mjs.map} +1 -1
- package/dist/admin/{selectors-zQKcCNuz.js → selectors-1ySxKbos.js} +2 -2
- package/dist/admin/{selectors-zQKcCNuz.js.map → selectors-1ySxKbos.js.map} +1 -1
- package/dist/admin/src/StrapiApp.d.ts +8 -6
- package/dist/admin/src/components/Form.d.ts +3 -1
- package/dist/admin/src/components/FormInputs/Json.d.ts +2 -2
- package/dist/admin/src/components/GuidedTour/Provider.d.ts +0 -4
- package/dist/admin/src/constants.d.ts +10 -0
- package/dist/admin/src/features/Auth.d.ts +1 -1
- package/dist/admin/src/hooks/useRBAC.d.ts +1 -1
- package/dist/admin/src/index.d.ts +3 -0
- package/dist/admin/src/layouts/UnauthenticatedLayout.d.ts +1 -1
- package/dist/admin/src/pages/Marketplace/hooks/useMarketplaceData.d.ts +2 -1
- package/dist/admin/src/pages/Settings/pages/InstalledPlugins.d.ts +3 -0
- package/dist/admin/src/pages/Settings/pages/Roles/components/CollapseLabel.d.ts +1 -1
- package/dist/admin/src/types/permissions.d.ts +3 -1
- package/dist/admin/test.js +3 -3
- package/dist/admin/test.js.map +1 -1
- package/dist/admin/test.mjs +4 -4
- package/dist/admin/test.mjs.map +1 -1
- package/dist/admin/{transferTokens-CNI0TFdA.mjs → transferTokens-v8tNpI_l.mjs} +2 -2
- package/dist/admin/{transferTokens-CNI0TFdA.mjs.map → transferTokens-v8tNpI_l.mjs.map} +1 -1
- package/dist/admin/{useAdminRoles-8Uy9-IbL.js → useAdminRoles-BxjzG1Wt.js} +2 -2
- package/dist/admin/{useAdminRoles-8Uy9-IbL.js.map → useAdminRoles-BxjzG1Wt.js.map} +1 -1
- package/dist/admin/{useAdminRoles-a4_GH7yG.mjs → useAdminRoles-fAp7mZbB.mjs} +2 -2
- package/dist/admin/{useAdminRoles-a4_GH7yG.mjs.map → useAdminRoles-fAp7mZbB.mjs.map} +1 -1
- package/dist/admin/{useLicenseLimitNotification-PaR7jmqd.mjs → useLicenseLimitNotification-Qx_rSpUQ.mjs} +3 -3
- package/dist/admin/{useLicenseLimitNotification-PaR7jmqd.mjs.map → useLicenseLimitNotification-Qx_rSpUQ.mjs.map} +1 -1
- package/dist/admin/{useLicenseLimitNotification-g1vq6nzk.js → useLicenseLimitNotification-eau4ja6h.js} +2 -2
- package/dist/admin/{useLicenseLimitNotification-g1vq6nzk.js.map → useLicenseLimitNotification-eau4ja6h.js.map} +1 -1
- package/dist/admin/{useLicenseLimits-Jy6E6qc2.mjs → useLicenseLimits-j5znikzW.mjs} +2 -2
- package/dist/admin/{useLicenseLimits-Jy6E6qc2.mjs.map → useLicenseLimits-j5znikzW.mjs.map} +1 -1
- package/dist/admin/{useWebhooks-7thg-d57.mjs → useWebhooks-upF7mgdZ.mjs} +2 -2
- package/dist/admin/{useWebhooks-7thg-d57.mjs.map → useWebhooks-upF7mgdZ.mjs.map} +1 -1
- package/dist/admin/{validation-ODUz3BOU.js → validation-6SSeyGur.js} +4 -4
- package/dist/admin/validation-6SSeyGur.js.map +1 -0
- package/dist/admin/{validation-YqwSDeRS.mjs → validation-cMzmzqCF.mjs} +4 -4
- package/dist/admin/validation-cMzmzqCF.mjs.map +1 -0
- package/dist/ee/server/src/audit-logs/content-types/audit-log.d.ts +41 -0
- package/dist/ee/server/src/audit-logs/content-types/audit-log.d.ts.map +1 -0
- package/dist/ee/server/src/audit-logs/controllers/audit-logs.d.ts +7 -0
- package/dist/ee/server/src/audit-logs/controllers/audit-logs.d.ts.map +1 -0
- package/dist/ee/server/src/audit-logs/routes/audit-logs.d.ts +19 -0
- package/dist/ee/server/src/audit-logs/routes/audit-logs.d.ts.map +1 -0
- package/dist/ee/server/src/audit-logs/services/audit-logs.d.ts +27 -0
- package/dist/ee/server/src/audit-logs/services/audit-logs.d.ts.map +1 -0
- package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +12 -0
- package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -0
- package/dist/ee/server/src/audit-logs/validation/audit-logs.d.ts +6 -0
- package/dist/ee/server/src/audit-logs/validation/audit-logs.d.ts.map +1 -0
- package/dist/ee/server/src/bootstrap.d.ts +3 -0
- package/dist/ee/server/src/bootstrap.d.ts.map +1 -0
- package/dist/ee/server/src/config/admin-actions.d.ts +20 -0
- package/dist/ee/server/src/config/admin-actions.d.ts.map +1 -0
- package/dist/ee/server/src/content-types/index.d.ts +3 -0
- package/dist/ee/server/src/content-types/index.d.ts.map +1 -0
- package/dist/ee/server/src/controllers/admin.d.ts +29 -0
- package/dist/ee/server/src/controllers/admin.d.ts.map +1 -0
- package/dist/ee/server/src/controllers/authentication-utils/constants.d.ts +10 -0
- package/dist/ee/server/src/controllers/authentication-utils/constants.d.ts.map +1 -0
- package/dist/ee/server/src/controllers/authentication-utils/index.d.ts +5 -0
- package/dist/ee/server/src/controllers/authentication-utils/index.d.ts.map +1 -0
- package/dist/ee/server/src/controllers/authentication-utils/middlewares.d.ts +9 -0
- package/dist/ee/server/src/controllers/authentication-utils/middlewares.d.ts.map +1 -0
- package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts +55 -0
- package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts.map +1 -0
- package/dist/ee/server/src/controllers/authentication.d.ts +9 -0
- package/dist/ee/server/src/controllers/authentication.d.ts.map +1 -0
- package/dist/ee/server/src/controllers/index.d.ts +48 -0
- package/dist/ee/server/src/controllers/index.d.ts.map +1 -0
- package/dist/ee/server/src/controllers/role.d.ts +20 -0
- package/dist/ee/server/src/controllers/role.d.ts.map +1 -0
- package/dist/ee/server/src/controllers/user.d.ts +8 -0
- package/dist/ee/server/src/controllers/user.d.ts.map +1 -0
- package/dist/ee/server/src/destroy.d.ts +6 -0
- package/dist/ee/server/src/destroy.d.ts.map +1 -0
- package/dist/ee/server/src/index.d.ts +380 -0
- package/dist/ee/server/src/index.d.ts.map +1 -0
- package/dist/ee/server/src/register.d.ts +6 -0
- package/dist/ee/server/src/register.d.ts.map +1 -0
- package/dist/ee/server/src/routes/index.d.ts +47 -0
- package/dist/ee/server/src/routes/index.d.ts.map +1 -0
- package/dist/ee/server/src/routes/license-limit.d.ts +18 -0
- package/dist/ee/server/src/routes/license-limit.d.ts.map +1 -0
- package/dist/ee/server/src/routes/sso.d.ts +29 -0
- package/dist/ee/server/src/routes/sso.d.ts.map +1 -0
- package/dist/ee/server/src/routes/utils.d.ts +3 -0
- package/dist/ee/server/src/routes/utils.d.ts.map +1 -0
- package/dist/ee/server/src/services/auth.d.ts +6 -0
- package/dist/ee/server/src/services/auth.d.ts.map +1 -0
- package/dist/ee/server/src/services/index.d.ts +39 -0
- package/dist/ee/server/src/services/index.d.ts.map +1 -0
- package/dist/ee/server/src/services/metrics.d.ts +8 -0
- package/dist/ee/server/src/services/metrics.d.ts.map +1 -0
- package/dist/ee/server/src/services/passport/provider-registry.d.ts +4 -0
- package/dist/ee/server/src/services/passport/provider-registry.d.ts.map +1 -0
- package/dist/ee/server/src/services/passport/sso.d.ts +19 -0
- package/dist/ee/server/src/services/passport/sso.d.ts.map +1 -0
- package/dist/ee/server/src/services/passport.d.ts +13 -0
- package/dist/ee/server/src/services/passport.d.ts.map +1 -0
- package/dist/ee/server/src/services/role.d.ts +5 -0
- package/dist/ee/server/src/services/role.d.ts.map +1 -0
- package/dist/ee/server/src/services/seat-enforcement.d.ts +6 -0
- package/dist/ee/server/src/services/seat-enforcement.d.ts.map +1 -0
- package/dist/ee/server/src/services/user.d.ts +10 -0
- package/dist/ee/server/src/services/user.d.ts.map +1 -0
- package/dist/ee/server/src/utils/index.d.ts +11 -0
- package/dist/ee/server/src/utils/index.d.ts.map +1 -0
- package/dist/ee/server/src/utils/persisted-tables.d.ts +42 -0
- package/dist/ee/server/src/utils/persisted-tables.d.ts.map +1 -0
- package/dist/ee/server/src/utils/sso-lock.d.ts +6 -0
- package/dist/ee/server/src/utils/sso-lock.d.ts.map +1 -0
- package/dist/ee/server/src/validation/authentication.d.ts +15 -0
- package/dist/ee/server/src/validation/authentication.d.ts.map +1 -0
- package/dist/ee/server/src/validation/role.d.ts +21 -0
- package/dist/ee/server/src/validation/role.d.ts.map +1 -0
- package/dist/ee/server/src/validation/user.d.ts +19 -0
- package/dist/ee/server/src/validation/user.d.ts.map +1 -0
- package/dist/package.json.d.ts +16 -15
- package/dist/server/index.js +1934 -539
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +1734 -338
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/config/admin-actions.d.ts +26 -0
- package/dist/server/src/config/admin-actions.d.ts.map +1 -1
- package/dist/server/src/domain/action/index.d.ts +51 -1
- package/dist/server/src/domain/action/index.d.ts.map +1 -1
- package/dist/server/src/domain/action/provider.d.ts +10 -13
- package/dist/server/src/domain/action/provider.d.ts.map +1 -1
- package/dist/server/src/domain/condition/provider.d.ts +5 -6
- package/dist/server/src/domain/condition/provider.d.ts.map +1 -1
- package/dist/server/src/domain/permission/index.d.ts +2 -2
- package/dist/server/src/domain/permission/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +738 -10
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/services/action.d.ts +1 -3
- package/dist/server/src/services/action.d.ts.map +1 -1
- package/dist/server/src/services/permission.d.ts +11 -18
- package/dist/server/src/services/permission.d.ts.map +1 -1
- package/dist/server/src/services/transfer/permission.d.ts +6 -2
- package/dist/server/src/services/transfer/permission.d.ts.map +1 -1
- package/dist/server/src/validation/action-provider.d.ts.map +1 -1
- package/dist/shared/contracts/admin.d.ts +1 -0
- package/dist/shared/contracts/admin.d.ts.map +1 -1
- package/dist/shared/contracts/user.d.ts +1 -1
- package/dist/shared/contracts/user.d.ts.map +1 -1
- package/package.json +17 -16
- package/dist/admin/AdminSeatInfo-E8azTFQY.js.map +0 -1
- package/dist/admin/AdminSeatInfo-Q_hUNC5B.mjs.map +0 -1
- package/dist/admin/ApplicationInfoPage-kEld-u0P.mjs.map +0 -1
- package/dist/admin/ApplicationInfoPage-noPIfujW.js.map +0 -1
- package/dist/admin/AuthenticatedLayout-kLMmhrNQ.js.map +0 -1
- package/dist/admin/AuthenticatedLayout-zYfAXNPg.mjs.map +0 -1
- package/dist/admin/ContentBox-3MRTNw0X.js +0 -43
- package/dist/admin/ContentBox-3MRTNw0X.js.map +0 -1
- package/dist/admin/ContentBox-9LBDzws0.mjs +0 -41
- package/dist/admin/ContentBox-9LBDzws0.mjs.map +0 -1
- package/dist/admin/CreatePage-0dG6JVsn.js.map +0 -1
- package/dist/admin/CreatePage-bJgO6DND.mjs.map +0 -1
- package/dist/admin/EditPage-Bx_qeoOF.mjs.map +0 -1
- package/dist/admin/EditPage-D5r0GV3j.mjs.map +0 -1
- package/dist/admin/EditPage-T7HhMiw2.js.map +0 -1
- package/dist/admin/EditPage-X8jnX0_l.js.map +0 -1
- package/dist/admin/EditPage-iksJke6K.js.map +0 -1
- package/dist/admin/EditPage-yBDiueEy.mjs.map +0 -1
- package/dist/admin/EditView-9nfADKvX.mjs.map +0 -1
- package/dist/admin/EditView-kxg0Wurs.js.map +0 -1
- package/dist/admin/EditViewPage-I5bq_bCv.js.map +0 -1
- package/dist/admin/EditViewPage-PmrZwoCk.mjs.map +0 -1
- package/dist/admin/HomePage-XakoaT95.js.map +0 -1
- package/dist/admin/HomePage-n2buy2O4.mjs.map +0 -1
- package/dist/admin/InstalledPluginsPage--BdpZuNa.js.map +0 -1
- package/dist/admin/InstalledPluginsPage-nFNbVJPm.mjs.map +0 -1
- package/dist/admin/ListPage-SnKebmiT.js.map +0 -1
- package/dist/admin/ListPage-iBPceR0S.mjs.map +0 -1
- package/dist/admin/ListPage-k3F774YE.mjs.map +0 -1
- package/dist/admin/ListPage-nXLMZNTC.js.map +0 -1
- package/dist/admin/ListPage-pdwlNZO5.mjs.map +0 -1
- package/dist/admin/ListPage-pwMqUvh3.js.map +0 -1
- package/dist/admin/MarketplacePage--aN208CJ.mjs.map +0 -1
- package/dist/admin/MarketplacePage-Pwwe_Pr9.js.map +0 -1
- package/dist/admin/ProfilePage-9GtyEQef.js.map +0 -1
- package/dist/admin/ProfilePage-wo_TrDuQ.mjs.map +0 -1
- package/dist/admin/SSOProviders-QBcyB9VI.js.map +0 -1
- package/dist/admin/SSOProviders-nMmBLr8g.mjs.map +0 -1
- package/dist/admin/SelectRoles-82KlaNv9.mjs.map +0 -1
- package/dist/admin/SelectRoles-iUoQ1i46.js.map +0 -1
- package/dist/admin/SingleSignOnPage-N3e0bw3O.mjs.map +0 -1
- package/dist/admin/SingleSignOnPage-xBAVG_IK.js.map +0 -1
- package/dist/admin/Table-M_g0IUVs.js.map +0 -1
- package/dist/admin/Table-YZ9eQlTc.mjs.map +0 -1
- package/dist/admin/Theme-7W0we6BI.js.map +0 -1
- package/dist/admin/Theme-PrUuuGtN.mjs.map +0 -1
- package/dist/admin/TokenTypeSelect-HMyBvTwA.js.map +0 -1
- package/dist/admin/TokenTypeSelect-vAeDNBmG.mjs.map +0 -1
- package/dist/admin/UseCasePage-VlWOTc-k.js.map +0 -1
- package/dist/admin/index-6pjQxyB0.mjs.map +0 -1
- package/dist/admin/index-qf9IxVeZ.js.map +0 -1
- package/dist/admin/src/pages/InstalledPluginsPage.d.ts +0 -3
- package/dist/admin/validation-ODUz3BOU.js.map +0 -1
- package/dist/admin/validation-YqwSDeRS.mjs.map +0 -1
- package/dist/ee/server/index.js +0 -2180
- package/dist/ee/server/index.js.map +0 -1
- package/dist/ee/server/index.mjs +0 -2175
- package/dist/ee/server/index.mjs.map +0 -1
- package/strapi-server.js +0 -18
package/dist/server/index.js
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
2
|
+
const _ = require("lodash");
|
|
3
3
|
const fp = require("lodash/fp");
|
|
4
|
-
const utils$
|
|
4
|
+
const utils$2 = require("@strapi/utils");
|
|
5
5
|
const path = require("path");
|
|
6
6
|
const fse = require("fs-extra");
|
|
7
7
|
const koaStatic = require("koa-static");
|
|
8
8
|
const dateFns = require("date-fns");
|
|
9
9
|
require("@strapi/types");
|
|
10
|
-
const _ = require("lodash");
|
|
11
10
|
const bcrypt = require("bcryptjs");
|
|
12
|
-
const passport$
|
|
11
|
+
const passport$2 = require("koa-passport");
|
|
13
12
|
const passportLocal = require("passport-local");
|
|
14
13
|
const crypto = require("crypto");
|
|
15
14
|
const jwt = require("jsonwebtoken");
|
|
@@ -25,6 +24,7 @@ const compose = require("koa-compose");
|
|
|
25
24
|
const dataTransfer$1 = require("@strapi/data-transfer");
|
|
26
25
|
const isLocalhostIp = require("is-localhost-ip");
|
|
27
26
|
const punycode = require("punycode/");
|
|
27
|
+
const nodeSchedule = require("node-schedule");
|
|
28
28
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
29
29
|
function _interopNamespace(e) {
|
|
30
30
|
if (e && e.__esModule)
|
|
@@ -44,13 +44,13 @@ function _interopNamespace(e) {
|
|
|
44
44
|
n.default = e;
|
|
45
45
|
return Object.freeze(n);
|
|
46
46
|
}
|
|
47
|
-
const
|
|
47
|
+
const ___namespace = /* @__PURE__ */ _interopNamespace(_);
|
|
48
|
+
const utils__default = /* @__PURE__ */ _interopDefault(utils$2);
|
|
48
49
|
const path__default = /* @__PURE__ */ _interopDefault(path);
|
|
49
50
|
const fse__default = /* @__PURE__ */ _interopDefault(fse);
|
|
50
51
|
const koaStatic__default = /* @__PURE__ */ _interopDefault(koaStatic);
|
|
51
|
-
const ___namespace = /* @__PURE__ */ _interopNamespace(_);
|
|
52
52
|
const bcrypt__default = /* @__PURE__ */ _interopDefault(bcrypt);
|
|
53
|
-
const passport__default = /* @__PURE__ */ _interopDefault(passport$
|
|
53
|
+
const passport__default = /* @__PURE__ */ _interopDefault(passport$2);
|
|
54
54
|
const crypto__default = /* @__PURE__ */ _interopDefault(crypto);
|
|
55
55
|
const jwt__default = /* @__PURE__ */ _interopDefault(jwt);
|
|
56
56
|
const permissions__default = /* @__PURE__ */ _interopDefault(permissions$1);
|
|
@@ -61,10 +61,10 @@ const tsUtils__default = /* @__PURE__ */ _interopDefault(tsUtils);
|
|
|
61
61
|
const compose__default = /* @__PURE__ */ _interopDefault(compose);
|
|
62
62
|
const isLocalhostIp__default = /* @__PURE__ */ _interopDefault(isLocalhostIp);
|
|
63
63
|
const punycode__default = /* @__PURE__ */ _interopDefault(punycode);
|
|
64
|
-
const getService = (name2) => {
|
|
64
|
+
const getService$1 = (name2) => {
|
|
65
65
|
return strapi.service(`admin::${name2}`);
|
|
66
66
|
};
|
|
67
|
-
const actions = [
|
|
67
|
+
const actions$1 = [
|
|
68
68
|
{
|
|
69
69
|
uid: "marketplace.read",
|
|
70
70
|
displayName: "Access the marketplace",
|
|
@@ -115,7 +115,13 @@ const actions = [
|
|
|
115
115
|
pluginName: "admin",
|
|
116
116
|
section: "settings",
|
|
117
117
|
category: "users and roles",
|
|
118
|
-
subCategory: "users"
|
|
118
|
+
subCategory: "users",
|
|
119
|
+
aliases: [
|
|
120
|
+
{
|
|
121
|
+
actionId: "plugin::content-manager.explorer.read",
|
|
122
|
+
subjects: ["admin::user"]
|
|
123
|
+
}
|
|
124
|
+
]
|
|
119
125
|
},
|
|
120
126
|
{
|
|
121
127
|
uid: "users.update",
|
|
@@ -147,7 +153,13 @@ const actions = [
|
|
|
147
153
|
pluginName: "admin",
|
|
148
154
|
section: "settings",
|
|
149
155
|
category: "users and roles",
|
|
150
|
-
subCategory: "roles"
|
|
156
|
+
subCategory: "roles",
|
|
157
|
+
aliases: [
|
|
158
|
+
{
|
|
159
|
+
actionId: "plugin::content-manager.explorer.read",
|
|
160
|
+
subjects: ["admin::role"]
|
|
161
|
+
}
|
|
162
|
+
]
|
|
151
163
|
},
|
|
152
164
|
{
|
|
153
165
|
uid: "roles.update",
|
|
@@ -277,7 +289,7 @@ const actions = [
|
|
|
277
289
|
}
|
|
278
290
|
];
|
|
279
291
|
const adminActions = {
|
|
280
|
-
actions
|
|
292
|
+
actions: actions$1
|
|
281
293
|
};
|
|
282
294
|
const conditions = [
|
|
283
295
|
{
|
|
@@ -312,13 +324,13 @@ const defaultAdminAuthSettings = {
|
|
|
312
324
|
}
|
|
313
325
|
};
|
|
314
326
|
const registerPermissionActions = async () => {
|
|
315
|
-
await getService("permission").actionProvider.registerMany(adminActions.actions);
|
|
327
|
+
await getService$1("permission").actionProvider.registerMany(adminActions.actions);
|
|
316
328
|
};
|
|
317
329
|
const registerAdminConditions = async () => {
|
|
318
|
-
await getService("permission").conditionProvider.registerMany(adminConditions.conditions);
|
|
330
|
+
await getService$1("permission").conditionProvider.registerMany(adminConditions.conditions);
|
|
319
331
|
};
|
|
320
332
|
const registerModelHooks = () => {
|
|
321
|
-
const { sendDidChangeInterfaceLanguage: sendDidChangeInterfaceLanguage2 } = getService("metrics");
|
|
333
|
+
const { sendDidChangeInterfaceLanguage: sendDidChangeInterfaceLanguage2 } = getService$1("metrics");
|
|
322
334
|
strapi.db.lifecycles.subscribe({
|
|
323
335
|
models: ["admin::user"],
|
|
324
336
|
afterCreate: sendDidChangeInterfaceLanguage2,
|
|
@@ -334,7 +346,7 @@ const syncAuthSettings = async () => {
|
|
|
334
346
|
const adminStore = await strapi.store({ type: "core", name: "admin" });
|
|
335
347
|
const adminAuthSettings = await adminStore.get({ key: "auth" });
|
|
336
348
|
const newAuthSettings = fp.merge(defaultAdminAuthSettings, adminAuthSettings);
|
|
337
|
-
const roleExists = await getService("role").exists({
|
|
349
|
+
const roleExists = await getService$1("role").exists({
|
|
338
350
|
id: newAuthSettings.providers.defaultRole
|
|
339
351
|
});
|
|
340
352
|
if (!roleExists) {
|
|
@@ -344,7 +356,7 @@ const syncAuthSettings = async () => {
|
|
|
344
356
|
};
|
|
345
357
|
const syncAPITokensPermissions = async () => {
|
|
346
358
|
const validPermissions = strapi.contentAPI.permissions.providers.action.keys();
|
|
347
|
-
const permissionsInDB = await utils$
|
|
359
|
+
const permissionsInDB = await utils$2.async.pipe(
|
|
348
360
|
strapi.db.query("admin::api-token-permission").findMany,
|
|
349
361
|
fp.map("action")
|
|
350
362
|
)();
|
|
@@ -353,16 +365,16 @@ const syncAPITokensPermissions = async () => {
|
|
|
353
365
|
await strapi.db.query("admin::api-token-permission").deleteMany({ where: { action: { $in: unknownPermissions } } });
|
|
354
366
|
}
|
|
355
367
|
};
|
|
356
|
-
const bootstrap = async ({ strapi: strapi2 }) => {
|
|
368
|
+
const bootstrap$1 = async ({ strapi: strapi2 }) => {
|
|
357
369
|
await registerAdminConditions();
|
|
358
370
|
await registerPermissionActions();
|
|
359
371
|
registerModelHooks();
|
|
360
|
-
const permissionService = getService("permission");
|
|
361
|
-
const userService = getService("user");
|
|
362
|
-
const roleService = getService("role");
|
|
363
|
-
const apiTokenService = getService("api-token");
|
|
364
|
-
const transferService = getService("transfer");
|
|
365
|
-
const tokenService = getService("token");
|
|
372
|
+
const permissionService = getService$1("permission");
|
|
373
|
+
const userService = getService$1("user");
|
|
374
|
+
const roleService = getService$1("role");
|
|
375
|
+
const apiTokenService = getService$1("api-token");
|
|
376
|
+
const transferService = getService$1("transfer");
|
|
377
|
+
const tokenService = getService$1("token");
|
|
366
378
|
await roleService.createRolesIfNoneExist();
|
|
367
379
|
await roleService.resetSuperAdminPermissions();
|
|
368
380
|
await roleService.displayWarningIfNoSuperAdmin();
|
|
@@ -370,8 +382,8 @@ const bootstrap = async ({ strapi: strapi2 }) => {
|
|
|
370
382
|
await userService.displayWarningIfUsersDontHaveRole();
|
|
371
383
|
await syncAuthSettings();
|
|
372
384
|
await syncAPITokensPermissions();
|
|
373
|
-
await getService("metrics").sendUpdateProjectInformation(strapi2);
|
|
374
|
-
getService("metrics").startCron(strapi2);
|
|
385
|
+
await getService$1("metrics").sendUpdateProjectInformation(strapi2);
|
|
386
|
+
getService$1("metrics").startCron(strapi2);
|
|
375
387
|
apiTokenService.checkSaltIsDefined();
|
|
376
388
|
transferService.token.checkSaltIsDefined();
|
|
377
389
|
tokenService.checkSecretIsDefined();
|
|
@@ -428,7 +440,7 @@ const serveStatic = (filesDir, koaStaticOptions = {}) => {
|
|
|
428
440
|
ctx.path = prev;
|
|
429
441
|
};
|
|
430
442
|
};
|
|
431
|
-
const authenticate$
|
|
443
|
+
const authenticate$3 = async (ctx) => {
|
|
432
444
|
const { authorization } = ctx.request.header;
|
|
433
445
|
if (!authorization) {
|
|
434
446
|
return { authenticated: false };
|
|
@@ -438,7 +450,7 @@ const authenticate$2 = async (ctx) => {
|
|
|
438
450
|
return { authenticated: false };
|
|
439
451
|
}
|
|
440
452
|
const token2 = parts[1];
|
|
441
|
-
const { payload, isValid } = getService("token").decodeJwtToken(token2);
|
|
453
|
+
const { payload, isValid } = getService$1("token").decodeJwtToken(token2);
|
|
442
454
|
if (!isValid) {
|
|
443
455
|
return { authenticated: false };
|
|
444
456
|
}
|
|
@@ -446,7 +458,7 @@ const authenticate$2 = async (ctx) => {
|
|
|
446
458
|
if (!user2 || !(user2.isActive === true)) {
|
|
447
459
|
return { authenticated: false };
|
|
448
460
|
}
|
|
449
|
-
const userAbility = await getService("permission").engine.generateUserAbility(user2);
|
|
461
|
+
const userAbility = await getService$1("permission").engine.generateUserAbility(user2);
|
|
450
462
|
ctx.state.userAbility = userAbility;
|
|
451
463
|
ctx.state.user = user2;
|
|
452
464
|
return {
|
|
@@ -458,7 +470,7 @@ const authenticate$2 = async (ctx) => {
|
|
|
458
470
|
const name$1 = "admin";
|
|
459
471
|
const adminAuthStrategy = {
|
|
460
472
|
name: name$1,
|
|
461
|
-
authenticate: authenticate$
|
|
473
|
+
authenticate: authenticate$3
|
|
462
474
|
};
|
|
463
475
|
const DAY_IN_MS = 24 * 60 * 60 * 1e3;
|
|
464
476
|
const constants$3 = {
|
|
@@ -498,7 +510,7 @@ const constants$4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineP
|
|
|
498
510
|
__proto__: null,
|
|
499
511
|
default: constants$3
|
|
500
512
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
501
|
-
const { UnauthorizedError: UnauthorizedError$
|
|
513
|
+
const { UnauthorizedError: UnauthorizedError$3, ForbiddenError: ForbiddenError$2 } = utils$2.errors;
|
|
502
514
|
const isReadScope = (scope) => scope.endsWith("find") || scope.endsWith("findOne");
|
|
503
515
|
const extractToken$1 = (ctx) => {
|
|
504
516
|
if (ctx.request && ctx.request.header && ctx.request.header.authorization) {
|
|
@@ -510,8 +522,8 @@ const extractToken$1 = (ctx) => {
|
|
|
510
522
|
}
|
|
511
523
|
return null;
|
|
512
524
|
};
|
|
513
|
-
const authenticate$
|
|
514
|
-
const apiTokenService = getService("api-token");
|
|
525
|
+
const authenticate$2 = async (ctx) => {
|
|
526
|
+
const apiTokenService = getService$1("api-token");
|
|
515
527
|
const token2 = extractToken$1(ctx);
|
|
516
528
|
if (!token2) {
|
|
517
529
|
return { authenticated: false };
|
|
@@ -526,7 +538,7 @@ const authenticate$1 = async (ctx) => {
|
|
|
526
538
|
if (!fp.isNil(apiToken2.expiresAt)) {
|
|
527
539
|
const expirationDate = new Date(apiToken2.expiresAt);
|
|
528
540
|
if (expirationDate < currentDate) {
|
|
529
|
-
return { authenticated: false, error: new UnauthorizedError$
|
|
541
|
+
return { authenticated: false, error: new UnauthorizedError$3("Token expired") };
|
|
530
542
|
}
|
|
531
543
|
}
|
|
532
544
|
const hoursSinceLastUsed = dateFns.differenceInHours(currentDate, dateFns.parseISO(apiToken2.lastUsedAt));
|
|
@@ -544,44 +556,44 @@ const authenticate$1 = async (ctx) => {
|
|
|
544
556
|
}
|
|
545
557
|
return { authenticated: true, credentials: apiToken2 };
|
|
546
558
|
};
|
|
547
|
-
const verify$2 = (auth2,
|
|
559
|
+
const verify$2 = (auth2, config2) => {
|
|
548
560
|
const { credentials: apiToken2, ability: ability2 } = auth2;
|
|
549
561
|
if (!apiToken2) {
|
|
550
|
-
throw new UnauthorizedError$
|
|
562
|
+
throw new UnauthorizedError$3("Token not found");
|
|
551
563
|
}
|
|
552
564
|
const currentDate = /* @__PURE__ */ new Date();
|
|
553
565
|
if (!fp.isNil(apiToken2.expiresAt)) {
|
|
554
566
|
const expirationDate = new Date(apiToken2.expiresAt);
|
|
555
567
|
if (expirationDate < currentDate) {
|
|
556
|
-
throw new UnauthorizedError$
|
|
568
|
+
throw new UnauthorizedError$3("Token expired");
|
|
557
569
|
}
|
|
558
570
|
}
|
|
559
571
|
if (apiToken2.type === constants$3.API_TOKEN_TYPE.FULL_ACCESS) {
|
|
560
572
|
return;
|
|
561
573
|
}
|
|
562
574
|
if (apiToken2.type === constants$3.API_TOKEN_TYPE.READ_ONLY) {
|
|
563
|
-
const scopes = fp.castArray(
|
|
564
|
-
if (
|
|
575
|
+
const scopes = fp.castArray(config2.scope);
|
|
576
|
+
if (config2.scope && scopes.every(isReadScope)) {
|
|
565
577
|
return;
|
|
566
578
|
}
|
|
567
579
|
} else if (apiToken2.type === constants$3.API_TOKEN_TYPE.CUSTOM) {
|
|
568
580
|
if (!ability2) {
|
|
569
|
-
throw new ForbiddenError$
|
|
581
|
+
throw new ForbiddenError$2();
|
|
570
582
|
}
|
|
571
|
-
const scopes = fp.castArray(
|
|
583
|
+
const scopes = fp.castArray(config2.scope);
|
|
572
584
|
const isAllowed = scopes.every((scope) => ability2.can(scope));
|
|
573
585
|
if (isAllowed) {
|
|
574
586
|
return;
|
|
575
587
|
}
|
|
576
588
|
}
|
|
577
|
-
throw new ForbiddenError$
|
|
589
|
+
throw new ForbiddenError$2();
|
|
578
590
|
};
|
|
579
591
|
const apiTokenAuthStrategy = {
|
|
580
592
|
name: "api-token",
|
|
581
|
-
authenticate: authenticate$
|
|
593
|
+
authenticate: authenticate$2,
|
|
582
594
|
verify: verify$2
|
|
583
595
|
};
|
|
584
|
-
const register$
|
|
596
|
+
const register$2 = ({ strapi: strapi2 }) => {
|
|
585
597
|
const passportMiddleware = strapi2.service("admin::passport").init();
|
|
586
598
|
strapi2.server.api("admin").use(passportMiddleware);
|
|
587
599
|
strapi2.get("auth").register("admin", adminAuthStrategy);
|
|
@@ -590,8 +602,8 @@ const register$1 = ({ strapi: strapi2 }) => {
|
|
|
590
602
|
registerAdminPanelRoute({ strapi: strapi2 });
|
|
591
603
|
}
|
|
592
604
|
};
|
|
593
|
-
const destroy = async () => {
|
|
594
|
-
const { conditionProvider: conditionProvider2, actionProvider: actionProvider2 } = getService("permission");
|
|
605
|
+
const destroy$1 = async () => {
|
|
606
|
+
const { conditionProvider: conditionProvider2, actionProvider: actionProvider2 } = getService$1("permission");
|
|
595
607
|
await conditionProvider2.clear();
|
|
596
608
|
await actionProvider2.clear();
|
|
597
609
|
};
|
|
@@ -611,34 +623,34 @@ But don’t worry! You can use the following link to reset your password:
|
|
|
611
623
|
|
|
612
624
|
Thanks.`;
|
|
613
625
|
const forgotPasswordTemplate = { subject, text, html };
|
|
614
|
-
const forgotPassword$
|
|
626
|
+
const forgotPassword$2 = {
|
|
615
627
|
emailTemplate: forgotPasswordTemplate
|
|
616
628
|
};
|
|
617
|
-
const
|
|
618
|
-
forgotPassword: forgotPassword$
|
|
629
|
+
const config = {
|
|
630
|
+
forgotPassword: forgotPassword$2
|
|
619
631
|
};
|
|
620
632
|
const isAuthenticatedAdmin = (policyCtx) => {
|
|
621
633
|
return Boolean(policyCtx.state.isAuthenticated);
|
|
622
634
|
};
|
|
623
|
-
const hasPermissionsSchema = utils$
|
|
624
|
-
actions: utils$
|
|
635
|
+
const hasPermissionsSchema = utils$2.yup.object({
|
|
636
|
+
actions: utils$2.yup.array().of(
|
|
625
637
|
// @ts-expect-error yup types
|
|
626
|
-
utils$
|
|
638
|
+
utils$2.yup.lazy((val) => {
|
|
627
639
|
if (___namespace.default.isArray(val)) {
|
|
628
|
-
return utils$
|
|
640
|
+
return utils$2.yup.array().of(utils$2.yup.string()).min(1).max(2);
|
|
629
641
|
}
|
|
630
642
|
if (___namespace.default.isString(val)) {
|
|
631
|
-
return utils$
|
|
643
|
+
return utils$2.yup.string().required();
|
|
632
644
|
}
|
|
633
|
-
return utils$
|
|
634
|
-
action: utils$
|
|
635
|
-
subject: utils$
|
|
645
|
+
return utils$2.yup.object().shape({
|
|
646
|
+
action: utils$2.yup.string().required(),
|
|
647
|
+
subject: utils$2.yup.string()
|
|
636
648
|
});
|
|
637
649
|
})
|
|
638
650
|
)
|
|
639
651
|
});
|
|
640
|
-
const validateHasPermissionsInput = utils$
|
|
641
|
-
const { createPolicy: createPolicy$1 } = utils$
|
|
652
|
+
const validateHasPermissionsInput = utils$2.validateYupSchema(hasPermissionsSchema);
|
|
653
|
+
const { createPolicy: createPolicy$1 } = utils$2.policy;
|
|
642
654
|
const inputModifiers = [
|
|
643
655
|
{
|
|
644
656
|
check: ___namespace.default.isString,
|
|
@@ -657,8 +669,8 @@ const inputModifiers = [
|
|
|
657
669
|
const hasPermissions = createPolicy$1({
|
|
658
670
|
name: "admin::hasPermissions",
|
|
659
671
|
validator: validateHasPermissionsInput,
|
|
660
|
-
handler(ctx,
|
|
661
|
-
const { actions: actions2 } =
|
|
672
|
+
handler(ctx, config2) {
|
|
673
|
+
const { actions: actions2 } = config2;
|
|
662
674
|
const { userAbility: ability2 } = ctx.state;
|
|
663
675
|
const permissions2 = actions2.map(
|
|
664
676
|
(action2) => inputModifiers.find((modifier) => modifier.check(action2))?.transform(action2)
|
|
@@ -669,7 +681,7 @@ const hasPermissions = createPolicy$1({
|
|
|
669
681
|
return isAuthorized;
|
|
670
682
|
}
|
|
671
683
|
});
|
|
672
|
-
const { createPolicy } = utils$
|
|
684
|
+
const { createPolicy } = utils$2.policy;
|
|
673
685
|
const isTelemetryEnabled = createPolicy({
|
|
674
686
|
name: "admin::isTelemetryEnabled",
|
|
675
687
|
handler(_ctx, _config, { strapi: strapi2 }) {
|
|
@@ -678,8 +690,8 @@ const isTelemetryEnabled = createPolicy({
|
|
|
678
690
|
}
|
|
679
691
|
}
|
|
680
692
|
});
|
|
681
|
-
const
|
|
682
|
-
const admin$
|
|
693
|
+
const policies = { isAuthenticatedAdmin, hasPermissions, isTelemetryEnabled };
|
|
694
|
+
const admin$4 = [
|
|
683
695
|
{
|
|
684
696
|
method: "GET",
|
|
685
697
|
path: "/init",
|
|
@@ -748,7 +760,7 @@ const admin$1 = [
|
|
|
748
760
|
}
|
|
749
761
|
}
|
|
750
762
|
];
|
|
751
|
-
const authentication$
|
|
763
|
+
const authentication$2 = [
|
|
752
764
|
{
|
|
753
765
|
method: "POST",
|
|
754
766
|
path: "/login",
|
|
@@ -1177,7 +1189,7 @@ const contentApi$1 = [
|
|
|
1177
1189
|
}
|
|
1178
1190
|
}
|
|
1179
1191
|
];
|
|
1180
|
-
const { UnauthorizedError: UnauthorizedError$
|
|
1192
|
+
const { UnauthorizedError: UnauthorizedError$2, ForbiddenError: ForbiddenError$1 } = utils$2.errors;
|
|
1181
1193
|
const extractToken = (ctx) => {
|
|
1182
1194
|
if (ctx.request && ctx.request.header && ctx.request.header.authorization) {
|
|
1183
1195
|
const parts = ctx.request.header.authorization.split(/\s+/);
|
|
@@ -1188,8 +1200,8 @@ const extractToken = (ctx) => {
|
|
|
1188
1200
|
}
|
|
1189
1201
|
return null;
|
|
1190
1202
|
};
|
|
1191
|
-
const authenticate = async (ctx) => {
|
|
1192
|
-
const { token: tokenService } = getService("transfer");
|
|
1203
|
+
const authenticate$1 = async (ctx) => {
|
|
1204
|
+
const { token: tokenService } = getService$1("transfer");
|
|
1193
1205
|
const token2 = extractToken(ctx);
|
|
1194
1206
|
if (!token2) {
|
|
1195
1207
|
return { authenticated: false };
|
|
@@ -1202,7 +1214,7 @@ const authenticate = async (ctx) => {
|
|
|
1202
1214
|
if (!fp.isNil(transferToken2.expiresAt)) {
|
|
1203
1215
|
const expirationDate = new Date(transferToken2.expiresAt);
|
|
1204
1216
|
if (expirationDate < currentDate) {
|
|
1205
|
-
return { authenticated: false, error: new UnauthorizedError$
|
|
1217
|
+
return { authenticated: false, error: new UnauthorizedError$2("Token expired") };
|
|
1206
1218
|
}
|
|
1207
1219
|
}
|
|
1208
1220
|
const hoursSinceLastUsed = dateFns.differenceInHours(currentDate, dateFns.parseISO(transferToken2.lastUsedAt));
|
|
@@ -1212,36 +1224,36 @@ const authenticate = async (ctx) => {
|
|
|
1212
1224
|
data: { lastUsedAt: currentDate }
|
|
1213
1225
|
});
|
|
1214
1226
|
}
|
|
1215
|
-
const ability2 = await getService("transfer").permission.engine.generateAbility(
|
|
1227
|
+
const ability2 = await getService$1("transfer").permission.engine.generateAbility(
|
|
1216
1228
|
transferToken2.permissions.map((action2) => ({ action: action2 }))
|
|
1217
1229
|
);
|
|
1218
1230
|
return { authenticated: true, ability: ability2, credentials: transferToken2 };
|
|
1219
1231
|
};
|
|
1220
|
-
const verify$1 = async (auth2,
|
|
1232
|
+
const verify$1 = async (auth2, config2 = {}) => {
|
|
1221
1233
|
const { credentials: transferToken2, ability: ability2 } = auth2;
|
|
1222
1234
|
if (!transferToken2) {
|
|
1223
|
-
throw new UnauthorizedError$
|
|
1235
|
+
throw new UnauthorizedError$2("Token not found");
|
|
1224
1236
|
}
|
|
1225
1237
|
const currentDate = /* @__PURE__ */ new Date();
|
|
1226
1238
|
if (!fp.isNil(transferToken2.expiresAt)) {
|
|
1227
1239
|
const expirationDate = new Date(transferToken2.expiresAt);
|
|
1228
1240
|
if (expirationDate < currentDate) {
|
|
1229
|
-
throw new UnauthorizedError$
|
|
1241
|
+
throw new UnauthorizedError$2("Token expired");
|
|
1230
1242
|
}
|
|
1231
1243
|
}
|
|
1232
1244
|
if (!ability2) {
|
|
1233
|
-
throw new ForbiddenError();
|
|
1245
|
+
throw new ForbiddenError$1();
|
|
1234
1246
|
}
|
|
1235
|
-
const scopes = fp.castArray(
|
|
1247
|
+
const scopes = fp.castArray(config2.scope ?? []);
|
|
1236
1248
|
const isAllowed = scopes.every((scope) => ability2.can(scope));
|
|
1237
1249
|
if (!isAllowed) {
|
|
1238
|
-
throw new ForbiddenError();
|
|
1250
|
+
throw new ForbiddenError$1();
|
|
1239
1251
|
}
|
|
1240
1252
|
};
|
|
1241
1253
|
const name = "data-transfer";
|
|
1242
1254
|
const dataTransferAuthStrategy = {
|
|
1243
1255
|
name,
|
|
1244
|
-
authenticate,
|
|
1256
|
+
authenticate: authenticate$1,
|
|
1245
1257
|
verify: verify$1
|
|
1246
1258
|
};
|
|
1247
1259
|
const transfer$2 = [
|
|
@@ -1342,12 +1354,12 @@ const transfer$2 = [
|
|
|
1342
1354
|
}
|
|
1343
1355
|
}
|
|
1344
1356
|
];
|
|
1345
|
-
const routes = {
|
|
1357
|
+
const routes$1 = {
|
|
1346
1358
|
admin: {
|
|
1347
1359
|
type: "admin",
|
|
1348
1360
|
routes: [
|
|
1349
|
-
...admin$
|
|
1350
|
-
...authentication$
|
|
1361
|
+
...admin$4,
|
|
1362
|
+
...authentication$2,
|
|
1351
1363
|
...permissions,
|
|
1352
1364
|
...users,
|
|
1353
1365
|
...roles$1,
|
|
@@ -1358,7 +1370,7 @@ const routes = {
|
|
|
1358
1370
|
]
|
|
1359
1371
|
}
|
|
1360
1372
|
};
|
|
1361
|
-
const { ApplicationError: ApplicationError$
|
|
1373
|
+
const { ApplicationError: ApplicationError$a } = utils$2.errors;
|
|
1362
1374
|
const hashPassword = (password2) => bcrypt__default.default.hash(password2, 10);
|
|
1363
1375
|
const validatePassword = (password2, hash2) => bcrypt__default.default.compare(password2, hash2);
|
|
1364
1376
|
const checkCredentials = async ({ email: email2, password: password2 }) => {
|
|
@@ -1375,13 +1387,13 @@ const checkCredentials = async ({ email: email2, password: password2 }) => {
|
|
|
1375
1387
|
}
|
|
1376
1388
|
return [null, user2];
|
|
1377
1389
|
};
|
|
1378
|
-
const forgotPassword = async ({ email: email2 } = {}) => {
|
|
1390
|
+
const forgotPassword$1 = async ({ email: email2 } = {}) => {
|
|
1379
1391
|
const user2 = await strapi.db.query("admin::user").findOne({ where: { email: email2, isActive: true } });
|
|
1380
1392
|
if (!user2) {
|
|
1381
1393
|
return;
|
|
1382
1394
|
}
|
|
1383
|
-
const resetPasswordToken = getService("token").createToken();
|
|
1384
|
-
await getService("user").updateById(user2.id, { resetPasswordToken });
|
|
1395
|
+
const resetPasswordToken = getService$1("token").createToken();
|
|
1396
|
+
await getService$1("user").updateById(user2.id, { resetPasswordToken });
|
|
1385
1397
|
const url = `${strapi.config.get(
|
|
1386
1398
|
"admin.absoluteUrl"
|
|
1387
1399
|
)}/auth/reset-password?code=${resetPasswordToken}`;
|
|
@@ -1400,18 +1412,18 @@ const forgotPassword = async ({ email: email2 } = {}) => {
|
|
|
1400
1412
|
strapi.log.error(err);
|
|
1401
1413
|
});
|
|
1402
1414
|
};
|
|
1403
|
-
const resetPassword = async ({ resetPasswordToken, password: password2 } = {}) => {
|
|
1415
|
+
const resetPassword$1 = async ({ resetPasswordToken, password: password2 } = {}) => {
|
|
1404
1416
|
const matchingUser = await strapi.db.query("admin::user").findOne({ where: { resetPasswordToken, isActive: true } });
|
|
1405
1417
|
if (!matchingUser) {
|
|
1406
|
-
throw new ApplicationError$
|
|
1418
|
+
throw new ApplicationError$a();
|
|
1407
1419
|
}
|
|
1408
|
-
return getService("user").updateById(matchingUser.id, {
|
|
1420
|
+
return getService$1("user").updateById(matchingUser.id, {
|
|
1409
1421
|
password: password2,
|
|
1410
1422
|
resetPasswordToken: null
|
|
1411
1423
|
});
|
|
1412
1424
|
};
|
|
1413
|
-
const auth = { checkCredentials, validatePassword, hashPassword, forgotPassword, resetPassword };
|
|
1414
|
-
const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$
|
|
1425
|
+
const auth$1 = { checkCredentials, validatePassword, hashPassword, forgotPassword: forgotPassword$1, resetPassword: resetPassword$1 };
|
|
1426
|
+
const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$5 } = constants$3;
|
|
1415
1427
|
function createUser(attributes) {
|
|
1416
1428
|
return {
|
|
1417
1429
|
roles: [],
|
|
@@ -1421,7 +1433,7 @@ function createUser(attributes) {
|
|
|
1421
1433
|
};
|
|
1422
1434
|
}
|
|
1423
1435
|
const hasSuperAdminRole$1 = (user2) => {
|
|
1424
|
-
return user2.roles.filter((role2) => role2.code === SUPER_ADMIN_CODE$
|
|
1436
|
+
return user2.roles.filter((role2) => role2.code === SUPER_ADMIN_CODE$5).length > 0;
|
|
1425
1437
|
};
|
|
1426
1438
|
const ADMIN_USER_ALLOWED_FIELDS = ["id", "firstname", "lastname", "username"];
|
|
1427
1439
|
const getDefaultActionAttributes = () => ({
|
|
@@ -1437,7 +1449,8 @@ const actionFields = [
|
|
|
1437
1449
|
"pluginName",
|
|
1438
1450
|
"subjects",
|
|
1439
1451
|
"options",
|
|
1440
|
-
"actionId"
|
|
1452
|
+
"actionId",
|
|
1453
|
+
"aliases"
|
|
1441
1454
|
];
|
|
1442
1455
|
const sanitizeActionAttributes = fp.pick(actionFields);
|
|
1443
1456
|
const computeActionId = (attributes) => {
|
|
@@ -1510,18 +1523,18 @@ const checkFieldsDontHaveDuplicates = (fields) => {
|
|
|
1510
1523
|
return ___namespace.default.uniq(fields).length === fields.length;
|
|
1511
1524
|
};
|
|
1512
1525
|
const getActionFromProvider = (actionId) => {
|
|
1513
|
-
return getService("permission").actionProvider.get(actionId);
|
|
1514
|
-
};
|
|
1515
|
-
const email = utils$
|
|
1516
|
-
const firstname = utils$
|
|
1517
|
-
const lastname = utils$
|
|
1518
|
-
const username = utils$
|
|
1519
|
-
const password = utils$
|
|
1520
|
-
const roles = utils$
|
|
1521
|
-
const isAPluginName = utils$
|
|
1526
|
+
return getService$1("permission").actionProvider.get(actionId);
|
|
1527
|
+
};
|
|
1528
|
+
const email = utils$2.yup.string().email().lowercase();
|
|
1529
|
+
const firstname = utils$2.yup.string().trim().min(1);
|
|
1530
|
+
const lastname = utils$2.yup.string();
|
|
1531
|
+
const username = utils$2.yup.string().min(1);
|
|
1532
|
+
const password = utils$2.yup.string().min(8).matches(/[a-z]/, "${path} must contain at least one lowercase character").matches(/[A-Z]/, "${path} must contain at least one uppercase character").matches(/\d/, "${path} must contain at least one number");
|
|
1533
|
+
const roles = utils$2.yup.array(utils$2.yup.strapiID()).min(1);
|
|
1534
|
+
const isAPluginName = utils$2.yup.string().test("is-a-plugin-name", "is not a plugin name", function(value) {
|
|
1522
1535
|
return [void 0, "admin", ...Object.keys(strapi.plugins)].includes(value) ? true : this.createError({ path: this.path, message: `${this.path} is not an existing plugin` });
|
|
1523
1536
|
});
|
|
1524
|
-
const arrayOfConditionNames = utils$
|
|
1537
|
+
const arrayOfConditionNames = utils$2.yup.array().of(utils$2.yup.string()).test("is-an-array-of-conditions", "is not a plugin name", function(value) {
|
|
1525
1538
|
const ids = strapi.service("admin::permission").conditionProvider.keys();
|
|
1526
1539
|
return ___namespace.default.isUndefined(value) || ___namespace.default.difference(value, ids).length === 0 ? true : this.createError({ path: this.path, message: `contains conditions that don't exist` });
|
|
1527
1540
|
});
|
|
@@ -1535,7 +1548,7 @@ const checkNilFields = (action2) => function(fields) {
|
|
|
1535
1548
|
}
|
|
1536
1549
|
return actionDomain.appliesToProperty("fields", action2) || fp.isNil(fields);
|
|
1537
1550
|
};
|
|
1538
|
-
const fieldsPropertyValidation = (action2) => utils$
|
|
1551
|
+
const fieldsPropertyValidation = (action2) => utils$2.yup.array().of(utils$2.yup.string()).nullable().test(
|
|
1539
1552
|
"field-nested",
|
|
1540
1553
|
"Fields format are incorrect (bad nesting).",
|
|
1541
1554
|
checkFieldsAreCorrectlyNested
|
|
@@ -1549,15 +1562,15 @@ const fieldsPropertyValidation = (action2) => utils$1.yup.array().of(utils$1.yup
|
|
|
1549
1562
|
// @ts-expect-error yup types
|
|
1550
1563
|
checkNilFields(action2)
|
|
1551
1564
|
);
|
|
1552
|
-
const permission$3 = utils$
|
|
1553
|
-
action: utils$
|
|
1565
|
+
const permission$3 = utils$2.yup.object().shape({
|
|
1566
|
+
action: utils$2.yup.string().required().test("action-validity", "action is not an existing permission action", function(actionId) {
|
|
1554
1567
|
if (fp.isNil(actionId)) {
|
|
1555
1568
|
return true;
|
|
1556
1569
|
}
|
|
1557
1570
|
return !!getActionFromProvider(actionId);
|
|
1558
1571
|
}),
|
|
1559
|
-
actionParameters: utils$
|
|
1560
|
-
subject: utils$
|
|
1572
|
+
actionParameters: utils$2.yup.object().nullable(),
|
|
1573
|
+
subject: utils$2.yup.string().nullable().test("subject-validity", "Invalid subject submitted", function(subject2) {
|
|
1561
1574
|
const action2 = getActionFromProvider(this.options.parent.action);
|
|
1562
1575
|
if (!action2) {
|
|
1563
1576
|
return true;
|
|
@@ -1565,12 +1578,12 @@ const permission$3 = utils$1.yup.object().shape({
|
|
|
1565
1578
|
if (fp.isNil(action2.subjects)) {
|
|
1566
1579
|
return fp.isNil(subject2);
|
|
1567
1580
|
}
|
|
1568
|
-
if (fp.isArray(action2.subjects)) {
|
|
1581
|
+
if (fp.isArray(action2.subjects) && !fp.isNil(subject2)) {
|
|
1569
1582
|
return action2.subjects.includes(subject2);
|
|
1570
1583
|
}
|
|
1571
1584
|
return false;
|
|
1572
1585
|
}),
|
|
1573
|
-
properties: utils$
|
|
1586
|
+
properties: utils$2.yup.object().test("properties-structure", "Invalid property set at ${path}", function(properties) {
|
|
1574
1587
|
const action2 = getActionFromProvider(this.options.parent.action);
|
|
1575
1588
|
const hasNoProperties = fp.isEmpty(properties) || fp.isNil(properties);
|
|
1576
1589
|
if (!fp.has("options.applyToProperties", action2)) {
|
|
@@ -1609,10 +1622,10 @@ const permission$3 = utils$1.yup.object().shape({
|
|
|
1609
1622
|
}
|
|
1610
1623
|
}
|
|
1611
1624
|
),
|
|
1612
|
-
conditions: utils$
|
|
1625
|
+
conditions: utils$2.yup.array().of(utils$2.yup.string())
|
|
1613
1626
|
}).noUnknown();
|
|
1614
|
-
const updatePermissions = utils$
|
|
1615
|
-
permissions: utils$
|
|
1627
|
+
const updatePermissions = utils$2.yup.object().shape({
|
|
1628
|
+
permissions: utils$2.yup.array().required().of(permission$3).test(
|
|
1616
1629
|
"duplicated-permissions",
|
|
1617
1630
|
"Some permissions are duplicated (same action and subject)",
|
|
1618
1631
|
checkNoDuplicatedPermissions
|
|
@@ -1630,46 +1643,46 @@ const validators = {
|
|
|
1630
1643
|
permission: permission$3,
|
|
1631
1644
|
updatePermissions
|
|
1632
1645
|
};
|
|
1633
|
-
const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$
|
|
1634
|
-
const { ValidationError: ValidationError$
|
|
1635
|
-
const sanitizeUserRoles = (role2) => ___namespace.default.pick(role2, ["id", "name", "description", "code"]);
|
|
1636
|
-
const sanitizeUser = (user2) => {
|
|
1646
|
+
const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$4 } = constants$3;
|
|
1647
|
+
const { ValidationError: ValidationError$6 } = utils$2.errors;
|
|
1648
|
+
const sanitizeUserRoles$1 = (role2) => ___namespace.default.pick(role2, ["id", "name", "description", "code"]);
|
|
1649
|
+
const sanitizeUser$1 = (user2) => {
|
|
1637
1650
|
return {
|
|
1638
1651
|
...___namespace.default.omit(user2, ["password", "resetPasswordToken", "registrationToken", "roles"]),
|
|
1639
|
-
roles: user2.roles && user2.roles.map(sanitizeUserRoles)
|
|
1652
|
+
roles: user2.roles && user2.roles.map(sanitizeUserRoles$1)
|
|
1640
1653
|
};
|
|
1641
1654
|
};
|
|
1642
1655
|
const create$5 = async (attributes) => {
|
|
1643
1656
|
const userInfo = {
|
|
1644
|
-
registrationToken: getService("token").createToken(),
|
|
1657
|
+
registrationToken: getService$1("token").createToken(),
|
|
1645
1658
|
...attributes
|
|
1646
1659
|
};
|
|
1647
1660
|
if (___namespace.default.has(attributes, "password")) {
|
|
1648
|
-
userInfo.password = await getService("auth").hashPassword(attributes.password);
|
|
1661
|
+
userInfo.password = await getService$1("auth").hashPassword(attributes.password);
|
|
1649
1662
|
}
|
|
1650
1663
|
const user2 = createUser(userInfo);
|
|
1651
1664
|
const createdUser = await strapi.db.query("admin::user").create({ data: user2, populate: ["roles"] });
|
|
1652
|
-
getService("metrics").sendDidInviteUser();
|
|
1653
|
-
strapi.eventHub.emit("user.create", { user: sanitizeUser(createdUser) });
|
|
1665
|
+
getService$1("metrics").sendDidInviteUser();
|
|
1666
|
+
strapi.eventHub.emit("user.create", { user: sanitizeUser$1(createdUser) });
|
|
1654
1667
|
return createdUser;
|
|
1655
1668
|
};
|
|
1656
|
-
const updateById = async (id, attributes) => {
|
|
1669
|
+
const updateById$1 = async (id, attributes) => {
|
|
1657
1670
|
if (___namespace.default.has(attributes, "roles")) {
|
|
1658
|
-
const lastAdminUser = await isLastSuperAdminUser(id);
|
|
1659
|
-
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
1660
|
-
const willRemoveSuperAdminRole = !utils$
|
|
1671
|
+
const lastAdminUser = await isLastSuperAdminUser$1(id);
|
|
1672
|
+
const superAdminRole = await getService$1("role").getSuperAdminWithUsersCount();
|
|
1673
|
+
const willRemoveSuperAdminRole = !utils$2.arrays.includesString(attributes.roles, superAdminRole.id);
|
|
1661
1674
|
if (lastAdminUser && willRemoveSuperAdminRole) {
|
|
1662
|
-
throw new ValidationError$
|
|
1675
|
+
throw new ValidationError$6("You must have at least one user with super admin role.");
|
|
1663
1676
|
}
|
|
1664
1677
|
}
|
|
1665
1678
|
if (attributes.isActive === false) {
|
|
1666
|
-
const lastAdminUser = await isLastSuperAdminUser(id);
|
|
1679
|
+
const lastAdminUser = await isLastSuperAdminUser$1(id);
|
|
1667
1680
|
if (lastAdminUser) {
|
|
1668
|
-
throw new ValidationError$
|
|
1681
|
+
throw new ValidationError$6("You must have at least one user with super admin role.");
|
|
1669
1682
|
}
|
|
1670
1683
|
}
|
|
1671
1684
|
if (___namespace.default.has(attributes, "password")) {
|
|
1672
|
-
const hashedPassword = await getService("auth").hashPassword(attributes.password);
|
|
1685
|
+
const hashedPassword = await getService$1("auth").hashPassword(attributes.password);
|
|
1673
1686
|
const updatedUser2 = await strapi.db.query("admin::user").update({
|
|
1674
1687
|
where: { id },
|
|
1675
1688
|
data: {
|
|
@@ -1678,7 +1691,7 @@ const updateById = async (id, attributes) => {
|
|
|
1678
1691
|
},
|
|
1679
1692
|
populate: ["roles"]
|
|
1680
1693
|
});
|
|
1681
|
-
strapi.eventHub.emit("user.update", { user: sanitizeUser(updatedUser2) });
|
|
1694
|
+
strapi.eventHub.emit("user.update", { user: sanitizeUser$1(updatedUser2) });
|
|
1682
1695
|
return updatedUser2;
|
|
1683
1696
|
}
|
|
1684
1697
|
const updatedUser = await strapi.db.query("admin::user").update({
|
|
@@ -1687,7 +1700,7 @@ const updateById = async (id, attributes) => {
|
|
|
1687
1700
|
populate: ["roles"]
|
|
1688
1701
|
});
|
|
1689
1702
|
if (updatedUser) {
|
|
1690
|
-
strapi.eventHub.emit("user.update", { user: sanitizeUser(updatedUser) });
|
|
1703
|
+
strapi.eventHub.emit("user.update", { user: sanitizeUser$1(updatedUser) });
|
|
1691
1704
|
}
|
|
1692
1705
|
return updatedUser;
|
|
1693
1706
|
};
|
|
@@ -1699,17 +1712,17 @@ const resetPasswordByEmail = async (email2, password$1) => {
|
|
|
1699
1712
|
try {
|
|
1700
1713
|
await password.validate(password$1);
|
|
1701
1714
|
} catch (error) {
|
|
1702
|
-
throw new ValidationError$
|
|
1715
|
+
throw new ValidationError$6(
|
|
1703
1716
|
"Invalid password. Expected a minimum of 8 characters with at least one number and one uppercase letter"
|
|
1704
1717
|
);
|
|
1705
1718
|
}
|
|
1706
|
-
await updateById(user2.id, { password: password$1 });
|
|
1719
|
+
await updateById$1(user2.id, { password: password$1 });
|
|
1707
1720
|
};
|
|
1708
|
-
const isLastSuperAdminUser = async (userId) => {
|
|
1709
|
-
const user2 = await findOne$
|
|
1721
|
+
const isLastSuperAdminUser$1 = async (userId) => {
|
|
1722
|
+
const user2 = await findOne$2(userId);
|
|
1710
1723
|
if (!user2)
|
|
1711
1724
|
return false;
|
|
1712
|
-
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
1725
|
+
const superAdminRole = await getService$1("role").getSuperAdminWithUsersCount();
|
|
1713
1726
|
return superAdminRole.usersCount === 1 && hasSuperAdminRole$1(user2);
|
|
1714
1727
|
};
|
|
1715
1728
|
const exists$3 = async (attributes = {}) => {
|
|
@@ -1722,15 +1735,15 @@ const findRegistrationInfo = async (registrationToken) => {
|
|
|
1722
1735
|
}
|
|
1723
1736
|
return ___namespace.default.pick(user2, ["email", "firstname", "lastname"]);
|
|
1724
1737
|
};
|
|
1725
|
-
const register = async ({
|
|
1738
|
+
const register$1 = async ({
|
|
1726
1739
|
registrationToken,
|
|
1727
1740
|
userInfo
|
|
1728
1741
|
}) => {
|
|
1729
1742
|
const matchingUser = await strapi.db.query("admin::user").findOne({ where: { registrationToken } });
|
|
1730
1743
|
if (!matchingUser) {
|
|
1731
|
-
throw new ValidationError$
|
|
1744
|
+
throw new ValidationError$6("Invalid registration info");
|
|
1732
1745
|
}
|
|
1733
|
-
return getService("user").updateById(matchingUser.id, {
|
|
1746
|
+
return getService$1("user").updateById(matchingUser.id, {
|
|
1734
1747
|
password: userInfo.password,
|
|
1735
1748
|
firstname: userInfo.firstname,
|
|
1736
1749
|
lastname: userInfo.lastname,
|
|
@@ -1738,7 +1751,7 @@ const register = async ({
|
|
|
1738
1751
|
isActive: true
|
|
1739
1752
|
});
|
|
1740
1753
|
};
|
|
1741
|
-
const findOne$
|
|
1754
|
+
const findOne$2 = async (id, populate = ["roles"]) => {
|
|
1742
1755
|
return strapi.db.query("admin::user").findOne({ where: { id }, populate });
|
|
1743
1756
|
};
|
|
1744
1757
|
const findOneByEmail = async (email2, populate = []) => {
|
|
@@ -1751,7 +1764,7 @@ const findPage = async (params = {}) => {
|
|
|
1751
1764
|
const query = strapi.get("query-params").transform("admin::user", fp.defaults({ populate: ["roles"] }, params));
|
|
1752
1765
|
return strapi.db.query("admin::user").findPage(query);
|
|
1753
1766
|
};
|
|
1754
|
-
const deleteById = async (id) => {
|
|
1767
|
+
const deleteById$1 = async (id) => {
|
|
1755
1768
|
const userToDelete = await strapi.db.query("admin::user").findOne({
|
|
1756
1769
|
where: { id },
|
|
1757
1770
|
populate: ["roles"]
|
|
@@ -1760,19 +1773,19 @@ const deleteById = async (id) => {
|
|
|
1760
1773
|
return null;
|
|
1761
1774
|
}
|
|
1762
1775
|
if (userToDelete) {
|
|
1763
|
-
if (userToDelete.roles.some((r) => r.code === SUPER_ADMIN_CODE$
|
|
1764
|
-
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
1776
|
+
if (userToDelete.roles.some((r) => r.code === SUPER_ADMIN_CODE$4)) {
|
|
1777
|
+
const superAdminRole = await getService$1("role").getSuperAdminWithUsersCount();
|
|
1765
1778
|
if (superAdminRole.usersCount === 1) {
|
|
1766
|
-
throw new ValidationError$
|
|
1779
|
+
throw new ValidationError$6("You must have at least one user with super admin role.");
|
|
1767
1780
|
}
|
|
1768
1781
|
}
|
|
1769
1782
|
}
|
|
1770
1783
|
const deletedUser = await strapi.db.query("admin::user").delete({ where: { id }, populate: ["roles"] });
|
|
1771
|
-
strapi.eventHub.emit("user.delete", { user: sanitizeUser(deletedUser) });
|
|
1784
|
+
strapi.eventHub.emit("user.delete", { user: sanitizeUser$1(deletedUser) });
|
|
1772
1785
|
return deletedUser;
|
|
1773
1786
|
};
|
|
1774
|
-
const deleteByIds$
|
|
1775
|
-
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
1787
|
+
const deleteByIds$3 = async (ids) => {
|
|
1788
|
+
const superAdminRole = await getService$1("role").getSuperAdminWithUsersCount();
|
|
1776
1789
|
const nbOfSuperAdminToDelete = await strapi.db.query("admin::user").count({
|
|
1777
1790
|
where: {
|
|
1778
1791
|
id: ids,
|
|
@@ -1780,7 +1793,7 @@ const deleteByIds$2 = async (ids) => {
|
|
|
1780
1793
|
}
|
|
1781
1794
|
});
|
|
1782
1795
|
if (superAdminRole.usersCount === nbOfSuperAdminToDelete) {
|
|
1783
|
-
throw new ValidationError$
|
|
1796
|
+
throw new ValidationError$6("You must have at least one user with super admin role.");
|
|
1784
1797
|
}
|
|
1785
1798
|
const deletedUsers = [];
|
|
1786
1799
|
for (const id of ids) {
|
|
@@ -1791,7 +1804,7 @@ const deleteByIds$2 = async (ids) => {
|
|
|
1791
1804
|
deletedUsers.push(deletedUser);
|
|
1792
1805
|
}
|
|
1793
1806
|
strapi.eventHub.emit("user.delete", {
|
|
1794
|
-
users: deletedUsers.map((deletedUser) => sanitizeUser(deletedUser))
|
|
1807
|
+
users: deletedUsers.map((deletedUser) => sanitizeUser$1(deletedUser))
|
|
1795
1808
|
});
|
|
1796
1809
|
return deletedUsers;
|
|
1797
1810
|
};
|
|
@@ -1833,18 +1846,18 @@ const getLanguagesInUse = async () => {
|
|
|
1833
1846
|
const users2 = await strapi.db.query("admin::user").findMany({ select: ["preferedLanguage"] });
|
|
1834
1847
|
return users2.map((user2) => user2.preferedLanguage || "en");
|
|
1835
1848
|
};
|
|
1836
|
-
const user$
|
|
1849
|
+
const user$3 = {
|
|
1837
1850
|
create: create$5,
|
|
1838
|
-
updateById,
|
|
1851
|
+
updateById: updateById$1,
|
|
1839
1852
|
exists: exists$3,
|
|
1840
1853
|
findRegistrationInfo,
|
|
1841
|
-
register,
|
|
1842
|
-
sanitizeUser,
|
|
1843
|
-
findOne: findOne$
|
|
1854
|
+
register: register$1,
|
|
1855
|
+
sanitizeUser: sanitizeUser$1,
|
|
1856
|
+
findOne: findOne$2,
|
|
1844
1857
|
findOneByEmail,
|
|
1845
1858
|
findPage,
|
|
1846
|
-
deleteById,
|
|
1847
|
-
deleteByIds: deleteByIds$
|
|
1859
|
+
deleteById: deleteById$1,
|
|
1860
|
+
deleteByIds: deleteByIds$3,
|
|
1848
1861
|
countUsersWithoutRole,
|
|
1849
1862
|
count: count$1,
|
|
1850
1863
|
assignARoleToAll,
|
|
@@ -1924,17 +1937,17 @@ const permissionDomain = {
|
|
|
1924
1937
|
setProperty,
|
|
1925
1938
|
toPermission
|
|
1926
1939
|
};
|
|
1927
|
-
const checkPermissionsSchema = utils$
|
|
1928
|
-
permissions: utils$
|
|
1929
|
-
utils$
|
|
1930
|
-
action: utils$
|
|
1931
|
-
subject: utils$
|
|
1932
|
-
field: utils$
|
|
1940
|
+
const checkPermissionsSchema = utils$2.yup.object().shape({
|
|
1941
|
+
permissions: utils$2.yup.array().of(
|
|
1942
|
+
utils$2.yup.object().shape({
|
|
1943
|
+
action: utils$2.yup.string().required(),
|
|
1944
|
+
subject: utils$2.yup.string().nullable(),
|
|
1945
|
+
field: utils$2.yup.string()
|
|
1933
1946
|
}).noUnknown()
|
|
1934
1947
|
)
|
|
1935
1948
|
});
|
|
1936
1949
|
const checkPermissionsExist = function(permissions2) {
|
|
1937
|
-
const existingActions = getService("permission").actionProvider.values();
|
|
1950
|
+
const existingActions = getService$1("permission").actionProvider.values();
|
|
1938
1951
|
const failIndex = permissions2.findIndex(
|
|
1939
1952
|
(permission2) => !existingActions.some(
|
|
1940
1953
|
(action2) => action2.actionId === permission2.action && (action2.section !== "contentTypes" || action2.subjects.includes(permission2.subject))
|
|
@@ -1948,17 +1961,17 @@ const checkPermissionsExist = function(permissions2) {
|
|
|
1948
1961
|
})
|
|
1949
1962
|
);
|
|
1950
1963
|
};
|
|
1951
|
-
const actionsExistSchema = utils$
|
|
1952
|
-
utils$
|
|
1953
|
-
conditions: utils$
|
|
1964
|
+
const actionsExistSchema = utils$2.yup.array().of(
|
|
1965
|
+
utils$2.yup.object().shape({
|
|
1966
|
+
conditions: utils$2.yup.array().of(utils$2.yup.string())
|
|
1954
1967
|
})
|
|
1955
1968
|
).test("actions-exist", "", checkPermissionsExist);
|
|
1956
|
-
const validatePermissionsExist = utils$
|
|
1957
|
-
const validateCheckPermissionsInput = utils$
|
|
1958
|
-
const validatedUpdatePermissionsInput = utils$
|
|
1959
|
-
const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$
|
|
1960
|
-
const { createAsyncSeriesWaterfallHook } = utils$
|
|
1961
|
-
const { ApplicationError: ApplicationError$
|
|
1969
|
+
const validatePermissionsExist = utils$2.validateYupSchema(actionsExistSchema);
|
|
1970
|
+
const validateCheckPermissionsInput = utils$2.validateYupSchema(checkPermissionsSchema);
|
|
1971
|
+
const validatedUpdatePermissionsInput = utils$2.validateYupSchema(validators.updatePermissions);
|
|
1972
|
+
const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$3, CONTENT_TYPE_SECTION } = constants$3;
|
|
1973
|
+
const { createAsyncSeriesWaterfallHook } = utils$2.hooks;
|
|
1974
|
+
const { ApplicationError: ApplicationError$9 } = utils$2.errors;
|
|
1962
1975
|
const hooks = {
|
|
1963
1976
|
willResetSuperAdminPermissions: createAsyncSeriesWaterfallHook()
|
|
1964
1977
|
};
|
|
@@ -1981,11 +1994,11 @@ const arePermissionsEqual = (p1, p2) => {
|
|
|
1981
1994
|
const create$3 = async (attributes) => {
|
|
1982
1995
|
const alreadyExists = await exists$2({ name: attributes.name });
|
|
1983
1996
|
if (alreadyExists) {
|
|
1984
|
-
throw new ApplicationError$
|
|
1997
|
+
throw new ApplicationError$9(
|
|
1985
1998
|
`The name must be unique and a role with name \`${attributes.name}\` already exists.`
|
|
1986
1999
|
);
|
|
1987
2000
|
}
|
|
1988
|
-
const autoGeneratedCode = `${___namespace.default.kebabCase(attributes.name)}-${utils$
|
|
2001
|
+
const autoGeneratedCode = `${___namespace.default.kebabCase(attributes.name)}-${utils$2.dates.timestampCode()}`;
|
|
1989
2002
|
const rolesWithCode = {
|
|
1990
2003
|
...attributes,
|
|
1991
2004
|
code: attributes.code || autoGeneratedCode
|
|
@@ -1994,7 +2007,7 @@ const create$3 = async (attributes) => {
|
|
|
1994
2007
|
strapi.eventHub.emit("role.create", { role: sanitizeRole(result) });
|
|
1995
2008
|
return result;
|
|
1996
2009
|
};
|
|
1997
|
-
const findOne = (params = {}, populate) => {
|
|
2010
|
+
const findOne$1 = (params = {}, populate) => {
|
|
1998
2011
|
return strapi.db.query("admin::role").findOne({ where: params, populate });
|
|
1999
2012
|
};
|
|
2000
2013
|
const findOneWithUsersCount = async (params = {}, populate) => {
|
|
@@ -2022,7 +2035,7 @@ const update$3 = async (params, attributes) => {
|
|
|
2022
2035
|
id: { $ne: params.id }
|
|
2023
2036
|
});
|
|
2024
2037
|
if (alreadyExists) {
|
|
2025
|
-
throw new ApplicationError$
|
|
2038
|
+
throw new ApplicationError$9(
|
|
2026
2039
|
`The name must be unique and a role with name \`${sanitizedAttributes.name}\` already exists.`
|
|
2027
2040
|
);
|
|
2028
2041
|
}
|
|
@@ -2040,19 +2053,19 @@ const count = async (params = {}) => {
|
|
|
2040
2053
|
};
|
|
2041
2054
|
const checkRolesIdForDeletion = async (ids = []) => {
|
|
2042
2055
|
const superAdminRole = await getSuperAdmin();
|
|
2043
|
-
if (superAdminRole && utils$
|
|
2044
|
-
throw new ApplicationError$
|
|
2056
|
+
if (superAdminRole && utils$2.arrays.includesString(ids, superAdminRole.id)) {
|
|
2057
|
+
throw new ApplicationError$9("You cannot delete the super admin role");
|
|
2045
2058
|
}
|
|
2046
2059
|
for (const roleId of ids) {
|
|
2047
2060
|
const usersCount = await getUsersCount(roleId);
|
|
2048
2061
|
if (usersCount !== 0) {
|
|
2049
|
-
throw new ApplicationError$
|
|
2062
|
+
throw new ApplicationError$9("Some roles are still assigned to some users");
|
|
2050
2063
|
}
|
|
2051
2064
|
}
|
|
2052
2065
|
};
|
|
2053
|
-
const deleteByIds$
|
|
2066
|
+
const deleteByIds$2 = async (ids = []) => {
|
|
2054
2067
|
await checkRolesIdForDeletion(ids);
|
|
2055
|
-
await getService("permission").deleteByRolesIds(ids);
|
|
2068
|
+
await getService$1("permission").deleteByRolesIds(ids);
|
|
2056
2069
|
const deletedRoles = [];
|
|
2057
2070
|
for (const id of ids) {
|
|
2058
2071
|
const deletedRole = await strapi.db.query("admin::role").delete({ where: { id } });
|
|
@@ -2066,14 +2079,14 @@ const deleteByIds$1 = async (ids = []) => {
|
|
|
2066
2079
|
const getUsersCount = async (roleId) => {
|
|
2067
2080
|
return strapi.db.query("admin::user").count({ where: { roles: { id: roleId } } });
|
|
2068
2081
|
};
|
|
2069
|
-
const getSuperAdmin = () => findOne({ code: SUPER_ADMIN_CODE$
|
|
2070
|
-
const getSuperAdminWithUsersCount = () => findOneWithUsersCount({ code: SUPER_ADMIN_CODE$
|
|
2082
|
+
const getSuperAdmin = () => findOne$1({ code: SUPER_ADMIN_CODE$3 });
|
|
2083
|
+
const getSuperAdminWithUsersCount = () => findOneWithUsersCount({ code: SUPER_ADMIN_CODE$3 });
|
|
2071
2084
|
const createRolesIfNoneExist = async () => {
|
|
2072
2085
|
const someRolesExist = await exists$2();
|
|
2073
2086
|
if (someRolesExist) {
|
|
2074
2087
|
return;
|
|
2075
2088
|
}
|
|
2076
|
-
const { actionProvider: actionProvider2 } = getService("permission");
|
|
2089
|
+
const { actionProvider: actionProvider2 } = getService$1("permission");
|
|
2077
2090
|
const allActions = actionProvider2.values();
|
|
2078
2091
|
const contentTypesActions = allActions.filter((a) => a.section === "contentTypes");
|
|
2079
2092
|
const superAdminRole = await create$3({
|
|
@@ -2081,7 +2094,7 @@ const createRolesIfNoneExist = async () => {
|
|
|
2081
2094
|
code: "strapi-super-admin",
|
|
2082
2095
|
description: "Super Admins can access and manage all features and settings."
|
|
2083
2096
|
});
|
|
2084
|
-
await getService("user").assignARoleToAll(superAdminRole.id);
|
|
2097
|
+
await getService$1("user").assignARoleToAll(superAdminRole.id);
|
|
2085
2098
|
const editorRole = await create$3({
|
|
2086
2099
|
name: "Editor",
|
|
2087
2100
|
code: "strapi-editor",
|
|
@@ -2092,7 +2105,7 @@ const createRolesIfNoneExist = async () => {
|
|
|
2092
2105
|
code: "strapi-author",
|
|
2093
2106
|
description: "Authors can manage the content they have created."
|
|
2094
2107
|
});
|
|
2095
|
-
const editorPermissions = getService("content-type").getPermissionsWithNestedFields(
|
|
2108
|
+
const editorPermissions = getService$1("content-type").getPermissionsWithNestedFields(
|
|
2096
2109
|
contentTypesActions,
|
|
2097
2110
|
{
|
|
2098
2111
|
restrictedSubjects: ["plugin::users-permissions.user"]
|
|
@@ -2119,7 +2132,7 @@ const getDefaultPluginPermissions = ({ isAuthor = false } = {}) => {
|
|
|
2119
2132
|
};
|
|
2120
2133
|
const displayWarningIfNoSuperAdmin = async () => {
|
|
2121
2134
|
const superAdminRole = await getSuperAdminWithUsersCount();
|
|
2122
|
-
const someUsersExists = await getService("user").exists();
|
|
2135
|
+
const someUsersExists = await getService$1("user").exists();
|
|
2123
2136
|
if (!superAdminRole) {
|
|
2124
2137
|
strapi.log.warn("Your application doesn't have a super admin role.");
|
|
2125
2138
|
} else if (someUsersExists && superAdminRole.usersCount === 0) {
|
|
@@ -2128,12 +2141,12 @@ const displayWarningIfNoSuperAdmin = async () => {
|
|
|
2128
2141
|
};
|
|
2129
2142
|
const assignPermissions = async (roleId, permissions2 = []) => {
|
|
2130
2143
|
await validatePermissionsExist(permissions2);
|
|
2131
|
-
const internalActions = getService("permission").actionProvider.values().filter((action2) => action2.section === "internal").map((action2) => action2.actionId);
|
|
2132
|
-
const superAdmin = await getService("role").getSuperAdmin();
|
|
2144
|
+
const internalActions = getService$1("permission").actionProvider.values().filter((action2) => action2.section === "internal").map((action2) => action2.actionId);
|
|
2145
|
+
const superAdmin = await getService$1("role").getSuperAdmin();
|
|
2133
2146
|
const isSuperAdmin = superAdmin && superAdmin.id === roleId;
|
|
2134
2147
|
const assignRole = fp.set("role", roleId);
|
|
2135
2148
|
const permissionsWithRole = permissions2.map(assignRole).map(permissionDomain.create);
|
|
2136
|
-
const existingPermissions = await getService("permission").findMany({
|
|
2149
|
+
const existingPermissions = await getService$1("permission").findMany({
|
|
2137
2150
|
where: { role: { id: roleId } },
|
|
2138
2151
|
populate: ["role"]
|
|
2139
2152
|
});
|
|
@@ -2149,31 +2162,31 @@ const assignPermissions = async (roleId, permissions2 = []) => {
|
|
|
2149
2162
|
).filter((permission2) => !internalActions.includes(permission2.action));
|
|
2150
2163
|
const permissionsToReturn = fp.differenceBy("id", permissionsToDelete, existingPermissions);
|
|
2151
2164
|
if (permissionsToDelete.length > 0) {
|
|
2152
|
-
await getService("permission").deleteByIds(permissionsToDelete.map(fp.prop("id")));
|
|
2165
|
+
await getService$1("permission").deleteByIds(permissionsToDelete.map(fp.prop("id")));
|
|
2153
2166
|
}
|
|
2154
2167
|
if (permissionsToAdd.length > 0) {
|
|
2155
2168
|
const newPermissions = await addPermissions(roleId, permissionsToAdd);
|
|
2156
2169
|
permissionsToReturn.push(...newPermissions);
|
|
2157
2170
|
}
|
|
2158
2171
|
if (!isSuperAdmin && (permissionsToAdd.length || permissionsToDelete.length)) {
|
|
2159
|
-
await getService("metrics").sendDidUpdateRolePermissions();
|
|
2172
|
+
await getService$1("metrics").sendDidUpdateRolePermissions();
|
|
2160
2173
|
}
|
|
2161
2174
|
return permissionsToReturn;
|
|
2162
2175
|
};
|
|
2163
2176
|
const addPermissions = async (roleId, permissions2) => {
|
|
2164
|
-
const { conditionProvider: conditionProvider2, createMany: createMany2 } = getService("permission");
|
|
2177
|
+
const { conditionProvider: conditionProvider2, createMany: createMany2 } = getService$1("permission");
|
|
2165
2178
|
const { sanitizeConditions: sanitizeConditions2 } = permissionDomain;
|
|
2166
2179
|
const permissionsWithRole = permissions2.map(fp.set("role", roleId)).map(sanitizeConditions2(conditionProvider2)).map(permissionDomain.create);
|
|
2167
2180
|
return createMany2(permissionsWithRole);
|
|
2168
2181
|
};
|
|
2169
2182
|
const isContentTypeAction = (action2) => action2.section === CONTENT_TYPE_SECTION;
|
|
2170
2183
|
const resetSuperAdminPermissions = async () => {
|
|
2171
|
-
const superAdminRole = await getService("role").getSuperAdmin();
|
|
2184
|
+
const superAdminRole = await getService$1("role").getSuperAdmin();
|
|
2172
2185
|
if (!superAdminRole) {
|
|
2173
2186
|
return;
|
|
2174
2187
|
}
|
|
2175
|
-
const permissionService = getService("permission");
|
|
2176
|
-
const contentTypeService = getService("content-type");
|
|
2188
|
+
const permissionService = getService$1("permission");
|
|
2189
|
+
const contentTypeService = getService$1("content-type");
|
|
2177
2190
|
const allActions = permissionService.actionProvider.values();
|
|
2178
2191
|
const contentTypesActions = allActions.filter((action2) => isContentTypeAction(action2));
|
|
2179
2192
|
const otherActions = allActions.filter((action2) => !isContentTypeAction(action2));
|
|
@@ -2199,23 +2212,23 @@ const resetSuperAdminPermissions = async () => {
|
|
|
2199
2212
|
};
|
|
2200
2213
|
const hasSuperAdminRole = (user2) => {
|
|
2201
2214
|
const roles2 = ___namespace.default.get(user2, "roles", []);
|
|
2202
|
-
return roles2.map(fp.prop("code")).includes(SUPER_ADMIN_CODE$
|
|
2215
|
+
return roles2.map(fp.prop("code")).includes(SUPER_ADMIN_CODE$3);
|
|
2203
2216
|
};
|
|
2204
2217
|
const constants$2 = {
|
|
2205
|
-
superAdminCode: SUPER_ADMIN_CODE$
|
|
2218
|
+
superAdminCode: SUPER_ADMIN_CODE$3
|
|
2206
2219
|
};
|
|
2207
|
-
const role$
|
|
2220
|
+
const role$3 = {
|
|
2208
2221
|
hooks,
|
|
2209
2222
|
sanitizeRole,
|
|
2210
2223
|
create: create$3,
|
|
2211
|
-
findOne,
|
|
2224
|
+
findOne: findOne$1,
|
|
2212
2225
|
findOneWithUsersCount,
|
|
2213
2226
|
find,
|
|
2214
2227
|
findAllWithUsersCount,
|
|
2215
2228
|
update: update$3,
|
|
2216
2229
|
exists: exists$2,
|
|
2217
2230
|
count,
|
|
2218
|
-
deleteByIds: deleteByIds$
|
|
2231
|
+
deleteByIds: deleteByIds$2,
|
|
2219
2232
|
getUsersCount,
|
|
2220
2233
|
getSuperAdmin,
|
|
2221
2234
|
getSuperAdminWithUsersCount,
|
|
@@ -2236,7 +2249,7 @@ const createLocalStrategy = (strapi2, middleware) => {
|
|
|
2236
2249
|
session: false
|
|
2237
2250
|
},
|
|
2238
2251
|
(email2, password2, done) => {
|
|
2239
|
-
return getService("auth").checkCredentials({ email: fp.toLower(email2), password: password2 }).then(async ([error, user2, message]) => {
|
|
2252
|
+
return getService$1("auth").checkCredentials({ email: fp.toLower(email2), password: password2 }).then(async ([error, user2, message]) => {
|
|
2240
2253
|
if (middleware) {
|
|
2241
2254
|
return middleware([error, user2, message], done);
|
|
2242
2255
|
}
|
|
@@ -2253,7 +2266,7 @@ const valueIsFunctionType = ([, value]) => fp.isFunction(value);
|
|
|
2253
2266
|
const keyIsValidEventName = ([key]) => {
|
|
2254
2267
|
return Object.keys(strapi.service("admin::passport").authEventsMapper).includes(key);
|
|
2255
2268
|
};
|
|
2256
|
-
const getPassportStrategies = () => [createLocalStrategy(strapi)];
|
|
2269
|
+
const getPassportStrategies$1 = () => [createLocalStrategy(strapi)];
|
|
2257
2270
|
const registerAuthEvents = () => {
|
|
2258
2271
|
const { events = {} } = strapi.config.get("admin.auth", {});
|
|
2259
2272
|
const { authEventsMapper: authEventsMapper2 } = strapi.service("admin::passport");
|
|
@@ -2267,10 +2280,10 @@ const init = () => {
|
|
|
2267
2280
|
registerAuthEvents();
|
|
2268
2281
|
return passport__default.default.initialize();
|
|
2269
2282
|
};
|
|
2270
|
-
const passport = { init, getPassportStrategies, authEventsMapper };
|
|
2283
|
+
const passport$1 = { init, getPassportStrategies: getPassportStrategies$1, authEventsMapper };
|
|
2271
2284
|
const sendDidInviteUser = async () => {
|
|
2272
|
-
const numberOfUsers = await getService("user").count();
|
|
2273
|
-
const numberOfRoles = await getService("role").count();
|
|
2285
|
+
const numberOfUsers = await getService$1("user").count();
|
|
2286
|
+
const numberOfRoles = await getService$1("role").count();
|
|
2274
2287
|
strapi.telemetry.send("didInviteUser", {
|
|
2275
2288
|
groupProperties: { numberOfRoles, numberOfUsers }
|
|
2276
2289
|
});
|
|
@@ -2279,27 +2292,27 @@ const sendDidUpdateRolePermissions = async () => {
|
|
|
2279
2292
|
strapi.telemetry.send("didUpdateRolePermissions");
|
|
2280
2293
|
};
|
|
2281
2294
|
const sendDidChangeInterfaceLanguage = async () => {
|
|
2282
|
-
const languagesInUse = await getService("user").getLanguagesInUse();
|
|
2295
|
+
const languagesInUse = await getService$1("user").getLanguagesInUse();
|
|
2283
2296
|
strapi.telemetry.send("didChangeInterfaceLanguage", { userProperties: { languagesInUse } });
|
|
2284
2297
|
};
|
|
2285
|
-
const sendUpdateProjectInformation = async (strapi2) => {
|
|
2286
|
-
const numberOfActiveAdminUsers = await getService("user").count({ isActive: true });
|
|
2287
|
-
const numberOfAdminUsers = await getService("user").count();
|
|
2298
|
+
const sendUpdateProjectInformation$1 = async (strapi2) => {
|
|
2299
|
+
const numberOfActiveAdminUsers = await getService$1("user").count({ isActive: true });
|
|
2300
|
+
const numberOfAdminUsers = await getService$1("user").count();
|
|
2288
2301
|
strapi2.telemetry.send("didUpdateProjectInformation", {
|
|
2289
2302
|
groupProperties: { numberOfActiveAdminUsers, numberOfAdminUsers }
|
|
2290
2303
|
});
|
|
2291
2304
|
};
|
|
2292
|
-
const startCron = (strapi2) => {
|
|
2305
|
+
const startCron$1 = (strapi2) => {
|
|
2293
2306
|
strapi2.cron.add({
|
|
2294
|
-
"0 0 0 * * *": () => sendUpdateProjectInformation(strapi2)
|
|
2307
|
+
"0 0 0 * * *": () => sendUpdateProjectInformation$1(strapi2)
|
|
2295
2308
|
});
|
|
2296
2309
|
};
|
|
2297
|
-
const metrics = {
|
|
2310
|
+
const metrics$1 = {
|
|
2298
2311
|
sendDidInviteUser,
|
|
2299
2312
|
sendDidUpdateRolePermissions,
|
|
2300
2313
|
sendDidChangeInterfaceLanguage,
|
|
2301
|
-
sendUpdateProjectInformation,
|
|
2302
|
-
startCron
|
|
2314
|
+
sendUpdateProjectInformation: sendUpdateProjectInformation$1,
|
|
2315
|
+
startCron: startCron$1
|
|
2303
2316
|
};
|
|
2304
2317
|
const defaultJwtOptions = { expiresIn: "30d" };
|
|
2305
2318
|
const getTokenOptions = () => {
|
|
@@ -2344,37 +2357,37 @@ const token$3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
|
|
|
2344
2357
|
decodeJwtToken,
|
|
2345
2358
|
getTokenOptions
|
|
2346
2359
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
2347
|
-
const registerProviderActionSchema = utils$
|
|
2348
|
-
utils$
|
|
2349
|
-
uid: utils$
|
|
2360
|
+
const registerProviderActionSchema = utils$2.yup.array().required().of(
|
|
2361
|
+
utils$2.yup.object().shape({
|
|
2362
|
+
uid: utils$2.yup.string().matches(
|
|
2350
2363
|
/^[a-z]([a-z|.|-]+)[a-z]$/,
|
|
2351
2364
|
(v) => `${v.path}: The id can only contain lowercase letters, dots and hyphens.`
|
|
2352
2365
|
).required(),
|
|
2353
|
-
section: utils$
|
|
2354
|
-
pluginName: utils$
|
|
2366
|
+
section: utils$2.yup.string().oneOf(["contentTypes", "plugins", "settings", "internal"]).required(),
|
|
2367
|
+
pluginName: utils$2.yup.mixed().when("section", {
|
|
2355
2368
|
is: "plugins",
|
|
2356
2369
|
then: validators.isAPluginName.required(),
|
|
2357
2370
|
otherwise: validators.isAPluginName
|
|
2358
2371
|
}),
|
|
2359
|
-
subjects: utils$
|
|
2372
|
+
subjects: utils$2.yup.mixed().when("section", {
|
|
2360
2373
|
is: "contentTypes",
|
|
2361
|
-
then: utils$
|
|
2362
|
-
otherwise: utils$
|
|
2374
|
+
then: utils$2.yup.array().of(utils$2.yup.string()).required(),
|
|
2375
|
+
otherwise: utils$2.yup.mixed().oneOf([void 0], 'subjects should only be defined for the "contentTypes" section')
|
|
2363
2376
|
}),
|
|
2364
|
-
displayName: utils$
|
|
2365
|
-
category: utils$
|
|
2377
|
+
displayName: utils$2.yup.string().required(),
|
|
2378
|
+
category: utils$2.yup.mixed().when("section", {
|
|
2366
2379
|
is: "settings",
|
|
2367
|
-
then: utils$
|
|
2368
|
-
otherwise: utils$
|
|
2380
|
+
then: utils$2.yup.string().required(),
|
|
2381
|
+
otherwise: utils$2.yup.mixed().test(
|
|
2369
2382
|
"settingsCategory",
|
|
2370
2383
|
'category should only be defined for the "settings" section',
|
|
2371
2384
|
(cat) => cat === void 0
|
|
2372
2385
|
)
|
|
2373
2386
|
}),
|
|
2374
|
-
subCategory: utils$
|
|
2387
|
+
subCategory: utils$2.yup.mixed().when("section", {
|
|
2375
2388
|
is: (section) => ["settings", "plugins"].includes(section),
|
|
2376
|
-
then: utils$
|
|
2377
|
-
otherwise: utils$
|
|
2389
|
+
then: utils$2.yup.string(),
|
|
2390
|
+
otherwise: utils$2.yup.mixed().test(
|
|
2378
2391
|
"settingsSubCategory",
|
|
2379
2392
|
'subCategory should only be defined for "plugins" and "settings" sections',
|
|
2380
2393
|
(subCat) => {
|
|
@@ -2382,17 +2395,23 @@ const registerProviderActionSchema = utils$1.yup.array().required().of(
|
|
|
2382
2395
|
}
|
|
2383
2396
|
)
|
|
2384
2397
|
}),
|
|
2385
|
-
options: utils$
|
|
2386
|
-
applyToProperties: utils$
|
|
2387
|
-
})
|
|
2398
|
+
options: utils$2.yup.object({
|
|
2399
|
+
applyToProperties: utils$2.yup.array().of(utils$2.yup.string())
|
|
2400
|
+
}),
|
|
2401
|
+
aliases: utils$2.yup.array(
|
|
2402
|
+
utils$2.yup.object({
|
|
2403
|
+
actionId: utils$2.yup.string(),
|
|
2404
|
+
subjects: utils$2.yup.array(utils$2.yup.string()).nullable()
|
|
2405
|
+
})
|
|
2406
|
+
).nullable()
|
|
2388
2407
|
}).noUnknown()
|
|
2389
2408
|
);
|
|
2390
|
-
const validateRegisterProviderAction = utils$
|
|
2391
|
-
const { ApplicationError: ApplicationError$
|
|
2409
|
+
const validateRegisterProviderAction = utils$2.validateYupSchemaSync(registerProviderActionSchema);
|
|
2410
|
+
const { ApplicationError: ApplicationError$8 } = utils$2.errors;
|
|
2392
2411
|
const createActionProvider = (options) => {
|
|
2393
|
-
const provider = utils$
|
|
2412
|
+
const provider = utils$2.providerFactory(options);
|
|
2394
2413
|
const actionHooks = {
|
|
2395
|
-
appliesPropertyToSubject: utils$
|
|
2414
|
+
appliesPropertyToSubject: utils$2.hooks.createAsyncParallelHook()
|
|
2396
2415
|
};
|
|
2397
2416
|
return {
|
|
2398
2417
|
...provider,
|
|
@@ -2418,7 +2437,7 @@ const createActionProvider = (options) => {
|
|
|
2418
2437
|
async appliesToProperty(property, actionId, subject2) {
|
|
2419
2438
|
const action2 = provider.get(actionId);
|
|
2420
2439
|
if (!action2) {
|
|
2421
|
-
throw new ApplicationError$
|
|
2440
|
+
throw new ApplicationError$8(`No action found with id "${actionId}"`);
|
|
2422
2441
|
}
|
|
2423
2442
|
const appliesToAction = actionDomain.appliesToProperty(property, action2);
|
|
2424
2443
|
if (!appliesToAction) {
|
|
@@ -2436,6 +2455,29 @@ const createActionProvider = (options) => {
|
|
|
2436
2455
|
subject: subject2
|
|
2437
2456
|
});
|
|
2438
2457
|
return results.every((result) => result !== false);
|
|
2458
|
+
},
|
|
2459
|
+
/**
|
|
2460
|
+
* @experimental
|
|
2461
|
+
*/
|
|
2462
|
+
unstable_aliases(actionId, subject2) {
|
|
2463
|
+
const isRegistered = this.has(actionId);
|
|
2464
|
+
if (!isRegistered) {
|
|
2465
|
+
return [];
|
|
2466
|
+
}
|
|
2467
|
+
return this.values().filter(
|
|
2468
|
+
(action2) => action2.aliases?.some((alias) => {
|
|
2469
|
+
if (alias.actionId !== actionId) {
|
|
2470
|
+
return false;
|
|
2471
|
+
}
|
|
2472
|
+
if (!Array.isArray(alias.subjects)) {
|
|
2473
|
+
return true;
|
|
2474
|
+
}
|
|
2475
|
+
if (!subject2) {
|
|
2476
|
+
return false;
|
|
2477
|
+
}
|
|
2478
|
+
return alias.subjects.includes(subject2);
|
|
2479
|
+
})
|
|
2480
|
+
).map((action2) => action2.actionId);
|
|
2439
2481
|
}
|
|
2440
2482
|
};
|
|
2441
2483
|
};
|
|
@@ -2473,7 +2515,7 @@ const domain = {
|
|
|
2473
2515
|
sanitizeConditionAttributes
|
|
2474
2516
|
};
|
|
2475
2517
|
const createConditionProvider = () => {
|
|
2476
|
-
const provider = utils$
|
|
2518
|
+
const provider = utils$2.providerFactory();
|
|
2477
2519
|
return {
|
|
2478
2520
|
...provider,
|
|
2479
2521
|
async register(conditionAttributes) {
|
|
@@ -2493,14 +2535,14 @@ const createConditionProvider = () => {
|
|
|
2493
2535
|
};
|
|
2494
2536
|
const {
|
|
2495
2537
|
visitors: { removePassword, expandWildcardPopulate }
|
|
2496
|
-
} = utils$
|
|
2538
|
+
} = utils$2.sanitize;
|
|
2497
2539
|
const {
|
|
2498
2540
|
constants: constants$1,
|
|
2499
2541
|
isScalarAttribute: isScalarAttribute$1,
|
|
2500
2542
|
getNonVisibleAttributes: getNonVisibleAttributes$1,
|
|
2501
2543
|
getNonWritableAttributes,
|
|
2502
2544
|
getWritableAttributes: getWritableAttributes$1
|
|
2503
|
-
} = utils$
|
|
2545
|
+
} = utils$2.contentTypes;
|
|
2504
2546
|
const {
|
|
2505
2547
|
ID_ATTRIBUTE: ID_ATTRIBUTE$1,
|
|
2506
2548
|
DOC_ID_ATTRIBUTE: DOC_ID_ATTRIBUTE$1,
|
|
@@ -2514,7 +2556,7 @@ const COMPONENT_FIELDS$1 = ["__component"];
|
|
|
2514
2556
|
const STATIC_FIELDS$1 = [ID_ATTRIBUTE$1, DOC_ID_ATTRIBUTE$1];
|
|
2515
2557
|
const createSanitizeHelpers = ({ action: action2, ability: ability$1, model }) => {
|
|
2516
2558
|
const schema = strapi.getModel(model);
|
|
2517
|
-
const { removeDisallowedFields } = utils$
|
|
2559
|
+
const { removeDisallowedFields } = utils$2.sanitize.visitors;
|
|
2518
2560
|
const ctx = {
|
|
2519
2561
|
schema,
|
|
2520
2562
|
getModel: strapi.getModel.bind(strapi)
|
|
@@ -2522,39 +2564,39 @@ const createSanitizeHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2522
2564
|
const createSanitizeQuery = (options = {}) => {
|
|
2523
2565
|
const { fields } = options;
|
|
2524
2566
|
const permittedFields = fields.shouldIncludeAll ? null : getQueryFields(fields.permitted);
|
|
2525
|
-
const sanitizeFilters = utils$
|
|
2526
|
-
utils$
|
|
2527
|
-
utils$
|
|
2528
|
-
utils$
|
|
2529
|
-
utils$
|
|
2530
|
-
utils$
|
|
2567
|
+
const sanitizeFilters = utils$2.async.pipe(
|
|
2568
|
+
utils$2.traverse.traverseQueryFilters(removeDisallowedFields(permittedFields), ctx),
|
|
2569
|
+
utils$2.traverse.traverseQueryFilters(omitDisallowedAdminUserFields, ctx),
|
|
2570
|
+
utils$2.traverse.traverseQueryFilters(omitHiddenFields, ctx),
|
|
2571
|
+
utils$2.traverse.traverseQueryFilters(removePassword, ctx),
|
|
2572
|
+
utils$2.traverse.traverseQueryFilters(({ key, value }, { remove }) => {
|
|
2531
2573
|
if (fp.isObject(value) && fp.isEmpty(value)) {
|
|
2532
2574
|
remove(key);
|
|
2533
2575
|
}
|
|
2534
2576
|
}, ctx)
|
|
2535
2577
|
);
|
|
2536
|
-
const sanitizeSort = utils$
|
|
2537
|
-
utils$
|
|
2538
|
-
utils$
|
|
2539
|
-
utils$
|
|
2540
|
-
utils$
|
|
2541
|
-
utils$
|
|
2578
|
+
const sanitizeSort = utils$2.async.pipe(
|
|
2579
|
+
utils$2.traverse.traverseQuerySort(removeDisallowedFields(permittedFields), ctx),
|
|
2580
|
+
utils$2.traverse.traverseQuerySort(omitDisallowedAdminUserFields, ctx),
|
|
2581
|
+
utils$2.traverse.traverseQuerySort(omitHiddenFields, ctx),
|
|
2582
|
+
utils$2.traverse.traverseQuerySort(removePassword, ctx),
|
|
2583
|
+
utils$2.traverse.traverseQuerySort(({ key, attribute, value }, { remove }) => {
|
|
2542
2584
|
if (!isScalarAttribute$1(attribute) && fp.isEmpty(value)) {
|
|
2543
2585
|
remove(key);
|
|
2544
2586
|
}
|
|
2545
2587
|
}, ctx)
|
|
2546
2588
|
);
|
|
2547
|
-
const sanitizePopulate = utils$
|
|
2548
|
-
utils$
|
|
2549
|
-
utils$
|
|
2550
|
-
utils$
|
|
2551
|
-
utils$
|
|
2552
|
-
utils$
|
|
2589
|
+
const sanitizePopulate = utils$2.async.pipe(
|
|
2590
|
+
utils$2.traverse.traverseQueryPopulate(expandWildcardPopulate, ctx),
|
|
2591
|
+
utils$2.traverse.traverseQueryPopulate(removeDisallowedFields(permittedFields), ctx),
|
|
2592
|
+
utils$2.traverse.traverseQueryPopulate(omitDisallowedAdminUserFields, ctx),
|
|
2593
|
+
utils$2.traverse.traverseQueryPopulate(omitHiddenFields, ctx),
|
|
2594
|
+
utils$2.traverse.traverseQueryPopulate(removePassword, ctx)
|
|
2553
2595
|
);
|
|
2554
|
-
const sanitizeFields = utils$
|
|
2555
|
-
utils$
|
|
2556
|
-
utils$
|
|
2557
|
-
utils$
|
|
2596
|
+
const sanitizeFields = utils$2.async.pipe(
|
|
2597
|
+
utils$2.traverse.traverseQueryFields(removeDisallowedFields(permittedFields), ctx),
|
|
2598
|
+
utils$2.traverse.traverseQueryFields(omitHiddenFields, ctx),
|
|
2599
|
+
utils$2.traverse.traverseQueryFields(removePassword, ctx)
|
|
2558
2600
|
);
|
|
2559
2601
|
return async (query) => {
|
|
2560
2602
|
const sanitizedQuery = fp.cloneDeep(query);
|
|
@@ -2576,15 +2618,15 @@ const createSanitizeHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2576
2618
|
const createSanitizeOutput = (options = {}) => {
|
|
2577
2619
|
const { fields } = options;
|
|
2578
2620
|
const permittedFields = fields.shouldIncludeAll ? null : getOutputFields(fields.permitted);
|
|
2579
|
-
return utils$
|
|
2621
|
+
return utils$2.async.pipe(
|
|
2580
2622
|
// Remove fields hidden from the admin
|
|
2581
|
-
utils$
|
|
2623
|
+
utils$2.traverseEntity(omitHiddenFields, ctx),
|
|
2582
2624
|
// Remove unallowed fields from admin::user relations
|
|
2583
|
-
utils$
|
|
2625
|
+
utils$2.traverseEntity(pickAllowedAdminUserFields, ctx),
|
|
2584
2626
|
// Remove not allowed fields (RBAC)
|
|
2585
|
-
utils$
|
|
2627
|
+
utils$2.traverseEntity(removeDisallowedFields(permittedFields), ctx),
|
|
2586
2628
|
// Remove all fields of type 'password'
|
|
2587
|
-
utils$
|
|
2629
|
+
utils$2.sanitize.sanitizers.sanitizePasswords({
|
|
2588
2630
|
schema,
|
|
2589
2631
|
getModel(uid) {
|
|
2590
2632
|
return strapi.getModel(uid);
|
|
@@ -2595,11 +2637,11 @@ const createSanitizeHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2595
2637
|
const createSanitizeInput = (options = {}) => {
|
|
2596
2638
|
const { fields } = options;
|
|
2597
2639
|
const permittedFields = fields.shouldIncludeAll ? null : getInputFields(fields.permitted);
|
|
2598
|
-
return utils$
|
|
2640
|
+
return utils$2.async.pipe(
|
|
2599
2641
|
// Remove fields hidden from the admin
|
|
2600
|
-
utils$
|
|
2642
|
+
utils$2.traverseEntity(omitHiddenFields, ctx),
|
|
2601
2643
|
// Remove not allowed fields (RBAC)
|
|
2602
|
-
utils$
|
|
2644
|
+
utils$2.traverseEntity(removeDisallowedFields(permittedFields), ctx),
|
|
2603
2645
|
// Remove roles from createdBy & updatedBy fields
|
|
2604
2646
|
omitCreatorRoles
|
|
2605
2647
|
);
|
|
@@ -2700,9 +2742,9 @@ const createSanitizeHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2700
2742
|
sanitizeQuery: wrapSanitize(createSanitizeQuery)
|
|
2701
2743
|
};
|
|
2702
2744
|
};
|
|
2703
|
-
const { ValidationError: ValidationError$
|
|
2704
|
-
const { throwPassword, throwDisallowedFields } = utils$
|
|
2705
|
-
const { constants, isScalarAttribute, getNonVisibleAttributes, getWritableAttributes } = utils$
|
|
2745
|
+
const { ValidationError: ValidationError$5 } = utils$2.errors;
|
|
2746
|
+
const { throwPassword, throwDisallowedFields } = utils$2.validate.visitors;
|
|
2747
|
+
const { constants, isScalarAttribute, getNonVisibleAttributes, getWritableAttributes } = utils$2.contentTypes;
|
|
2706
2748
|
const {
|
|
2707
2749
|
ID_ATTRIBUTE,
|
|
2708
2750
|
DOC_ID_ATTRIBUTE,
|
|
@@ -2716,7 +2758,7 @@ const COMPONENT_FIELDS = ["__component"];
|
|
|
2716
2758
|
const STATIC_FIELDS = [ID_ATTRIBUTE, DOC_ID_ATTRIBUTE];
|
|
2717
2759
|
const throwInvalidKey = ({ key, path: path2 }) => {
|
|
2718
2760
|
const msg = path2 && path2 !== key ? `Invalid key ${key} at ${path2}` : `Invalid key ${key}`;
|
|
2719
|
-
throw new ValidationError$
|
|
2761
|
+
throw new ValidationError$5(msg);
|
|
2720
2762
|
};
|
|
2721
2763
|
const createValidateHelpers = ({ action: action2, ability: ability$1, model }) => {
|
|
2722
2764
|
const schema = strapi.getModel(model);
|
|
@@ -2727,35 +2769,35 @@ const createValidateHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2727
2769
|
const createValidateQuery = (options = {}) => {
|
|
2728
2770
|
const { fields } = options;
|
|
2729
2771
|
const permittedFields = fields.shouldIncludeAll ? null : getQueryFields(fields.permitted);
|
|
2730
|
-
const validateFilters = utils$
|
|
2731
|
-
utils$
|
|
2732
|
-
utils$
|
|
2733
|
-
utils$
|
|
2734
|
-
utils$
|
|
2772
|
+
const validateFilters = utils$2.async.pipe(
|
|
2773
|
+
utils$2.traverse.traverseQueryFilters(throwDisallowedFields(permittedFields), ctx),
|
|
2774
|
+
utils$2.traverse.traverseQueryFilters(throwDisallowedAdminUserFields, ctx),
|
|
2775
|
+
utils$2.traverse.traverseQueryFilters(throwPassword, ctx),
|
|
2776
|
+
utils$2.traverse.traverseQueryFilters(({ key, value, path: path2 }) => {
|
|
2735
2777
|
if (fp.isObject(value) && fp.isEmpty(value)) {
|
|
2736
2778
|
throwInvalidKey({ key, path: path2.attribute });
|
|
2737
2779
|
}
|
|
2738
2780
|
}, ctx)
|
|
2739
2781
|
);
|
|
2740
|
-
const validateSort = utils$
|
|
2741
|
-
utils$
|
|
2742
|
-
utils$
|
|
2743
|
-
utils$
|
|
2744
|
-
utils$
|
|
2782
|
+
const validateSort = utils$2.async.pipe(
|
|
2783
|
+
utils$2.traverse.traverseQuerySort(throwDisallowedFields(permittedFields), ctx),
|
|
2784
|
+
utils$2.traverse.traverseQuerySort(throwDisallowedAdminUserFields, ctx),
|
|
2785
|
+
utils$2.traverse.traverseQuerySort(throwPassword, ctx),
|
|
2786
|
+
utils$2.traverse.traverseQuerySort(({ key, attribute, value, path: path2 }) => {
|
|
2745
2787
|
if (!isScalarAttribute(attribute) && fp.isEmpty(value)) {
|
|
2746
2788
|
throwInvalidKey({ key, path: path2.attribute });
|
|
2747
2789
|
}
|
|
2748
2790
|
}, ctx)
|
|
2749
2791
|
);
|
|
2750
|
-
const validateFields = utils$
|
|
2751
|
-
utils$
|
|
2752
|
-
utils$
|
|
2792
|
+
const validateFields = utils$2.async.pipe(
|
|
2793
|
+
utils$2.traverse.traverseQueryFields(throwDisallowedFields(permittedFields), ctx),
|
|
2794
|
+
utils$2.traverse.traverseQueryFields(throwPassword, ctx)
|
|
2753
2795
|
);
|
|
2754
|
-
const validatePopulate = utils$
|
|
2755
|
-
utils$
|
|
2756
|
-
utils$
|
|
2757
|
-
utils$
|
|
2758
|
-
utils$
|
|
2796
|
+
const validatePopulate = utils$2.async.pipe(
|
|
2797
|
+
utils$2.traverse.traverseQueryPopulate(throwDisallowedFields(permittedFields), ctx),
|
|
2798
|
+
utils$2.traverse.traverseQueryPopulate(throwDisallowedAdminUserFields, ctx),
|
|
2799
|
+
utils$2.traverse.traverseQueryPopulate(throwHiddenFields, ctx),
|
|
2800
|
+
utils$2.traverse.traverseQueryPopulate(throwPassword, ctx)
|
|
2759
2801
|
);
|
|
2760
2802
|
return async (query) => {
|
|
2761
2803
|
if (query.filters) {
|
|
@@ -2776,11 +2818,11 @@ const createValidateHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2776
2818
|
const createValidateInput = (options = {}) => {
|
|
2777
2819
|
const { fields } = options;
|
|
2778
2820
|
const permittedFields = fields.shouldIncludeAll ? null : getInputFields(fields.permitted);
|
|
2779
|
-
return utils$
|
|
2821
|
+
return utils$2.async.pipe(
|
|
2780
2822
|
// Remove fields hidden from the admin
|
|
2781
|
-
utils$
|
|
2823
|
+
utils$2.traverseEntity(throwHiddenFields, ctx),
|
|
2782
2824
|
// Remove not allowed fields (RBAC)
|
|
2783
|
-
utils$
|
|
2825
|
+
utils$2.traverseEntity(throwDisallowedFields(permittedFields), ctx),
|
|
2784
2826
|
// Remove roles from createdBy & updatedBy fields
|
|
2785
2827
|
omitCreatorRoles
|
|
2786
2828
|
);
|
|
@@ -2901,7 +2943,7 @@ const unwrapDeep = (obj) => {
|
|
|
2901
2943
|
{}
|
|
2902
2944
|
);
|
|
2903
2945
|
};
|
|
2904
|
-
const index
|
|
2946
|
+
const index = ({ ability: ability$1, action: action2, model }) => ({
|
|
2905
2947
|
ability: ability$1,
|
|
2906
2948
|
action: action2,
|
|
2907
2949
|
model,
|
|
@@ -2974,7 +3016,7 @@ const createPermissionEngine = (params) => {
|
|
|
2974
3016
|
* @param user
|
|
2975
3017
|
*/
|
|
2976
3018
|
async generateUserAbility(user2) {
|
|
2977
|
-
const permissions2 = await getService("permission").findUserPermissions(user2);
|
|
3019
|
+
const permissions2 = await getService$1("permission").findUserPermissions(user2);
|
|
2978
3020
|
return engine2.generateAbility(permissions2, user2);
|
|
2979
3021
|
},
|
|
2980
3022
|
/**
|
|
@@ -2989,8 +3031,8 @@ const emptyObjectFactory = () => ({});
|
|
|
2989
3031
|
const createSection = ({ initialStateFactory = emptyObjectFactory, handlers = [], matchers = [] } = {}) => {
|
|
2990
3032
|
const state = {
|
|
2991
3033
|
hooks: {
|
|
2992
|
-
handlers: utils$
|
|
2993
|
-
matchers: utils$
|
|
3034
|
+
handlers: utils$2.hooks.createAsyncSeriesHook(),
|
|
3035
|
+
matchers: utils$2.hooks.createAsyncParallelHook()
|
|
2994
3036
|
}
|
|
2995
3037
|
};
|
|
2996
3038
|
handlers.forEach((handler) => state.hooks.handlers.register(handler));
|
|
@@ -3094,7 +3136,7 @@ const toSubjectTemplate = (ct) => ({
|
|
|
3094
3136
|
label: ct.info.singularName,
|
|
3095
3137
|
properties: []
|
|
3096
3138
|
});
|
|
3097
|
-
const { isVisibleAttribute } = utils$
|
|
3139
|
+
const { isVisibleAttribute } = utils$2.contentTypes;
|
|
3098
3140
|
const settings = ({ action: action2, section }) => {
|
|
3099
3141
|
const { category, subCategory, displayName, actionId } = action2;
|
|
3100
3142
|
section.push({
|
|
@@ -3204,10 +3246,10 @@ const deleteByRolesIds = async (rolesIds) => {
|
|
|
3204
3246
|
}
|
|
3205
3247
|
});
|
|
3206
3248
|
if (permissionsToDelete.length > 0) {
|
|
3207
|
-
await deleteByIds(permissionsToDelete.map(fp.prop("id")));
|
|
3249
|
+
await deleteByIds$1(permissionsToDelete.map(fp.prop("id")));
|
|
3208
3250
|
}
|
|
3209
3251
|
};
|
|
3210
|
-
const deleteByIds = async (ids) => {
|
|
3252
|
+
const deleteByIds$1 = async (ids) => {
|
|
3211
3253
|
const result = [];
|
|
3212
3254
|
for (const id of ids) {
|
|
3213
3255
|
const queryResult = await strapi.db.query("admin::permission").delete({ where: { id } });
|
|
@@ -3239,7 +3281,7 @@ const findUserPermissions = async (user2) => {
|
|
|
3239
3281
|
return findMany({ where: { role: { users: { id: user2.id } } } });
|
|
3240
3282
|
};
|
|
3241
3283
|
const filterPermissionsToRemove = async (permissions2) => {
|
|
3242
|
-
const { actionProvider: actionProvider2 } = getService("permission");
|
|
3284
|
+
const { actionProvider: actionProvider2 } = getService$1("permission");
|
|
3243
3285
|
const permissionsToRemove = [];
|
|
3244
3286
|
for (const permission2 of permissions2) {
|
|
3245
3287
|
const { subjects, options = {} } = actionProvider2.get(permission2.action) || {};
|
|
@@ -3265,7 +3307,7 @@ const filterPermissionsToRemove = async (permissions2) => {
|
|
|
3265
3307
|
};
|
|
3266
3308
|
const cleanPermissionsInDatabase = async () => {
|
|
3267
3309
|
const pageSize = 200;
|
|
3268
|
-
const contentTypeService = getService("content-type");
|
|
3310
|
+
const contentTypeService = getService$1("content-type");
|
|
3269
3311
|
const total = await strapi.db.query("admin::permission").count();
|
|
3270
3312
|
const pageCount = Math.ceil(total / pageSize);
|
|
3271
3313
|
for (let page = 0; page < pageCount; page += 1) {
|
|
@@ -3290,7 +3332,7 @@ const cleanPermissionsInDatabase = async () => {
|
|
|
3290
3332
|
return update$2({ id: permission2.id }, permission2);
|
|
3291
3333
|
};
|
|
3292
3334
|
await Promise.all([
|
|
3293
|
-
deleteByIds(permissionsIdToRemove),
|
|
3335
|
+
deleteByIds$1(permissionsIdToRemove),
|
|
3294
3336
|
pmap__default.default(permissionsNeedingToBeUpdated, updatePromiseProvider, {
|
|
3295
3337
|
concurrency: 100,
|
|
3296
3338
|
stopOnError: true
|
|
@@ -3311,8 +3353,8 @@ const permission$2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.define
|
|
|
3311
3353
|
cleanPermissionsInDatabase,
|
|
3312
3354
|
conditionProvider,
|
|
3313
3355
|
createMany,
|
|
3314
|
-
createPermissionsManager: index
|
|
3315
|
-
deleteByIds,
|
|
3356
|
+
createPermissionsManager: index,
|
|
3357
|
+
deleteByIds: deleteByIds$1,
|
|
3316
3358
|
deleteByRolesIds,
|
|
3317
3359
|
engine: engine$1,
|
|
3318
3360
|
findMany,
|
|
@@ -3330,7 +3372,7 @@ const getNestedFields = (model, {
|
|
|
3330
3372
|
if (nestingLevel === 0) {
|
|
3331
3373
|
return prefix ? [prefix] : [];
|
|
3332
3374
|
}
|
|
3333
|
-
const nonAuthorizableFields = utils$
|
|
3375
|
+
const nonAuthorizableFields = utils$2.contentTypes.getNonVisibleAttributes(model);
|
|
3334
3376
|
return ___namespace.default.reduce(
|
|
3335
3377
|
model.attributes,
|
|
3336
3378
|
(fields, attr, key) => {
|
|
@@ -3367,7 +3409,7 @@ const getNestedFieldsWithIntermediate = (model, { prefix = "", nestingLevel = 15
|
|
|
3367
3409
|
if (nestingLevel === 0) {
|
|
3368
3410
|
return [];
|
|
3369
3411
|
}
|
|
3370
|
-
const nonAuthorizableFields = utils$
|
|
3412
|
+
const nonAuthorizableFields = utils$2.contentTypes.getNonVisibleAttributes(model);
|
|
3371
3413
|
return ___namespace.default.reduce(
|
|
3372
3414
|
model.attributes,
|
|
3373
3415
|
(fields, attr, key) => {
|
|
@@ -3409,7 +3451,7 @@ const getPermissionsWithNestedFields = (actions2, { nestingLevel, restrictedSubj
|
|
|
3409
3451
|
}, []);
|
|
3410
3452
|
};
|
|
3411
3453
|
const cleanPermissionFields = (permissions2, { nestingLevel } = {}) => {
|
|
3412
|
-
const { actionProvider: actionProvider2 } = getService("permission");
|
|
3454
|
+
const { actionProvider: actionProvider2 } = getService$1("permission");
|
|
3413
3455
|
return permissions2.map((permission2) => {
|
|
3414
3456
|
const {
|
|
3415
3457
|
action: actionId,
|
|
@@ -3448,7 +3490,7 @@ const contentType = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineP
|
|
|
3448
3490
|
getPermissionsWithNestedFields
|
|
3449
3491
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
3450
3492
|
const isValidCondition = (condition2) => {
|
|
3451
|
-
const { conditionProvider: conditionProvider2 } = getService("permission");
|
|
3493
|
+
const { conditionProvider: conditionProvider2 } = getService$1("permission");
|
|
3452
3494
|
return fp.isString(condition2) && conditionProvider2.has(condition2);
|
|
3453
3495
|
};
|
|
3454
3496
|
const condition = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
@@ -3456,11 +3498,11 @@ const condition = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePro
|
|
|
3456
3498
|
isValidCondition
|
|
3457
3499
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
3458
3500
|
const { AUTHOR_CODE, PUBLISH_ACTION } = constants$3;
|
|
3459
|
-
const { NotFoundError: NotFoundError$2 } = utils$
|
|
3501
|
+
const { NotFoundError: NotFoundError$2 } = utils$2.errors;
|
|
3460
3502
|
const getAllowedActionsForRole = async (roleId) => {
|
|
3461
|
-
const { actionProvider: actionProvider2 } = getService("permission");
|
|
3503
|
+
const { actionProvider: actionProvider2 } = getService$1("permission");
|
|
3462
3504
|
if (!fp.isNil(roleId)) {
|
|
3463
|
-
const role2 = await getService("role").findOne({ id: roleId });
|
|
3505
|
+
const role2 = await getService$1("role").findOne({ id: roleId });
|
|
3464
3506
|
if (!role2) {
|
|
3465
3507
|
throw new NotFoundError$2("role.notFound");
|
|
3466
3508
|
}
|
|
@@ -3474,7 +3516,7 @@ const action = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
|
|
|
3474
3516
|
__proto__: null,
|
|
3475
3517
|
getAllowedActionsForRole
|
|
3476
3518
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
3477
|
-
const { ValidationError: ValidationError$
|
|
3519
|
+
const { ValidationError: ValidationError$4, NotFoundError: NotFoundError$1 } = utils$2.errors;
|
|
3478
3520
|
const SELECT_FIELDS$1 = [
|
|
3479
3521
|
"id",
|
|
3480
3522
|
"name",
|
|
@@ -3489,16 +3531,16 @@ const SELECT_FIELDS$1 = [
|
|
|
3489
3531
|
const POPULATE_FIELDS$1 = ["permissions"];
|
|
3490
3532
|
const assertCustomTokenPermissionsValidity = (type, permissions2) => {
|
|
3491
3533
|
if (type !== constants$3.API_TOKEN_TYPE.CUSTOM && !fp.isEmpty(permissions2)) {
|
|
3492
|
-
throw new ValidationError$
|
|
3534
|
+
throw new ValidationError$4("Non-custom tokens should not reference permissions");
|
|
3493
3535
|
}
|
|
3494
3536
|
if (type === constants$3.API_TOKEN_TYPE.CUSTOM && !fp.isArray(permissions2)) {
|
|
3495
|
-
throw new ValidationError$
|
|
3537
|
+
throw new ValidationError$4("Missing permissions attribute for custom token");
|
|
3496
3538
|
}
|
|
3497
3539
|
if (type === constants$3.API_TOKEN_TYPE.CUSTOM) {
|
|
3498
3540
|
const validPermissions = strapi.contentAPI.permissions.providers.action.keys();
|
|
3499
3541
|
const invalidPermissions = fp.difference(permissions2, validPermissions);
|
|
3500
3542
|
if (!fp.isEmpty(invalidPermissions)) {
|
|
3501
|
-
throw new ValidationError$
|
|
3543
|
+
throw new ValidationError$4(`Unknown permissions provided: ${invalidPermissions.join(", ")}`);
|
|
3502
3544
|
}
|
|
3503
3545
|
}
|
|
3504
3546
|
};
|
|
@@ -3513,7 +3555,7 @@ const isValidLifespan$1 = (lifespan) => {
|
|
|
3513
3555
|
};
|
|
3514
3556
|
const assertValidLifespan$1 = (lifespan) => {
|
|
3515
3557
|
if (!isValidLifespan$1(lifespan)) {
|
|
3516
|
-
throw new ValidationError$
|
|
3558
|
+
throw new ValidationError$4(
|
|
3517
3559
|
`lifespan must be one of the following values:
|
|
3518
3560
|
${Object.values(constants$3.API_TOKEN_LIFESPANS).join(", ")}`
|
|
3519
3561
|
);
|
|
@@ -3548,7 +3590,7 @@ const hash$1 = (accessKey) => {
|
|
|
3548
3590
|
const getExpirationFields$1 = (lifespan) => {
|
|
3549
3591
|
const isValidNumber = fp.isNumber(lifespan) && Number.isFinite(lifespan) && lifespan > 0;
|
|
3550
3592
|
if (!isValidNumber && !fp.isNil(lifespan)) {
|
|
3551
|
-
throw new ValidationError$
|
|
3593
|
+
throw new ValidationError$4("lifespan must be a positive number or null");
|
|
3552
3594
|
}
|
|
3553
3595
|
return {
|
|
3554
3596
|
lifespan: lifespan || null,
|
|
@@ -3700,8 +3742,8 @@ const apiToken$2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePr
|
|
|
3700
3742
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
3701
3743
|
const DEFAULT_TRANSFER_ACTIONS = ["push", "pull"];
|
|
3702
3744
|
const providers = {
|
|
3703
|
-
action: utils$
|
|
3704
|
-
condition: utils$
|
|
3745
|
+
action: utils$2.providerFactory(),
|
|
3746
|
+
condition: utils$2.providerFactory()
|
|
3705
3747
|
};
|
|
3706
3748
|
DEFAULT_TRANSFER_ACTIONS.forEach((action2) => {
|
|
3707
3749
|
providers.action.register(action2, { action: action2 });
|
|
@@ -3712,7 +3754,7 @@ const permission$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.define
|
|
|
3712
3754
|
engine,
|
|
3713
3755
|
providers
|
|
3714
3756
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
3715
|
-
const { ValidationError: ValidationError$
|
|
3757
|
+
const { ValidationError: ValidationError$3, NotFoundError } = utils$2.errors;
|
|
3716
3758
|
const TRANSFER_TOKEN_UID = "admin::transfer-token";
|
|
3717
3759
|
const TRANSFER_TOKEN_PERMISSION_UID = "admin::transfer-token-permission";
|
|
3718
3760
|
const SELECT_FIELDS = [
|
|
@@ -3863,7 +3905,7 @@ const regenerate = async (id) => {
|
|
|
3863
3905
|
const getExpirationFields = (lifespan) => {
|
|
3864
3906
|
const isValidNumber = fp.isNumber(lifespan) && Number.isFinite(lifespan) && lifespan > 0;
|
|
3865
3907
|
if (!isValidNumber && !fp.isNil(lifespan)) {
|
|
3866
|
-
throw new ValidationError$
|
|
3908
|
+
throw new ValidationError$3("lifespan must be a positive number or null");
|
|
3867
3909
|
}
|
|
3868
3910
|
return {
|
|
3869
3911
|
lifespan: lifespan || null,
|
|
@@ -3871,14 +3913,14 @@ const getExpirationFields = (lifespan) => {
|
|
|
3871
3913
|
};
|
|
3872
3914
|
};
|
|
3873
3915
|
const hash = (accessKey) => {
|
|
3874
|
-
const { hasValidTokenSalt: hasValidTokenSalt2 } = getService("transfer").utils;
|
|
3916
|
+
const { hasValidTokenSalt: hasValidTokenSalt2 } = getService$1("transfer").utils;
|
|
3875
3917
|
if (!hasValidTokenSalt2()) {
|
|
3876
3918
|
throw new TypeError("Required token salt is not defined");
|
|
3877
3919
|
}
|
|
3878
3920
|
return crypto__default.default.createHmac("sha512", strapi.config.get("admin.transfer.token.salt")).update(accessKey).digest("hex");
|
|
3879
3921
|
};
|
|
3880
3922
|
const checkSaltIsDefined = () => {
|
|
3881
|
-
const { hasValidTokenSalt: hasValidTokenSalt2 } = getService("transfer").utils;
|
|
3923
|
+
const { hasValidTokenSalt: hasValidTokenSalt2 } = getService$1("transfer").utils;
|
|
3882
3924
|
if (!strapi.config.get("server.transfer.remote.enabled")) {
|
|
3883
3925
|
return;
|
|
3884
3926
|
}
|
|
@@ -3904,7 +3946,7 @@ const assertTokenPermissionsValidity = (attributes) => {
|
|
|
3904
3946
|
const validPermissions = permissionService.providers.action.keys();
|
|
3905
3947
|
const invalidPermissions = fp.difference(attributes.permissions, validPermissions);
|
|
3906
3948
|
if (!fp.isEmpty(invalidPermissions)) {
|
|
3907
|
-
throw new ValidationError$
|
|
3949
|
+
throw new ValidationError$3(`Unknown permissions provided: ${invalidPermissions.join(", ")}`);
|
|
3908
3950
|
}
|
|
3909
3951
|
};
|
|
3910
3952
|
const isValidLifespan = (lifespan) => {
|
|
@@ -3918,7 +3960,7 @@ const isValidLifespan = (lifespan) => {
|
|
|
3918
3960
|
};
|
|
3919
3961
|
const assertValidLifespan = (lifespan) => {
|
|
3920
3962
|
if (!isValidLifespan(lifespan)) {
|
|
3921
|
-
throw new ValidationError$
|
|
3963
|
+
throw new ValidationError$3(
|
|
3922
3964
|
`lifespan must be one of the following values:
|
|
3923
3965
|
${Object.values(constants$3.TRANSFER_TOKEN_LIFESPANS).join(", ")}`
|
|
3924
3966
|
);
|
|
@@ -3944,15 +3986,15 @@ const hasValidTokenSalt = () => {
|
|
|
3944
3986
|
return typeof salt === "string" && salt.length > 0;
|
|
3945
3987
|
};
|
|
3946
3988
|
const isRemoteTransferEnabled = () => {
|
|
3947
|
-
const { utils: utils2 } = getService("transfer");
|
|
3948
|
-
if (utils$
|
|
3989
|
+
const { utils: utils2 } = getService$1("transfer");
|
|
3990
|
+
if (utils$2.env.bool("STRAPI_DISABLE_REMOTE_DATA_TRANSFER") !== void 0) {
|
|
3949
3991
|
strapi.log.warn(
|
|
3950
3992
|
"STRAPI_DISABLE_REMOTE_DATA_TRANSFER is no longer supported. Instead, set transfer.remote.enabled to false in your server configuration"
|
|
3951
3993
|
);
|
|
3952
3994
|
}
|
|
3953
3995
|
return utils2.hasValidTokenSalt() && strapi.config.get("server.transfer.remote.enabled");
|
|
3954
3996
|
};
|
|
3955
|
-
const utils = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
3997
|
+
const utils$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
3956
3998
|
__proto__: null,
|
|
3957
3999
|
hasValidTokenSalt,
|
|
3958
4000
|
isRemoteTransferEnabled
|
|
@@ -3961,7 +4003,7 @@ const transfer$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePr
|
|
|
3961
4003
|
__proto__: null,
|
|
3962
4004
|
permission: permission$1,
|
|
3963
4005
|
token: token$2,
|
|
3964
|
-
utils
|
|
4006
|
+
utils: utils$1
|
|
3965
4007
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
3966
4008
|
const PROJECT_SETTINGS_FILE_INPUTS = ["menuLogo", "authLogo"];
|
|
3967
4009
|
const parseFilesData = async (files) => {
|
|
@@ -4082,14 +4124,14 @@ const projectSettings = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.def
|
|
|
4082
4124
|
parseFilesData,
|
|
4083
4125
|
updateProjectSettings: updateProjectSettings$1
|
|
4084
4126
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
4085
|
-
const
|
|
4086
|
-
auth,
|
|
4087
|
-
user: user$
|
|
4088
|
-
role: role$
|
|
4089
|
-
passport,
|
|
4127
|
+
const services$1 = {
|
|
4128
|
+
auth: auth$1,
|
|
4129
|
+
user: user$3,
|
|
4130
|
+
role: role$3,
|
|
4131
|
+
passport: passport$1,
|
|
4090
4132
|
token: token$3,
|
|
4091
4133
|
permission: permission$2,
|
|
4092
|
-
metrics,
|
|
4134
|
+
metrics: metrics$1,
|
|
4093
4135
|
"content-type": contentType,
|
|
4094
4136
|
constants: constants$4,
|
|
4095
4137
|
condition,
|
|
@@ -4122,13 +4164,13 @@ const updateProjectSettingsImagesDimensions = zod.z.object({
|
|
|
4122
4164
|
menuLogo: logoDimensions.nullish(),
|
|
4123
4165
|
authLogo: logoDimensions.nullish()
|
|
4124
4166
|
}).strict();
|
|
4125
|
-
const validateUpdateProjectSettings = utils$
|
|
4126
|
-
const validateUpdateProjectSettingsFiles = utils$
|
|
4127
|
-
const validateUpdateProjectSettingsImagesDimensions = utils$
|
|
4167
|
+
const validateUpdateProjectSettings = utils$2.validateZod(updateProjectSettings);
|
|
4168
|
+
const validateUpdateProjectSettingsFiles = utils$2.validateZod(updateProjectSettingsFiles);
|
|
4169
|
+
const validateUpdateProjectSettingsImagesDimensions = utils$2.validateZod(
|
|
4128
4170
|
updateProjectSettingsImagesDimensions
|
|
4129
4171
|
);
|
|
4130
4172
|
const { isUsingTypeScript } = tsUtils__default.default;
|
|
4131
|
-
const admin = {
|
|
4173
|
+
const admin$3 = {
|
|
4132
4174
|
// TODO very temporary to check the switch ee/ce
|
|
4133
4175
|
// When removing this we need to update the /admin/src/index.js file
|
|
4134
4176
|
// whe,re we set the strapi.window.isEE value
|
|
@@ -4140,8 +4182,8 @@ const admin = {
|
|
|
4140
4182
|
},
|
|
4141
4183
|
async init() {
|
|
4142
4184
|
let uuid = strapi.config.get("uuid", false);
|
|
4143
|
-
const hasAdmin = await getService("user").exists();
|
|
4144
|
-
const { menuLogo, authLogo } = await getService("project-settings").getProjectSettings();
|
|
4185
|
+
const hasAdmin = await getService$1("user").exists();
|
|
4186
|
+
const { menuLogo, authLogo } = await getService$1("project-settings").getProjectSettings();
|
|
4145
4187
|
const telemetryDisabled = strapi.config.get(
|
|
4146
4188
|
"packageJsonStrapi.telemetryDisabled",
|
|
4147
4189
|
null
|
|
@@ -4159,7 +4201,7 @@ const admin = {
|
|
|
4159
4201
|
};
|
|
4160
4202
|
},
|
|
4161
4203
|
async getProjectSettings() {
|
|
4162
|
-
return getService(
|
|
4204
|
+
return getService$1(
|
|
4163
4205
|
"project-settings"
|
|
4164
4206
|
).getProjectSettings();
|
|
4165
4207
|
},
|
|
@@ -4167,7 +4209,7 @@ const admin = {
|
|
|
4167
4209
|
const {
|
|
4168
4210
|
request: { files, body }
|
|
4169
4211
|
} = ctx;
|
|
4170
|
-
const projectSettingsService = getService("project-settings");
|
|
4212
|
+
const projectSettingsService = getService$1("project-settings");
|
|
4171
4213
|
await validateUpdateProjectSettings(body);
|
|
4172
4214
|
await validateUpdateProjectSettingsFiles(files);
|
|
4173
4215
|
const formatedFiles = await projectSettingsService.parseFilesData(files);
|
|
@@ -4186,7 +4228,7 @@ const admin = {
|
|
|
4186
4228
|
const useTypescriptOnAdmin = await isUsingTypeScript(
|
|
4187
4229
|
path__default.default.join(strapi.dirs.app.root, "src", "admin")
|
|
4188
4230
|
);
|
|
4189
|
-
const isHostedOnStrapiCloud = utils$
|
|
4231
|
+
const isHostedOnStrapiCloud = utils$2.env("STRAPI_HOSTING", null) === "strapi.cloud";
|
|
4190
4232
|
const numberOfAllContentTypes = ___namespace.default.size(strapi.contentTypes);
|
|
4191
4233
|
const numberOfComponents = ___namespace.default.size(strapi.components);
|
|
4192
4234
|
const getNumberOfDynamicZones = () => {
|
|
@@ -4251,26 +4293,26 @@ const admin = {
|
|
|
4251
4293
|
ctx.send({ plugins: plugins2 });
|
|
4252
4294
|
}
|
|
4253
4295
|
};
|
|
4254
|
-
const apiTokenCreationSchema = utils$
|
|
4255
|
-
name: utils$
|
|
4256
|
-
description: utils$
|
|
4257
|
-
type: utils$
|
|
4258
|
-
permissions: utils$
|
|
4259
|
-
lifespan: utils$
|
|
4296
|
+
const apiTokenCreationSchema = utils$2.yup.object().shape({
|
|
4297
|
+
name: utils$2.yup.string().min(1).required(),
|
|
4298
|
+
description: utils$2.yup.string().optional(),
|
|
4299
|
+
type: utils$2.yup.string().oneOf(Object.values(constants$3.API_TOKEN_TYPE)).required(),
|
|
4300
|
+
permissions: utils$2.yup.array().of(utils$2.yup.string()).nullable(),
|
|
4301
|
+
lifespan: utils$2.yup.number().min(1).oneOf(Object.values(constants$3.API_TOKEN_LIFESPANS)).nullable()
|
|
4260
4302
|
}).noUnknown().strict();
|
|
4261
|
-
const apiTokenUpdateSchema = utils$
|
|
4262
|
-
name: utils$
|
|
4263
|
-
description: utils$
|
|
4264
|
-
type: utils$
|
|
4265
|
-
permissions: utils$
|
|
4303
|
+
const apiTokenUpdateSchema = utils$2.yup.object().shape({
|
|
4304
|
+
name: utils$2.yup.string().min(1).notNull(),
|
|
4305
|
+
description: utils$2.yup.string().nullable(),
|
|
4306
|
+
type: utils$2.yup.string().oneOf(Object.values(constants$3.API_TOKEN_TYPE)).notNull(),
|
|
4307
|
+
permissions: utils$2.yup.array().of(utils$2.yup.string()).nullable()
|
|
4266
4308
|
}).noUnknown().strict();
|
|
4267
|
-
const validateApiTokenCreationInput = utils$
|
|
4268
|
-
const validateApiTokenUpdateInput = utils$
|
|
4269
|
-
const { ApplicationError: ApplicationError$
|
|
4309
|
+
const validateApiTokenCreationInput = utils$2.validateYupSchema(apiTokenCreationSchema);
|
|
4310
|
+
const validateApiTokenUpdateInput = utils$2.validateYupSchema(apiTokenUpdateSchema);
|
|
4311
|
+
const { ApplicationError: ApplicationError$7 } = utils$2.errors;
|
|
4270
4312
|
const apiToken$1 = {
|
|
4271
4313
|
async create(ctx) {
|
|
4272
4314
|
const { body } = ctx.request;
|
|
4273
|
-
const apiTokenService = getService("api-token");
|
|
4315
|
+
const apiTokenService = getService$1("api-token");
|
|
4274
4316
|
const attributes = {
|
|
4275
4317
|
name: fp.trim(body.name),
|
|
4276
4318
|
description: fp.trim(body.description),
|
|
@@ -4281,14 +4323,14 @@ const apiToken$1 = {
|
|
|
4281
4323
|
await validateApiTokenCreationInput(attributes);
|
|
4282
4324
|
const alreadyExists = await apiTokenService.exists({ name: attributes.name });
|
|
4283
4325
|
if (alreadyExists) {
|
|
4284
|
-
throw new ApplicationError$
|
|
4326
|
+
throw new ApplicationError$7("Name already taken");
|
|
4285
4327
|
}
|
|
4286
4328
|
const apiToken2 = await apiTokenService.create(attributes);
|
|
4287
4329
|
ctx.created({ data: apiToken2 });
|
|
4288
4330
|
},
|
|
4289
4331
|
async regenerate(ctx) {
|
|
4290
4332
|
const { id } = ctx.params;
|
|
4291
|
-
const apiTokenService = getService("api-token");
|
|
4333
|
+
const apiTokenService = getService$1("api-token");
|
|
4292
4334
|
const apiTokenExists = await apiTokenService.getById(id);
|
|
4293
4335
|
if (!apiTokenExists) {
|
|
4294
4336
|
ctx.notFound("API Token not found");
|
|
@@ -4298,19 +4340,19 @@ const apiToken$1 = {
|
|
|
4298
4340
|
ctx.created({ data: accessToken });
|
|
4299
4341
|
},
|
|
4300
4342
|
async list(ctx) {
|
|
4301
|
-
const apiTokenService = getService("api-token");
|
|
4343
|
+
const apiTokenService = getService$1("api-token");
|
|
4302
4344
|
const apiTokens2 = await apiTokenService.list();
|
|
4303
4345
|
ctx.send({ data: apiTokens2 });
|
|
4304
4346
|
},
|
|
4305
4347
|
async revoke(ctx) {
|
|
4306
4348
|
const { id } = ctx.params;
|
|
4307
|
-
const apiTokenService = getService("api-token");
|
|
4349
|
+
const apiTokenService = getService$1("api-token");
|
|
4308
4350
|
const apiToken2 = await apiTokenService.revoke(id);
|
|
4309
4351
|
ctx.deleted({ data: apiToken2 });
|
|
4310
4352
|
},
|
|
4311
4353
|
async get(ctx) {
|
|
4312
4354
|
const { id } = ctx.params;
|
|
4313
|
-
const apiTokenService = getService("api-token");
|
|
4355
|
+
const apiTokenService = getService$1("api-token");
|
|
4314
4356
|
const apiToken2 = await apiTokenService.getById(id);
|
|
4315
4357
|
if (!apiToken2) {
|
|
4316
4358
|
ctx.notFound("API Token not found");
|
|
@@ -4321,7 +4363,7 @@ const apiToken$1 = {
|
|
|
4321
4363
|
async update(ctx) {
|
|
4322
4364
|
const { body } = ctx.request;
|
|
4323
4365
|
const { id } = ctx.params;
|
|
4324
|
-
const apiTokenService = getService("api-token");
|
|
4366
|
+
const apiTokenService = getService$1("api-token");
|
|
4325
4367
|
const attributes = body;
|
|
4326
4368
|
if (fp.has("name", attributes)) {
|
|
4327
4369
|
attributes.name = fp.trim(body.name);
|
|
@@ -4336,57 +4378,62 @@ const apiToken$1 = {
|
|
|
4336
4378
|
}
|
|
4337
4379
|
if (fp.has("name", attributes)) {
|
|
4338
4380
|
const nameAlreadyTaken = await apiTokenService.getByName(attributes.name);
|
|
4339
|
-
if (!!nameAlreadyTaken && !utils$
|
|
4340
|
-
throw new ApplicationError$
|
|
4381
|
+
if (!!nameAlreadyTaken && !utils$2.strings.isEqual(nameAlreadyTaken.id, id)) {
|
|
4382
|
+
throw new ApplicationError$7("Name already taken");
|
|
4341
4383
|
}
|
|
4342
4384
|
}
|
|
4343
4385
|
const apiToken2 = await apiTokenService.update(id, attributes);
|
|
4344
4386
|
ctx.send({ data: apiToken2 });
|
|
4345
4387
|
},
|
|
4346
4388
|
async getLayout(ctx) {
|
|
4347
|
-
const apiTokenService = getService("api-token");
|
|
4389
|
+
const apiTokenService = getService$1("api-token");
|
|
4348
4390
|
const layout = await apiTokenService.getApiTokenLayout();
|
|
4349
4391
|
ctx.send({ data: layout });
|
|
4350
4392
|
}
|
|
4351
4393
|
};
|
|
4352
|
-
const userCreationSchema = utils$
|
|
4394
|
+
const userCreationSchema = utils$2.yup.object().shape({
|
|
4353
4395
|
email: validators.email.required(),
|
|
4354
4396
|
firstname: validators.firstname.required(),
|
|
4355
4397
|
lastname: validators.lastname,
|
|
4356
4398
|
roles: validators.roles.min(1),
|
|
4357
|
-
preferedLanguage: utils$
|
|
4399
|
+
preferedLanguage: utils$2.yup.string().nullable()
|
|
4358
4400
|
}).noUnknown();
|
|
4359
|
-
const profileUpdateSchema = utils$
|
|
4401
|
+
const profileUpdateSchema = utils$2.yup.object().shape({
|
|
4360
4402
|
email: validators.email.notNull(),
|
|
4361
4403
|
firstname: validators.firstname.notNull(),
|
|
4362
4404
|
lastname: validators.lastname.nullable(),
|
|
4363
4405
|
username: validators.username.nullable(),
|
|
4364
4406
|
password: validators.password.notNull(),
|
|
4365
|
-
currentPassword: utils$
|
|
4407
|
+
currentPassword: utils$2.yup.string().when(
|
|
4366
4408
|
"password",
|
|
4367
4409
|
(password2, schema) => !fp.isUndefined(password2) ? schema.required() : schema
|
|
4368
4410
|
).notNull(),
|
|
4369
|
-
preferedLanguage: utils$
|
|
4411
|
+
preferedLanguage: utils$2.yup.string().nullable()
|
|
4370
4412
|
}).noUnknown();
|
|
4371
|
-
const userUpdateSchema = utils$
|
|
4413
|
+
const userUpdateSchema = utils$2.yup.object().shape({
|
|
4372
4414
|
email: validators.email.notNull(),
|
|
4373
4415
|
firstname: validators.firstname.notNull(),
|
|
4374
4416
|
lastname: validators.lastname.nullable(),
|
|
4375
4417
|
username: validators.username.nullable(),
|
|
4376
4418
|
password: validators.password.notNull(),
|
|
4377
|
-
isActive: utils$
|
|
4419
|
+
isActive: utils$2.yup.bool().notNull(),
|
|
4378
4420
|
roles: validators.roles.min(1).notNull()
|
|
4379
4421
|
}).noUnknown();
|
|
4380
|
-
const usersDeleteSchema = utils$
|
|
4381
|
-
ids: utils$
|
|
4422
|
+
const usersDeleteSchema = utils$2.yup.object().shape({
|
|
4423
|
+
ids: utils$2.yup.array().of(utils$2.yup.strapiID()).min(1).required()
|
|
4382
4424
|
}).noUnknown();
|
|
4383
|
-
const validateUserCreationInput = utils$
|
|
4384
|
-
const validateProfileUpdateInput = utils$
|
|
4385
|
-
const validateUserUpdateInput = utils$
|
|
4386
|
-
const validateUsersDeleteInput = utils$
|
|
4425
|
+
const validateUserCreationInput$1 = utils$2.validateYupSchema(userCreationSchema);
|
|
4426
|
+
const validateProfileUpdateInput = utils$2.validateYupSchema(profileUpdateSchema);
|
|
4427
|
+
const validateUserUpdateInput = utils$2.validateYupSchema(userUpdateSchema);
|
|
4428
|
+
const validateUsersDeleteInput = utils$2.validateYupSchema(usersDeleteSchema);
|
|
4429
|
+
const schemas = {
|
|
4430
|
+
userCreationSchema,
|
|
4431
|
+
usersDeleteSchema,
|
|
4432
|
+
userUpdateSchema
|
|
4433
|
+
};
|
|
4387
4434
|
const authenticatedUser = {
|
|
4388
4435
|
async getMe(ctx) {
|
|
4389
|
-
const userInfo = getService("user").sanitizeUser(ctx.state.user);
|
|
4436
|
+
const userInfo = getService$1("user").sanitizeUser(ctx.state.user);
|
|
4390
4437
|
ctx.body = {
|
|
4391
4438
|
data: userInfo
|
|
4392
4439
|
};
|
|
@@ -4394,8 +4441,8 @@ const authenticatedUser = {
|
|
|
4394
4441
|
async updateMe(ctx) {
|
|
4395
4442
|
const input = ctx.request.body;
|
|
4396
4443
|
await validateProfileUpdateInput(input);
|
|
4397
|
-
const userService = getService("user");
|
|
4398
|
-
const authServer = getService("auth");
|
|
4444
|
+
const userService = getService$1("user");
|
|
4445
|
+
const authServer = getService$1("auth");
|
|
4399
4446
|
const { currentPassword, ...userInfo } = input;
|
|
4400
4447
|
if (currentPassword && userInfo.password) {
|
|
4401
4448
|
const isValid = await authServer.validatePassword(currentPassword, ctx.state.user.password);
|
|
@@ -4411,7 +4458,7 @@ const authenticatedUser = {
|
|
|
4411
4458
|
};
|
|
4412
4459
|
},
|
|
4413
4460
|
async getOwnPermissions(ctx) {
|
|
4414
|
-
const { findUserPermissions: findUserPermissions2, sanitizePermission: sanitizePermission2 } = getService("permission");
|
|
4461
|
+
const { findUserPermissions: findUserPermissions2, sanitizePermission: sanitizePermission2 } = getService$1("permission");
|
|
4415
4462
|
const { user: user2 } = ctx.state;
|
|
4416
4463
|
const userPermissions = await findUserPermissions2(user2);
|
|
4417
4464
|
ctx.body = {
|
|
@@ -4420,39 +4467,39 @@ const authenticatedUser = {
|
|
|
4420
4467
|
};
|
|
4421
4468
|
}
|
|
4422
4469
|
};
|
|
4423
|
-
const registrationSchema = utils$
|
|
4424
|
-
registrationToken: utils$
|
|
4425
|
-
userInfo: utils$
|
|
4470
|
+
const registrationSchema = utils$2.yup.object().shape({
|
|
4471
|
+
registrationToken: utils$2.yup.string().required(),
|
|
4472
|
+
userInfo: utils$2.yup.object().shape({
|
|
4426
4473
|
firstname: validators.firstname.required(),
|
|
4427
4474
|
lastname: validators.lastname.nullable(),
|
|
4428
4475
|
password: validators.password.required()
|
|
4429
4476
|
}).required().noUnknown()
|
|
4430
4477
|
}).noUnknown();
|
|
4431
|
-
const registrationInfoQuerySchema = utils$
|
|
4432
|
-
registrationToken: utils$
|
|
4478
|
+
const registrationInfoQuerySchema = utils$2.yup.object().shape({
|
|
4479
|
+
registrationToken: utils$2.yup.string().required()
|
|
4433
4480
|
}).required().noUnknown();
|
|
4434
|
-
const adminRegistrationSchema = utils$
|
|
4481
|
+
const adminRegistrationSchema = utils$2.yup.object().shape({
|
|
4435
4482
|
email: validators.email.required(),
|
|
4436
4483
|
firstname: validators.firstname.required(),
|
|
4437
4484
|
lastname: validators.lastname.nullable(),
|
|
4438
4485
|
password: validators.password.required()
|
|
4439
4486
|
}).required().noUnknown();
|
|
4440
|
-
const validateRegistrationInput = utils$
|
|
4441
|
-
const validateRegistrationInfoQuery = utils$
|
|
4442
|
-
const validateAdminRegistrationInput = utils$
|
|
4443
|
-
const forgotPasswordSchema = utils$
|
|
4487
|
+
const validateRegistrationInput = utils$2.validateYupSchema(registrationSchema);
|
|
4488
|
+
const validateRegistrationInfoQuery = utils$2.validateYupSchema(registrationInfoQuerySchema);
|
|
4489
|
+
const validateAdminRegistrationInput = utils$2.validateYupSchema(adminRegistrationSchema);
|
|
4490
|
+
const forgotPasswordSchema = utils$2.yup.object().shape({
|
|
4444
4491
|
email: validators.email.required()
|
|
4445
4492
|
}).required().noUnknown();
|
|
4446
|
-
const validateForgotPasswordInput = utils$
|
|
4447
|
-
const resetPasswordSchema = utils$
|
|
4448
|
-
resetPasswordToken: utils$
|
|
4493
|
+
const validateForgotPasswordInput = utils$2.validateYupSchema(forgotPasswordSchema);
|
|
4494
|
+
const resetPasswordSchema = utils$2.yup.object().shape({
|
|
4495
|
+
resetPasswordToken: utils$2.yup.string().required(),
|
|
4449
4496
|
password: validators.password.required()
|
|
4450
4497
|
}).required().noUnknown();
|
|
4451
|
-
const validateResetPasswordInput = utils$
|
|
4452
|
-
const renewToken = utils$
|
|
4453
|
-
const validateRenewTokenInput = utils$
|
|
4454
|
-
const { ApplicationError: ApplicationError$
|
|
4455
|
-
const authentication = {
|
|
4498
|
+
const validateResetPasswordInput = utils$2.validateYupSchema(resetPasswordSchema);
|
|
4499
|
+
const renewToken = utils$2.yup.object().shape({ token: utils$2.yup.string().required() }).required().noUnknown();
|
|
4500
|
+
const validateRenewTokenInput = utils$2.validateYupSchema(renewToken);
|
|
4501
|
+
const { ApplicationError: ApplicationError$6, ValidationError: ValidationError$2 } = utils$2.errors;
|
|
4502
|
+
const authentication$1 = {
|
|
4456
4503
|
login: compose__default.default([
|
|
4457
4504
|
(ctx, next) => {
|
|
4458
4505
|
return passport__default.default.authenticate("local", { session: false }, (err, user2, info) => {
|
|
@@ -4468,11 +4515,11 @@ const authentication = {
|
|
|
4468
4515
|
error: new Error(info.message),
|
|
4469
4516
|
provider: "local"
|
|
4470
4517
|
});
|
|
4471
|
-
throw new ApplicationError$
|
|
4518
|
+
throw new ApplicationError$6(info.message);
|
|
4472
4519
|
}
|
|
4473
4520
|
const query = ctx.state;
|
|
4474
4521
|
query.user = user2;
|
|
4475
|
-
const sanitizedUser = getService("user").sanitizeUser(user2);
|
|
4522
|
+
const sanitizedUser = getService$1("user").sanitizeUser(user2);
|
|
4476
4523
|
strapi.eventHub.emit("admin.auth.success", { user: sanitizedUser, provider: "local" });
|
|
4477
4524
|
return next();
|
|
4478
4525
|
})(ctx, next);
|
|
@@ -4481,8 +4528,8 @@ const authentication = {
|
|
|
4481
4528
|
const { user: user2 } = ctx.state;
|
|
4482
4529
|
ctx.body = {
|
|
4483
4530
|
data: {
|
|
4484
|
-
token: getService("token").createJwtToken(user2),
|
|
4485
|
-
user: getService("user").sanitizeUser(ctx.state.user)
|
|
4531
|
+
token: getService$1("token").createJwtToken(user2),
|
|
4532
|
+
user: getService$1("user").sanitizeUser(ctx.state.user)
|
|
4486
4533
|
// TODO: fetch more detailed info
|
|
4487
4534
|
}
|
|
4488
4535
|
};
|
|
@@ -4491,50 +4538,50 @@ const authentication = {
|
|
|
4491
4538
|
async renewToken(ctx) {
|
|
4492
4539
|
await validateRenewTokenInput(ctx.request.body);
|
|
4493
4540
|
const { token: token2 } = ctx.request.body;
|
|
4494
|
-
const { isValid, payload } = getService("token").decodeJwtToken(token2);
|
|
4541
|
+
const { isValid, payload } = getService$1("token").decodeJwtToken(token2);
|
|
4495
4542
|
if (!isValid) {
|
|
4496
|
-
throw new ValidationError("Invalid token");
|
|
4543
|
+
throw new ValidationError$2("Invalid token");
|
|
4497
4544
|
}
|
|
4498
4545
|
ctx.body = {
|
|
4499
4546
|
data: {
|
|
4500
|
-
token: getService("token").createJwtToken({ id: payload.id })
|
|
4547
|
+
token: getService$1("token").createJwtToken({ id: payload.id })
|
|
4501
4548
|
}
|
|
4502
4549
|
};
|
|
4503
4550
|
},
|
|
4504
4551
|
async registrationInfo(ctx) {
|
|
4505
4552
|
await validateRegistrationInfoQuery(ctx.request.query);
|
|
4506
4553
|
const { registrationToken } = ctx.request.query;
|
|
4507
|
-
const registrationInfo = await getService("user").findRegistrationInfo(registrationToken);
|
|
4554
|
+
const registrationInfo = await getService$1("user").findRegistrationInfo(registrationToken);
|
|
4508
4555
|
if (!registrationInfo) {
|
|
4509
|
-
throw new ValidationError("Invalid registrationToken");
|
|
4556
|
+
throw new ValidationError$2("Invalid registrationToken");
|
|
4510
4557
|
}
|
|
4511
4558
|
ctx.body = { data: registrationInfo };
|
|
4512
4559
|
},
|
|
4513
4560
|
async register(ctx) {
|
|
4514
4561
|
const input = ctx.request.body;
|
|
4515
4562
|
await validateRegistrationInput(input);
|
|
4516
|
-
const user2 = await getService("user").register(input);
|
|
4563
|
+
const user2 = await getService$1("user").register(input);
|
|
4517
4564
|
ctx.body = {
|
|
4518
4565
|
data: {
|
|
4519
|
-
token: getService("token").createJwtToken(user2),
|
|
4520
|
-
user: getService("user").sanitizeUser(user2)
|
|
4566
|
+
token: getService$1("token").createJwtToken(user2),
|
|
4567
|
+
user: getService$1("user").sanitizeUser(user2)
|
|
4521
4568
|
}
|
|
4522
4569
|
};
|
|
4523
4570
|
},
|
|
4524
4571
|
async registerAdmin(ctx) {
|
|
4525
4572
|
const input = ctx.request.body;
|
|
4526
4573
|
await validateAdminRegistrationInput(input);
|
|
4527
|
-
const hasAdmin = await getService("user").exists();
|
|
4574
|
+
const hasAdmin = await getService$1("user").exists();
|
|
4528
4575
|
if (hasAdmin) {
|
|
4529
|
-
throw new ApplicationError$
|
|
4576
|
+
throw new ApplicationError$6("You cannot register a new super admin");
|
|
4530
4577
|
}
|
|
4531
|
-
const superAdminRole = await getService("role").getSuperAdmin();
|
|
4578
|
+
const superAdminRole = await getService$1("role").getSuperAdmin();
|
|
4532
4579
|
if (!superAdminRole) {
|
|
4533
|
-
throw new ApplicationError$
|
|
4580
|
+
throw new ApplicationError$6(
|
|
4534
4581
|
"Cannot register the first admin because the super admin role doesn't exist."
|
|
4535
4582
|
);
|
|
4536
4583
|
}
|
|
4537
|
-
const user2 = await getService("user").create({
|
|
4584
|
+
const user2 = await getService$1("user").create({
|
|
4538
4585
|
...input,
|
|
4539
4586
|
registrationToken: null,
|
|
4540
4587
|
isActive: true,
|
|
@@ -4543,30 +4590,30 @@ const authentication = {
|
|
|
4543
4590
|
strapi.telemetry.send("didCreateFirstAdmin");
|
|
4544
4591
|
ctx.body = {
|
|
4545
4592
|
data: {
|
|
4546
|
-
token: getService("token").createJwtToken(user2),
|
|
4547
|
-
user: getService("user").sanitizeUser(user2)
|
|
4593
|
+
token: getService$1("token").createJwtToken(user2),
|
|
4594
|
+
user: getService$1("user").sanitizeUser(user2)
|
|
4548
4595
|
}
|
|
4549
4596
|
};
|
|
4550
4597
|
},
|
|
4551
4598
|
async forgotPassword(ctx) {
|
|
4552
4599
|
const input = ctx.request.body;
|
|
4553
4600
|
await validateForgotPasswordInput(input);
|
|
4554
|
-
getService("auth").forgotPassword(input);
|
|
4601
|
+
getService$1("auth").forgotPassword(input);
|
|
4555
4602
|
ctx.status = 204;
|
|
4556
4603
|
},
|
|
4557
4604
|
async resetPassword(ctx) {
|
|
4558
4605
|
const input = ctx.request.body;
|
|
4559
4606
|
await validateResetPasswordInput(input);
|
|
4560
|
-
const user2 = await getService("auth").resetPassword(input);
|
|
4607
|
+
const user2 = await getService$1("auth").resetPassword(input);
|
|
4561
4608
|
ctx.body = {
|
|
4562
4609
|
data: {
|
|
4563
|
-
token: getService("token").createJwtToken(user2),
|
|
4564
|
-
user: getService("user").sanitizeUser(user2)
|
|
4610
|
+
token: getService$1("token").createJwtToken(user2),
|
|
4611
|
+
user: getService$1("user").sanitizeUser(user2)
|
|
4565
4612
|
}
|
|
4566
4613
|
};
|
|
4567
4614
|
},
|
|
4568
4615
|
logout(ctx) {
|
|
4569
|
-
const sanitizedUser = getService("user").sanitizeUser(ctx.state.user);
|
|
4616
|
+
const sanitizedUser = getService$1("user").sanitizeUser(ctx.state.user);
|
|
4570
4617
|
strapi.eventHub.emit("admin.logout", { user: sanitizedUser });
|
|
4571
4618
|
ctx.body = { data: {} };
|
|
4572
4619
|
}
|
|
@@ -4582,7 +4629,7 @@ const permission = {
|
|
|
4582
4629
|
const { body: input } = ctx.request;
|
|
4583
4630
|
const { userAbility } = ctx.state;
|
|
4584
4631
|
await validateCheckPermissionsInput(input);
|
|
4585
|
-
const { engine: engine2 } = getService("permission");
|
|
4632
|
+
const { engine: engine2 } = getService$1("permission");
|
|
4586
4633
|
const checkPermissionsFn = engine2.checkMany(userAbility);
|
|
4587
4634
|
ctx.body = {
|
|
4588
4635
|
data: checkPermissionsFn(input.permissions)
|
|
@@ -4593,7 +4640,7 @@ const permission = {
|
|
|
4593
4640
|
* @param {KoaContext} ctx - koa context
|
|
4594
4641
|
*/
|
|
4595
4642
|
async getAll(ctx) {
|
|
4596
|
-
const { sectionsBuilder: sectionsBuilder2, actionProvider: actionProvider2, conditionProvider: conditionProvider2 } = getService("permission");
|
|
4643
|
+
const { sectionsBuilder: sectionsBuilder2, actionProvider: actionProvider2, conditionProvider: conditionProvider2 } = getService$1("permission");
|
|
4597
4644
|
const actions2 = actionProvider2.values();
|
|
4598
4645
|
const conditions2 = conditionProvider2.values();
|
|
4599
4646
|
const sections = await sectionsBuilder2.build(actions2);
|
|
@@ -4606,12 +4653,12 @@ const permission = {
|
|
|
4606
4653
|
};
|
|
4607
4654
|
}
|
|
4608
4655
|
};
|
|
4609
|
-
const roleCreateSchema = utils$
|
|
4610
|
-
name: utils$
|
|
4611
|
-
description: utils$
|
|
4656
|
+
const roleCreateSchema$1 = utils$2.yup.object().shape({
|
|
4657
|
+
name: utils$2.yup.string().min(1).required(),
|
|
4658
|
+
description: utils$2.yup.string().nullable()
|
|
4612
4659
|
}).noUnknown();
|
|
4613
|
-
const rolesDeleteSchema = utils$
|
|
4614
|
-
ids: utils$
|
|
4660
|
+
const rolesDeleteSchema$1 = utils$2.yup.object().shape({
|
|
4661
|
+
ids: utils$2.yup.array().of(utils$2.yup.strapiID()).min(1).required().test("roles-deletion-checks", "Roles deletion checks have failed", async function(ids) {
|
|
4615
4662
|
try {
|
|
4616
4663
|
await strapi.service("admin::role").checkRolesIdForDeletion(ids);
|
|
4617
4664
|
} catch (e) {
|
|
@@ -4620,7 +4667,7 @@ const rolesDeleteSchema = utils$1.yup.object().shape({
|
|
|
4620
4667
|
return true;
|
|
4621
4668
|
})
|
|
4622
4669
|
}).noUnknown();
|
|
4623
|
-
const roleDeleteSchema = utils$
|
|
4670
|
+
const roleDeleteSchema$1 = utils$2.yup.strapiID().required().test("no-admin-single-delete", "Role deletion checks have failed", async function(id) {
|
|
4624
4671
|
try {
|
|
4625
4672
|
await strapi.service("admin::role").checkRolesIdForDeletion([id]);
|
|
4626
4673
|
} catch (e) {
|
|
@@ -4628,25 +4675,25 @@ const roleDeleteSchema = utils$1.yup.strapiID().required().test("no-admin-single
|
|
|
4628
4675
|
}
|
|
4629
4676
|
return true;
|
|
4630
4677
|
});
|
|
4631
|
-
const roleUpdateSchema = utils$
|
|
4632
|
-
name: utils$
|
|
4633
|
-
description: utils$
|
|
4678
|
+
const roleUpdateSchema = utils$2.yup.object().shape({
|
|
4679
|
+
name: utils$2.yup.string().min(1),
|
|
4680
|
+
description: utils$2.yup.string().nullable()
|
|
4634
4681
|
}).noUnknown();
|
|
4635
|
-
const validateRoleCreateInput = utils$
|
|
4636
|
-
const validateRoleUpdateInput = utils$
|
|
4637
|
-
const validateRolesDeleteInput = utils$
|
|
4638
|
-
const validateRoleDeleteInput = utils$
|
|
4639
|
-
const { ApplicationError: ApplicationError$
|
|
4640
|
-
const { SUPER_ADMIN_CODE } = constants$3;
|
|
4641
|
-
const role = {
|
|
4682
|
+
const validateRoleCreateInput$1 = utils$2.validateYupSchema(roleCreateSchema$1);
|
|
4683
|
+
const validateRoleUpdateInput = utils$2.validateYupSchema(roleUpdateSchema);
|
|
4684
|
+
const validateRolesDeleteInput$1 = utils$2.validateYupSchema(rolesDeleteSchema$1);
|
|
4685
|
+
const validateRoleDeleteInput$1 = utils$2.validateYupSchema(roleDeleteSchema$1);
|
|
4686
|
+
const { ApplicationError: ApplicationError$5 } = utils$2.errors;
|
|
4687
|
+
const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$2 } = constants$3;
|
|
4688
|
+
const role$2 = {
|
|
4642
4689
|
/**
|
|
4643
4690
|
* Create a new role
|
|
4644
4691
|
* @param {KoaContext} ctx - koa context
|
|
4645
4692
|
*/
|
|
4646
4693
|
async create(ctx) {
|
|
4647
4694
|
const { body } = ctx.request;
|
|
4648
|
-
await validateRoleCreateInput(body);
|
|
4649
|
-
const roleService = getService("role");
|
|
4695
|
+
await validateRoleCreateInput$1(body);
|
|
4696
|
+
const roleService = getService$1("role");
|
|
4650
4697
|
const role2 = await roleService.create(body);
|
|
4651
4698
|
const sanitizedRole = roleService.sanitizeRole(role2);
|
|
4652
4699
|
ctx.created({ data: sanitizedRole });
|
|
@@ -4657,7 +4704,7 @@ const role = {
|
|
|
4657
4704
|
*/
|
|
4658
4705
|
async findOne(ctx) {
|
|
4659
4706
|
const { id } = ctx.params;
|
|
4660
|
-
const role2 = await getService("role").findOneWithUsersCount({ id });
|
|
4707
|
+
const role2 = await getService$1("role").findOneWithUsersCount({ id });
|
|
4661
4708
|
if (!role2) {
|
|
4662
4709
|
return ctx.notFound("role.notFound");
|
|
4663
4710
|
}
|
|
@@ -4671,13 +4718,13 @@ const role = {
|
|
|
4671
4718
|
*/
|
|
4672
4719
|
async findAll(ctx) {
|
|
4673
4720
|
const { query } = ctx.request;
|
|
4674
|
-
const permissionsManager = getService("permission").createPermissionsManager({
|
|
4721
|
+
const permissionsManager = getService$1("permission").createPermissionsManager({
|
|
4675
4722
|
ability: ctx.state.userAbility,
|
|
4676
4723
|
model: "admin::role"
|
|
4677
4724
|
});
|
|
4678
4725
|
await permissionsManager.validateQuery(query);
|
|
4679
4726
|
const sanitizedQuery = await permissionsManager.sanitizeQuery(query);
|
|
4680
|
-
const roles2 = await getService("role").findAllWithUsersCount(sanitizedQuery);
|
|
4727
|
+
const roles2 = await getService$1("role").findAllWithUsersCount(sanitizedQuery);
|
|
4681
4728
|
ctx.body = {
|
|
4682
4729
|
data: roles2
|
|
4683
4730
|
};
|
|
@@ -4689,14 +4736,14 @@ const role = {
|
|
|
4689
4736
|
async update(ctx) {
|
|
4690
4737
|
const { id } = ctx.params;
|
|
4691
4738
|
const { body } = ctx.request;
|
|
4692
|
-
const roleService = getService("role");
|
|
4739
|
+
const roleService = getService$1("role");
|
|
4693
4740
|
await validateRoleUpdateInput(body);
|
|
4694
4741
|
const role2 = await roleService.findOne({ id });
|
|
4695
4742
|
if (!role2) {
|
|
4696
4743
|
return ctx.notFound("role.notFound");
|
|
4697
4744
|
}
|
|
4698
|
-
if (role2.code === SUPER_ADMIN_CODE) {
|
|
4699
|
-
throw new ApplicationError$
|
|
4745
|
+
if (role2.code === SUPER_ADMIN_CODE$2) {
|
|
4746
|
+
throw new ApplicationError$5("Super admin can't be edited.");
|
|
4700
4747
|
}
|
|
4701
4748
|
const updatedRole = await roleService.update({ id }, body);
|
|
4702
4749
|
const sanitizedRole = roleService.sanitizeRole(updatedRole);
|
|
@@ -4710,8 +4757,8 @@ const role = {
|
|
|
4710
4757
|
*/
|
|
4711
4758
|
async getPermissions(ctx) {
|
|
4712
4759
|
const { id } = ctx.params;
|
|
4713
|
-
const roleService = getService("role");
|
|
4714
|
-
const permissionService = getService("permission");
|
|
4760
|
+
const roleService = getService$1("role");
|
|
4761
|
+
const permissionService = getService$1("permission");
|
|
4715
4762
|
const role2 = await roleService.findOne({ id });
|
|
4716
4763
|
if (!role2) {
|
|
4717
4764
|
return ctx.notFound("role.notFound");
|
|
@@ -4730,14 +4777,14 @@ const role = {
|
|
|
4730
4777
|
async updatePermissions(ctx) {
|
|
4731
4778
|
const { id } = ctx.params;
|
|
4732
4779
|
const { body: input } = ctx.request;
|
|
4733
|
-
const roleService = getService("role");
|
|
4734
|
-
const permissionService = getService("permission");
|
|
4780
|
+
const roleService = getService$1("role");
|
|
4781
|
+
const permissionService = getService$1("permission");
|
|
4735
4782
|
const role2 = await roleService.findOne({ id });
|
|
4736
4783
|
if (!role2) {
|
|
4737
4784
|
return ctx.notFound("role.notFound");
|
|
4738
4785
|
}
|
|
4739
|
-
if (role2.code === SUPER_ADMIN_CODE) {
|
|
4740
|
-
throw new ApplicationError$
|
|
4786
|
+
if (role2.code === SUPER_ADMIN_CODE$2) {
|
|
4787
|
+
throw new ApplicationError$5("Super admin permissions can't be edited.");
|
|
4741
4788
|
}
|
|
4742
4789
|
await validatedUpdatePermissionsInput(input);
|
|
4743
4790
|
if (!role2) {
|
|
@@ -4755,8 +4802,8 @@ const role = {
|
|
|
4755
4802
|
*/
|
|
4756
4803
|
async deleteOne(ctx) {
|
|
4757
4804
|
const { id } = ctx.params;
|
|
4758
|
-
await validateRoleDeleteInput(id);
|
|
4759
|
-
const roleService = getService("role");
|
|
4805
|
+
await validateRoleDeleteInput$1(id);
|
|
4806
|
+
const roleService = getService$1("role");
|
|
4760
4807
|
const roles2 = await roleService.deleteByIds([id]);
|
|
4761
4808
|
const sanitizedRole = roles2.map((role2) => roleService.sanitizeRole(role2))[0] || null;
|
|
4762
4809
|
return ctx.deleted({
|
|
@@ -4769,8 +4816,8 @@ const role = {
|
|
|
4769
4816
|
*/
|
|
4770
4817
|
async deleteMany(ctx) {
|
|
4771
4818
|
const { body } = ctx.request;
|
|
4772
|
-
await validateRolesDeleteInput(body);
|
|
4773
|
-
const roleService = getService("role");
|
|
4819
|
+
await validateRolesDeleteInput$1(body);
|
|
4820
|
+
const roleService = getService$1("role");
|
|
4774
4821
|
const roles2 = await roleService.deleteByIds(body.ids);
|
|
4775
4822
|
const sanitizedRoles = roles2.map(roleService.sanitizeRole);
|
|
4776
4823
|
return ctx.deleted({
|
|
@@ -4783,11 +4830,11 @@ const {
|
|
|
4783
4830
|
handlers: { createPushController, createPullController }
|
|
4784
4831
|
}
|
|
4785
4832
|
} = dataTransfer$1.strapi;
|
|
4786
|
-
const { UnauthorizedError } = utils$
|
|
4833
|
+
const { UnauthorizedError: UnauthorizedError$1 } = utils$2.errors;
|
|
4787
4834
|
const verify = async (ctx, scope) => {
|
|
4788
4835
|
const { auth: auth2 } = ctx.state;
|
|
4789
4836
|
if (!auth2) {
|
|
4790
|
-
throw new UnauthorizedError();
|
|
4837
|
+
throw new UnauthorizedError$1();
|
|
4791
4838
|
}
|
|
4792
4839
|
await dataTransferAuthStrategy.verify(auth2, { scope });
|
|
4793
4840
|
};
|
|
@@ -4797,34 +4844,34 @@ const runner = {
|
|
|
4797
4844
|
push,
|
|
4798
4845
|
pull
|
|
4799
4846
|
};
|
|
4800
|
-
const transferTokenCreationSchema = utils$
|
|
4801
|
-
name: utils$
|
|
4802
|
-
description: utils$
|
|
4803
|
-
permissions: utils$
|
|
4804
|
-
lifespan: utils$
|
|
4847
|
+
const transferTokenCreationSchema = utils$2.yup.object().shape({
|
|
4848
|
+
name: utils$2.yup.string().min(1).required(),
|
|
4849
|
+
description: utils$2.yup.string().optional(),
|
|
4850
|
+
permissions: utils$2.yup.array().min(1).of(utils$2.yup.string().oneOf(Object.values(constants$3.TRANSFER_TOKEN_TYPE))).required(),
|
|
4851
|
+
lifespan: utils$2.yup.number().min(1).oneOf(Object.values(constants$3.TRANSFER_TOKEN_LIFESPANS)).nullable()
|
|
4805
4852
|
}).noUnknown().strict();
|
|
4806
|
-
const transferTokenUpdateSchema = utils$
|
|
4807
|
-
name: utils$
|
|
4808
|
-
description: utils$
|
|
4809
|
-
permissions: utils$
|
|
4853
|
+
const transferTokenUpdateSchema = utils$2.yup.object().shape({
|
|
4854
|
+
name: utils$2.yup.string().min(1).notNull(),
|
|
4855
|
+
description: utils$2.yup.string().nullable(),
|
|
4856
|
+
permissions: utils$2.yup.array().min(1).of(utils$2.yup.string().oneOf(Object.values(constants$3.TRANSFER_TOKEN_TYPE))).nullable()
|
|
4810
4857
|
}).noUnknown().strict();
|
|
4811
|
-
const validateTransferTokenCreationInput$1 = utils$
|
|
4812
|
-
const validateTransferTokenUpdateInput$1 = utils$
|
|
4858
|
+
const validateTransferTokenCreationInput$1 = utils$2.validateYupSchema(transferTokenCreationSchema);
|
|
4859
|
+
const validateTransferTokenUpdateInput$1 = utils$2.validateYupSchema(transferTokenUpdateSchema);
|
|
4813
4860
|
const token$1 = {
|
|
4814
4861
|
validateTransferTokenCreationInput: validateTransferTokenCreationInput$1,
|
|
4815
4862
|
validateTransferTokenUpdateInput: validateTransferTokenUpdateInput$1
|
|
4816
4863
|
};
|
|
4817
|
-
const { ApplicationError: ApplicationError$
|
|
4864
|
+
const { ApplicationError: ApplicationError$4 } = utils$2.errors;
|
|
4818
4865
|
const { validateTransferTokenCreationInput, validateTransferTokenUpdateInput } = token$1;
|
|
4819
4866
|
const token = {
|
|
4820
4867
|
async list(ctx) {
|
|
4821
|
-
const transferService = getService("transfer");
|
|
4868
|
+
const transferService = getService$1("transfer");
|
|
4822
4869
|
const transferTokens = await transferService.token.list();
|
|
4823
4870
|
ctx.body = { data: transferTokens };
|
|
4824
4871
|
},
|
|
4825
4872
|
async getById(ctx) {
|
|
4826
4873
|
const { id } = ctx.params;
|
|
4827
|
-
const tokenService = getService("transfer").token;
|
|
4874
|
+
const tokenService = getService$1("transfer").token;
|
|
4828
4875
|
const transferToken2 = await tokenService.getById(id);
|
|
4829
4876
|
if (!transferToken2) {
|
|
4830
4877
|
ctx.notFound("Transfer token not found");
|
|
@@ -4834,7 +4881,7 @@ const token = {
|
|
|
4834
4881
|
},
|
|
4835
4882
|
async create(ctx) {
|
|
4836
4883
|
const { body } = ctx.request;
|
|
4837
|
-
const { token: tokenService } = getService("transfer");
|
|
4884
|
+
const { token: tokenService } = getService$1("transfer");
|
|
4838
4885
|
const attributes = {
|
|
4839
4886
|
name: fp.trim(body.name),
|
|
4840
4887
|
description: fp.trim(body.description),
|
|
@@ -4844,7 +4891,7 @@ const token = {
|
|
|
4844
4891
|
await validateTransferTokenCreationInput(attributes);
|
|
4845
4892
|
const alreadyExists = await tokenService.exists({ name: attributes.name });
|
|
4846
4893
|
if (alreadyExists) {
|
|
4847
|
-
throw new ApplicationError$
|
|
4894
|
+
throw new ApplicationError$4("Name already taken");
|
|
4848
4895
|
}
|
|
4849
4896
|
const transferTokens = await tokenService.create(attributes);
|
|
4850
4897
|
ctx.created({ data: transferTokens });
|
|
@@ -4852,7 +4899,7 @@ const token = {
|
|
|
4852
4899
|
async update(ctx) {
|
|
4853
4900
|
const { body } = ctx.request;
|
|
4854
4901
|
const { id } = ctx.params;
|
|
4855
|
-
const { token: tokenService } = getService("transfer");
|
|
4902
|
+
const { token: tokenService } = getService$1("transfer");
|
|
4856
4903
|
const attributes = body;
|
|
4857
4904
|
if (fp.has("name", attributes)) {
|
|
4858
4905
|
attributes.name = fp.trim(body.name);
|
|
@@ -4867,8 +4914,8 @@ const token = {
|
|
|
4867
4914
|
}
|
|
4868
4915
|
if (fp.has("name", attributes)) {
|
|
4869
4916
|
const nameAlreadyTaken = await tokenService.getByName(attributes.name);
|
|
4870
|
-
if (!!nameAlreadyTaken && !utils$
|
|
4871
|
-
throw new ApplicationError$
|
|
4917
|
+
if (!!nameAlreadyTaken && !utils$2.strings.isEqual(nameAlreadyTaken.id, id)) {
|
|
4918
|
+
throw new ApplicationError$4("Name already taken");
|
|
4872
4919
|
}
|
|
4873
4920
|
}
|
|
4874
4921
|
const apiToken2 = await tokenService.update(id, attributes);
|
|
@@ -4876,13 +4923,13 @@ const token = {
|
|
|
4876
4923
|
},
|
|
4877
4924
|
async revoke(ctx) {
|
|
4878
4925
|
const { id } = ctx.params;
|
|
4879
|
-
const { token: tokenService } = getService("transfer");
|
|
4926
|
+
const { token: tokenService } = getService$1("transfer");
|
|
4880
4927
|
const transferToken2 = await tokenService.revoke(id);
|
|
4881
4928
|
ctx.deleted({ data: transferToken2 });
|
|
4882
4929
|
},
|
|
4883
4930
|
async regenerate(ctx) {
|
|
4884
4931
|
const { id } = ctx.params;
|
|
4885
|
-
const { token: tokenService } = getService("transfer");
|
|
4932
|
+
const { token: tokenService } = getService$1("transfer");
|
|
4886
4933
|
const exists2 = await tokenService.getById(id);
|
|
4887
4934
|
if (!exists2) {
|
|
4888
4935
|
ctx.notFound("Transfer token not found");
|
|
@@ -4897,12 +4944,12 @@ const transfer = {
|
|
|
4897
4944
|
...prefixActionsName("runner", runner),
|
|
4898
4945
|
...prefixActionsName("token", token)
|
|
4899
4946
|
};
|
|
4900
|
-
const { ApplicationError } = utils$
|
|
4901
|
-
const user = {
|
|
4947
|
+
const { ApplicationError: ApplicationError$3 } = utils$2.errors;
|
|
4948
|
+
const user$2 = {
|
|
4902
4949
|
async create(ctx) {
|
|
4903
4950
|
const { body } = ctx.request;
|
|
4904
4951
|
const cleanData = { ...body, email: ___namespace.get(body, `email`, ``).toLowerCase() };
|
|
4905
|
-
await validateUserCreationInput(cleanData);
|
|
4952
|
+
await validateUserCreationInput$1(cleanData);
|
|
4906
4953
|
const attributes = ___namespace.pick(cleanData, [
|
|
4907
4954
|
"firstname",
|
|
4908
4955
|
"lastname",
|
|
@@ -4910,19 +4957,19 @@ const user = {
|
|
|
4910
4957
|
"roles",
|
|
4911
4958
|
"preferedLanguage"
|
|
4912
4959
|
]);
|
|
4913
|
-
const userAlreadyExists = await getService("user").exists({
|
|
4960
|
+
const userAlreadyExists = await getService$1("user").exists({
|
|
4914
4961
|
email: attributes.email
|
|
4915
4962
|
});
|
|
4916
4963
|
if (userAlreadyExists) {
|
|
4917
|
-
throw new ApplicationError("Email already taken");
|
|
4964
|
+
throw new ApplicationError$3("Email already taken");
|
|
4918
4965
|
}
|
|
4919
|
-
const createdUser = await getService("user").create(attributes);
|
|
4920
|
-
const userInfo = getService("user").sanitizeUser(createdUser);
|
|
4966
|
+
const createdUser = await getService$1("user").create(attributes);
|
|
4967
|
+
const userInfo = getService$1("user").sanitizeUser(createdUser);
|
|
4921
4968
|
Object.assign(userInfo, { registrationToken: createdUser.registrationToken });
|
|
4922
4969
|
ctx.created({ data: userInfo });
|
|
4923
4970
|
},
|
|
4924
4971
|
async find(ctx) {
|
|
4925
|
-
const userService = getService("user");
|
|
4972
|
+
const userService = getService$1("user");
|
|
4926
4973
|
const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
4927
4974
|
ability: ctx.state.userAbility,
|
|
4928
4975
|
model: "admin::user"
|
|
@@ -4939,12 +4986,12 @@ const user = {
|
|
|
4939
4986
|
},
|
|
4940
4987
|
async findOne(ctx) {
|
|
4941
4988
|
const { id } = ctx.params;
|
|
4942
|
-
const user2 = await getService("user").findOne(id);
|
|
4989
|
+
const user2 = await getService$1("user").findOne(id);
|
|
4943
4990
|
if (!user2) {
|
|
4944
4991
|
return ctx.notFound("User does not exist");
|
|
4945
4992
|
}
|
|
4946
4993
|
ctx.body = {
|
|
4947
|
-
data: getService("user").sanitizeUser(user2)
|
|
4994
|
+
data: getService$1("user").sanitizeUser(user2)
|
|
4948
4995
|
};
|
|
4949
4996
|
},
|
|
4950
4997
|
async update(ctx) {
|
|
@@ -4952,30 +4999,30 @@ const user = {
|
|
|
4952
4999
|
const { body: input } = ctx.request;
|
|
4953
5000
|
await validateUserUpdateInput(input);
|
|
4954
5001
|
if (___namespace.has(input, "email")) {
|
|
4955
|
-
const uniqueEmailCheck = await getService("user").exists({
|
|
5002
|
+
const uniqueEmailCheck = await getService$1("user").exists({
|
|
4956
5003
|
id: { $ne: id },
|
|
4957
5004
|
email: input.email
|
|
4958
5005
|
});
|
|
4959
5006
|
if (uniqueEmailCheck) {
|
|
4960
|
-
throw new ApplicationError("A user with this email address already exists");
|
|
5007
|
+
throw new ApplicationError$3("A user with this email address already exists");
|
|
4961
5008
|
}
|
|
4962
5009
|
}
|
|
4963
|
-
const updatedUser = await getService("user").updateById(id, input);
|
|
5010
|
+
const updatedUser = await getService$1("user").updateById(id, input);
|
|
4964
5011
|
if (!updatedUser) {
|
|
4965
5012
|
return ctx.notFound("User does not exist");
|
|
4966
5013
|
}
|
|
4967
5014
|
ctx.body = {
|
|
4968
|
-
data: getService("user").sanitizeUser(updatedUser)
|
|
5015
|
+
data: getService$1("user").sanitizeUser(updatedUser)
|
|
4969
5016
|
};
|
|
4970
5017
|
},
|
|
4971
5018
|
async deleteOne(ctx) {
|
|
4972
5019
|
const { id } = ctx.params;
|
|
4973
|
-
const deletedUser = await getService("user").deleteById(id);
|
|
5020
|
+
const deletedUser = await getService$1("user").deleteById(id);
|
|
4974
5021
|
if (!deletedUser) {
|
|
4975
5022
|
return ctx.notFound("User not found");
|
|
4976
5023
|
}
|
|
4977
5024
|
return ctx.deleted({
|
|
4978
|
-
data: getService("user").sanitizeUser(deletedUser)
|
|
5025
|
+
data: getService$1("user").sanitizeUser(deletedUser)
|
|
4979
5026
|
});
|
|
4980
5027
|
},
|
|
4981
5028
|
/**
|
|
@@ -4985,17 +5032,17 @@ const user = {
|
|
|
4985
5032
|
async deleteMany(ctx) {
|
|
4986
5033
|
const { body } = ctx.request;
|
|
4987
5034
|
await validateUsersDeleteInput(body);
|
|
4988
|
-
const users2 = await getService("user").deleteByIds(body.ids);
|
|
4989
|
-
const sanitizedUsers = users2.map(getService("user").sanitizeUser);
|
|
5035
|
+
const users2 = await getService$1("user").deleteByIds(body.ids);
|
|
5036
|
+
const sanitizedUsers = users2.map(getService$1("user").sanitizeUser);
|
|
4990
5037
|
return ctx.deleted({
|
|
4991
5038
|
data: sanitizedUsers
|
|
4992
5039
|
});
|
|
4993
5040
|
}
|
|
4994
5041
|
};
|
|
4995
5042
|
const urlRegex = /^(?:([a-z0-9+.-]+):\/\/)(?:\S+(?::\S*)?@)?(?:(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9_]-*)*[a-z\u00a1-\uffff0-9_]+)(?:\.(?:[a-z\u00a1-\uffff0-9_]-*)*[a-z\u00a1-\uffff0-9_]+)*\.?)(?::\d{2,5})?(?:[/?#]\S*)?$/;
|
|
4996
|
-
const webhookValidator = utils$
|
|
4997
|
-
name: utils$
|
|
4998
|
-
url: utils$
|
|
5043
|
+
const webhookValidator = utils$2.yup.object({
|
|
5044
|
+
name: utils$2.yup.string().required(),
|
|
5045
|
+
url: utils$2.yup.string().matches(urlRegex, "url must be a valid URL").required().test(
|
|
4999
5046
|
"is-public-url",
|
|
5000
5047
|
"Url is not supported because it isn't reachable over the public internet",
|
|
5001
5048
|
async (url) => {
|
|
@@ -5011,21 +5058,21 @@ const webhookValidator = utils$1.yup.object({
|
|
|
5011
5058
|
}
|
|
5012
5059
|
}
|
|
5013
5060
|
),
|
|
5014
|
-
headers: utils$
|
|
5061
|
+
headers: utils$2.yup.lazy((data) => {
|
|
5015
5062
|
if (typeof data !== "object") {
|
|
5016
|
-
return utils$
|
|
5063
|
+
return utils$2.yup.object().required();
|
|
5017
5064
|
}
|
|
5018
|
-
return utils$
|
|
5065
|
+
return utils$2.yup.object(
|
|
5019
5066
|
// @ts-expect-error lodash types
|
|
5020
5067
|
___namespace.default.mapValues(data, () => {
|
|
5021
|
-
utils$
|
|
5068
|
+
utils$2.yup.string().min(1).required();
|
|
5022
5069
|
})
|
|
5023
5070
|
).required();
|
|
5024
5071
|
}),
|
|
5025
|
-
events: utils$
|
|
5072
|
+
events: utils$2.yup.array().of(utils$2.yup.string()).required()
|
|
5026
5073
|
}).noUnknown();
|
|
5027
5074
|
const updateWebhookValidator = webhookValidator.shape({
|
|
5028
|
-
isEnabled: utils$
|
|
5075
|
+
isEnabled: utils$2.yup.boolean()
|
|
5029
5076
|
});
|
|
5030
5077
|
const webhooks = {
|
|
5031
5078
|
async listWebhooks(ctx) {
|
|
@@ -5042,7 +5089,7 @@ const webhooks = {
|
|
|
5042
5089
|
},
|
|
5043
5090
|
async createWebhook(ctx) {
|
|
5044
5091
|
const { body } = ctx.request;
|
|
5045
|
-
await utils$
|
|
5092
|
+
await utils$2.validateYupSchema(webhookValidator)(body);
|
|
5046
5093
|
const webhook = await strapi.get("webhookStore").createWebhook(body);
|
|
5047
5094
|
strapi.get("webhookRunner").add(webhook);
|
|
5048
5095
|
ctx.created({ data: webhook });
|
|
@@ -5050,7 +5097,7 @@ const webhooks = {
|
|
|
5050
5097
|
async updateWebhook(ctx) {
|
|
5051
5098
|
const { id } = ctx.params;
|
|
5052
5099
|
const { body } = ctx.request;
|
|
5053
|
-
await utils$
|
|
5100
|
+
await utils$2.validateYupSchema(updateWebhookValidator)(body);
|
|
5054
5101
|
const webhook = await strapi.get("webhookStore").findWebhook(id);
|
|
5055
5102
|
if (!webhook) {
|
|
5056
5103
|
return ctx.notFound("webhook.notFound");
|
|
@@ -5106,15 +5153,15 @@ const contentApi = {
|
|
|
5106
5153
|
ctx.send({ data: routesMap });
|
|
5107
5154
|
}
|
|
5108
5155
|
};
|
|
5109
|
-
const
|
|
5110
|
-
admin,
|
|
5156
|
+
const controllers$1 = {
|
|
5157
|
+
admin: admin$3,
|
|
5111
5158
|
"api-token": apiToken$1,
|
|
5112
5159
|
"authenticated-user": authenticatedUser,
|
|
5113
|
-
authentication,
|
|
5160
|
+
authentication: authentication$1,
|
|
5114
5161
|
permission,
|
|
5115
|
-
role,
|
|
5162
|
+
role: role$2,
|
|
5116
5163
|
transfer,
|
|
5117
|
-
user,
|
|
5164
|
+
user: user$2,
|
|
5118
5165
|
webhooks,
|
|
5119
5166
|
"content-api": contentApi
|
|
5120
5167
|
};
|
|
@@ -5539,7 +5586,7 @@ const transferTokenPermission = {
|
|
|
5539
5586
|
}
|
|
5540
5587
|
}
|
|
5541
5588
|
};
|
|
5542
|
-
const
|
|
5589
|
+
const contentTypes = {
|
|
5543
5590
|
permission: { schema: Permission },
|
|
5544
5591
|
user: { schema: User },
|
|
5545
5592
|
role: { schema: Role },
|
|
@@ -5549,7 +5596,7 @@ const index$1 = {
|
|
|
5549
5596
|
"transfer-token-permission": { schema: transferTokenPermission }
|
|
5550
5597
|
};
|
|
5551
5598
|
const { RateLimitError } = utils__default.default.errors;
|
|
5552
|
-
const rateLimit = (
|
|
5599
|
+
const rateLimit = (config2, { strapi: strapi2 }) => async (ctx, next) => {
|
|
5553
5600
|
let rateLimitConfig = strapi2.config.get("admin.rateLimit");
|
|
5554
5601
|
if (!rateLimitConfig) {
|
|
5555
5602
|
rateLimitConfig = {
|
|
@@ -5572,14 +5619,14 @@ const rateLimit = (config, { strapi: strapi2 }) => async (ctx, next) => {
|
|
|
5572
5619
|
throw new RateLimitError();
|
|
5573
5620
|
},
|
|
5574
5621
|
...rateLimitConfig,
|
|
5575
|
-
...
|
|
5622
|
+
...config2
|
|
5576
5623
|
};
|
|
5577
5624
|
return rateLimit2.middleware(loadConfig)(ctx, next);
|
|
5578
5625
|
}
|
|
5579
5626
|
return next();
|
|
5580
5627
|
};
|
|
5581
5628
|
const dataTransfer = () => async (ctx, next) => {
|
|
5582
|
-
const transferUtils = getService("transfer").utils;
|
|
5629
|
+
const transferUtils = getService$1("transfer").utils;
|
|
5583
5630
|
const { hasValidTokenSalt: hasValidTokenSalt2, isRemoteTransferEnabled: isRemoteTransferEnabled2 } = transferUtils;
|
|
5584
5631
|
if (isRemoteTransferEnabled2()) {
|
|
5585
5632
|
return next();
|
|
@@ -5597,18 +5644,1366 @@ const dataTransfer = () => async (ctx, next) => {
|
|
|
5597
5644
|
}
|
|
5598
5645
|
throw new Error("Unexpected error while trying to access a data transfer route");
|
|
5599
5646
|
};
|
|
5600
|
-
const
|
|
5647
|
+
const middlewares$1 = {
|
|
5601
5648
|
rateLimit,
|
|
5602
5649
|
"data-transfer": dataTransfer
|
|
5603
5650
|
};
|
|
5604
|
-
|
|
5605
|
-
|
|
5606
|
-
|
|
5607
|
-
|
|
5608
|
-
|
|
5609
|
-
|
|
5610
|
-
|
|
5611
|
-
|
|
5612
|
-
|
|
5613
|
-
|
|
5651
|
+
const register = async ({ strapi: strapi2 }) => {
|
|
5652
|
+
await register$2({ strapi: strapi2 });
|
|
5653
|
+
};
|
|
5654
|
+
const getService = (name2, { strapi: strapi2 } = { strapi: global.strapi }) => {
|
|
5655
|
+
return strapi2.service(`admin::${name2}`);
|
|
5656
|
+
};
|
|
5657
|
+
const actions = {
|
|
5658
|
+
sso: [
|
|
5659
|
+
{
|
|
5660
|
+
uid: "provider-login.read",
|
|
5661
|
+
displayName: "Read",
|
|
5662
|
+
pluginName: "admin",
|
|
5663
|
+
section: "settings",
|
|
5664
|
+
category: "single sign on",
|
|
5665
|
+
subCategory: "options"
|
|
5666
|
+
},
|
|
5667
|
+
{
|
|
5668
|
+
uid: "provider-login.update",
|
|
5669
|
+
displayName: "Update",
|
|
5670
|
+
pluginName: "admin",
|
|
5671
|
+
section: "settings",
|
|
5672
|
+
category: "single sign on",
|
|
5673
|
+
subCategory: "options"
|
|
5674
|
+
}
|
|
5675
|
+
],
|
|
5676
|
+
auditLogs: [
|
|
5677
|
+
{
|
|
5678
|
+
uid: "audit-logs.read",
|
|
5679
|
+
displayName: "Read",
|
|
5680
|
+
pluginName: "admin",
|
|
5681
|
+
section: "settings",
|
|
5682
|
+
category: "audit logs",
|
|
5683
|
+
subCategory: "options"
|
|
5684
|
+
}
|
|
5685
|
+
]
|
|
5686
|
+
};
|
|
5687
|
+
const transformTableName = (table) => {
|
|
5688
|
+
if (typeof table === "string") {
|
|
5689
|
+
return { name: table };
|
|
5690
|
+
}
|
|
5691
|
+
return table;
|
|
5692
|
+
};
|
|
5693
|
+
async function findTables({ strapi: strapi2 }, regex) {
|
|
5694
|
+
const tables = await strapi2.db.dialect.schemaInspector.getTables();
|
|
5695
|
+
return tables.filter((tableName) => regex.test(tableName));
|
|
5696
|
+
}
|
|
5697
|
+
async function addPersistTables({ strapi: strapi2 }, tableNames) {
|
|
5698
|
+
const persistedTables = await getPersistedTables({ strapi: strapi2 });
|
|
5699
|
+
const tables = tableNames.map(transformTableName);
|
|
5700
|
+
const notPersistedTableNames = fp.differenceWith(fp.isEqual, tables, persistedTables);
|
|
5701
|
+
const tablesToPersist = fp.differenceWith(
|
|
5702
|
+
(t1, t2) => t1.name === t2.name,
|
|
5703
|
+
persistedTables,
|
|
5704
|
+
notPersistedTableNames
|
|
5705
|
+
);
|
|
5706
|
+
if (!notPersistedTableNames.length) {
|
|
5707
|
+
return;
|
|
5708
|
+
}
|
|
5709
|
+
tablesToPersist.push(...notPersistedTableNames);
|
|
5710
|
+
await strapi2.store.set({
|
|
5711
|
+
type: "core",
|
|
5712
|
+
key: "persisted_tables",
|
|
5713
|
+
value: tablesToPersist
|
|
5714
|
+
});
|
|
5715
|
+
}
|
|
5716
|
+
async function getPersistedTables({ strapi: strapi2 }) {
|
|
5717
|
+
const persistedTables = await strapi2.store.get({
|
|
5718
|
+
type: "core",
|
|
5719
|
+
key: "persisted_tables"
|
|
5720
|
+
});
|
|
5721
|
+
return (persistedTables || []).map(transformTableName);
|
|
5722
|
+
}
|
|
5723
|
+
const persistTablesWithPrefix = async (tableNamePrefix) => {
|
|
5724
|
+
const tableNameRegex = new RegExp(`^${tableNamePrefix}.*`);
|
|
5725
|
+
const tableNames = await findTables({ strapi }, tableNameRegex);
|
|
5726
|
+
await addPersistTables({ strapi }, tableNames);
|
|
5727
|
+
};
|
|
5728
|
+
const bootstrap = async (args) => {
|
|
5729
|
+
const { actionProvider: actionProvider2 } = getService("permission");
|
|
5730
|
+
if (strapi.ee.features.isEnabled("sso")) {
|
|
5731
|
+
await actionProvider2.registerMany(actions.sso);
|
|
5732
|
+
}
|
|
5733
|
+
if (strapi.ee.features.isEnabled("audit-logs")) {
|
|
5734
|
+
await persistTablesWithPrefix("strapi_audit_logs");
|
|
5735
|
+
await actionProvider2.registerMany(actions.auditLogs);
|
|
5736
|
+
}
|
|
5737
|
+
await getService("seat-enforcement").seatEnforcementWorkflow();
|
|
5738
|
+
await bootstrap$1(args);
|
|
5739
|
+
};
|
|
5740
|
+
const destroy = async ({ strapi: strapi2 }) => {
|
|
5741
|
+
await destroy$1();
|
|
5742
|
+
};
|
|
5743
|
+
const adminContentTypes = {};
|
|
5744
|
+
const isSsoLocked = async (user2) => {
|
|
5745
|
+
if (!strapi.ee.features.isEnabled("sso")) {
|
|
5746
|
+
return false;
|
|
5747
|
+
}
|
|
5748
|
+
if (!user2) {
|
|
5749
|
+
throw new Error("Missing user object");
|
|
5750
|
+
}
|
|
5751
|
+
const adminStore = await strapi.store({ type: "core", name: "admin" });
|
|
5752
|
+
const { providers: providers2 } = await adminStore.get({ key: "auth" });
|
|
5753
|
+
const lockedRoles = providers2.ssoLockedRoles ?? [];
|
|
5754
|
+
if (fp.isEmpty(lockedRoles)) {
|
|
5755
|
+
return false;
|
|
5756
|
+
}
|
|
5757
|
+
const roles2 = (
|
|
5758
|
+
// If the roles are pre-loaded for the given user, then use them
|
|
5759
|
+
user2.roles ?? // Otherwise, try to load the role based on the given user ID
|
|
5760
|
+
await strapi.db.query("admin::user").load(user2, "roles", { roles: { fields: ["id"] } }) ?? // If the query fails somehow, default to an empty array
|
|
5761
|
+
[]
|
|
5762
|
+
);
|
|
5763
|
+
const isLocked = lockedRoles.some(
|
|
5764
|
+
(lockedId) => (
|
|
5765
|
+
// lockedRoles will be a string to avoid issues with frontend and bigints
|
|
5766
|
+
roles2.some((role2) => lockedId === role2.id.toString())
|
|
5767
|
+
)
|
|
5768
|
+
);
|
|
5769
|
+
return isLocked;
|
|
5770
|
+
};
|
|
5771
|
+
const { ApplicationError: ApplicationError$2 } = utils$2.errors;
|
|
5772
|
+
const forgotPassword = async ({ email: email2 } = {}) => {
|
|
5773
|
+
const user2 = await strapi.db.query("admin::user").findOne({ where: { email: email2, isActive: true } });
|
|
5774
|
+
if (!user2 || await isSsoLocked(user2)) {
|
|
5775
|
+
return;
|
|
5776
|
+
}
|
|
5777
|
+
const resetPasswordToken = getService("token").createToken();
|
|
5778
|
+
await getService("user").updateById(user2.id, { resetPasswordToken });
|
|
5779
|
+
const url = `${strapi.config.get(
|
|
5780
|
+
"admin.absoluteUrl"
|
|
5781
|
+
)}/auth/reset-password?code=${resetPasswordToken}`;
|
|
5782
|
+
return strapi.plugin("email").service("email").sendTemplatedEmail(
|
|
5783
|
+
{
|
|
5784
|
+
to: user2.email,
|
|
5785
|
+
from: strapi.config.get("admin.forgotPassword.from"),
|
|
5786
|
+
replyTo: strapi.config.get("admin.forgotPassword.replyTo")
|
|
5787
|
+
},
|
|
5788
|
+
strapi.config.get("admin.forgotPassword.emailTemplate"),
|
|
5789
|
+
{
|
|
5790
|
+
url,
|
|
5791
|
+
user: ___namespace.default.pick(user2, ["email", "firstname", "lastname", "username"])
|
|
5792
|
+
}
|
|
5793
|
+
).catch((err) => {
|
|
5794
|
+
strapi.log.error(err);
|
|
5795
|
+
});
|
|
5796
|
+
};
|
|
5797
|
+
const resetPassword = async ({ resetPasswordToken, password: password2 } = {}) => {
|
|
5798
|
+
const matchingUser = await strapi.db.query("admin::user").findOne({ where: { resetPasswordToken, isActive: true } });
|
|
5799
|
+
if (!matchingUser || await isSsoLocked(matchingUser)) {
|
|
5800
|
+
throw new ApplicationError$2();
|
|
5801
|
+
}
|
|
5802
|
+
return getService("user").updateById(matchingUser.id, {
|
|
5803
|
+
password: password2,
|
|
5804
|
+
resetPasswordToken: null
|
|
5805
|
+
});
|
|
5806
|
+
};
|
|
5807
|
+
const auth = {
|
|
5808
|
+
forgotPassword,
|
|
5809
|
+
resetPassword
|
|
5810
|
+
};
|
|
5811
|
+
const createProviderRegistry = () => {
|
|
5812
|
+
const registry = /* @__PURE__ */ new Map();
|
|
5813
|
+
Object.assign(registry, {
|
|
5814
|
+
register(provider) {
|
|
5815
|
+
if (strapi.isLoaded) {
|
|
5816
|
+
throw new Error(`You can't register new provider after the bootstrap`);
|
|
5817
|
+
}
|
|
5818
|
+
this.set(provider.uid, provider);
|
|
5819
|
+
},
|
|
5820
|
+
registerMany(providers2) {
|
|
5821
|
+
providers2.forEach((provider) => {
|
|
5822
|
+
this.register(provider);
|
|
5823
|
+
});
|
|
5824
|
+
},
|
|
5825
|
+
getAll() {
|
|
5826
|
+
return Array.from(this.values());
|
|
5827
|
+
}
|
|
5828
|
+
});
|
|
5829
|
+
return registry;
|
|
5830
|
+
};
|
|
5831
|
+
const providerRegistry = createProviderRegistry();
|
|
5832
|
+
const errorMessage = "SSO is disabled. Its functionnalities cannot be accessed.";
|
|
5833
|
+
const getStrategyCallbackURL = (providerName) => {
|
|
5834
|
+
if (!strapi.ee.features.isEnabled("sso")) {
|
|
5835
|
+
throw new Error(errorMessage);
|
|
5836
|
+
}
|
|
5837
|
+
return `/admin/connect/${providerName}`;
|
|
5838
|
+
};
|
|
5839
|
+
const syncProviderRegistryWithConfig = () => {
|
|
5840
|
+
if (!strapi.ee.features.isEnabled("sso")) {
|
|
5841
|
+
throw new Error(errorMessage);
|
|
5842
|
+
}
|
|
5843
|
+
const { providers: providers2 = [] } = strapi.config.get("admin.auth", {});
|
|
5844
|
+
providerRegistry.registerMany(providers2);
|
|
5845
|
+
};
|
|
5846
|
+
const SSOAuthEventsMapper = {
|
|
5847
|
+
onSSOAutoRegistration: "admin.auth.autoRegistration"
|
|
5848
|
+
};
|
|
5849
|
+
const sso$1 = {
|
|
5850
|
+
providerRegistry,
|
|
5851
|
+
getStrategyCallbackURL,
|
|
5852
|
+
syncProviderRegistryWithConfig,
|
|
5853
|
+
authEventsMapper: { ...passport$1.authEventsMapper, ...SSOAuthEventsMapper }
|
|
5854
|
+
};
|
|
5855
|
+
const { UnauthorizedError } = utils$2.errors;
|
|
5856
|
+
const localStrategyMiddleware = async ([error, user2, message], done) => {
|
|
5857
|
+
if (user2 && !error && await isSsoLocked(user2)) {
|
|
5858
|
+
return done(
|
|
5859
|
+
new UnauthorizedError("Login not allowed, please contact your administrator", {
|
|
5860
|
+
code: "LOGIN_NOT_ALLOWED"
|
|
5861
|
+
}),
|
|
5862
|
+
user2,
|
|
5863
|
+
message
|
|
5864
|
+
);
|
|
5865
|
+
}
|
|
5866
|
+
return done(error, user2, message);
|
|
5867
|
+
};
|
|
5868
|
+
const getPassportStrategies = () => {
|
|
5869
|
+
if (!strapi.ee.features.isEnabled("sso")) {
|
|
5870
|
+
return [createLocalStrategy(strapi)];
|
|
5871
|
+
}
|
|
5872
|
+
const localStrategy = createLocalStrategy(strapi, localStrategyMiddleware);
|
|
5873
|
+
if (!strapi.isLoaded) {
|
|
5874
|
+
sso$1.syncProviderRegistryWithConfig();
|
|
5875
|
+
}
|
|
5876
|
+
const providers2 = sso$1.providerRegistry.getAll();
|
|
5877
|
+
const strategies = providers2.map((provider) => provider.createStrategy(strapi));
|
|
5878
|
+
return [localStrategy, ...strategies];
|
|
5879
|
+
};
|
|
5880
|
+
const passport = {
|
|
5881
|
+
getPassportStrategies,
|
|
5882
|
+
...sso$1
|
|
5883
|
+
};
|
|
5884
|
+
const { ApplicationError: ApplicationError$1 } = utils$2.errors;
|
|
5885
|
+
const ssoCheckRolesIdForDeletion = async (ids) => {
|
|
5886
|
+
const adminStore = await strapi.store({ type: "core", name: "admin" });
|
|
5887
|
+
const {
|
|
5888
|
+
providers: { defaultRole }
|
|
5889
|
+
} = await adminStore.get({ key: "auth" });
|
|
5890
|
+
for (const roleId of ids) {
|
|
5891
|
+
if (defaultRole && fp.toString(defaultRole) === fp.toString(roleId)) {
|
|
5892
|
+
throw new ApplicationError$1(
|
|
5893
|
+
"This role is used as the default SSO role. Make sure to change this configuration before deleting the role"
|
|
5894
|
+
);
|
|
5895
|
+
}
|
|
5896
|
+
}
|
|
5897
|
+
};
|
|
5898
|
+
const role$1 = {
|
|
5899
|
+
ssoCheckRolesIdForDeletion
|
|
5900
|
+
};
|
|
5901
|
+
const { ValidationError: ValidationError$1 } = utils$2.errors;
|
|
5902
|
+
const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$1 } = constants$3;
|
|
5903
|
+
const updateEEDisabledUsersList = async (id, input) => {
|
|
5904
|
+
const disabledUsers = await getService("seat-enforcement").getDisabledUserList();
|
|
5905
|
+
if (!disabledUsers) {
|
|
5906
|
+
return;
|
|
5907
|
+
}
|
|
5908
|
+
const user2 = disabledUsers.find((user22) => user22.id === Number(id));
|
|
5909
|
+
if (!user2) {
|
|
5910
|
+
return;
|
|
5911
|
+
}
|
|
5912
|
+
if (user2.isActive !== input.isActive) {
|
|
5913
|
+
const newDisabledUsersList = disabledUsers.filter((user22) => user22.id !== Number(id));
|
|
5914
|
+
await strapi.store.set({
|
|
5915
|
+
type: "ee",
|
|
5916
|
+
key: "disabled_users",
|
|
5917
|
+
value: newDisabledUsersList
|
|
5918
|
+
});
|
|
5919
|
+
}
|
|
5920
|
+
};
|
|
5921
|
+
const castNumberArray = fp.pipe(fp.castArray, fp.map(fp.toNumber));
|
|
5922
|
+
const removeFromEEDisabledUsersList = async (ids) => {
|
|
5923
|
+
let idsToCheck;
|
|
5924
|
+
if (typeof ids === "object") {
|
|
5925
|
+
idsToCheck = castNumberArray(ids);
|
|
5926
|
+
} else {
|
|
5927
|
+
idsToCheck = [Number(ids)];
|
|
5928
|
+
}
|
|
5929
|
+
const disabledUsers = await getService("seat-enforcement").getDisabledUserList();
|
|
5930
|
+
if (!disabledUsers) {
|
|
5931
|
+
return;
|
|
5932
|
+
}
|
|
5933
|
+
const newDisabledUsersList = disabledUsers.filter((user2) => !idsToCheck.includes(user2.id));
|
|
5934
|
+
await strapi.store.set({
|
|
5935
|
+
type: "ee",
|
|
5936
|
+
key: "disabled_users",
|
|
5937
|
+
value: newDisabledUsersList
|
|
5938
|
+
});
|
|
5939
|
+
};
|
|
5940
|
+
const updateById = async (id, attributes) => {
|
|
5941
|
+
if (___namespace.default.has(attributes, "roles")) {
|
|
5942
|
+
const lastAdminUser = await isLastSuperAdminUser(id);
|
|
5943
|
+
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
5944
|
+
const willRemoveSuperAdminRole = !utils$2.arrays.includesString(attributes.roles, superAdminRole.id);
|
|
5945
|
+
if (lastAdminUser && willRemoveSuperAdminRole) {
|
|
5946
|
+
throw new ValidationError$1("You must have at least one user with super admin role.");
|
|
5947
|
+
}
|
|
5948
|
+
}
|
|
5949
|
+
if (attributes.isActive === false) {
|
|
5950
|
+
const lastAdminUser = await isLastSuperAdminUser(id);
|
|
5951
|
+
if (lastAdminUser) {
|
|
5952
|
+
throw new ValidationError$1("You must have at least one user with super admin role.");
|
|
5953
|
+
}
|
|
5954
|
+
}
|
|
5955
|
+
if (___namespace.default.has(attributes, "password")) {
|
|
5956
|
+
const hashedPassword = await getService("auth").hashPassword(attributes.password);
|
|
5957
|
+
const updatedUser2 = await strapi.db.query("admin::user").update({
|
|
5958
|
+
where: { id },
|
|
5959
|
+
data: {
|
|
5960
|
+
...attributes,
|
|
5961
|
+
password: hashedPassword
|
|
5962
|
+
},
|
|
5963
|
+
populate: ["roles"]
|
|
5964
|
+
});
|
|
5965
|
+
strapi.eventHub.emit("user.update", { user: sanitizeUser(updatedUser2) });
|
|
5966
|
+
return updatedUser2;
|
|
5967
|
+
}
|
|
5968
|
+
const updatedUser = await strapi.db.query("admin::user").update({
|
|
5969
|
+
where: { id },
|
|
5970
|
+
data: attributes,
|
|
5971
|
+
populate: ["roles"]
|
|
5972
|
+
});
|
|
5973
|
+
await updateEEDisabledUsersList(id, attributes);
|
|
5974
|
+
if (updatedUser) {
|
|
5975
|
+
strapi.eventHub.emit("user.update", { user: sanitizeUser(updatedUser) });
|
|
5976
|
+
}
|
|
5977
|
+
return updatedUser;
|
|
5978
|
+
};
|
|
5979
|
+
const deleteById = async (id) => {
|
|
5980
|
+
const userToDelete = await strapi.db.query("admin::user").findOne({
|
|
5981
|
+
where: { id },
|
|
5982
|
+
populate: ["roles"]
|
|
5983
|
+
});
|
|
5984
|
+
if (!userToDelete) {
|
|
5985
|
+
return null;
|
|
5986
|
+
}
|
|
5987
|
+
if (userToDelete) {
|
|
5988
|
+
if (userToDelete.roles.some((r) => r.code === SUPER_ADMIN_CODE$1)) {
|
|
5989
|
+
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
5990
|
+
if (superAdminRole.usersCount === 1) {
|
|
5991
|
+
throw new ValidationError$1("You must have at least one user with super admin role.");
|
|
5992
|
+
}
|
|
5993
|
+
}
|
|
5994
|
+
}
|
|
5995
|
+
const deletedUser = await strapi.db.query("admin::user").delete({ where: { id }, populate: ["roles"] });
|
|
5996
|
+
await removeFromEEDisabledUsersList(id);
|
|
5997
|
+
strapi.eventHub.emit("user.delete", { user: sanitizeUser(deletedUser) });
|
|
5998
|
+
return deletedUser;
|
|
5999
|
+
};
|
|
6000
|
+
const deleteByIds = async (ids) => {
|
|
6001
|
+
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
6002
|
+
const nbOfSuperAdminToDelete = await strapi.db.query("admin::user").count({
|
|
6003
|
+
where: {
|
|
6004
|
+
id: ids,
|
|
6005
|
+
roles: { id: superAdminRole.id }
|
|
6006
|
+
}
|
|
6007
|
+
});
|
|
6008
|
+
if (superAdminRole.usersCount === nbOfSuperAdminToDelete) {
|
|
6009
|
+
throw new ValidationError$1("You must have at least one user with super admin role.");
|
|
6010
|
+
}
|
|
6011
|
+
const deletedUsers = [];
|
|
6012
|
+
for (const id of ids) {
|
|
6013
|
+
const deletedUser = await strapi.db.query("admin::user").delete({
|
|
6014
|
+
where: { id },
|
|
6015
|
+
populate: ["roles"]
|
|
6016
|
+
});
|
|
6017
|
+
deletedUsers.push(deletedUser);
|
|
6018
|
+
}
|
|
6019
|
+
await removeFromEEDisabledUsersList(ids);
|
|
6020
|
+
strapi.eventHub.emit("user.delete", {
|
|
6021
|
+
users: deletedUsers.map((deletedUser) => sanitizeUser(deletedUser))
|
|
6022
|
+
});
|
|
6023
|
+
return deletedUsers;
|
|
6024
|
+
};
|
|
6025
|
+
const sanitizeUserRoles = (role2) => ___namespace.default.pick(role2, ["id", "name", "description", "code"]);
|
|
6026
|
+
const isLastSuperAdminUser = async (userId) => {
|
|
6027
|
+
const user2 = await findOne(userId);
|
|
6028
|
+
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
6029
|
+
return superAdminRole.usersCount === 1 && hasSuperAdminRole$1(user2);
|
|
6030
|
+
};
|
|
6031
|
+
const sanitizeUser = (user2) => {
|
|
6032
|
+
return {
|
|
6033
|
+
...___namespace.default.omit(user2, ["password", "resetPasswordToken", "registrationToken", "roles"]),
|
|
6034
|
+
roles: user2.roles && user2.roles.map(sanitizeUserRoles)
|
|
6035
|
+
};
|
|
6036
|
+
};
|
|
6037
|
+
const findOne = async (id, populate = ["roles"]) => {
|
|
6038
|
+
return strapi.db.query("admin::user").findOne({ where: { id }, populate });
|
|
6039
|
+
};
|
|
6040
|
+
const getCurrentActiveUserCount = async () => {
|
|
6041
|
+
return strapi.db.query("admin::user").count({ where: { isActive: true } });
|
|
6042
|
+
};
|
|
6043
|
+
const user$1 = {
|
|
6044
|
+
updateEEDisabledUsersList,
|
|
6045
|
+
removeFromEEDisabledUsersList,
|
|
6046
|
+
getCurrentActiveUserCount,
|
|
6047
|
+
deleteByIds,
|
|
6048
|
+
deleteById,
|
|
6049
|
+
updateById
|
|
6050
|
+
};
|
|
6051
|
+
const getSSOProvidersList = async () => {
|
|
6052
|
+
const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
|
|
6053
|
+
return providerRegistry2.getAll().map(({ uid }) => uid);
|
|
6054
|
+
};
|
|
6055
|
+
const sendUpdateProjectInformation = async (strapi2) => {
|
|
6056
|
+
let groupProperties = {};
|
|
6057
|
+
const numberOfActiveAdminUsers = await getService("user").count({ isActive: true });
|
|
6058
|
+
const numberOfAdminUsers = await getService("user").count();
|
|
6059
|
+
if (strapi2.ee.features.isEnabled("sso")) {
|
|
6060
|
+
const SSOProviders = await getSSOProvidersList();
|
|
6061
|
+
groupProperties = fp.assign(groupProperties, {
|
|
6062
|
+
SSOProviders,
|
|
6063
|
+
isSSOConfigured: SSOProviders.length !== 0
|
|
6064
|
+
});
|
|
6065
|
+
}
|
|
6066
|
+
if (strapi2.ee.features.isEnabled("cms-content-releases")) {
|
|
6067
|
+
const numberOfContentReleases = await strapi2.db.query("plugin::content-releases.release").count();
|
|
6068
|
+
const numberOfPublishedContentReleases = await strapi2.db.query("plugin::content-releases.release").count({
|
|
6069
|
+
filters: { releasedAt: { $notNull: true } }
|
|
6070
|
+
});
|
|
6071
|
+
groupProperties = fp.assign(groupProperties, {
|
|
6072
|
+
numberOfContentReleases,
|
|
6073
|
+
numberOfPublishedContentReleases
|
|
6074
|
+
});
|
|
6075
|
+
}
|
|
6076
|
+
groupProperties = fp.assign(groupProperties, { numberOfActiveAdminUsers, numberOfAdminUsers });
|
|
6077
|
+
strapi2.telemetry.send("didUpdateProjectInformation", {
|
|
6078
|
+
groupProperties
|
|
6079
|
+
});
|
|
6080
|
+
};
|
|
6081
|
+
const startCron = (strapi2) => {
|
|
6082
|
+
strapi2.cron.add({
|
|
6083
|
+
"0 0 0 * * *": () => sendUpdateProjectInformation(strapi2)
|
|
6084
|
+
});
|
|
6085
|
+
};
|
|
6086
|
+
const metrics = { startCron, getSSOProvidersList, sendUpdateProjectInformation };
|
|
6087
|
+
const { SUPER_ADMIN_CODE } = constants$3;
|
|
6088
|
+
const getDisabledUserList = async () => {
|
|
6089
|
+
return strapi.store.get({ type: "ee", key: "disabled_users" });
|
|
6090
|
+
};
|
|
6091
|
+
const enableMaximumUserCount = async (numberOfUsersToEnable) => {
|
|
6092
|
+
const disabledUsers = await getDisabledUserList();
|
|
6093
|
+
const orderedDisabledUsers = fp.reverse(disabledUsers);
|
|
6094
|
+
const usersToEnable = fp.take(numberOfUsersToEnable, orderedDisabledUsers);
|
|
6095
|
+
await strapi.db.query("admin::user").updateMany({
|
|
6096
|
+
where: { id: fp.map(fp.prop("id"), usersToEnable) },
|
|
6097
|
+
data: { isActive: true }
|
|
6098
|
+
});
|
|
6099
|
+
const remainingDisabledUsers = fp.drop(numberOfUsersToEnable, orderedDisabledUsers);
|
|
6100
|
+
await strapi.store.set({
|
|
6101
|
+
type: "ee",
|
|
6102
|
+
key: "disabled_users",
|
|
6103
|
+
value: remainingDisabledUsers
|
|
6104
|
+
});
|
|
6105
|
+
};
|
|
6106
|
+
const disableUsersAboveLicenseLimit = async (numberOfUsersToDisable) => {
|
|
6107
|
+
const currentlyDisabledUsers = await getDisabledUserList() ?? [];
|
|
6108
|
+
const usersToDisable = [];
|
|
6109
|
+
const nonSuperAdminUsersToDisable = await strapi.db.query("admin::user").findMany({
|
|
6110
|
+
where: {
|
|
6111
|
+
isActive: true,
|
|
6112
|
+
roles: {
|
|
6113
|
+
code: { $ne: SUPER_ADMIN_CODE }
|
|
6114
|
+
}
|
|
6115
|
+
},
|
|
6116
|
+
orderBy: { createdAt: "DESC" },
|
|
6117
|
+
limit: numberOfUsersToDisable
|
|
6118
|
+
});
|
|
6119
|
+
usersToDisable.push(...nonSuperAdminUsersToDisable);
|
|
6120
|
+
if (nonSuperAdminUsersToDisable.length < numberOfUsersToDisable) {
|
|
6121
|
+
const superAdminUsersToDisable = await strapi.db.query("admin::user").findMany({
|
|
6122
|
+
where: {
|
|
6123
|
+
isActive: true,
|
|
6124
|
+
roles: { code: SUPER_ADMIN_CODE }
|
|
6125
|
+
},
|
|
6126
|
+
orderBy: { createdAt: "DESC" },
|
|
6127
|
+
limit: numberOfUsersToDisable - nonSuperAdminUsersToDisable.length
|
|
6128
|
+
});
|
|
6129
|
+
usersToDisable.push(...superAdminUsersToDisable);
|
|
6130
|
+
}
|
|
6131
|
+
await strapi.db.query("admin::user").updateMany({
|
|
6132
|
+
where: { id: fp.map(fp.prop("id"), usersToDisable) },
|
|
6133
|
+
data: { isActive: false }
|
|
6134
|
+
});
|
|
6135
|
+
await strapi.store.set({
|
|
6136
|
+
type: "ee",
|
|
6137
|
+
key: "disabled_users",
|
|
6138
|
+
value: currentlyDisabledUsers.concat(fp.map(fp.pick(["id", "isActive"]), usersToDisable))
|
|
6139
|
+
});
|
|
6140
|
+
};
|
|
6141
|
+
const syncDisabledUserRecords = async () => {
|
|
6142
|
+
const disabledUsers = await strapi.store.get({ type: "ee", key: "disabled_users" });
|
|
6143
|
+
if (!disabledUsers) {
|
|
6144
|
+
return;
|
|
6145
|
+
}
|
|
6146
|
+
await strapi.db.query("admin::user").updateMany({
|
|
6147
|
+
where: { id: fp.map(fp.prop("id"), disabledUsers) },
|
|
6148
|
+
data: { isActive: false }
|
|
6149
|
+
});
|
|
6150
|
+
};
|
|
6151
|
+
const seatEnforcementWorkflow = async () => {
|
|
6152
|
+
const adminSeats = strapi.ee.seats;
|
|
6153
|
+
if (fp.isNil(adminSeats)) {
|
|
6154
|
+
return;
|
|
6155
|
+
}
|
|
6156
|
+
await syncDisabledUserRecords();
|
|
6157
|
+
const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
|
|
6158
|
+
const adminSeatsLeft = adminSeats - currentActiveUserCount;
|
|
6159
|
+
if (adminSeatsLeft > 0) {
|
|
6160
|
+
await enableMaximumUserCount(adminSeatsLeft);
|
|
6161
|
+
} else if (adminSeatsLeft < 0) {
|
|
6162
|
+
await disableUsersAboveLicenseLimit(-adminSeatsLeft);
|
|
6163
|
+
}
|
|
6164
|
+
};
|
|
6165
|
+
const seatEnforcement = {
|
|
6166
|
+
seatEnforcementWorkflow,
|
|
6167
|
+
getDisabledUserList
|
|
6168
|
+
};
|
|
6169
|
+
const services = {
|
|
6170
|
+
auth,
|
|
6171
|
+
passport,
|
|
6172
|
+
role: role$1,
|
|
6173
|
+
user: user$1,
|
|
6174
|
+
metrics,
|
|
6175
|
+
"seat-enforcement": seatEnforcement
|
|
6176
|
+
};
|
|
6177
|
+
const providerOptionsUpdateSchema = utils$2.yup.object().shape({
|
|
6178
|
+
autoRegister: utils$2.yup.boolean().required(),
|
|
6179
|
+
defaultRole: utils$2.yup.strapiID().when("autoRegister", (value, initSchema) => {
|
|
6180
|
+
return value ? initSchema.required() : initSchema.nullable();
|
|
6181
|
+
}).test("is-valid-role", "You must submit a valid default role", (roleId) => {
|
|
6182
|
+
if (roleId === null) {
|
|
6183
|
+
return true;
|
|
6184
|
+
}
|
|
6185
|
+
return strapi.service("admin::role").exists({ id: roleId });
|
|
6186
|
+
}),
|
|
6187
|
+
ssoLockedRoles: utils$2.yup.array().nullable().of(
|
|
6188
|
+
utils$2.yup.strapiID().test(
|
|
6189
|
+
"is-valid-role",
|
|
6190
|
+
"You must submit a valid role for the SSO Locked roles",
|
|
6191
|
+
(roleId) => {
|
|
6192
|
+
return strapi.service("admin::role").exists({ id: roleId });
|
|
6193
|
+
}
|
|
6194
|
+
)
|
|
6195
|
+
)
|
|
6196
|
+
});
|
|
6197
|
+
const validateProviderOptionsUpdate = utils$2.validateYupSchema(providerOptionsUpdateSchema);
|
|
6198
|
+
const PROVIDER_REDIRECT_BASE = "/auth/login";
|
|
6199
|
+
const PROVIDER_REDIRECT_SUCCESS = `${PROVIDER_REDIRECT_BASE}/success`;
|
|
6200
|
+
const PROVIDER_REDIRECT_ERROR = `${PROVIDER_REDIRECT_BASE}/error`;
|
|
6201
|
+
const PROVIDER_URLS_MAP = {
|
|
6202
|
+
success: PROVIDER_REDIRECT_SUCCESS,
|
|
6203
|
+
error: PROVIDER_REDIRECT_ERROR
|
|
6204
|
+
};
|
|
6205
|
+
const getAdminStore = async () => strapi.store({ type: "core", name: "admin" });
|
|
6206
|
+
const getPrefixedRedirectUrls = () => {
|
|
6207
|
+
const { url: adminUrl } = strapi.config.get("admin");
|
|
6208
|
+
const prefixUrl = (url) => `${adminUrl || "/admin"}${url}`;
|
|
6209
|
+
return fp.mapValues(prefixUrl, PROVIDER_URLS_MAP);
|
|
6210
|
+
};
|
|
6211
|
+
const utils = {
|
|
6212
|
+
getAdminStore,
|
|
6213
|
+
getPrefixedRedirectUrls
|
|
6214
|
+
};
|
|
6215
|
+
const defaultConnectionError = () => new Error("Invalid connection payload");
|
|
6216
|
+
const authenticate = async (ctx, next) => {
|
|
6217
|
+
const {
|
|
6218
|
+
params: { provider }
|
|
6219
|
+
} = ctx;
|
|
6220
|
+
const redirectUrls = utils.getPrefixedRedirectUrls();
|
|
6221
|
+
return passport__default.default.authenticate(provider, null, async (error, profile) => {
|
|
6222
|
+
if (error || !profile || !profile.email) {
|
|
6223
|
+
if (error) {
|
|
6224
|
+
strapi.log.error(error);
|
|
6225
|
+
}
|
|
6226
|
+
strapi.eventHub.emit("admin.auth.error", {
|
|
6227
|
+
error: error || defaultConnectionError(),
|
|
6228
|
+
provider
|
|
6229
|
+
});
|
|
6230
|
+
return ctx.redirect(redirectUrls.error);
|
|
6231
|
+
}
|
|
6232
|
+
const user2 = await getService("user").findOneByEmail(profile.email);
|
|
6233
|
+
const scenario = user2 ? existingUserScenario : nonExistingUserScenario;
|
|
6234
|
+
return scenario(ctx, next)(user2 || profile, provider);
|
|
6235
|
+
})(ctx, next);
|
|
6236
|
+
};
|
|
6237
|
+
const existingUserScenario = (ctx, next) => async (user2, provider) => {
|
|
6238
|
+
const redirectUrls = utils.getPrefixedRedirectUrls();
|
|
6239
|
+
if (!user2.isActive) {
|
|
6240
|
+
strapi.eventHub.emit("admin.auth.error", {
|
|
6241
|
+
error: new Error(`Deactivated user tried to login (${user2.id})`),
|
|
6242
|
+
provider
|
|
6243
|
+
});
|
|
6244
|
+
return ctx.redirect(redirectUrls.error);
|
|
6245
|
+
}
|
|
6246
|
+
ctx.state.user = user2;
|
|
6247
|
+
return next();
|
|
6248
|
+
};
|
|
6249
|
+
const nonExistingUserScenario = (ctx, next) => async (profile, provider) => {
|
|
6250
|
+
const { email: email2, firstname: firstname2, lastname: lastname2, username: username2 } = profile;
|
|
6251
|
+
const redirectUrls = utils.getPrefixedRedirectUrls();
|
|
6252
|
+
const adminStore = await utils.getAdminStore();
|
|
6253
|
+
const { providers: providers2 } = await adminStore.get({ key: "auth" });
|
|
6254
|
+
const isMissingRegisterFields = !username2 && (!firstname2 || !lastname2);
|
|
6255
|
+
if (!providers2.autoRegister || !providers2.defaultRole || isMissingRegisterFields) {
|
|
6256
|
+
strapi.eventHub.emit("admin.auth.error", { error: defaultConnectionError(), provider });
|
|
6257
|
+
return ctx.redirect(redirectUrls.error);
|
|
6258
|
+
}
|
|
6259
|
+
const defaultRole = await getService("role").findOne({ id: providers2.defaultRole });
|
|
6260
|
+
if (!defaultRole) {
|
|
6261
|
+
strapi.eventHub.emit("admin.auth.error", { error: defaultConnectionError(), provider });
|
|
6262
|
+
return ctx.redirect(redirectUrls.error);
|
|
6263
|
+
}
|
|
6264
|
+
ctx.state.user = await getService("user").create({
|
|
6265
|
+
email: email2,
|
|
6266
|
+
username: username2,
|
|
6267
|
+
firstname: firstname2,
|
|
6268
|
+
lastname: lastname2,
|
|
6269
|
+
roles: [defaultRole.id],
|
|
6270
|
+
isActive: true,
|
|
6271
|
+
registrationToken: null
|
|
6272
|
+
});
|
|
6273
|
+
strapi.eventHub.emit("admin.auth.autoRegistration", {
|
|
6274
|
+
user: ctx.state.user,
|
|
6275
|
+
provider
|
|
6276
|
+
});
|
|
6277
|
+
return next();
|
|
6278
|
+
};
|
|
6279
|
+
const redirectWithAuth = (ctx) => {
|
|
6280
|
+
const {
|
|
6281
|
+
params: { provider }
|
|
6282
|
+
} = ctx;
|
|
6283
|
+
const redirectUrls = utils.getPrefixedRedirectUrls();
|
|
6284
|
+
const domain2 = strapi.config.get("admin.auth.domain");
|
|
6285
|
+
const { user: user2 } = ctx.state;
|
|
6286
|
+
const jwt2 = getService("token").createJwtToken(user2);
|
|
6287
|
+
const isProduction = strapi.config.get("environment") === "production";
|
|
6288
|
+
const cookiesOptions = { httpOnly: false, secure: isProduction, overwrite: true, domain: domain2 };
|
|
6289
|
+
const sanitizedUser = getService("user").sanitizeUser(user2);
|
|
6290
|
+
strapi.eventHub.emit("admin.auth.success", { user: sanitizedUser, provider });
|
|
6291
|
+
ctx.cookies.set("jwtToken", jwt2, cookiesOptions);
|
|
6292
|
+
ctx.redirect(redirectUrls.success);
|
|
6293
|
+
};
|
|
6294
|
+
const middlewares = {
|
|
6295
|
+
authenticate,
|
|
6296
|
+
redirectWithAuth
|
|
6297
|
+
};
|
|
6298
|
+
const toProviderDTO = fp.pick(["uid", "displayName", "icon"]);
|
|
6299
|
+
const toProviderLoginOptionsDTO = fp.pick(["autoRegister", "defaultRole", "ssoLockedRoles"]);
|
|
6300
|
+
const { ValidationError } = utils$2.errors;
|
|
6301
|
+
const providerAuthenticationFlow = compose__default.default([
|
|
6302
|
+
middlewares.authenticate,
|
|
6303
|
+
middlewares.redirectWithAuth
|
|
6304
|
+
]);
|
|
6305
|
+
const authentication = {
|
|
6306
|
+
async getProviders(ctx) {
|
|
6307
|
+
const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
|
|
6308
|
+
ctx.body = providerRegistry2.getAll().map(toProviderDTO);
|
|
6309
|
+
},
|
|
6310
|
+
async getProviderLoginOptions(ctx) {
|
|
6311
|
+
const adminStore = await utils.getAdminStore();
|
|
6312
|
+
const { providers: providersOptions } = await adminStore.get({ key: "auth" });
|
|
6313
|
+
ctx.body = {
|
|
6314
|
+
data: toProviderLoginOptionsDTO(providersOptions)
|
|
6315
|
+
};
|
|
6316
|
+
},
|
|
6317
|
+
async updateProviderLoginOptions(ctx) {
|
|
6318
|
+
const {
|
|
6319
|
+
request: { body }
|
|
6320
|
+
} = ctx;
|
|
6321
|
+
await validateProviderOptionsUpdate(body);
|
|
6322
|
+
const adminStore = await utils.getAdminStore();
|
|
6323
|
+
const currentAuthOptions = await adminStore.get({ key: "auth" });
|
|
6324
|
+
const newAuthOptions = { ...currentAuthOptions, providers: body };
|
|
6325
|
+
await adminStore.set({ key: "auth", value: newAuthOptions });
|
|
6326
|
+
strapi.telemetry.send("didUpdateSSOSettings");
|
|
6327
|
+
ctx.body = {
|
|
6328
|
+
data: toProviderLoginOptionsDTO(newAuthOptions.providers)
|
|
6329
|
+
};
|
|
6330
|
+
},
|
|
6331
|
+
providerLogin(ctx, next) {
|
|
6332
|
+
const {
|
|
6333
|
+
params: { provider: providerName }
|
|
6334
|
+
} = ctx;
|
|
6335
|
+
const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
|
|
6336
|
+
if (!providerRegistry2.has(providerName)) {
|
|
6337
|
+
throw new ValidationError(`Invalid provider supplied: ${providerName}`);
|
|
6338
|
+
}
|
|
6339
|
+
return providerAuthenticationFlow(ctx, next);
|
|
6340
|
+
}
|
|
6341
|
+
};
|
|
6342
|
+
const roleCreateSchema = utils$2.yup.object().shape({
|
|
6343
|
+
name: utils$2.yup.string().min(1).required(),
|
|
6344
|
+
description: utils$2.yup.string().nullable()
|
|
6345
|
+
}).noUnknown();
|
|
6346
|
+
const rolesDeleteSchema = utils$2.yup.object().shape({
|
|
6347
|
+
ids: utils$2.yup.array().of(utils$2.yup.strapiID()).min(1).required().test(
|
|
6348
|
+
"roles-deletion-checks",
|
|
6349
|
+
"Roles deletion checks have failed",
|
|
6350
|
+
async function rolesDeletionChecks(ids) {
|
|
6351
|
+
try {
|
|
6352
|
+
await strapi.service("admin::role").checkRolesIdForDeletion(ids);
|
|
6353
|
+
if (strapi.ee.features.isEnabled("sso")) {
|
|
6354
|
+
await strapi.service("admin::role").ssoCheckRolesIdForDeletion(ids);
|
|
6355
|
+
}
|
|
6356
|
+
} catch (e) {
|
|
6357
|
+
return this.createError({ path: "ids", message: e.message });
|
|
6358
|
+
}
|
|
6359
|
+
return true;
|
|
6360
|
+
}
|
|
6361
|
+
)
|
|
6362
|
+
}).noUnknown();
|
|
6363
|
+
const roleDeleteSchema = utils$2.yup.strapiID().required().test(
|
|
6364
|
+
"no-admin-single-delete",
|
|
6365
|
+
"Role deletion checks have failed",
|
|
6366
|
+
async function noAdminSingleDelete(id) {
|
|
6367
|
+
try {
|
|
6368
|
+
await strapi.service("admin::role").checkRolesIdForDeletion([id]);
|
|
6369
|
+
if (strapi.ee.features.isEnabled("sso")) {
|
|
6370
|
+
await strapi.service("admin::role").ssoCheckRolesIdForDeletion([id]);
|
|
6371
|
+
}
|
|
6372
|
+
} catch (e) {
|
|
6373
|
+
return this.createError({ path: "id", message: e.message });
|
|
6374
|
+
}
|
|
6375
|
+
return true;
|
|
6376
|
+
}
|
|
6377
|
+
);
|
|
6378
|
+
const validateRoleCreateInput = utils$2.validateYupSchema(roleCreateSchema);
|
|
6379
|
+
const validateRolesDeleteInput = utils$2.validateYupSchema(rolesDeleteSchema);
|
|
6380
|
+
const validateRoleDeleteInput = utils$2.validateYupSchema(roleDeleteSchema);
|
|
6381
|
+
const role = {
|
|
6382
|
+
/**
|
|
6383
|
+
* Create a new role
|
|
6384
|
+
* @param {KoaContext} ctx - koa context
|
|
6385
|
+
*/
|
|
6386
|
+
async create(ctx) {
|
|
6387
|
+
await validateRoleCreateInput(ctx.request.body);
|
|
6388
|
+
const roleService = getService("role");
|
|
6389
|
+
const role2 = await roleService.create(ctx.request.body);
|
|
6390
|
+
const sanitizedRole = roleService.sanitizeRole(role2);
|
|
6391
|
+
ctx.created({ data: sanitizedRole });
|
|
6392
|
+
},
|
|
6393
|
+
/**
|
|
6394
|
+
* Delete a role
|
|
6395
|
+
* @param {KoaContext} ctx - koa context
|
|
6396
|
+
*/
|
|
6397
|
+
async deleteOne(ctx) {
|
|
6398
|
+
const { id } = ctx.params;
|
|
6399
|
+
await validateRoleDeleteInput(id);
|
|
6400
|
+
const roleService = getService("role");
|
|
6401
|
+
const roles2 = await roleService.deleteByIds([id]);
|
|
6402
|
+
const sanitizedRole = roles2.map((role2) => roleService.sanitizeRole(role2))[0] || null;
|
|
6403
|
+
return ctx.deleted({
|
|
6404
|
+
data: sanitizedRole
|
|
6405
|
+
});
|
|
6406
|
+
},
|
|
6407
|
+
/**
|
|
6408
|
+
* delete several roles
|
|
6409
|
+
* @param {KoaContext} ctx - koa context
|
|
6410
|
+
*/
|
|
6411
|
+
async deleteMany(ctx) {
|
|
6412
|
+
const { body } = ctx.request;
|
|
6413
|
+
await validateRolesDeleteInput(body);
|
|
6414
|
+
const roleService = getService("role");
|
|
6415
|
+
const roles2 = await roleService.deleteByIds(body.ids);
|
|
6416
|
+
const sanitizedRoles = roles2.map(roleService.sanitizeRole);
|
|
6417
|
+
return ctx.deleted({
|
|
6418
|
+
data: sanitizedRoles
|
|
6419
|
+
});
|
|
6420
|
+
}
|
|
6421
|
+
};
|
|
6422
|
+
const ssoUserCreationInputExtension = utils$2.yup.object().shape({
|
|
6423
|
+
useSSORegistration: utils$2.yup.boolean()
|
|
6424
|
+
}).noUnknown();
|
|
6425
|
+
const validateUserCreationInput = (data) => {
|
|
6426
|
+
let schema = schemas.userCreationSchema;
|
|
6427
|
+
if (strapi.ee.features.isEnabled("sso")) {
|
|
6428
|
+
schema = schema.concat(ssoUserCreationInputExtension);
|
|
6429
|
+
}
|
|
6430
|
+
return utils$2.validateYupSchema(schema)(data);
|
|
6431
|
+
};
|
|
6432
|
+
const { ApplicationError, ForbiddenError } = utils$2.errors;
|
|
6433
|
+
const pickUserCreationAttributes = fp.pick(["firstname", "lastname", "email", "roles"]);
|
|
6434
|
+
const hasAdminSeatsAvaialble = async () => {
|
|
6435
|
+
if (!strapi.EE) {
|
|
6436
|
+
return true;
|
|
6437
|
+
}
|
|
6438
|
+
const permittedSeats = strapi.ee.seats;
|
|
6439
|
+
if (fp.isNil(permittedSeats)) {
|
|
6440
|
+
return true;
|
|
6441
|
+
}
|
|
6442
|
+
const userCount = await strapi.service("admin::user").getCurrentActiveUserCount();
|
|
6443
|
+
if (userCount < permittedSeats) {
|
|
6444
|
+
return true;
|
|
6445
|
+
}
|
|
6446
|
+
};
|
|
6447
|
+
const user = {
|
|
6448
|
+
async create(ctx) {
|
|
6449
|
+
if (!await hasAdminSeatsAvaialble()) {
|
|
6450
|
+
throw new ForbiddenError("License seat limit reached. You cannot create a new user");
|
|
6451
|
+
}
|
|
6452
|
+
const { body } = ctx.request;
|
|
6453
|
+
const cleanData = { ...body, email: ___namespace.default.get(body, `email`, ``).toLowerCase() };
|
|
6454
|
+
await validateUserCreationInput(cleanData);
|
|
6455
|
+
const attributes = pickUserCreationAttributes(cleanData);
|
|
6456
|
+
const { useSSORegistration } = cleanData;
|
|
6457
|
+
const userAlreadyExists = await getService("user").exists({ email: attributes.email });
|
|
6458
|
+
if (userAlreadyExists) {
|
|
6459
|
+
throw new ApplicationError("Email already taken");
|
|
6460
|
+
}
|
|
6461
|
+
if (useSSORegistration) {
|
|
6462
|
+
Object.assign(attributes, { registrationToken: null, isActive: true });
|
|
6463
|
+
}
|
|
6464
|
+
const createdUser = await getService("user").create(attributes);
|
|
6465
|
+
const userInfo = getService("user").sanitizeUser(createdUser);
|
|
6466
|
+
Object.assign(userInfo, { registrationToken: createdUser.registrationToken });
|
|
6467
|
+
ctx.created({ data: userInfo });
|
|
6468
|
+
},
|
|
6469
|
+
async update(ctx) {
|
|
6470
|
+
const { id } = ctx.params;
|
|
6471
|
+
const { body: input } = ctx.request;
|
|
6472
|
+
await validateUserUpdateInput(input);
|
|
6473
|
+
if (___namespace.default.has(input, "email")) {
|
|
6474
|
+
const uniqueEmailCheck = await getService("user").exists({
|
|
6475
|
+
id: { $ne: id },
|
|
6476
|
+
email: input.email
|
|
6477
|
+
});
|
|
6478
|
+
if (uniqueEmailCheck) {
|
|
6479
|
+
throw new ApplicationError("A user with this email address already exists");
|
|
6480
|
+
}
|
|
6481
|
+
}
|
|
6482
|
+
const user2 = await getService("user").findOne(id, null);
|
|
6483
|
+
if (!await hasAdminSeatsAvaialble() && !user2.isActive && input.isActive) {
|
|
6484
|
+
throw new ForbiddenError("License seat limit reached. You cannot active this user");
|
|
6485
|
+
}
|
|
6486
|
+
const updatedUser = await getService("user").updateById(id, input);
|
|
6487
|
+
if (!updatedUser) {
|
|
6488
|
+
return ctx.notFound("User does not exist");
|
|
6489
|
+
}
|
|
6490
|
+
ctx.body = {
|
|
6491
|
+
data: getService("user").sanitizeUser(updatedUser)
|
|
6492
|
+
};
|
|
6493
|
+
},
|
|
6494
|
+
async isSSOLocked(ctx) {
|
|
6495
|
+
const { user: user2 } = ctx.state;
|
|
6496
|
+
const isSSOLocked = await isSsoLocked(user2);
|
|
6497
|
+
ctx.body = {
|
|
6498
|
+
data: {
|
|
6499
|
+
isSSOLocked
|
|
6500
|
+
}
|
|
6501
|
+
};
|
|
6502
|
+
}
|
|
6503
|
+
};
|
|
6504
|
+
const admin$2 = {
|
|
6505
|
+
// NOTE: Overrides CE admin controller
|
|
6506
|
+
async getProjectType() {
|
|
6507
|
+
const flags = strapi.config.get("admin.flags", {});
|
|
6508
|
+
try {
|
|
6509
|
+
return { data: { isEE: strapi.EE, features: strapi.ee.features.list(), flags } };
|
|
6510
|
+
} catch (err) {
|
|
6511
|
+
return { data: { isEE: false, features: [], flags } };
|
|
6512
|
+
}
|
|
6513
|
+
},
|
|
6514
|
+
async licenseLimitInformation() {
|
|
6515
|
+
const permittedSeats = strapi.ee.seats;
|
|
6516
|
+
let shouldNotify = false;
|
|
6517
|
+
let licenseLimitStatus = null;
|
|
6518
|
+
let enforcementUserCount;
|
|
6519
|
+
const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
|
|
6520
|
+
const eeDisabledUsers = await getService("seat-enforcement").getDisabledUserList();
|
|
6521
|
+
if (eeDisabledUsers) {
|
|
6522
|
+
enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;
|
|
6523
|
+
} else {
|
|
6524
|
+
enforcementUserCount = currentActiveUserCount;
|
|
6525
|
+
}
|
|
6526
|
+
if (!fp.isNil(permittedSeats) && enforcementUserCount > permittedSeats) {
|
|
6527
|
+
shouldNotify = true;
|
|
6528
|
+
licenseLimitStatus = "OVER_LIMIT";
|
|
6529
|
+
}
|
|
6530
|
+
if (!fp.isNil(permittedSeats) && enforcementUserCount === permittedSeats) {
|
|
6531
|
+
shouldNotify = true;
|
|
6532
|
+
licenseLimitStatus = "AT_LIMIT";
|
|
6533
|
+
}
|
|
6534
|
+
const data = {
|
|
6535
|
+
enforcementUserCount,
|
|
6536
|
+
currentActiveUserCount,
|
|
6537
|
+
permittedSeats,
|
|
6538
|
+
shouldNotify,
|
|
6539
|
+
shouldStopCreate: fp.isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,
|
|
6540
|
+
licenseLimitStatus,
|
|
6541
|
+
isHostedOnStrapiCloud: utils$2.env("STRAPI_HOSTING", null) === "strapi.cloud",
|
|
6542
|
+
features: strapi.ee.features.list() ?? []
|
|
6543
|
+
};
|
|
6544
|
+
return { data };
|
|
6545
|
+
}
|
|
6546
|
+
};
|
|
6547
|
+
const controllers = {
|
|
6548
|
+
authentication,
|
|
6549
|
+
role,
|
|
6550
|
+
user,
|
|
6551
|
+
admin: admin$2
|
|
6552
|
+
};
|
|
6553
|
+
const enableFeatureMiddleware = (featureName) => (ctx, next) => {
|
|
6554
|
+
if (strapi.ee.features.isEnabled(featureName)) {
|
|
6555
|
+
return next();
|
|
6556
|
+
}
|
|
6557
|
+
ctx.status = 404;
|
|
6558
|
+
};
|
|
6559
|
+
const sso = {
|
|
6560
|
+
type: "admin",
|
|
6561
|
+
routes: [
|
|
6562
|
+
{
|
|
6563
|
+
method: "GET",
|
|
6564
|
+
path: "/providers",
|
|
6565
|
+
handler: "authentication.getProviders",
|
|
6566
|
+
config: {
|
|
6567
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6568
|
+
auth: false
|
|
6569
|
+
}
|
|
6570
|
+
},
|
|
6571
|
+
{
|
|
6572
|
+
method: "GET",
|
|
6573
|
+
path: "/connect/:provider",
|
|
6574
|
+
handler: "authentication.providerLogin",
|
|
6575
|
+
config: {
|
|
6576
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6577
|
+
auth: false
|
|
6578
|
+
}
|
|
6579
|
+
},
|
|
6580
|
+
{
|
|
6581
|
+
method: "POST",
|
|
6582
|
+
path: "/connect/:provider",
|
|
6583
|
+
handler: "authentication.providerLogin",
|
|
6584
|
+
config: {
|
|
6585
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6586
|
+
auth: false
|
|
6587
|
+
}
|
|
6588
|
+
},
|
|
6589
|
+
{
|
|
6590
|
+
method: "GET",
|
|
6591
|
+
path: "/providers/options",
|
|
6592
|
+
handler: "authentication.getProviderLoginOptions",
|
|
6593
|
+
config: {
|
|
6594
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6595
|
+
policies: [
|
|
6596
|
+
"admin::isAuthenticatedAdmin",
|
|
6597
|
+
{ name: "admin::hasPermissions", config: { actions: ["admin::provider-login.read"] } }
|
|
6598
|
+
]
|
|
6599
|
+
}
|
|
6600
|
+
},
|
|
6601
|
+
{
|
|
6602
|
+
method: "PUT",
|
|
6603
|
+
path: "/providers/options",
|
|
6604
|
+
handler: "authentication.updateProviderLoginOptions",
|
|
6605
|
+
config: {
|
|
6606
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6607
|
+
policies: [
|
|
6608
|
+
"admin::isAuthenticatedAdmin",
|
|
6609
|
+
{ name: "admin::hasPermissions", config: { actions: ["admin::provider-login.update"] } }
|
|
6610
|
+
]
|
|
6611
|
+
}
|
|
6612
|
+
},
|
|
6613
|
+
{
|
|
6614
|
+
method: "GET",
|
|
6615
|
+
path: "/providers/isSSOLocked",
|
|
6616
|
+
handler: "user.isSSOLocked",
|
|
6617
|
+
config: {
|
|
6618
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6619
|
+
policies: ["admin::isAuthenticatedAdmin"]
|
|
6620
|
+
}
|
|
6621
|
+
}
|
|
6622
|
+
]
|
|
6623
|
+
};
|
|
6624
|
+
const licenseLimit = {
|
|
6625
|
+
type: "admin",
|
|
6626
|
+
routes: [
|
|
6627
|
+
// License limit infos
|
|
6628
|
+
{
|
|
6629
|
+
method: "GET",
|
|
6630
|
+
path: "/license-limit-information",
|
|
6631
|
+
handler: "admin.licenseLimitInformation",
|
|
6632
|
+
config: {
|
|
6633
|
+
policies: [
|
|
6634
|
+
"admin::isAuthenticatedAdmin",
|
|
6635
|
+
{
|
|
6636
|
+
name: "admin::hasPermissions",
|
|
6637
|
+
config: {
|
|
6638
|
+
actions: [
|
|
6639
|
+
"admin::users.create",
|
|
6640
|
+
"admin::users.read",
|
|
6641
|
+
"admin::users.update",
|
|
6642
|
+
"admin::users.delete"
|
|
6643
|
+
]
|
|
6644
|
+
}
|
|
6645
|
+
}
|
|
6646
|
+
]
|
|
6647
|
+
}
|
|
6648
|
+
}
|
|
6649
|
+
]
|
|
6650
|
+
};
|
|
6651
|
+
const routes = {
|
|
6652
|
+
sso,
|
|
6653
|
+
"license-limit": licenseLimit
|
|
6654
|
+
};
|
|
6655
|
+
const auditLogsRoutes = {
|
|
6656
|
+
type: "admin",
|
|
6657
|
+
routes: [
|
|
6658
|
+
{
|
|
6659
|
+
method: "GET",
|
|
6660
|
+
path: "/audit-logs",
|
|
6661
|
+
handler: "audit-logs.findMany",
|
|
6662
|
+
config: {
|
|
6663
|
+
middlewares: [enableFeatureMiddleware("audit-logs")],
|
|
6664
|
+
policies: [
|
|
6665
|
+
"admin::isAuthenticatedAdmin",
|
|
6666
|
+
{
|
|
6667
|
+
name: "admin::hasPermissions",
|
|
6668
|
+
config: {
|
|
6669
|
+
actions: ["admin::audit-logs.read"]
|
|
6670
|
+
}
|
|
6671
|
+
}
|
|
6672
|
+
]
|
|
6673
|
+
}
|
|
6674
|
+
},
|
|
6675
|
+
{
|
|
6676
|
+
method: "GET",
|
|
6677
|
+
path: "/audit-logs/:id",
|
|
6678
|
+
handler: "audit-logs.findOne",
|
|
6679
|
+
config: {
|
|
6680
|
+
middlewares: [enableFeatureMiddleware("audit-logs")],
|
|
6681
|
+
policies: [
|
|
6682
|
+
"admin::isAuthenticatedAdmin",
|
|
6683
|
+
{
|
|
6684
|
+
name: "admin::hasPermissions",
|
|
6685
|
+
config: {
|
|
6686
|
+
actions: ["admin::audit-logs.read"]
|
|
6687
|
+
}
|
|
6688
|
+
}
|
|
6689
|
+
]
|
|
6690
|
+
}
|
|
6691
|
+
}
|
|
6692
|
+
]
|
|
6693
|
+
};
|
|
6694
|
+
const ALLOWED_SORT_STRINGS = ["action:ASC", "action:DESC", "date:ASC", "date:DESC"];
|
|
6695
|
+
const validateFindManySchema = utils$2.yup.object().shape({
|
|
6696
|
+
page: utils$2.yup.number().integer().min(1),
|
|
6697
|
+
pageSize: utils$2.yup.number().integer().min(1).max(100),
|
|
6698
|
+
sort: utils$2.yup.mixed().oneOf(ALLOWED_SORT_STRINGS)
|
|
6699
|
+
}).required();
|
|
6700
|
+
const validateFindMany = utils$2.validateYupSchema(validateFindManySchema, { strict: false });
|
|
6701
|
+
const auditLogsController = {
|
|
6702
|
+
async findMany(ctx) {
|
|
6703
|
+
const { query } = ctx.request;
|
|
6704
|
+
await validateFindMany(query);
|
|
6705
|
+
const auditLogs = strapi.get("audit-logs");
|
|
6706
|
+
const body = await auditLogs.findMany(query);
|
|
6707
|
+
ctx.body = body;
|
|
6708
|
+
},
|
|
6709
|
+
async findOne(ctx) {
|
|
6710
|
+
const { id } = ctx.params;
|
|
6711
|
+
const auditLogs = strapi.get("audit-logs");
|
|
6712
|
+
const body = await auditLogs.findOne(id);
|
|
6713
|
+
ctx.body = body;
|
|
6714
|
+
strapi.telemetry.send("didWatchAnAuditLog");
|
|
6715
|
+
}
|
|
6716
|
+
};
|
|
6717
|
+
const getSanitizedUser = (user2) => {
|
|
6718
|
+
let displayName = user2.email;
|
|
6719
|
+
if (user2.username) {
|
|
6720
|
+
displayName = user2.username;
|
|
6721
|
+
} else if (user2.firstname && user2.lastname) {
|
|
6722
|
+
displayName = `${user2.firstname} ${user2.lastname}`;
|
|
6723
|
+
}
|
|
6724
|
+
return {
|
|
6725
|
+
id: user2.id,
|
|
6726
|
+
email: user2.email,
|
|
6727
|
+
displayName
|
|
6728
|
+
};
|
|
6729
|
+
};
|
|
6730
|
+
const createAuditLogsService = (strapi2) => {
|
|
6731
|
+
return {
|
|
6732
|
+
async saveEvent(event) {
|
|
6733
|
+
const { userId, ...rest } = event;
|
|
6734
|
+
const auditLog2 = { ...rest, user: userId };
|
|
6735
|
+
await strapi2.db?.query("admin::audit-log").create({ data: auditLog2 });
|
|
6736
|
+
return this;
|
|
6737
|
+
},
|
|
6738
|
+
async findMany(query) {
|
|
6739
|
+
const { results, pagination } = await strapi2.db?.query("admin::audit-log").findPage({
|
|
6740
|
+
populate: ["user"],
|
|
6741
|
+
select: ["action", "date", "payload"],
|
|
6742
|
+
...strapi2.get("query-params").transform("admin::audit-log", query)
|
|
6743
|
+
});
|
|
6744
|
+
const sanitizedResults = results.map((result) => {
|
|
6745
|
+
const { user: user2, ...rest } = result;
|
|
6746
|
+
return {
|
|
6747
|
+
...rest,
|
|
6748
|
+
user: user2 ? getSanitizedUser(user2) : null
|
|
6749
|
+
};
|
|
6750
|
+
});
|
|
6751
|
+
return {
|
|
6752
|
+
results: sanitizedResults,
|
|
6753
|
+
pagination
|
|
6754
|
+
};
|
|
6755
|
+
},
|
|
6756
|
+
async findOne(id) {
|
|
6757
|
+
const result = await strapi2.db?.query("admin::audit-log").findOne({
|
|
6758
|
+
where: { id },
|
|
6759
|
+
populate: ["user"],
|
|
6760
|
+
select: ["action", "date", "payload"]
|
|
6761
|
+
});
|
|
6762
|
+
if (!result) {
|
|
6763
|
+
return null;
|
|
6764
|
+
}
|
|
6765
|
+
const { user: user2, ...rest } = result;
|
|
6766
|
+
return {
|
|
6767
|
+
...rest,
|
|
6768
|
+
user: user2 ? getSanitizedUser(user2) : null
|
|
6769
|
+
};
|
|
6770
|
+
},
|
|
6771
|
+
deleteExpiredEvents(expirationDate) {
|
|
6772
|
+
return strapi2.db?.query("admin::audit-log").deleteMany({
|
|
6773
|
+
where: {
|
|
6774
|
+
date: {
|
|
6775
|
+
$lt: expirationDate.toISOString()
|
|
6776
|
+
}
|
|
6777
|
+
}
|
|
6778
|
+
});
|
|
6779
|
+
}
|
|
6780
|
+
};
|
|
6781
|
+
};
|
|
6782
|
+
const DEFAULT_RETENTION_DAYS = 90;
|
|
6783
|
+
const defaultEvents = [
|
|
6784
|
+
"entry.create",
|
|
6785
|
+
"entry.update",
|
|
6786
|
+
"entry.delete",
|
|
6787
|
+
"entry.publish",
|
|
6788
|
+
"entry.unpublish",
|
|
6789
|
+
"media.create",
|
|
6790
|
+
"media.update",
|
|
6791
|
+
"media.delete",
|
|
6792
|
+
"media-folder.create",
|
|
6793
|
+
"media-folder.update",
|
|
6794
|
+
"media-folder.delete",
|
|
6795
|
+
"user.create",
|
|
6796
|
+
"user.update",
|
|
6797
|
+
"user.delete",
|
|
6798
|
+
"admin.auth.success",
|
|
6799
|
+
"admin.logout",
|
|
6800
|
+
"content-type.create",
|
|
6801
|
+
"content-type.update",
|
|
6802
|
+
"content-type.delete",
|
|
6803
|
+
"component.create",
|
|
6804
|
+
"component.update",
|
|
6805
|
+
"component.delete",
|
|
6806
|
+
"role.create",
|
|
6807
|
+
"role.update",
|
|
6808
|
+
"role.delete",
|
|
6809
|
+
"permission.create",
|
|
6810
|
+
"permission.update",
|
|
6811
|
+
"permission.delete"
|
|
6812
|
+
];
|
|
6813
|
+
const getEventMap = (defaultEvents2) => {
|
|
6814
|
+
const getDefaultPayload = (...args) => args[0];
|
|
6815
|
+
return defaultEvents2.reduce((acc, event) => {
|
|
6816
|
+
acc[event] = getDefaultPayload;
|
|
6817
|
+
return acc;
|
|
6818
|
+
}, {});
|
|
6819
|
+
};
|
|
6820
|
+
const getRetentionDays = (strapi2) => {
|
|
6821
|
+
const featureConfig = strapi2.ee.features.get("audit-logs");
|
|
6822
|
+
const licenseRetentionDays = typeof featureConfig === "object" && featureConfig?.options.retentionDays;
|
|
6823
|
+
const userRetentionDays = strapi2.config.get("admin.auditLogs.retentionDays");
|
|
6824
|
+
if (licenseRetentionDays == null) {
|
|
6825
|
+
return userRetentionDays ?? DEFAULT_RETENTION_DAYS;
|
|
6826
|
+
}
|
|
6827
|
+
if (userRetentionDays && userRetentionDays < licenseRetentionDays) {
|
|
6828
|
+
return userRetentionDays;
|
|
6829
|
+
}
|
|
6830
|
+
return licenseRetentionDays;
|
|
6831
|
+
};
|
|
6832
|
+
const createAuditLogsLifecycleService = (strapi2) => {
|
|
6833
|
+
const state = {};
|
|
6834
|
+
const auditLogsService = strapi2.get("audit-logs");
|
|
6835
|
+
const eventMap = getEventMap(defaultEvents);
|
|
6836
|
+
const processEvent = (name2, ...args) => {
|
|
6837
|
+
const requestState = strapi2.requestContext.get()?.state;
|
|
6838
|
+
const isUsingAdminAuth = requestState?.route.info.type === "admin";
|
|
6839
|
+
const user2 = requestState?.user;
|
|
6840
|
+
if (!isUsingAdminAuth || !user2) {
|
|
6841
|
+
return null;
|
|
6842
|
+
}
|
|
6843
|
+
const getPayload = eventMap[name2];
|
|
6844
|
+
if (!getPayload) {
|
|
6845
|
+
return null;
|
|
6846
|
+
}
|
|
6847
|
+
const ignoredUids = ["plugin::upload.file", "plugin::upload.folder"];
|
|
6848
|
+
if (ignoredUids.includes(args[0]?.uid)) {
|
|
6849
|
+
return null;
|
|
6850
|
+
}
|
|
6851
|
+
return {
|
|
6852
|
+
action: name2,
|
|
6853
|
+
date: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6854
|
+
payload: getPayload(...args) || {},
|
|
6855
|
+
userId: user2.id
|
|
6856
|
+
};
|
|
6857
|
+
};
|
|
6858
|
+
const handleEvent = async (name2, ...args) => {
|
|
6859
|
+
const processedEvent = processEvent(name2, ...args);
|
|
6860
|
+
if (processedEvent) {
|
|
6861
|
+
await auditLogsService.saveEvent(processedEvent);
|
|
6862
|
+
}
|
|
6863
|
+
};
|
|
6864
|
+
return {
|
|
6865
|
+
async register() {
|
|
6866
|
+
if (!state.eeEnableUnsubscribe) {
|
|
6867
|
+
state.eeEnableUnsubscribe = strapi2.eventHub.on("ee.enable", () => {
|
|
6868
|
+
this.destroy();
|
|
6869
|
+
this.register();
|
|
6870
|
+
});
|
|
6871
|
+
}
|
|
6872
|
+
if (!state.eeUpdateUnsubscribe) {
|
|
6873
|
+
state.eeUpdateUnsubscribe = strapi2.eventHub.on("ee.update", () => {
|
|
6874
|
+
this.destroy();
|
|
6875
|
+
this.register();
|
|
6876
|
+
});
|
|
6877
|
+
}
|
|
6878
|
+
state.eeDisableUnsubscribe = strapi2.eventHub.on("ee.disable", () => {
|
|
6879
|
+
this.destroy();
|
|
6880
|
+
});
|
|
6881
|
+
if (!strapi2.ee.features.isEnabled("audit-logs")) {
|
|
6882
|
+
return this;
|
|
6883
|
+
}
|
|
6884
|
+
state.eventHubUnsubscribe = strapi2.eventHub.subscribe(handleEvent);
|
|
6885
|
+
const retentionDays = getRetentionDays(strapi2);
|
|
6886
|
+
state.deleteExpiredJob = nodeSchedule.scheduleJob("0 0 * * *", () => {
|
|
6887
|
+
const expirationDate = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1e3);
|
|
6888
|
+
auditLogsService.deleteExpiredEvents(expirationDate);
|
|
6889
|
+
});
|
|
6890
|
+
return this;
|
|
6891
|
+
},
|
|
6892
|
+
unsubscribe() {
|
|
6893
|
+
if (state.eeDisableUnsubscribe) {
|
|
6894
|
+
state.eeDisableUnsubscribe();
|
|
6895
|
+
}
|
|
6896
|
+
if (state.eventHubUnsubscribe) {
|
|
6897
|
+
state.eventHubUnsubscribe();
|
|
6898
|
+
}
|
|
6899
|
+
if (state.deleteExpiredJob) {
|
|
6900
|
+
state.deleteExpiredJob.cancel();
|
|
6901
|
+
}
|
|
6902
|
+
return this;
|
|
6903
|
+
},
|
|
6904
|
+
destroy() {
|
|
6905
|
+
return this.unsubscribe();
|
|
6906
|
+
}
|
|
6907
|
+
};
|
|
6908
|
+
};
|
|
6909
|
+
const auditLog = {
|
|
6910
|
+
schema: {
|
|
6911
|
+
kind: "collectionType",
|
|
6912
|
+
collectionName: "strapi_audit_logs",
|
|
6913
|
+
info: {
|
|
6914
|
+
singularName: "audit-log",
|
|
6915
|
+
pluralName: "audit-logs",
|
|
6916
|
+
displayName: "Audit Log"
|
|
6917
|
+
},
|
|
6918
|
+
options: {
|
|
6919
|
+
timestamps: false
|
|
6920
|
+
},
|
|
6921
|
+
pluginOptions: {
|
|
6922
|
+
"content-manager": {
|
|
6923
|
+
visible: false
|
|
6924
|
+
},
|
|
6925
|
+
"content-type-builder": {
|
|
6926
|
+
visible: false
|
|
6927
|
+
}
|
|
6928
|
+
},
|
|
6929
|
+
attributes: {
|
|
6930
|
+
action: {
|
|
6931
|
+
type: "string",
|
|
6932
|
+
required: true
|
|
6933
|
+
},
|
|
6934
|
+
date: {
|
|
6935
|
+
type: "datetime",
|
|
6936
|
+
required: true
|
|
6937
|
+
},
|
|
6938
|
+
user: {
|
|
6939
|
+
type: "relation",
|
|
6940
|
+
relation: "oneToOne",
|
|
6941
|
+
target: "admin::user"
|
|
6942
|
+
},
|
|
6943
|
+
payload: {
|
|
6944
|
+
type: "json"
|
|
6945
|
+
}
|
|
6946
|
+
}
|
|
6947
|
+
}
|
|
6948
|
+
};
|
|
6949
|
+
const getAdminEE = () => {
|
|
6950
|
+
const eeAdmin = {
|
|
6951
|
+
register,
|
|
6952
|
+
bootstrap,
|
|
6953
|
+
destroy,
|
|
6954
|
+
contentTypes: {
|
|
6955
|
+
// Always register the audit-log content type to prevent data loss
|
|
6956
|
+
"audit-log": auditLog,
|
|
6957
|
+
...adminContentTypes
|
|
6958
|
+
},
|
|
6959
|
+
services,
|
|
6960
|
+
controllers,
|
|
6961
|
+
routes
|
|
6962
|
+
};
|
|
6963
|
+
if (strapi.config.get("admin.auditLogs.enabled", true) && strapi.ee.features.isEnabled("audit-logs")) {
|
|
6964
|
+
return {
|
|
6965
|
+
...eeAdmin,
|
|
6966
|
+
controllers: {
|
|
6967
|
+
...eeAdmin.controllers,
|
|
6968
|
+
"audit-logs": auditLogsController
|
|
6969
|
+
},
|
|
6970
|
+
routes: {
|
|
6971
|
+
...eeAdmin.routes,
|
|
6972
|
+
"audit-logs": auditLogsRoutes
|
|
6973
|
+
},
|
|
6974
|
+
async register({ strapi: strapi2 }) {
|
|
6975
|
+
await eeAdmin.register({ strapi: strapi2 });
|
|
6976
|
+
strapi2.add("audit-logs", createAuditLogsService(strapi2));
|
|
6977
|
+
const auditLogsLifecycle = createAuditLogsLifecycleService(strapi2);
|
|
6978
|
+
strapi2.add("audit-logs-lifecycle", auditLogsLifecycle);
|
|
6979
|
+
await auditLogsLifecycle.register();
|
|
6980
|
+
},
|
|
6981
|
+
async destroy({ strapi: strapi2 }) {
|
|
6982
|
+
strapi2.get("audit-logs-lifecycle").destroy();
|
|
6983
|
+
await eeAdmin.destroy({ strapi: strapi2 });
|
|
6984
|
+
}
|
|
6985
|
+
};
|
|
6986
|
+
}
|
|
6987
|
+
return eeAdmin;
|
|
6988
|
+
};
|
|
6989
|
+
let admin = {
|
|
6990
|
+
bootstrap: bootstrap$1,
|
|
6991
|
+
register: register$2,
|
|
6992
|
+
destroy: destroy$1,
|
|
6993
|
+
config,
|
|
6994
|
+
policies,
|
|
6995
|
+
routes: routes$1,
|
|
6996
|
+
services: services$1,
|
|
6997
|
+
controllers: controllers$1,
|
|
6998
|
+
contentTypes,
|
|
6999
|
+
middlewares: middlewares$1
|
|
7000
|
+
};
|
|
7001
|
+
const mergeRoutes = (a, b, key) => {
|
|
7002
|
+
return ___namespace.default.isArray(a) && ___namespace.default.isArray(b) && key === "routes" ? a.concat(b) : void 0;
|
|
7003
|
+
};
|
|
7004
|
+
if (strapi.EE) {
|
|
7005
|
+
admin = ___namespace.default.mergeWith({}, admin, getAdminEE(), mergeRoutes);
|
|
7006
|
+
}
|
|
7007
|
+
const admin$1 = admin;
|
|
7008
|
+
module.exports = admin$1;
|
|
5614
7009
|
//# sourceMappingURL=index.js.map
|