@strapi/admin 5.0.0-rc.9 → 5.0.1
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-j58AKYvZ.js → AdminSeatInfo-8vtNB3ck.js} +3 -3
- package/dist/admin/{AdminSeatInfo-j58AKYvZ.js.map → AdminSeatInfo-8vtNB3ck.js.map} +1 -1
- package/dist/admin/{AdminSeatInfo-qGNvhfii.mjs → AdminSeatInfo-qIgh5-QA.mjs} +4 -4
- package/dist/admin/{AdminSeatInfo-qGNvhfii.mjs.map → AdminSeatInfo-qIgh5-QA.mjs.map} +1 -1
- package/dist/admin/{ApplicationInfoPage-ahnTcFV1.mjs → ApplicationInfoPage-FPcBalFr.mjs} +5 -5
- package/dist/admin/{ApplicationInfoPage-ahnTcFV1.mjs.map → ApplicationInfoPage-FPcBalFr.mjs.map} +1 -1
- package/dist/admin/{ApplicationInfoPage-JfdJ0U4H.js → ApplicationInfoPage-hY4yez-z.js} +5 -5
- package/dist/admin/{ApplicationInfoPage-JfdJ0U4H.js.map → ApplicationInfoPage-hY4yez-z.js.map} +1 -1
- 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-06fn7qrH.mjs → AuthenticatedLayout-WfWtk2vt.mjs} +32 -40
- package/dist/admin/AuthenticatedLayout-WfWtk2vt.mjs.map +1 -0
- package/dist/admin/{AuthenticatedLayout-eKDwvUFO.js → AuthenticatedLayout-_fHeS86w.js} +31 -39
- package/dist/admin/AuthenticatedLayout-_fHeS86w.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-68skzZjY.js → CreatePage-2iQ7FkkX.js} +3 -3
- package/dist/admin/{CreatePage-68skzZjY.js.map → CreatePage-2iQ7FkkX.js.map} +1 -1
- package/dist/admin/{CreatePage-t5HQUOqJ.js → CreatePage-60fNdNfa.js} +6 -6
- package/dist/admin/CreatePage-60fNdNfa.js.map +1 -0
- package/dist/admin/{CreatePage-bdWb1wg4.mjs → CreatePage-pPnHpatu.mjs} +7 -7
- package/dist/admin/CreatePage-pPnHpatu.mjs.map +1 -0
- package/dist/admin/{CreatePage-Yd5JyWS5.mjs → CreatePage-z6N1v5X5.mjs} +3 -3
- package/dist/admin/{CreatePage-Yd5JyWS5.mjs.map → CreatePage-z6N1v5X5.mjs.map} +1 -1
- package/dist/admin/{CreateView-yv51Pyvw.js → CreateView-18WQPz4-.js} +3 -3
- package/dist/admin/{CreateView-yv51Pyvw.js.map → CreateView-18WQPz4-.js.map} +1 -1
- package/dist/admin/{CreateView-ZZaA8hbe.mjs → CreateView-4UcrE6vq.mjs} +3 -3
- package/dist/admin/{CreateView-ZZaA8hbe.mjs.map → CreateView-4UcrE6vq.mjs.map} +1 -1
- package/dist/admin/{CreateView-V0v5CK8t.mjs → CreateView-8k0KvpoK.mjs} +3 -3
- package/dist/admin/{CreateView-V0v5CK8t.mjs.map → CreateView-8k0KvpoK.mjs.map} +1 -1
- package/dist/admin/{CreateView-nzILLv0g.js → CreateView-YbqcAK_f.js} +3 -3
- package/dist/admin/{CreateView-nzILLv0g.js.map → CreateView-YbqcAK_f.js.map} +1 -1
- package/dist/admin/{EditPage-A7-BewPd.mjs → EditPage-Fu5aqX9h.mjs} +7 -7
- package/dist/admin/EditPage-Fu5aqX9h.mjs.map +1 -0
- package/dist/admin/{EditPage-Lw36XG9G.js → EditPage-H3D08t-N.js} +6 -6
- package/dist/admin/EditPage-H3D08t-N.js.map +1 -0
- package/dist/admin/{EditPage-cWJ8V1BK.mjs → EditPage-K8aawKOf.mjs} +27 -23
- package/dist/admin/EditPage-K8aawKOf.mjs.map +1 -0
- package/dist/admin/{EditPage-LoESB5pq.js → EditPage-U4UN4MeE.js} +7 -7
- package/dist/admin/{EditPage-LoESB5pq.js.map → EditPage-U4UN4MeE.js.map} +1 -1
- package/dist/admin/{EditPage-2cMhX4F_.mjs → EditPage-dZLyVDGx.mjs} +8 -8
- package/dist/admin/{EditPage-2cMhX4F_.mjs.map → EditPage-dZLyVDGx.mjs.map} +1 -1
- package/dist/admin/{EditPage-pTQCDncU.js → EditPage-ewduoYpT.js} +25 -21
- package/dist/admin/EditPage-ewduoYpT.js.map +1 -0
- package/dist/admin/{EditView-KzdDTSO-.js → EditView-1TEk6oaL.js} +5 -6
- package/dist/admin/EditView-1TEk6oaL.js.map +1 -0
- package/dist/admin/{EditView-HygMdUSf.mjs → EditView-xgk-lEu1.mjs} +7 -8
- package/dist/admin/EditView-xgk-lEu1.mjs.map +1 -0
- package/dist/admin/{EditViewPage-47F2xHBt.mjs → EditViewPage-2CHLYZlY.mjs} +6 -6
- package/dist/admin/{EditViewPage-47F2xHBt.mjs.map → EditViewPage-2CHLYZlY.mjs.map} +1 -1
- package/dist/admin/{EditViewPage-FgsrW_wV.js → EditViewPage-R2kud83M.js} +5 -5
- package/dist/admin/{EditViewPage-FgsrW_wV.js.map → EditViewPage-R2kud83M.js.map} +1 -1
- package/dist/admin/{EventsTable-mgIyB8DL.mjs → EventsTable-JJ16vr2h.mjs} +2 -2
- package/dist/admin/{EventsTable-mgIyB8DL.mjs.map → EventsTable-JJ16vr2h.mjs.map} +1 -1
- package/dist/admin/{EventsTable--XlOTHxM.js → EventsTable-fzeOe9NB.js} +2 -2
- package/dist/admin/{EventsTable--XlOTHxM.js.map → EventsTable-fzeOe9NB.js.map} +1 -1
- package/dist/admin/{HomePage-ywYHZHMa.js → HomePage-DB00H9y5.js} +15 -18
- package/dist/admin/HomePage-DB00H9y5.js.map +1 -0
- package/dist/admin/{HomePage-H77dsrr1.mjs → HomePage-EDHzBAy8.mjs} +3 -3
- package/dist/admin/{HomePage-H77dsrr1.mjs.map → HomePage-EDHzBAy8.mjs.map} +1 -1
- package/dist/admin/{HomePage-uVwht52t.js → HomePage-GsLJ4j4f.js} +3 -3
- package/dist/admin/{HomePage-uVwht52t.js.map → HomePage-GsLJ4j4f.js.map} +1 -1
- package/dist/admin/{HomePage-dyDldozB.mjs → HomePage-oz8OSt1B.mjs} +7 -10
- package/dist/admin/HomePage-oz8OSt1B.mjs.map +1 -0
- package/dist/admin/{InstalledPluginsPage-JkruwT2d.js → InstalledPlugins-T0ds5aOe.js} +9 -11
- package/dist/admin/InstalledPlugins-T0ds5aOe.js.map +1 -0
- package/dist/admin/{InstalledPluginsPage-3OSkplVn.mjs → InstalledPlugins-ngsQKZBi.mjs} +9 -11
- package/dist/admin/InstalledPlugins-ngsQKZBi.mjs.map +1 -0
- package/dist/admin/{Layout-pVTNV6PU.js → Layout-LTVvoQIP.js} +5 -5
- package/dist/admin/{Layout-pVTNV6PU.js.map → Layout-LTVvoQIP.js.map} +1 -1
- package/dist/admin/{Layout-8Ds_z3XN.mjs → Layout-dlsF2jYh.mjs} +5 -5
- package/dist/admin/{Layout-8Ds_z3XN.mjs.map → Layout-dlsF2jYh.mjs.map} +1 -1
- package/dist/admin/{ListPage-semY3kTl.mjs → ListPage-4VAaMuov.mjs} +4 -4
- package/dist/admin/{ListPage-semY3kTl.mjs.map → ListPage-4VAaMuov.mjs.map} +1 -1
- package/dist/admin/{ListPage-8M-bmv0a.mjs → ListPage-CAAa_iYD.mjs} +6 -6
- package/dist/admin/{ListPage-8M-bmv0a.mjs.map → ListPage-CAAa_iYD.mjs.map} +1 -1
- package/dist/admin/{ListPage-LokTy34i.mjs → ListPage-HjeCNXIL.mjs} +3 -3
- package/dist/admin/{ListPage-LokTy34i.mjs.map → ListPage-HjeCNXIL.mjs.map} +1 -1
- package/dist/admin/{ListPage-jTpJnTuQ.js → ListPage-J_zameoY.js} +3 -3
- package/dist/admin/{ListPage-jTpJnTuQ.js.map → ListPage-J_zameoY.js.map} +1 -1
- package/dist/admin/{ListPage-15KiUCLt.js → ListPage-W_j2UV6e.js} +3 -3
- package/dist/admin/{ListPage-15KiUCLt.js.map → ListPage-W_j2UV6e.js.map} +1 -1
- package/dist/admin/{ListPage-hNIbvh17.mjs → ListPage-cMqf3hxn.mjs} +10 -10
- package/dist/admin/ListPage-cMqf3hxn.mjs.map +1 -0
- package/dist/admin/{ListPage-OIdhjljI.js → ListPage-e_XhqWy-.js} +6 -6
- package/dist/admin/{ListPage-OIdhjljI.js.map → ListPage-e_XhqWy-.js.map} +1 -1
- package/dist/admin/{ListPage-NtjeF8R2.mjs → ListPage-fE9R8ZE1.mjs} +4 -4
- package/dist/admin/{ListPage-NtjeF8R2.mjs.map → ListPage-fE9R8ZE1.mjs.map} +1 -1
- package/dist/admin/{ListPage-dApwERT6.js → ListPage-kv14w7sy.js} +5 -5
- package/dist/admin/{ListPage-dApwERT6.js.map → ListPage-kv14w7sy.js.map} +1 -1
- package/dist/admin/{ListPage-DHUp0PDw.js → ListPage-qj3M7V0W.js} +8 -8
- package/dist/admin/ListPage-qj3M7V0W.js.map +1 -0
- package/dist/admin/{ListView-ZSEn2tK5.js → ListView-J3Bd1ZAj.js} +5 -5
- package/dist/admin/{ListView-ZSEn2tK5.js.map → ListView-J3Bd1ZAj.js.map} +1 -1
- package/dist/admin/{ListView-kEuSmXPm.mjs → ListView-JTtPuayE.mjs} +5 -5
- package/dist/admin/{ListView-kEuSmXPm.mjs.map → ListView-JTtPuayE.mjs.map} +1 -1
- package/dist/admin/{ListView-MA83TDJF.js → ListView-e_rZH3km.js} +4 -4
- package/dist/admin/{ListView-MA83TDJF.js.map → ListView-e_rZH3km.js.map} +1 -1
- package/dist/admin/{ListView-tCCo7pVS.mjs → ListView-ziItL2Hn.mjs} +5 -5
- package/dist/admin/{ListView-tCCo7pVS.mjs.map → ListView-ziItL2Hn.mjs.map} +1 -1
- package/dist/admin/{Login-RrWZQA_X.js → Login-B5mc1U2m.js} +3 -3
- package/dist/admin/{Login-RrWZQA_X.js.map → Login-B5mc1U2m.js.map} +1 -1
- package/dist/admin/{Login-GLcLgHUd.mjs → Login-STwy4gIQ.mjs} +3 -3
- package/dist/admin/{Login-GLcLgHUd.mjs.map → Login-STwy4gIQ.mjs.map} +1 -1
- package/dist/admin/{MagicLinkEE-u0n-nwtv.js → MagicLinkEE-3PSvKNEX.js} +3 -3
- package/dist/admin/{MagicLinkEE-u0n-nwtv.js.map → MagicLinkEE-3PSvKNEX.js.map} +1 -1
- package/dist/admin/{MagicLinkEE-_qltdLkk.mjs → MagicLinkEE-oXcvyO9m.mjs} +3 -3
- package/dist/admin/{MagicLinkEE-_qltdLkk.mjs.map → MagicLinkEE-oXcvyO9m.mjs.map} +1 -1
- package/dist/admin/{MarketplacePage-uyOTT12t.js → MarketplacePage-XkcAwVQL.js} +65 -64
- package/dist/admin/MarketplacePage-XkcAwVQL.js.map +1 -0
- package/dist/admin/{MarketplacePage-41CstG0b.mjs → MarketplacePage-s3TgP0pj.mjs} +64 -63
- package/dist/admin/MarketplacePage-s3TgP0pj.mjs.map +1 -0
- package/dist/admin/{Permissions-J2jRpCh_.mjs → Permissions-aSGK8VGG.mjs} +2 -2
- package/dist/admin/{Permissions-J2jRpCh_.mjs.map → Permissions-aSGK8VGG.mjs.map} +1 -1
- package/dist/admin/{Permissions-LMVH6wf4.js → Permissions-bmMBmcv7.js} +2 -2
- package/dist/admin/{Permissions-LMVH6wf4.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-zwG0fq_e.mjs → ProfilePage-EPvpBxko.mjs} +6 -6
- package/dist/admin/ProfilePage-EPvpBxko.mjs.map +1 -0
- package/dist/admin/{ProfilePage-wxZFen3W.js → ProfilePage-TMGpOFkt.js} +5 -5
- package/dist/admin/ProfilePage-TMGpOFkt.js.map +1 -0
- package/dist/admin/{PurchaseAuditLogs-f6iczpRi.js → PurchaseAuditLogs-HcdrHEM2.js} +2 -2
- package/dist/admin/{PurchaseAuditLogs-f6iczpRi.js.map → PurchaseAuditLogs-HcdrHEM2.js.map} +1 -1
- package/dist/admin/{PurchaseAuditLogs-FDPV-ZqU.mjs → PurchaseAuditLogs-K2YmR4Il.mjs} +2 -2
- package/dist/admin/{PurchaseAuditLogs-FDPV-ZqU.mjs.map → PurchaseAuditLogs-K2YmR4Il.mjs.map} +1 -1
- package/dist/admin/{PurchaseSingleSignOn-S0B2HM4d.mjs → PurchaseSingleSignOn-sxd54apY.mjs} +2 -2
- package/dist/admin/{PurchaseSingleSignOn-S0B2HM4d.mjs.map → PurchaseSingleSignOn-sxd54apY.mjs.map} +1 -1
- package/dist/admin/{PurchaseSingleSignOn-0wXAjOLm.js → PurchaseSingleSignOn-y7p3yZ-b.js} +2 -2
- package/dist/admin/{PurchaseSingleSignOn-0wXAjOLm.js.map → PurchaseSingleSignOn-y7p3yZ-b.js.map} +1 -1
- package/dist/admin/{SelectRoles-MoDtdDcM.js → SelectRoles-L8dRONb-.js} +7 -7
- package/dist/admin/SelectRoles-L8dRONb-.js.map +1 -0
- package/dist/admin/{SelectRoles-h_1srnVz.mjs → SelectRoles-esk6LySb.mjs} +6 -6
- package/dist/admin/SelectRoles-esk6LySb.mjs.map +1 -0
- package/dist/admin/{SingleSignOnPage-5CdOsumW.js → SingleSignOnPage-cih5-oBZ.js} +4 -4
- package/dist/admin/{SingleSignOnPage-5CdOsumW.js.map → SingleSignOnPage-cih5-oBZ.js.map} +1 -1
- package/dist/admin/{SingleSignOnPage-AZVczKwR.mjs → SingleSignOnPage-idMTZOuN.mjs} +5 -5
- package/dist/admin/{SingleSignOnPage-AZVczKwR.mjs.map → SingleSignOnPage-idMTZOuN.mjs.map} +1 -1
- package/dist/admin/{Table-CpbvaRQh.js → Table-1mVE67Cd.js} +12 -19
- package/dist/admin/Table-1mVE67Cd.js.map +1 -0
- package/dist/admin/{Table-EPKfcF5-.mjs → Table-wZgpqMG3.mjs} +12 -19
- package/dist/admin/Table-wZgpqMG3.mjs.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-7Ki5z_3z.mjs → TokenTypeSelect-GplqVrbt.mjs} +4 -5
- package/dist/admin/{TokenTypeSelect-7Ki5z_3z.mjs.map → TokenTypeSelect-GplqVrbt.mjs.map} +1 -1
- package/dist/admin/{TokenTypeSelect-yRV19q7R.js → TokenTypeSelect-Itk7isiz.js} +4 -5
- package/dist/admin/{TokenTypeSelect-yRV19q7R.js.map → TokenTypeSelect-Itk7isiz.js.map} +1 -1
- package/dist/admin/{UseCasePage-l9OmQYhK.js → UseCasePage-1SuyjC6w.js} +4 -4
- package/dist/admin/{UseCasePage-l9OmQYhK.js.map → UseCasePage-1SuyjC6w.js.map} +1 -1
- package/dist/admin/{UseCasePage-as6-3qKD.mjs → UseCasePage-QPnZOFrC.mjs} +4 -4
- package/dist/admin/{UseCasePage-as6-3qKD.mjs.map → UseCasePage-QPnZOFrC.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-X2uDAtEA.js → constants-K5ARNpfV.js} +3 -3
- package/dist/admin/{constants-X2uDAtEA.js.map → constants-K5ARNpfV.js.map} +1 -1
- package/dist/admin/{constants-AYR471DB.mjs → constants-T5y8alpG.mjs} +3 -3
- package/dist/admin/{constants-AYR471DB.mjs.map → constants-T5y8alpG.mjs.map} +1 -1
- package/dist/admin/ee.mjs +1 -1
- package/dist/admin/en-GB-8ipWI3xp.mjs +6 -0
- package/dist/admin/en-GB-8ipWI3xp.mjs.map +1 -0
- package/dist/admin/en-GB-vRfq_FQ3.js +10 -0
- package/dist/admin/en-GB-vRfq_FQ3.js.map +1 -0
- 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-Fu3hPmaj.mjs → index-QPUYgtlo.mjs} +143 -280
- package/dist/admin/index-QPUYgtlo.mjs.map +1 -0
- package/dist/admin/{index-w33_0vI-.js → index-YMz7KziV.js} +147 -287
- package/dist/admin/index-YMz7KziV.js.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/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/translations/languageNativeNames.d.ts +1 -0
- 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-lDesL4gN.mjs → useAdminRoles-DX1MOKC9.mjs} +2 -2
- package/dist/admin/{useAdminRoles-lDesL4gN.mjs.map → useAdminRoles-DX1MOKC9.mjs.map} +1 -1
- package/dist/admin/{useAdminRoles-w6h8NFK5.js → useAdminRoles-nNC9r0dz.js} +2 -2
- package/dist/admin/{useAdminRoles-w6h8NFK5.js.map → useAdminRoles-nNC9r0dz.js.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-4SWh9S5z.js → validation-AQCTfU6y.js} +4 -4
- package/dist/admin/validation-AQCTfU6y.js.map +1 -0
- package/dist/admin/{validation-IcNGA_ef.mjs → validation-tnv2QISi.mjs} +4 -4
- package/dist/admin/validation-tnv2QISi.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 +11 -10
- package/dist/server/index.js +1897 -538
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +1693 -333
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/domain/action/provider.d.ts +1 -1
- package/dist/server/src/domain/condition/provider.d.ts +3 -1
- package/dist/server/src/domain/condition/provider.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/metrics.d.ts.map +1 -1
- package/dist/server/src/services/permission.d.ts +4 -2
- package/dist/server/src/services/permission.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 +18 -17
- package/dist/admin/AuthenticatedLayout-06fn7qrH.mjs.map +0 -1
- package/dist/admin/AuthenticatedLayout-eKDwvUFO.js.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-bdWb1wg4.mjs.map +0 -1
- package/dist/admin/CreatePage-t5HQUOqJ.js.map +0 -1
- package/dist/admin/EditPage-A7-BewPd.mjs.map +0 -1
- package/dist/admin/EditPage-Lw36XG9G.js.map +0 -1
- package/dist/admin/EditPage-cWJ8V1BK.mjs.map +0 -1
- package/dist/admin/EditPage-pTQCDncU.js.map +0 -1
- package/dist/admin/EditView-HygMdUSf.mjs.map +0 -1
- package/dist/admin/EditView-KzdDTSO-.js.map +0 -1
- package/dist/admin/HomePage-dyDldozB.mjs.map +0 -1
- package/dist/admin/HomePage-ywYHZHMa.js.map +0 -1
- package/dist/admin/InstalledPluginsPage-3OSkplVn.mjs.map +0 -1
- package/dist/admin/InstalledPluginsPage-JkruwT2d.js.map +0 -1
- package/dist/admin/ListPage-DHUp0PDw.js.map +0 -1
- package/dist/admin/ListPage-hNIbvh17.mjs.map +0 -1
- package/dist/admin/MarketplacePage-41CstG0b.mjs.map +0 -1
- package/dist/admin/MarketplacePage-uyOTT12t.js.map +0 -1
- package/dist/admin/ProfilePage-wxZFen3W.js.map +0 -1
- package/dist/admin/ProfilePage-zwG0fq_e.mjs.map +0 -1
- package/dist/admin/SelectRoles-MoDtdDcM.js.map +0 -1
- package/dist/admin/SelectRoles-h_1srnVz.mjs.map +0 -1
- package/dist/admin/Table-CpbvaRQh.js.map +0 -1
- package/dist/admin/Table-EPKfcF5-.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/index-Fu3hPmaj.mjs.map +0 -1
- package/dist/admin/index-w33_0vI-.js.map +0 -1
- package/dist/admin/src/pages/InstalledPluginsPage.d.ts +0 -3
- package/dist/admin/validation-4SWh9S5z.js.map +0 -1
- package/dist/admin/validation-IcNGA_ef.mjs.map +0 -1
- package/dist/ee/server/index.js +0 -2193
- package/dist/ee/server/index.js.map +0 -1
- package/dist/ee/server/index.mjs +0 -2188
- 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",
|
|
@@ -289,7 +289,7 @@ const actions = [
|
|
|
289
289
|
}
|
|
290
290
|
];
|
|
291
291
|
const adminActions = {
|
|
292
|
-
actions
|
|
292
|
+
actions: actions$1
|
|
293
293
|
};
|
|
294
294
|
const conditions = [
|
|
295
295
|
{
|
|
@@ -324,13 +324,13 @@ const defaultAdminAuthSettings = {
|
|
|
324
324
|
}
|
|
325
325
|
};
|
|
326
326
|
const registerPermissionActions = async () => {
|
|
327
|
-
await getService("permission").actionProvider.registerMany(adminActions.actions);
|
|
327
|
+
await getService$1("permission").actionProvider.registerMany(adminActions.actions);
|
|
328
328
|
};
|
|
329
329
|
const registerAdminConditions = async () => {
|
|
330
|
-
await getService("permission").conditionProvider.registerMany(adminConditions.conditions);
|
|
330
|
+
await getService$1("permission").conditionProvider.registerMany(adminConditions.conditions);
|
|
331
331
|
};
|
|
332
332
|
const registerModelHooks = () => {
|
|
333
|
-
const { sendDidChangeInterfaceLanguage: sendDidChangeInterfaceLanguage2 } = getService("metrics");
|
|
333
|
+
const { sendDidChangeInterfaceLanguage: sendDidChangeInterfaceLanguage2 } = getService$1("metrics");
|
|
334
334
|
strapi.db.lifecycles.subscribe({
|
|
335
335
|
models: ["admin::user"],
|
|
336
336
|
afterCreate: sendDidChangeInterfaceLanguage2,
|
|
@@ -346,7 +346,7 @@ const syncAuthSettings = async () => {
|
|
|
346
346
|
const adminStore = await strapi.store({ type: "core", name: "admin" });
|
|
347
347
|
const adminAuthSettings = await adminStore.get({ key: "auth" });
|
|
348
348
|
const newAuthSettings = fp.merge(defaultAdminAuthSettings, adminAuthSettings);
|
|
349
|
-
const roleExists = await getService("role").exists({
|
|
349
|
+
const roleExists = await getService$1("role").exists({
|
|
350
350
|
id: newAuthSettings.providers.defaultRole
|
|
351
351
|
});
|
|
352
352
|
if (!roleExists) {
|
|
@@ -356,7 +356,7 @@ const syncAuthSettings = async () => {
|
|
|
356
356
|
};
|
|
357
357
|
const syncAPITokensPermissions = async () => {
|
|
358
358
|
const validPermissions = strapi.contentAPI.permissions.providers.action.keys();
|
|
359
|
-
const permissionsInDB = await utils$
|
|
359
|
+
const permissionsInDB = await utils$2.async.pipe(
|
|
360
360
|
strapi.db.query("admin::api-token-permission").findMany,
|
|
361
361
|
fp.map("action")
|
|
362
362
|
)();
|
|
@@ -365,16 +365,16 @@ const syncAPITokensPermissions = async () => {
|
|
|
365
365
|
await strapi.db.query("admin::api-token-permission").deleteMany({ where: { action: { $in: unknownPermissions } } });
|
|
366
366
|
}
|
|
367
367
|
};
|
|
368
|
-
const bootstrap = async ({ strapi: strapi2 }) => {
|
|
368
|
+
const bootstrap$1 = async ({ strapi: strapi2 }) => {
|
|
369
369
|
await registerAdminConditions();
|
|
370
370
|
await registerPermissionActions();
|
|
371
371
|
registerModelHooks();
|
|
372
|
-
const permissionService = getService("permission");
|
|
373
|
-
const userService = getService("user");
|
|
374
|
-
const roleService = getService("role");
|
|
375
|
-
const apiTokenService = getService("api-token");
|
|
376
|
-
const transferService = getService("transfer");
|
|
377
|
-
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");
|
|
378
378
|
await roleService.createRolesIfNoneExist();
|
|
379
379
|
await roleService.resetSuperAdminPermissions();
|
|
380
380
|
await roleService.displayWarningIfNoSuperAdmin();
|
|
@@ -382,8 +382,8 @@ const bootstrap = async ({ strapi: strapi2 }) => {
|
|
|
382
382
|
await userService.displayWarningIfUsersDontHaveRole();
|
|
383
383
|
await syncAuthSettings();
|
|
384
384
|
await syncAPITokensPermissions();
|
|
385
|
-
await getService("metrics").sendUpdateProjectInformation(strapi2);
|
|
386
|
-
getService("metrics").startCron(strapi2);
|
|
385
|
+
await getService$1("metrics").sendUpdateProjectInformation(strapi2);
|
|
386
|
+
getService$1("metrics").startCron(strapi2);
|
|
387
387
|
apiTokenService.checkSaltIsDefined();
|
|
388
388
|
transferService.token.checkSaltIsDefined();
|
|
389
389
|
tokenService.checkSecretIsDefined();
|
|
@@ -440,7 +440,7 @@ const serveStatic = (filesDir, koaStaticOptions = {}) => {
|
|
|
440
440
|
ctx.path = prev;
|
|
441
441
|
};
|
|
442
442
|
};
|
|
443
|
-
const authenticate$
|
|
443
|
+
const authenticate$3 = async (ctx) => {
|
|
444
444
|
const { authorization } = ctx.request.header;
|
|
445
445
|
if (!authorization) {
|
|
446
446
|
return { authenticated: false };
|
|
@@ -450,7 +450,7 @@ const authenticate$2 = async (ctx) => {
|
|
|
450
450
|
return { authenticated: false };
|
|
451
451
|
}
|
|
452
452
|
const token2 = parts[1];
|
|
453
|
-
const { payload, isValid } = getService("token").decodeJwtToken(token2);
|
|
453
|
+
const { payload, isValid } = getService$1("token").decodeJwtToken(token2);
|
|
454
454
|
if (!isValid) {
|
|
455
455
|
return { authenticated: false };
|
|
456
456
|
}
|
|
@@ -458,7 +458,7 @@ const authenticate$2 = async (ctx) => {
|
|
|
458
458
|
if (!user2 || !(user2.isActive === true)) {
|
|
459
459
|
return { authenticated: false };
|
|
460
460
|
}
|
|
461
|
-
const userAbility = await getService("permission").engine.generateUserAbility(user2);
|
|
461
|
+
const userAbility = await getService$1("permission").engine.generateUserAbility(user2);
|
|
462
462
|
ctx.state.userAbility = userAbility;
|
|
463
463
|
ctx.state.user = user2;
|
|
464
464
|
return {
|
|
@@ -470,7 +470,7 @@ const authenticate$2 = async (ctx) => {
|
|
|
470
470
|
const name$1 = "admin";
|
|
471
471
|
const adminAuthStrategy = {
|
|
472
472
|
name: name$1,
|
|
473
|
-
authenticate: authenticate$
|
|
473
|
+
authenticate: authenticate$3
|
|
474
474
|
};
|
|
475
475
|
const DAY_IN_MS = 24 * 60 * 60 * 1e3;
|
|
476
476
|
const constants$3 = {
|
|
@@ -510,7 +510,7 @@ const constants$4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineP
|
|
|
510
510
|
__proto__: null,
|
|
511
511
|
default: constants$3
|
|
512
512
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
513
|
-
const { UnauthorizedError: UnauthorizedError$
|
|
513
|
+
const { UnauthorizedError: UnauthorizedError$3, ForbiddenError: ForbiddenError$2 } = utils$2.errors;
|
|
514
514
|
const isReadScope = (scope) => scope.endsWith("find") || scope.endsWith("findOne");
|
|
515
515
|
const extractToken$1 = (ctx) => {
|
|
516
516
|
if (ctx.request && ctx.request.header && ctx.request.header.authorization) {
|
|
@@ -522,8 +522,8 @@ const extractToken$1 = (ctx) => {
|
|
|
522
522
|
}
|
|
523
523
|
return null;
|
|
524
524
|
};
|
|
525
|
-
const authenticate$
|
|
526
|
-
const apiTokenService = getService("api-token");
|
|
525
|
+
const authenticate$2 = async (ctx) => {
|
|
526
|
+
const apiTokenService = getService$1("api-token");
|
|
527
527
|
const token2 = extractToken$1(ctx);
|
|
528
528
|
if (!token2) {
|
|
529
529
|
return { authenticated: false };
|
|
@@ -538,7 +538,7 @@ const authenticate$1 = async (ctx) => {
|
|
|
538
538
|
if (!fp.isNil(apiToken2.expiresAt)) {
|
|
539
539
|
const expirationDate = new Date(apiToken2.expiresAt);
|
|
540
540
|
if (expirationDate < currentDate) {
|
|
541
|
-
return { authenticated: false, error: new UnauthorizedError$
|
|
541
|
+
return { authenticated: false, error: new UnauthorizedError$3("Token expired") };
|
|
542
542
|
}
|
|
543
543
|
}
|
|
544
544
|
const hoursSinceLastUsed = dateFns.differenceInHours(currentDate, dateFns.parseISO(apiToken2.lastUsedAt));
|
|
@@ -556,44 +556,44 @@ const authenticate$1 = async (ctx) => {
|
|
|
556
556
|
}
|
|
557
557
|
return { authenticated: true, credentials: apiToken2 };
|
|
558
558
|
};
|
|
559
|
-
const verify$2 = (auth2,
|
|
559
|
+
const verify$2 = (auth2, config2) => {
|
|
560
560
|
const { credentials: apiToken2, ability: ability2 } = auth2;
|
|
561
561
|
if (!apiToken2) {
|
|
562
|
-
throw new UnauthorizedError$
|
|
562
|
+
throw new UnauthorizedError$3("Token not found");
|
|
563
563
|
}
|
|
564
564
|
const currentDate = /* @__PURE__ */ new Date();
|
|
565
565
|
if (!fp.isNil(apiToken2.expiresAt)) {
|
|
566
566
|
const expirationDate = new Date(apiToken2.expiresAt);
|
|
567
567
|
if (expirationDate < currentDate) {
|
|
568
|
-
throw new UnauthorizedError$
|
|
568
|
+
throw new UnauthorizedError$3("Token expired");
|
|
569
569
|
}
|
|
570
570
|
}
|
|
571
571
|
if (apiToken2.type === constants$3.API_TOKEN_TYPE.FULL_ACCESS) {
|
|
572
572
|
return;
|
|
573
573
|
}
|
|
574
574
|
if (apiToken2.type === constants$3.API_TOKEN_TYPE.READ_ONLY) {
|
|
575
|
-
const scopes = fp.castArray(
|
|
576
|
-
if (
|
|
575
|
+
const scopes = fp.castArray(config2.scope);
|
|
576
|
+
if (config2.scope && scopes.every(isReadScope)) {
|
|
577
577
|
return;
|
|
578
578
|
}
|
|
579
579
|
} else if (apiToken2.type === constants$3.API_TOKEN_TYPE.CUSTOM) {
|
|
580
580
|
if (!ability2) {
|
|
581
|
-
throw new ForbiddenError$
|
|
581
|
+
throw new ForbiddenError$2();
|
|
582
582
|
}
|
|
583
|
-
const scopes = fp.castArray(
|
|
583
|
+
const scopes = fp.castArray(config2.scope);
|
|
584
584
|
const isAllowed = scopes.every((scope) => ability2.can(scope));
|
|
585
585
|
if (isAllowed) {
|
|
586
586
|
return;
|
|
587
587
|
}
|
|
588
588
|
}
|
|
589
|
-
throw new ForbiddenError$
|
|
589
|
+
throw new ForbiddenError$2();
|
|
590
590
|
};
|
|
591
591
|
const apiTokenAuthStrategy = {
|
|
592
592
|
name: "api-token",
|
|
593
|
-
authenticate: authenticate$
|
|
593
|
+
authenticate: authenticate$2,
|
|
594
594
|
verify: verify$2
|
|
595
595
|
};
|
|
596
|
-
const register$
|
|
596
|
+
const register$2 = ({ strapi: strapi2 }) => {
|
|
597
597
|
const passportMiddleware = strapi2.service("admin::passport").init();
|
|
598
598
|
strapi2.server.api("admin").use(passportMiddleware);
|
|
599
599
|
strapi2.get("auth").register("admin", adminAuthStrategy);
|
|
@@ -602,8 +602,8 @@ const register$1 = ({ strapi: strapi2 }) => {
|
|
|
602
602
|
registerAdminPanelRoute({ strapi: strapi2 });
|
|
603
603
|
}
|
|
604
604
|
};
|
|
605
|
-
const destroy = async () => {
|
|
606
|
-
const { conditionProvider: conditionProvider2, actionProvider: actionProvider2 } = getService("permission");
|
|
605
|
+
const destroy$1 = async () => {
|
|
606
|
+
const { conditionProvider: conditionProvider2, actionProvider: actionProvider2 } = getService$1("permission");
|
|
607
607
|
await conditionProvider2.clear();
|
|
608
608
|
await actionProvider2.clear();
|
|
609
609
|
};
|
|
@@ -623,34 +623,34 @@ But don’t worry! You can use the following link to reset your password:
|
|
|
623
623
|
|
|
624
624
|
Thanks.`;
|
|
625
625
|
const forgotPasswordTemplate = { subject, text, html };
|
|
626
|
-
const forgotPassword$
|
|
626
|
+
const forgotPassword$2 = {
|
|
627
627
|
emailTemplate: forgotPasswordTemplate
|
|
628
628
|
};
|
|
629
|
-
const
|
|
630
|
-
forgotPassword: forgotPassword$
|
|
629
|
+
const config = {
|
|
630
|
+
forgotPassword: forgotPassword$2
|
|
631
631
|
};
|
|
632
632
|
const isAuthenticatedAdmin = (policyCtx) => {
|
|
633
633
|
return Boolean(policyCtx.state.isAuthenticated);
|
|
634
634
|
};
|
|
635
|
-
const hasPermissionsSchema = utils$
|
|
636
|
-
actions: utils$
|
|
635
|
+
const hasPermissionsSchema = utils$2.yup.object({
|
|
636
|
+
actions: utils$2.yup.array().of(
|
|
637
637
|
// @ts-expect-error yup types
|
|
638
|
-
utils$
|
|
638
|
+
utils$2.yup.lazy((val) => {
|
|
639
639
|
if (___namespace.default.isArray(val)) {
|
|
640
|
-
return utils$
|
|
640
|
+
return utils$2.yup.array().of(utils$2.yup.string()).min(1).max(2);
|
|
641
641
|
}
|
|
642
642
|
if (___namespace.default.isString(val)) {
|
|
643
|
-
return utils$
|
|
643
|
+
return utils$2.yup.string().required();
|
|
644
644
|
}
|
|
645
|
-
return utils$
|
|
646
|
-
action: utils$
|
|
647
|
-
subject: utils$
|
|
645
|
+
return utils$2.yup.object().shape({
|
|
646
|
+
action: utils$2.yup.string().required(),
|
|
647
|
+
subject: utils$2.yup.string()
|
|
648
648
|
});
|
|
649
649
|
})
|
|
650
650
|
)
|
|
651
651
|
});
|
|
652
|
-
const validateHasPermissionsInput = utils$
|
|
653
|
-
const { createPolicy: createPolicy$1 } = utils$
|
|
652
|
+
const validateHasPermissionsInput = utils$2.validateYupSchema(hasPermissionsSchema);
|
|
653
|
+
const { createPolicy: createPolicy$1 } = utils$2.policy;
|
|
654
654
|
const inputModifiers = [
|
|
655
655
|
{
|
|
656
656
|
check: ___namespace.default.isString,
|
|
@@ -669,8 +669,8 @@ const inputModifiers = [
|
|
|
669
669
|
const hasPermissions = createPolicy$1({
|
|
670
670
|
name: "admin::hasPermissions",
|
|
671
671
|
validator: validateHasPermissionsInput,
|
|
672
|
-
handler(ctx,
|
|
673
|
-
const { actions: actions2 } =
|
|
672
|
+
handler(ctx, config2) {
|
|
673
|
+
const { actions: actions2 } = config2;
|
|
674
674
|
const { userAbility: ability2 } = ctx.state;
|
|
675
675
|
const permissions2 = actions2.map(
|
|
676
676
|
(action2) => inputModifiers.find((modifier) => modifier.check(action2))?.transform(action2)
|
|
@@ -681,7 +681,7 @@ const hasPermissions = createPolicy$1({
|
|
|
681
681
|
return isAuthorized;
|
|
682
682
|
}
|
|
683
683
|
});
|
|
684
|
-
const { createPolicy } = utils$
|
|
684
|
+
const { createPolicy } = utils$2.policy;
|
|
685
685
|
const isTelemetryEnabled = createPolicy({
|
|
686
686
|
name: "admin::isTelemetryEnabled",
|
|
687
687
|
handler(_ctx, _config, { strapi: strapi2 }) {
|
|
@@ -690,8 +690,8 @@ const isTelemetryEnabled = createPolicy({
|
|
|
690
690
|
}
|
|
691
691
|
}
|
|
692
692
|
});
|
|
693
|
-
const
|
|
694
|
-
const admin$
|
|
693
|
+
const policies = { isAuthenticatedAdmin, hasPermissions, isTelemetryEnabled };
|
|
694
|
+
const admin$4 = [
|
|
695
695
|
{
|
|
696
696
|
method: "GET",
|
|
697
697
|
path: "/init",
|
|
@@ -760,7 +760,7 @@ const admin$1 = [
|
|
|
760
760
|
}
|
|
761
761
|
}
|
|
762
762
|
];
|
|
763
|
-
const authentication$
|
|
763
|
+
const authentication$2 = [
|
|
764
764
|
{
|
|
765
765
|
method: "POST",
|
|
766
766
|
path: "/login",
|
|
@@ -1189,7 +1189,7 @@ const contentApi$1 = [
|
|
|
1189
1189
|
}
|
|
1190
1190
|
}
|
|
1191
1191
|
];
|
|
1192
|
-
const { UnauthorizedError: UnauthorizedError$
|
|
1192
|
+
const { UnauthorizedError: UnauthorizedError$2, ForbiddenError: ForbiddenError$1 } = utils$2.errors;
|
|
1193
1193
|
const extractToken = (ctx) => {
|
|
1194
1194
|
if (ctx.request && ctx.request.header && ctx.request.header.authorization) {
|
|
1195
1195
|
const parts = ctx.request.header.authorization.split(/\s+/);
|
|
@@ -1200,8 +1200,8 @@ const extractToken = (ctx) => {
|
|
|
1200
1200
|
}
|
|
1201
1201
|
return null;
|
|
1202
1202
|
};
|
|
1203
|
-
const authenticate = async (ctx) => {
|
|
1204
|
-
const { token: tokenService } = getService("transfer");
|
|
1203
|
+
const authenticate$1 = async (ctx) => {
|
|
1204
|
+
const { token: tokenService } = getService$1("transfer");
|
|
1205
1205
|
const token2 = extractToken(ctx);
|
|
1206
1206
|
if (!token2) {
|
|
1207
1207
|
return { authenticated: false };
|
|
@@ -1214,7 +1214,7 @@ const authenticate = async (ctx) => {
|
|
|
1214
1214
|
if (!fp.isNil(transferToken2.expiresAt)) {
|
|
1215
1215
|
const expirationDate = new Date(transferToken2.expiresAt);
|
|
1216
1216
|
if (expirationDate < currentDate) {
|
|
1217
|
-
return { authenticated: false, error: new UnauthorizedError$
|
|
1217
|
+
return { authenticated: false, error: new UnauthorizedError$2("Token expired") };
|
|
1218
1218
|
}
|
|
1219
1219
|
}
|
|
1220
1220
|
const hoursSinceLastUsed = dateFns.differenceInHours(currentDate, dateFns.parseISO(transferToken2.lastUsedAt));
|
|
@@ -1224,36 +1224,36 @@ const authenticate = async (ctx) => {
|
|
|
1224
1224
|
data: { lastUsedAt: currentDate }
|
|
1225
1225
|
});
|
|
1226
1226
|
}
|
|
1227
|
-
const ability2 = await getService("transfer").permission.engine.generateAbility(
|
|
1227
|
+
const ability2 = await getService$1("transfer").permission.engine.generateAbility(
|
|
1228
1228
|
transferToken2.permissions.map((action2) => ({ action: action2 }))
|
|
1229
1229
|
);
|
|
1230
1230
|
return { authenticated: true, ability: ability2, credentials: transferToken2 };
|
|
1231
1231
|
};
|
|
1232
|
-
const verify$1 = async (auth2,
|
|
1232
|
+
const verify$1 = async (auth2, config2 = {}) => {
|
|
1233
1233
|
const { credentials: transferToken2, ability: ability2 } = auth2;
|
|
1234
1234
|
if (!transferToken2) {
|
|
1235
|
-
throw new UnauthorizedError$
|
|
1235
|
+
throw new UnauthorizedError$2("Token not found");
|
|
1236
1236
|
}
|
|
1237
1237
|
const currentDate = /* @__PURE__ */ new Date();
|
|
1238
1238
|
if (!fp.isNil(transferToken2.expiresAt)) {
|
|
1239
1239
|
const expirationDate = new Date(transferToken2.expiresAt);
|
|
1240
1240
|
if (expirationDate < currentDate) {
|
|
1241
|
-
throw new UnauthorizedError$
|
|
1241
|
+
throw new UnauthorizedError$2("Token expired");
|
|
1242
1242
|
}
|
|
1243
1243
|
}
|
|
1244
1244
|
if (!ability2) {
|
|
1245
|
-
throw new ForbiddenError();
|
|
1245
|
+
throw new ForbiddenError$1();
|
|
1246
1246
|
}
|
|
1247
|
-
const scopes = fp.castArray(
|
|
1247
|
+
const scopes = fp.castArray(config2.scope ?? []);
|
|
1248
1248
|
const isAllowed = scopes.every((scope) => ability2.can(scope));
|
|
1249
1249
|
if (!isAllowed) {
|
|
1250
|
-
throw new ForbiddenError();
|
|
1250
|
+
throw new ForbiddenError$1();
|
|
1251
1251
|
}
|
|
1252
1252
|
};
|
|
1253
1253
|
const name = "data-transfer";
|
|
1254
1254
|
const dataTransferAuthStrategy = {
|
|
1255
1255
|
name,
|
|
1256
|
-
authenticate,
|
|
1256
|
+
authenticate: authenticate$1,
|
|
1257
1257
|
verify: verify$1
|
|
1258
1258
|
};
|
|
1259
1259
|
const transfer$2 = [
|
|
@@ -1354,12 +1354,12 @@ const transfer$2 = [
|
|
|
1354
1354
|
}
|
|
1355
1355
|
}
|
|
1356
1356
|
];
|
|
1357
|
-
const routes = {
|
|
1357
|
+
const routes$1 = {
|
|
1358
1358
|
admin: {
|
|
1359
1359
|
type: "admin",
|
|
1360
1360
|
routes: [
|
|
1361
|
-
...admin$
|
|
1362
|
-
...authentication$
|
|
1361
|
+
...admin$4,
|
|
1362
|
+
...authentication$2,
|
|
1363
1363
|
...permissions,
|
|
1364
1364
|
...users,
|
|
1365
1365
|
...roles$1,
|
|
@@ -1370,7 +1370,7 @@ const routes = {
|
|
|
1370
1370
|
]
|
|
1371
1371
|
}
|
|
1372
1372
|
};
|
|
1373
|
-
const { ApplicationError: ApplicationError$
|
|
1373
|
+
const { ApplicationError: ApplicationError$a } = utils$2.errors;
|
|
1374
1374
|
const hashPassword = (password2) => bcrypt__default.default.hash(password2, 10);
|
|
1375
1375
|
const validatePassword = (password2, hash2) => bcrypt__default.default.compare(password2, hash2);
|
|
1376
1376
|
const checkCredentials = async ({ email: email2, password: password2 }) => {
|
|
@@ -1387,13 +1387,13 @@ const checkCredentials = async ({ email: email2, password: password2 }) => {
|
|
|
1387
1387
|
}
|
|
1388
1388
|
return [null, user2];
|
|
1389
1389
|
};
|
|
1390
|
-
const forgotPassword = async ({ email: email2 } = {}) => {
|
|
1390
|
+
const forgotPassword$1 = async ({ email: email2 } = {}) => {
|
|
1391
1391
|
const user2 = await strapi.db.query("admin::user").findOne({ where: { email: email2, isActive: true } });
|
|
1392
1392
|
if (!user2) {
|
|
1393
1393
|
return;
|
|
1394
1394
|
}
|
|
1395
|
-
const resetPasswordToken = getService("token").createToken();
|
|
1396
|
-
await getService("user").updateById(user2.id, { resetPasswordToken });
|
|
1395
|
+
const resetPasswordToken = getService$1("token").createToken();
|
|
1396
|
+
await getService$1("user").updateById(user2.id, { resetPasswordToken });
|
|
1397
1397
|
const url = `${strapi.config.get(
|
|
1398
1398
|
"admin.absoluteUrl"
|
|
1399
1399
|
)}/auth/reset-password?code=${resetPasswordToken}`;
|
|
@@ -1412,18 +1412,18 @@ const forgotPassword = async ({ email: email2 } = {}) => {
|
|
|
1412
1412
|
strapi.log.error(err);
|
|
1413
1413
|
});
|
|
1414
1414
|
};
|
|
1415
|
-
const resetPassword = async ({ resetPasswordToken, password: password2 } = {}) => {
|
|
1415
|
+
const resetPassword$1 = async ({ resetPasswordToken, password: password2 } = {}) => {
|
|
1416
1416
|
const matchingUser = await strapi.db.query("admin::user").findOne({ where: { resetPasswordToken, isActive: true } });
|
|
1417
1417
|
if (!matchingUser) {
|
|
1418
|
-
throw new ApplicationError$
|
|
1418
|
+
throw new ApplicationError$a();
|
|
1419
1419
|
}
|
|
1420
|
-
return getService("user").updateById(matchingUser.id, {
|
|
1420
|
+
return getService$1("user").updateById(matchingUser.id, {
|
|
1421
1421
|
password: password2,
|
|
1422
1422
|
resetPasswordToken: null
|
|
1423
1423
|
});
|
|
1424
1424
|
};
|
|
1425
|
-
const auth = { checkCredentials, validatePassword, hashPassword, forgotPassword, resetPassword };
|
|
1426
|
-
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;
|
|
1427
1427
|
function createUser(attributes) {
|
|
1428
1428
|
return {
|
|
1429
1429
|
roles: [],
|
|
@@ -1433,7 +1433,7 @@ function createUser(attributes) {
|
|
|
1433
1433
|
};
|
|
1434
1434
|
}
|
|
1435
1435
|
const hasSuperAdminRole$1 = (user2) => {
|
|
1436
|
-
return user2.roles.filter((role2) => role2.code === SUPER_ADMIN_CODE$
|
|
1436
|
+
return user2.roles.filter((role2) => role2.code === SUPER_ADMIN_CODE$5).length > 0;
|
|
1437
1437
|
};
|
|
1438
1438
|
const ADMIN_USER_ALLOWED_FIELDS = ["id", "firstname", "lastname", "username"];
|
|
1439
1439
|
const getDefaultActionAttributes = () => ({
|
|
@@ -1523,18 +1523,18 @@ const checkFieldsDontHaveDuplicates = (fields) => {
|
|
|
1523
1523
|
return ___namespace.default.uniq(fields).length === fields.length;
|
|
1524
1524
|
};
|
|
1525
1525
|
const getActionFromProvider = (actionId) => {
|
|
1526
|
-
return getService("permission").actionProvider.get(actionId);
|
|
1527
|
-
};
|
|
1528
|
-
const email = utils$
|
|
1529
|
-
const firstname = utils$
|
|
1530
|
-
const lastname = utils$
|
|
1531
|
-
const username = utils$
|
|
1532
|
-
const password = utils$
|
|
1533
|
-
const roles = utils$
|
|
1534
|
-
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) {
|
|
1535
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` });
|
|
1536
1536
|
});
|
|
1537
|
-
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) {
|
|
1538
1538
|
const ids = strapi.service("admin::permission").conditionProvider.keys();
|
|
1539
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` });
|
|
1540
1540
|
});
|
|
@@ -1548,7 +1548,7 @@ const checkNilFields = (action2) => function(fields) {
|
|
|
1548
1548
|
}
|
|
1549
1549
|
return actionDomain.appliesToProperty("fields", action2) || fp.isNil(fields);
|
|
1550
1550
|
};
|
|
1551
|
-
const fieldsPropertyValidation = (action2) => utils$
|
|
1551
|
+
const fieldsPropertyValidation = (action2) => utils$2.yup.array().of(utils$2.yup.string()).nullable().test(
|
|
1552
1552
|
"field-nested",
|
|
1553
1553
|
"Fields format are incorrect (bad nesting).",
|
|
1554
1554
|
checkFieldsAreCorrectlyNested
|
|
@@ -1562,15 +1562,15 @@ const fieldsPropertyValidation = (action2) => utils$1.yup.array().of(utils$1.yup
|
|
|
1562
1562
|
// @ts-expect-error yup types
|
|
1563
1563
|
checkNilFields(action2)
|
|
1564
1564
|
);
|
|
1565
|
-
const permission$3 = utils$
|
|
1566
|
-
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) {
|
|
1567
1567
|
if (fp.isNil(actionId)) {
|
|
1568
1568
|
return true;
|
|
1569
1569
|
}
|
|
1570
1570
|
return !!getActionFromProvider(actionId);
|
|
1571
1571
|
}),
|
|
1572
|
-
actionParameters: utils$
|
|
1573
|
-
subject: utils$
|
|
1572
|
+
actionParameters: utils$2.yup.object().nullable(),
|
|
1573
|
+
subject: utils$2.yup.string().nullable().test("subject-validity", "Invalid subject submitted", function(subject2) {
|
|
1574
1574
|
const action2 = getActionFromProvider(this.options.parent.action);
|
|
1575
1575
|
if (!action2) {
|
|
1576
1576
|
return true;
|
|
@@ -1583,7 +1583,7 @@ const permission$3 = utils$1.yup.object().shape({
|
|
|
1583
1583
|
}
|
|
1584
1584
|
return false;
|
|
1585
1585
|
}),
|
|
1586
|
-
properties: utils$
|
|
1586
|
+
properties: utils$2.yup.object().test("properties-structure", "Invalid property set at ${path}", function(properties) {
|
|
1587
1587
|
const action2 = getActionFromProvider(this.options.parent.action);
|
|
1588
1588
|
const hasNoProperties = fp.isEmpty(properties) || fp.isNil(properties);
|
|
1589
1589
|
if (!fp.has("options.applyToProperties", action2)) {
|
|
@@ -1622,10 +1622,10 @@ const permission$3 = utils$1.yup.object().shape({
|
|
|
1622
1622
|
}
|
|
1623
1623
|
}
|
|
1624
1624
|
),
|
|
1625
|
-
conditions: utils$
|
|
1625
|
+
conditions: utils$2.yup.array().of(utils$2.yup.string())
|
|
1626
1626
|
}).noUnknown();
|
|
1627
|
-
const updatePermissions = utils$
|
|
1628
|
-
permissions: utils$
|
|
1627
|
+
const updatePermissions = utils$2.yup.object().shape({
|
|
1628
|
+
permissions: utils$2.yup.array().required().of(permission$3).test(
|
|
1629
1629
|
"duplicated-permissions",
|
|
1630
1630
|
"Some permissions are duplicated (same action and subject)",
|
|
1631
1631
|
checkNoDuplicatedPermissions
|
|
@@ -1643,46 +1643,46 @@ const validators = {
|
|
|
1643
1643
|
permission: permission$3,
|
|
1644
1644
|
updatePermissions
|
|
1645
1645
|
};
|
|
1646
|
-
const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$
|
|
1647
|
-
const { ValidationError: ValidationError$
|
|
1648
|
-
const sanitizeUserRoles = (role2) => ___namespace.default.pick(role2, ["id", "name", "description", "code"]);
|
|
1649
|
-
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) => {
|
|
1650
1650
|
return {
|
|
1651
1651
|
...___namespace.default.omit(user2, ["password", "resetPasswordToken", "registrationToken", "roles"]),
|
|
1652
|
-
roles: user2.roles && user2.roles.map(sanitizeUserRoles)
|
|
1652
|
+
roles: user2.roles && user2.roles.map(sanitizeUserRoles$1)
|
|
1653
1653
|
};
|
|
1654
1654
|
};
|
|
1655
1655
|
const create$5 = async (attributes) => {
|
|
1656
1656
|
const userInfo = {
|
|
1657
|
-
registrationToken: getService("token").createToken(),
|
|
1657
|
+
registrationToken: getService$1("token").createToken(),
|
|
1658
1658
|
...attributes
|
|
1659
1659
|
};
|
|
1660
1660
|
if (___namespace.default.has(attributes, "password")) {
|
|
1661
|
-
userInfo.password = await getService("auth").hashPassword(attributes.password);
|
|
1661
|
+
userInfo.password = await getService$1("auth").hashPassword(attributes.password);
|
|
1662
1662
|
}
|
|
1663
1663
|
const user2 = createUser(userInfo);
|
|
1664
1664
|
const createdUser = await strapi.db.query("admin::user").create({ data: user2, populate: ["roles"] });
|
|
1665
|
-
getService("metrics").sendDidInviteUser();
|
|
1666
|
-
strapi.eventHub.emit("user.create", { user: sanitizeUser(createdUser) });
|
|
1665
|
+
getService$1("metrics").sendDidInviteUser();
|
|
1666
|
+
strapi.eventHub.emit("user.create", { user: sanitizeUser$1(createdUser) });
|
|
1667
1667
|
return createdUser;
|
|
1668
1668
|
};
|
|
1669
|
-
const updateById = async (id, attributes) => {
|
|
1669
|
+
const updateById$1 = async (id, attributes) => {
|
|
1670
1670
|
if (___namespace.default.has(attributes, "roles")) {
|
|
1671
|
-
const lastAdminUser = await isLastSuperAdminUser(id);
|
|
1672
|
-
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
1673
|
-
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);
|
|
1674
1674
|
if (lastAdminUser && willRemoveSuperAdminRole) {
|
|
1675
|
-
throw new ValidationError$
|
|
1675
|
+
throw new ValidationError$6("You must have at least one user with super admin role.");
|
|
1676
1676
|
}
|
|
1677
1677
|
}
|
|
1678
1678
|
if (attributes.isActive === false) {
|
|
1679
|
-
const lastAdminUser = await isLastSuperAdminUser(id);
|
|
1679
|
+
const lastAdminUser = await isLastSuperAdminUser$1(id);
|
|
1680
1680
|
if (lastAdminUser) {
|
|
1681
|
-
throw new ValidationError$
|
|
1681
|
+
throw new ValidationError$6("You must have at least one user with super admin role.");
|
|
1682
1682
|
}
|
|
1683
1683
|
}
|
|
1684
1684
|
if (___namespace.default.has(attributes, "password")) {
|
|
1685
|
-
const hashedPassword = await getService("auth").hashPassword(attributes.password);
|
|
1685
|
+
const hashedPassword = await getService$1("auth").hashPassword(attributes.password);
|
|
1686
1686
|
const updatedUser2 = await strapi.db.query("admin::user").update({
|
|
1687
1687
|
where: { id },
|
|
1688
1688
|
data: {
|
|
@@ -1691,7 +1691,7 @@ const updateById = async (id, attributes) => {
|
|
|
1691
1691
|
},
|
|
1692
1692
|
populate: ["roles"]
|
|
1693
1693
|
});
|
|
1694
|
-
strapi.eventHub.emit("user.update", { user: sanitizeUser(updatedUser2) });
|
|
1694
|
+
strapi.eventHub.emit("user.update", { user: sanitizeUser$1(updatedUser2) });
|
|
1695
1695
|
return updatedUser2;
|
|
1696
1696
|
}
|
|
1697
1697
|
const updatedUser = await strapi.db.query("admin::user").update({
|
|
@@ -1700,7 +1700,7 @@ const updateById = async (id, attributes) => {
|
|
|
1700
1700
|
populate: ["roles"]
|
|
1701
1701
|
});
|
|
1702
1702
|
if (updatedUser) {
|
|
1703
|
-
strapi.eventHub.emit("user.update", { user: sanitizeUser(updatedUser) });
|
|
1703
|
+
strapi.eventHub.emit("user.update", { user: sanitizeUser$1(updatedUser) });
|
|
1704
1704
|
}
|
|
1705
1705
|
return updatedUser;
|
|
1706
1706
|
};
|
|
@@ -1712,17 +1712,17 @@ const resetPasswordByEmail = async (email2, password$1) => {
|
|
|
1712
1712
|
try {
|
|
1713
1713
|
await password.validate(password$1);
|
|
1714
1714
|
} catch (error) {
|
|
1715
|
-
throw new ValidationError$
|
|
1715
|
+
throw new ValidationError$6(
|
|
1716
1716
|
"Invalid password. Expected a minimum of 8 characters with at least one number and one uppercase letter"
|
|
1717
1717
|
);
|
|
1718
1718
|
}
|
|
1719
|
-
await updateById(user2.id, { password: password$1 });
|
|
1719
|
+
await updateById$1(user2.id, { password: password$1 });
|
|
1720
1720
|
};
|
|
1721
|
-
const isLastSuperAdminUser = async (userId) => {
|
|
1722
|
-
const user2 = await findOne$
|
|
1721
|
+
const isLastSuperAdminUser$1 = async (userId) => {
|
|
1722
|
+
const user2 = await findOne$2(userId);
|
|
1723
1723
|
if (!user2)
|
|
1724
1724
|
return false;
|
|
1725
|
-
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
1725
|
+
const superAdminRole = await getService$1("role").getSuperAdminWithUsersCount();
|
|
1726
1726
|
return superAdminRole.usersCount === 1 && hasSuperAdminRole$1(user2);
|
|
1727
1727
|
};
|
|
1728
1728
|
const exists$3 = async (attributes = {}) => {
|
|
@@ -1735,15 +1735,15 @@ const findRegistrationInfo = async (registrationToken) => {
|
|
|
1735
1735
|
}
|
|
1736
1736
|
return ___namespace.default.pick(user2, ["email", "firstname", "lastname"]);
|
|
1737
1737
|
};
|
|
1738
|
-
const register = async ({
|
|
1738
|
+
const register$1 = async ({
|
|
1739
1739
|
registrationToken,
|
|
1740
1740
|
userInfo
|
|
1741
1741
|
}) => {
|
|
1742
1742
|
const matchingUser = await strapi.db.query("admin::user").findOne({ where: { registrationToken } });
|
|
1743
1743
|
if (!matchingUser) {
|
|
1744
|
-
throw new ValidationError$
|
|
1744
|
+
throw new ValidationError$6("Invalid registration info");
|
|
1745
1745
|
}
|
|
1746
|
-
return getService("user").updateById(matchingUser.id, {
|
|
1746
|
+
return getService$1("user").updateById(matchingUser.id, {
|
|
1747
1747
|
password: userInfo.password,
|
|
1748
1748
|
firstname: userInfo.firstname,
|
|
1749
1749
|
lastname: userInfo.lastname,
|
|
@@ -1751,7 +1751,7 @@ const register = async ({
|
|
|
1751
1751
|
isActive: true
|
|
1752
1752
|
});
|
|
1753
1753
|
};
|
|
1754
|
-
const findOne$
|
|
1754
|
+
const findOne$2 = async (id, populate = ["roles"]) => {
|
|
1755
1755
|
return strapi.db.query("admin::user").findOne({ where: { id }, populate });
|
|
1756
1756
|
};
|
|
1757
1757
|
const findOneByEmail = async (email2, populate = []) => {
|
|
@@ -1764,7 +1764,7 @@ const findPage = async (params = {}) => {
|
|
|
1764
1764
|
const query = strapi.get("query-params").transform("admin::user", fp.defaults({ populate: ["roles"] }, params));
|
|
1765
1765
|
return strapi.db.query("admin::user").findPage(query);
|
|
1766
1766
|
};
|
|
1767
|
-
const deleteById = async (id) => {
|
|
1767
|
+
const deleteById$1 = async (id) => {
|
|
1768
1768
|
const userToDelete = await strapi.db.query("admin::user").findOne({
|
|
1769
1769
|
where: { id },
|
|
1770
1770
|
populate: ["roles"]
|
|
@@ -1773,19 +1773,19 @@ const deleteById = async (id) => {
|
|
|
1773
1773
|
return null;
|
|
1774
1774
|
}
|
|
1775
1775
|
if (userToDelete) {
|
|
1776
|
-
if (userToDelete.roles.some((r) => r.code === SUPER_ADMIN_CODE$
|
|
1777
|
-
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();
|
|
1778
1778
|
if (superAdminRole.usersCount === 1) {
|
|
1779
|
-
throw new ValidationError$
|
|
1779
|
+
throw new ValidationError$6("You must have at least one user with super admin role.");
|
|
1780
1780
|
}
|
|
1781
1781
|
}
|
|
1782
1782
|
}
|
|
1783
1783
|
const deletedUser = await strapi.db.query("admin::user").delete({ where: { id }, populate: ["roles"] });
|
|
1784
|
-
strapi.eventHub.emit("user.delete", { user: sanitizeUser(deletedUser) });
|
|
1784
|
+
strapi.eventHub.emit("user.delete", { user: sanitizeUser$1(deletedUser) });
|
|
1785
1785
|
return deletedUser;
|
|
1786
1786
|
};
|
|
1787
|
-
const deleteByIds$
|
|
1788
|
-
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
1787
|
+
const deleteByIds$3 = async (ids) => {
|
|
1788
|
+
const superAdminRole = await getService$1("role").getSuperAdminWithUsersCount();
|
|
1789
1789
|
const nbOfSuperAdminToDelete = await strapi.db.query("admin::user").count({
|
|
1790
1790
|
where: {
|
|
1791
1791
|
id: ids,
|
|
@@ -1793,7 +1793,7 @@ const deleteByIds$2 = async (ids) => {
|
|
|
1793
1793
|
}
|
|
1794
1794
|
});
|
|
1795
1795
|
if (superAdminRole.usersCount === nbOfSuperAdminToDelete) {
|
|
1796
|
-
throw new ValidationError$
|
|
1796
|
+
throw new ValidationError$6("You must have at least one user with super admin role.");
|
|
1797
1797
|
}
|
|
1798
1798
|
const deletedUsers = [];
|
|
1799
1799
|
for (const id of ids) {
|
|
@@ -1804,7 +1804,7 @@ const deleteByIds$2 = async (ids) => {
|
|
|
1804
1804
|
deletedUsers.push(deletedUser);
|
|
1805
1805
|
}
|
|
1806
1806
|
strapi.eventHub.emit("user.delete", {
|
|
1807
|
-
users: deletedUsers.map((deletedUser) => sanitizeUser(deletedUser))
|
|
1807
|
+
users: deletedUsers.map((deletedUser) => sanitizeUser$1(deletedUser))
|
|
1808
1808
|
});
|
|
1809
1809
|
return deletedUsers;
|
|
1810
1810
|
};
|
|
@@ -1846,18 +1846,18 @@ const getLanguagesInUse = async () => {
|
|
|
1846
1846
|
const users2 = await strapi.db.query("admin::user").findMany({ select: ["preferedLanguage"] });
|
|
1847
1847
|
return users2.map((user2) => user2.preferedLanguage || "en");
|
|
1848
1848
|
};
|
|
1849
|
-
const user$
|
|
1849
|
+
const user$3 = {
|
|
1850
1850
|
create: create$5,
|
|
1851
|
-
updateById,
|
|
1851
|
+
updateById: updateById$1,
|
|
1852
1852
|
exists: exists$3,
|
|
1853
1853
|
findRegistrationInfo,
|
|
1854
|
-
register,
|
|
1855
|
-
sanitizeUser,
|
|
1856
|
-
findOne: findOne$
|
|
1854
|
+
register: register$1,
|
|
1855
|
+
sanitizeUser: sanitizeUser$1,
|
|
1856
|
+
findOne: findOne$2,
|
|
1857
1857
|
findOneByEmail,
|
|
1858
1858
|
findPage,
|
|
1859
|
-
deleteById,
|
|
1860
|
-
deleteByIds: deleteByIds$
|
|
1859
|
+
deleteById: deleteById$1,
|
|
1860
|
+
deleteByIds: deleteByIds$3,
|
|
1861
1861
|
countUsersWithoutRole,
|
|
1862
1862
|
count: count$1,
|
|
1863
1863
|
assignARoleToAll,
|
|
@@ -1937,17 +1937,17 @@ const permissionDomain = {
|
|
|
1937
1937
|
setProperty,
|
|
1938
1938
|
toPermission
|
|
1939
1939
|
};
|
|
1940
|
-
const checkPermissionsSchema = utils$
|
|
1941
|
-
permissions: utils$
|
|
1942
|
-
utils$
|
|
1943
|
-
action: utils$
|
|
1944
|
-
subject: utils$
|
|
1945
|
-
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()
|
|
1946
1946
|
}).noUnknown()
|
|
1947
1947
|
)
|
|
1948
1948
|
});
|
|
1949
1949
|
const checkPermissionsExist = function(permissions2) {
|
|
1950
|
-
const existingActions = getService("permission").actionProvider.values();
|
|
1950
|
+
const existingActions = getService$1("permission").actionProvider.values();
|
|
1951
1951
|
const failIndex = permissions2.findIndex(
|
|
1952
1952
|
(permission2) => !existingActions.some(
|
|
1953
1953
|
(action2) => action2.actionId === permission2.action && (action2.section !== "contentTypes" || action2.subjects.includes(permission2.subject))
|
|
@@ -1961,17 +1961,17 @@ const checkPermissionsExist = function(permissions2) {
|
|
|
1961
1961
|
})
|
|
1962
1962
|
);
|
|
1963
1963
|
};
|
|
1964
|
-
const actionsExistSchema = utils$
|
|
1965
|
-
utils$
|
|
1966
|
-
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())
|
|
1967
1967
|
})
|
|
1968
1968
|
).test("actions-exist", "", checkPermissionsExist);
|
|
1969
|
-
const validatePermissionsExist = utils$
|
|
1970
|
-
const validateCheckPermissionsInput = utils$
|
|
1971
|
-
const validatedUpdatePermissionsInput = utils$
|
|
1972
|
-
const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$
|
|
1973
|
-
const { createAsyncSeriesWaterfallHook } = utils$
|
|
1974
|
-
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;
|
|
1975
1975
|
const hooks = {
|
|
1976
1976
|
willResetSuperAdminPermissions: createAsyncSeriesWaterfallHook()
|
|
1977
1977
|
};
|
|
@@ -1994,11 +1994,11 @@ const arePermissionsEqual = (p1, p2) => {
|
|
|
1994
1994
|
const create$3 = async (attributes) => {
|
|
1995
1995
|
const alreadyExists = await exists$2({ name: attributes.name });
|
|
1996
1996
|
if (alreadyExists) {
|
|
1997
|
-
throw new ApplicationError$
|
|
1997
|
+
throw new ApplicationError$9(
|
|
1998
1998
|
`The name must be unique and a role with name \`${attributes.name}\` already exists.`
|
|
1999
1999
|
);
|
|
2000
2000
|
}
|
|
2001
|
-
const autoGeneratedCode = `${___namespace.default.kebabCase(attributes.name)}-${utils$
|
|
2001
|
+
const autoGeneratedCode = `${___namespace.default.kebabCase(attributes.name)}-${utils$2.dates.timestampCode()}`;
|
|
2002
2002
|
const rolesWithCode = {
|
|
2003
2003
|
...attributes,
|
|
2004
2004
|
code: attributes.code || autoGeneratedCode
|
|
@@ -2007,7 +2007,7 @@ const create$3 = async (attributes) => {
|
|
|
2007
2007
|
strapi.eventHub.emit("role.create", { role: sanitizeRole(result) });
|
|
2008
2008
|
return result;
|
|
2009
2009
|
};
|
|
2010
|
-
const findOne = (params = {}, populate) => {
|
|
2010
|
+
const findOne$1 = (params = {}, populate) => {
|
|
2011
2011
|
return strapi.db.query("admin::role").findOne({ where: params, populate });
|
|
2012
2012
|
};
|
|
2013
2013
|
const findOneWithUsersCount = async (params = {}, populate) => {
|
|
@@ -2035,7 +2035,7 @@ const update$3 = async (params, attributes) => {
|
|
|
2035
2035
|
id: { $ne: params.id }
|
|
2036
2036
|
});
|
|
2037
2037
|
if (alreadyExists) {
|
|
2038
|
-
throw new ApplicationError$
|
|
2038
|
+
throw new ApplicationError$9(
|
|
2039
2039
|
`The name must be unique and a role with name \`${sanitizedAttributes.name}\` already exists.`
|
|
2040
2040
|
);
|
|
2041
2041
|
}
|
|
@@ -2053,19 +2053,19 @@ const count = async (params = {}) => {
|
|
|
2053
2053
|
};
|
|
2054
2054
|
const checkRolesIdForDeletion = async (ids = []) => {
|
|
2055
2055
|
const superAdminRole = await getSuperAdmin();
|
|
2056
|
-
if (superAdminRole && utils$
|
|
2057
|
-
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");
|
|
2058
2058
|
}
|
|
2059
2059
|
for (const roleId of ids) {
|
|
2060
2060
|
const usersCount = await getUsersCount(roleId);
|
|
2061
2061
|
if (usersCount !== 0) {
|
|
2062
|
-
throw new ApplicationError$
|
|
2062
|
+
throw new ApplicationError$9("Some roles are still assigned to some users");
|
|
2063
2063
|
}
|
|
2064
2064
|
}
|
|
2065
2065
|
};
|
|
2066
|
-
const deleteByIds$
|
|
2066
|
+
const deleteByIds$2 = async (ids = []) => {
|
|
2067
2067
|
await checkRolesIdForDeletion(ids);
|
|
2068
|
-
await getService("permission").deleteByRolesIds(ids);
|
|
2068
|
+
await getService$1("permission").deleteByRolesIds(ids);
|
|
2069
2069
|
const deletedRoles = [];
|
|
2070
2070
|
for (const id of ids) {
|
|
2071
2071
|
const deletedRole = await strapi.db.query("admin::role").delete({ where: { id } });
|
|
@@ -2079,14 +2079,14 @@ const deleteByIds$1 = async (ids = []) => {
|
|
|
2079
2079
|
const getUsersCount = async (roleId) => {
|
|
2080
2080
|
return strapi.db.query("admin::user").count({ where: { roles: { id: roleId } } });
|
|
2081
2081
|
};
|
|
2082
|
-
const getSuperAdmin = () => findOne({ code: SUPER_ADMIN_CODE$
|
|
2083
|
-
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 });
|
|
2084
2084
|
const createRolesIfNoneExist = async () => {
|
|
2085
2085
|
const someRolesExist = await exists$2();
|
|
2086
2086
|
if (someRolesExist) {
|
|
2087
2087
|
return;
|
|
2088
2088
|
}
|
|
2089
|
-
const { actionProvider: actionProvider2 } = getService("permission");
|
|
2089
|
+
const { actionProvider: actionProvider2 } = getService$1("permission");
|
|
2090
2090
|
const allActions = actionProvider2.values();
|
|
2091
2091
|
const contentTypesActions = allActions.filter((a) => a.section === "contentTypes");
|
|
2092
2092
|
const superAdminRole = await create$3({
|
|
@@ -2094,7 +2094,7 @@ const createRolesIfNoneExist = async () => {
|
|
|
2094
2094
|
code: "strapi-super-admin",
|
|
2095
2095
|
description: "Super Admins can access and manage all features and settings."
|
|
2096
2096
|
});
|
|
2097
|
-
await getService("user").assignARoleToAll(superAdminRole.id);
|
|
2097
|
+
await getService$1("user").assignARoleToAll(superAdminRole.id);
|
|
2098
2098
|
const editorRole = await create$3({
|
|
2099
2099
|
name: "Editor",
|
|
2100
2100
|
code: "strapi-editor",
|
|
@@ -2105,7 +2105,7 @@ const createRolesIfNoneExist = async () => {
|
|
|
2105
2105
|
code: "strapi-author",
|
|
2106
2106
|
description: "Authors can manage the content they have created."
|
|
2107
2107
|
});
|
|
2108
|
-
const editorPermissions = getService("content-type").getPermissionsWithNestedFields(
|
|
2108
|
+
const editorPermissions = getService$1("content-type").getPermissionsWithNestedFields(
|
|
2109
2109
|
contentTypesActions,
|
|
2110
2110
|
{
|
|
2111
2111
|
restrictedSubjects: ["plugin::users-permissions.user"]
|
|
@@ -2132,7 +2132,7 @@ const getDefaultPluginPermissions = ({ isAuthor = false } = {}) => {
|
|
|
2132
2132
|
};
|
|
2133
2133
|
const displayWarningIfNoSuperAdmin = async () => {
|
|
2134
2134
|
const superAdminRole = await getSuperAdminWithUsersCount();
|
|
2135
|
-
const someUsersExists = await getService("user").exists();
|
|
2135
|
+
const someUsersExists = await getService$1("user").exists();
|
|
2136
2136
|
if (!superAdminRole) {
|
|
2137
2137
|
strapi.log.warn("Your application doesn't have a super admin role.");
|
|
2138
2138
|
} else if (someUsersExists && superAdminRole.usersCount === 0) {
|
|
@@ -2141,12 +2141,12 @@ const displayWarningIfNoSuperAdmin = async () => {
|
|
|
2141
2141
|
};
|
|
2142
2142
|
const assignPermissions = async (roleId, permissions2 = []) => {
|
|
2143
2143
|
await validatePermissionsExist(permissions2);
|
|
2144
|
-
const internalActions = getService("permission").actionProvider.values().filter((action2) => action2.section === "internal").map((action2) => action2.actionId);
|
|
2145
|
-
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();
|
|
2146
2146
|
const isSuperAdmin = superAdmin && superAdmin.id === roleId;
|
|
2147
2147
|
const assignRole = fp.set("role", roleId);
|
|
2148
2148
|
const permissionsWithRole = permissions2.map(assignRole).map(permissionDomain.create);
|
|
2149
|
-
const existingPermissions = await getService("permission").findMany({
|
|
2149
|
+
const existingPermissions = await getService$1("permission").findMany({
|
|
2150
2150
|
where: { role: { id: roleId } },
|
|
2151
2151
|
populate: ["role"]
|
|
2152
2152
|
});
|
|
@@ -2162,31 +2162,31 @@ const assignPermissions = async (roleId, permissions2 = []) => {
|
|
|
2162
2162
|
).filter((permission2) => !internalActions.includes(permission2.action));
|
|
2163
2163
|
const permissionsToReturn = fp.differenceBy("id", permissionsToDelete, existingPermissions);
|
|
2164
2164
|
if (permissionsToDelete.length > 0) {
|
|
2165
|
-
await getService("permission").deleteByIds(permissionsToDelete.map(fp.prop("id")));
|
|
2165
|
+
await getService$1("permission").deleteByIds(permissionsToDelete.map(fp.prop("id")));
|
|
2166
2166
|
}
|
|
2167
2167
|
if (permissionsToAdd.length > 0) {
|
|
2168
2168
|
const newPermissions = await addPermissions(roleId, permissionsToAdd);
|
|
2169
2169
|
permissionsToReturn.push(...newPermissions);
|
|
2170
2170
|
}
|
|
2171
2171
|
if (!isSuperAdmin && (permissionsToAdd.length || permissionsToDelete.length)) {
|
|
2172
|
-
await getService("metrics").sendDidUpdateRolePermissions();
|
|
2172
|
+
await getService$1("metrics").sendDidUpdateRolePermissions();
|
|
2173
2173
|
}
|
|
2174
2174
|
return permissionsToReturn;
|
|
2175
2175
|
};
|
|
2176
2176
|
const addPermissions = async (roleId, permissions2) => {
|
|
2177
|
-
const { conditionProvider: conditionProvider2, createMany: createMany2 } = getService("permission");
|
|
2177
|
+
const { conditionProvider: conditionProvider2, createMany: createMany2 } = getService$1("permission");
|
|
2178
2178
|
const { sanitizeConditions: sanitizeConditions2 } = permissionDomain;
|
|
2179
2179
|
const permissionsWithRole = permissions2.map(fp.set("role", roleId)).map(sanitizeConditions2(conditionProvider2)).map(permissionDomain.create);
|
|
2180
2180
|
return createMany2(permissionsWithRole);
|
|
2181
2181
|
};
|
|
2182
2182
|
const isContentTypeAction = (action2) => action2.section === CONTENT_TYPE_SECTION;
|
|
2183
2183
|
const resetSuperAdminPermissions = async () => {
|
|
2184
|
-
const superAdminRole = await getService("role").getSuperAdmin();
|
|
2184
|
+
const superAdminRole = await getService$1("role").getSuperAdmin();
|
|
2185
2185
|
if (!superAdminRole) {
|
|
2186
2186
|
return;
|
|
2187
2187
|
}
|
|
2188
|
-
const permissionService = getService("permission");
|
|
2189
|
-
const contentTypeService = getService("content-type");
|
|
2188
|
+
const permissionService = getService$1("permission");
|
|
2189
|
+
const contentTypeService = getService$1("content-type");
|
|
2190
2190
|
const allActions = permissionService.actionProvider.values();
|
|
2191
2191
|
const contentTypesActions = allActions.filter((action2) => isContentTypeAction(action2));
|
|
2192
2192
|
const otherActions = allActions.filter((action2) => !isContentTypeAction(action2));
|
|
@@ -2212,23 +2212,23 @@ const resetSuperAdminPermissions = async () => {
|
|
|
2212
2212
|
};
|
|
2213
2213
|
const hasSuperAdminRole = (user2) => {
|
|
2214
2214
|
const roles2 = ___namespace.default.get(user2, "roles", []);
|
|
2215
|
-
return roles2.map(fp.prop("code")).includes(SUPER_ADMIN_CODE$
|
|
2215
|
+
return roles2.map(fp.prop("code")).includes(SUPER_ADMIN_CODE$3);
|
|
2216
2216
|
};
|
|
2217
2217
|
const constants$2 = {
|
|
2218
|
-
superAdminCode: SUPER_ADMIN_CODE$
|
|
2218
|
+
superAdminCode: SUPER_ADMIN_CODE$3
|
|
2219
2219
|
};
|
|
2220
|
-
const role$
|
|
2220
|
+
const role$3 = {
|
|
2221
2221
|
hooks,
|
|
2222
2222
|
sanitizeRole,
|
|
2223
2223
|
create: create$3,
|
|
2224
|
-
findOne,
|
|
2224
|
+
findOne: findOne$1,
|
|
2225
2225
|
findOneWithUsersCount,
|
|
2226
2226
|
find,
|
|
2227
2227
|
findAllWithUsersCount,
|
|
2228
2228
|
update: update$3,
|
|
2229
2229
|
exists: exists$2,
|
|
2230
2230
|
count,
|
|
2231
|
-
deleteByIds: deleteByIds$
|
|
2231
|
+
deleteByIds: deleteByIds$2,
|
|
2232
2232
|
getUsersCount,
|
|
2233
2233
|
getSuperAdmin,
|
|
2234
2234
|
getSuperAdminWithUsersCount,
|
|
@@ -2249,7 +2249,7 @@ const createLocalStrategy = (strapi2, middleware) => {
|
|
|
2249
2249
|
session: false
|
|
2250
2250
|
},
|
|
2251
2251
|
(email2, password2, done) => {
|
|
2252
|
-
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]) => {
|
|
2253
2253
|
if (middleware) {
|
|
2254
2254
|
return middleware([error, user2, message], done);
|
|
2255
2255
|
}
|
|
@@ -2266,7 +2266,7 @@ const valueIsFunctionType = ([, value]) => fp.isFunction(value);
|
|
|
2266
2266
|
const keyIsValidEventName = ([key]) => {
|
|
2267
2267
|
return Object.keys(strapi.service("admin::passport").authEventsMapper).includes(key);
|
|
2268
2268
|
};
|
|
2269
|
-
const getPassportStrategies = () => [createLocalStrategy(strapi)];
|
|
2269
|
+
const getPassportStrategies$1 = () => [createLocalStrategy(strapi)];
|
|
2270
2270
|
const registerAuthEvents = () => {
|
|
2271
2271
|
const { events = {} } = strapi.config.get("admin.auth", {});
|
|
2272
2272
|
const { authEventsMapper: authEventsMapper2 } = strapi.service("admin::passport");
|
|
@@ -2280,10 +2280,10 @@ const init = () => {
|
|
|
2280
2280
|
registerAuthEvents();
|
|
2281
2281
|
return passport__default.default.initialize();
|
|
2282
2282
|
};
|
|
2283
|
-
const passport = { init, getPassportStrategies, authEventsMapper };
|
|
2283
|
+
const passport$1 = { init, getPassportStrategies: getPassportStrategies$1, authEventsMapper };
|
|
2284
2284
|
const sendDidInviteUser = async () => {
|
|
2285
|
-
const numberOfUsers = await getService("user").count();
|
|
2286
|
-
const numberOfRoles = await getService("role").count();
|
|
2285
|
+
const numberOfUsers = await getService$1("user").count();
|
|
2286
|
+
const numberOfRoles = await getService$1("role").count();
|
|
2287
2287
|
strapi.telemetry.send("didInviteUser", {
|
|
2288
2288
|
groupProperties: { numberOfRoles, numberOfUsers }
|
|
2289
2289
|
});
|
|
@@ -2292,27 +2292,30 @@ const sendDidUpdateRolePermissions = async () => {
|
|
|
2292
2292
|
strapi.telemetry.send("didUpdateRolePermissions");
|
|
2293
2293
|
};
|
|
2294
2294
|
const sendDidChangeInterfaceLanguage = async () => {
|
|
2295
|
-
const languagesInUse = await getService("user").getLanguagesInUse();
|
|
2295
|
+
const languagesInUse = await getService$1("user").getLanguagesInUse();
|
|
2296
2296
|
strapi.telemetry.send("didChangeInterfaceLanguage", { userProperties: { languagesInUse } });
|
|
2297
2297
|
};
|
|
2298
|
-
const sendUpdateProjectInformation = async (strapi2) => {
|
|
2299
|
-
const numberOfActiveAdminUsers = await getService("user").count({ isActive: true });
|
|
2300
|
-
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();
|
|
2301
2301
|
strapi2.telemetry.send("didUpdateProjectInformation", {
|
|
2302
2302
|
groupProperties: { numberOfActiveAdminUsers, numberOfAdminUsers }
|
|
2303
2303
|
});
|
|
2304
2304
|
};
|
|
2305
|
-
const startCron = (strapi2) => {
|
|
2305
|
+
const startCron$1 = (strapi2) => {
|
|
2306
2306
|
strapi2.cron.add({
|
|
2307
|
-
|
|
2307
|
+
sendProjectInformation: {
|
|
2308
|
+
task: () => sendUpdateProjectInformation$1(strapi2),
|
|
2309
|
+
options: "0 0 0 * * *"
|
|
2310
|
+
}
|
|
2308
2311
|
});
|
|
2309
2312
|
};
|
|
2310
|
-
const metrics = {
|
|
2313
|
+
const metrics$1 = {
|
|
2311
2314
|
sendDidInviteUser,
|
|
2312
2315
|
sendDidUpdateRolePermissions,
|
|
2313
2316
|
sendDidChangeInterfaceLanguage,
|
|
2314
|
-
sendUpdateProjectInformation,
|
|
2315
|
-
startCron
|
|
2317
|
+
sendUpdateProjectInformation: sendUpdateProjectInformation$1,
|
|
2318
|
+
startCron: startCron$1
|
|
2316
2319
|
};
|
|
2317
2320
|
const defaultJwtOptions = { expiresIn: "30d" };
|
|
2318
2321
|
const getTokenOptions = () => {
|
|
@@ -2357,37 +2360,37 @@ const token$3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
|
|
|
2357
2360
|
decodeJwtToken,
|
|
2358
2361
|
getTokenOptions
|
|
2359
2362
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
2360
|
-
const registerProviderActionSchema = utils$
|
|
2361
|
-
utils$
|
|
2362
|
-
uid: utils$
|
|
2363
|
+
const registerProviderActionSchema = utils$2.yup.array().required().of(
|
|
2364
|
+
utils$2.yup.object().shape({
|
|
2365
|
+
uid: utils$2.yup.string().matches(
|
|
2363
2366
|
/^[a-z]([a-z|.|-]+)[a-z]$/,
|
|
2364
2367
|
(v) => `${v.path}: The id can only contain lowercase letters, dots and hyphens.`
|
|
2365
2368
|
).required(),
|
|
2366
|
-
section: utils$
|
|
2367
|
-
pluginName: utils$
|
|
2369
|
+
section: utils$2.yup.string().oneOf(["contentTypes", "plugins", "settings", "internal"]).required(),
|
|
2370
|
+
pluginName: utils$2.yup.mixed().when("section", {
|
|
2368
2371
|
is: "plugins",
|
|
2369
2372
|
then: validators.isAPluginName.required(),
|
|
2370
2373
|
otherwise: validators.isAPluginName
|
|
2371
2374
|
}),
|
|
2372
|
-
subjects: utils$
|
|
2375
|
+
subjects: utils$2.yup.mixed().when("section", {
|
|
2373
2376
|
is: "contentTypes",
|
|
2374
|
-
then: utils$
|
|
2375
|
-
otherwise: utils$
|
|
2377
|
+
then: utils$2.yup.array().of(utils$2.yup.string()).required(),
|
|
2378
|
+
otherwise: utils$2.yup.mixed().oneOf([void 0], 'subjects should only be defined for the "contentTypes" section')
|
|
2376
2379
|
}),
|
|
2377
|
-
displayName: utils$
|
|
2378
|
-
category: utils$
|
|
2380
|
+
displayName: utils$2.yup.string().required(),
|
|
2381
|
+
category: utils$2.yup.mixed().when("section", {
|
|
2379
2382
|
is: "settings",
|
|
2380
|
-
then: utils$
|
|
2381
|
-
otherwise: utils$
|
|
2383
|
+
then: utils$2.yup.string().required(),
|
|
2384
|
+
otherwise: utils$2.yup.mixed().test(
|
|
2382
2385
|
"settingsCategory",
|
|
2383
2386
|
'category should only be defined for the "settings" section',
|
|
2384
2387
|
(cat) => cat === void 0
|
|
2385
2388
|
)
|
|
2386
2389
|
}),
|
|
2387
|
-
subCategory: utils$
|
|
2390
|
+
subCategory: utils$2.yup.mixed().when("section", {
|
|
2388
2391
|
is: (section) => ["settings", "plugins"].includes(section),
|
|
2389
|
-
then: utils$
|
|
2390
|
-
otherwise: utils$
|
|
2392
|
+
then: utils$2.yup.string(),
|
|
2393
|
+
otherwise: utils$2.yup.mixed().test(
|
|
2391
2394
|
"settingsSubCategory",
|
|
2392
2395
|
'subCategory should only be defined for "plugins" and "settings" sections',
|
|
2393
2396
|
(subCat) => {
|
|
@@ -2395,23 +2398,23 @@ const registerProviderActionSchema = utils$1.yup.array().required().of(
|
|
|
2395
2398
|
}
|
|
2396
2399
|
)
|
|
2397
2400
|
}),
|
|
2398
|
-
options: utils$
|
|
2399
|
-
applyToProperties: utils$
|
|
2401
|
+
options: utils$2.yup.object({
|
|
2402
|
+
applyToProperties: utils$2.yup.array().of(utils$2.yup.string())
|
|
2400
2403
|
}),
|
|
2401
|
-
aliases: utils$
|
|
2402
|
-
utils$
|
|
2403
|
-
actionId: utils$
|
|
2404
|
-
subjects: utils$
|
|
2404
|
+
aliases: utils$2.yup.array(
|
|
2405
|
+
utils$2.yup.object({
|
|
2406
|
+
actionId: utils$2.yup.string(),
|
|
2407
|
+
subjects: utils$2.yup.array(utils$2.yup.string()).nullable()
|
|
2405
2408
|
})
|
|
2406
2409
|
).nullable()
|
|
2407
2410
|
}).noUnknown()
|
|
2408
2411
|
);
|
|
2409
|
-
const validateRegisterProviderAction = utils$
|
|
2410
|
-
const { ApplicationError: ApplicationError$
|
|
2412
|
+
const validateRegisterProviderAction = utils$2.validateYupSchemaSync(registerProviderActionSchema);
|
|
2413
|
+
const { ApplicationError: ApplicationError$8 } = utils$2.errors;
|
|
2411
2414
|
const createActionProvider = (options) => {
|
|
2412
|
-
const provider = utils$
|
|
2415
|
+
const provider = utils$2.providerFactory(options);
|
|
2413
2416
|
const actionHooks = {
|
|
2414
|
-
appliesPropertyToSubject: utils$
|
|
2417
|
+
appliesPropertyToSubject: utils$2.hooks.createAsyncParallelHook()
|
|
2415
2418
|
};
|
|
2416
2419
|
return {
|
|
2417
2420
|
...provider,
|
|
@@ -2437,7 +2440,7 @@ const createActionProvider = (options) => {
|
|
|
2437
2440
|
async appliesToProperty(property, actionId, subject2) {
|
|
2438
2441
|
const action2 = provider.get(actionId);
|
|
2439
2442
|
if (!action2) {
|
|
2440
|
-
throw new ApplicationError$
|
|
2443
|
+
throw new ApplicationError$8(`No action found with id "${actionId}"`);
|
|
2441
2444
|
}
|
|
2442
2445
|
const appliesToAction = actionDomain.appliesToProperty(property, action2);
|
|
2443
2446
|
if (!appliesToAction) {
|
|
@@ -2515,7 +2518,7 @@ const domain = {
|
|
|
2515
2518
|
sanitizeConditionAttributes
|
|
2516
2519
|
};
|
|
2517
2520
|
const createConditionProvider = () => {
|
|
2518
|
-
const provider = utils$
|
|
2521
|
+
const provider = utils$2.providerFactory();
|
|
2519
2522
|
return {
|
|
2520
2523
|
...provider,
|
|
2521
2524
|
async register(conditionAttributes) {
|
|
@@ -2535,14 +2538,14 @@ const createConditionProvider = () => {
|
|
|
2535
2538
|
};
|
|
2536
2539
|
const {
|
|
2537
2540
|
visitors: { removePassword, expandWildcardPopulate }
|
|
2538
|
-
} = utils$
|
|
2541
|
+
} = utils$2.sanitize;
|
|
2539
2542
|
const {
|
|
2540
2543
|
constants: constants$1,
|
|
2541
2544
|
isScalarAttribute: isScalarAttribute$1,
|
|
2542
2545
|
getNonVisibleAttributes: getNonVisibleAttributes$1,
|
|
2543
2546
|
getNonWritableAttributes,
|
|
2544
2547
|
getWritableAttributes: getWritableAttributes$1
|
|
2545
|
-
} = utils$
|
|
2548
|
+
} = utils$2.contentTypes;
|
|
2546
2549
|
const {
|
|
2547
2550
|
ID_ATTRIBUTE: ID_ATTRIBUTE$1,
|
|
2548
2551
|
DOC_ID_ATTRIBUTE: DOC_ID_ATTRIBUTE$1,
|
|
@@ -2556,7 +2559,7 @@ const COMPONENT_FIELDS$1 = ["__component"];
|
|
|
2556
2559
|
const STATIC_FIELDS$1 = [ID_ATTRIBUTE$1, DOC_ID_ATTRIBUTE$1];
|
|
2557
2560
|
const createSanitizeHelpers = ({ action: action2, ability: ability$1, model }) => {
|
|
2558
2561
|
const schema = strapi.getModel(model);
|
|
2559
|
-
const { removeDisallowedFields } = utils$
|
|
2562
|
+
const { removeDisallowedFields } = utils$2.sanitize.visitors;
|
|
2560
2563
|
const ctx = {
|
|
2561
2564
|
schema,
|
|
2562
2565
|
getModel: strapi.getModel.bind(strapi)
|
|
@@ -2564,39 +2567,39 @@ const createSanitizeHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2564
2567
|
const createSanitizeQuery = (options = {}) => {
|
|
2565
2568
|
const { fields } = options;
|
|
2566
2569
|
const permittedFields = fields.shouldIncludeAll ? null : getQueryFields(fields.permitted);
|
|
2567
|
-
const sanitizeFilters = utils$
|
|
2568
|
-
utils$
|
|
2569
|
-
utils$
|
|
2570
|
-
utils$
|
|
2571
|
-
utils$
|
|
2572
|
-
utils$
|
|
2570
|
+
const sanitizeFilters = utils$2.async.pipe(
|
|
2571
|
+
utils$2.traverse.traverseQueryFilters(removeDisallowedFields(permittedFields), ctx),
|
|
2572
|
+
utils$2.traverse.traverseQueryFilters(omitDisallowedAdminUserFields, ctx),
|
|
2573
|
+
utils$2.traverse.traverseQueryFilters(omitHiddenFields, ctx),
|
|
2574
|
+
utils$2.traverse.traverseQueryFilters(removePassword, ctx),
|
|
2575
|
+
utils$2.traverse.traverseQueryFilters(({ key, value }, { remove }) => {
|
|
2573
2576
|
if (fp.isObject(value) && fp.isEmpty(value)) {
|
|
2574
2577
|
remove(key);
|
|
2575
2578
|
}
|
|
2576
2579
|
}, ctx)
|
|
2577
2580
|
);
|
|
2578
|
-
const sanitizeSort = utils$
|
|
2579
|
-
utils$
|
|
2580
|
-
utils$
|
|
2581
|
-
utils$
|
|
2582
|
-
utils$
|
|
2583
|
-
utils$
|
|
2581
|
+
const sanitizeSort = utils$2.async.pipe(
|
|
2582
|
+
utils$2.traverse.traverseQuerySort(removeDisallowedFields(permittedFields), ctx),
|
|
2583
|
+
utils$2.traverse.traverseQuerySort(omitDisallowedAdminUserFields, ctx),
|
|
2584
|
+
utils$2.traverse.traverseQuerySort(omitHiddenFields, ctx),
|
|
2585
|
+
utils$2.traverse.traverseQuerySort(removePassword, ctx),
|
|
2586
|
+
utils$2.traverse.traverseQuerySort(({ key, attribute, value }, { remove }) => {
|
|
2584
2587
|
if (!isScalarAttribute$1(attribute) && fp.isEmpty(value)) {
|
|
2585
2588
|
remove(key);
|
|
2586
2589
|
}
|
|
2587
2590
|
}, ctx)
|
|
2588
2591
|
);
|
|
2589
|
-
const sanitizePopulate = utils$
|
|
2590
|
-
utils$
|
|
2591
|
-
utils$
|
|
2592
|
-
utils$
|
|
2593
|
-
utils$
|
|
2594
|
-
utils$
|
|
2592
|
+
const sanitizePopulate = utils$2.async.pipe(
|
|
2593
|
+
utils$2.traverse.traverseQueryPopulate(expandWildcardPopulate, ctx),
|
|
2594
|
+
utils$2.traverse.traverseQueryPopulate(removeDisallowedFields(permittedFields), ctx),
|
|
2595
|
+
utils$2.traverse.traverseQueryPopulate(omitDisallowedAdminUserFields, ctx),
|
|
2596
|
+
utils$2.traverse.traverseQueryPopulate(omitHiddenFields, ctx),
|
|
2597
|
+
utils$2.traverse.traverseQueryPopulate(removePassword, ctx)
|
|
2595
2598
|
);
|
|
2596
|
-
const sanitizeFields = utils$
|
|
2597
|
-
utils$
|
|
2598
|
-
utils$
|
|
2599
|
-
utils$
|
|
2599
|
+
const sanitizeFields = utils$2.async.pipe(
|
|
2600
|
+
utils$2.traverse.traverseQueryFields(removeDisallowedFields(permittedFields), ctx),
|
|
2601
|
+
utils$2.traverse.traverseQueryFields(omitHiddenFields, ctx),
|
|
2602
|
+
utils$2.traverse.traverseQueryFields(removePassword, ctx)
|
|
2600
2603
|
);
|
|
2601
2604
|
return async (query) => {
|
|
2602
2605
|
const sanitizedQuery = fp.cloneDeep(query);
|
|
@@ -2618,15 +2621,15 @@ const createSanitizeHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2618
2621
|
const createSanitizeOutput = (options = {}) => {
|
|
2619
2622
|
const { fields } = options;
|
|
2620
2623
|
const permittedFields = fields.shouldIncludeAll ? null : getOutputFields(fields.permitted);
|
|
2621
|
-
return utils$
|
|
2624
|
+
return utils$2.async.pipe(
|
|
2622
2625
|
// Remove fields hidden from the admin
|
|
2623
|
-
utils$
|
|
2626
|
+
utils$2.traverseEntity(omitHiddenFields, ctx),
|
|
2624
2627
|
// Remove unallowed fields from admin::user relations
|
|
2625
|
-
utils$
|
|
2628
|
+
utils$2.traverseEntity(pickAllowedAdminUserFields, ctx),
|
|
2626
2629
|
// Remove not allowed fields (RBAC)
|
|
2627
|
-
utils$
|
|
2630
|
+
utils$2.traverseEntity(removeDisallowedFields(permittedFields), ctx),
|
|
2628
2631
|
// Remove all fields of type 'password'
|
|
2629
|
-
utils$
|
|
2632
|
+
utils$2.sanitize.sanitizers.sanitizePasswords({
|
|
2630
2633
|
schema,
|
|
2631
2634
|
getModel(uid) {
|
|
2632
2635
|
return strapi.getModel(uid);
|
|
@@ -2637,11 +2640,11 @@ const createSanitizeHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2637
2640
|
const createSanitizeInput = (options = {}) => {
|
|
2638
2641
|
const { fields } = options;
|
|
2639
2642
|
const permittedFields = fields.shouldIncludeAll ? null : getInputFields(fields.permitted);
|
|
2640
|
-
return utils$
|
|
2643
|
+
return utils$2.async.pipe(
|
|
2641
2644
|
// Remove fields hidden from the admin
|
|
2642
|
-
utils$
|
|
2645
|
+
utils$2.traverseEntity(omitHiddenFields, ctx),
|
|
2643
2646
|
// Remove not allowed fields (RBAC)
|
|
2644
|
-
utils$
|
|
2647
|
+
utils$2.traverseEntity(removeDisallowedFields(permittedFields), ctx),
|
|
2645
2648
|
// Remove roles from createdBy & updatedBy fields
|
|
2646
2649
|
omitCreatorRoles
|
|
2647
2650
|
);
|
|
@@ -2742,9 +2745,9 @@ const createSanitizeHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2742
2745
|
sanitizeQuery: wrapSanitize(createSanitizeQuery)
|
|
2743
2746
|
};
|
|
2744
2747
|
};
|
|
2745
|
-
const { ValidationError: ValidationError$
|
|
2746
|
-
const { throwPassword, throwDisallowedFields } = utils$
|
|
2747
|
-
const { constants, isScalarAttribute, getNonVisibleAttributes, getWritableAttributes } = utils$
|
|
2748
|
+
const { ValidationError: ValidationError$5 } = utils$2.errors;
|
|
2749
|
+
const { throwPassword, throwDisallowedFields } = utils$2.validate.visitors;
|
|
2750
|
+
const { constants, isScalarAttribute, getNonVisibleAttributes, getWritableAttributes } = utils$2.contentTypes;
|
|
2748
2751
|
const {
|
|
2749
2752
|
ID_ATTRIBUTE,
|
|
2750
2753
|
DOC_ID_ATTRIBUTE,
|
|
@@ -2758,7 +2761,7 @@ const COMPONENT_FIELDS = ["__component"];
|
|
|
2758
2761
|
const STATIC_FIELDS = [ID_ATTRIBUTE, DOC_ID_ATTRIBUTE];
|
|
2759
2762
|
const throwInvalidKey = ({ key, path: path2 }) => {
|
|
2760
2763
|
const msg = path2 && path2 !== key ? `Invalid key ${key} at ${path2}` : `Invalid key ${key}`;
|
|
2761
|
-
throw new ValidationError$
|
|
2764
|
+
throw new ValidationError$5(msg);
|
|
2762
2765
|
};
|
|
2763
2766
|
const createValidateHelpers = ({ action: action2, ability: ability$1, model }) => {
|
|
2764
2767
|
const schema = strapi.getModel(model);
|
|
@@ -2769,35 +2772,35 @@ const createValidateHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2769
2772
|
const createValidateQuery = (options = {}) => {
|
|
2770
2773
|
const { fields } = options;
|
|
2771
2774
|
const permittedFields = fields.shouldIncludeAll ? null : getQueryFields(fields.permitted);
|
|
2772
|
-
const validateFilters = utils$
|
|
2773
|
-
utils$
|
|
2774
|
-
utils$
|
|
2775
|
-
utils$
|
|
2776
|
-
utils$
|
|
2775
|
+
const validateFilters = utils$2.async.pipe(
|
|
2776
|
+
utils$2.traverse.traverseQueryFilters(throwDisallowedFields(permittedFields), ctx),
|
|
2777
|
+
utils$2.traverse.traverseQueryFilters(throwDisallowedAdminUserFields, ctx),
|
|
2778
|
+
utils$2.traverse.traverseQueryFilters(throwPassword, ctx),
|
|
2779
|
+
utils$2.traverse.traverseQueryFilters(({ key, value, path: path2 }) => {
|
|
2777
2780
|
if (fp.isObject(value) && fp.isEmpty(value)) {
|
|
2778
2781
|
throwInvalidKey({ key, path: path2.attribute });
|
|
2779
2782
|
}
|
|
2780
2783
|
}, ctx)
|
|
2781
2784
|
);
|
|
2782
|
-
const validateSort = utils$
|
|
2783
|
-
utils$
|
|
2784
|
-
utils$
|
|
2785
|
-
utils$
|
|
2786
|
-
utils$
|
|
2785
|
+
const validateSort = utils$2.async.pipe(
|
|
2786
|
+
utils$2.traverse.traverseQuerySort(throwDisallowedFields(permittedFields), ctx),
|
|
2787
|
+
utils$2.traverse.traverseQuerySort(throwDisallowedAdminUserFields, ctx),
|
|
2788
|
+
utils$2.traverse.traverseQuerySort(throwPassword, ctx),
|
|
2789
|
+
utils$2.traverse.traverseQuerySort(({ key, attribute, value, path: path2 }) => {
|
|
2787
2790
|
if (!isScalarAttribute(attribute) && fp.isEmpty(value)) {
|
|
2788
2791
|
throwInvalidKey({ key, path: path2.attribute });
|
|
2789
2792
|
}
|
|
2790
2793
|
}, ctx)
|
|
2791
2794
|
);
|
|
2792
|
-
const validateFields = utils$
|
|
2793
|
-
utils$
|
|
2794
|
-
utils$
|
|
2795
|
+
const validateFields = utils$2.async.pipe(
|
|
2796
|
+
utils$2.traverse.traverseQueryFields(throwDisallowedFields(permittedFields), ctx),
|
|
2797
|
+
utils$2.traverse.traverseQueryFields(throwPassword, ctx)
|
|
2795
2798
|
);
|
|
2796
|
-
const validatePopulate = utils$
|
|
2797
|
-
utils$
|
|
2798
|
-
utils$
|
|
2799
|
-
utils$
|
|
2800
|
-
utils$
|
|
2799
|
+
const validatePopulate = utils$2.async.pipe(
|
|
2800
|
+
utils$2.traverse.traverseQueryPopulate(throwDisallowedFields(permittedFields), ctx),
|
|
2801
|
+
utils$2.traverse.traverseQueryPopulate(throwDisallowedAdminUserFields, ctx),
|
|
2802
|
+
utils$2.traverse.traverseQueryPopulate(throwHiddenFields, ctx),
|
|
2803
|
+
utils$2.traverse.traverseQueryPopulate(throwPassword, ctx)
|
|
2801
2804
|
);
|
|
2802
2805
|
return async (query) => {
|
|
2803
2806
|
if (query.filters) {
|
|
@@ -2818,11 +2821,11 @@ const createValidateHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2818
2821
|
const createValidateInput = (options = {}) => {
|
|
2819
2822
|
const { fields } = options;
|
|
2820
2823
|
const permittedFields = fields.shouldIncludeAll ? null : getInputFields(fields.permitted);
|
|
2821
|
-
return utils$
|
|
2824
|
+
return utils$2.async.pipe(
|
|
2822
2825
|
// Remove fields hidden from the admin
|
|
2823
|
-
utils$
|
|
2826
|
+
utils$2.traverseEntity(throwHiddenFields, ctx),
|
|
2824
2827
|
// Remove not allowed fields (RBAC)
|
|
2825
|
-
utils$
|
|
2828
|
+
utils$2.traverseEntity(throwDisallowedFields(permittedFields), ctx),
|
|
2826
2829
|
// Remove roles from createdBy & updatedBy fields
|
|
2827
2830
|
omitCreatorRoles
|
|
2828
2831
|
);
|
|
@@ -2943,7 +2946,7 @@ const unwrapDeep = (obj) => {
|
|
|
2943
2946
|
{}
|
|
2944
2947
|
);
|
|
2945
2948
|
};
|
|
2946
|
-
const index
|
|
2949
|
+
const index = ({ ability: ability$1, action: action2, model }) => ({
|
|
2947
2950
|
ability: ability$1,
|
|
2948
2951
|
action: action2,
|
|
2949
2952
|
model,
|
|
@@ -3016,7 +3019,7 @@ const createPermissionEngine = (params) => {
|
|
|
3016
3019
|
* @param user
|
|
3017
3020
|
*/
|
|
3018
3021
|
async generateUserAbility(user2) {
|
|
3019
|
-
const permissions2 = await getService("permission").findUserPermissions(user2);
|
|
3022
|
+
const permissions2 = await getService$1("permission").findUserPermissions(user2);
|
|
3020
3023
|
return engine2.generateAbility(permissions2, user2);
|
|
3021
3024
|
},
|
|
3022
3025
|
/**
|
|
@@ -3031,8 +3034,8 @@ const emptyObjectFactory = () => ({});
|
|
|
3031
3034
|
const createSection = ({ initialStateFactory = emptyObjectFactory, handlers = [], matchers = [] } = {}) => {
|
|
3032
3035
|
const state = {
|
|
3033
3036
|
hooks: {
|
|
3034
|
-
handlers: utils$
|
|
3035
|
-
matchers: utils$
|
|
3037
|
+
handlers: utils$2.hooks.createAsyncSeriesHook(),
|
|
3038
|
+
matchers: utils$2.hooks.createAsyncParallelHook()
|
|
3036
3039
|
}
|
|
3037
3040
|
};
|
|
3038
3041
|
handlers.forEach((handler) => state.hooks.handlers.register(handler));
|
|
@@ -3136,7 +3139,7 @@ const toSubjectTemplate = (ct) => ({
|
|
|
3136
3139
|
label: ct.info.singularName,
|
|
3137
3140
|
properties: []
|
|
3138
3141
|
});
|
|
3139
|
-
const { isVisibleAttribute } = utils$
|
|
3142
|
+
const { isVisibleAttribute } = utils$2.contentTypes;
|
|
3140
3143
|
const settings = ({ action: action2, section }) => {
|
|
3141
3144
|
const { category, subCategory, displayName, actionId } = action2;
|
|
3142
3145
|
section.push({
|
|
@@ -3246,10 +3249,10 @@ const deleteByRolesIds = async (rolesIds) => {
|
|
|
3246
3249
|
}
|
|
3247
3250
|
});
|
|
3248
3251
|
if (permissionsToDelete.length > 0) {
|
|
3249
|
-
await deleteByIds(permissionsToDelete.map(fp.prop("id")));
|
|
3252
|
+
await deleteByIds$1(permissionsToDelete.map(fp.prop("id")));
|
|
3250
3253
|
}
|
|
3251
3254
|
};
|
|
3252
|
-
const deleteByIds = async (ids) => {
|
|
3255
|
+
const deleteByIds$1 = async (ids) => {
|
|
3253
3256
|
const result = [];
|
|
3254
3257
|
for (const id of ids) {
|
|
3255
3258
|
const queryResult = await strapi.db.query("admin::permission").delete({ where: { id } });
|
|
@@ -3281,7 +3284,7 @@ const findUserPermissions = async (user2) => {
|
|
|
3281
3284
|
return findMany({ where: { role: { users: { id: user2.id } } } });
|
|
3282
3285
|
};
|
|
3283
3286
|
const filterPermissionsToRemove = async (permissions2) => {
|
|
3284
|
-
const { actionProvider: actionProvider2 } = getService("permission");
|
|
3287
|
+
const { actionProvider: actionProvider2 } = getService$1("permission");
|
|
3285
3288
|
const permissionsToRemove = [];
|
|
3286
3289
|
for (const permission2 of permissions2) {
|
|
3287
3290
|
const { subjects, options = {} } = actionProvider2.get(permission2.action) || {};
|
|
@@ -3307,7 +3310,7 @@ const filterPermissionsToRemove = async (permissions2) => {
|
|
|
3307
3310
|
};
|
|
3308
3311
|
const cleanPermissionsInDatabase = async () => {
|
|
3309
3312
|
const pageSize = 200;
|
|
3310
|
-
const contentTypeService = getService("content-type");
|
|
3313
|
+
const contentTypeService = getService$1("content-type");
|
|
3311
3314
|
const total = await strapi.db.query("admin::permission").count();
|
|
3312
3315
|
const pageCount = Math.ceil(total / pageSize);
|
|
3313
3316
|
for (let page = 0; page < pageCount; page += 1) {
|
|
@@ -3332,7 +3335,7 @@ const cleanPermissionsInDatabase = async () => {
|
|
|
3332
3335
|
return update$2({ id: permission2.id }, permission2);
|
|
3333
3336
|
};
|
|
3334
3337
|
await Promise.all([
|
|
3335
|
-
deleteByIds(permissionsIdToRemove),
|
|
3338
|
+
deleteByIds$1(permissionsIdToRemove),
|
|
3336
3339
|
pmap__default.default(permissionsNeedingToBeUpdated, updatePromiseProvider, {
|
|
3337
3340
|
concurrency: 100,
|
|
3338
3341
|
stopOnError: true
|
|
@@ -3353,8 +3356,8 @@ const permission$2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.define
|
|
|
3353
3356
|
cleanPermissionsInDatabase,
|
|
3354
3357
|
conditionProvider,
|
|
3355
3358
|
createMany,
|
|
3356
|
-
createPermissionsManager: index
|
|
3357
|
-
deleteByIds,
|
|
3359
|
+
createPermissionsManager: index,
|
|
3360
|
+
deleteByIds: deleteByIds$1,
|
|
3358
3361
|
deleteByRolesIds,
|
|
3359
3362
|
engine: engine$1,
|
|
3360
3363
|
findMany,
|
|
@@ -3372,7 +3375,7 @@ const getNestedFields = (model, {
|
|
|
3372
3375
|
if (nestingLevel === 0) {
|
|
3373
3376
|
return prefix ? [prefix] : [];
|
|
3374
3377
|
}
|
|
3375
|
-
const nonAuthorizableFields = utils$
|
|
3378
|
+
const nonAuthorizableFields = utils$2.contentTypes.getNonVisibleAttributes(model);
|
|
3376
3379
|
return ___namespace.default.reduce(
|
|
3377
3380
|
model.attributes,
|
|
3378
3381
|
(fields, attr, key) => {
|
|
@@ -3409,7 +3412,7 @@ const getNestedFieldsWithIntermediate = (model, { prefix = "", nestingLevel = 15
|
|
|
3409
3412
|
if (nestingLevel === 0) {
|
|
3410
3413
|
return [];
|
|
3411
3414
|
}
|
|
3412
|
-
const nonAuthorizableFields = utils$
|
|
3415
|
+
const nonAuthorizableFields = utils$2.contentTypes.getNonVisibleAttributes(model);
|
|
3413
3416
|
return ___namespace.default.reduce(
|
|
3414
3417
|
model.attributes,
|
|
3415
3418
|
(fields, attr, key) => {
|
|
@@ -3451,7 +3454,7 @@ const getPermissionsWithNestedFields = (actions2, { nestingLevel, restrictedSubj
|
|
|
3451
3454
|
}, []);
|
|
3452
3455
|
};
|
|
3453
3456
|
const cleanPermissionFields = (permissions2, { nestingLevel } = {}) => {
|
|
3454
|
-
const { actionProvider: actionProvider2 } = getService("permission");
|
|
3457
|
+
const { actionProvider: actionProvider2 } = getService$1("permission");
|
|
3455
3458
|
return permissions2.map((permission2) => {
|
|
3456
3459
|
const {
|
|
3457
3460
|
action: actionId,
|
|
@@ -3490,7 +3493,7 @@ const contentType = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineP
|
|
|
3490
3493
|
getPermissionsWithNestedFields
|
|
3491
3494
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
3492
3495
|
const isValidCondition = (condition2) => {
|
|
3493
|
-
const { conditionProvider: conditionProvider2 } = getService("permission");
|
|
3496
|
+
const { conditionProvider: conditionProvider2 } = getService$1("permission");
|
|
3494
3497
|
return fp.isString(condition2) && conditionProvider2.has(condition2);
|
|
3495
3498
|
};
|
|
3496
3499
|
const condition = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
@@ -3498,11 +3501,11 @@ const condition = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePro
|
|
|
3498
3501
|
isValidCondition
|
|
3499
3502
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
3500
3503
|
const { AUTHOR_CODE, PUBLISH_ACTION } = constants$3;
|
|
3501
|
-
const { NotFoundError: NotFoundError$2 } = utils$
|
|
3504
|
+
const { NotFoundError: NotFoundError$2 } = utils$2.errors;
|
|
3502
3505
|
const getAllowedActionsForRole = async (roleId) => {
|
|
3503
|
-
const { actionProvider: actionProvider2 } = getService("permission");
|
|
3506
|
+
const { actionProvider: actionProvider2 } = getService$1("permission");
|
|
3504
3507
|
if (!fp.isNil(roleId)) {
|
|
3505
|
-
const role2 = await getService("role").findOne({ id: roleId });
|
|
3508
|
+
const role2 = await getService$1("role").findOne({ id: roleId });
|
|
3506
3509
|
if (!role2) {
|
|
3507
3510
|
throw new NotFoundError$2("role.notFound");
|
|
3508
3511
|
}
|
|
@@ -3516,7 +3519,7 @@ const action = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
|
|
|
3516
3519
|
__proto__: null,
|
|
3517
3520
|
getAllowedActionsForRole
|
|
3518
3521
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
3519
|
-
const { ValidationError: ValidationError$
|
|
3522
|
+
const { ValidationError: ValidationError$4, NotFoundError: NotFoundError$1 } = utils$2.errors;
|
|
3520
3523
|
const SELECT_FIELDS$1 = [
|
|
3521
3524
|
"id",
|
|
3522
3525
|
"name",
|
|
@@ -3531,16 +3534,16 @@ const SELECT_FIELDS$1 = [
|
|
|
3531
3534
|
const POPULATE_FIELDS$1 = ["permissions"];
|
|
3532
3535
|
const assertCustomTokenPermissionsValidity = (type, permissions2) => {
|
|
3533
3536
|
if (type !== constants$3.API_TOKEN_TYPE.CUSTOM && !fp.isEmpty(permissions2)) {
|
|
3534
|
-
throw new ValidationError$
|
|
3537
|
+
throw new ValidationError$4("Non-custom tokens should not reference permissions");
|
|
3535
3538
|
}
|
|
3536
3539
|
if (type === constants$3.API_TOKEN_TYPE.CUSTOM && !fp.isArray(permissions2)) {
|
|
3537
|
-
throw new ValidationError$
|
|
3540
|
+
throw new ValidationError$4("Missing permissions attribute for custom token");
|
|
3538
3541
|
}
|
|
3539
3542
|
if (type === constants$3.API_TOKEN_TYPE.CUSTOM) {
|
|
3540
3543
|
const validPermissions = strapi.contentAPI.permissions.providers.action.keys();
|
|
3541
3544
|
const invalidPermissions = fp.difference(permissions2, validPermissions);
|
|
3542
3545
|
if (!fp.isEmpty(invalidPermissions)) {
|
|
3543
|
-
throw new ValidationError$
|
|
3546
|
+
throw new ValidationError$4(`Unknown permissions provided: ${invalidPermissions.join(", ")}`);
|
|
3544
3547
|
}
|
|
3545
3548
|
}
|
|
3546
3549
|
};
|
|
@@ -3555,7 +3558,7 @@ const isValidLifespan$1 = (lifespan) => {
|
|
|
3555
3558
|
};
|
|
3556
3559
|
const assertValidLifespan$1 = (lifespan) => {
|
|
3557
3560
|
if (!isValidLifespan$1(lifespan)) {
|
|
3558
|
-
throw new ValidationError$
|
|
3561
|
+
throw new ValidationError$4(
|
|
3559
3562
|
`lifespan must be one of the following values:
|
|
3560
3563
|
${Object.values(constants$3.API_TOKEN_LIFESPANS).join(", ")}`
|
|
3561
3564
|
);
|
|
@@ -3590,7 +3593,7 @@ const hash$1 = (accessKey) => {
|
|
|
3590
3593
|
const getExpirationFields$1 = (lifespan) => {
|
|
3591
3594
|
const isValidNumber = fp.isNumber(lifespan) && Number.isFinite(lifespan) && lifespan > 0;
|
|
3592
3595
|
if (!isValidNumber && !fp.isNil(lifespan)) {
|
|
3593
|
-
throw new ValidationError$
|
|
3596
|
+
throw new ValidationError$4("lifespan must be a positive number or null");
|
|
3594
3597
|
}
|
|
3595
3598
|
return {
|
|
3596
3599
|
lifespan: lifespan || null,
|
|
@@ -3742,8 +3745,8 @@ const apiToken$2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePr
|
|
|
3742
3745
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
3743
3746
|
const DEFAULT_TRANSFER_ACTIONS = ["push", "pull"];
|
|
3744
3747
|
const providers = {
|
|
3745
|
-
action: utils$
|
|
3746
|
-
condition: utils$
|
|
3748
|
+
action: utils$2.providerFactory(),
|
|
3749
|
+
condition: utils$2.providerFactory()
|
|
3747
3750
|
};
|
|
3748
3751
|
DEFAULT_TRANSFER_ACTIONS.forEach((action2) => {
|
|
3749
3752
|
providers.action.register(action2, { action: action2 });
|
|
@@ -3754,7 +3757,7 @@ const permission$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.define
|
|
|
3754
3757
|
engine,
|
|
3755
3758
|
providers
|
|
3756
3759
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
3757
|
-
const { ValidationError: ValidationError$
|
|
3760
|
+
const { ValidationError: ValidationError$3, NotFoundError } = utils$2.errors;
|
|
3758
3761
|
const TRANSFER_TOKEN_UID = "admin::transfer-token";
|
|
3759
3762
|
const TRANSFER_TOKEN_PERMISSION_UID = "admin::transfer-token-permission";
|
|
3760
3763
|
const SELECT_FIELDS = [
|
|
@@ -3905,7 +3908,7 @@ const regenerate = async (id) => {
|
|
|
3905
3908
|
const getExpirationFields = (lifespan) => {
|
|
3906
3909
|
const isValidNumber = fp.isNumber(lifespan) && Number.isFinite(lifespan) && lifespan > 0;
|
|
3907
3910
|
if (!isValidNumber && !fp.isNil(lifespan)) {
|
|
3908
|
-
throw new ValidationError$
|
|
3911
|
+
throw new ValidationError$3("lifespan must be a positive number or null");
|
|
3909
3912
|
}
|
|
3910
3913
|
return {
|
|
3911
3914
|
lifespan: lifespan || null,
|
|
@@ -3913,14 +3916,14 @@ const getExpirationFields = (lifespan) => {
|
|
|
3913
3916
|
};
|
|
3914
3917
|
};
|
|
3915
3918
|
const hash = (accessKey) => {
|
|
3916
|
-
const { hasValidTokenSalt: hasValidTokenSalt2 } = getService("transfer").utils;
|
|
3919
|
+
const { hasValidTokenSalt: hasValidTokenSalt2 } = getService$1("transfer").utils;
|
|
3917
3920
|
if (!hasValidTokenSalt2()) {
|
|
3918
3921
|
throw new TypeError("Required token salt is not defined");
|
|
3919
3922
|
}
|
|
3920
3923
|
return crypto__default.default.createHmac("sha512", strapi.config.get("admin.transfer.token.salt")).update(accessKey).digest("hex");
|
|
3921
3924
|
};
|
|
3922
3925
|
const checkSaltIsDefined = () => {
|
|
3923
|
-
const { hasValidTokenSalt: hasValidTokenSalt2 } = getService("transfer").utils;
|
|
3926
|
+
const { hasValidTokenSalt: hasValidTokenSalt2 } = getService$1("transfer").utils;
|
|
3924
3927
|
if (!strapi.config.get("server.transfer.remote.enabled")) {
|
|
3925
3928
|
return;
|
|
3926
3929
|
}
|
|
@@ -3946,7 +3949,7 @@ const assertTokenPermissionsValidity = (attributes) => {
|
|
|
3946
3949
|
const validPermissions = permissionService.providers.action.keys();
|
|
3947
3950
|
const invalidPermissions = fp.difference(attributes.permissions, validPermissions);
|
|
3948
3951
|
if (!fp.isEmpty(invalidPermissions)) {
|
|
3949
|
-
throw new ValidationError$
|
|
3952
|
+
throw new ValidationError$3(`Unknown permissions provided: ${invalidPermissions.join(", ")}`);
|
|
3950
3953
|
}
|
|
3951
3954
|
};
|
|
3952
3955
|
const isValidLifespan = (lifespan) => {
|
|
@@ -3960,7 +3963,7 @@ const isValidLifespan = (lifespan) => {
|
|
|
3960
3963
|
};
|
|
3961
3964
|
const assertValidLifespan = (lifespan) => {
|
|
3962
3965
|
if (!isValidLifespan(lifespan)) {
|
|
3963
|
-
throw new ValidationError$
|
|
3966
|
+
throw new ValidationError$3(
|
|
3964
3967
|
`lifespan must be one of the following values:
|
|
3965
3968
|
${Object.values(constants$3.TRANSFER_TOKEN_LIFESPANS).join(", ")}`
|
|
3966
3969
|
);
|
|
@@ -3986,15 +3989,15 @@ const hasValidTokenSalt = () => {
|
|
|
3986
3989
|
return typeof salt === "string" && salt.length > 0;
|
|
3987
3990
|
};
|
|
3988
3991
|
const isRemoteTransferEnabled = () => {
|
|
3989
|
-
const { utils: utils2 } = getService("transfer");
|
|
3990
|
-
if (utils$
|
|
3992
|
+
const { utils: utils2 } = getService$1("transfer");
|
|
3993
|
+
if (utils$2.env.bool("STRAPI_DISABLE_REMOTE_DATA_TRANSFER") !== void 0) {
|
|
3991
3994
|
strapi.log.warn(
|
|
3992
3995
|
"STRAPI_DISABLE_REMOTE_DATA_TRANSFER is no longer supported. Instead, set transfer.remote.enabled to false in your server configuration"
|
|
3993
3996
|
);
|
|
3994
3997
|
}
|
|
3995
3998
|
return utils2.hasValidTokenSalt() && strapi.config.get("server.transfer.remote.enabled");
|
|
3996
3999
|
};
|
|
3997
|
-
const utils = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
4000
|
+
const utils$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
3998
4001
|
__proto__: null,
|
|
3999
4002
|
hasValidTokenSalt,
|
|
4000
4003
|
isRemoteTransferEnabled
|
|
@@ -4003,7 +4006,7 @@ const transfer$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePr
|
|
|
4003
4006
|
__proto__: null,
|
|
4004
4007
|
permission: permission$1,
|
|
4005
4008
|
token: token$2,
|
|
4006
|
-
utils
|
|
4009
|
+
utils: utils$1
|
|
4007
4010
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
4008
4011
|
const PROJECT_SETTINGS_FILE_INPUTS = ["menuLogo", "authLogo"];
|
|
4009
4012
|
const parseFilesData = async (files) => {
|
|
@@ -4124,14 +4127,14 @@ const projectSettings = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.def
|
|
|
4124
4127
|
parseFilesData,
|
|
4125
4128
|
updateProjectSettings: updateProjectSettings$1
|
|
4126
4129
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
4127
|
-
const
|
|
4128
|
-
auth,
|
|
4129
|
-
user: user$
|
|
4130
|
-
role: role$
|
|
4131
|
-
passport,
|
|
4130
|
+
const services$1 = {
|
|
4131
|
+
auth: auth$1,
|
|
4132
|
+
user: user$3,
|
|
4133
|
+
role: role$3,
|
|
4134
|
+
passport: passport$1,
|
|
4132
4135
|
token: token$3,
|
|
4133
4136
|
permission: permission$2,
|
|
4134
|
-
metrics,
|
|
4137
|
+
metrics: metrics$1,
|
|
4135
4138
|
"content-type": contentType,
|
|
4136
4139
|
constants: constants$4,
|
|
4137
4140
|
condition,
|
|
@@ -4164,13 +4167,13 @@ const updateProjectSettingsImagesDimensions = zod.z.object({
|
|
|
4164
4167
|
menuLogo: logoDimensions.nullish(),
|
|
4165
4168
|
authLogo: logoDimensions.nullish()
|
|
4166
4169
|
}).strict();
|
|
4167
|
-
const validateUpdateProjectSettings = utils$
|
|
4168
|
-
const validateUpdateProjectSettingsFiles = utils$
|
|
4169
|
-
const validateUpdateProjectSettingsImagesDimensions = utils$
|
|
4170
|
+
const validateUpdateProjectSettings = utils$2.validateZod(updateProjectSettings);
|
|
4171
|
+
const validateUpdateProjectSettingsFiles = utils$2.validateZod(updateProjectSettingsFiles);
|
|
4172
|
+
const validateUpdateProjectSettingsImagesDimensions = utils$2.validateZod(
|
|
4170
4173
|
updateProjectSettingsImagesDimensions
|
|
4171
4174
|
);
|
|
4172
4175
|
const { isUsingTypeScript } = tsUtils__default.default;
|
|
4173
|
-
const admin = {
|
|
4176
|
+
const admin$3 = {
|
|
4174
4177
|
// TODO very temporary to check the switch ee/ce
|
|
4175
4178
|
// When removing this we need to update the /admin/src/index.js file
|
|
4176
4179
|
// whe,re we set the strapi.window.isEE value
|
|
@@ -4182,8 +4185,8 @@ const admin = {
|
|
|
4182
4185
|
},
|
|
4183
4186
|
async init() {
|
|
4184
4187
|
let uuid = strapi.config.get("uuid", false);
|
|
4185
|
-
const hasAdmin = await getService("user").exists();
|
|
4186
|
-
const { menuLogo, authLogo } = await getService("project-settings").getProjectSettings();
|
|
4188
|
+
const hasAdmin = await getService$1("user").exists();
|
|
4189
|
+
const { menuLogo, authLogo } = await getService$1("project-settings").getProjectSettings();
|
|
4187
4190
|
const telemetryDisabled = strapi.config.get(
|
|
4188
4191
|
"packageJsonStrapi.telemetryDisabled",
|
|
4189
4192
|
null
|
|
@@ -4201,7 +4204,7 @@ const admin = {
|
|
|
4201
4204
|
};
|
|
4202
4205
|
},
|
|
4203
4206
|
async getProjectSettings() {
|
|
4204
|
-
return getService(
|
|
4207
|
+
return getService$1(
|
|
4205
4208
|
"project-settings"
|
|
4206
4209
|
).getProjectSettings();
|
|
4207
4210
|
},
|
|
@@ -4209,7 +4212,7 @@ const admin = {
|
|
|
4209
4212
|
const {
|
|
4210
4213
|
request: { files, body }
|
|
4211
4214
|
} = ctx;
|
|
4212
|
-
const projectSettingsService = getService("project-settings");
|
|
4215
|
+
const projectSettingsService = getService$1("project-settings");
|
|
4213
4216
|
await validateUpdateProjectSettings(body);
|
|
4214
4217
|
await validateUpdateProjectSettingsFiles(files);
|
|
4215
4218
|
const formatedFiles = await projectSettingsService.parseFilesData(files);
|
|
@@ -4228,7 +4231,7 @@ const admin = {
|
|
|
4228
4231
|
const useTypescriptOnAdmin = await isUsingTypeScript(
|
|
4229
4232
|
path__default.default.join(strapi.dirs.app.root, "src", "admin")
|
|
4230
4233
|
);
|
|
4231
|
-
const isHostedOnStrapiCloud = utils$
|
|
4234
|
+
const isHostedOnStrapiCloud = utils$2.env("STRAPI_HOSTING", null) === "strapi.cloud";
|
|
4232
4235
|
const numberOfAllContentTypes = ___namespace.default.size(strapi.contentTypes);
|
|
4233
4236
|
const numberOfComponents = ___namespace.default.size(strapi.components);
|
|
4234
4237
|
const getNumberOfDynamicZones = () => {
|
|
@@ -4293,26 +4296,26 @@ const admin = {
|
|
|
4293
4296
|
ctx.send({ plugins: plugins2 });
|
|
4294
4297
|
}
|
|
4295
4298
|
};
|
|
4296
|
-
const apiTokenCreationSchema = utils$
|
|
4297
|
-
name: utils$
|
|
4298
|
-
description: utils$
|
|
4299
|
-
type: utils$
|
|
4300
|
-
permissions: utils$
|
|
4301
|
-
lifespan: utils$
|
|
4299
|
+
const apiTokenCreationSchema = utils$2.yup.object().shape({
|
|
4300
|
+
name: utils$2.yup.string().min(1).required(),
|
|
4301
|
+
description: utils$2.yup.string().optional(),
|
|
4302
|
+
type: utils$2.yup.string().oneOf(Object.values(constants$3.API_TOKEN_TYPE)).required(),
|
|
4303
|
+
permissions: utils$2.yup.array().of(utils$2.yup.string()).nullable(),
|
|
4304
|
+
lifespan: utils$2.yup.number().min(1).oneOf(Object.values(constants$3.API_TOKEN_LIFESPANS)).nullable()
|
|
4302
4305
|
}).noUnknown().strict();
|
|
4303
|
-
const apiTokenUpdateSchema = utils$
|
|
4304
|
-
name: utils$
|
|
4305
|
-
description: utils$
|
|
4306
|
-
type: utils$
|
|
4307
|
-
permissions: utils$
|
|
4306
|
+
const apiTokenUpdateSchema = utils$2.yup.object().shape({
|
|
4307
|
+
name: utils$2.yup.string().min(1).notNull(),
|
|
4308
|
+
description: utils$2.yup.string().nullable(),
|
|
4309
|
+
type: utils$2.yup.string().oneOf(Object.values(constants$3.API_TOKEN_TYPE)).notNull(),
|
|
4310
|
+
permissions: utils$2.yup.array().of(utils$2.yup.string()).nullable()
|
|
4308
4311
|
}).noUnknown().strict();
|
|
4309
|
-
const validateApiTokenCreationInput = utils$
|
|
4310
|
-
const validateApiTokenUpdateInput = utils$
|
|
4311
|
-
const { ApplicationError: ApplicationError$
|
|
4312
|
+
const validateApiTokenCreationInput = utils$2.validateYupSchema(apiTokenCreationSchema);
|
|
4313
|
+
const validateApiTokenUpdateInput = utils$2.validateYupSchema(apiTokenUpdateSchema);
|
|
4314
|
+
const { ApplicationError: ApplicationError$7 } = utils$2.errors;
|
|
4312
4315
|
const apiToken$1 = {
|
|
4313
4316
|
async create(ctx) {
|
|
4314
4317
|
const { body } = ctx.request;
|
|
4315
|
-
const apiTokenService = getService("api-token");
|
|
4318
|
+
const apiTokenService = getService$1("api-token");
|
|
4316
4319
|
const attributes = {
|
|
4317
4320
|
name: fp.trim(body.name),
|
|
4318
4321
|
description: fp.trim(body.description),
|
|
@@ -4323,14 +4326,14 @@ const apiToken$1 = {
|
|
|
4323
4326
|
await validateApiTokenCreationInput(attributes);
|
|
4324
4327
|
const alreadyExists = await apiTokenService.exists({ name: attributes.name });
|
|
4325
4328
|
if (alreadyExists) {
|
|
4326
|
-
throw new ApplicationError$
|
|
4329
|
+
throw new ApplicationError$7("Name already taken");
|
|
4327
4330
|
}
|
|
4328
4331
|
const apiToken2 = await apiTokenService.create(attributes);
|
|
4329
4332
|
ctx.created({ data: apiToken2 });
|
|
4330
4333
|
},
|
|
4331
4334
|
async regenerate(ctx) {
|
|
4332
4335
|
const { id } = ctx.params;
|
|
4333
|
-
const apiTokenService = getService("api-token");
|
|
4336
|
+
const apiTokenService = getService$1("api-token");
|
|
4334
4337
|
const apiTokenExists = await apiTokenService.getById(id);
|
|
4335
4338
|
if (!apiTokenExists) {
|
|
4336
4339
|
ctx.notFound("API Token not found");
|
|
@@ -4340,19 +4343,19 @@ const apiToken$1 = {
|
|
|
4340
4343
|
ctx.created({ data: accessToken });
|
|
4341
4344
|
},
|
|
4342
4345
|
async list(ctx) {
|
|
4343
|
-
const apiTokenService = getService("api-token");
|
|
4346
|
+
const apiTokenService = getService$1("api-token");
|
|
4344
4347
|
const apiTokens2 = await apiTokenService.list();
|
|
4345
4348
|
ctx.send({ data: apiTokens2 });
|
|
4346
4349
|
},
|
|
4347
4350
|
async revoke(ctx) {
|
|
4348
4351
|
const { id } = ctx.params;
|
|
4349
|
-
const apiTokenService = getService("api-token");
|
|
4352
|
+
const apiTokenService = getService$1("api-token");
|
|
4350
4353
|
const apiToken2 = await apiTokenService.revoke(id);
|
|
4351
4354
|
ctx.deleted({ data: apiToken2 });
|
|
4352
4355
|
},
|
|
4353
4356
|
async get(ctx) {
|
|
4354
4357
|
const { id } = ctx.params;
|
|
4355
|
-
const apiTokenService = getService("api-token");
|
|
4358
|
+
const apiTokenService = getService$1("api-token");
|
|
4356
4359
|
const apiToken2 = await apiTokenService.getById(id);
|
|
4357
4360
|
if (!apiToken2) {
|
|
4358
4361
|
ctx.notFound("API Token not found");
|
|
@@ -4363,7 +4366,7 @@ const apiToken$1 = {
|
|
|
4363
4366
|
async update(ctx) {
|
|
4364
4367
|
const { body } = ctx.request;
|
|
4365
4368
|
const { id } = ctx.params;
|
|
4366
|
-
const apiTokenService = getService("api-token");
|
|
4369
|
+
const apiTokenService = getService$1("api-token");
|
|
4367
4370
|
const attributes = body;
|
|
4368
4371
|
if (fp.has("name", attributes)) {
|
|
4369
4372
|
attributes.name = fp.trim(body.name);
|
|
@@ -4378,57 +4381,62 @@ const apiToken$1 = {
|
|
|
4378
4381
|
}
|
|
4379
4382
|
if (fp.has("name", attributes)) {
|
|
4380
4383
|
const nameAlreadyTaken = await apiTokenService.getByName(attributes.name);
|
|
4381
|
-
if (!!nameAlreadyTaken && !utils$
|
|
4382
|
-
throw new ApplicationError$
|
|
4384
|
+
if (!!nameAlreadyTaken && !utils$2.strings.isEqual(nameAlreadyTaken.id, id)) {
|
|
4385
|
+
throw new ApplicationError$7("Name already taken");
|
|
4383
4386
|
}
|
|
4384
4387
|
}
|
|
4385
4388
|
const apiToken2 = await apiTokenService.update(id, attributes);
|
|
4386
4389
|
ctx.send({ data: apiToken2 });
|
|
4387
4390
|
},
|
|
4388
4391
|
async getLayout(ctx) {
|
|
4389
|
-
const apiTokenService = getService("api-token");
|
|
4392
|
+
const apiTokenService = getService$1("api-token");
|
|
4390
4393
|
const layout = await apiTokenService.getApiTokenLayout();
|
|
4391
4394
|
ctx.send({ data: layout });
|
|
4392
4395
|
}
|
|
4393
4396
|
};
|
|
4394
|
-
const userCreationSchema = utils$
|
|
4397
|
+
const userCreationSchema = utils$2.yup.object().shape({
|
|
4395
4398
|
email: validators.email.required(),
|
|
4396
4399
|
firstname: validators.firstname.required(),
|
|
4397
4400
|
lastname: validators.lastname,
|
|
4398
4401
|
roles: validators.roles.min(1),
|
|
4399
|
-
preferedLanguage: utils$
|
|
4402
|
+
preferedLanguage: utils$2.yup.string().nullable()
|
|
4400
4403
|
}).noUnknown();
|
|
4401
|
-
const profileUpdateSchema = utils$
|
|
4404
|
+
const profileUpdateSchema = utils$2.yup.object().shape({
|
|
4402
4405
|
email: validators.email.notNull(),
|
|
4403
4406
|
firstname: validators.firstname.notNull(),
|
|
4404
4407
|
lastname: validators.lastname.nullable(),
|
|
4405
4408
|
username: validators.username.nullable(),
|
|
4406
4409
|
password: validators.password.notNull(),
|
|
4407
|
-
currentPassword: utils$
|
|
4410
|
+
currentPassword: utils$2.yup.string().when(
|
|
4408
4411
|
"password",
|
|
4409
4412
|
(password2, schema) => !fp.isUndefined(password2) ? schema.required() : schema
|
|
4410
4413
|
).notNull(),
|
|
4411
|
-
preferedLanguage: utils$
|
|
4414
|
+
preferedLanguage: utils$2.yup.string().nullable()
|
|
4412
4415
|
}).noUnknown();
|
|
4413
|
-
const userUpdateSchema = utils$
|
|
4416
|
+
const userUpdateSchema = utils$2.yup.object().shape({
|
|
4414
4417
|
email: validators.email.notNull(),
|
|
4415
4418
|
firstname: validators.firstname.notNull(),
|
|
4416
4419
|
lastname: validators.lastname.nullable(),
|
|
4417
4420
|
username: validators.username.nullable(),
|
|
4418
4421
|
password: validators.password.notNull(),
|
|
4419
|
-
isActive: utils$
|
|
4422
|
+
isActive: utils$2.yup.bool().notNull(),
|
|
4420
4423
|
roles: validators.roles.min(1).notNull()
|
|
4421
4424
|
}).noUnknown();
|
|
4422
|
-
const usersDeleteSchema = utils$
|
|
4423
|
-
ids: utils$
|
|
4425
|
+
const usersDeleteSchema = utils$2.yup.object().shape({
|
|
4426
|
+
ids: utils$2.yup.array().of(utils$2.yup.strapiID()).min(1).required()
|
|
4424
4427
|
}).noUnknown();
|
|
4425
|
-
const validateUserCreationInput = utils$
|
|
4426
|
-
const validateProfileUpdateInput = utils$
|
|
4427
|
-
const validateUserUpdateInput = utils$
|
|
4428
|
-
const validateUsersDeleteInput = utils$
|
|
4428
|
+
const validateUserCreationInput$1 = utils$2.validateYupSchema(userCreationSchema);
|
|
4429
|
+
const validateProfileUpdateInput = utils$2.validateYupSchema(profileUpdateSchema);
|
|
4430
|
+
const validateUserUpdateInput = utils$2.validateYupSchema(userUpdateSchema);
|
|
4431
|
+
const validateUsersDeleteInput = utils$2.validateYupSchema(usersDeleteSchema);
|
|
4432
|
+
const schemas = {
|
|
4433
|
+
userCreationSchema,
|
|
4434
|
+
usersDeleteSchema,
|
|
4435
|
+
userUpdateSchema
|
|
4436
|
+
};
|
|
4429
4437
|
const authenticatedUser = {
|
|
4430
4438
|
async getMe(ctx) {
|
|
4431
|
-
const userInfo = getService("user").sanitizeUser(ctx.state.user);
|
|
4439
|
+
const userInfo = getService$1("user").sanitizeUser(ctx.state.user);
|
|
4432
4440
|
ctx.body = {
|
|
4433
4441
|
data: userInfo
|
|
4434
4442
|
};
|
|
@@ -4436,8 +4444,8 @@ const authenticatedUser = {
|
|
|
4436
4444
|
async updateMe(ctx) {
|
|
4437
4445
|
const input = ctx.request.body;
|
|
4438
4446
|
await validateProfileUpdateInput(input);
|
|
4439
|
-
const userService = getService("user");
|
|
4440
|
-
const authServer = getService("auth");
|
|
4447
|
+
const userService = getService$1("user");
|
|
4448
|
+
const authServer = getService$1("auth");
|
|
4441
4449
|
const { currentPassword, ...userInfo } = input;
|
|
4442
4450
|
if (currentPassword && userInfo.password) {
|
|
4443
4451
|
const isValid = await authServer.validatePassword(currentPassword, ctx.state.user.password);
|
|
@@ -4453,7 +4461,7 @@ const authenticatedUser = {
|
|
|
4453
4461
|
};
|
|
4454
4462
|
},
|
|
4455
4463
|
async getOwnPermissions(ctx) {
|
|
4456
|
-
const { findUserPermissions: findUserPermissions2, sanitizePermission: sanitizePermission2 } = getService("permission");
|
|
4464
|
+
const { findUserPermissions: findUserPermissions2, sanitizePermission: sanitizePermission2 } = getService$1("permission");
|
|
4457
4465
|
const { user: user2 } = ctx.state;
|
|
4458
4466
|
const userPermissions = await findUserPermissions2(user2);
|
|
4459
4467
|
ctx.body = {
|
|
@@ -4462,39 +4470,39 @@ const authenticatedUser = {
|
|
|
4462
4470
|
};
|
|
4463
4471
|
}
|
|
4464
4472
|
};
|
|
4465
|
-
const registrationSchema = utils$
|
|
4466
|
-
registrationToken: utils$
|
|
4467
|
-
userInfo: utils$
|
|
4473
|
+
const registrationSchema = utils$2.yup.object().shape({
|
|
4474
|
+
registrationToken: utils$2.yup.string().required(),
|
|
4475
|
+
userInfo: utils$2.yup.object().shape({
|
|
4468
4476
|
firstname: validators.firstname.required(),
|
|
4469
4477
|
lastname: validators.lastname.nullable(),
|
|
4470
4478
|
password: validators.password.required()
|
|
4471
4479
|
}).required().noUnknown()
|
|
4472
4480
|
}).noUnknown();
|
|
4473
|
-
const registrationInfoQuerySchema = utils$
|
|
4474
|
-
registrationToken: utils$
|
|
4481
|
+
const registrationInfoQuerySchema = utils$2.yup.object().shape({
|
|
4482
|
+
registrationToken: utils$2.yup.string().required()
|
|
4475
4483
|
}).required().noUnknown();
|
|
4476
|
-
const adminRegistrationSchema = utils$
|
|
4484
|
+
const adminRegistrationSchema = utils$2.yup.object().shape({
|
|
4477
4485
|
email: validators.email.required(),
|
|
4478
4486
|
firstname: validators.firstname.required(),
|
|
4479
4487
|
lastname: validators.lastname.nullable(),
|
|
4480
4488
|
password: validators.password.required()
|
|
4481
4489
|
}).required().noUnknown();
|
|
4482
|
-
const validateRegistrationInput = utils$
|
|
4483
|
-
const validateRegistrationInfoQuery = utils$
|
|
4484
|
-
const validateAdminRegistrationInput = utils$
|
|
4485
|
-
const forgotPasswordSchema = utils$
|
|
4490
|
+
const validateRegistrationInput = utils$2.validateYupSchema(registrationSchema);
|
|
4491
|
+
const validateRegistrationInfoQuery = utils$2.validateYupSchema(registrationInfoQuerySchema);
|
|
4492
|
+
const validateAdminRegistrationInput = utils$2.validateYupSchema(adminRegistrationSchema);
|
|
4493
|
+
const forgotPasswordSchema = utils$2.yup.object().shape({
|
|
4486
4494
|
email: validators.email.required()
|
|
4487
4495
|
}).required().noUnknown();
|
|
4488
|
-
const validateForgotPasswordInput = utils$
|
|
4489
|
-
const resetPasswordSchema = utils$
|
|
4490
|
-
resetPasswordToken: utils$
|
|
4496
|
+
const validateForgotPasswordInput = utils$2.validateYupSchema(forgotPasswordSchema);
|
|
4497
|
+
const resetPasswordSchema = utils$2.yup.object().shape({
|
|
4498
|
+
resetPasswordToken: utils$2.yup.string().required(),
|
|
4491
4499
|
password: validators.password.required()
|
|
4492
4500
|
}).required().noUnknown();
|
|
4493
|
-
const validateResetPasswordInput = utils$
|
|
4494
|
-
const renewToken = utils$
|
|
4495
|
-
const validateRenewTokenInput = utils$
|
|
4496
|
-
const { ApplicationError: ApplicationError$
|
|
4497
|
-
const authentication = {
|
|
4501
|
+
const validateResetPasswordInput = utils$2.validateYupSchema(resetPasswordSchema);
|
|
4502
|
+
const renewToken = utils$2.yup.object().shape({ token: utils$2.yup.string().required() }).required().noUnknown();
|
|
4503
|
+
const validateRenewTokenInput = utils$2.validateYupSchema(renewToken);
|
|
4504
|
+
const { ApplicationError: ApplicationError$6, ValidationError: ValidationError$2 } = utils$2.errors;
|
|
4505
|
+
const authentication$1 = {
|
|
4498
4506
|
login: compose__default.default([
|
|
4499
4507
|
(ctx, next) => {
|
|
4500
4508
|
return passport__default.default.authenticate("local", { session: false }, (err, user2, info) => {
|
|
@@ -4510,11 +4518,11 @@ const authentication = {
|
|
|
4510
4518
|
error: new Error(info.message),
|
|
4511
4519
|
provider: "local"
|
|
4512
4520
|
});
|
|
4513
|
-
throw new ApplicationError$
|
|
4521
|
+
throw new ApplicationError$6(info.message);
|
|
4514
4522
|
}
|
|
4515
4523
|
const query = ctx.state;
|
|
4516
4524
|
query.user = user2;
|
|
4517
|
-
const sanitizedUser = getService("user").sanitizeUser(user2);
|
|
4525
|
+
const sanitizedUser = getService$1("user").sanitizeUser(user2);
|
|
4518
4526
|
strapi.eventHub.emit("admin.auth.success", { user: sanitizedUser, provider: "local" });
|
|
4519
4527
|
return next();
|
|
4520
4528
|
})(ctx, next);
|
|
@@ -4523,8 +4531,8 @@ const authentication = {
|
|
|
4523
4531
|
const { user: user2 } = ctx.state;
|
|
4524
4532
|
ctx.body = {
|
|
4525
4533
|
data: {
|
|
4526
|
-
token: getService("token").createJwtToken(user2),
|
|
4527
|
-
user: getService("user").sanitizeUser(ctx.state.user)
|
|
4534
|
+
token: getService$1("token").createJwtToken(user2),
|
|
4535
|
+
user: getService$1("user").sanitizeUser(ctx.state.user)
|
|
4528
4536
|
// TODO: fetch more detailed info
|
|
4529
4537
|
}
|
|
4530
4538
|
};
|
|
@@ -4533,50 +4541,50 @@ const authentication = {
|
|
|
4533
4541
|
async renewToken(ctx) {
|
|
4534
4542
|
await validateRenewTokenInput(ctx.request.body);
|
|
4535
4543
|
const { token: token2 } = ctx.request.body;
|
|
4536
|
-
const { isValid, payload } = getService("token").decodeJwtToken(token2);
|
|
4544
|
+
const { isValid, payload } = getService$1("token").decodeJwtToken(token2);
|
|
4537
4545
|
if (!isValid) {
|
|
4538
|
-
throw new ValidationError("Invalid token");
|
|
4546
|
+
throw new ValidationError$2("Invalid token");
|
|
4539
4547
|
}
|
|
4540
4548
|
ctx.body = {
|
|
4541
4549
|
data: {
|
|
4542
|
-
token: getService("token").createJwtToken({ id: payload.id })
|
|
4550
|
+
token: getService$1("token").createJwtToken({ id: payload.id })
|
|
4543
4551
|
}
|
|
4544
4552
|
};
|
|
4545
4553
|
},
|
|
4546
4554
|
async registrationInfo(ctx) {
|
|
4547
4555
|
await validateRegistrationInfoQuery(ctx.request.query);
|
|
4548
4556
|
const { registrationToken } = ctx.request.query;
|
|
4549
|
-
const registrationInfo = await getService("user").findRegistrationInfo(registrationToken);
|
|
4557
|
+
const registrationInfo = await getService$1("user").findRegistrationInfo(registrationToken);
|
|
4550
4558
|
if (!registrationInfo) {
|
|
4551
|
-
throw new ValidationError("Invalid registrationToken");
|
|
4559
|
+
throw new ValidationError$2("Invalid registrationToken");
|
|
4552
4560
|
}
|
|
4553
4561
|
ctx.body = { data: registrationInfo };
|
|
4554
4562
|
},
|
|
4555
4563
|
async register(ctx) {
|
|
4556
4564
|
const input = ctx.request.body;
|
|
4557
4565
|
await validateRegistrationInput(input);
|
|
4558
|
-
const user2 = await getService("user").register(input);
|
|
4566
|
+
const user2 = await getService$1("user").register(input);
|
|
4559
4567
|
ctx.body = {
|
|
4560
4568
|
data: {
|
|
4561
|
-
token: getService("token").createJwtToken(user2),
|
|
4562
|
-
user: getService("user").sanitizeUser(user2)
|
|
4569
|
+
token: getService$1("token").createJwtToken(user2),
|
|
4570
|
+
user: getService$1("user").sanitizeUser(user2)
|
|
4563
4571
|
}
|
|
4564
4572
|
};
|
|
4565
4573
|
},
|
|
4566
4574
|
async registerAdmin(ctx) {
|
|
4567
4575
|
const input = ctx.request.body;
|
|
4568
4576
|
await validateAdminRegistrationInput(input);
|
|
4569
|
-
const hasAdmin = await getService("user").exists();
|
|
4577
|
+
const hasAdmin = await getService$1("user").exists();
|
|
4570
4578
|
if (hasAdmin) {
|
|
4571
|
-
throw new ApplicationError$
|
|
4579
|
+
throw new ApplicationError$6("You cannot register a new super admin");
|
|
4572
4580
|
}
|
|
4573
|
-
const superAdminRole = await getService("role").getSuperAdmin();
|
|
4581
|
+
const superAdminRole = await getService$1("role").getSuperAdmin();
|
|
4574
4582
|
if (!superAdminRole) {
|
|
4575
|
-
throw new ApplicationError$
|
|
4583
|
+
throw new ApplicationError$6(
|
|
4576
4584
|
"Cannot register the first admin because the super admin role doesn't exist."
|
|
4577
4585
|
);
|
|
4578
4586
|
}
|
|
4579
|
-
const user2 = await getService("user").create({
|
|
4587
|
+
const user2 = await getService$1("user").create({
|
|
4580
4588
|
...input,
|
|
4581
4589
|
registrationToken: null,
|
|
4582
4590
|
isActive: true,
|
|
@@ -4585,30 +4593,30 @@ const authentication = {
|
|
|
4585
4593
|
strapi.telemetry.send("didCreateFirstAdmin");
|
|
4586
4594
|
ctx.body = {
|
|
4587
4595
|
data: {
|
|
4588
|
-
token: getService("token").createJwtToken(user2),
|
|
4589
|
-
user: getService("user").sanitizeUser(user2)
|
|
4596
|
+
token: getService$1("token").createJwtToken(user2),
|
|
4597
|
+
user: getService$1("user").sanitizeUser(user2)
|
|
4590
4598
|
}
|
|
4591
4599
|
};
|
|
4592
4600
|
},
|
|
4593
4601
|
async forgotPassword(ctx) {
|
|
4594
4602
|
const input = ctx.request.body;
|
|
4595
4603
|
await validateForgotPasswordInput(input);
|
|
4596
|
-
getService("auth").forgotPassword(input);
|
|
4604
|
+
getService$1("auth").forgotPassword(input);
|
|
4597
4605
|
ctx.status = 204;
|
|
4598
4606
|
},
|
|
4599
4607
|
async resetPassword(ctx) {
|
|
4600
4608
|
const input = ctx.request.body;
|
|
4601
4609
|
await validateResetPasswordInput(input);
|
|
4602
|
-
const user2 = await getService("auth").resetPassword(input);
|
|
4610
|
+
const user2 = await getService$1("auth").resetPassword(input);
|
|
4603
4611
|
ctx.body = {
|
|
4604
4612
|
data: {
|
|
4605
|
-
token: getService("token").createJwtToken(user2),
|
|
4606
|
-
user: getService("user").sanitizeUser(user2)
|
|
4613
|
+
token: getService$1("token").createJwtToken(user2),
|
|
4614
|
+
user: getService$1("user").sanitizeUser(user2)
|
|
4607
4615
|
}
|
|
4608
4616
|
};
|
|
4609
4617
|
},
|
|
4610
4618
|
logout(ctx) {
|
|
4611
|
-
const sanitizedUser = getService("user").sanitizeUser(ctx.state.user);
|
|
4619
|
+
const sanitizedUser = getService$1("user").sanitizeUser(ctx.state.user);
|
|
4612
4620
|
strapi.eventHub.emit("admin.logout", { user: sanitizedUser });
|
|
4613
4621
|
ctx.body = { data: {} };
|
|
4614
4622
|
}
|
|
@@ -4624,7 +4632,7 @@ const permission = {
|
|
|
4624
4632
|
const { body: input } = ctx.request;
|
|
4625
4633
|
const { userAbility } = ctx.state;
|
|
4626
4634
|
await validateCheckPermissionsInput(input);
|
|
4627
|
-
const { engine: engine2 } = getService("permission");
|
|
4635
|
+
const { engine: engine2 } = getService$1("permission");
|
|
4628
4636
|
const checkPermissionsFn = engine2.checkMany(userAbility);
|
|
4629
4637
|
ctx.body = {
|
|
4630
4638
|
data: checkPermissionsFn(input.permissions)
|
|
@@ -4635,7 +4643,7 @@ const permission = {
|
|
|
4635
4643
|
* @param {KoaContext} ctx - koa context
|
|
4636
4644
|
*/
|
|
4637
4645
|
async getAll(ctx) {
|
|
4638
|
-
const { sectionsBuilder: sectionsBuilder2, actionProvider: actionProvider2, conditionProvider: conditionProvider2 } = getService("permission");
|
|
4646
|
+
const { sectionsBuilder: sectionsBuilder2, actionProvider: actionProvider2, conditionProvider: conditionProvider2 } = getService$1("permission");
|
|
4639
4647
|
const actions2 = actionProvider2.values();
|
|
4640
4648
|
const conditions2 = conditionProvider2.values();
|
|
4641
4649
|
const sections = await sectionsBuilder2.build(actions2);
|
|
@@ -4648,12 +4656,12 @@ const permission = {
|
|
|
4648
4656
|
};
|
|
4649
4657
|
}
|
|
4650
4658
|
};
|
|
4651
|
-
const roleCreateSchema = utils$
|
|
4652
|
-
name: utils$
|
|
4653
|
-
description: utils$
|
|
4659
|
+
const roleCreateSchema$1 = utils$2.yup.object().shape({
|
|
4660
|
+
name: utils$2.yup.string().min(1).required(),
|
|
4661
|
+
description: utils$2.yup.string().nullable()
|
|
4654
4662
|
}).noUnknown();
|
|
4655
|
-
const rolesDeleteSchema = utils$
|
|
4656
|
-
ids: utils$
|
|
4663
|
+
const rolesDeleteSchema$1 = utils$2.yup.object().shape({
|
|
4664
|
+
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) {
|
|
4657
4665
|
try {
|
|
4658
4666
|
await strapi.service("admin::role").checkRolesIdForDeletion(ids);
|
|
4659
4667
|
} catch (e) {
|
|
@@ -4662,7 +4670,7 @@ const rolesDeleteSchema = utils$1.yup.object().shape({
|
|
|
4662
4670
|
return true;
|
|
4663
4671
|
})
|
|
4664
4672
|
}).noUnknown();
|
|
4665
|
-
const roleDeleteSchema = utils$
|
|
4673
|
+
const roleDeleteSchema$1 = utils$2.yup.strapiID().required().test("no-admin-single-delete", "Role deletion checks have failed", async function(id) {
|
|
4666
4674
|
try {
|
|
4667
4675
|
await strapi.service("admin::role").checkRolesIdForDeletion([id]);
|
|
4668
4676
|
} catch (e) {
|
|
@@ -4670,25 +4678,25 @@ const roleDeleteSchema = utils$1.yup.strapiID().required().test("no-admin-single
|
|
|
4670
4678
|
}
|
|
4671
4679
|
return true;
|
|
4672
4680
|
});
|
|
4673
|
-
const roleUpdateSchema = utils$
|
|
4674
|
-
name: utils$
|
|
4675
|
-
description: utils$
|
|
4681
|
+
const roleUpdateSchema = utils$2.yup.object().shape({
|
|
4682
|
+
name: utils$2.yup.string().min(1),
|
|
4683
|
+
description: utils$2.yup.string().nullable()
|
|
4676
4684
|
}).noUnknown();
|
|
4677
|
-
const validateRoleCreateInput = utils$
|
|
4678
|
-
const validateRoleUpdateInput = utils$
|
|
4679
|
-
const validateRolesDeleteInput = utils$
|
|
4680
|
-
const validateRoleDeleteInput = utils$
|
|
4681
|
-
const { ApplicationError: ApplicationError$
|
|
4682
|
-
const { SUPER_ADMIN_CODE } = constants$3;
|
|
4683
|
-
const role = {
|
|
4685
|
+
const validateRoleCreateInput$1 = utils$2.validateYupSchema(roleCreateSchema$1);
|
|
4686
|
+
const validateRoleUpdateInput = utils$2.validateYupSchema(roleUpdateSchema);
|
|
4687
|
+
const validateRolesDeleteInput$1 = utils$2.validateYupSchema(rolesDeleteSchema$1);
|
|
4688
|
+
const validateRoleDeleteInput$1 = utils$2.validateYupSchema(roleDeleteSchema$1);
|
|
4689
|
+
const { ApplicationError: ApplicationError$5 } = utils$2.errors;
|
|
4690
|
+
const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$2 } = constants$3;
|
|
4691
|
+
const role$2 = {
|
|
4684
4692
|
/**
|
|
4685
4693
|
* Create a new role
|
|
4686
4694
|
* @param {KoaContext} ctx - koa context
|
|
4687
4695
|
*/
|
|
4688
4696
|
async create(ctx) {
|
|
4689
4697
|
const { body } = ctx.request;
|
|
4690
|
-
await validateRoleCreateInput(body);
|
|
4691
|
-
const roleService = getService("role");
|
|
4698
|
+
await validateRoleCreateInput$1(body);
|
|
4699
|
+
const roleService = getService$1("role");
|
|
4692
4700
|
const role2 = await roleService.create(body);
|
|
4693
4701
|
const sanitizedRole = roleService.sanitizeRole(role2);
|
|
4694
4702
|
ctx.created({ data: sanitizedRole });
|
|
@@ -4699,7 +4707,7 @@ const role = {
|
|
|
4699
4707
|
*/
|
|
4700
4708
|
async findOne(ctx) {
|
|
4701
4709
|
const { id } = ctx.params;
|
|
4702
|
-
const role2 = await getService("role").findOneWithUsersCount({ id });
|
|
4710
|
+
const role2 = await getService$1("role").findOneWithUsersCount({ id });
|
|
4703
4711
|
if (!role2) {
|
|
4704
4712
|
return ctx.notFound("role.notFound");
|
|
4705
4713
|
}
|
|
@@ -4713,13 +4721,13 @@ const role = {
|
|
|
4713
4721
|
*/
|
|
4714
4722
|
async findAll(ctx) {
|
|
4715
4723
|
const { query } = ctx.request;
|
|
4716
|
-
const permissionsManager = getService("permission").createPermissionsManager({
|
|
4724
|
+
const permissionsManager = getService$1("permission").createPermissionsManager({
|
|
4717
4725
|
ability: ctx.state.userAbility,
|
|
4718
4726
|
model: "admin::role"
|
|
4719
4727
|
});
|
|
4720
4728
|
await permissionsManager.validateQuery(query);
|
|
4721
4729
|
const sanitizedQuery = await permissionsManager.sanitizeQuery(query);
|
|
4722
|
-
const roles2 = await getService("role").findAllWithUsersCount(sanitizedQuery);
|
|
4730
|
+
const roles2 = await getService$1("role").findAllWithUsersCount(sanitizedQuery);
|
|
4723
4731
|
ctx.body = {
|
|
4724
4732
|
data: roles2
|
|
4725
4733
|
};
|
|
@@ -4731,14 +4739,14 @@ const role = {
|
|
|
4731
4739
|
async update(ctx) {
|
|
4732
4740
|
const { id } = ctx.params;
|
|
4733
4741
|
const { body } = ctx.request;
|
|
4734
|
-
const roleService = getService("role");
|
|
4742
|
+
const roleService = getService$1("role");
|
|
4735
4743
|
await validateRoleUpdateInput(body);
|
|
4736
4744
|
const role2 = await roleService.findOne({ id });
|
|
4737
4745
|
if (!role2) {
|
|
4738
4746
|
return ctx.notFound("role.notFound");
|
|
4739
4747
|
}
|
|
4740
|
-
if (role2.code === SUPER_ADMIN_CODE) {
|
|
4741
|
-
throw new ApplicationError$
|
|
4748
|
+
if (role2.code === SUPER_ADMIN_CODE$2) {
|
|
4749
|
+
throw new ApplicationError$5("Super admin can't be edited.");
|
|
4742
4750
|
}
|
|
4743
4751
|
const updatedRole = await roleService.update({ id }, body);
|
|
4744
4752
|
const sanitizedRole = roleService.sanitizeRole(updatedRole);
|
|
@@ -4752,8 +4760,8 @@ const role = {
|
|
|
4752
4760
|
*/
|
|
4753
4761
|
async getPermissions(ctx) {
|
|
4754
4762
|
const { id } = ctx.params;
|
|
4755
|
-
const roleService = getService("role");
|
|
4756
|
-
const permissionService = getService("permission");
|
|
4763
|
+
const roleService = getService$1("role");
|
|
4764
|
+
const permissionService = getService$1("permission");
|
|
4757
4765
|
const role2 = await roleService.findOne({ id });
|
|
4758
4766
|
if (!role2) {
|
|
4759
4767
|
return ctx.notFound("role.notFound");
|
|
@@ -4772,14 +4780,14 @@ const role = {
|
|
|
4772
4780
|
async updatePermissions(ctx) {
|
|
4773
4781
|
const { id } = ctx.params;
|
|
4774
4782
|
const { body: input } = ctx.request;
|
|
4775
|
-
const roleService = getService("role");
|
|
4776
|
-
const permissionService = getService("permission");
|
|
4783
|
+
const roleService = getService$1("role");
|
|
4784
|
+
const permissionService = getService$1("permission");
|
|
4777
4785
|
const role2 = await roleService.findOne({ id });
|
|
4778
4786
|
if (!role2) {
|
|
4779
4787
|
return ctx.notFound("role.notFound");
|
|
4780
4788
|
}
|
|
4781
|
-
if (role2.code === SUPER_ADMIN_CODE) {
|
|
4782
|
-
throw new ApplicationError$
|
|
4789
|
+
if (role2.code === SUPER_ADMIN_CODE$2) {
|
|
4790
|
+
throw new ApplicationError$5("Super admin permissions can't be edited.");
|
|
4783
4791
|
}
|
|
4784
4792
|
await validatedUpdatePermissionsInput(input);
|
|
4785
4793
|
if (!role2) {
|
|
@@ -4797,8 +4805,8 @@ const role = {
|
|
|
4797
4805
|
*/
|
|
4798
4806
|
async deleteOne(ctx) {
|
|
4799
4807
|
const { id } = ctx.params;
|
|
4800
|
-
await validateRoleDeleteInput(id);
|
|
4801
|
-
const roleService = getService("role");
|
|
4808
|
+
await validateRoleDeleteInput$1(id);
|
|
4809
|
+
const roleService = getService$1("role");
|
|
4802
4810
|
const roles2 = await roleService.deleteByIds([id]);
|
|
4803
4811
|
const sanitizedRole = roles2.map((role2) => roleService.sanitizeRole(role2))[0] || null;
|
|
4804
4812
|
return ctx.deleted({
|
|
@@ -4811,8 +4819,8 @@ const role = {
|
|
|
4811
4819
|
*/
|
|
4812
4820
|
async deleteMany(ctx) {
|
|
4813
4821
|
const { body } = ctx.request;
|
|
4814
|
-
await validateRolesDeleteInput(body);
|
|
4815
|
-
const roleService = getService("role");
|
|
4822
|
+
await validateRolesDeleteInput$1(body);
|
|
4823
|
+
const roleService = getService$1("role");
|
|
4816
4824
|
const roles2 = await roleService.deleteByIds(body.ids);
|
|
4817
4825
|
const sanitizedRoles = roles2.map(roleService.sanitizeRole);
|
|
4818
4826
|
return ctx.deleted({
|
|
@@ -4825,11 +4833,11 @@ const {
|
|
|
4825
4833
|
handlers: { createPushController, createPullController }
|
|
4826
4834
|
}
|
|
4827
4835
|
} = dataTransfer$1.strapi;
|
|
4828
|
-
const { UnauthorizedError } = utils$
|
|
4836
|
+
const { UnauthorizedError: UnauthorizedError$1 } = utils$2.errors;
|
|
4829
4837
|
const verify = async (ctx, scope) => {
|
|
4830
4838
|
const { auth: auth2 } = ctx.state;
|
|
4831
4839
|
if (!auth2) {
|
|
4832
|
-
throw new UnauthorizedError();
|
|
4840
|
+
throw new UnauthorizedError$1();
|
|
4833
4841
|
}
|
|
4834
4842
|
await dataTransferAuthStrategy.verify(auth2, { scope });
|
|
4835
4843
|
};
|
|
@@ -4839,34 +4847,34 @@ const runner = {
|
|
|
4839
4847
|
push,
|
|
4840
4848
|
pull
|
|
4841
4849
|
};
|
|
4842
|
-
const transferTokenCreationSchema = utils$
|
|
4843
|
-
name: utils$
|
|
4844
|
-
description: utils$
|
|
4845
|
-
permissions: utils$
|
|
4846
|
-
lifespan: utils$
|
|
4850
|
+
const transferTokenCreationSchema = utils$2.yup.object().shape({
|
|
4851
|
+
name: utils$2.yup.string().min(1).required(),
|
|
4852
|
+
description: utils$2.yup.string().optional(),
|
|
4853
|
+
permissions: utils$2.yup.array().min(1).of(utils$2.yup.string().oneOf(Object.values(constants$3.TRANSFER_TOKEN_TYPE))).required(),
|
|
4854
|
+
lifespan: utils$2.yup.number().min(1).oneOf(Object.values(constants$3.TRANSFER_TOKEN_LIFESPANS)).nullable()
|
|
4847
4855
|
}).noUnknown().strict();
|
|
4848
|
-
const transferTokenUpdateSchema = utils$
|
|
4849
|
-
name: utils$
|
|
4850
|
-
description: utils$
|
|
4851
|
-
permissions: utils$
|
|
4856
|
+
const transferTokenUpdateSchema = utils$2.yup.object().shape({
|
|
4857
|
+
name: utils$2.yup.string().min(1).notNull(),
|
|
4858
|
+
description: utils$2.yup.string().nullable(),
|
|
4859
|
+
permissions: utils$2.yup.array().min(1).of(utils$2.yup.string().oneOf(Object.values(constants$3.TRANSFER_TOKEN_TYPE))).nullable()
|
|
4852
4860
|
}).noUnknown().strict();
|
|
4853
|
-
const validateTransferTokenCreationInput$1 = utils$
|
|
4854
|
-
const validateTransferTokenUpdateInput$1 = utils$
|
|
4861
|
+
const validateTransferTokenCreationInput$1 = utils$2.validateYupSchema(transferTokenCreationSchema);
|
|
4862
|
+
const validateTransferTokenUpdateInput$1 = utils$2.validateYupSchema(transferTokenUpdateSchema);
|
|
4855
4863
|
const token$1 = {
|
|
4856
4864
|
validateTransferTokenCreationInput: validateTransferTokenCreationInput$1,
|
|
4857
4865
|
validateTransferTokenUpdateInput: validateTransferTokenUpdateInput$1
|
|
4858
4866
|
};
|
|
4859
|
-
const { ApplicationError: ApplicationError$
|
|
4867
|
+
const { ApplicationError: ApplicationError$4 } = utils$2.errors;
|
|
4860
4868
|
const { validateTransferTokenCreationInput, validateTransferTokenUpdateInput } = token$1;
|
|
4861
4869
|
const token = {
|
|
4862
4870
|
async list(ctx) {
|
|
4863
|
-
const transferService = getService("transfer");
|
|
4871
|
+
const transferService = getService$1("transfer");
|
|
4864
4872
|
const transferTokens = await transferService.token.list();
|
|
4865
4873
|
ctx.body = { data: transferTokens };
|
|
4866
4874
|
},
|
|
4867
4875
|
async getById(ctx) {
|
|
4868
4876
|
const { id } = ctx.params;
|
|
4869
|
-
const tokenService = getService("transfer").token;
|
|
4877
|
+
const tokenService = getService$1("transfer").token;
|
|
4870
4878
|
const transferToken2 = await tokenService.getById(id);
|
|
4871
4879
|
if (!transferToken2) {
|
|
4872
4880
|
ctx.notFound("Transfer token not found");
|
|
@@ -4876,7 +4884,7 @@ const token = {
|
|
|
4876
4884
|
},
|
|
4877
4885
|
async create(ctx) {
|
|
4878
4886
|
const { body } = ctx.request;
|
|
4879
|
-
const { token: tokenService } = getService("transfer");
|
|
4887
|
+
const { token: tokenService } = getService$1("transfer");
|
|
4880
4888
|
const attributes = {
|
|
4881
4889
|
name: fp.trim(body.name),
|
|
4882
4890
|
description: fp.trim(body.description),
|
|
@@ -4886,7 +4894,7 @@ const token = {
|
|
|
4886
4894
|
await validateTransferTokenCreationInput(attributes);
|
|
4887
4895
|
const alreadyExists = await tokenService.exists({ name: attributes.name });
|
|
4888
4896
|
if (alreadyExists) {
|
|
4889
|
-
throw new ApplicationError$
|
|
4897
|
+
throw new ApplicationError$4("Name already taken");
|
|
4890
4898
|
}
|
|
4891
4899
|
const transferTokens = await tokenService.create(attributes);
|
|
4892
4900
|
ctx.created({ data: transferTokens });
|
|
@@ -4894,7 +4902,7 @@ const token = {
|
|
|
4894
4902
|
async update(ctx) {
|
|
4895
4903
|
const { body } = ctx.request;
|
|
4896
4904
|
const { id } = ctx.params;
|
|
4897
|
-
const { token: tokenService } = getService("transfer");
|
|
4905
|
+
const { token: tokenService } = getService$1("transfer");
|
|
4898
4906
|
const attributes = body;
|
|
4899
4907
|
if (fp.has("name", attributes)) {
|
|
4900
4908
|
attributes.name = fp.trim(body.name);
|
|
@@ -4909,8 +4917,8 @@ const token = {
|
|
|
4909
4917
|
}
|
|
4910
4918
|
if (fp.has("name", attributes)) {
|
|
4911
4919
|
const nameAlreadyTaken = await tokenService.getByName(attributes.name);
|
|
4912
|
-
if (!!nameAlreadyTaken && !utils$
|
|
4913
|
-
throw new ApplicationError$
|
|
4920
|
+
if (!!nameAlreadyTaken && !utils$2.strings.isEqual(nameAlreadyTaken.id, id)) {
|
|
4921
|
+
throw new ApplicationError$4("Name already taken");
|
|
4914
4922
|
}
|
|
4915
4923
|
}
|
|
4916
4924
|
const apiToken2 = await tokenService.update(id, attributes);
|
|
@@ -4918,13 +4926,13 @@ const token = {
|
|
|
4918
4926
|
},
|
|
4919
4927
|
async revoke(ctx) {
|
|
4920
4928
|
const { id } = ctx.params;
|
|
4921
|
-
const { token: tokenService } = getService("transfer");
|
|
4929
|
+
const { token: tokenService } = getService$1("transfer");
|
|
4922
4930
|
const transferToken2 = await tokenService.revoke(id);
|
|
4923
4931
|
ctx.deleted({ data: transferToken2 });
|
|
4924
4932
|
},
|
|
4925
4933
|
async regenerate(ctx) {
|
|
4926
4934
|
const { id } = ctx.params;
|
|
4927
|
-
const { token: tokenService } = getService("transfer");
|
|
4935
|
+
const { token: tokenService } = getService$1("transfer");
|
|
4928
4936
|
const exists2 = await tokenService.getById(id);
|
|
4929
4937
|
if (!exists2) {
|
|
4930
4938
|
ctx.notFound("Transfer token not found");
|
|
@@ -4939,12 +4947,12 @@ const transfer = {
|
|
|
4939
4947
|
...prefixActionsName("runner", runner),
|
|
4940
4948
|
...prefixActionsName("token", token)
|
|
4941
4949
|
};
|
|
4942
|
-
const { ApplicationError } = utils$
|
|
4943
|
-
const user = {
|
|
4950
|
+
const { ApplicationError: ApplicationError$3 } = utils$2.errors;
|
|
4951
|
+
const user$2 = {
|
|
4944
4952
|
async create(ctx) {
|
|
4945
4953
|
const { body } = ctx.request;
|
|
4946
4954
|
const cleanData = { ...body, email: ___namespace.get(body, `email`, ``).toLowerCase() };
|
|
4947
|
-
await validateUserCreationInput(cleanData);
|
|
4955
|
+
await validateUserCreationInput$1(cleanData);
|
|
4948
4956
|
const attributes = ___namespace.pick(cleanData, [
|
|
4949
4957
|
"firstname",
|
|
4950
4958
|
"lastname",
|
|
@@ -4952,19 +4960,19 @@ const user = {
|
|
|
4952
4960
|
"roles",
|
|
4953
4961
|
"preferedLanguage"
|
|
4954
4962
|
]);
|
|
4955
|
-
const userAlreadyExists = await getService("user").exists({
|
|
4963
|
+
const userAlreadyExists = await getService$1("user").exists({
|
|
4956
4964
|
email: attributes.email
|
|
4957
4965
|
});
|
|
4958
4966
|
if (userAlreadyExists) {
|
|
4959
|
-
throw new ApplicationError("Email already taken");
|
|
4967
|
+
throw new ApplicationError$3("Email already taken");
|
|
4960
4968
|
}
|
|
4961
|
-
const createdUser = await getService("user").create(attributes);
|
|
4962
|
-
const userInfo = getService("user").sanitizeUser(createdUser);
|
|
4969
|
+
const createdUser = await getService$1("user").create(attributes);
|
|
4970
|
+
const userInfo = getService$1("user").sanitizeUser(createdUser);
|
|
4963
4971
|
Object.assign(userInfo, { registrationToken: createdUser.registrationToken });
|
|
4964
4972
|
ctx.created({ data: userInfo });
|
|
4965
4973
|
},
|
|
4966
4974
|
async find(ctx) {
|
|
4967
|
-
const userService = getService("user");
|
|
4975
|
+
const userService = getService$1("user");
|
|
4968
4976
|
const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
4969
4977
|
ability: ctx.state.userAbility,
|
|
4970
4978
|
model: "admin::user"
|
|
@@ -4981,12 +4989,12 @@ const user = {
|
|
|
4981
4989
|
},
|
|
4982
4990
|
async findOne(ctx) {
|
|
4983
4991
|
const { id } = ctx.params;
|
|
4984
|
-
const user2 = await getService("user").findOne(id);
|
|
4992
|
+
const user2 = await getService$1("user").findOne(id);
|
|
4985
4993
|
if (!user2) {
|
|
4986
4994
|
return ctx.notFound("User does not exist");
|
|
4987
4995
|
}
|
|
4988
4996
|
ctx.body = {
|
|
4989
|
-
data: getService("user").sanitizeUser(user2)
|
|
4997
|
+
data: getService$1("user").sanitizeUser(user2)
|
|
4990
4998
|
};
|
|
4991
4999
|
},
|
|
4992
5000
|
async update(ctx) {
|
|
@@ -4994,30 +5002,30 @@ const user = {
|
|
|
4994
5002
|
const { body: input } = ctx.request;
|
|
4995
5003
|
await validateUserUpdateInput(input);
|
|
4996
5004
|
if (___namespace.has(input, "email")) {
|
|
4997
|
-
const uniqueEmailCheck = await getService("user").exists({
|
|
5005
|
+
const uniqueEmailCheck = await getService$1("user").exists({
|
|
4998
5006
|
id: { $ne: id },
|
|
4999
5007
|
email: input.email
|
|
5000
5008
|
});
|
|
5001
5009
|
if (uniqueEmailCheck) {
|
|
5002
|
-
throw new ApplicationError("A user with this email address already exists");
|
|
5010
|
+
throw new ApplicationError$3("A user with this email address already exists");
|
|
5003
5011
|
}
|
|
5004
5012
|
}
|
|
5005
|
-
const updatedUser = await getService("user").updateById(id, input);
|
|
5013
|
+
const updatedUser = await getService$1("user").updateById(id, input);
|
|
5006
5014
|
if (!updatedUser) {
|
|
5007
5015
|
return ctx.notFound("User does not exist");
|
|
5008
5016
|
}
|
|
5009
5017
|
ctx.body = {
|
|
5010
|
-
data: getService("user").sanitizeUser(updatedUser)
|
|
5018
|
+
data: getService$1("user").sanitizeUser(updatedUser)
|
|
5011
5019
|
};
|
|
5012
5020
|
},
|
|
5013
5021
|
async deleteOne(ctx) {
|
|
5014
5022
|
const { id } = ctx.params;
|
|
5015
|
-
const deletedUser = await getService("user").deleteById(id);
|
|
5023
|
+
const deletedUser = await getService$1("user").deleteById(id);
|
|
5016
5024
|
if (!deletedUser) {
|
|
5017
5025
|
return ctx.notFound("User not found");
|
|
5018
5026
|
}
|
|
5019
5027
|
return ctx.deleted({
|
|
5020
|
-
data: getService("user").sanitizeUser(deletedUser)
|
|
5028
|
+
data: getService$1("user").sanitizeUser(deletedUser)
|
|
5021
5029
|
});
|
|
5022
5030
|
},
|
|
5023
5031
|
/**
|
|
@@ -5027,17 +5035,17 @@ const user = {
|
|
|
5027
5035
|
async deleteMany(ctx) {
|
|
5028
5036
|
const { body } = ctx.request;
|
|
5029
5037
|
await validateUsersDeleteInput(body);
|
|
5030
|
-
const users2 = await getService("user").deleteByIds(body.ids);
|
|
5031
|
-
const sanitizedUsers = users2.map(getService("user").sanitizeUser);
|
|
5038
|
+
const users2 = await getService$1("user").deleteByIds(body.ids);
|
|
5039
|
+
const sanitizedUsers = users2.map(getService$1("user").sanitizeUser);
|
|
5032
5040
|
return ctx.deleted({
|
|
5033
5041
|
data: sanitizedUsers
|
|
5034
5042
|
});
|
|
5035
5043
|
}
|
|
5036
5044
|
};
|
|
5037
5045
|
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*)?$/;
|
|
5038
|
-
const webhookValidator = utils$
|
|
5039
|
-
name: utils$
|
|
5040
|
-
url: utils$
|
|
5046
|
+
const webhookValidator = utils$2.yup.object({
|
|
5047
|
+
name: utils$2.yup.string().required(),
|
|
5048
|
+
url: utils$2.yup.string().matches(urlRegex, "url must be a valid URL").required().test(
|
|
5041
5049
|
"is-public-url",
|
|
5042
5050
|
"Url is not supported because it isn't reachable over the public internet",
|
|
5043
5051
|
async (url) => {
|
|
@@ -5053,21 +5061,21 @@ const webhookValidator = utils$1.yup.object({
|
|
|
5053
5061
|
}
|
|
5054
5062
|
}
|
|
5055
5063
|
),
|
|
5056
|
-
headers: utils$
|
|
5064
|
+
headers: utils$2.yup.lazy((data) => {
|
|
5057
5065
|
if (typeof data !== "object") {
|
|
5058
|
-
return utils$
|
|
5066
|
+
return utils$2.yup.object().required();
|
|
5059
5067
|
}
|
|
5060
|
-
return utils$
|
|
5068
|
+
return utils$2.yup.object(
|
|
5061
5069
|
// @ts-expect-error lodash types
|
|
5062
5070
|
___namespace.default.mapValues(data, () => {
|
|
5063
|
-
utils$
|
|
5071
|
+
utils$2.yup.string().min(1).required();
|
|
5064
5072
|
})
|
|
5065
5073
|
).required();
|
|
5066
5074
|
}),
|
|
5067
|
-
events: utils$
|
|
5075
|
+
events: utils$2.yup.array().of(utils$2.yup.string()).required()
|
|
5068
5076
|
}).noUnknown();
|
|
5069
5077
|
const updateWebhookValidator = webhookValidator.shape({
|
|
5070
|
-
isEnabled: utils$
|
|
5078
|
+
isEnabled: utils$2.yup.boolean()
|
|
5071
5079
|
});
|
|
5072
5080
|
const webhooks = {
|
|
5073
5081
|
async listWebhooks(ctx) {
|
|
@@ -5084,7 +5092,7 @@ const webhooks = {
|
|
|
5084
5092
|
},
|
|
5085
5093
|
async createWebhook(ctx) {
|
|
5086
5094
|
const { body } = ctx.request;
|
|
5087
|
-
await utils$
|
|
5095
|
+
await utils$2.validateYupSchema(webhookValidator)(body);
|
|
5088
5096
|
const webhook = await strapi.get("webhookStore").createWebhook(body);
|
|
5089
5097
|
strapi.get("webhookRunner").add(webhook);
|
|
5090
5098
|
ctx.created({ data: webhook });
|
|
@@ -5092,7 +5100,7 @@ const webhooks = {
|
|
|
5092
5100
|
async updateWebhook(ctx) {
|
|
5093
5101
|
const { id } = ctx.params;
|
|
5094
5102
|
const { body } = ctx.request;
|
|
5095
|
-
await utils$
|
|
5103
|
+
await utils$2.validateYupSchema(updateWebhookValidator)(body);
|
|
5096
5104
|
const webhook = await strapi.get("webhookStore").findWebhook(id);
|
|
5097
5105
|
if (!webhook) {
|
|
5098
5106
|
return ctx.notFound("webhook.notFound");
|
|
@@ -5148,15 +5156,15 @@ const contentApi = {
|
|
|
5148
5156
|
ctx.send({ data: routesMap });
|
|
5149
5157
|
}
|
|
5150
5158
|
};
|
|
5151
|
-
const
|
|
5152
|
-
admin,
|
|
5159
|
+
const controllers$1 = {
|
|
5160
|
+
admin: admin$3,
|
|
5153
5161
|
"api-token": apiToken$1,
|
|
5154
5162
|
"authenticated-user": authenticatedUser,
|
|
5155
|
-
authentication,
|
|
5163
|
+
authentication: authentication$1,
|
|
5156
5164
|
permission,
|
|
5157
|
-
role,
|
|
5165
|
+
role: role$2,
|
|
5158
5166
|
transfer,
|
|
5159
|
-
user,
|
|
5167
|
+
user: user$2,
|
|
5160
5168
|
webhooks,
|
|
5161
5169
|
"content-api": contentApi
|
|
5162
5170
|
};
|
|
@@ -5581,7 +5589,7 @@ const transferTokenPermission = {
|
|
|
5581
5589
|
}
|
|
5582
5590
|
}
|
|
5583
5591
|
};
|
|
5584
|
-
const
|
|
5592
|
+
const contentTypes = {
|
|
5585
5593
|
permission: { schema: Permission },
|
|
5586
5594
|
user: { schema: User },
|
|
5587
5595
|
role: { schema: Role },
|
|
@@ -5591,7 +5599,7 @@ const index$1 = {
|
|
|
5591
5599
|
"transfer-token-permission": { schema: transferTokenPermission }
|
|
5592
5600
|
};
|
|
5593
5601
|
const { RateLimitError } = utils__default.default.errors;
|
|
5594
|
-
const rateLimit = (
|
|
5602
|
+
const rateLimit = (config2, { strapi: strapi2 }) => async (ctx, next) => {
|
|
5595
5603
|
let rateLimitConfig = strapi2.config.get("admin.rateLimit");
|
|
5596
5604
|
if (!rateLimitConfig) {
|
|
5597
5605
|
rateLimitConfig = {
|
|
@@ -5614,14 +5622,14 @@ const rateLimit = (config, { strapi: strapi2 }) => async (ctx, next) => {
|
|
|
5614
5622
|
throw new RateLimitError();
|
|
5615
5623
|
},
|
|
5616
5624
|
...rateLimitConfig,
|
|
5617
|
-
...
|
|
5625
|
+
...config2
|
|
5618
5626
|
};
|
|
5619
5627
|
return rateLimit2.middleware(loadConfig)(ctx, next);
|
|
5620
5628
|
}
|
|
5621
5629
|
return next();
|
|
5622
5630
|
};
|
|
5623
5631
|
const dataTransfer = () => async (ctx, next) => {
|
|
5624
|
-
const transferUtils = getService("transfer").utils;
|
|
5632
|
+
const transferUtils = getService$1("transfer").utils;
|
|
5625
5633
|
const { hasValidTokenSalt: hasValidTokenSalt2, isRemoteTransferEnabled: isRemoteTransferEnabled2 } = transferUtils;
|
|
5626
5634
|
if (isRemoteTransferEnabled2()) {
|
|
5627
5635
|
return next();
|
|
@@ -5639,18 +5647,1369 @@ const dataTransfer = () => async (ctx, next) => {
|
|
|
5639
5647
|
}
|
|
5640
5648
|
throw new Error("Unexpected error while trying to access a data transfer route");
|
|
5641
5649
|
};
|
|
5642
|
-
const
|
|
5650
|
+
const middlewares$1 = {
|
|
5643
5651
|
rateLimit,
|
|
5644
5652
|
"data-transfer": dataTransfer
|
|
5645
5653
|
};
|
|
5646
|
-
|
|
5647
|
-
|
|
5648
|
-
|
|
5649
|
-
|
|
5650
|
-
|
|
5651
|
-
|
|
5652
|
-
|
|
5653
|
-
|
|
5654
|
-
|
|
5655
|
-
|
|
5654
|
+
const register = async ({ strapi: strapi2 }) => {
|
|
5655
|
+
await register$2({ strapi: strapi2 });
|
|
5656
|
+
};
|
|
5657
|
+
const getService = (name2, { strapi: strapi2 } = { strapi: global.strapi }) => {
|
|
5658
|
+
return strapi2.service(`admin::${name2}`);
|
|
5659
|
+
};
|
|
5660
|
+
const actions = {
|
|
5661
|
+
sso: [
|
|
5662
|
+
{
|
|
5663
|
+
uid: "provider-login.read",
|
|
5664
|
+
displayName: "Read",
|
|
5665
|
+
pluginName: "admin",
|
|
5666
|
+
section: "settings",
|
|
5667
|
+
category: "single sign on",
|
|
5668
|
+
subCategory: "options"
|
|
5669
|
+
},
|
|
5670
|
+
{
|
|
5671
|
+
uid: "provider-login.update",
|
|
5672
|
+
displayName: "Update",
|
|
5673
|
+
pluginName: "admin",
|
|
5674
|
+
section: "settings",
|
|
5675
|
+
category: "single sign on",
|
|
5676
|
+
subCategory: "options"
|
|
5677
|
+
}
|
|
5678
|
+
],
|
|
5679
|
+
auditLogs: [
|
|
5680
|
+
{
|
|
5681
|
+
uid: "audit-logs.read",
|
|
5682
|
+
displayName: "Read",
|
|
5683
|
+
pluginName: "admin",
|
|
5684
|
+
section: "settings",
|
|
5685
|
+
category: "audit logs",
|
|
5686
|
+
subCategory: "options"
|
|
5687
|
+
}
|
|
5688
|
+
]
|
|
5689
|
+
};
|
|
5690
|
+
const transformTableName = (table) => {
|
|
5691
|
+
if (typeof table === "string") {
|
|
5692
|
+
return { name: table };
|
|
5693
|
+
}
|
|
5694
|
+
return table;
|
|
5695
|
+
};
|
|
5696
|
+
async function findTables({ strapi: strapi2 }, regex) {
|
|
5697
|
+
const tables = await strapi2.db.dialect.schemaInspector.getTables();
|
|
5698
|
+
return tables.filter((tableName) => regex.test(tableName));
|
|
5699
|
+
}
|
|
5700
|
+
async function addPersistTables({ strapi: strapi2 }, tableNames) {
|
|
5701
|
+
const persistedTables = await getPersistedTables({ strapi: strapi2 });
|
|
5702
|
+
const tables = tableNames.map(transformTableName);
|
|
5703
|
+
const notPersistedTableNames = fp.differenceWith(fp.isEqual, tables, persistedTables);
|
|
5704
|
+
const tablesToPersist = fp.differenceWith(
|
|
5705
|
+
(t1, t2) => t1.name === t2.name,
|
|
5706
|
+
persistedTables,
|
|
5707
|
+
notPersistedTableNames
|
|
5708
|
+
);
|
|
5709
|
+
if (!notPersistedTableNames.length) {
|
|
5710
|
+
return;
|
|
5711
|
+
}
|
|
5712
|
+
tablesToPersist.push(...notPersistedTableNames);
|
|
5713
|
+
await strapi2.store.set({
|
|
5714
|
+
type: "core",
|
|
5715
|
+
key: "persisted_tables",
|
|
5716
|
+
value: tablesToPersist
|
|
5717
|
+
});
|
|
5718
|
+
}
|
|
5719
|
+
async function getPersistedTables({ strapi: strapi2 }) {
|
|
5720
|
+
const persistedTables = await strapi2.store.get({
|
|
5721
|
+
type: "core",
|
|
5722
|
+
key: "persisted_tables"
|
|
5723
|
+
});
|
|
5724
|
+
return (persistedTables || []).map(transformTableName);
|
|
5725
|
+
}
|
|
5726
|
+
const persistTablesWithPrefix = async (tableNamePrefix) => {
|
|
5727
|
+
const tableNameRegex = new RegExp(`^${tableNamePrefix}.*`);
|
|
5728
|
+
const tableNames = await findTables({ strapi }, tableNameRegex);
|
|
5729
|
+
await addPersistTables({ strapi }, tableNames);
|
|
5730
|
+
};
|
|
5731
|
+
const bootstrap = async (args) => {
|
|
5732
|
+
const { actionProvider: actionProvider2 } = getService("permission");
|
|
5733
|
+
if (strapi.ee.features.isEnabled("sso")) {
|
|
5734
|
+
await actionProvider2.registerMany(actions.sso);
|
|
5735
|
+
}
|
|
5736
|
+
if (strapi.ee.features.isEnabled("audit-logs")) {
|
|
5737
|
+
await persistTablesWithPrefix("strapi_audit_logs");
|
|
5738
|
+
await actionProvider2.registerMany(actions.auditLogs);
|
|
5739
|
+
}
|
|
5740
|
+
await getService("seat-enforcement").seatEnforcementWorkflow();
|
|
5741
|
+
await bootstrap$1(args);
|
|
5742
|
+
};
|
|
5743
|
+
const destroy = async ({ strapi: strapi2 }) => {
|
|
5744
|
+
await destroy$1();
|
|
5745
|
+
};
|
|
5746
|
+
const adminContentTypes = {};
|
|
5747
|
+
const isSsoLocked = async (user2) => {
|
|
5748
|
+
if (!strapi.ee.features.isEnabled("sso")) {
|
|
5749
|
+
return false;
|
|
5750
|
+
}
|
|
5751
|
+
if (!user2) {
|
|
5752
|
+
throw new Error("Missing user object");
|
|
5753
|
+
}
|
|
5754
|
+
const adminStore = await strapi.store({ type: "core", name: "admin" });
|
|
5755
|
+
const { providers: providers2 } = await adminStore.get({ key: "auth" });
|
|
5756
|
+
const lockedRoles = providers2.ssoLockedRoles ?? [];
|
|
5757
|
+
if (fp.isEmpty(lockedRoles)) {
|
|
5758
|
+
return false;
|
|
5759
|
+
}
|
|
5760
|
+
const roles2 = (
|
|
5761
|
+
// If the roles are pre-loaded for the given user, then use them
|
|
5762
|
+
user2.roles ?? // Otherwise, try to load the role based on the given user ID
|
|
5763
|
+
await strapi.db.query("admin::user").load(user2, "roles", { roles: { fields: ["id"] } }) ?? // If the query fails somehow, default to an empty array
|
|
5764
|
+
[]
|
|
5765
|
+
);
|
|
5766
|
+
const isLocked = lockedRoles.some(
|
|
5767
|
+
(lockedId) => (
|
|
5768
|
+
// lockedRoles will be a string to avoid issues with frontend and bigints
|
|
5769
|
+
roles2.some((role2) => lockedId === role2.id.toString())
|
|
5770
|
+
)
|
|
5771
|
+
);
|
|
5772
|
+
return isLocked;
|
|
5773
|
+
};
|
|
5774
|
+
const { ApplicationError: ApplicationError$2 } = utils$2.errors;
|
|
5775
|
+
const forgotPassword = async ({ email: email2 } = {}) => {
|
|
5776
|
+
const user2 = await strapi.db.query("admin::user").findOne({ where: { email: email2, isActive: true } });
|
|
5777
|
+
if (!user2 || await isSsoLocked(user2)) {
|
|
5778
|
+
return;
|
|
5779
|
+
}
|
|
5780
|
+
const resetPasswordToken = getService("token").createToken();
|
|
5781
|
+
await getService("user").updateById(user2.id, { resetPasswordToken });
|
|
5782
|
+
const url = `${strapi.config.get(
|
|
5783
|
+
"admin.absoluteUrl"
|
|
5784
|
+
)}/auth/reset-password?code=${resetPasswordToken}`;
|
|
5785
|
+
return strapi.plugin("email").service("email").sendTemplatedEmail(
|
|
5786
|
+
{
|
|
5787
|
+
to: user2.email,
|
|
5788
|
+
from: strapi.config.get("admin.forgotPassword.from"),
|
|
5789
|
+
replyTo: strapi.config.get("admin.forgotPassword.replyTo")
|
|
5790
|
+
},
|
|
5791
|
+
strapi.config.get("admin.forgotPassword.emailTemplate"),
|
|
5792
|
+
{
|
|
5793
|
+
url,
|
|
5794
|
+
user: ___namespace.default.pick(user2, ["email", "firstname", "lastname", "username"])
|
|
5795
|
+
}
|
|
5796
|
+
).catch((err) => {
|
|
5797
|
+
strapi.log.error(err);
|
|
5798
|
+
});
|
|
5799
|
+
};
|
|
5800
|
+
const resetPassword = async ({ resetPasswordToken, password: password2 } = {}) => {
|
|
5801
|
+
const matchingUser = await strapi.db.query("admin::user").findOne({ where: { resetPasswordToken, isActive: true } });
|
|
5802
|
+
if (!matchingUser || await isSsoLocked(matchingUser)) {
|
|
5803
|
+
throw new ApplicationError$2();
|
|
5804
|
+
}
|
|
5805
|
+
return getService("user").updateById(matchingUser.id, {
|
|
5806
|
+
password: password2,
|
|
5807
|
+
resetPasswordToken: null
|
|
5808
|
+
});
|
|
5809
|
+
};
|
|
5810
|
+
const auth = {
|
|
5811
|
+
forgotPassword,
|
|
5812
|
+
resetPassword
|
|
5813
|
+
};
|
|
5814
|
+
const createProviderRegistry = () => {
|
|
5815
|
+
const registry = /* @__PURE__ */ new Map();
|
|
5816
|
+
Object.assign(registry, {
|
|
5817
|
+
register(provider) {
|
|
5818
|
+
if (strapi.isLoaded) {
|
|
5819
|
+
throw new Error(`You can't register new provider after the bootstrap`);
|
|
5820
|
+
}
|
|
5821
|
+
this.set(provider.uid, provider);
|
|
5822
|
+
},
|
|
5823
|
+
registerMany(providers2) {
|
|
5824
|
+
providers2.forEach((provider) => {
|
|
5825
|
+
this.register(provider);
|
|
5826
|
+
});
|
|
5827
|
+
},
|
|
5828
|
+
getAll() {
|
|
5829
|
+
return Array.from(this.values());
|
|
5830
|
+
}
|
|
5831
|
+
});
|
|
5832
|
+
return registry;
|
|
5833
|
+
};
|
|
5834
|
+
const providerRegistry = createProviderRegistry();
|
|
5835
|
+
const errorMessage = "SSO is disabled. Its functionnalities cannot be accessed.";
|
|
5836
|
+
const getStrategyCallbackURL = (providerName) => {
|
|
5837
|
+
if (!strapi.ee.features.isEnabled("sso")) {
|
|
5838
|
+
throw new Error(errorMessage);
|
|
5839
|
+
}
|
|
5840
|
+
return `/admin/connect/${providerName}`;
|
|
5841
|
+
};
|
|
5842
|
+
const syncProviderRegistryWithConfig = () => {
|
|
5843
|
+
if (!strapi.ee.features.isEnabled("sso")) {
|
|
5844
|
+
throw new Error(errorMessage);
|
|
5845
|
+
}
|
|
5846
|
+
const { providers: providers2 = [] } = strapi.config.get("admin.auth", {});
|
|
5847
|
+
providerRegistry.registerMany(providers2);
|
|
5848
|
+
};
|
|
5849
|
+
const SSOAuthEventsMapper = {
|
|
5850
|
+
onSSOAutoRegistration: "admin.auth.autoRegistration"
|
|
5851
|
+
};
|
|
5852
|
+
const sso$1 = {
|
|
5853
|
+
providerRegistry,
|
|
5854
|
+
getStrategyCallbackURL,
|
|
5855
|
+
syncProviderRegistryWithConfig,
|
|
5856
|
+
authEventsMapper: { ...passport$1.authEventsMapper, ...SSOAuthEventsMapper }
|
|
5857
|
+
};
|
|
5858
|
+
const { UnauthorizedError } = utils$2.errors;
|
|
5859
|
+
const localStrategyMiddleware = async ([error, user2, message], done) => {
|
|
5860
|
+
if (user2 && !error && await isSsoLocked(user2)) {
|
|
5861
|
+
return done(
|
|
5862
|
+
new UnauthorizedError("Login not allowed, please contact your administrator", {
|
|
5863
|
+
code: "LOGIN_NOT_ALLOWED"
|
|
5864
|
+
}),
|
|
5865
|
+
user2,
|
|
5866
|
+
message
|
|
5867
|
+
);
|
|
5868
|
+
}
|
|
5869
|
+
return done(error, user2, message);
|
|
5870
|
+
};
|
|
5871
|
+
const getPassportStrategies = () => {
|
|
5872
|
+
if (!strapi.ee.features.isEnabled("sso")) {
|
|
5873
|
+
return [createLocalStrategy(strapi)];
|
|
5874
|
+
}
|
|
5875
|
+
const localStrategy = createLocalStrategy(strapi, localStrategyMiddleware);
|
|
5876
|
+
if (!strapi.isLoaded) {
|
|
5877
|
+
sso$1.syncProviderRegistryWithConfig();
|
|
5878
|
+
}
|
|
5879
|
+
const providers2 = sso$1.providerRegistry.getAll();
|
|
5880
|
+
const strategies = providers2.map((provider) => provider.createStrategy(strapi));
|
|
5881
|
+
return [localStrategy, ...strategies];
|
|
5882
|
+
};
|
|
5883
|
+
const passport = {
|
|
5884
|
+
getPassportStrategies,
|
|
5885
|
+
...sso$1
|
|
5886
|
+
};
|
|
5887
|
+
const { ApplicationError: ApplicationError$1 } = utils$2.errors;
|
|
5888
|
+
const ssoCheckRolesIdForDeletion = async (ids) => {
|
|
5889
|
+
const adminStore = await strapi.store({ type: "core", name: "admin" });
|
|
5890
|
+
const {
|
|
5891
|
+
providers: { defaultRole }
|
|
5892
|
+
} = await adminStore.get({ key: "auth" });
|
|
5893
|
+
for (const roleId of ids) {
|
|
5894
|
+
if (defaultRole && fp.toString(defaultRole) === fp.toString(roleId)) {
|
|
5895
|
+
throw new ApplicationError$1(
|
|
5896
|
+
"This role is used as the default SSO role. Make sure to change this configuration before deleting the role"
|
|
5897
|
+
);
|
|
5898
|
+
}
|
|
5899
|
+
}
|
|
5900
|
+
};
|
|
5901
|
+
const role$1 = {
|
|
5902
|
+
ssoCheckRolesIdForDeletion
|
|
5903
|
+
};
|
|
5904
|
+
const { ValidationError: ValidationError$1 } = utils$2.errors;
|
|
5905
|
+
const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$1 } = constants$3;
|
|
5906
|
+
const updateEEDisabledUsersList = async (id, input) => {
|
|
5907
|
+
const disabledUsers = await getService("seat-enforcement").getDisabledUserList();
|
|
5908
|
+
if (!disabledUsers) {
|
|
5909
|
+
return;
|
|
5910
|
+
}
|
|
5911
|
+
const user2 = disabledUsers.find((user22) => user22.id === Number(id));
|
|
5912
|
+
if (!user2) {
|
|
5913
|
+
return;
|
|
5914
|
+
}
|
|
5915
|
+
if (user2.isActive !== input.isActive) {
|
|
5916
|
+
const newDisabledUsersList = disabledUsers.filter((user22) => user22.id !== Number(id));
|
|
5917
|
+
await strapi.store.set({
|
|
5918
|
+
type: "ee",
|
|
5919
|
+
key: "disabled_users",
|
|
5920
|
+
value: newDisabledUsersList
|
|
5921
|
+
});
|
|
5922
|
+
}
|
|
5923
|
+
};
|
|
5924
|
+
const castNumberArray = fp.pipe(fp.castArray, fp.map(fp.toNumber));
|
|
5925
|
+
const removeFromEEDisabledUsersList = async (ids) => {
|
|
5926
|
+
let idsToCheck;
|
|
5927
|
+
if (typeof ids === "object") {
|
|
5928
|
+
idsToCheck = castNumberArray(ids);
|
|
5929
|
+
} else {
|
|
5930
|
+
idsToCheck = [Number(ids)];
|
|
5931
|
+
}
|
|
5932
|
+
const disabledUsers = await getService("seat-enforcement").getDisabledUserList();
|
|
5933
|
+
if (!disabledUsers) {
|
|
5934
|
+
return;
|
|
5935
|
+
}
|
|
5936
|
+
const newDisabledUsersList = disabledUsers.filter((user2) => !idsToCheck.includes(user2.id));
|
|
5937
|
+
await strapi.store.set({
|
|
5938
|
+
type: "ee",
|
|
5939
|
+
key: "disabled_users",
|
|
5940
|
+
value: newDisabledUsersList
|
|
5941
|
+
});
|
|
5942
|
+
};
|
|
5943
|
+
const updateById = async (id, attributes) => {
|
|
5944
|
+
if (___namespace.default.has(attributes, "roles")) {
|
|
5945
|
+
const lastAdminUser = await isLastSuperAdminUser(id);
|
|
5946
|
+
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
5947
|
+
const willRemoveSuperAdminRole = !utils$2.arrays.includesString(attributes.roles, superAdminRole.id);
|
|
5948
|
+
if (lastAdminUser && willRemoveSuperAdminRole) {
|
|
5949
|
+
throw new ValidationError$1("You must have at least one user with super admin role.");
|
|
5950
|
+
}
|
|
5951
|
+
}
|
|
5952
|
+
if (attributes.isActive === false) {
|
|
5953
|
+
const lastAdminUser = await isLastSuperAdminUser(id);
|
|
5954
|
+
if (lastAdminUser) {
|
|
5955
|
+
throw new ValidationError$1("You must have at least one user with super admin role.");
|
|
5956
|
+
}
|
|
5957
|
+
}
|
|
5958
|
+
if (___namespace.default.has(attributes, "password")) {
|
|
5959
|
+
const hashedPassword = await getService("auth").hashPassword(attributes.password);
|
|
5960
|
+
const updatedUser2 = await strapi.db.query("admin::user").update({
|
|
5961
|
+
where: { id },
|
|
5962
|
+
data: {
|
|
5963
|
+
...attributes,
|
|
5964
|
+
password: hashedPassword
|
|
5965
|
+
},
|
|
5966
|
+
populate: ["roles"]
|
|
5967
|
+
});
|
|
5968
|
+
strapi.eventHub.emit("user.update", { user: sanitizeUser(updatedUser2) });
|
|
5969
|
+
return updatedUser2;
|
|
5970
|
+
}
|
|
5971
|
+
const updatedUser = await strapi.db.query("admin::user").update({
|
|
5972
|
+
where: { id },
|
|
5973
|
+
data: attributes,
|
|
5974
|
+
populate: ["roles"]
|
|
5975
|
+
});
|
|
5976
|
+
await updateEEDisabledUsersList(id, attributes);
|
|
5977
|
+
if (updatedUser) {
|
|
5978
|
+
strapi.eventHub.emit("user.update", { user: sanitizeUser(updatedUser) });
|
|
5979
|
+
}
|
|
5980
|
+
return updatedUser;
|
|
5981
|
+
};
|
|
5982
|
+
const deleteById = async (id) => {
|
|
5983
|
+
const userToDelete = await strapi.db.query("admin::user").findOne({
|
|
5984
|
+
where: { id },
|
|
5985
|
+
populate: ["roles"]
|
|
5986
|
+
});
|
|
5987
|
+
if (!userToDelete) {
|
|
5988
|
+
return null;
|
|
5989
|
+
}
|
|
5990
|
+
if (userToDelete) {
|
|
5991
|
+
if (userToDelete.roles.some((r) => r.code === SUPER_ADMIN_CODE$1)) {
|
|
5992
|
+
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
5993
|
+
if (superAdminRole.usersCount === 1) {
|
|
5994
|
+
throw new ValidationError$1("You must have at least one user with super admin role.");
|
|
5995
|
+
}
|
|
5996
|
+
}
|
|
5997
|
+
}
|
|
5998
|
+
const deletedUser = await strapi.db.query("admin::user").delete({ where: { id }, populate: ["roles"] });
|
|
5999
|
+
await removeFromEEDisabledUsersList(id);
|
|
6000
|
+
strapi.eventHub.emit("user.delete", { user: sanitizeUser(deletedUser) });
|
|
6001
|
+
return deletedUser;
|
|
6002
|
+
};
|
|
6003
|
+
const deleteByIds = async (ids) => {
|
|
6004
|
+
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
6005
|
+
const nbOfSuperAdminToDelete = await strapi.db.query("admin::user").count({
|
|
6006
|
+
where: {
|
|
6007
|
+
id: ids,
|
|
6008
|
+
roles: { id: superAdminRole.id }
|
|
6009
|
+
}
|
|
6010
|
+
});
|
|
6011
|
+
if (superAdminRole.usersCount === nbOfSuperAdminToDelete) {
|
|
6012
|
+
throw new ValidationError$1("You must have at least one user with super admin role.");
|
|
6013
|
+
}
|
|
6014
|
+
const deletedUsers = [];
|
|
6015
|
+
for (const id of ids) {
|
|
6016
|
+
const deletedUser = await strapi.db.query("admin::user").delete({
|
|
6017
|
+
where: { id },
|
|
6018
|
+
populate: ["roles"]
|
|
6019
|
+
});
|
|
6020
|
+
deletedUsers.push(deletedUser);
|
|
6021
|
+
}
|
|
6022
|
+
await removeFromEEDisabledUsersList(ids);
|
|
6023
|
+
strapi.eventHub.emit("user.delete", {
|
|
6024
|
+
users: deletedUsers.map((deletedUser) => sanitizeUser(deletedUser))
|
|
6025
|
+
});
|
|
6026
|
+
return deletedUsers;
|
|
6027
|
+
};
|
|
6028
|
+
const sanitizeUserRoles = (role2) => ___namespace.default.pick(role2, ["id", "name", "description", "code"]);
|
|
6029
|
+
const isLastSuperAdminUser = async (userId) => {
|
|
6030
|
+
const user2 = await findOne(userId);
|
|
6031
|
+
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
6032
|
+
return superAdminRole.usersCount === 1 && hasSuperAdminRole$1(user2);
|
|
6033
|
+
};
|
|
6034
|
+
const sanitizeUser = (user2) => {
|
|
6035
|
+
return {
|
|
6036
|
+
...___namespace.default.omit(user2, ["password", "resetPasswordToken", "registrationToken", "roles"]),
|
|
6037
|
+
roles: user2.roles && user2.roles.map(sanitizeUserRoles)
|
|
6038
|
+
};
|
|
6039
|
+
};
|
|
6040
|
+
const findOne = async (id, populate = ["roles"]) => {
|
|
6041
|
+
return strapi.db.query("admin::user").findOne({ where: { id }, populate });
|
|
6042
|
+
};
|
|
6043
|
+
const getCurrentActiveUserCount = async () => {
|
|
6044
|
+
return strapi.db.query("admin::user").count({ where: { isActive: true } });
|
|
6045
|
+
};
|
|
6046
|
+
const user$1 = {
|
|
6047
|
+
updateEEDisabledUsersList,
|
|
6048
|
+
removeFromEEDisabledUsersList,
|
|
6049
|
+
getCurrentActiveUserCount,
|
|
6050
|
+
deleteByIds,
|
|
6051
|
+
deleteById,
|
|
6052
|
+
updateById
|
|
6053
|
+
};
|
|
6054
|
+
const getSSOProvidersList = async () => {
|
|
6055
|
+
const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
|
|
6056
|
+
return providerRegistry2.getAll().map(({ uid }) => uid);
|
|
6057
|
+
};
|
|
6058
|
+
const sendUpdateProjectInformation = async (strapi2) => {
|
|
6059
|
+
let groupProperties = {};
|
|
6060
|
+
const numberOfActiveAdminUsers = await getService("user").count({ isActive: true });
|
|
6061
|
+
const numberOfAdminUsers = await getService("user").count();
|
|
6062
|
+
if (strapi2.ee.features.isEnabled("sso")) {
|
|
6063
|
+
const SSOProviders = await getSSOProvidersList();
|
|
6064
|
+
groupProperties = fp.assign(groupProperties, {
|
|
6065
|
+
SSOProviders,
|
|
6066
|
+
isSSOConfigured: SSOProviders.length !== 0
|
|
6067
|
+
});
|
|
6068
|
+
}
|
|
6069
|
+
if (strapi2.ee.features.isEnabled("cms-content-releases")) {
|
|
6070
|
+
const numberOfContentReleases = await strapi2.db.query("plugin::content-releases.release").count();
|
|
6071
|
+
const numberOfPublishedContentReleases = await strapi2.db.query("plugin::content-releases.release").count({
|
|
6072
|
+
filters: { releasedAt: { $notNull: true } }
|
|
6073
|
+
});
|
|
6074
|
+
groupProperties = fp.assign(groupProperties, {
|
|
6075
|
+
numberOfContentReleases,
|
|
6076
|
+
numberOfPublishedContentReleases
|
|
6077
|
+
});
|
|
6078
|
+
}
|
|
6079
|
+
groupProperties = fp.assign(groupProperties, { numberOfActiveAdminUsers, numberOfAdminUsers });
|
|
6080
|
+
strapi2.telemetry.send("didUpdateProjectInformation", {
|
|
6081
|
+
groupProperties
|
|
6082
|
+
});
|
|
6083
|
+
};
|
|
6084
|
+
const startCron = (strapi2) => {
|
|
6085
|
+
strapi2.cron.add({
|
|
6086
|
+
sendProjectInformation: {
|
|
6087
|
+
task: () => sendUpdateProjectInformation(strapi2),
|
|
6088
|
+
options: "0 0 0 * * *"
|
|
6089
|
+
}
|
|
6090
|
+
});
|
|
6091
|
+
};
|
|
6092
|
+
const metrics = { startCron, getSSOProvidersList, sendUpdateProjectInformation };
|
|
6093
|
+
const { SUPER_ADMIN_CODE } = constants$3;
|
|
6094
|
+
const getDisabledUserList = async () => {
|
|
6095
|
+
return strapi.store.get({ type: "ee", key: "disabled_users" });
|
|
6096
|
+
};
|
|
6097
|
+
const enableMaximumUserCount = async (numberOfUsersToEnable) => {
|
|
6098
|
+
const disabledUsers = await getDisabledUserList();
|
|
6099
|
+
const orderedDisabledUsers = fp.reverse(disabledUsers);
|
|
6100
|
+
const usersToEnable = fp.take(numberOfUsersToEnable, orderedDisabledUsers);
|
|
6101
|
+
await strapi.db.query("admin::user").updateMany({
|
|
6102
|
+
where: { id: fp.map(fp.prop("id"), usersToEnable) },
|
|
6103
|
+
data: { isActive: true }
|
|
6104
|
+
});
|
|
6105
|
+
const remainingDisabledUsers = fp.drop(numberOfUsersToEnable, orderedDisabledUsers);
|
|
6106
|
+
await strapi.store.set({
|
|
6107
|
+
type: "ee",
|
|
6108
|
+
key: "disabled_users",
|
|
6109
|
+
value: remainingDisabledUsers
|
|
6110
|
+
});
|
|
6111
|
+
};
|
|
6112
|
+
const disableUsersAboveLicenseLimit = async (numberOfUsersToDisable) => {
|
|
6113
|
+
const currentlyDisabledUsers = await getDisabledUserList() ?? [];
|
|
6114
|
+
const usersToDisable = [];
|
|
6115
|
+
const nonSuperAdminUsersToDisable = await strapi.db.query("admin::user").findMany({
|
|
6116
|
+
where: {
|
|
6117
|
+
isActive: true,
|
|
6118
|
+
roles: {
|
|
6119
|
+
code: { $ne: SUPER_ADMIN_CODE }
|
|
6120
|
+
}
|
|
6121
|
+
},
|
|
6122
|
+
orderBy: { createdAt: "DESC" },
|
|
6123
|
+
limit: numberOfUsersToDisable
|
|
6124
|
+
});
|
|
6125
|
+
usersToDisable.push(...nonSuperAdminUsersToDisable);
|
|
6126
|
+
if (nonSuperAdminUsersToDisable.length < numberOfUsersToDisable) {
|
|
6127
|
+
const superAdminUsersToDisable = await strapi.db.query("admin::user").findMany({
|
|
6128
|
+
where: {
|
|
6129
|
+
isActive: true,
|
|
6130
|
+
roles: { code: SUPER_ADMIN_CODE }
|
|
6131
|
+
},
|
|
6132
|
+
orderBy: { createdAt: "DESC" },
|
|
6133
|
+
limit: numberOfUsersToDisable - nonSuperAdminUsersToDisable.length
|
|
6134
|
+
});
|
|
6135
|
+
usersToDisable.push(...superAdminUsersToDisable);
|
|
6136
|
+
}
|
|
6137
|
+
await strapi.db.query("admin::user").updateMany({
|
|
6138
|
+
where: { id: fp.map(fp.prop("id"), usersToDisable) },
|
|
6139
|
+
data: { isActive: false }
|
|
6140
|
+
});
|
|
6141
|
+
await strapi.store.set({
|
|
6142
|
+
type: "ee",
|
|
6143
|
+
key: "disabled_users",
|
|
6144
|
+
value: currentlyDisabledUsers.concat(fp.map(fp.pick(["id", "isActive"]), usersToDisable))
|
|
6145
|
+
});
|
|
6146
|
+
};
|
|
6147
|
+
const syncDisabledUserRecords = async () => {
|
|
6148
|
+
const disabledUsers = await strapi.store.get({ type: "ee", key: "disabled_users" });
|
|
6149
|
+
if (!disabledUsers) {
|
|
6150
|
+
return;
|
|
6151
|
+
}
|
|
6152
|
+
await strapi.db.query("admin::user").updateMany({
|
|
6153
|
+
where: { id: fp.map(fp.prop("id"), disabledUsers) },
|
|
6154
|
+
data: { isActive: false }
|
|
6155
|
+
});
|
|
6156
|
+
};
|
|
6157
|
+
const seatEnforcementWorkflow = async () => {
|
|
6158
|
+
const adminSeats = strapi.ee.seats;
|
|
6159
|
+
if (fp.isNil(adminSeats)) {
|
|
6160
|
+
return;
|
|
6161
|
+
}
|
|
6162
|
+
await syncDisabledUserRecords();
|
|
6163
|
+
const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
|
|
6164
|
+
const adminSeatsLeft = adminSeats - currentActiveUserCount;
|
|
6165
|
+
if (adminSeatsLeft > 0) {
|
|
6166
|
+
await enableMaximumUserCount(adminSeatsLeft);
|
|
6167
|
+
} else if (adminSeatsLeft < 0) {
|
|
6168
|
+
await disableUsersAboveLicenseLimit(-adminSeatsLeft);
|
|
6169
|
+
}
|
|
6170
|
+
};
|
|
6171
|
+
const seatEnforcement = {
|
|
6172
|
+
seatEnforcementWorkflow,
|
|
6173
|
+
getDisabledUserList
|
|
6174
|
+
};
|
|
6175
|
+
const services = {
|
|
6176
|
+
auth,
|
|
6177
|
+
passport,
|
|
6178
|
+
role: role$1,
|
|
6179
|
+
user: user$1,
|
|
6180
|
+
metrics,
|
|
6181
|
+
"seat-enforcement": seatEnforcement
|
|
6182
|
+
};
|
|
6183
|
+
const providerOptionsUpdateSchema = utils$2.yup.object().shape({
|
|
6184
|
+
autoRegister: utils$2.yup.boolean().required(),
|
|
6185
|
+
defaultRole: utils$2.yup.strapiID().when("autoRegister", (value, initSchema) => {
|
|
6186
|
+
return value ? initSchema.required() : initSchema.nullable();
|
|
6187
|
+
}).test("is-valid-role", "You must submit a valid default role", (roleId) => {
|
|
6188
|
+
if (roleId === null) {
|
|
6189
|
+
return true;
|
|
6190
|
+
}
|
|
6191
|
+
return strapi.service("admin::role").exists({ id: roleId });
|
|
6192
|
+
}),
|
|
6193
|
+
ssoLockedRoles: utils$2.yup.array().nullable().of(
|
|
6194
|
+
utils$2.yup.strapiID().test(
|
|
6195
|
+
"is-valid-role",
|
|
6196
|
+
"You must submit a valid role for the SSO Locked roles",
|
|
6197
|
+
(roleId) => {
|
|
6198
|
+
return strapi.service("admin::role").exists({ id: roleId });
|
|
6199
|
+
}
|
|
6200
|
+
)
|
|
6201
|
+
)
|
|
6202
|
+
});
|
|
6203
|
+
const validateProviderOptionsUpdate = utils$2.validateYupSchema(providerOptionsUpdateSchema);
|
|
6204
|
+
const PROVIDER_REDIRECT_BASE = "/auth/login";
|
|
6205
|
+
const PROVIDER_REDIRECT_SUCCESS = `${PROVIDER_REDIRECT_BASE}/success`;
|
|
6206
|
+
const PROVIDER_REDIRECT_ERROR = `${PROVIDER_REDIRECT_BASE}/error`;
|
|
6207
|
+
const PROVIDER_URLS_MAP = {
|
|
6208
|
+
success: PROVIDER_REDIRECT_SUCCESS,
|
|
6209
|
+
error: PROVIDER_REDIRECT_ERROR
|
|
6210
|
+
};
|
|
6211
|
+
const getAdminStore = async () => strapi.store({ type: "core", name: "admin" });
|
|
6212
|
+
const getPrefixedRedirectUrls = () => {
|
|
6213
|
+
const { url: adminUrl } = strapi.config.get("admin");
|
|
6214
|
+
const prefixUrl = (url) => `${adminUrl || "/admin"}${url}`;
|
|
6215
|
+
return fp.mapValues(prefixUrl, PROVIDER_URLS_MAP);
|
|
6216
|
+
};
|
|
6217
|
+
const utils = {
|
|
6218
|
+
getAdminStore,
|
|
6219
|
+
getPrefixedRedirectUrls
|
|
6220
|
+
};
|
|
6221
|
+
const defaultConnectionError = () => new Error("Invalid connection payload");
|
|
6222
|
+
const authenticate = async (ctx, next) => {
|
|
6223
|
+
const {
|
|
6224
|
+
params: { provider }
|
|
6225
|
+
} = ctx;
|
|
6226
|
+
const redirectUrls = utils.getPrefixedRedirectUrls();
|
|
6227
|
+
return passport__default.default.authenticate(provider, null, async (error, profile) => {
|
|
6228
|
+
if (error || !profile || !profile.email) {
|
|
6229
|
+
if (error) {
|
|
6230
|
+
strapi.log.error(error);
|
|
6231
|
+
}
|
|
6232
|
+
strapi.eventHub.emit("admin.auth.error", {
|
|
6233
|
+
error: error || defaultConnectionError(),
|
|
6234
|
+
provider
|
|
6235
|
+
});
|
|
6236
|
+
return ctx.redirect(redirectUrls.error);
|
|
6237
|
+
}
|
|
6238
|
+
const user2 = await getService("user").findOneByEmail(profile.email);
|
|
6239
|
+
const scenario = user2 ? existingUserScenario : nonExistingUserScenario;
|
|
6240
|
+
return scenario(ctx, next)(user2 || profile, provider);
|
|
6241
|
+
})(ctx, next);
|
|
6242
|
+
};
|
|
6243
|
+
const existingUserScenario = (ctx, next) => async (user2, provider) => {
|
|
6244
|
+
const redirectUrls = utils.getPrefixedRedirectUrls();
|
|
6245
|
+
if (!user2.isActive) {
|
|
6246
|
+
strapi.eventHub.emit("admin.auth.error", {
|
|
6247
|
+
error: new Error(`Deactivated user tried to login (${user2.id})`),
|
|
6248
|
+
provider
|
|
6249
|
+
});
|
|
6250
|
+
return ctx.redirect(redirectUrls.error);
|
|
6251
|
+
}
|
|
6252
|
+
ctx.state.user = user2;
|
|
6253
|
+
return next();
|
|
6254
|
+
};
|
|
6255
|
+
const nonExistingUserScenario = (ctx, next) => async (profile, provider) => {
|
|
6256
|
+
const { email: email2, firstname: firstname2, lastname: lastname2, username: username2 } = profile;
|
|
6257
|
+
const redirectUrls = utils.getPrefixedRedirectUrls();
|
|
6258
|
+
const adminStore = await utils.getAdminStore();
|
|
6259
|
+
const { providers: providers2 } = await adminStore.get({ key: "auth" });
|
|
6260
|
+
const isMissingRegisterFields = !username2 && (!firstname2 || !lastname2);
|
|
6261
|
+
if (!providers2.autoRegister || !providers2.defaultRole || isMissingRegisterFields) {
|
|
6262
|
+
strapi.eventHub.emit("admin.auth.error", { error: defaultConnectionError(), provider });
|
|
6263
|
+
return ctx.redirect(redirectUrls.error);
|
|
6264
|
+
}
|
|
6265
|
+
const defaultRole = await getService("role").findOne({ id: providers2.defaultRole });
|
|
6266
|
+
if (!defaultRole) {
|
|
6267
|
+
strapi.eventHub.emit("admin.auth.error", { error: defaultConnectionError(), provider });
|
|
6268
|
+
return ctx.redirect(redirectUrls.error);
|
|
6269
|
+
}
|
|
6270
|
+
ctx.state.user = await getService("user").create({
|
|
6271
|
+
email: email2,
|
|
6272
|
+
username: username2,
|
|
6273
|
+
firstname: firstname2,
|
|
6274
|
+
lastname: lastname2,
|
|
6275
|
+
roles: [defaultRole.id],
|
|
6276
|
+
isActive: true,
|
|
6277
|
+
registrationToken: null
|
|
6278
|
+
});
|
|
6279
|
+
strapi.eventHub.emit("admin.auth.autoRegistration", {
|
|
6280
|
+
user: ctx.state.user,
|
|
6281
|
+
provider
|
|
6282
|
+
});
|
|
6283
|
+
return next();
|
|
6284
|
+
};
|
|
6285
|
+
const redirectWithAuth = (ctx) => {
|
|
6286
|
+
const {
|
|
6287
|
+
params: { provider }
|
|
6288
|
+
} = ctx;
|
|
6289
|
+
const redirectUrls = utils.getPrefixedRedirectUrls();
|
|
6290
|
+
const domain2 = strapi.config.get("admin.auth.domain");
|
|
6291
|
+
const { user: user2 } = ctx.state;
|
|
6292
|
+
const jwt2 = getService("token").createJwtToken(user2);
|
|
6293
|
+
const isProduction = strapi.config.get("environment") === "production";
|
|
6294
|
+
const cookiesOptions = { httpOnly: false, secure: isProduction, overwrite: true, domain: domain2 };
|
|
6295
|
+
const sanitizedUser = getService("user").sanitizeUser(user2);
|
|
6296
|
+
strapi.eventHub.emit("admin.auth.success", { user: sanitizedUser, provider });
|
|
6297
|
+
ctx.cookies.set("jwtToken", jwt2, cookiesOptions);
|
|
6298
|
+
ctx.redirect(redirectUrls.success);
|
|
6299
|
+
};
|
|
6300
|
+
const middlewares = {
|
|
6301
|
+
authenticate,
|
|
6302
|
+
redirectWithAuth
|
|
6303
|
+
};
|
|
6304
|
+
const toProviderDTO = fp.pick(["uid", "displayName", "icon"]);
|
|
6305
|
+
const toProviderLoginOptionsDTO = fp.pick(["autoRegister", "defaultRole", "ssoLockedRoles"]);
|
|
6306
|
+
const { ValidationError } = utils$2.errors;
|
|
6307
|
+
const providerAuthenticationFlow = compose__default.default([
|
|
6308
|
+
middlewares.authenticate,
|
|
6309
|
+
middlewares.redirectWithAuth
|
|
6310
|
+
]);
|
|
6311
|
+
const authentication = {
|
|
6312
|
+
async getProviders(ctx) {
|
|
6313
|
+
const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
|
|
6314
|
+
ctx.body = providerRegistry2.getAll().map(toProviderDTO);
|
|
6315
|
+
},
|
|
6316
|
+
async getProviderLoginOptions(ctx) {
|
|
6317
|
+
const adminStore = await utils.getAdminStore();
|
|
6318
|
+
const { providers: providersOptions } = await adminStore.get({ key: "auth" });
|
|
6319
|
+
ctx.body = {
|
|
6320
|
+
data: toProviderLoginOptionsDTO(providersOptions)
|
|
6321
|
+
};
|
|
6322
|
+
},
|
|
6323
|
+
async updateProviderLoginOptions(ctx) {
|
|
6324
|
+
const {
|
|
6325
|
+
request: { body }
|
|
6326
|
+
} = ctx;
|
|
6327
|
+
await validateProviderOptionsUpdate(body);
|
|
6328
|
+
const adminStore = await utils.getAdminStore();
|
|
6329
|
+
const currentAuthOptions = await adminStore.get({ key: "auth" });
|
|
6330
|
+
const newAuthOptions = { ...currentAuthOptions, providers: body };
|
|
6331
|
+
await adminStore.set({ key: "auth", value: newAuthOptions });
|
|
6332
|
+
strapi.telemetry.send("didUpdateSSOSettings");
|
|
6333
|
+
ctx.body = {
|
|
6334
|
+
data: toProviderLoginOptionsDTO(newAuthOptions.providers)
|
|
6335
|
+
};
|
|
6336
|
+
},
|
|
6337
|
+
providerLogin(ctx, next) {
|
|
6338
|
+
const {
|
|
6339
|
+
params: { provider: providerName }
|
|
6340
|
+
} = ctx;
|
|
6341
|
+
const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
|
|
6342
|
+
if (!providerRegistry2.has(providerName)) {
|
|
6343
|
+
throw new ValidationError(`Invalid provider supplied: ${providerName}`);
|
|
6344
|
+
}
|
|
6345
|
+
return providerAuthenticationFlow(ctx, next);
|
|
6346
|
+
}
|
|
6347
|
+
};
|
|
6348
|
+
const roleCreateSchema = utils$2.yup.object().shape({
|
|
6349
|
+
name: utils$2.yup.string().min(1).required(),
|
|
6350
|
+
description: utils$2.yup.string().nullable()
|
|
6351
|
+
}).noUnknown();
|
|
6352
|
+
const rolesDeleteSchema = utils$2.yup.object().shape({
|
|
6353
|
+
ids: utils$2.yup.array().of(utils$2.yup.strapiID()).min(1).required().test(
|
|
6354
|
+
"roles-deletion-checks",
|
|
6355
|
+
"Roles deletion checks have failed",
|
|
6356
|
+
async function rolesDeletionChecks(ids) {
|
|
6357
|
+
try {
|
|
6358
|
+
await strapi.service("admin::role").checkRolesIdForDeletion(ids);
|
|
6359
|
+
if (strapi.ee.features.isEnabled("sso")) {
|
|
6360
|
+
await strapi.service("admin::role").ssoCheckRolesIdForDeletion(ids);
|
|
6361
|
+
}
|
|
6362
|
+
} catch (e) {
|
|
6363
|
+
return this.createError({ path: "ids", message: e.message });
|
|
6364
|
+
}
|
|
6365
|
+
return true;
|
|
6366
|
+
}
|
|
6367
|
+
)
|
|
6368
|
+
}).noUnknown();
|
|
6369
|
+
const roleDeleteSchema = utils$2.yup.strapiID().required().test(
|
|
6370
|
+
"no-admin-single-delete",
|
|
6371
|
+
"Role deletion checks have failed",
|
|
6372
|
+
async function noAdminSingleDelete(id) {
|
|
6373
|
+
try {
|
|
6374
|
+
await strapi.service("admin::role").checkRolesIdForDeletion([id]);
|
|
6375
|
+
if (strapi.ee.features.isEnabled("sso")) {
|
|
6376
|
+
await strapi.service("admin::role").ssoCheckRolesIdForDeletion([id]);
|
|
6377
|
+
}
|
|
6378
|
+
} catch (e) {
|
|
6379
|
+
return this.createError({ path: "id", message: e.message });
|
|
6380
|
+
}
|
|
6381
|
+
return true;
|
|
6382
|
+
}
|
|
6383
|
+
);
|
|
6384
|
+
const validateRoleCreateInput = utils$2.validateYupSchema(roleCreateSchema);
|
|
6385
|
+
const validateRolesDeleteInput = utils$2.validateYupSchema(rolesDeleteSchema);
|
|
6386
|
+
const validateRoleDeleteInput = utils$2.validateYupSchema(roleDeleteSchema);
|
|
6387
|
+
const role = {
|
|
6388
|
+
/**
|
|
6389
|
+
* Create a new role
|
|
6390
|
+
* @param {KoaContext} ctx - koa context
|
|
6391
|
+
*/
|
|
6392
|
+
async create(ctx) {
|
|
6393
|
+
await validateRoleCreateInput(ctx.request.body);
|
|
6394
|
+
const roleService = getService("role");
|
|
6395
|
+
const role2 = await roleService.create(ctx.request.body);
|
|
6396
|
+
const sanitizedRole = roleService.sanitizeRole(role2);
|
|
6397
|
+
ctx.created({ data: sanitizedRole });
|
|
6398
|
+
},
|
|
6399
|
+
/**
|
|
6400
|
+
* Delete a role
|
|
6401
|
+
* @param {KoaContext} ctx - koa context
|
|
6402
|
+
*/
|
|
6403
|
+
async deleteOne(ctx) {
|
|
6404
|
+
const { id } = ctx.params;
|
|
6405
|
+
await validateRoleDeleteInput(id);
|
|
6406
|
+
const roleService = getService("role");
|
|
6407
|
+
const roles2 = await roleService.deleteByIds([id]);
|
|
6408
|
+
const sanitizedRole = roles2.map((role2) => roleService.sanitizeRole(role2))[0] || null;
|
|
6409
|
+
return ctx.deleted({
|
|
6410
|
+
data: sanitizedRole
|
|
6411
|
+
});
|
|
6412
|
+
},
|
|
6413
|
+
/**
|
|
6414
|
+
* delete several roles
|
|
6415
|
+
* @param {KoaContext} ctx - koa context
|
|
6416
|
+
*/
|
|
6417
|
+
async deleteMany(ctx) {
|
|
6418
|
+
const { body } = ctx.request;
|
|
6419
|
+
await validateRolesDeleteInput(body);
|
|
6420
|
+
const roleService = getService("role");
|
|
6421
|
+
const roles2 = await roleService.deleteByIds(body.ids);
|
|
6422
|
+
const sanitizedRoles = roles2.map(roleService.sanitizeRole);
|
|
6423
|
+
return ctx.deleted({
|
|
6424
|
+
data: sanitizedRoles
|
|
6425
|
+
});
|
|
6426
|
+
}
|
|
6427
|
+
};
|
|
6428
|
+
const ssoUserCreationInputExtension = utils$2.yup.object().shape({
|
|
6429
|
+
useSSORegistration: utils$2.yup.boolean()
|
|
6430
|
+
}).noUnknown();
|
|
6431
|
+
const validateUserCreationInput = (data) => {
|
|
6432
|
+
let schema = schemas.userCreationSchema;
|
|
6433
|
+
if (strapi.ee.features.isEnabled("sso")) {
|
|
6434
|
+
schema = schema.concat(ssoUserCreationInputExtension);
|
|
6435
|
+
}
|
|
6436
|
+
return utils$2.validateYupSchema(schema)(data);
|
|
6437
|
+
};
|
|
6438
|
+
const { ApplicationError, ForbiddenError } = utils$2.errors;
|
|
6439
|
+
const pickUserCreationAttributes = fp.pick(["firstname", "lastname", "email", "roles"]);
|
|
6440
|
+
const hasAdminSeatsAvaialble = async () => {
|
|
6441
|
+
if (!strapi.EE) {
|
|
6442
|
+
return true;
|
|
6443
|
+
}
|
|
6444
|
+
const permittedSeats = strapi.ee.seats;
|
|
6445
|
+
if (fp.isNil(permittedSeats)) {
|
|
6446
|
+
return true;
|
|
6447
|
+
}
|
|
6448
|
+
const userCount = await strapi.service("admin::user").getCurrentActiveUserCount();
|
|
6449
|
+
if (userCount < permittedSeats) {
|
|
6450
|
+
return true;
|
|
6451
|
+
}
|
|
6452
|
+
};
|
|
6453
|
+
const user = {
|
|
6454
|
+
async create(ctx) {
|
|
6455
|
+
if (!await hasAdminSeatsAvaialble()) {
|
|
6456
|
+
throw new ForbiddenError("License seat limit reached. You cannot create a new user");
|
|
6457
|
+
}
|
|
6458
|
+
const { body } = ctx.request;
|
|
6459
|
+
const cleanData = { ...body, email: ___namespace.default.get(body, `email`, ``).toLowerCase() };
|
|
6460
|
+
await validateUserCreationInput(cleanData);
|
|
6461
|
+
const attributes = pickUserCreationAttributes(cleanData);
|
|
6462
|
+
const { useSSORegistration } = cleanData;
|
|
6463
|
+
const userAlreadyExists = await getService("user").exists({ email: attributes.email });
|
|
6464
|
+
if (userAlreadyExists) {
|
|
6465
|
+
throw new ApplicationError("Email already taken");
|
|
6466
|
+
}
|
|
6467
|
+
if (useSSORegistration) {
|
|
6468
|
+
Object.assign(attributes, { registrationToken: null, isActive: true });
|
|
6469
|
+
}
|
|
6470
|
+
const createdUser = await getService("user").create(attributes);
|
|
6471
|
+
const userInfo = getService("user").sanitizeUser(createdUser);
|
|
6472
|
+
Object.assign(userInfo, { registrationToken: createdUser.registrationToken });
|
|
6473
|
+
ctx.created({ data: userInfo });
|
|
6474
|
+
},
|
|
6475
|
+
async update(ctx) {
|
|
6476
|
+
const { id } = ctx.params;
|
|
6477
|
+
const { body: input } = ctx.request;
|
|
6478
|
+
await validateUserUpdateInput(input);
|
|
6479
|
+
if (___namespace.default.has(input, "email")) {
|
|
6480
|
+
const uniqueEmailCheck = await getService("user").exists({
|
|
6481
|
+
id: { $ne: id },
|
|
6482
|
+
email: input.email
|
|
6483
|
+
});
|
|
6484
|
+
if (uniqueEmailCheck) {
|
|
6485
|
+
throw new ApplicationError("A user with this email address already exists");
|
|
6486
|
+
}
|
|
6487
|
+
}
|
|
6488
|
+
const user2 = await getService("user").findOne(id, null);
|
|
6489
|
+
if (!await hasAdminSeatsAvaialble() && !user2.isActive && input.isActive) {
|
|
6490
|
+
throw new ForbiddenError("License seat limit reached. You cannot active this user");
|
|
6491
|
+
}
|
|
6492
|
+
const updatedUser = await getService("user").updateById(id, input);
|
|
6493
|
+
if (!updatedUser) {
|
|
6494
|
+
return ctx.notFound("User does not exist");
|
|
6495
|
+
}
|
|
6496
|
+
ctx.body = {
|
|
6497
|
+
data: getService("user").sanitizeUser(updatedUser)
|
|
6498
|
+
};
|
|
6499
|
+
},
|
|
6500
|
+
async isSSOLocked(ctx) {
|
|
6501
|
+
const { user: user2 } = ctx.state;
|
|
6502
|
+
const isSSOLocked = await isSsoLocked(user2);
|
|
6503
|
+
ctx.body = {
|
|
6504
|
+
data: {
|
|
6505
|
+
isSSOLocked
|
|
6506
|
+
}
|
|
6507
|
+
};
|
|
6508
|
+
}
|
|
6509
|
+
};
|
|
6510
|
+
const admin$2 = {
|
|
6511
|
+
// NOTE: Overrides CE admin controller
|
|
6512
|
+
async getProjectType() {
|
|
6513
|
+
const flags = strapi.config.get("admin.flags", {});
|
|
6514
|
+
try {
|
|
6515
|
+
return { data: { isEE: strapi.EE, features: strapi.ee.features.list(), flags } };
|
|
6516
|
+
} catch (err) {
|
|
6517
|
+
return { data: { isEE: false, features: [], flags } };
|
|
6518
|
+
}
|
|
6519
|
+
},
|
|
6520
|
+
async licenseLimitInformation() {
|
|
6521
|
+
const permittedSeats = strapi.ee.seats;
|
|
6522
|
+
let shouldNotify = false;
|
|
6523
|
+
let licenseLimitStatus = null;
|
|
6524
|
+
let enforcementUserCount;
|
|
6525
|
+
const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
|
|
6526
|
+
const eeDisabledUsers = await getService("seat-enforcement").getDisabledUserList();
|
|
6527
|
+
if (eeDisabledUsers) {
|
|
6528
|
+
enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;
|
|
6529
|
+
} else {
|
|
6530
|
+
enforcementUserCount = currentActiveUserCount;
|
|
6531
|
+
}
|
|
6532
|
+
if (!fp.isNil(permittedSeats) && enforcementUserCount > permittedSeats) {
|
|
6533
|
+
shouldNotify = true;
|
|
6534
|
+
licenseLimitStatus = "OVER_LIMIT";
|
|
6535
|
+
}
|
|
6536
|
+
if (!fp.isNil(permittedSeats) && enforcementUserCount === permittedSeats) {
|
|
6537
|
+
shouldNotify = true;
|
|
6538
|
+
licenseLimitStatus = "AT_LIMIT";
|
|
6539
|
+
}
|
|
6540
|
+
const data = {
|
|
6541
|
+
enforcementUserCount,
|
|
6542
|
+
currentActiveUserCount,
|
|
6543
|
+
permittedSeats,
|
|
6544
|
+
shouldNotify,
|
|
6545
|
+
shouldStopCreate: fp.isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,
|
|
6546
|
+
licenseLimitStatus,
|
|
6547
|
+
isHostedOnStrapiCloud: utils$2.env("STRAPI_HOSTING", null) === "strapi.cloud",
|
|
6548
|
+
features: strapi.ee.features.list() ?? []
|
|
6549
|
+
};
|
|
6550
|
+
return { data };
|
|
6551
|
+
}
|
|
6552
|
+
};
|
|
6553
|
+
const controllers = {
|
|
6554
|
+
authentication,
|
|
6555
|
+
role,
|
|
6556
|
+
user,
|
|
6557
|
+
admin: admin$2
|
|
6558
|
+
};
|
|
6559
|
+
const enableFeatureMiddleware = (featureName) => (ctx, next) => {
|
|
6560
|
+
if (strapi.ee.features.isEnabled(featureName)) {
|
|
6561
|
+
return next();
|
|
6562
|
+
}
|
|
6563
|
+
ctx.status = 404;
|
|
6564
|
+
};
|
|
6565
|
+
const sso = {
|
|
6566
|
+
type: "admin",
|
|
6567
|
+
routes: [
|
|
6568
|
+
{
|
|
6569
|
+
method: "GET",
|
|
6570
|
+
path: "/providers",
|
|
6571
|
+
handler: "authentication.getProviders",
|
|
6572
|
+
config: {
|
|
6573
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6574
|
+
auth: false
|
|
6575
|
+
}
|
|
6576
|
+
},
|
|
6577
|
+
{
|
|
6578
|
+
method: "GET",
|
|
6579
|
+
path: "/connect/:provider",
|
|
6580
|
+
handler: "authentication.providerLogin",
|
|
6581
|
+
config: {
|
|
6582
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6583
|
+
auth: false
|
|
6584
|
+
}
|
|
6585
|
+
},
|
|
6586
|
+
{
|
|
6587
|
+
method: "POST",
|
|
6588
|
+
path: "/connect/:provider",
|
|
6589
|
+
handler: "authentication.providerLogin",
|
|
6590
|
+
config: {
|
|
6591
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6592
|
+
auth: false
|
|
6593
|
+
}
|
|
6594
|
+
},
|
|
6595
|
+
{
|
|
6596
|
+
method: "GET",
|
|
6597
|
+
path: "/providers/options",
|
|
6598
|
+
handler: "authentication.getProviderLoginOptions",
|
|
6599
|
+
config: {
|
|
6600
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6601
|
+
policies: [
|
|
6602
|
+
"admin::isAuthenticatedAdmin",
|
|
6603
|
+
{ name: "admin::hasPermissions", config: { actions: ["admin::provider-login.read"] } }
|
|
6604
|
+
]
|
|
6605
|
+
}
|
|
6606
|
+
},
|
|
6607
|
+
{
|
|
6608
|
+
method: "PUT",
|
|
6609
|
+
path: "/providers/options",
|
|
6610
|
+
handler: "authentication.updateProviderLoginOptions",
|
|
6611
|
+
config: {
|
|
6612
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6613
|
+
policies: [
|
|
6614
|
+
"admin::isAuthenticatedAdmin",
|
|
6615
|
+
{ name: "admin::hasPermissions", config: { actions: ["admin::provider-login.update"] } }
|
|
6616
|
+
]
|
|
6617
|
+
}
|
|
6618
|
+
},
|
|
6619
|
+
{
|
|
6620
|
+
method: "GET",
|
|
6621
|
+
path: "/providers/isSSOLocked",
|
|
6622
|
+
handler: "user.isSSOLocked",
|
|
6623
|
+
config: {
|
|
6624
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6625
|
+
policies: ["admin::isAuthenticatedAdmin"]
|
|
6626
|
+
}
|
|
6627
|
+
}
|
|
6628
|
+
]
|
|
6629
|
+
};
|
|
6630
|
+
const licenseLimit = {
|
|
6631
|
+
type: "admin",
|
|
6632
|
+
routes: [
|
|
6633
|
+
// License limit infos
|
|
6634
|
+
{
|
|
6635
|
+
method: "GET",
|
|
6636
|
+
path: "/license-limit-information",
|
|
6637
|
+
handler: "admin.licenseLimitInformation",
|
|
6638
|
+
config: {
|
|
6639
|
+
policies: [
|
|
6640
|
+
"admin::isAuthenticatedAdmin",
|
|
6641
|
+
{
|
|
6642
|
+
name: "admin::hasPermissions",
|
|
6643
|
+
config: {
|
|
6644
|
+
actions: [
|
|
6645
|
+
"admin::users.create",
|
|
6646
|
+
"admin::users.read",
|
|
6647
|
+
"admin::users.update",
|
|
6648
|
+
"admin::users.delete"
|
|
6649
|
+
]
|
|
6650
|
+
}
|
|
6651
|
+
}
|
|
6652
|
+
]
|
|
6653
|
+
}
|
|
6654
|
+
}
|
|
6655
|
+
]
|
|
6656
|
+
};
|
|
6657
|
+
const routes = {
|
|
6658
|
+
sso,
|
|
6659
|
+
"license-limit": licenseLimit
|
|
6660
|
+
};
|
|
6661
|
+
const auditLogsRoutes = {
|
|
6662
|
+
type: "admin",
|
|
6663
|
+
routes: [
|
|
6664
|
+
{
|
|
6665
|
+
method: "GET",
|
|
6666
|
+
path: "/audit-logs",
|
|
6667
|
+
handler: "audit-logs.findMany",
|
|
6668
|
+
config: {
|
|
6669
|
+
middlewares: [enableFeatureMiddleware("audit-logs")],
|
|
6670
|
+
policies: [
|
|
6671
|
+
"admin::isAuthenticatedAdmin",
|
|
6672
|
+
{
|
|
6673
|
+
name: "admin::hasPermissions",
|
|
6674
|
+
config: {
|
|
6675
|
+
actions: ["admin::audit-logs.read"]
|
|
6676
|
+
}
|
|
6677
|
+
}
|
|
6678
|
+
]
|
|
6679
|
+
}
|
|
6680
|
+
},
|
|
6681
|
+
{
|
|
6682
|
+
method: "GET",
|
|
6683
|
+
path: "/audit-logs/:id",
|
|
6684
|
+
handler: "audit-logs.findOne",
|
|
6685
|
+
config: {
|
|
6686
|
+
middlewares: [enableFeatureMiddleware("audit-logs")],
|
|
6687
|
+
policies: [
|
|
6688
|
+
"admin::isAuthenticatedAdmin",
|
|
6689
|
+
{
|
|
6690
|
+
name: "admin::hasPermissions",
|
|
6691
|
+
config: {
|
|
6692
|
+
actions: ["admin::audit-logs.read"]
|
|
6693
|
+
}
|
|
6694
|
+
}
|
|
6695
|
+
]
|
|
6696
|
+
}
|
|
6697
|
+
}
|
|
6698
|
+
]
|
|
6699
|
+
};
|
|
6700
|
+
const ALLOWED_SORT_STRINGS = ["action:ASC", "action:DESC", "date:ASC", "date:DESC"];
|
|
6701
|
+
const validateFindManySchema = utils$2.yup.object().shape({
|
|
6702
|
+
page: utils$2.yup.number().integer().min(1),
|
|
6703
|
+
pageSize: utils$2.yup.number().integer().min(1).max(100),
|
|
6704
|
+
sort: utils$2.yup.mixed().oneOf(ALLOWED_SORT_STRINGS)
|
|
6705
|
+
}).required();
|
|
6706
|
+
const validateFindMany = utils$2.validateYupSchema(validateFindManySchema, { strict: false });
|
|
6707
|
+
const auditLogsController = {
|
|
6708
|
+
async findMany(ctx) {
|
|
6709
|
+
const { query } = ctx.request;
|
|
6710
|
+
await validateFindMany(query);
|
|
6711
|
+
const auditLogs = strapi.get("audit-logs");
|
|
6712
|
+
const body = await auditLogs.findMany(query);
|
|
6713
|
+
ctx.body = body;
|
|
6714
|
+
},
|
|
6715
|
+
async findOne(ctx) {
|
|
6716
|
+
const { id } = ctx.params;
|
|
6717
|
+
const auditLogs = strapi.get("audit-logs");
|
|
6718
|
+
const body = await auditLogs.findOne(id);
|
|
6719
|
+
ctx.body = body;
|
|
6720
|
+
strapi.telemetry.send("didWatchAnAuditLog");
|
|
6721
|
+
}
|
|
6722
|
+
};
|
|
6723
|
+
const getSanitizedUser = (user2) => {
|
|
6724
|
+
let displayName = user2.email;
|
|
6725
|
+
if (user2.username) {
|
|
6726
|
+
displayName = user2.username;
|
|
6727
|
+
} else if (user2.firstname && user2.lastname) {
|
|
6728
|
+
displayName = `${user2.firstname} ${user2.lastname}`;
|
|
6729
|
+
}
|
|
6730
|
+
return {
|
|
6731
|
+
id: user2.id,
|
|
6732
|
+
email: user2.email,
|
|
6733
|
+
displayName
|
|
6734
|
+
};
|
|
6735
|
+
};
|
|
6736
|
+
const createAuditLogsService = (strapi2) => {
|
|
6737
|
+
return {
|
|
6738
|
+
async saveEvent(event) {
|
|
6739
|
+
const { userId, ...rest } = event;
|
|
6740
|
+
const auditLog2 = { ...rest, user: userId };
|
|
6741
|
+
await strapi2.db?.query("admin::audit-log").create({ data: auditLog2 });
|
|
6742
|
+
return this;
|
|
6743
|
+
},
|
|
6744
|
+
async findMany(query) {
|
|
6745
|
+
const { results, pagination } = await strapi2.db?.query("admin::audit-log").findPage({
|
|
6746
|
+
populate: ["user"],
|
|
6747
|
+
select: ["action", "date", "payload"],
|
|
6748
|
+
...strapi2.get("query-params").transform("admin::audit-log", query)
|
|
6749
|
+
});
|
|
6750
|
+
const sanitizedResults = results.map((result) => {
|
|
6751
|
+
const { user: user2, ...rest } = result;
|
|
6752
|
+
return {
|
|
6753
|
+
...rest,
|
|
6754
|
+
user: user2 ? getSanitizedUser(user2) : null
|
|
6755
|
+
};
|
|
6756
|
+
});
|
|
6757
|
+
return {
|
|
6758
|
+
results: sanitizedResults,
|
|
6759
|
+
pagination
|
|
6760
|
+
};
|
|
6761
|
+
},
|
|
6762
|
+
async findOne(id) {
|
|
6763
|
+
const result = await strapi2.db?.query("admin::audit-log").findOne({
|
|
6764
|
+
where: { id },
|
|
6765
|
+
populate: ["user"],
|
|
6766
|
+
select: ["action", "date", "payload"]
|
|
6767
|
+
});
|
|
6768
|
+
if (!result) {
|
|
6769
|
+
return null;
|
|
6770
|
+
}
|
|
6771
|
+
const { user: user2, ...rest } = result;
|
|
6772
|
+
return {
|
|
6773
|
+
...rest,
|
|
6774
|
+
user: user2 ? getSanitizedUser(user2) : null
|
|
6775
|
+
};
|
|
6776
|
+
},
|
|
6777
|
+
deleteExpiredEvents(expirationDate) {
|
|
6778
|
+
return strapi2.db?.query("admin::audit-log").deleteMany({
|
|
6779
|
+
where: {
|
|
6780
|
+
date: {
|
|
6781
|
+
$lt: expirationDate.toISOString()
|
|
6782
|
+
}
|
|
6783
|
+
}
|
|
6784
|
+
});
|
|
6785
|
+
}
|
|
6786
|
+
};
|
|
6787
|
+
};
|
|
6788
|
+
const DEFAULT_RETENTION_DAYS = 90;
|
|
6789
|
+
const defaultEvents = [
|
|
6790
|
+
"entry.create",
|
|
6791
|
+
"entry.update",
|
|
6792
|
+
"entry.delete",
|
|
6793
|
+
"entry.publish",
|
|
6794
|
+
"entry.unpublish",
|
|
6795
|
+
"media.create",
|
|
6796
|
+
"media.update",
|
|
6797
|
+
"media.delete",
|
|
6798
|
+
"media-folder.create",
|
|
6799
|
+
"media-folder.update",
|
|
6800
|
+
"media-folder.delete",
|
|
6801
|
+
"user.create",
|
|
6802
|
+
"user.update",
|
|
6803
|
+
"user.delete",
|
|
6804
|
+
"admin.auth.success",
|
|
6805
|
+
"admin.logout",
|
|
6806
|
+
"content-type.create",
|
|
6807
|
+
"content-type.update",
|
|
6808
|
+
"content-type.delete",
|
|
6809
|
+
"component.create",
|
|
6810
|
+
"component.update",
|
|
6811
|
+
"component.delete",
|
|
6812
|
+
"role.create",
|
|
6813
|
+
"role.update",
|
|
6814
|
+
"role.delete",
|
|
6815
|
+
"permission.create",
|
|
6816
|
+
"permission.update",
|
|
6817
|
+
"permission.delete"
|
|
6818
|
+
];
|
|
6819
|
+
const getEventMap = (defaultEvents2) => {
|
|
6820
|
+
const getDefaultPayload = (...args) => args[0];
|
|
6821
|
+
return defaultEvents2.reduce((acc, event) => {
|
|
6822
|
+
acc[event] = getDefaultPayload;
|
|
6823
|
+
return acc;
|
|
6824
|
+
}, {});
|
|
6825
|
+
};
|
|
6826
|
+
const getRetentionDays = (strapi2) => {
|
|
6827
|
+
const featureConfig = strapi2.ee.features.get("audit-logs");
|
|
6828
|
+
const licenseRetentionDays = typeof featureConfig === "object" && featureConfig?.options.retentionDays;
|
|
6829
|
+
const userRetentionDays = strapi2.config.get("admin.auditLogs.retentionDays");
|
|
6830
|
+
if (licenseRetentionDays == null) {
|
|
6831
|
+
return userRetentionDays ?? DEFAULT_RETENTION_DAYS;
|
|
6832
|
+
}
|
|
6833
|
+
if (userRetentionDays && userRetentionDays < licenseRetentionDays) {
|
|
6834
|
+
return userRetentionDays;
|
|
6835
|
+
}
|
|
6836
|
+
return licenseRetentionDays;
|
|
6837
|
+
};
|
|
6838
|
+
const createAuditLogsLifecycleService = (strapi2) => {
|
|
6839
|
+
const state = {};
|
|
6840
|
+
const auditLogsService = strapi2.get("audit-logs");
|
|
6841
|
+
const eventMap = getEventMap(defaultEvents);
|
|
6842
|
+
const processEvent = (name2, ...args) => {
|
|
6843
|
+
const requestState = strapi2.requestContext.get()?.state;
|
|
6844
|
+
const isUsingAdminAuth = requestState?.route.info.type === "admin";
|
|
6845
|
+
const user2 = requestState?.user;
|
|
6846
|
+
if (!isUsingAdminAuth || !user2) {
|
|
6847
|
+
return null;
|
|
6848
|
+
}
|
|
6849
|
+
const getPayload = eventMap[name2];
|
|
6850
|
+
if (!getPayload) {
|
|
6851
|
+
return null;
|
|
6852
|
+
}
|
|
6853
|
+
const ignoredUids = ["plugin::upload.file", "plugin::upload.folder"];
|
|
6854
|
+
if (ignoredUids.includes(args[0]?.uid)) {
|
|
6855
|
+
return null;
|
|
6856
|
+
}
|
|
6857
|
+
return {
|
|
6858
|
+
action: name2,
|
|
6859
|
+
date: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6860
|
+
payload: getPayload(...args) || {},
|
|
6861
|
+
userId: user2.id
|
|
6862
|
+
};
|
|
6863
|
+
};
|
|
6864
|
+
const handleEvent = async (name2, ...args) => {
|
|
6865
|
+
const processedEvent = processEvent(name2, ...args);
|
|
6866
|
+
if (processedEvent) {
|
|
6867
|
+
await auditLogsService.saveEvent(processedEvent);
|
|
6868
|
+
}
|
|
6869
|
+
};
|
|
6870
|
+
return {
|
|
6871
|
+
async register() {
|
|
6872
|
+
if (!state.eeEnableUnsubscribe) {
|
|
6873
|
+
state.eeEnableUnsubscribe = strapi2.eventHub.on("ee.enable", () => {
|
|
6874
|
+
this.destroy();
|
|
6875
|
+
this.register();
|
|
6876
|
+
});
|
|
6877
|
+
}
|
|
6878
|
+
if (!state.eeUpdateUnsubscribe) {
|
|
6879
|
+
state.eeUpdateUnsubscribe = strapi2.eventHub.on("ee.update", () => {
|
|
6880
|
+
this.destroy();
|
|
6881
|
+
this.register();
|
|
6882
|
+
});
|
|
6883
|
+
}
|
|
6884
|
+
state.eeDisableUnsubscribe = strapi2.eventHub.on("ee.disable", () => {
|
|
6885
|
+
this.destroy();
|
|
6886
|
+
});
|
|
6887
|
+
if (!strapi2.ee.features.isEnabled("audit-logs")) {
|
|
6888
|
+
return this;
|
|
6889
|
+
}
|
|
6890
|
+
state.eventHubUnsubscribe = strapi2.eventHub.subscribe(handleEvent);
|
|
6891
|
+
const retentionDays = getRetentionDays(strapi2);
|
|
6892
|
+
state.deleteExpiredJob = nodeSchedule.scheduleJob("0 0 * * *", () => {
|
|
6893
|
+
const expirationDate = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1e3);
|
|
6894
|
+
auditLogsService.deleteExpiredEvents(expirationDate);
|
|
6895
|
+
});
|
|
6896
|
+
return this;
|
|
6897
|
+
},
|
|
6898
|
+
unsubscribe() {
|
|
6899
|
+
if (state.eeDisableUnsubscribe) {
|
|
6900
|
+
state.eeDisableUnsubscribe();
|
|
6901
|
+
}
|
|
6902
|
+
if (state.eventHubUnsubscribe) {
|
|
6903
|
+
state.eventHubUnsubscribe();
|
|
6904
|
+
}
|
|
6905
|
+
if (state.deleteExpiredJob) {
|
|
6906
|
+
state.deleteExpiredJob.cancel();
|
|
6907
|
+
}
|
|
6908
|
+
return this;
|
|
6909
|
+
},
|
|
6910
|
+
destroy() {
|
|
6911
|
+
return this.unsubscribe();
|
|
6912
|
+
}
|
|
6913
|
+
};
|
|
6914
|
+
};
|
|
6915
|
+
const auditLog = {
|
|
6916
|
+
schema: {
|
|
6917
|
+
kind: "collectionType",
|
|
6918
|
+
collectionName: "strapi_audit_logs",
|
|
6919
|
+
info: {
|
|
6920
|
+
singularName: "audit-log",
|
|
6921
|
+
pluralName: "audit-logs",
|
|
6922
|
+
displayName: "Audit Log"
|
|
6923
|
+
},
|
|
6924
|
+
options: {
|
|
6925
|
+
timestamps: false
|
|
6926
|
+
},
|
|
6927
|
+
pluginOptions: {
|
|
6928
|
+
"content-manager": {
|
|
6929
|
+
visible: false
|
|
6930
|
+
},
|
|
6931
|
+
"content-type-builder": {
|
|
6932
|
+
visible: false
|
|
6933
|
+
}
|
|
6934
|
+
},
|
|
6935
|
+
attributes: {
|
|
6936
|
+
action: {
|
|
6937
|
+
type: "string",
|
|
6938
|
+
required: true
|
|
6939
|
+
},
|
|
6940
|
+
date: {
|
|
6941
|
+
type: "datetime",
|
|
6942
|
+
required: true
|
|
6943
|
+
},
|
|
6944
|
+
user: {
|
|
6945
|
+
type: "relation",
|
|
6946
|
+
relation: "oneToOne",
|
|
6947
|
+
target: "admin::user"
|
|
6948
|
+
},
|
|
6949
|
+
payload: {
|
|
6950
|
+
type: "json"
|
|
6951
|
+
}
|
|
6952
|
+
}
|
|
6953
|
+
}
|
|
6954
|
+
};
|
|
6955
|
+
const getAdminEE = () => {
|
|
6956
|
+
const eeAdmin = {
|
|
6957
|
+
register,
|
|
6958
|
+
bootstrap,
|
|
6959
|
+
destroy,
|
|
6960
|
+
contentTypes: {
|
|
6961
|
+
// Always register the audit-log content type to prevent data loss
|
|
6962
|
+
"audit-log": auditLog,
|
|
6963
|
+
...adminContentTypes
|
|
6964
|
+
},
|
|
6965
|
+
services,
|
|
6966
|
+
controllers,
|
|
6967
|
+
routes
|
|
6968
|
+
};
|
|
6969
|
+
if (strapi.config.get("admin.auditLogs.enabled", true) && strapi.ee.features.isEnabled("audit-logs")) {
|
|
6970
|
+
return {
|
|
6971
|
+
...eeAdmin,
|
|
6972
|
+
controllers: {
|
|
6973
|
+
...eeAdmin.controllers,
|
|
6974
|
+
"audit-logs": auditLogsController
|
|
6975
|
+
},
|
|
6976
|
+
routes: {
|
|
6977
|
+
...eeAdmin.routes,
|
|
6978
|
+
"audit-logs": auditLogsRoutes
|
|
6979
|
+
},
|
|
6980
|
+
async register({ strapi: strapi2 }) {
|
|
6981
|
+
await eeAdmin.register({ strapi: strapi2 });
|
|
6982
|
+
strapi2.add("audit-logs", createAuditLogsService(strapi2));
|
|
6983
|
+
const auditLogsLifecycle = createAuditLogsLifecycleService(strapi2);
|
|
6984
|
+
strapi2.add("audit-logs-lifecycle", auditLogsLifecycle);
|
|
6985
|
+
await auditLogsLifecycle.register();
|
|
6986
|
+
},
|
|
6987
|
+
async destroy({ strapi: strapi2 }) {
|
|
6988
|
+
strapi2.get("audit-logs-lifecycle").destroy();
|
|
6989
|
+
await eeAdmin.destroy({ strapi: strapi2 });
|
|
6990
|
+
}
|
|
6991
|
+
};
|
|
6992
|
+
}
|
|
6993
|
+
return eeAdmin;
|
|
6994
|
+
};
|
|
6995
|
+
let admin = {
|
|
6996
|
+
bootstrap: bootstrap$1,
|
|
6997
|
+
register: register$2,
|
|
6998
|
+
destroy: destroy$1,
|
|
6999
|
+
config,
|
|
7000
|
+
policies,
|
|
7001
|
+
routes: routes$1,
|
|
7002
|
+
services: services$1,
|
|
7003
|
+
controllers: controllers$1,
|
|
7004
|
+
contentTypes,
|
|
7005
|
+
middlewares: middlewares$1
|
|
7006
|
+
};
|
|
7007
|
+
const mergeRoutes = (a, b, key) => {
|
|
7008
|
+
return ___namespace.default.isArray(a) && ___namespace.default.isArray(b) && key === "routes" ? a.concat(b) : void 0;
|
|
7009
|
+
};
|
|
7010
|
+
if (strapi.EE) {
|
|
7011
|
+
admin = ___namespace.default.mergeWith({}, admin, getAdminEE(), mergeRoutes);
|
|
7012
|
+
}
|
|
7013
|
+
const admin$1 = admin;
|
|
7014
|
+
module.exports = admin$1;
|
|
5656
7015
|
//# sourceMappingURL=index.js.map
|