@strapi/admin 5.0.0-rc.9 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/{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-AAIv_ZkF.mjs} +5 -5
- package/dist/admin/{ApplicationInfoPage-ahnTcFV1.mjs.map → ApplicationInfoPage-AAIv_ZkF.mjs.map} +1 -1
- package/dist/admin/{ApplicationInfoPage-JfdJ0U4H.js → ApplicationInfoPage-bkWa99An.js} +5 -5
- package/dist/admin/{ApplicationInfoPage-JfdJ0U4H.js.map → ApplicationInfoPage-bkWa99An.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-J22BBdYe.mjs} +31 -39
- package/dist/admin/AuthenticatedLayout-J22BBdYe.mjs.map +1 -0
- package/dist/admin/{AuthenticatedLayout-eKDwvUFO.js → AuthenticatedLayout-ZAXB7o93.js} +30 -38
- package/dist/admin/AuthenticatedLayout-ZAXB7o93.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-3V_sa8A4.js} +3 -3
- package/dist/admin/{CreatePage-68skzZjY.js.map → CreatePage-3V_sa8A4.js.map} +1 -1
- package/dist/admin/{CreatePage-bdWb1wg4.mjs → CreatePage-5WzWwepG.mjs} +7 -7
- package/dist/admin/CreatePage-5WzWwepG.mjs.map +1 -0
- package/dist/admin/{CreatePage-Yd5JyWS5.mjs → CreatePage-hEdR3uWK.mjs} +3 -3
- package/dist/admin/{CreatePage-Yd5JyWS5.mjs.map → CreatePage-hEdR3uWK.mjs.map} +1 -1
- package/dist/admin/{CreatePage-t5HQUOqJ.js → CreatePage-zzbF8IhD.js} +6 -6
- package/dist/admin/CreatePage-zzbF8IhD.js.map +1 -0
- package/dist/admin/{CreateView-yv51Pyvw.js → CreateView-5EC5Yv96.js} +3 -3
- package/dist/admin/{CreateView-yv51Pyvw.js.map → CreateView-5EC5Yv96.js.map} +1 -1
- package/dist/admin/{CreateView-ZZaA8hbe.mjs → CreateView-OjaERndy.mjs} +3 -3
- package/dist/admin/{CreateView-ZZaA8hbe.mjs.map → CreateView-OjaERndy.mjs.map} +1 -1
- package/dist/admin/{CreateView-V0v5CK8t.mjs → CreateView-S8gDQUCt.mjs} +3 -3
- package/dist/admin/{CreateView-V0v5CK8t.mjs.map → CreateView-S8gDQUCt.mjs.map} +1 -1
- package/dist/admin/{CreateView-nzILLv0g.js → CreateView-ZQEmP8-n.js} +3 -3
- package/dist/admin/{CreateView-nzILLv0g.js.map → CreateView-ZQEmP8-n.js.map} +1 -1
- package/dist/admin/{EditPage-cWJ8V1BK.mjs → EditPage-493L2-vV.mjs} +27 -23
- package/dist/admin/EditPage-493L2-vV.mjs.map +1 -0
- package/dist/admin/{EditPage-A7-BewPd.mjs → EditPage-7fMqo-c-.mjs} +7 -7
- package/dist/admin/EditPage-7fMqo-c-.mjs.map +1 -0
- package/dist/admin/{EditPage-pTQCDncU.js → EditPage-8T9gBnnc.js} +25 -21
- package/dist/admin/EditPage-8T9gBnnc.js.map +1 -0
- package/dist/admin/{EditPage-Lw36XG9G.js → EditPage-OFlfNGv0.js} +6 -6
- package/dist/admin/EditPage-OFlfNGv0.js.map +1 -0
- package/dist/admin/{EditPage-2cMhX4F_.mjs → EditPage-akxbKeqK.mjs} +8 -8
- package/dist/admin/{EditPage-2cMhX4F_.mjs.map → EditPage-akxbKeqK.mjs.map} +1 -1
- package/dist/admin/{EditPage-LoESB5pq.js → EditPage-gJJgatNc.js} +7 -7
- package/dist/admin/{EditPage-LoESB5pq.js.map → EditPage-gJJgatNc.js.map} +1 -1
- package/dist/admin/{EditView-KzdDTSO-.js → EditView-ZJPPeal2.js} +5 -6
- package/dist/admin/EditView-ZJPPeal2.js.map +1 -0
- package/dist/admin/{EditView-HygMdUSf.mjs → EditView-_QID3gT5.mjs} +7 -8
- package/dist/admin/EditView-_QID3gT5.mjs.map +1 -0
- package/dist/admin/{EditViewPage-FgsrW_wV.js → EditViewPage-_wx5u6QJ.js} +5 -5
- package/dist/admin/{EditViewPage-FgsrW_wV.js.map → EditViewPage-_wx5u6QJ.js.map} +1 -1
- package/dist/admin/{EditViewPage-47F2xHBt.mjs → EditViewPage-zkNmb1zg.mjs} +6 -6
- package/dist/admin/{EditViewPage-47F2xHBt.mjs.map → EditViewPage-zkNmb1zg.mjs.map} +1 -1
- package/dist/admin/{EventsTable--XlOTHxM.js → EventsTable-31485Cwq.js} +2 -2
- package/dist/admin/{EventsTable--XlOTHxM.js.map → EventsTable-31485Cwq.js.map} +1 -1
- package/dist/admin/{EventsTable-mgIyB8DL.mjs → EventsTable-_BT8dIHY.mjs} +2 -2
- package/dist/admin/{EventsTable-mgIyB8DL.mjs.map → EventsTable-_BT8dIHY.mjs.map} +1 -1
- package/dist/admin/{HomePage-dyDldozB.mjs → HomePage-LenrY0bj.mjs} +7 -10
- package/dist/admin/HomePage-LenrY0bj.mjs.map +1 -0
- package/dist/admin/{HomePage-H77dsrr1.mjs → HomePage-NdId9gqT.mjs} +3 -3
- package/dist/admin/{HomePage-H77dsrr1.mjs.map → HomePage-NdId9gqT.mjs.map} +1 -1
- package/dist/admin/{HomePage-ywYHZHMa.js → HomePage-T2yVEfC3.js} +15 -18
- package/dist/admin/HomePage-T2yVEfC3.js.map +1 -0
- package/dist/admin/{HomePage-uVwht52t.js → HomePage-yyizKL39.js} +3 -3
- package/dist/admin/{HomePage-uVwht52t.js.map → HomePage-yyizKL39.js.map} +1 -1
- package/dist/admin/{InstalledPluginsPage-3OSkplVn.mjs → InstalledPlugins-Z_uS95dC.mjs} +9 -11
- package/dist/admin/InstalledPlugins-Z_uS95dC.mjs.map +1 -0
- package/dist/admin/{InstalledPluginsPage-JkruwT2d.js → InstalledPlugins-spdwM8ub.js} +9 -11
- package/dist/admin/InstalledPlugins-spdwM8ub.js.map +1 -0
- package/dist/admin/{Layout-8Ds_z3XN.mjs → Layout-5lg6USuO.mjs} +5 -5
- package/dist/admin/{Layout-8Ds_z3XN.mjs.map → Layout-5lg6USuO.mjs.map} +1 -1
- package/dist/admin/{Layout-pVTNV6PU.js → Layout-B3TQMQxb.js} +5 -5
- package/dist/admin/{Layout-pVTNV6PU.js.map → Layout-B3TQMQxb.js.map} +1 -1
- package/dist/admin/{ListPage-semY3kTl.mjs → ListPage--B6TB-mt.mjs} +4 -4
- package/dist/admin/{ListPage-semY3kTl.mjs.map → ListPage--B6TB-mt.mjs.map} +1 -1
- package/dist/admin/{ListPage-DHUp0PDw.js → ListPage-GRLtmRuy.js} +8 -8
- package/dist/admin/ListPage-GRLtmRuy.js.map +1 -0
- package/dist/admin/{ListPage-NtjeF8R2.mjs → ListPage-Ggd99FLO.mjs} +4 -4
- package/dist/admin/{ListPage-NtjeF8R2.mjs.map → ListPage-Ggd99FLO.mjs.map} +1 -1
- package/dist/admin/{ListPage-OIdhjljI.js → ListPage-Hc3VZ9O3.js} +6 -6
- package/dist/admin/{ListPage-OIdhjljI.js.map → ListPage-Hc3VZ9O3.js.map} +1 -1
- package/dist/admin/{ListPage-LokTy34i.mjs → ListPage-LIn0aEKt.mjs} +3 -3
- package/dist/admin/{ListPage-LokTy34i.mjs.map → ListPage-LIn0aEKt.mjs.map} +1 -1
- package/dist/admin/{ListPage-15KiUCLt.js → ListPage-UEsKYDPH.js} +3 -3
- package/dist/admin/{ListPage-15KiUCLt.js.map → ListPage-UEsKYDPH.js.map} +1 -1
- package/dist/admin/{ListPage-dApwERT6.js → ListPage-Vf4xtn8w.js} +5 -5
- package/dist/admin/{ListPage-dApwERT6.js.map → ListPage-Vf4xtn8w.js.map} +1 -1
- package/dist/admin/{ListPage-8M-bmv0a.mjs → ListPage-rCkaHmeP.mjs} +6 -6
- package/dist/admin/{ListPage-8M-bmv0a.mjs.map → ListPage-rCkaHmeP.mjs.map} +1 -1
- package/dist/admin/{ListPage-hNIbvh17.mjs → ListPage-vJik-wkj.mjs} +10 -10
- package/dist/admin/ListPage-vJik-wkj.mjs.map +1 -0
- package/dist/admin/{ListPage-jTpJnTuQ.js → ListPage-y3rcDJX1.js} +3 -3
- package/dist/admin/{ListPage-jTpJnTuQ.js.map → ListPage-y3rcDJX1.js.map} +1 -1
- package/dist/admin/{ListView-ZSEn2tK5.js → ListView-8pEtfLsu.js} +5 -5
- package/dist/admin/{ListView-ZSEn2tK5.js.map → ListView-8pEtfLsu.js.map} +1 -1
- package/dist/admin/{ListView-tCCo7pVS.mjs → ListView-iCqFRGiO.mjs} +5 -5
- package/dist/admin/{ListView-tCCo7pVS.mjs.map → ListView-iCqFRGiO.mjs.map} +1 -1
- package/dist/admin/{ListView-kEuSmXPm.mjs → ListView-jrsV1wF_.mjs} +5 -5
- package/dist/admin/{ListView-kEuSmXPm.mjs.map → ListView-jrsV1wF_.mjs.map} +1 -1
- package/dist/admin/{ListView-MA83TDJF.js → ListView-noYLY_DM.js} +4 -4
- package/dist/admin/{ListView-MA83TDJF.js.map → ListView-noYLY_DM.js.map} +1 -1
- package/dist/admin/{Login-GLcLgHUd.mjs → Login--GgWQano.mjs} +3 -3
- package/dist/admin/{Login-GLcLgHUd.mjs.map → Login--GgWQano.mjs.map} +1 -1
- package/dist/admin/{Login-RrWZQA_X.js → Login-qr72UXGp.js} +3 -3
- package/dist/admin/{Login-RrWZQA_X.js.map → Login-qr72UXGp.js.map} +1 -1
- package/dist/admin/{MagicLinkEE-u0n-nwtv.js → MagicLinkEE-uTufI4yx.js} +3 -3
- package/dist/admin/{MagicLinkEE-u0n-nwtv.js.map → MagicLinkEE-uTufI4yx.js.map} +1 -1
- package/dist/admin/{MagicLinkEE-_qltdLkk.mjs → MagicLinkEE-vQcgXndx.mjs} +3 -3
- package/dist/admin/{MagicLinkEE-_qltdLkk.mjs.map → MagicLinkEE-vQcgXndx.mjs.map} +1 -1
- package/dist/admin/{MarketplacePage-41CstG0b.mjs → MarketplacePage-LRlL_4ys.mjs} +64 -63
- package/dist/admin/MarketplacePage-LRlL_4ys.mjs.map +1 -0
- package/dist/admin/{MarketplacePage-uyOTT12t.js → MarketplacePage-yRWZ54oN.js} +65 -64
- package/dist/admin/MarketplacePage-yRWZ54oN.js.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-wxZFen3W.js → ProfilePage-Mte9RhXw.js} +5 -5
- package/dist/admin/ProfilePage-Mte9RhXw.js.map +1 -0
- package/dist/admin/{ProfilePage-zwG0fq_e.mjs → ProfilePage-voofTYei.mjs} +6 -6
- package/dist/admin/ProfilePage-voofTYei.mjs.map +1 -0
- package/dist/admin/{PurchaseAuditLogs-FDPV-ZqU.mjs → PurchaseAuditLogs-8wmVhLCb.mjs} +2 -2
- package/dist/admin/{PurchaseAuditLogs-FDPV-ZqU.mjs.map → PurchaseAuditLogs-8wmVhLCb.mjs.map} +1 -1
- package/dist/admin/{PurchaseAuditLogs-f6iczpRi.js → PurchaseAuditLogs-qxVh-U_P.js} +2 -2
- package/dist/admin/{PurchaseAuditLogs-f6iczpRi.js.map → PurchaseAuditLogs-qxVh-U_P.js.map} +1 -1
- package/dist/admin/{PurchaseSingleSignOn-S0B2HM4d.mjs → PurchaseSingleSignOn-kgjD8gsd.mjs} +2 -2
- package/dist/admin/{PurchaseSingleSignOn-S0B2HM4d.mjs.map → PurchaseSingleSignOn-kgjD8gsd.mjs.map} +1 -1
- package/dist/admin/{PurchaseSingleSignOn-0wXAjOLm.js → PurchaseSingleSignOn-ovEsG_Ud.js} +2 -2
- package/dist/admin/{PurchaseSingleSignOn-0wXAjOLm.js.map → PurchaseSingleSignOn-ovEsG_Ud.js.map} +1 -1
- package/dist/admin/{SelectRoles-h_1srnVz.mjs → SelectRoles-Kzqv2-TI.mjs} +6 -6
- package/dist/admin/SelectRoles-Kzqv2-TI.mjs.map +1 -0
- package/dist/admin/{SelectRoles-MoDtdDcM.js → SelectRoles-pjJ11lBU.js} +7 -7
- package/dist/admin/SelectRoles-pjJ11lBU.js.map +1 -0
- package/dist/admin/{SingleSignOnPage-5CdOsumW.js → SingleSignOnPage-WjL8NvC5.js} +4 -4
- package/dist/admin/{SingleSignOnPage-5CdOsumW.js.map → SingleSignOnPage-WjL8NvC5.js.map} +1 -1
- package/dist/admin/{SingleSignOnPage-AZVczKwR.mjs → SingleSignOnPage-p1fTOytT.mjs} +5 -5
- package/dist/admin/{SingleSignOnPage-AZVczKwR.mjs.map → SingleSignOnPage-p1fTOytT.mjs.map} +1 -1
- package/dist/admin/{Table-EPKfcF5-.mjs → Table-ARSVxoYe.mjs} +12 -19
- package/dist/admin/Table-ARSVxoYe.mjs.map +1 -0
- package/dist/admin/{Table-CpbvaRQh.js → Table-QAvKSSis.js} +12 -19
- package/dist/admin/Table-QAvKSSis.js.map +1 -0
- package/dist/admin/{Theme-PrUuuGtN.mjs → Theme-frC82ceE.mjs} +221 -20
- package/dist/admin/Theme-frC82ceE.mjs.map +1 -0
- package/dist/admin/{Theme-7W0we6BI.js → Theme-y_rWTknM.js} +225 -19
- package/dist/admin/Theme-y_rWTknM.js.map +1 -0
- package/dist/admin/{TokenTypeSelect-yRV19q7R.js → TokenTypeSelect-biZzRJv2.js} +4 -5
- package/dist/admin/{TokenTypeSelect-yRV19q7R.js.map → TokenTypeSelect-biZzRJv2.js.map} +1 -1
- package/dist/admin/{TokenTypeSelect-7Ki5z_3z.mjs → TokenTypeSelect-j-b_9iB9.mjs} +4 -5
- package/dist/admin/{TokenTypeSelect-7Ki5z_3z.mjs.map → TokenTypeSelect-j-b_9iB9.mjs.map} +1 -1
- package/dist/admin/{UseCasePage-as6-3qKD.mjs → UseCasePage-b2VozaZB.mjs} +4 -4
- package/dist/admin/{UseCasePage-as6-3qKD.mjs.map → UseCasePage-b2VozaZB.mjs.map} +1 -1
- package/dist/admin/{UseCasePage-l9OmQYhK.js → UseCasePage-hJH0orUl.js} +4 -4
- package/dist/admin/{UseCasePage-l9OmQYhK.js.map → UseCasePage-hJH0orUl.js.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-bgMqSKBQ.js} +3 -3
- package/dist/admin/{constants-X2uDAtEA.js.map → constants-bgMqSKBQ.js.map} +1 -1
- package/dist/admin/{constants-AYR471DB.mjs → constants-jKuNcrQj.mjs} +3 -3
- package/dist/admin/{constants-AYR471DB.mjs.map → constants-jKuNcrQj.mjs.map} +1 -1
- package/dist/admin/ee.mjs +1 -1
- package/dist/admin/{en-TbnMBjZf.js → en-_1-Nn7iH.js} +3 -2
- package/dist/admin/{en-TbnMBjZf.js.map → en-_1-Nn7iH.js.map} +1 -1
- package/dist/admin/{en-0Ld-ipyI.mjs → en-lDO5lPD0.mjs} +3 -2
- package/dist/admin/{en-0Ld-ipyI.mjs.map → en-lDO5lPD0.mjs.map} +1 -1
- package/dist/admin/{index-Fu3hPmaj.mjs → index-hoTsgrwy.mjs} +136 -279
- package/dist/admin/index-hoTsgrwy.mjs.map +1 -0
- package/dist/admin/{index-w33_0vI-.js → index-we0DbzVF.js} +140 -286
- package/dist/admin/index-we0DbzVF.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/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-w6h8NFK5.js → useAdminRoles-0gM7o3f2.js} +2 -2
- package/dist/admin/{useAdminRoles-w6h8NFK5.js.map → useAdminRoles-0gM7o3f2.js.map} +1 -1
- package/dist/admin/{useAdminRoles-lDesL4gN.mjs → useAdminRoles-uRNvxyDX.mjs} +2 -2
- package/dist/admin/{useAdminRoles-lDesL4gN.mjs.map → useAdminRoles-uRNvxyDX.mjs.map} +1 -1
- package/dist/admin/{useLicenseLimitNotification-PaR7jmqd.mjs → useLicenseLimitNotification-Qx_rSpUQ.mjs} +3 -3
- package/dist/admin/{useLicenseLimitNotification-PaR7jmqd.mjs.map → useLicenseLimitNotification-Qx_rSpUQ.mjs.map} +1 -1
- package/dist/admin/{useLicenseLimitNotification-g1vq6nzk.js → useLicenseLimitNotification-eau4ja6h.js} +2 -2
- package/dist/admin/{useLicenseLimitNotification-g1vq6nzk.js.map → useLicenseLimitNotification-eau4ja6h.js.map} +1 -1
- package/dist/admin/{useLicenseLimits-Jy6E6qc2.mjs → useLicenseLimits-j5znikzW.mjs} +2 -2
- package/dist/admin/{useLicenseLimits-Jy6E6qc2.mjs.map → useLicenseLimits-j5znikzW.mjs.map} +1 -1
- package/dist/admin/{useWebhooks-7thg-d57.mjs → useWebhooks-upF7mgdZ.mjs} +2 -2
- package/dist/admin/{useWebhooks-7thg-d57.mjs.map → useWebhooks-upF7mgdZ.mjs.map} +1 -1
- package/dist/admin/{validation-IcNGA_ef.mjs → validation-OR7t0a-C.mjs} +4 -4
- package/dist/admin/validation-OR7t0a-C.mjs.map +1 -0
- package/dist/admin/{validation-4SWh9S5z.js → validation-VuxEFW4W.js} +4 -4
- package/dist/admin/validation-VuxEFW4W.js.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 +10 -9
- package/dist/server/index.js +1891 -538
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +1687 -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/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 +17 -16
- 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,27 @@ 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
|
-
"0 0 0 * * *": () => sendUpdateProjectInformation(strapi2)
|
|
2307
|
+
"0 0 0 * * *": () => sendUpdateProjectInformation$1(strapi2)
|
|
2308
2308
|
});
|
|
2309
2309
|
};
|
|
2310
|
-
const metrics = {
|
|
2310
|
+
const metrics$1 = {
|
|
2311
2311
|
sendDidInviteUser,
|
|
2312
2312
|
sendDidUpdateRolePermissions,
|
|
2313
2313
|
sendDidChangeInterfaceLanguage,
|
|
2314
|
-
sendUpdateProjectInformation,
|
|
2315
|
-
startCron
|
|
2314
|
+
sendUpdateProjectInformation: sendUpdateProjectInformation$1,
|
|
2315
|
+
startCron: startCron$1
|
|
2316
2316
|
};
|
|
2317
2317
|
const defaultJwtOptions = { expiresIn: "30d" };
|
|
2318
2318
|
const getTokenOptions = () => {
|
|
@@ -2357,37 +2357,37 @@ const token$3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
|
|
|
2357
2357
|
decodeJwtToken,
|
|
2358
2358
|
getTokenOptions
|
|
2359
2359
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
2360
|
-
const registerProviderActionSchema = utils$
|
|
2361
|
-
utils$
|
|
2362
|
-
uid: utils$
|
|
2360
|
+
const registerProviderActionSchema = utils$2.yup.array().required().of(
|
|
2361
|
+
utils$2.yup.object().shape({
|
|
2362
|
+
uid: utils$2.yup.string().matches(
|
|
2363
2363
|
/^[a-z]([a-z|.|-]+)[a-z]$/,
|
|
2364
2364
|
(v) => `${v.path}: The id can only contain lowercase letters, dots and hyphens.`
|
|
2365
2365
|
).required(),
|
|
2366
|
-
section: utils$
|
|
2367
|
-
pluginName: utils$
|
|
2366
|
+
section: utils$2.yup.string().oneOf(["contentTypes", "plugins", "settings", "internal"]).required(),
|
|
2367
|
+
pluginName: utils$2.yup.mixed().when("section", {
|
|
2368
2368
|
is: "plugins",
|
|
2369
2369
|
then: validators.isAPluginName.required(),
|
|
2370
2370
|
otherwise: validators.isAPluginName
|
|
2371
2371
|
}),
|
|
2372
|
-
subjects: utils$
|
|
2372
|
+
subjects: utils$2.yup.mixed().when("section", {
|
|
2373
2373
|
is: "contentTypes",
|
|
2374
|
-
then: utils$
|
|
2375
|
-
otherwise: utils$
|
|
2374
|
+
then: utils$2.yup.array().of(utils$2.yup.string()).required(),
|
|
2375
|
+
otherwise: utils$2.yup.mixed().oneOf([void 0], 'subjects should only be defined for the "contentTypes" section')
|
|
2376
2376
|
}),
|
|
2377
|
-
displayName: utils$
|
|
2378
|
-
category: utils$
|
|
2377
|
+
displayName: utils$2.yup.string().required(),
|
|
2378
|
+
category: utils$2.yup.mixed().when("section", {
|
|
2379
2379
|
is: "settings",
|
|
2380
|
-
then: utils$
|
|
2381
|
-
otherwise: utils$
|
|
2380
|
+
then: utils$2.yup.string().required(),
|
|
2381
|
+
otherwise: utils$2.yup.mixed().test(
|
|
2382
2382
|
"settingsCategory",
|
|
2383
2383
|
'category should only be defined for the "settings" section',
|
|
2384
2384
|
(cat) => cat === void 0
|
|
2385
2385
|
)
|
|
2386
2386
|
}),
|
|
2387
|
-
subCategory: utils$
|
|
2387
|
+
subCategory: utils$2.yup.mixed().when("section", {
|
|
2388
2388
|
is: (section) => ["settings", "plugins"].includes(section),
|
|
2389
|
-
then: utils$
|
|
2390
|
-
otherwise: utils$
|
|
2389
|
+
then: utils$2.yup.string(),
|
|
2390
|
+
otherwise: utils$2.yup.mixed().test(
|
|
2391
2391
|
"settingsSubCategory",
|
|
2392
2392
|
'subCategory should only be defined for "plugins" and "settings" sections',
|
|
2393
2393
|
(subCat) => {
|
|
@@ -2395,23 +2395,23 @@ const registerProviderActionSchema = utils$1.yup.array().required().of(
|
|
|
2395
2395
|
}
|
|
2396
2396
|
)
|
|
2397
2397
|
}),
|
|
2398
|
-
options: utils$
|
|
2399
|
-
applyToProperties: utils$
|
|
2398
|
+
options: utils$2.yup.object({
|
|
2399
|
+
applyToProperties: utils$2.yup.array().of(utils$2.yup.string())
|
|
2400
2400
|
}),
|
|
2401
|
-
aliases: utils$
|
|
2402
|
-
utils$
|
|
2403
|
-
actionId: utils$
|
|
2404
|
-
subjects: utils$
|
|
2401
|
+
aliases: utils$2.yup.array(
|
|
2402
|
+
utils$2.yup.object({
|
|
2403
|
+
actionId: utils$2.yup.string(),
|
|
2404
|
+
subjects: utils$2.yup.array(utils$2.yup.string()).nullable()
|
|
2405
2405
|
})
|
|
2406
2406
|
).nullable()
|
|
2407
2407
|
}).noUnknown()
|
|
2408
2408
|
);
|
|
2409
|
-
const validateRegisterProviderAction = utils$
|
|
2410
|
-
const { ApplicationError: ApplicationError$
|
|
2409
|
+
const validateRegisterProviderAction = utils$2.validateYupSchemaSync(registerProviderActionSchema);
|
|
2410
|
+
const { ApplicationError: ApplicationError$8 } = utils$2.errors;
|
|
2411
2411
|
const createActionProvider = (options) => {
|
|
2412
|
-
const provider = utils$
|
|
2412
|
+
const provider = utils$2.providerFactory(options);
|
|
2413
2413
|
const actionHooks = {
|
|
2414
|
-
appliesPropertyToSubject: utils$
|
|
2414
|
+
appliesPropertyToSubject: utils$2.hooks.createAsyncParallelHook()
|
|
2415
2415
|
};
|
|
2416
2416
|
return {
|
|
2417
2417
|
...provider,
|
|
@@ -2437,7 +2437,7 @@ const createActionProvider = (options) => {
|
|
|
2437
2437
|
async appliesToProperty(property, actionId, subject2) {
|
|
2438
2438
|
const action2 = provider.get(actionId);
|
|
2439
2439
|
if (!action2) {
|
|
2440
|
-
throw new ApplicationError$
|
|
2440
|
+
throw new ApplicationError$8(`No action found with id "${actionId}"`);
|
|
2441
2441
|
}
|
|
2442
2442
|
const appliesToAction = actionDomain.appliesToProperty(property, action2);
|
|
2443
2443
|
if (!appliesToAction) {
|
|
@@ -2515,7 +2515,7 @@ const domain = {
|
|
|
2515
2515
|
sanitizeConditionAttributes
|
|
2516
2516
|
};
|
|
2517
2517
|
const createConditionProvider = () => {
|
|
2518
|
-
const provider = utils$
|
|
2518
|
+
const provider = utils$2.providerFactory();
|
|
2519
2519
|
return {
|
|
2520
2520
|
...provider,
|
|
2521
2521
|
async register(conditionAttributes) {
|
|
@@ -2535,14 +2535,14 @@ const createConditionProvider = () => {
|
|
|
2535
2535
|
};
|
|
2536
2536
|
const {
|
|
2537
2537
|
visitors: { removePassword, expandWildcardPopulate }
|
|
2538
|
-
} = utils$
|
|
2538
|
+
} = utils$2.sanitize;
|
|
2539
2539
|
const {
|
|
2540
2540
|
constants: constants$1,
|
|
2541
2541
|
isScalarAttribute: isScalarAttribute$1,
|
|
2542
2542
|
getNonVisibleAttributes: getNonVisibleAttributes$1,
|
|
2543
2543
|
getNonWritableAttributes,
|
|
2544
2544
|
getWritableAttributes: getWritableAttributes$1
|
|
2545
|
-
} = utils$
|
|
2545
|
+
} = utils$2.contentTypes;
|
|
2546
2546
|
const {
|
|
2547
2547
|
ID_ATTRIBUTE: ID_ATTRIBUTE$1,
|
|
2548
2548
|
DOC_ID_ATTRIBUTE: DOC_ID_ATTRIBUTE$1,
|
|
@@ -2556,7 +2556,7 @@ const COMPONENT_FIELDS$1 = ["__component"];
|
|
|
2556
2556
|
const STATIC_FIELDS$1 = [ID_ATTRIBUTE$1, DOC_ID_ATTRIBUTE$1];
|
|
2557
2557
|
const createSanitizeHelpers = ({ action: action2, ability: ability$1, model }) => {
|
|
2558
2558
|
const schema = strapi.getModel(model);
|
|
2559
|
-
const { removeDisallowedFields } = utils$
|
|
2559
|
+
const { removeDisallowedFields } = utils$2.sanitize.visitors;
|
|
2560
2560
|
const ctx = {
|
|
2561
2561
|
schema,
|
|
2562
2562
|
getModel: strapi.getModel.bind(strapi)
|
|
@@ -2564,39 +2564,39 @@ const createSanitizeHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2564
2564
|
const createSanitizeQuery = (options = {}) => {
|
|
2565
2565
|
const { fields } = options;
|
|
2566
2566
|
const permittedFields = fields.shouldIncludeAll ? null : getQueryFields(fields.permitted);
|
|
2567
|
-
const sanitizeFilters = utils$
|
|
2568
|
-
utils$
|
|
2569
|
-
utils$
|
|
2570
|
-
utils$
|
|
2571
|
-
utils$
|
|
2572
|
-
utils$
|
|
2567
|
+
const sanitizeFilters = utils$2.async.pipe(
|
|
2568
|
+
utils$2.traverse.traverseQueryFilters(removeDisallowedFields(permittedFields), ctx),
|
|
2569
|
+
utils$2.traverse.traverseQueryFilters(omitDisallowedAdminUserFields, ctx),
|
|
2570
|
+
utils$2.traverse.traverseQueryFilters(omitHiddenFields, ctx),
|
|
2571
|
+
utils$2.traverse.traverseQueryFilters(removePassword, ctx),
|
|
2572
|
+
utils$2.traverse.traverseQueryFilters(({ key, value }, { remove }) => {
|
|
2573
2573
|
if (fp.isObject(value) && fp.isEmpty(value)) {
|
|
2574
2574
|
remove(key);
|
|
2575
2575
|
}
|
|
2576
2576
|
}, ctx)
|
|
2577
2577
|
);
|
|
2578
|
-
const sanitizeSort = utils$
|
|
2579
|
-
utils$
|
|
2580
|
-
utils$
|
|
2581
|
-
utils$
|
|
2582
|
-
utils$
|
|
2583
|
-
utils$
|
|
2578
|
+
const sanitizeSort = utils$2.async.pipe(
|
|
2579
|
+
utils$2.traverse.traverseQuerySort(removeDisallowedFields(permittedFields), ctx),
|
|
2580
|
+
utils$2.traverse.traverseQuerySort(omitDisallowedAdminUserFields, ctx),
|
|
2581
|
+
utils$2.traverse.traverseQuerySort(omitHiddenFields, ctx),
|
|
2582
|
+
utils$2.traverse.traverseQuerySort(removePassword, ctx),
|
|
2583
|
+
utils$2.traverse.traverseQuerySort(({ key, attribute, value }, { remove }) => {
|
|
2584
2584
|
if (!isScalarAttribute$1(attribute) && fp.isEmpty(value)) {
|
|
2585
2585
|
remove(key);
|
|
2586
2586
|
}
|
|
2587
2587
|
}, ctx)
|
|
2588
2588
|
);
|
|
2589
|
-
const sanitizePopulate = utils$
|
|
2590
|
-
utils$
|
|
2591
|
-
utils$
|
|
2592
|
-
utils$
|
|
2593
|
-
utils$
|
|
2594
|
-
utils$
|
|
2589
|
+
const sanitizePopulate = utils$2.async.pipe(
|
|
2590
|
+
utils$2.traverse.traverseQueryPopulate(expandWildcardPopulate, ctx),
|
|
2591
|
+
utils$2.traverse.traverseQueryPopulate(removeDisallowedFields(permittedFields), ctx),
|
|
2592
|
+
utils$2.traverse.traverseQueryPopulate(omitDisallowedAdminUserFields, ctx),
|
|
2593
|
+
utils$2.traverse.traverseQueryPopulate(omitHiddenFields, ctx),
|
|
2594
|
+
utils$2.traverse.traverseQueryPopulate(removePassword, ctx)
|
|
2595
2595
|
);
|
|
2596
|
-
const sanitizeFields = utils$
|
|
2597
|
-
utils$
|
|
2598
|
-
utils$
|
|
2599
|
-
utils$
|
|
2596
|
+
const sanitizeFields = utils$2.async.pipe(
|
|
2597
|
+
utils$2.traverse.traverseQueryFields(removeDisallowedFields(permittedFields), ctx),
|
|
2598
|
+
utils$2.traverse.traverseQueryFields(omitHiddenFields, ctx),
|
|
2599
|
+
utils$2.traverse.traverseQueryFields(removePassword, ctx)
|
|
2600
2600
|
);
|
|
2601
2601
|
return async (query) => {
|
|
2602
2602
|
const sanitizedQuery = fp.cloneDeep(query);
|
|
@@ -2618,15 +2618,15 @@ const createSanitizeHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2618
2618
|
const createSanitizeOutput = (options = {}) => {
|
|
2619
2619
|
const { fields } = options;
|
|
2620
2620
|
const permittedFields = fields.shouldIncludeAll ? null : getOutputFields(fields.permitted);
|
|
2621
|
-
return utils$
|
|
2621
|
+
return utils$2.async.pipe(
|
|
2622
2622
|
// Remove fields hidden from the admin
|
|
2623
|
-
utils$
|
|
2623
|
+
utils$2.traverseEntity(omitHiddenFields, ctx),
|
|
2624
2624
|
// Remove unallowed fields from admin::user relations
|
|
2625
|
-
utils$
|
|
2625
|
+
utils$2.traverseEntity(pickAllowedAdminUserFields, ctx),
|
|
2626
2626
|
// Remove not allowed fields (RBAC)
|
|
2627
|
-
utils$
|
|
2627
|
+
utils$2.traverseEntity(removeDisallowedFields(permittedFields), ctx),
|
|
2628
2628
|
// Remove all fields of type 'password'
|
|
2629
|
-
utils$
|
|
2629
|
+
utils$2.sanitize.sanitizers.sanitizePasswords({
|
|
2630
2630
|
schema,
|
|
2631
2631
|
getModel(uid) {
|
|
2632
2632
|
return strapi.getModel(uid);
|
|
@@ -2637,11 +2637,11 @@ const createSanitizeHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2637
2637
|
const createSanitizeInput = (options = {}) => {
|
|
2638
2638
|
const { fields } = options;
|
|
2639
2639
|
const permittedFields = fields.shouldIncludeAll ? null : getInputFields(fields.permitted);
|
|
2640
|
-
return utils$
|
|
2640
|
+
return utils$2.async.pipe(
|
|
2641
2641
|
// Remove fields hidden from the admin
|
|
2642
|
-
utils$
|
|
2642
|
+
utils$2.traverseEntity(omitHiddenFields, ctx),
|
|
2643
2643
|
// Remove not allowed fields (RBAC)
|
|
2644
|
-
utils$
|
|
2644
|
+
utils$2.traverseEntity(removeDisallowedFields(permittedFields), ctx),
|
|
2645
2645
|
// Remove roles from createdBy & updatedBy fields
|
|
2646
2646
|
omitCreatorRoles
|
|
2647
2647
|
);
|
|
@@ -2742,9 +2742,9 @@ const createSanitizeHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2742
2742
|
sanitizeQuery: wrapSanitize(createSanitizeQuery)
|
|
2743
2743
|
};
|
|
2744
2744
|
};
|
|
2745
|
-
const { ValidationError: ValidationError$
|
|
2746
|
-
const { throwPassword, throwDisallowedFields } = utils$
|
|
2747
|
-
const { constants, isScalarAttribute, getNonVisibleAttributes, getWritableAttributes } = utils$
|
|
2745
|
+
const { ValidationError: ValidationError$5 } = utils$2.errors;
|
|
2746
|
+
const { throwPassword, throwDisallowedFields } = utils$2.validate.visitors;
|
|
2747
|
+
const { constants, isScalarAttribute, getNonVisibleAttributes, getWritableAttributes } = utils$2.contentTypes;
|
|
2748
2748
|
const {
|
|
2749
2749
|
ID_ATTRIBUTE,
|
|
2750
2750
|
DOC_ID_ATTRIBUTE,
|
|
@@ -2758,7 +2758,7 @@ const COMPONENT_FIELDS = ["__component"];
|
|
|
2758
2758
|
const STATIC_FIELDS = [ID_ATTRIBUTE, DOC_ID_ATTRIBUTE];
|
|
2759
2759
|
const throwInvalidKey = ({ key, path: path2 }) => {
|
|
2760
2760
|
const msg = path2 && path2 !== key ? `Invalid key ${key} at ${path2}` : `Invalid key ${key}`;
|
|
2761
|
-
throw new ValidationError$
|
|
2761
|
+
throw new ValidationError$5(msg);
|
|
2762
2762
|
};
|
|
2763
2763
|
const createValidateHelpers = ({ action: action2, ability: ability$1, model }) => {
|
|
2764
2764
|
const schema = strapi.getModel(model);
|
|
@@ -2769,35 +2769,35 @@ const createValidateHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2769
2769
|
const createValidateQuery = (options = {}) => {
|
|
2770
2770
|
const { fields } = options;
|
|
2771
2771
|
const permittedFields = fields.shouldIncludeAll ? null : getQueryFields(fields.permitted);
|
|
2772
|
-
const validateFilters = utils$
|
|
2773
|
-
utils$
|
|
2774
|
-
utils$
|
|
2775
|
-
utils$
|
|
2776
|
-
utils$
|
|
2772
|
+
const validateFilters = utils$2.async.pipe(
|
|
2773
|
+
utils$2.traverse.traverseQueryFilters(throwDisallowedFields(permittedFields), ctx),
|
|
2774
|
+
utils$2.traverse.traverseQueryFilters(throwDisallowedAdminUserFields, ctx),
|
|
2775
|
+
utils$2.traverse.traverseQueryFilters(throwPassword, ctx),
|
|
2776
|
+
utils$2.traverse.traverseQueryFilters(({ key, value, path: path2 }) => {
|
|
2777
2777
|
if (fp.isObject(value) && fp.isEmpty(value)) {
|
|
2778
2778
|
throwInvalidKey({ key, path: path2.attribute });
|
|
2779
2779
|
}
|
|
2780
2780
|
}, ctx)
|
|
2781
2781
|
);
|
|
2782
|
-
const validateSort = utils$
|
|
2783
|
-
utils$
|
|
2784
|
-
utils$
|
|
2785
|
-
utils$
|
|
2786
|
-
utils$
|
|
2782
|
+
const validateSort = utils$2.async.pipe(
|
|
2783
|
+
utils$2.traverse.traverseQuerySort(throwDisallowedFields(permittedFields), ctx),
|
|
2784
|
+
utils$2.traverse.traverseQuerySort(throwDisallowedAdminUserFields, ctx),
|
|
2785
|
+
utils$2.traverse.traverseQuerySort(throwPassword, ctx),
|
|
2786
|
+
utils$2.traverse.traverseQuerySort(({ key, attribute, value, path: path2 }) => {
|
|
2787
2787
|
if (!isScalarAttribute(attribute) && fp.isEmpty(value)) {
|
|
2788
2788
|
throwInvalidKey({ key, path: path2.attribute });
|
|
2789
2789
|
}
|
|
2790
2790
|
}, ctx)
|
|
2791
2791
|
);
|
|
2792
|
-
const validateFields = utils$
|
|
2793
|
-
utils$
|
|
2794
|
-
utils$
|
|
2792
|
+
const validateFields = utils$2.async.pipe(
|
|
2793
|
+
utils$2.traverse.traverseQueryFields(throwDisallowedFields(permittedFields), ctx),
|
|
2794
|
+
utils$2.traverse.traverseQueryFields(throwPassword, ctx)
|
|
2795
2795
|
);
|
|
2796
|
-
const validatePopulate = utils$
|
|
2797
|
-
utils$
|
|
2798
|
-
utils$
|
|
2799
|
-
utils$
|
|
2800
|
-
utils$
|
|
2796
|
+
const validatePopulate = utils$2.async.pipe(
|
|
2797
|
+
utils$2.traverse.traverseQueryPopulate(throwDisallowedFields(permittedFields), ctx),
|
|
2798
|
+
utils$2.traverse.traverseQueryPopulate(throwDisallowedAdminUserFields, ctx),
|
|
2799
|
+
utils$2.traverse.traverseQueryPopulate(throwHiddenFields, ctx),
|
|
2800
|
+
utils$2.traverse.traverseQueryPopulate(throwPassword, ctx)
|
|
2801
2801
|
);
|
|
2802
2802
|
return async (query) => {
|
|
2803
2803
|
if (query.filters) {
|
|
@@ -2818,11 +2818,11 @@ const createValidateHelpers = ({ action: action2, ability: ability$1, model }) =
|
|
|
2818
2818
|
const createValidateInput = (options = {}) => {
|
|
2819
2819
|
const { fields } = options;
|
|
2820
2820
|
const permittedFields = fields.shouldIncludeAll ? null : getInputFields(fields.permitted);
|
|
2821
|
-
return utils$
|
|
2821
|
+
return utils$2.async.pipe(
|
|
2822
2822
|
// Remove fields hidden from the admin
|
|
2823
|
-
utils$
|
|
2823
|
+
utils$2.traverseEntity(throwHiddenFields, ctx),
|
|
2824
2824
|
// Remove not allowed fields (RBAC)
|
|
2825
|
-
utils$
|
|
2825
|
+
utils$2.traverseEntity(throwDisallowedFields(permittedFields), ctx),
|
|
2826
2826
|
// Remove roles from createdBy & updatedBy fields
|
|
2827
2827
|
omitCreatorRoles
|
|
2828
2828
|
);
|
|
@@ -2943,7 +2943,7 @@ const unwrapDeep = (obj) => {
|
|
|
2943
2943
|
{}
|
|
2944
2944
|
);
|
|
2945
2945
|
};
|
|
2946
|
-
const index
|
|
2946
|
+
const index = ({ ability: ability$1, action: action2, model }) => ({
|
|
2947
2947
|
ability: ability$1,
|
|
2948
2948
|
action: action2,
|
|
2949
2949
|
model,
|
|
@@ -3016,7 +3016,7 @@ const createPermissionEngine = (params) => {
|
|
|
3016
3016
|
* @param user
|
|
3017
3017
|
*/
|
|
3018
3018
|
async generateUserAbility(user2) {
|
|
3019
|
-
const permissions2 = await getService("permission").findUserPermissions(user2);
|
|
3019
|
+
const permissions2 = await getService$1("permission").findUserPermissions(user2);
|
|
3020
3020
|
return engine2.generateAbility(permissions2, user2);
|
|
3021
3021
|
},
|
|
3022
3022
|
/**
|
|
@@ -3031,8 +3031,8 @@ const emptyObjectFactory = () => ({});
|
|
|
3031
3031
|
const createSection = ({ initialStateFactory = emptyObjectFactory, handlers = [], matchers = [] } = {}) => {
|
|
3032
3032
|
const state = {
|
|
3033
3033
|
hooks: {
|
|
3034
|
-
handlers: utils$
|
|
3035
|
-
matchers: utils$
|
|
3034
|
+
handlers: utils$2.hooks.createAsyncSeriesHook(),
|
|
3035
|
+
matchers: utils$2.hooks.createAsyncParallelHook()
|
|
3036
3036
|
}
|
|
3037
3037
|
};
|
|
3038
3038
|
handlers.forEach((handler) => state.hooks.handlers.register(handler));
|
|
@@ -3136,7 +3136,7 @@ const toSubjectTemplate = (ct) => ({
|
|
|
3136
3136
|
label: ct.info.singularName,
|
|
3137
3137
|
properties: []
|
|
3138
3138
|
});
|
|
3139
|
-
const { isVisibleAttribute } = utils$
|
|
3139
|
+
const { isVisibleAttribute } = utils$2.contentTypes;
|
|
3140
3140
|
const settings = ({ action: action2, section }) => {
|
|
3141
3141
|
const { category, subCategory, displayName, actionId } = action2;
|
|
3142
3142
|
section.push({
|
|
@@ -3246,10 +3246,10 @@ const deleteByRolesIds = async (rolesIds) => {
|
|
|
3246
3246
|
}
|
|
3247
3247
|
});
|
|
3248
3248
|
if (permissionsToDelete.length > 0) {
|
|
3249
|
-
await deleteByIds(permissionsToDelete.map(fp.prop("id")));
|
|
3249
|
+
await deleteByIds$1(permissionsToDelete.map(fp.prop("id")));
|
|
3250
3250
|
}
|
|
3251
3251
|
};
|
|
3252
|
-
const deleteByIds = async (ids) => {
|
|
3252
|
+
const deleteByIds$1 = async (ids) => {
|
|
3253
3253
|
const result = [];
|
|
3254
3254
|
for (const id of ids) {
|
|
3255
3255
|
const queryResult = await strapi.db.query("admin::permission").delete({ where: { id } });
|
|
@@ -3281,7 +3281,7 @@ const findUserPermissions = async (user2) => {
|
|
|
3281
3281
|
return findMany({ where: { role: { users: { id: user2.id } } } });
|
|
3282
3282
|
};
|
|
3283
3283
|
const filterPermissionsToRemove = async (permissions2) => {
|
|
3284
|
-
const { actionProvider: actionProvider2 } = getService("permission");
|
|
3284
|
+
const { actionProvider: actionProvider2 } = getService$1("permission");
|
|
3285
3285
|
const permissionsToRemove = [];
|
|
3286
3286
|
for (const permission2 of permissions2) {
|
|
3287
3287
|
const { subjects, options = {} } = actionProvider2.get(permission2.action) || {};
|
|
@@ -3307,7 +3307,7 @@ const filterPermissionsToRemove = async (permissions2) => {
|
|
|
3307
3307
|
};
|
|
3308
3308
|
const cleanPermissionsInDatabase = async () => {
|
|
3309
3309
|
const pageSize = 200;
|
|
3310
|
-
const contentTypeService = getService("content-type");
|
|
3310
|
+
const contentTypeService = getService$1("content-type");
|
|
3311
3311
|
const total = await strapi.db.query("admin::permission").count();
|
|
3312
3312
|
const pageCount = Math.ceil(total / pageSize);
|
|
3313
3313
|
for (let page = 0; page < pageCount; page += 1) {
|
|
@@ -3332,7 +3332,7 @@ const cleanPermissionsInDatabase = async () => {
|
|
|
3332
3332
|
return update$2({ id: permission2.id }, permission2);
|
|
3333
3333
|
};
|
|
3334
3334
|
await Promise.all([
|
|
3335
|
-
deleteByIds(permissionsIdToRemove),
|
|
3335
|
+
deleteByIds$1(permissionsIdToRemove),
|
|
3336
3336
|
pmap__default.default(permissionsNeedingToBeUpdated, updatePromiseProvider, {
|
|
3337
3337
|
concurrency: 100,
|
|
3338
3338
|
stopOnError: true
|
|
@@ -3353,8 +3353,8 @@ const permission$2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.define
|
|
|
3353
3353
|
cleanPermissionsInDatabase,
|
|
3354
3354
|
conditionProvider,
|
|
3355
3355
|
createMany,
|
|
3356
|
-
createPermissionsManager: index
|
|
3357
|
-
deleteByIds,
|
|
3356
|
+
createPermissionsManager: index,
|
|
3357
|
+
deleteByIds: deleteByIds$1,
|
|
3358
3358
|
deleteByRolesIds,
|
|
3359
3359
|
engine: engine$1,
|
|
3360
3360
|
findMany,
|
|
@@ -3372,7 +3372,7 @@ const getNestedFields = (model, {
|
|
|
3372
3372
|
if (nestingLevel === 0) {
|
|
3373
3373
|
return prefix ? [prefix] : [];
|
|
3374
3374
|
}
|
|
3375
|
-
const nonAuthorizableFields = utils$
|
|
3375
|
+
const nonAuthorizableFields = utils$2.contentTypes.getNonVisibleAttributes(model);
|
|
3376
3376
|
return ___namespace.default.reduce(
|
|
3377
3377
|
model.attributes,
|
|
3378
3378
|
(fields, attr, key) => {
|
|
@@ -3409,7 +3409,7 @@ const getNestedFieldsWithIntermediate = (model, { prefix = "", nestingLevel = 15
|
|
|
3409
3409
|
if (nestingLevel === 0) {
|
|
3410
3410
|
return [];
|
|
3411
3411
|
}
|
|
3412
|
-
const nonAuthorizableFields = utils$
|
|
3412
|
+
const nonAuthorizableFields = utils$2.contentTypes.getNonVisibleAttributes(model);
|
|
3413
3413
|
return ___namespace.default.reduce(
|
|
3414
3414
|
model.attributes,
|
|
3415
3415
|
(fields, attr, key) => {
|
|
@@ -3451,7 +3451,7 @@ const getPermissionsWithNestedFields = (actions2, { nestingLevel, restrictedSubj
|
|
|
3451
3451
|
}, []);
|
|
3452
3452
|
};
|
|
3453
3453
|
const cleanPermissionFields = (permissions2, { nestingLevel } = {}) => {
|
|
3454
|
-
const { actionProvider: actionProvider2 } = getService("permission");
|
|
3454
|
+
const { actionProvider: actionProvider2 } = getService$1("permission");
|
|
3455
3455
|
return permissions2.map((permission2) => {
|
|
3456
3456
|
const {
|
|
3457
3457
|
action: actionId,
|
|
@@ -3490,7 +3490,7 @@ const contentType = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineP
|
|
|
3490
3490
|
getPermissionsWithNestedFields
|
|
3491
3491
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
3492
3492
|
const isValidCondition = (condition2) => {
|
|
3493
|
-
const { conditionProvider: conditionProvider2 } = getService("permission");
|
|
3493
|
+
const { conditionProvider: conditionProvider2 } = getService$1("permission");
|
|
3494
3494
|
return fp.isString(condition2) && conditionProvider2.has(condition2);
|
|
3495
3495
|
};
|
|
3496
3496
|
const condition = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
@@ -3498,11 +3498,11 @@ const condition = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePro
|
|
|
3498
3498
|
isValidCondition
|
|
3499
3499
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
3500
3500
|
const { AUTHOR_CODE, PUBLISH_ACTION } = constants$3;
|
|
3501
|
-
const { NotFoundError: NotFoundError$2 } = utils$
|
|
3501
|
+
const { NotFoundError: NotFoundError$2 } = utils$2.errors;
|
|
3502
3502
|
const getAllowedActionsForRole = async (roleId) => {
|
|
3503
|
-
const { actionProvider: actionProvider2 } = getService("permission");
|
|
3503
|
+
const { actionProvider: actionProvider2 } = getService$1("permission");
|
|
3504
3504
|
if (!fp.isNil(roleId)) {
|
|
3505
|
-
const role2 = await getService("role").findOne({ id: roleId });
|
|
3505
|
+
const role2 = await getService$1("role").findOne({ id: roleId });
|
|
3506
3506
|
if (!role2) {
|
|
3507
3507
|
throw new NotFoundError$2("role.notFound");
|
|
3508
3508
|
}
|
|
@@ -3516,7 +3516,7 @@ const action = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
|
|
|
3516
3516
|
__proto__: null,
|
|
3517
3517
|
getAllowedActionsForRole
|
|
3518
3518
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
3519
|
-
const { ValidationError: ValidationError$
|
|
3519
|
+
const { ValidationError: ValidationError$4, NotFoundError: NotFoundError$1 } = utils$2.errors;
|
|
3520
3520
|
const SELECT_FIELDS$1 = [
|
|
3521
3521
|
"id",
|
|
3522
3522
|
"name",
|
|
@@ -3531,16 +3531,16 @@ const SELECT_FIELDS$1 = [
|
|
|
3531
3531
|
const POPULATE_FIELDS$1 = ["permissions"];
|
|
3532
3532
|
const assertCustomTokenPermissionsValidity = (type, permissions2) => {
|
|
3533
3533
|
if (type !== constants$3.API_TOKEN_TYPE.CUSTOM && !fp.isEmpty(permissions2)) {
|
|
3534
|
-
throw new ValidationError$
|
|
3534
|
+
throw new ValidationError$4("Non-custom tokens should not reference permissions");
|
|
3535
3535
|
}
|
|
3536
3536
|
if (type === constants$3.API_TOKEN_TYPE.CUSTOM && !fp.isArray(permissions2)) {
|
|
3537
|
-
throw new ValidationError$
|
|
3537
|
+
throw new ValidationError$4("Missing permissions attribute for custom token");
|
|
3538
3538
|
}
|
|
3539
3539
|
if (type === constants$3.API_TOKEN_TYPE.CUSTOM) {
|
|
3540
3540
|
const validPermissions = strapi.contentAPI.permissions.providers.action.keys();
|
|
3541
3541
|
const invalidPermissions = fp.difference(permissions2, validPermissions);
|
|
3542
3542
|
if (!fp.isEmpty(invalidPermissions)) {
|
|
3543
|
-
throw new ValidationError$
|
|
3543
|
+
throw new ValidationError$4(`Unknown permissions provided: ${invalidPermissions.join(", ")}`);
|
|
3544
3544
|
}
|
|
3545
3545
|
}
|
|
3546
3546
|
};
|
|
@@ -3555,7 +3555,7 @@ const isValidLifespan$1 = (lifespan) => {
|
|
|
3555
3555
|
};
|
|
3556
3556
|
const assertValidLifespan$1 = (lifespan) => {
|
|
3557
3557
|
if (!isValidLifespan$1(lifespan)) {
|
|
3558
|
-
throw new ValidationError$
|
|
3558
|
+
throw new ValidationError$4(
|
|
3559
3559
|
`lifespan must be one of the following values:
|
|
3560
3560
|
${Object.values(constants$3.API_TOKEN_LIFESPANS).join(", ")}`
|
|
3561
3561
|
);
|
|
@@ -3590,7 +3590,7 @@ const hash$1 = (accessKey) => {
|
|
|
3590
3590
|
const getExpirationFields$1 = (lifespan) => {
|
|
3591
3591
|
const isValidNumber = fp.isNumber(lifespan) && Number.isFinite(lifespan) && lifespan > 0;
|
|
3592
3592
|
if (!isValidNumber && !fp.isNil(lifespan)) {
|
|
3593
|
-
throw new ValidationError$
|
|
3593
|
+
throw new ValidationError$4("lifespan must be a positive number or null");
|
|
3594
3594
|
}
|
|
3595
3595
|
return {
|
|
3596
3596
|
lifespan: lifespan || null,
|
|
@@ -3742,8 +3742,8 @@ const apiToken$2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePr
|
|
|
3742
3742
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
3743
3743
|
const DEFAULT_TRANSFER_ACTIONS = ["push", "pull"];
|
|
3744
3744
|
const providers = {
|
|
3745
|
-
action: utils$
|
|
3746
|
-
condition: utils$
|
|
3745
|
+
action: utils$2.providerFactory(),
|
|
3746
|
+
condition: utils$2.providerFactory()
|
|
3747
3747
|
};
|
|
3748
3748
|
DEFAULT_TRANSFER_ACTIONS.forEach((action2) => {
|
|
3749
3749
|
providers.action.register(action2, { action: action2 });
|
|
@@ -3754,7 +3754,7 @@ const permission$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.define
|
|
|
3754
3754
|
engine,
|
|
3755
3755
|
providers
|
|
3756
3756
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
3757
|
-
const { ValidationError: ValidationError$
|
|
3757
|
+
const { ValidationError: ValidationError$3, NotFoundError } = utils$2.errors;
|
|
3758
3758
|
const TRANSFER_TOKEN_UID = "admin::transfer-token";
|
|
3759
3759
|
const TRANSFER_TOKEN_PERMISSION_UID = "admin::transfer-token-permission";
|
|
3760
3760
|
const SELECT_FIELDS = [
|
|
@@ -3905,7 +3905,7 @@ const regenerate = async (id) => {
|
|
|
3905
3905
|
const getExpirationFields = (lifespan) => {
|
|
3906
3906
|
const isValidNumber = fp.isNumber(lifespan) && Number.isFinite(lifespan) && lifespan > 0;
|
|
3907
3907
|
if (!isValidNumber && !fp.isNil(lifespan)) {
|
|
3908
|
-
throw new ValidationError$
|
|
3908
|
+
throw new ValidationError$3("lifespan must be a positive number or null");
|
|
3909
3909
|
}
|
|
3910
3910
|
return {
|
|
3911
3911
|
lifespan: lifespan || null,
|
|
@@ -3913,14 +3913,14 @@ const getExpirationFields = (lifespan) => {
|
|
|
3913
3913
|
};
|
|
3914
3914
|
};
|
|
3915
3915
|
const hash = (accessKey) => {
|
|
3916
|
-
const { hasValidTokenSalt: hasValidTokenSalt2 } = getService("transfer").utils;
|
|
3916
|
+
const { hasValidTokenSalt: hasValidTokenSalt2 } = getService$1("transfer").utils;
|
|
3917
3917
|
if (!hasValidTokenSalt2()) {
|
|
3918
3918
|
throw new TypeError("Required token salt is not defined");
|
|
3919
3919
|
}
|
|
3920
3920
|
return crypto__default.default.createHmac("sha512", strapi.config.get("admin.transfer.token.salt")).update(accessKey).digest("hex");
|
|
3921
3921
|
};
|
|
3922
3922
|
const checkSaltIsDefined = () => {
|
|
3923
|
-
const { hasValidTokenSalt: hasValidTokenSalt2 } = getService("transfer").utils;
|
|
3923
|
+
const { hasValidTokenSalt: hasValidTokenSalt2 } = getService$1("transfer").utils;
|
|
3924
3924
|
if (!strapi.config.get("server.transfer.remote.enabled")) {
|
|
3925
3925
|
return;
|
|
3926
3926
|
}
|
|
@@ -3946,7 +3946,7 @@ const assertTokenPermissionsValidity = (attributes) => {
|
|
|
3946
3946
|
const validPermissions = permissionService.providers.action.keys();
|
|
3947
3947
|
const invalidPermissions = fp.difference(attributes.permissions, validPermissions);
|
|
3948
3948
|
if (!fp.isEmpty(invalidPermissions)) {
|
|
3949
|
-
throw new ValidationError$
|
|
3949
|
+
throw new ValidationError$3(`Unknown permissions provided: ${invalidPermissions.join(", ")}`);
|
|
3950
3950
|
}
|
|
3951
3951
|
};
|
|
3952
3952
|
const isValidLifespan = (lifespan) => {
|
|
@@ -3960,7 +3960,7 @@ const isValidLifespan = (lifespan) => {
|
|
|
3960
3960
|
};
|
|
3961
3961
|
const assertValidLifespan = (lifespan) => {
|
|
3962
3962
|
if (!isValidLifespan(lifespan)) {
|
|
3963
|
-
throw new ValidationError$
|
|
3963
|
+
throw new ValidationError$3(
|
|
3964
3964
|
`lifespan must be one of the following values:
|
|
3965
3965
|
${Object.values(constants$3.TRANSFER_TOKEN_LIFESPANS).join(", ")}`
|
|
3966
3966
|
);
|
|
@@ -3986,15 +3986,15 @@ const hasValidTokenSalt = () => {
|
|
|
3986
3986
|
return typeof salt === "string" && salt.length > 0;
|
|
3987
3987
|
};
|
|
3988
3988
|
const isRemoteTransferEnabled = () => {
|
|
3989
|
-
const { utils: utils2 } = getService("transfer");
|
|
3990
|
-
if (utils$
|
|
3989
|
+
const { utils: utils2 } = getService$1("transfer");
|
|
3990
|
+
if (utils$2.env.bool("STRAPI_DISABLE_REMOTE_DATA_TRANSFER") !== void 0) {
|
|
3991
3991
|
strapi.log.warn(
|
|
3992
3992
|
"STRAPI_DISABLE_REMOTE_DATA_TRANSFER is no longer supported. Instead, set transfer.remote.enabled to false in your server configuration"
|
|
3993
3993
|
);
|
|
3994
3994
|
}
|
|
3995
3995
|
return utils2.hasValidTokenSalt() && strapi.config.get("server.transfer.remote.enabled");
|
|
3996
3996
|
};
|
|
3997
|
-
const utils = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
3997
|
+
const utils$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
3998
3998
|
__proto__: null,
|
|
3999
3999
|
hasValidTokenSalt,
|
|
4000
4000
|
isRemoteTransferEnabled
|
|
@@ -4003,7 +4003,7 @@ const transfer$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePr
|
|
|
4003
4003
|
__proto__: null,
|
|
4004
4004
|
permission: permission$1,
|
|
4005
4005
|
token: token$2,
|
|
4006
|
-
utils
|
|
4006
|
+
utils: utils$1
|
|
4007
4007
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
4008
4008
|
const PROJECT_SETTINGS_FILE_INPUTS = ["menuLogo", "authLogo"];
|
|
4009
4009
|
const parseFilesData = async (files) => {
|
|
@@ -4124,14 +4124,14 @@ const projectSettings = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.def
|
|
|
4124
4124
|
parseFilesData,
|
|
4125
4125
|
updateProjectSettings: updateProjectSettings$1
|
|
4126
4126
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
4127
|
-
const
|
|
4128
|
-
auth,
|
|
4129
|
-
user: user$
|
|
4130
|
-
role: role$
|
|
4131
|
-
passport,
|
|
4127
|
+
const services$1 = {
|
|
4128
|
+
auth: auth$1,
|
|
4129
|
+
user: user$3,
|
|
4130
|
+
role: role$3,
|
|
4131
|
+
passport: passport$1,
|
|
4132
4132
|
token: token$3,
|
|
4133
4133
|
permission: permission$2,
|
|
4134
|
-
metrics,
|
|
4134
|
+
metrics: metrics$1,
|
|
4135
4135
|
"content-type": contentType,
|
|
4136
4136
|
constants: constants$4,
|
|
4137
4137
|
condition,
|
|
@@ -4164,13 +4164,13 @@ const updateProjectSettingsImagesDimensions = zod.z.object({
|
|
|
4164
4164
|
menuLogo: logoDimensions.nullish(),
|
|
4165
4165
|
authLogo: logoDimensions.nullish()
|
|
4166
4166
|
}).strict();
|
|
4167
|
-
const validateUpdateProjectSettings = utils$
|
|
4168
|
-
const validateUpdateProjectSettingsFiles = utils$
|
|
4169
|
-
const validateUpdateProjectSettingsImagesDimensions = utils$
|
|
4167
|
+
const validateUpdateProjectSettings = utils$2.validateZod(updateProjectSettings);
|
|
4168
|
+
const validateUpdateProjectSettingsFiles = utils$2.validateZod(updateProjectSettingsFiles);
|
|
4169
|
+
const validateUpdateProjectSettingsImagesDimensions = utils$2.validateZod(
|
|
4170
4170
|
updateProjectSettingsImagesDimensions
|
|
4171
4171
|
);
|
|
4172
4172
|
const { isUsingTypeScript } = tsUtils__default.default;
|
|
4173
|
-
const admin = {
|
|
4173
|
+
const admin$3 = {
|
|
4174
4174
|
// TODO very temporary to check the switch ee/ce
|
|
4175
4175
|
// When removing this we need to update the /admin/src/index.js file
|
|
4176
4176
|
// whe,re we set the strapi.window.isEE value
|
|
@@ -4182,8 +4182,8 @@ const admin = {
|
|
|
4182
4182
|
},
|
|
4183
4183
|
async init() {
|
|
4184
4184
|
let uuid = strapi.config.get("uuid", false);
|
|
4185
|
-
const hasAdmin = await getService("user").exists();
|
|
4186
|
-
const { menuLogo, authLogo } = await getService("project-settings").getProjectSettings();
|
|
4185
|
+
const hasAdmin = await getService$1("user").exists();
|
|
4186
|
+
const { menuLogo, authLogo } = await getService$1("project-settings").getProjectSettings();
|
|
4187
4187
|
const telemetryDisabled = strapi.config.get(
|
|
4188
4188
|
"packageJsonStrapi.telemetryDisabled",
|
|
4189
4189
|
null
|
|
@@ -4201,7 +4201,7 @@ const admin = {
|
|
|
4201
4201
|
};
|
|
4202
4202
|
},
|
|
4203
4203
|
async getProjectSettings() {
|
|
4204
|
-
return getService(
|
|
4204
|
+
return getService$1(
|
|
4205
4205
|
"project-settings"
|
|
4206
4206
|
).getProjectSettings();
|
|
4207
4207
|
},
|
|
@@ -4209,7 +4209,7 @@ const admin = {
|
|
|
4209
4209
|
const {
|
|
4210
4210
|
request: { files, body }
|
|
4211
4211
|
} = ctx;
|
|
4212
|
-
const projectSettingsService = getService("project-settings");
|
|
4212
|
+
const projectSettingsService = getService$1("project-settings");
|
|
4213
4213
|
await validateUpdateProjectSettings(body);
|
|
4214
4214
|
await validateUpdateProjectSettingsFiles(files);
|
|
4215
4215
|
const formatedFiles = await projectSettingsService.parseFilesData(files);
|
|
@@ -4228,7 +4228,7 @@ const admin = {
|
|
|
4228
4228
|
const useTypescriptOnAdmin = await isUsingTypeScript(
|
|
4229
4229
|
path__default.default.join(strapi.dirs.app.root, "src", "admin")
|
|
4230
4230
|
);
|
|
4231
|
-
const isHostedOnStrapiCloud = utils$
|
|
4231
|
+
const isHostedOnStrapiCloud = utils$2.env("STRAPI_HOSTING", null) === "strapi.cloud";
|
|
4232
4232
|
const numberOfAllContentTypes = ___namespace.default.size(strapi.contentTypes);
|
|
4233
4233
|
const numberOfComponents = ___namespace.default.size(strapi.components);
|
|
4234
4234
|
const getNumberOfDynamicZones = () => {
|
|
@@ -4293,26 +4293,26 @@ const admin = {
|
|
|
4293
4293
|
ctx.send({ plugins: plugins2 });
|
|
4294
4294
|
}
|
|
4295
4295
|
};
|
|
4296
|
-
const apiTokenCreationSchema = utils$
|
|
4297
|
-
name: utils$
|
|
4298
|
-
description: utils$
|
|
4299
|
-
type: utils$
|
|
4300
|
-
permissions: utils$
|
|
4301
|
-
lifespan: utils$
|
|
4296
|
+
const apiTokenCreationSchema = utils$2.yup.object().shape({
|
|
4297
|
+
name: utils$2.yup.string().min(1).required(),
|
|
4298
|
+
description: utils$2.yup.string().optional(),
|
|
4299
|
+
type: utils$2.yup.string().oneOf(Object.values(constants$3.API_TOKEN_TYPE)).required(),
|
|
4300
|
+
permissions: utils$2.yup.array().of(utils$2.yup.string()).nullable(),
|
|
4301
|
+
lifespan: utils$2.yup.number().min(1).oneOf(Object.values(constants$3.API_TOKEN_LIFESPANS)).nullable()
|
|
4302
4302
|
}).noUnknown().strict();
|
|
4303
|
-
const apiTokenUpdateSchema = utils$
|
|
4304
|
-
name: utils$
|
|
4305
|
-
description: utils$
|
|
4306
|
-
type: utils$
|
|
4307
|
-
permissions: utils$
|
|
4303
|
+
const apiTokenUpdateSchema = utils$2.yup.object().shape({
|
|
4304
|
+
name: utils$2.yup.string().min(1).notNull(),
|
|
4305
|
+
description: utils$2.yup.string().nullable(),
|
|
4306
|
+
type: utils$2.yup.string().oneOf(Object.values(constants$3.API_TOKEN_TYPE)).notNull(),
|
|
4307
|
+
permissions: utils$2.yup.array().of(utils$2.yup.string()).nullable()
|
|
4308
4308
|
}).noUnknown().strict();
|
|
4309
|
-
const validateApiTokenCreationInput = utils$
|
|
4310
|
-
const validateApiTokenUpdateInput = utils$
|
|
4311
|
-
const { ApplicationError: ApplicationError$
|
|
4309
|
+
const validateApiTokenCreationInput = utils$2.validateYupSchema(apiTokenCreationSchema);
|
|
4310
|
+
const validateApiTokenUpdateInput = utils$2.validateYupSchema(apiTokenUpdateSchema);
|
|
4311
|
+
const { ApplicationError: ApplicationError$7 } = utils$2.errors;
|
|
4312
4312
|
const apiToken$1 = {
|
|
4313
4313
|
async create(ctx) {
|
|
4314
4314
|
const { body } = ctx.request;
|
|
4315
|
-
const apiTokenService = getService("api-token");
|
|
4315
|
+
const apiTokenService = getService$1("api-token");
|
|
4316
4316
|
const attributes = {
|
|
4317
4317
|
name: fp.trim(body.name),
|
|
4318
4318
|
description: fp.trim(body.description),
|
|
@@ -4323,14 +4323,14 @@ const apiToken$1 = {
|
|
|
4323
4323
|
await validateApiTokenCreationInput(attributes);
|
|
4324
4324
|
const alreadyExists = await apiTokenService.exists({ name: attributes.name });
|
|
4325
4325
|
if (alreadyExists) {
|
|
4326
|
-
throw new ApplicationError$
|
|
4326
|
+
throw new ApplicationError$7("Name already taken");
|
|
4327
4327
|
}
|
|
4328
4328
|
const apiToken2 = await apiTokenService.create(attributes);
|
|
4329
4329
|
ctx.created({ data: apiToken2 });
|
|
4330
4330
|
},
|
|
4331
4331
|
async regenerate(ctx) {
|
|
4332
4332
|
const { id } = ctx.params;
|
|
4333
|
-
const apiTokenService = getService("api-token");
|
|
4333
|
+
const apiTokenService = getService$1("api-token");
|
|
4334
4334
|
const apiTokenExists = await apiTokenService.getById(id);
|
|
4335
4335
|
if (!apiTokenExists) {
|
|
4336
4336
|
ctx.notFound("API Token not found");
|
|
@@ -4340,19 +4340,19 @@ const apiToken$1 = {
|
|
|
4340
4340
|
ctx.created({ data: accessToken });
|
|
4341
4341
|
},
|
|
4342
4342
|
async list(ctx) {
|
|
4343
|
-
const apiTokenService = getService("api-token");
|
|
4343
|
+
const apiTokenService = getService$1("api-token");
|
|
4344
4344
|
const apiTokens2 = await apiTokenService.list();
|
|
4345
4345
|
ctx.send({ data: apiTokens2 });
|
|
4346
4346
|
},
|
|
4347
4347
|
async revoke(ctx) {
|
|
4348
4348
|
const { id } = ctx.params;
|
|
4349
|
-
const apiTokenService = getService("api-token");
|
|
4349
|
+
const apiTokenService = getService$1("api-token");
|
|
4350
4350
|
const apiToken2 = await apiTokenService.revoke(id);
|
|
4351
4351
|
ctx.deleted({ data: apiToken2 });
|
|
4352
4352
|
},
|
|
4353
4353
|
async get(ctx) {
|
|
4354
4354
|
const { id } = ctx.params;
|
|
4355
|
-
const apiTokenService = getService("api-token");
|
|
4355
|
+
const apiTokenService = getService$1("api-token");
|
|
4356
4356
|
const apiToken2 = await apiTokenService.getById(id);
|
|
4357
4357
|
if (!apiToken2) {
|
|
4358
4358
|
ctx.notFound("API Token not found");
|
|
@@ -4363,7 +4363,7 @@ const apiToken$1 = {
|
|
|
4363
4363
|
async update(ctx) {
|
|
4364
4364
|
const { body } = ctx.request;
|
|
4365
4365
|
const { id } = ctx.params;
|
|
4366
|
-
const apiTokenService = getService("api-token");
|
|
4366
|
+
const apiTokenService = getService$1("api-token");
|
|
4367
4367
|
const attributes = body;
|
|
4368
4368
|
if (fp.has("name", attributes)) {
|
|
4369
4369
|
attributes.name = fp.trim(body.name);
|
|
@@ -4378,57 +4378,62 @@ const apiToken$1 = {
|
|
|
4378
4378
|
}
|
|
4379
4379
|
if (fp.has("name", attributes)) {
|
|
4380
4380
|
const nameAlreadyTaken = await apiTokenService.getByName(attributes.name);
|
|
4381
|
-
if (!!nameAlreadyTaken && !utils$
|
|
4382
|
-
throw new ApplicationError$
|
|
4381
|
+
if (!!nameAlreadyTaken && !utils$2.strings.isEqual(nameAlreadyTaken.id, id)) {
|
|
4382
|
+
throw new ApplicationError$7("Name already taken");
|
|
4383
4383
|
}
|
|
4384
4384
|
}
|
|
4385
4385
|
const apiToken2 = await apiTokenService.update(id, attributes);
|
|
4386
4386
|
ctx.send({ data: apiToken2 });
|
|
4387
4387
|
},
|
|
4388
4388
|
async getLayout(ctx) {
|
|
4389
|
-
const apiTokenService = getService("api-token");
|
|
4389
|
+
const apiTokenService = getService$1("api-token");
|
|
4390
4390
|
const layout = await apiTokenService.getApiTokenLayout();
|
|
4391
4391
|
ctx.send({ data: layout });
|
|
4392
4392
|
}
|
|
4393
4393
|
};
|
|
4394
|
-
const userCreationSchema = utils$
|
|
4394
|
+
const userCreationSchema = utils$2.yup.object().shape({
|
|
4395
4395
|
email: validators.email.required(),
|
|
4396
4396
|
firstname: validators.firstname.required(),
|
|
4397
4397
|
lastname: validators.lastname,
|
|
4398
4398
|
roles: validators.roles.min(1),
|
|
4399
|
-
preferedLanguage: utils$
|
|
4399
|
+
preferedLanguage: utils$2.yup.string().nullable()
|
|
4400
4400
|
}).noUnknown();
|
|
4401
|
-
const profileUpdateSchema = utils$
|
|
4401
|
+
const profileUpdateSchema = utils$2.yup.object().shape({
|
|
4402
4402
|
email: validators.email.notNull(),
|
|
4403
4403
|
firstname: validators.firstname.notNull(),
|
|
4404
4404
|
lastname: validators.lastname.nullable(),
|
|
4405
4405
|
username: validators.username.nullable(),
|
|
4406
4406
|
password: validators.password.notNull(),
|
|
4407
|
-
currentPassword: utils$
|
|
4407
|
+
currentPassword: utils$2.yup.string().when(
|
|
4408
4408
|
"password",
|
|
4409
4409
|
(password2, schema) => !fp.isUndefined(password2) ? schema.required() : schema
|
|
4410
4410
|
).notNull(),
|
|
4411
|
-
preferedLanguage: utils$
|
|
4411
|
+
preferedLanguage: utils$2.yup.string().nullable()
|
|
4412
4412
|
}).noUnknown();
|
|
4413
|
-
const userUpdateSchema = utils$
|
|
4413
|
+
const userUpdateSchema = utils$2.yup.object().shape({
|
|
4414
4414
|
email: validators.email.notNull(),
|
|
4415
4415
|
firstname: validators.firstname.notNull(),
|
|
4416
4416
|
lastname: validators.lastname.nullable(),
|
|
4417
4417
|
username: validators.username.nullable(),
|
|
4418
4418
|
password: validators.password.notNull(),
|
|
4419
|
-
isActive: utils$
|
|
4419
|
+
isActive: utils$2.yup.bool().notNull(),
|
|
4420
4420
|
roles: validators.roles.min(1).notNull()
|
|
4421
4421
|
}).noUnknown();
|
|
4422
|
-
const usersDeleteSchema = utils$
|
|
4423
|
-
ids: utils$
|
|
4422
|
+
const usersDeleteSchema = utils$2.yup.object().shape({
|
|
4423
|
+
ids: utils$2.yup.array().of(utils$2.yup.strapiID()).min(1).required()
|
|
4424
4424
|
}).noUnknown();
|
|
4425
|
-
const validateUserCreationInput = utils$
|
|
4426
|
-
const validateProfileUpdateInput = utils$
|
|
4427
|
-
const validateUserUpdateInput = utils$
|
|
4428
|
-
const validateUsersDeleteInput = utils$
|
|
4425
|
+
const validateUserCreationInput$1 = utils$2.validateYupSchema(userCreationSchema);
|
|
4426
|
+
const validateProfileUpdateInput = utils$2.validateYupSchema(profileUpdateSchema);
|
|
4427
|
+
const validateUserUpdateInput = utils$2.validateYupSchema(userUpdateSchema);
|
|
4428
|
+
const validateUsersDeleteInput = utils$2.validateYupSchema(usersDeleteSchema);
|
|
4429
|
+
const schemas = {
|
|
4430
|
+
userCreationSchema,
|
|
4431
|
+
usersDeleteSchema,
|
|
4432
|
+
userUpdateSchema
|
|
4433
|
+
};
|
|
4429
4434
|
const authenticatedUser = {
|
|
4430
4435
|
async getMe(ctx) {
|
|
4431
|
-
const userInfo = getService("user").sanitizeUser(ctx.state.user);
|
|
4436
|
+
const userInfo = getService$1("user").sanitizeUser(ctx.state.user);
|
|
4432
4437
|
ctx.body = {
|
|
4433
4438
|
data: userInfo
|
|
4434
4439
|
};
|
|
@@ -4436,8 +4441,8 @@ const authenticatedUser = {
|
|
|
4436
4441
|
async updateMe(ctx) {
|
|
4437
4442
|
const input = ctx.request.body;
|
|
4438
4443
|
await validateProfileUpdateInput(input);
|
|
4439
|
-
const userService = getService("user");
|
|
4440
|
-
const authServer = getService("auth");
|
|
4444
|
+
const userService = getService$1("user");
|
|
4445
|
+
const authServer = getService$1("auth");
|
|
4441
4446
|
const { currentPassword, ...userInfo } = input;
|
|
4442
4447
|
if (currentPassword && userInfo.password) {
|
|
4443
4448
|
const isValid = await authServer.validatePassword(currentPassword, ctx.state.user.password);
|
|
@@ -4453,7 +4458,7 @@ const authenticatedUser = {
|
|
|
4453
4458
|
};
|
|
4454
4459
|
},
|
|
4455
4460
|
async getOwnPermissions(ctx) {
|
|
4456
|
-
const { findUserPermissions: findUserPermissions2, sanitizePermission: sanitizePermission2 } = getService("permission");
|
|
4461
|
+
const { findUserPermissions: findUserPermissions2, sanitizePermission: sanitizePermission2 } = getService$1("permission");
|
|
4457
4462
|
const { user: user2 } = ctx.state;
|
|
4458
4463
|
const userPermissions = await findUserPermissions2(user2);
|
|
4459
4464
|
ctx.body = {
|
|
@@ -4462,39 +4467,39 @@ const authenticatedUser = {
|
|
|
4462
4467
|
};
|
|
4463
4468
|
}
|
|
4464
4469
|
};
|
|
4465
|
-
const registrationSchema = utils$
|
|
4466
|
-
registrationToken: utils$
|
|
4467
|
-
userInfo: utils$
|
|
4470
|
+
const registrationSchema = utils$2.yup.object().shape({
|
|
4471
|
+
registrationToken: utils$2.yup.string().required(),
|
|
4472
|
+
userInfo: utils$2.yup.object().shape({
|
|
4468
4473
|
firstname: validators.firstname.required(),
|
|
4469
4474
|
lastname: validators.lastname.nullable(),
|
|
4470
4475
|
password: validators.password.required()
|
|
4471
4476
|
}).required().noUnknown()
|
|
4472
4477
|
}).noUnknown();
|
|
4473
|
-
const registrationInfoQuerySchema = utils$
|
|
4474
|
-
registrationToken: utils$
|
|
4478
|
+
const registrationInfoQuerySchema = utils$2.yup.object().shape({
|
|
4479
|
+
registrationToken: utils$2.yup.string().required()
|
|
4475
4480
|
}).required().noUnknown();
|
|
4476
|
-
const adminRegistrationSchema = utils$
|
|
4481
|
+
const adminRegistrationSchema = utils$2.yup.object().shape({
|
|
4477
4482
|
email: validators.email.required(),
|
|
4478
4483
|
firstname: validators.firstname.required(),
|
|
4479
4484
|
lastname: validators.lastname.nullable(),
|
|
4480
4485
|
password: validators.password.required()
|
|
4481
4486
|
}).required().noUnknown();
|
|
4482
|
-
const validateRegistrationInput = utils$
|
|
4483
|
-
const validateRegistrationInfoQuery = utils$
|
|
4484
|
-
const validateAdminRegistrationInput = utils$
|
|
4485
|
-
const forgotPasswordSchema = utils$
|
|
4487
|
+
const validateRegistrationInput = utils$2.validateYupSchema(registrationSchema);
|
|
4488
|
+
const validateRegistrationInfoQuery = utils$2.validateYupSchema(registrationInfoQuerySchema);
|
|
4489
|
+
const validateAdminRegistrationInput = utils$2.validateYupSchema(adminRegistrationSchema);
|
|
4490
|
+
const forgotPasswordSchema = utils$2.yup.object().shape({
|
|
4486
4491
|
email: validators.email.required()
|
|
4487
4492
|
}).required().noUnknown();
|
|
4488
|
-
const validateForgotPasswordInput = utils$
|
|
4489
|
-
const resetPasswordSchema = utils$
|
|
4490
|
-
resetPasswordToken: utils$
|
|
4493
|
+
const validateForgotPasswordInput = utils$2.validateYupSchema(forgotPasswordSchema);
|
|
4494
|
+
const resetPasswordSchema = utils$2.yup.object().shape({
|
|
4495
|
+
resetPasswordToken: utils$2.yup.string().required(),
|
|
4491
4496
|
password: validators.password.required()
|
|
4492
4497
|
}).required().noUnknown();
|
|
4493
|
-
const validateResetPasswordInput = utils$
|
|
4494
|
-
const renewToken = utils$
|
|
4495
|
-
const validateRenewTokenInput = utils$
|
|
4496
|
-
const { ApplicationError: ApplicationError$
|
|
4497
|
-
const authentication = {
|
|
4498
|
+
const validateResetPasswordInput = utils$2.validateYupSchema(resetPasswordSchema);
|
|
4499
|
+
const renewToken = utils$2.yup.object().shape({ token: utils$2.yup.string().required() }).required().noUnknown();
|
|
4500
|
+
const validateRenewTokenInput = utils$2.validateYupSchema(renewToken);
|
|
4501
|
+
const { ApplicationError: ApplicationError$6, ValidationError: ValidationError$2 } = utils$2.errors;
|
|
4502
|
+
const authentication$1 = {
|
|
4498
4503
|
login: compose__default.default([
|
|
4499
4504
|
(ctx, next) => {
|
|
4500
4505
|
return passport__default.default.authenticate("local", { session: false }, (err, user2, info) => {
|
|
@@ -4510,11 +4515,11 @@ const authentication = {
|
|
|
4510
4515
|
error: new Error(info.message),
|
|
4511
4516
|
provider: "local"
|
|
4512
4517
|
});
|
|
4513
|
-
throw new ApplicationError$
|
|
4518
|
+
throw new ApplicationError$6(info.message);
|
|
4514
4519
|
}
|
|
4515
4520
|
const query = ctx.state;
|
|
4516
4521
|
query.user = user2;
|
|
4517
|
-
const sanitizedUser = getService("user").sanitizeUser(user2);
|
|
4522
|
+
const sanitizedUser = getService$1("user").sanitizeUser(user2);
|
|
4518
4523
|
strapi.eventHub.emit("admin.auth.success", { user: sanitizedUser, provider: "local" });
|
|
4519
4524
|
return next();
|
|
4520
4525
|
})(ctx, next);
|
|
@@ -4523,8 +4528,8 @@ const authentication = {
|
|
|
4523
4528
|
const { user: user2 } = ctx.state;
|
|
4524
4529
|
ctx.body = {
|
|
4525
4530
|
data: {
|
|
4526
|
-
token: getService("token").createJwtToken(user2),
|
|
4527
|
-
user: getService("user").sanitizeUser(ctx.state.user)
|
|
4531
|
+
token: getService$1("token").createJwtToken(user2),
|
|
4532
|
+
user: getService$1("user").sanitizeUser(ctx.state.user)
|
|
4528
4533
|
// TODO: fetch more detailed info
|
|
4529
4534
|
}
|
|
4530
4535
|
};
|
|
@@ -4533,50 +4538,50 @@ const authentication = {
|
|
|
4533
4538
|
async renewToken(ctx) {
|
|
4534
4539
|
await validateRenewTokenInput(ctx.request.body);
|
|
4535
4540
|
const { token: token2 } = ctx.request.body;
|
|
4536
|
-
const { isValid, payload } = getService("token").decodeJwtToken(token2);
|
|
4541
|
+
const { isValid, payload } = getService$1("token").decodeJwtToken(token2);
|
|
4537
4542
|
if (!isValid) {
|
|
4538
|
-
throw new ValidationError("Invalid token");
|
|
4543
|
+
throw new ValidationError$2("Invalid token");
|
|
4539
4544
|
}
|
|
4540
4545
|
ctx.body = {
|
|
4541
4546
|
data: {
|
|
4542
|
-
token: getService("token").createJwtToken({ id: payload.id })
|
|
4547
|
+
token: getService$1("token").createJwtToken({ id: payload.id })
|
|
4543
4548
|
}
|
|
4544
4549
|
};
|
|
4545
4550
|
},
|
|
4546
4551
|
async registrationInfo(ctx) {
|
|
4547
4552
|
await validateRegistrationInfoQuery(ctx.request.query);
|
|
4548
4553
|
const { registrationToken } = ctx.request.query;
|
|
4549
|
-
const registrationInfo = await getService("user").findRegistrationInfo(registrationToken);
|
|
4554
|
+
const registrationInfo = await getService$1("user").findRegistrationInfo(registrationToken);
|
|
4550
4555
|
if (!registrationInfo) {
|
|
4551
|
-
throw new ValidationError("Invalid registrationToken");
|
|
4556
|
+
throw new ValidationError$2("Invalid registrationToken");
|
|
4552
4557
|
}
|
|
4553
4558
|
ctx.body = { data: registrationInfo };
|
|
4554
4559
|
},
|
|
4555
4560
|
async register(ctx) {
|
|
4556
4561
|
const input = ctx.request.body;
|
|
4557
4562
|
await validateRegistrationInput(input);
|
|
4558
|
-
const user2 = await getService("user").register(input);
|
|
4563
|
+
const user2 = await getService$1("user").register(input);
|
|
4559
4564
|
ctx.body = {
|
|
4560
4565
|
data: {
|
|
4561
|
-
token: getService("token").createJwtToken(user2),
|
|
4562
|
-
user: getService("user").sanitizeUser(user2)
|
|
4566
|
+
token: getService$1("token").createJwtToken(user2),
|
|
4567
|
+
user: getService$1("user").sanitizeUser(user2)
|
|
4563
4568
|
}
|
|
4564
4569
|
};
|
|
4565
4570
|
},
|
|
4566
4571
|
async registerAdmin(ctx) {
|
|
4567
4572
|
const input = ctx.request.body;
|
|
4568
4573
|
await validateAdminRegistrationInput(input);
|
|
4569
|
-
const hasAdmin = await getService("user").exists();
|
|
4574
|
+
const hasAdmin = await getService$1("user").exists();
|
|
4570
4575
|
if (hasAdmin) {
|
|
4571
|
-
throw new ApplicationError$
|
|
4576
|
+
throw new ApplicationError$6("You cannot register a new super admin");
|
|
4572
4577
|
}
|
|
4573
|
-
const superAdminRole = await getService("role").getSuperAdmin();
|
|
4578
|
+
const superAdminRole = await getService$1("role").getSuperAdmin();
|
|
4574
4579
|
if (!superAdminRole) {
|
|
4575
|
-
throw new ApplicationError$
|
|
4580
|
+
throw new ApplicationError$6(
|
|
4576
4581
|
"Cannot register the first admin because the super admin role doesn't exist."
|
|
4577
4582
|
);
|
|
4578
4583
|
}
|
|
4579
|
-
const user2 = await getService("user").create({
|
|
4584
|
+
const user2 = await getService$1("user").create({
|
|
4580
4585
|
...input,
|
|
4581
4586
|
registrationToken: null,
|
|
4582
4587
|
isActive: true,
|
|
@@ -4585,30 +4590,30 @@ const authentication = {
|
|
|
4585
4590
|
strapi.telemetry.send("didCreateFirstAdmin");
|
|
4586
4591
|
ctx.body = {
|
|
4587
4592
|
data: {
|
|
4588
|
-
token: getService("token").createJwtToken(user2),
|
|
4589
|
-
user: getService("user").sanitizeUser(user2)
|
|
4593
|
+
token: getService$1("token").createJwtToken(user2),
|
|
4594
|
+
user: getService$1("user").sanitizeUser(user2)
|
|
4590
4595
|
}
|
|
4591
4596
|
};
|
|
4592
4597
|
},
|
|
4593
4598
|
async forgotPassword(ctx) {
|
|
4594
4599
|
const input = ctx.request.body;
|
|
4595
4600
|
await validateForgotPasswordInput(input);
|
|
4596
|
-
getService("auth").forgotPassword(input);
|
|
4601
|
+
getService$1("auth").forgotPassword(input);
|
|
4597
4602
|
ctx.status = 204;
|
|
4598
4603
|
},
|
|
4599
4604
|
async resetPassword(ctx) {
|
|
4600
4605
|
const input = ctx.request.body;
|
|
4601
4606
|
await validateResetPasswordInput(input);
|
|
4602
|
-
const user2 = await getService("auth").resetPassword(input);
|
|
4607
|
+
const user2 = await getService$1("auth").resetPassword(input);
|
|
4603
4608
|
ctx.body = {
|
|
4604
4609
|
data: {
|
|
4605
|
-
token: getService("token").createJwtToken(user2),
|
|
4606
|
-
user: getService("user").sanitizeUser(user2)
|
|
4610
|
+
token: getService$1("token").createJwtToken(user2),
|
|
4611
|
+
user: getService$1("user").sanitizeUser(user2)
|
|
4607
4612
|
}
|
|
4608
4613
|
};
|
|
4609
4614
|
},
|
|
4610
4615
|
logout(ctx) {
|
|
4611
|
-
const sanitizedUser = getService("user").sanitizeUser(ctx.state.user);
|
|
4616
|
+
const sanitizedUser = getService$1("user").sanitizeUser(ctx.state.user);
|
|
4612
4617
|
strapi.eventHub.emit("admin.logout", { user: sanitizedUser });
|
|
4613
4618
|
ctx.body = { data: {} };
|
|
4614
4619
|
}
|
|
@@ -4624,7 +4629,7 @@ const permission = {
|
|
|
4624
4629
|
const { body: input } = ctx.request;
|
|
4625
4630
|
const { userAbility } = ctx.state;
|
|
4626
4631
|
await validateCheckPermissionsInput(input);
|
|
4627
|
-
const { engine: engine2 } = getService("permission");
|
|
4632
|
+
const { engine: engine2 } = getService$1("permission");
|
|
4628
4633
|
const checkPermissionsFn = engine2.checkMany(userAbility);
|
|
4629
4634
|
ctx.body = {
|
|
4630
4635
|
data: checkPermissionsFn(input.permissions)
|
|
@@ -4635,7 +4640,7 @@ const permission = {
|
|
|
4635
4640
|
* @param {KoaContext} ctx - koa context
|
|
4636
4641
|
*/
|
|
4637
4642
|
async getAll(ctx) {
|
|
4638
|
-
const { sectionsBuilder: sectionsBuilder2, actionProvider: actionProvider2, conditionProvider: conditionProvider2 } = getService("permission");
|
|
4643
|
+
const { sectionsBuilder: sectionsBuilder2, actionProvider: actionProvider2, conditionProvider: conditionProvider2 } = getService$1("permission");
|
|
4639
4644
|
const actions2 = actionProvider2.values();
|
|
4640
4645
|
const conditions2 = conditionProvider2.values();
|
|
4641
4646
|
const sections = await sectionsBuilder2.build(actions2);
|
|
@@ -4648,12 +4653,12 @@ const permission = {
|
|
|
4648
4653
|
};
|
|
4649
4654
|
}
|
|
4650
4655
|
};
|
|
4651
|
-
const roleCreateSchema = utils$
|
|
4652
|
-
name: utils$
|
|
4653
|
-
description: utils$
|
|
4656
|
+
const roleCreateSchema$1 = utils$2.yup.object().shape({
|
|
4657
|
+
name: utils$2.yup.string().min(1).required(),
|
|
4658
|
+
description: utils$2.yup.string().nullable()
|
|
4654
4659
|
}).noUnknown();
|
|
4655
|
-
const rolesDeleteSchema = utils$
|
|
4656
|
-
ids: utils$
|
|
4660
|
+
const rolesDeleteSchema$1 = utils$2.yup.object().shape({
|
|
4661
|
+
ids: utils$2.yup.array().of(utils$2.yup.strapiID()).min(1).required().test("roles-deletion-checks", "Roles deletion checks have failed", async function(ids) {
|
|
4657
4662
|
try {
|
|
4658
4663
|
await strapi.service("admin::role").checkRolesIdForDeletion(ids);
|
|
4659
4664
|
} catch (e) {
|
|
@@ -4662,7 +4667,7 @@ const rolesDeleteSchema = utils$1.yup.object().shape({
|
|
|
4662
4667
|
return true;
|
|
4663
4668
|
})
|
|
4664
4669
|
}).noUnknown();
|
|
4665
|
-
const roleDeleteSchema = utils$
|
|
4670
|
+
const roleDeleteSchema$1 = utils$2.yup.strapiID().required().test("no-admin-single-delete", "Role deletion checks have failed", async function(id) {
|
|
4666
4671
|
try {
|
|
4667
4672
|
await strapi.service("admin::role").checkRolesIdForDeletion([id]);
|
|
4668
4673
|
} catch (e) {
|
|
@@ -4670,25 +4675,25 @@ const roleDeleteSchema = utils$1.yup.strapiID().required().test("no-admin-single
|
|
|
4670
4675
|
}
|
|
4671
4676
|
return true;
|
|
4672
4677
|
});
|
|
4673
|
-
const roleUpdateSchema = utils$
|
|
4674
|
-
name: utils$
|
|
4675
|
-
description: utils$
|
|
4678
|
+
const roleUpdateSchema = utils$2.yup.object().shape({
|
|
4679
|
+
name: utils$2.yup.string().min(1),
|
|
4680
|
+
description: utils$2.yup.string().nullable()
|
|
4676
4681
|
}).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 = {
|
|
4682
|
+
const validateRoleCreateInput$1 = utils$2.validateYupSchema(roleCreateSchema$1);
|
|
4683
|
+
const validateRoleUpdateInput = utils$2.validateYupSchema(roleUpdateSchema);
|
|
4684
|
+
const validateRolesDeleteInput$1 = utils$2.validateYupSchema(rolesDeleteSchema$1);
|
|
4685
|
+
const validateRoleDeleteInput$1 = utils$2.validateYupSchema(roleDeleteSchema$1);
|
|
4686
|
+
const { ApplicationError: ApplicationError$5 } = utils$2.errors;
|
|
4687
|
+
const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$2 } = constants$3;
|
|
4688
|
+
const role$2 = {
|
|
4684
4689
|
/**
|
|
4685
4690
|
* Create a new role
|
|
4686
4691
|
* @param {KoaContext} ctx - koa context
|
|
4687
4692
|
*/
|
|
4688
4693
|
async create(ctx) {
|
|
4689
4694
|
const { body } = ctx.request;
|
|
4690
|
-
await validateRoleCreateInput(body);
|
|
4691
|
-
const roleService = getService("role");
|
|
4695
|
+
await validateRoleCreateInput$1(body);
|
|
4696
|
+
const roleService = getService$1("role");
|
|
4692
4697
|
const role2 = await roleService.create(body);
|
|
4693
4698
|
const sanitizedRole = roleService.sanitizeRole(role2);
|
|
4694
4699
|
ctx.created({ data: sanitizedRole });
|
|
@@ -4699,7 +4704,7 @@ const role = {
|
|
|
4699
4704
|
*/
|
|
4700
4705
|
async findOne(ctx) {
|
|
4701
4706
|
const { id } = ctx.params;
|
|
4702
|
-
const role2 = await getService("role").findOneWithUsersCount({ id });
|
|
4707
|
+
const role2 = await getService$1("role").findOneWithUsersCount({ id });
|
|
4703
4708
|
if (!role2) {
|
|
4704
4709
|
return ctx.notFound("role.notFound");
|
|
4705
4710
|
}
|
|
@@ -4713,13 +4718,13 @@ const role = {
|
|
|
4713
4718
|
*/
|
|
4714
4719
|
async findAll(ctx) {
|
|
4715
4720
|
const { query } = ctx.request;
|
|
4716
|
-
const permissionsManager = getService("permission").createPermissionsManager({
|
|
4721
|
+
const permissionsManager = getService$1("permission").createPermissionsManager({
|
|
4717
4722
|
ability: ctx.state.userAbility,
|
|
4718
4723
|
model: "admin::role"
|
|
4719
4724
|
});
|
|
4720
4725
|
await permissionsManager.validateQuery(query);
|
|
4721
4726
|
const sanitizedQuery = await permissionsManager.sanitizeQuery(query);
|
|
4722
|
-
const roles2 = await getService("role").findAllWithUsersCount(sanitizedQuery);
|
|
4727
|
+
const roles2 = await getService$1("role").findAllWithUsersCount(sanitizedQuery);
|
|
4723
4728
|
ctx.body = {
|
|
4724
4729
|
data: roles2
|
|
4725
4730
|
};
|
|
@@ -4731,14 +4736,14 @@ const role = {
|
|
|
4731
4736
|
async update(ctx) {
|
|
4732
4737
|
const { id } = ctx.params;
|
|
4733
4738
|
const { body } = ctx.request;
|
|
4734
|
-
const roleService = getService("role");
|
|
4739
|
+
const roleService = getService$1("role");
|
|
4735
4740
|
await validateRoleUpdateInput(body);
|
|
4736
4741
|
const role2 = await roleService.findOne({ id });
|
|
4737
4742
|
if (!role2) {
|
|
4738
4743
|
return ctx.notFound("role.notFound");
|
|
4739
4744
|
}
|
|
4740
|
-
if (role2.code === SUPER_ADMIN_CODE) {
|
|
4741
|
-
throw new ApplicationError$
|
|
4745
|
+
if (role2.code === SUPER_ADMIN_CODE$2) {
|
|
4746
|
+
throw new ApplicationError$5("Super admin can't be edited.");
|
|
4742
4747
|
}
|
|
4743
4748
|
const updatedRole = await roleService.update({ id }, body);
|
|
4744
4749
|
const sanitizedRole = roleService.sanitizeRole(updatedRole);
|
|
@@ -4752,8 +4757,8 @@ const role = {
|
|
|
4752
4757
|
*/
|
|
4753
4758
|
async getPermissions(ctx) {
|
|
4754
4759
|
const { id } = ctx.params;
|
|
4755
|
-
const roleService = getService("role");
|
|
4756
|
-
const permissionService = getService("permission");
|
|
4760
|
+
const roleService = getService$1("role");
|
|
4761
|
+
const permissionService = getService$1("permission");
|
|
4757
4762
|
const role2 = await roleService.findOne({ id });
|
|
4758
4763
|
if (!role2) {
|
|
4759
4764
|
return ctx.notFound("role.notFound");
|
|
@@ -4772,14 +4777,14 @@ const role = {
|
|
|
4772
4777
|
async updatePermissions(ctx) {
|
|
4773
4778
|
const { id } = ctx.params;
|
|
4774
4779
|
const { body: input } = ctx.request;
|
|
4775
|
-
const roleService = getService("role");
|
|
4776
|
-
const permissionService = getService("permission");
|
|
4780
|
+
const roleService = getService$1("role");
|
|
4781
|
+
const permissionService = getService$1("permission");
|
|
4777
4782
|
const role2 = await roleService.findOne({ id });
|
|
4778
4783
|
if (!role2) {
|
|
4779
4784
|
return ctx.notFound("role.notFound");
|
|
4780
4785
|
}
|
|
4781
|
-
if (role2.code === SUPER_ADMIN_CODE) {
|
|
4782
|
-
throw new ApplicationError$
|
|
4786
|
+
if (role2.code === SUPER_ADMIN_CODE$2) {
|
|
4787
|
+
throw new ApplicationError$5("Super admin permissions can't be edited.");
|
|
4783
4788
|
}
|
|
4784
4789
|
await validatedUpdatePermissionsInput(input);
|
|
4785
4790
|
if (!role2) {
|
|
@@ -4797,8 +4802,8 @@ const role = {
|
|
|
4797
4802
|
*/
|
|
4798
4803
|
async deleteOne(ctx) {
|
|
4799
4804
|
const { id } = ctx.params;
|
|
4800
|
-
await validateRoleDeleteInput(id);
|
|
4801
|
-
const roleService = getService("role");
|
|
4805
|
+
await validateRoleDeleteInput$1(id);
|
|
4806
|
+
const roleService = getService$1("role");
|
|
4802
4807
|
const roles2 = await roleService.deleteByIds([id]);
|
|
4803
4808
|
const sanitizedRole = roles2.map((role2) => roleService.sanitizeRole(role2))[0] || null;
|
|
4804
4809
|
return ctx.deleted({
|
|
@@ -4811,8 +4816,8 @@ const role = {
|
|
|
4811
4816
|
*/
|
|
4812
4817
|
async deleteMany(ctx) {
|
|
4813
4818
|
const { body } = ctx.request;
|
|
4814
|
-
await validateRolesDeleteInput(body);
|
|
4815
|
-
const roleService = getService("role");
|
|
4819
|
+
await validateRolesDeleteInput$1(body);
|
|
4820
|
+
const roleService = getService$1("role");
|
|
4816
4821
|
const roles2 = await roleService.deleteByIds(body.ids);
|
|
4817
4822
|
const sanitizedRoles = roles2.map(roleService.sanitizeRole);
|
|
4818
4823
|
return ctx.deleted({
|
|
@@ -4825,11 +4830,11 @@ const {
|
|
|
4825
4830
|
handlers: { createPushController, createPullController }
|
|
4826
4831
|
}
|
|
4827
4832
|
} = dataTransfer$1.strapi;
|
|
4828
|
-
const { UnauthorizedError } = utils$
|
|
4833
|
+
const { UnauthorizedError: UnauthorizedError$1 } = utils$2.errors;
|
|
4829
4834
|
const verify = async (ctx, scope) => {
|
|
4830
4835
|
const { auth: auth2 } = ctx.state;
|
|
4831
4836
|
if (!auth2) {
|
|
4832
|
-
throw new UnauthorizedError();
|
|
4837
|
+
throw new UnauthorizedError$1();
|
|
4833
4838
|
}
|
|
4834
4839
|
await dataTransferAuthStrategy.verify(auth2, { scope });
|
|
4835
4840
|
};
|
|
@@ -4839,34 +4844,34 @@ const runner = {
|
|
|
4839
4844
|
push,
|
|
4840
4845
|
pull
|
|
4841
4846
|
};
|
|
4842
|
-
const transferTokenCreationSchema = utils$
|
|
4843
|
-
name: utils$
|
|
4844
|
-
description: utils$
|
|
4845
|
-
permissions: utils$
|
|
4846
|
-
lifespan: utils$
|
|
4847
|
+
const transferTokenCreationSchema = utils$2.yup.object().shape({
|
|
4848
|
+
name: utils$2.yup.string().min(1).required(),
|
|
4849
|
+
description: utils$2.yup.string().optional(),
|
|
4850
|
+
permissions: utils$2.yup.array().min(1).of(utils$2.yup.string().oneOf(Object.values(constants$3.TRANSFER_TOKEN_TYPE))).required(),
|
|
4851
|
+
lifespan: utils$2.yup.number().min(1).oneOf(Object.values(constants$3.TRANSFER_TOKEN_LIFESPANS)).nullable()
|
|
4847
4852
|
}).noUnknown().strict();
|
|
4848
|
-
const transferTokenUpdateSchema = utils$
|
|
4849
|
-
name: utils$
|
|
4850
|
-
description: utils$
|
|
4851
|
-
permissions: utils$
|
|
4853
|
+
const transferTokenUpdateSchema = utils$2.yup.object().shape({
|
|
4854
|
+
name: utils$2.yup.string().min(1).notNull(),
|
|
4855
|
+
description: utils$2.yup.string().nullable(),
|
|
4856
|
+
permissions: utils$2.yup.array().min(1).of(utils$2.yup.string().oneOf(Object.values(constants$3.TRANSFER_TOKEN_TYPE))).nullable()
|
|
4852
4857
|
}).noUnknown().strict();
|
|
4853
|
-
const validateTransferTokenCreationInput$1 = utils$
|
|
4854
|
-
const validateTransferTokenUpdateInput$1 = utils$
|
|
4858
|
+
const validateTransferTokenCreationInput$1 = utils$2.validateYupSchema(transferTokenCreationSchema);
|
|
4859
|
+
const validateTransferTokenUpdateInput$1 = utils$2.validateYupSchema(transferTokenUpdateSchema);
|
|
4855
4860
|
const token$1 = {
|
|
4856
4861
|
validateTransferTokenCreationInput: validateTransferTokenCreationInput$1,
|
|
4857
4862
|
validateTransferTokenUpdateInput: validateTransferTokenUpdateInput$1
|
|
4858
4863
|
};
|
|
4859
|
-
const { ApplicationError: ApplicationError$
|
|
4864
|
+
const { ApplicationError: ApplicationError$4 } = utils$2.errors;
|
|
4860
4865
|
const { validateTransferTokenCreationInput, validateTransferTokenUpdateInput } = token$1;
|
|
4861
4866
|
const token = {
|
|
4862
4867
|
async list(ctx) {
|
|
4863
|
-
const transferService = getService("transfer");
|
|
4868
|
+
const transferService = getService$1("transfer");
|
|
4864
4869
|
const transferTokens = await transferService.token.list();
|
|
4865
4870
|
ctx.body = { data: transferTokens };
|
|
4866
4871
|
},
|
|
4867
4872
|
async getById(ctx) {
|
|
4868
4873
|
const { id } = ctx.params;
|
|
4869
|
-
const tokenService = getService("transfer").token;
|
|
4874
|
+
const tokenService = getService$1("transfer").token;
|
|
4870
4875
|
const transferToken2 = await tokenService.getById(id);
|
|
4871
4876
|
if (!transferToken2) {
|
|
4872
4877
|
ctx.notFound("Transfer token not found");
|
|
@@ -4876,7 +4881,7 @@ const token = {
|
|
|
4876
4881
|
},
|
|
4877
4882
|
async create(ctx) {
|
|
4878
4883
|
const { body } = ctx.request;
|
|
4879
|
-
const { token: tokenService } = getService("transfer");
|
|
4884
|
+
const { token: tokenService } = getService$1("transfer");
|
|
4880
4885
|
const attributes = {
|
|
4881
4886
|
name: fp.trim(body.name),
|
|
4882
4887
|
description: fp.trim(body.description),
|
|
@@ -4886,7 +4891,7 @@ const token = {
|
|
|
4886
4891
|
await validateTransferTokenCreationInput(attributes);
|
|
4887
4892
|
const alreadyExists = await tokenService.exists({ name: attributes.name });
|
|
4888
4893
|
if (alreadyExists) {
|
|
4889
|
-
throw new ApplicationError$
|
|
4894
|
+
throw new ApplicationError$4("Name already taken");
|
|
4890
4895
|
}
|
|
4891
4896
|
const transferTokens = await tokenService.create(attributes);
|
|
4892
4897
|
ctx.created({ data: transferTokens });
|
|
@@ -4894,7 +4899,7 @@ const token = {
|
|
|
4894
4899
|
async update(ctx) {
|
|
4895
4900
|
const { body } = ctx.request;
|
|
4896
4901
|
const { id } = ctx.params;
|
|
4897
|
-
const { token: tokenService } = getService("transfer");
|
|
4902
|
+
const { token: tokenService } = getService$1("transfer");
|
|
4898
4903
|
const attributes = body;
|
|
4899
4904
|
if (fp.has("name", attributes)) {
|
|
4900
4905
|
attributes.name = fp.trim(body.name);
|
|
@@ -4909,8 +4914,8 @@ const token = {
|
|
|
4909
4914
|
}
|
|
4910
4915
|
if (fp.has("name", attributes)) {
|
|
4911
4916
|
const nameAlreadyTaken = await tokenService.getByName(attributes.name);
|
|
4912
|
-
if (!!nameAlreadyTaken && !utils$
|
|
4913
|
-
throw new ApplicationError$
|
|
4917
|
+
if (!!nameAlreadyTaken && !utils$2.strings.isEqual(nameAlreadyTaken.id, id)) {
|
|
4918
|
+
throw new ApplicationError$4("Name already taken");
|
|
4914
4919
|
}
|
|
4915
4920
|
}
|
|
4916
4921
|
const apiToken2 = await tokenService.update(id, attributes);
|
|
@@ -4918,13 +4923,13 @@ const token = {
|
|
|
4918
4923
|
},
|
|
4919
4924
|
async revoke(ctx) {
|
|
4920
4925
|
const { id } = ctx.params;
|
|
4921
|
-
const { token: tokenService } = getService("transfer");
|
|
4926
|
+
const { token: tokenService } = getService$1("transfer");
|
|
4922
4927
|
const transferToken2 = await tokenService.revoke(id);
|
|
4923
4928
|
ctx.deleted({ data: transferToken2 });
|
|
4924
4929
|
},
|
|
4925
4930
|
async regenerate(ctx) {
|
|
4926
4931
|
const { id } = ctx.params;
|
|
4927
|
-
const { token: tokenService } = getService("transfer");
|
|
4932
|
+
const { token: tokenService } = getService$1("transfer");
|
|
4928
4933
|
const exists2 = await tokenService.getById(id);
|
|
4929
4934
|
if (!exists2) {
|
|
4930
4935
|
ctx.notFound("Transfer token not found");
|
|
@@ -4939,12 +4944,12 @@ const transfer = {
|
|
|
4939
4944
|
...prefixActionsName("runner", runner),
|
|
4940
4945
|
...prefixActionsName("token", token)
|
|
4941
4946
|
};
|
|
4942
|
-
const { ApplicationError } = utils$
|
|
4943
|
-
const user = {
|
|
4947
|
+
const { ApplicationError: ApplicationError$3 } = utils$2.errors;
|
|
4948
|
+
const user$2 = {
|
|
4944
4949
|
async create(ctx) {
|
|
4945
4950
|
const { body } = ctx.request;
|
|
4946
4951
|
const cleanData = { ...body, email: ___namespace.get(body, `email`, ``).toLowerCase() };
|
|
4947
|
-
await validateUserCreationInput(cleanData);
|
|
4952
|
+
await validateUserCreationInput$1(cleanData);
|
|
4948
4953
|
const attributes = ___namespace.pick(cleanData, [
|
|
4949
4954
|
"firstname",
|
|
4950
4955
|
"lastname",
|
|
@@ -4952,19 +4957,19 @@ const user = {
|
|
|
4952
4957
|
"roles",
|
|
4953
4958
|
"preferedLanguage"
|
|
4954
4959
|
]);
|
|
4955
|
-
const userAlreadyExists = await getService("user").exists({
|
|
4960
|
+
const userAlreadyExists = await getService$1("user").exists({
|
|
4956
4961
|
email: attributes.email
|
|
4957
4962
|
});
|
|
4958
4963
|
if (userAlreadyExists) {
|
|
4959
|
-
throw new ApplicationError("Email already taken");
|
|
4964
|
+
throw new ApplicationError$3("Email already taken");
|
|
4960
4965
|
}
|
|
4961
|
-
const createdUser = await getService("user").create(attributes);
|
|
4962
|
-
const userInfo = getService("user").sanitizeUser(createdUser);
|
|
4966
|
+
const createdUser = await getService$1("user").create(attributes);
|
|
4967
|
+
const userInfo = getService$1("user").sanitizeUser(createdUser);
|
|
4963
4968
|
Object.assign(userInfo, { registrationToken: createdUser.registrationToken });
|
|
4964
4969
|
ctx.created({ data: userInfo });
|
|
4965
4970
|
},
|
|
4966
4971
|
async find(ctx) {
|
|
4967
|
-
const userService = getService("user");
|
|
4972
|
+
const userService = getService$1("user");
|
|
4968
4973
|
const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
4969
4974
|
ability: ctx.state.userAbility,
|
|
4970
4975
|
model: "admin::user"
|
|
@@ -4981,12 +4986,12 @@ const user = {
|
|
|
4981
4986
|
},
|
|
4982
4987
|
async findOne(ctx) {
|
|
4983
4988
|
const { id } = ctx.params;
|
|
4984
|
-
const user2 = await getService("user").findOne(id);
|
|
4989
|
+
const user2 = await getService$1("user").findOne(id);
|
|
4985
4990
|
if (!user2) {
|
|
4986
4991
|
return ctx.notFound("User does not exist");
|
|
4987
4992
|
}
|
|
4988
4993
|
ctx.body = {
|
|
4989
|
-
data: getService("user").sanitizeUser(user2)
|
|
4994
|
+
data: getService$1("user").sanitizeUser(user2)
|
|
4990
4995
|
};
|
|
4991
4996
|
},
|
|
4992
4997
|
async update(ctx) {
|
|
@@ -4994,30 +4999,30 @@ const user = {
|
|
|
4994
4999
|
const { body: input } = ctx.request;
|
|
4995
5000
|
await validateUserUpdateInput(input);
|
|
4996
5001
|
if (___namespace.has(input, "email")) {
|
|
4997
|
-
const uniqueEmailCheck = await getService("user").exists({
|
|
5002
|
+
const uniqueEmailCheck = await getService$1("user").exists({
|
|
4998
5003
|
id: { $ne: id },
|
|
4999
5004
|
email: input.email
|
|
5000
5005
|
});
|
|
5001
5006
|
if (uniqueEmailCheck) {
|
|
5002
|
-
throw new ApplicationError("A user with this email address already exists");
|
|
5007
|
+
throw new ApplicationError$3("A user with this email address already exists");
|
|
5003
5008
|
}
|
|
5004
5009
|
}
|
|
5005
|
-
const updatedUser = await getService("user").updateById(id, input);
|
|
5010
|
+
const updatedUser = await getService$1("user").updateById(id, input);
|
|
5006
5011
|
if (!updatedUser) {
|
|
5007
5012
|
return ctx.notFound("User does not exist");
|
|
5008
5013
|
}
|
|
5009
5014
|
ctx.body = {
|
|
5010
|
-
data: getService("user").sanitizeUser(updatedUser)
|
|
5015
|
+
data: getService$1("user").sanitizeUser(updatedUser)
|
|
5011
5016
|
};
|
|
5012
5017
|
},
|
|
5013
5018
|
async deleteOne(ctx) {
|
|
5014
5019
|
const { id } = ctx.params;
|
|
5015
|
-
const deletedUser = await getService("user").deleteById(id);
|
|
5020
|
+
const deletedUser = await getService$1("user").deleteById(id);
|
|
5016
5021
|
if (!deletedUser) {
|
|
5017
5022
|
return ctx.notFound("User not found");
|
|
5018
5023
|
}
|
|
5019
5024
|
return ctx.deleted({
|
|
5020
|
-
data: getService("user").sanitizeUser(deletedUser)
|
|
5025
|
+
data: getService$1("user").sanitizeUser(deletedUser)
|
|
5021
5026
|
});
|
|
5022
5027
|
},
|
|
5023
5028
|
/**
|
|
@@ -5027,17 +5032,17 @@ const user = {
|
|
|
5027
5032
|
async deleteMany(ctx) {
|
|
5028
5033
|
const { body } = ctx.request;
|
|
5029
5034
|
await validateUsersDeleteInput(body);
|
|
5030
|
-
const users2 = await getService("user").deleteByIds(body.ids);
|
|
5031
|
-
const sanitizedUsers = users2.map(getService("user").sanitizeUser);
|
|
5035
|
+
const users2 = await getService$1("user").deleteByIds(body.ids);
|
|
5036
|
+
const sanitizedUsers = users2.map(getService$1("user").sanitizeUser);
|
|
5032
5037
|
return ctx.deleted({
|
|
5033
5038
|
data: sanitizedUsers
|
|
5034
5039
|
});
|
|
5035
5040
|
}
|
|
5036
5041
|
};
|
|
5037
5042
|
const urlRegex = /^(?:([a-z0-9+.-]+):\/\/)(?:\S+(?::\S*)?@)?(?:(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9_]-*)*[a-z\u00a1-\uffff0-9_]+)(?:\.(?:[a-z\u00a1-\uffff0-9_]-*)*[a-z\u00a1-\uffff0-9_]+)*\.?)(?::\d{2,5})?(?:[/?#]\S*)?$/;
|
|
5038
|
-
const webhookValidator = utils$
|
|
5039
|
-
name: utils$
|
|
5040
|
-
url: utils$
|
|
5043
|
+
const webhookValidator = utils$2.yup.object({
|
|
5044
|
+
name: utils$2.yup.string().required(),
|
|
5045
|
+
url: utils$2.yup.string().matches(urlRegex, "url must be a valid URL").required().test(
|
|
5041
5046
|
"is-public-url",
|
|
5042
5047
|
"Url is not supported because it isn't reachable over the public internet",
|
|
5043
5048
|
async (url) => {
|
|
@@ -5053,21 +5058,21 @@ const webhookValidator = utils$1.yup.object({
|
|
|
5053
5058
|
}
|
|
5054
5059
|
}
|
|
5055
5060
|
),
|
|
5056
|
-
headers: utils$
|
|
5061
|
+
headers: utils$2.yup.lazy((data) => {
|
|
5057
5062
|
if (typeof data !== "object") {
|
|
5058
|
-
return utils$
|
|
5063
|
+
return utils$2.yup.object().required();
|
|
5059
5064
|
}
|
|
5060
|
-
return utils$
|
|
5065
|
+
return utils$2.yup.object(
|
|
5061
5066
|
// @ts-expect-error lodash types
|
|
5062
5067
|
___namespace.default.mapValues(data, () => {
|
|
5063
|
-
utils$
|
|
5068
|
+
utils$2.yup.string().min(1).required();
|
|
5064
5069
|
})
|
|
5065
5070
|
).required();
|
|
5066
5071
|
}),
|
|
5067
|
-
events: utils$
|
|
5072
|
+
events: utils$2.yup.array().of(utils$2.yup.string()).required()
|
|
5068
5073
|
}).noUnknown();
|
|
5069
5074
|
const updateWebhookValidator = webhookValidator.shape({
|
|
5070
|
-
isEnabled: utils$
|
|
5075
|
+
isEnabled: utils$2.yup.boolean()
|
|
5071
5076
|
});
|
|
5072
5077
|
const webhooks = {
|
|
5073
5078
|
async listWebhooks(ctx) {
|
|
@@ -5084,7 +5089,7 @@ const webhooks = {
|
|
|
5084
5089
|
},
|
|
5085
5090
|
async createWebhook(ctx) {
|
|
5086
5091
|
const { body } = ctx.request;
|
|
5087
|
-
await utils$
|
|
5092
|
+
await utils$2.validateYupSchema(webhookValidator)(body);
|
|
5088
5093
|
const webhook = await strapi.get("webhookStore").createWebhook(body);
|
|
5089
5094
|
strapi.get("webhookRunner").add(webhook);
|
|
5090
5095
|
ctx.created({ data: webhook });
|
|
@@ -5092,7 +5097,7 @@ const webhooks = {
|
|
|
5092
5097
|
async updateWebhook(ctx) {
|
|
5093
5098
|
const { id } = ctx.params;
|
|
5094
5099
|
const { body } = ctx.request;
|
|
5095
|
-
await utils$
|
|
5100
|
+
await utils$2.validateYupSchema(updateWebhookValidator)(body);
|
|
5096
5101
|
const webhook = await strapi.get("webhookStore").findWebhook(id);
|
|
5097
5102
|
if (!webhook) {
|
|
5098
5103
|
return ctx.notFound("webhook.notFound");
|
|
@@ -5148,15 +5153,15 @@ const contentApi = {
|
|
|
5148
5153
|
ctx.send({ data: routesMap });
|
|
5149
5154
|
}
|
|
5150
5155
|
};
|
|
5151
|
-
const
|
|
5152
|
-
admin,
|
|
5156
|
+
const controllers$1 = {
|
|
5157
|
+
admin: admin$3,
|
|
5153
5158
|
"api-token": apiToken$1,
|
|
5154
5159
|
"authenticated-user": authenticatedUser,
|
|
5155
|
-
authentication,
|
|
5160
|
+
authentication: authentication$1,
|
|
5156
5161
|
permission,
|
|
5157
|
-
role,
|
|
5162
|
+
role: role$2,
|
|
5158
5163
|
transfer,
|
|
5159
|
-
user,
|
|
5164
|
+
user: user$2,
|
|
5160
5165
|
webhooks,
|
|
5161
5166
|
"content-api": contentApi
|
|
5162
5167
|
};
|
|
@@ -5581,7 +5586,7 @@ const transferTokenPermission = {
|
|
|
5581
5586
|
}
|
|
5582
5587
|
}
|
|
5583
5588
|
};
|
|
5584
|
-
const
|
|
5589
|
+
const contentTypes = {
|
|
5585
5590
|
permission: { schema: Permission },
|
|
5586
5591
|
user: { schema: User },
|
|
5587
5592
|
role: { schema: Role },
|
|
@@ -5591,7 +5596,7 @@ const index$1 = {
|
|
|
5591
5596
|
"transfer-token-permission": { schema: transferTokenPermission }
|
|
5592
5597
|
};
|
|
5593
5598
|
const { RateLimitError } = utils__default.default.errors;
|
|
5594
|
-
const rateLimit = (
|
|
5599
|
+
const rateLimit = (config2, { strapi: strapi2 }) => async (ctx, next) => {
|
|
5595
5600
|
let rateLimitConfig = strapi2.config.get("admin.rateLimit");
|
|
5596
5601
|
if (!rateLimitConfig) {
|
|
5597
5602
|
rateLimitConfig = {
|
|
@@ -5614,14 +5619,14 @@ const rateLimit = (config, { strapi: strapi2 }) => async (ctx, next) => {
|
|
|
5614
5619
|
throw new RateLimitError();
|
|
5615
5620
|
},
|
|
5616
5621
|
...rateLimitConfig,
|
|
5617
|
-
...
|
|
5622
|
+
...config2
|
|
5618
5623
|
};
|
|
5619
5624
|
return rateLimit2.middleware(loadConfig)(ctx, next);
|
|
5620
5625
|
}
|
|
5621
5626
|
return next();
|
|
5622
5627
|
};
|
|
5623
5628
|
const dataTransfer = () => async (ctx, next) => {
|
|
5624
|
-
const transferUtils = getService("transfer").utils;
|
|
5629
|
+
const transferUtils = getService$1("transfer").utils;
|
|
5625
5630
|
const { hasValidTokenSalt: hasValidTokenSalt2, isRemoteTransferEnabled: isRemoteTransferEnabled2 } = transferUtils;
|
|
5626
5631
|
if (isRemoteTransferEnabled2()) {
|
|
5627
5632
|
return next();
|
|
@@ -5639,18 +5644,1366 @@ const dataTransfer = () => async (ctx, next) => {
|
|
|
5639
5644
|
}
|
|
5640
5645
|
throw new Error("Unexpected error while trying to access a data transfer route");
|
|
5641
5646
|
};
|
|
5642
|
-
const
|
|
5647
|
+
const middlewares$1 = {
|
|
5643
5648
|
rateLimit,
|
|
5644
5649
|
"data-transfer": dataTransfer
|
|
5645
5650
|
};
|
|
5646
|
-
|
|
5647
|
-
|
|
5648
|
-
|
|
5649
|
-
|
|
5650
|
-
|
|
5651
|
-
|
|
5652
|
-
|
|
5653
|
-
|
|
5654
|
-
|
|
5655
|
-
|
|
5651
|
+
const register = async ({ strapi: strapi2 }) => {
|
|
5652
|
+
await register$2({ strapi: strapi2 });
|
|
5653
|
+
};
|
|
5654
|
+
const getService = (name2, { strapi: strapi2 } = { strapi: global.strapi }) => {
|
|
5655
|
+
return strapi2.service(`admin::${name2}`);
|
|
5656
|
+
};
|
|
5657
|
+
const actions = {
|
|
5658
|
+
sso: [
|
|
5659
|
+
{
|
|
5660
|
+
uid: "provider-login.read",
|
|
5661
|
+
displayName: "Read",
|
|
5662
|
+
pluginName: "admin",
|
|
5663
|
+
section: "settings",
|
|
5664
|
+
category: "single sign on",
|
|
5665
|
+
subCategory: "options"
|
|
5666
|
+
},
|
|
5667
|
+
{
|
|
5668
|
+
uid: "provider-login.update",
|
|
5669
|
+
displayName: "Update",
|
|
5670
|
+
pluginName: "admin",
|
|
5671
|
+
section: "settings",
|
|
5672
|
+
category: "single sign on",
|
|
5673
|
+
subCategory: "options"
|
|
5674
|
+
}
|
|
5675
|
+
],
|
|
5676
|
+
auditLogs: [
|
|
5677
|
+
{
|
|
5678
|
+
uid: "audit-logs.read",
|
|
5679
|
+
displayName: "Read",
|
|
5680
|
+
pluginName: "admin",
|
|
5681
|
+
section: "settings",
|
|
5682
|
+
category: "audit logs",
|
|
5683
|
+
subCategory: "options"
|
|
5684
|
+
}
|
|
5685
|
+
]
|
|
5686
|
+
};
|
|
5687
|
+
const transformTableName = (table) => {
|
|
5688
|
+
if (typeof table === "string") {
|
|
5689
|
+
return { name: table };
|
|
5690
|
+
}
|
|
5691
|
+
return table;
|
|
5692
|
+
};
|
|
5693
|
+
async function findTables({ strapi: strapi2 }, regex) {
|
|
5694
|
+
const tables = await strapi2.db.dialect.schemaInspector.getTables();
|
|
5695
|
+
return tables.filter((tableName) => regex.test(tableName));
|
|
5696
|
+
}
|
|
5697
|
+
async function addPersistTables({ strapi: strapi2 }, tableNames) {
|
|
5698
|
+
const persistedTables = await getPersistedTables({ strapi: strapi2 });
|
|
5699
|
+
const tables = tableNames.map(transformTableName);
|
|
5700
|
+
const notPersistedTableNames = fp.differenceWith(fp.isEqual, tables, persistedTables);
|
|
5701
|
+
const tablesToPersist = fp.differenceWith(
|
|
5702
|
+
(t1, t2) => t1.name === t2.name,
|
|
5703
|
+
persistedTables,
|
|
5704
|
+
notPersistedTableNames
|
|
5705
|
+
);
|
|
5706
|
+
if (!notPersistedTableNames.length) {
|
|
5707
|
+
return;
|
|
5708
|
+
}
|
|
5709
|
+
tablesToPersist.push(...notPersistedTableNames);
|
|
5710
|
+
await strapi2.store.set({
|
|
5711
|
+
type: "core",
|
|
5712
|
+
key: "persisted_tables",
|
|
5713
|
+
value: tablesToPersist
|
|
5714
|
+
});
|
|
5715
|
+
}
|
|
5716
|
+
async function getPersistedTables({ strapi: strapi2 }) {
|
|
5717
|
+
const persistedTables = await strapi2.store.get({
|
|
5718
|
+
type: "core",
|
|
5719
|
+
key: "persisted_tables"
|
|
5720
|
+
});
|
|
5721
|
+
return (persistedTables || []).map(transformTableName);
|
|
5722
|
+
}
|
|
5723
|
+
const persistTablesWithPrefix = async (tableNamePrefix) => {
|
|
5724
|
+
const tableNameRegex = new RegExp(`^${tableNamePrefix}.*`);
|
|
5725
|
+
const tableNames = await findTables({ strapi }, tableNameRegex);
|
|
5726
|
+
await addPersistTables({ strapi }, tableNames);
|
|
5727
|
+
};
|
|
5728
|
+
const bootstrap = async (args) => {
|
|
5729
|
+
const { actionProvider: actionProvider2 } = getService("permission");
|
|
5730
|
+
if (strapi.ee.features.isEnabled("sso")) {
|
|
5731
|
+
await actionProvider2.registerMany(actions.sso);
|
|
5732
|
+
}
|
|
5733
|
+
if (strapi.ee.features.isEnabled("audit-logs")) {
|
|
5734
|
+
await persistTablesWithPrefix("strapi_audit_logs");
|
|
5735
|
+
await actionProvider2.registerMany(actions.auditLogs);
|
|
5736
|
+
}
|
|
5737
|
+
await getService("seat-enforcement").seatEnforcementWorkflow();
|
|
5738
|
+
await bootstrap$1(args);
|
|
5739
|
+
};
|
|
5740
|
+
const destroy = async ({ strapi: strapi2 }) => {
|
|
5741
|
+
await destroy$1();
|
|
5742
|
+
};
|
|
5743
|
+
const adminContentTypes = {};
|
|
5744
|
+
const isSsoLocked = async (user2) => {
|
|
5745
|
+
if (!strapi.ee.features.isEnabled("sso")) {
|
|
5746
|
+
return false;
|
|
5747
|
+
}
|
|
5748
|
+
if (!user2) {
|
|
5749
|
+
throw new Error("Missing user object");
|
|
5750
|
+
}
|
|
5751
|
+
const adminStore = await strapi.store({ type: "core", name: "admin" });
|
|
5752
|
+
const { providers: providers2 } = await adminStore.get({ key: "auth" });
|
|
5753
|
+
const lockedRoles = providers2.ssoLockedRoles ?? [];
|
|
5754
|
+
if (fp.isEmpty(lockedRoles)) {
|
|
5755
|
+
return false;
|
|
5756
|
+
}
|
|
5757
|
+
const roles2 = (
|
|
5758
|
+
// If the roles are pre-loaded for the given user, then use them
|
|
5759
|
+
user2.roles ?? // Otherwise, try to load the role based on the given user ID
|
|
5760
|
+
await strapi.db.query("admin::user").load(user2, "roles", { roles: { fields: ["id"] } }) ?? // If the query fails somehow, default to an empty array
|
|
5761
|
+
[]
|
|
5762
|
+
);
|
|
5763
|
+
const isLocked = lockedRoles.some(
|
|
5764
|
+
(lockedId) => (
|
|
5765
|
+
// lockedRoles will be a string to avoid issues with frontend and bigints
|
|
5766
|
+
roles2.some((role2) => lockedId === role2.id.toString())
|
|
5767
|
+
)
|
|
5768
|
+
);
|
|
5769
|
+
return isLocked;
|
|
5770
|
+
};
|
|
5771
|
+
const { ApplicationError: ApplicationError$2 } = utils$2.errors;
|
|
5772
|
+
const forgotPassword = async ({ email: email2 } = {}) => {
|
|
5773
|
+
const user2 = await strapi.db.query("admin::user").findOne({ where: { email: email2, isActive: true } });
|
|
5774
|
+
if (!user2 || await isSsoLocked(user2)) {
|
|
5775
|
+
return;
|
|
5776
|
+
}
|
|
5777
|
+
const resetPasswordToken = getService("token").createToken();
|
|
5778
|
+
await getService("user").updateById(user2.id, { resetPasswordToken });
|
|
5779
|
+
const url = `${strapi.config.get(
|
|
5780
|
+
"admin.absoluteUrl"
|
|
5781
|
+
)}/auth/reset-password?code=${resetPasswordToken}`;
|
|
5782
|
+
return strapi.plugin("email").service("email").sendTemplatedEmail(
|
|
5783
|
+
{
|
|
5784
|
+
to: user2.email,
|
|
5785
|
+
from: strapi.config.get("admin.forgotPassword.from"),
|
|
5786
|
+
replyTo: strapi.config.get("admin.forgotPassword.replyTo")
|
|
5787
|
+
},
|
|
5788
|
+
strapi.config.get("admin.forgotPassword.emailTemplate"),
|
|
5789
|
+
{
|
|
5790
|
+
url,
|
|
5791
|
+
user: ___namespace.default.pick(user2, ["email", "firstname", "lastname", "username"])
|
|
5792
|
+
}
|
|
5793
|
+
).catch((err) => {
|
|
5794
|
+
strapi.log.error(err);
|
|
5795
|
+
});
|
|
5796
|
+
};
|
|
5797
|
+
const resetPassword = async ({ resetPasswordToken, password: password2 } = {}) => {
|
|
5798
|
+
const matchingUser = await strapi.db.query("admin::user").findOne({ where: { resetPasswordToken, isActive: true } });
|
|
5799
|
+
if (!matchingUser || await isSsoLocked(matchingUser)) {
|
|
5800
|
+
throw new ApplicationError$2();
|
|
5801
|
+
}
|
|
5802
|
+
return getService("user").updateById(matchingUser.id, {
|
|
5803
|
+
password: password2,
|
|
5804
|
+
resetPasswordToken: null
|
|
5805
|
+
});
|
|
5806
|
+
};
|
|
5807
|
+
const auth = {
|
|
5808
|
+
forgotPassword,
|
|
5809
|
+
resetPassword
|
|
5810
|
+
};
|
|
5811
|
+
const createProviderRegistry = () => {
|
|
5812
|
+
const registry = /* @__PURE__ */ new Map();
|
|
5813
|
+
Object.assign(registry, {
|
|
5814
|
+
register(provider) {
|
|
5815
|
+
if (strapi.isLoaded) {
|
|
5816
|
+
throw new Error(`You can't register new provider after the bootstrap`);
|
|
5817
|
+
}
|
|
5818
|
+
this.set(provider.uid, provider);
|
|
5819
|
+
},
|
|
5820
|
+
registerMany(providers2) {
|
|
5821
|
+
providers2.forEach((provider) => {
|
|
5822
|
+
this.register(provider);
|
|
5823
|
+
});
|
|
5824
|
+
},
|
|
5825
|
+
getAll() {
|
|
5826
|
+
return Array.from(this.values());
|
|
5827
|
+
}
|
|
5828
|
+
});
|
|
5829
|
+
return registry;
|
|
5830
|
+
};
|
|
5831
|
+
const providerRegistry = createProviderRegistry();
|
|
5832
|
+
const errorMessage = "SSO is disabled. Its functionnalities cannot be accessed.";
|
|
5833
|
+
const getStrategyCallbackURL = (providerName) => {
|
|
5834
|
+
if (!strapi.ee.features.isEnabled("sso")) {
|
|
5835
|
+
throw new Error(errorMessage);
|
|
5836
|
+
}
|
|
5837
|
+
return `/admin/connect/${providerName}`;
|
|
5838
|
+
};
|
|
5839
|
+
const syncProviderRegistryWithConfig = () => {
|
|
5840
|
+
if (!strapi.ee.features.isEnabled("sso")) {
|
|
5841
|
+
throw new Error(errorMessage);
|
|
5842
|
+
}
|
|
5843
|
+
const { providers: providers2 = [] } = strapi.config.get("admin.auth", {});
|
|
5844
|
+
providerRegistry.registerMany(providers2);
|
|
5845
|
+
};
|
|
5846
|
+
const SSOAuthEventsMapper = {
|
|
5847
|
+
onSSOAutoRegistration: "admin.auth.autoRegistration"
|
|
5848
|
+
};
|
|
5849
|
+
const sso$1 = {
|
|
5850
|
+
providerRegistry,
|
|
5851
|
+
getStrategyCallbackURL,
|
|
5852
|
+
syncProviderRegistryWithConfig,
|
|
5853
|
+
authEventsMapper: { ...passport$1.authEventsMapper, ...SSOAuthEventsMapper }
|
|
5854
|
+
};
|
|
5855
|
+
const { UnauthorizedError } = utils$2.errors;
|
|
5856
|
+
const localStrategyMiddleware = async ([error, user2, message], done) => {
|
|
5857
|
+
if (user2 && !error && await isSsoLocked(user2)) {
|
|
5858
|
+
return done(
|
|
5859
|
+
new UnauthorizedError("Login not allowed, please contact your administrator", {
|
|
5860
|
+
code: "LOGIN_NOT_ALLOWED"
|
|
5861
|
+
}),
|
|
5862
|
+
user2,
|
|
5863
|
+
message
|
|
5864
|
+
);
|
|
5865
|
+
}
|
|
5866
|
+
return done(error, user2, message);
|
|
5867
|
+
};
|
|
5868
|
+
const getPassportStrategies = () => {
|
|
5869
|
+
if (!strapi.ee.features.isEnabled("sso")) {
|
|
5870
|
+
return [createLocalStrategy(strapi)];
|
|
5871
|
+
}
|
|
5872
|
+
const localStrategy = createLocalStrategy(strapi, localStrategyMiddleware);
|
|
5873
|
+
if (!strapi.isLoaded) {
|
|
5874
|
+
sso$1.syncProviderRegistryWithConfig();
|
|
5875
|
+
}
|
|
5876
|
+
const providers2 = sso$1.providerRegistry.getAll();
|
|
5877
|
+
const strategies = providers2.map((provider) => provider.createStrategy(strapi));
|
|
5878
|
+
return [localStrategy, ...strategies];
|
|
5879
|
+
};
|
|
5880
|
+
const passport = {
|
|
5881
|
+
getPassportStrategies,
|
|
5882
|
+
...sso$1
|
|
5883
|
+
};
|
|
5884
|
+
const { ApplicationError: ApplicationError$1 } = utils$2.errors;
|
|
5885
|
+
const ssoCheckRolesIdForDeletion = async (ids) => {
|
|
5886
|
+
const adminStore = await strapi.store({ type: "core", name: "admin" });
|
|
5887
|
+
const {
|
|
5888
|
+
providers: { defaultRole }
|
|
5889
|
+
} = await adminStore.get({ key: "auth" });
|
|
5890
|
+
for (const roleId of ids) {
|
|
5891
|
+
if (defaultRole && fp.toString(defaultRole) === fp.toString(roleId)) {
|
|
5892
|
+
throw new ApplicationError$1(
|
|
5893
|
+
"This role is used as the default SSO role. Make sure to change this configuration before deleting the role"
|
|
5894
|
+
);
|
|
5895
|
+
}
|
|
5896
|
+
}
|
|
5897
|
+
};
|
|
5898
|
+
const role$1 = {
|
|
5899
|
+
ssoCheckRolesIdForDeletion
|
|
5900
|
+
};
|
|
5901
|
+
const { ValidationError: ValidationError$1 } = utils$2.errors;
|
|
5902
|
+
const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$1 } = constants$3;
|
|
5903
|
+
const updateEEDisabledUsersList = async (id, input) => {
|
|
5904
|
+
const disabledUsers = await getService("seat-enforcement").getDisabledUserList();
|
|
5905
|
+
if (!disabledUsers) {
|
|
5906
|
+
return;
|
|
5907
|
+
}
|
|
5908
|
+
const user2 = disabledUsers.find((user22) => user22.id === Number(id));
|
|
5909
|
+
if (!user2) {
|
|
5910
|
+
return;
|
|
5911
|
+
}
|
|
5912
|
+
if (user2.isActive !== input.isActive) {
|
|
5913
|
+
const newDisabledUsersList = disabledUsers.filter((user22) => user22.id !== Number(id));
|
|
5914
|
+
await strapi.store.set({
|
|
5915
|
+
type: "ee",
|
|
5916
|
+
key: "disabled_users",
|
|
5917
|
+
value: newDisabledUsersList
|
|
5918
|
+
});
|
|
5919
|
+
}
|
|
5920
|
+
};
|
|
5921
|
+
const castNumberArray = fp.pipe(fp.castArray, fp.map(fp.toNumber));
|
|
5922
|
+
const removeFromEEDisabledUsersList = async (ids) => {
|
|
5923
|
+
let idsToCheck;
|
|
5924
|
+
if (typeof ids === "object") {
|
|
5925
|
+
idsToCheck = castNumberArray(ids);
|
|
5926
|
+
} else {
|
|
5927
|
+
idsToCheck = [Number(ids)];
|
|
5928
|
+
}
|
|
5929
|
+
const disabledUsers = await getService("seat-enforcement").getDisabledUserList();
|
|
5930
|
+
if (!disabledUsers) {
|
|
5931
|
+
return;
|
|
5932
|
+
}
|
|
5933
|
+
const newDisabledUsersList = disabledUsers.filter((user2) => !idsToCheck.includes(user2.id));
|
|
5934
|
+
await strapi.store.set({
|
|
5935
|
+
type: "ee",
|
|
5936
|
+
key: "disabled_users",
|
|
5937
|
+
value: newDisabledUsersList
|
|
5938
|
+
});
|
|
5939
|
+
};
|
|
5940
|
+
const updateById = async (id, attributes) => {
|
|
5941
|
+
if (___namespace.default.has(attributes, "roles")) {
|
|
5942
|
+
const lastAdminUser = await isLastSuperAdminUser(id);
|
|
5943
|
+
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
5944
|
+
const willRemoveSuperAdminRole = !utils$2.arrays.includesString(attributes.roles, superAdminRole.id);
|
|
5945
|
+
if (lastAdminUser && willRemoveSuperAdminRole) {
|
|
5946
|
+
throw new ValidationError$1("You must have at least one user with super admin role.");
|
|
5947
|
+
}
|
|
5948
|
+
}
|
|
5949
|
+
if (attributes.isActive === false) {
|
|
5950
|
+
const lastAdminUser = await isLastSuperAdminUser(id);
|
|
5951
|
+
if (lastAdminUser) {
|
|
5952
|
+
throw new ValidationError$1("You must have at least one user with super admin role.");
|
|
5953
|
+
}
|
|
5954
|
+
}
|
|
5955
|
+
if (___namespace.default.has(attributes, "password")) {
|
|
5956
|
+
const hashedPassword = await getService("auth").hashPassword(attributes.password);
|
|
5957
|
+
const updatedUser2 = await strapi.db.query("admin::user").update({
|
|
5958
|
+
where: { id },
|
|
5959
|
+
data: {
|
|
5960
|
+
...attributes,
|
|
5961
|
+
password: hashedPassword
|
|
5962
|
+
},
|
|
5963
|
+
populate: ["roles"]
|
|
5964
|
+
});
|
|
5965
|
+
strapi.eventHub.emit("user.update", { user: sanitizeUser(updatedUser2) });
|
|
5966
|
+
return updatedUser2;
|
|
5967
|
+
}
|
|
5968
|
+
const updatedUser = await strapi.db.query("admin::user").update({
|
|
5969
|
+
where: { id },
|
|
5970
|
+
data: attributes,
|
|
5971
|
+
populate: ["roles"]
|
|
5972
|
+
});
|
|
5973
|
+
await updateEEDisabledUsersList(id, attributes);
|
|
5974
|
+
if (updatedUser) {
|
|
5975
|
+
strapi.eventHub.emit("user.update", { user: sanitizeUser(updatedUser) });
|
|
5976
|
+
}
|
|
5977
|
+
return updatedUser;
|
|
5978
|
+
};
|
|
5979
|
+
const deleteById = async (id) => {
|
|
5980
|
+
const userToDelete = await strapi.db.query("admin::user").findOne({
|
|
5981
|
+
where: { id },
|
|
5982
|
+
populate: ["roles"]
|
|
5983
|
+
});
|
|
5984
|
+
if (!userToDelete) {
|
|
5985
|
+
return null;
|
|
5986
|
+
}
|
|
5987
|
+
if (userToDelete) {
|
|
5988
|
+
if (userToDelete.roles.some((r) => r.code === SUPER_ADMIN_CODE$1)) {
|
|
5989
|
+
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
5990
|
+
if (superAdminRole.usersCount === 1) {
|
|
5991
|
+
throw new ValidationError$1("You must have at least one user with super admin role.");
|
|
5992
|
+
}
|
|
5993
|
+
}
|
|
5994
|
+
}
|
|
5995
|
+
const deletedUser = await strapi.db.query("admin::user").delete({ where: { id }, populate: ["roles"] });
|
|
5996
|
+
await removeFromEEDisabledUsersList(id);
|
|
5997
|
+
strapi.eventHub.emit("user.delete", { user: sanitizeUser(deletedUser) });
|
|
5998
|
+
return deletedUser;
|
|
5999
|
+
};
|
|
6000
|
+
const deleteByIds = async (ids) => {
|
|
6001
|
+
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
6002
|
+
const nbOfSuperAdminToDelete = await strapi.db.query("admin::user").count({
|
|
6003
|
+
where: {
|
|
6004
|
+
id: ids,
|
|
6005
|
+
roles: { id: superAdminRole.id }
|
|
6006
|
+
}
|
|
6007
|
+
});
|
|
6008
|
+
if (superAdminRole.usersCount === nbOfSuperAdminToDelete) {
|
|
6009
|
+
throw new ValidationError$1("You must have at least one user with super admin role.");
|
|
6010
|
+
}
|
|
6011
|
+
const deletedUsers = [];
|
|
6012
|
+
for (const id of ids) {
|
|
6013
|
+
const deletedUser = await strapi.db.query("admin::user").delete({
|
|
6014
|
+
where: { id },
|
|
6015
|
+
populate: ["roles"]
|
|
6016
|
+
});
|
|
6017
|
+
deletedUsers.push(deletedUser);
|
|
6018
|
+
}
|
|
6019
|
+
await removeFromEEDisabledUsersList(ids);
|
|
6020
|
+
strapi.eventHub.emit("user.delete", {
|
|
6021
|
+
users: deletedUsers.map((deletedUser) => sanitizeUser(deletedUser))
|
|
6022
|
+
});
|
|
6023
|
+
return deletedUsers;
|
|
6024
|
+
};
|
|
6025
|
+
const sanitizeUserRoles = (role2) => ___namespace.default.pick(role2, ["id", "name", "description", "code"]);
|
|
6026
|
+
const isLastSuperAdminUser = async (userId) => {
|
|
6027
|
+
const user2 = await findOne(userId);
|
|
6028
|
+
const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
|
|
6029
|
+
return superAdminRole.usersCount === 1 && hasSuperAdminRole$1(user2);
|
|
6030
|
+
};
|
|
6031
|
+
const sanitizeUser = (user2) => {
|
|
6032
|
+
return {
|
|
6033
|
+
...___namespace.default.omit(user2, ["password", "resetPasswordToken", "registrationToken", "roles"]),
|
|
6034
|
+
roles: user2.roles && user2.roles.map(sanitizeUserRoles)
|
|
6035
|
+
};
|
|
6036
|
+
};
|
|
6037
|
+
const findOne = async (id, populate = ["roles"]) => {
|
|
6038
|
+
return strapi.db.query("admin::user").findOne({ where: { id }, populate });
|
|
6039
|
+
};
|
|
6040
|
+
const getCurrentActiveUserCount = async () => {
|
|
6041
|
+
return strapi.db.query("admin::user").count({ where: { isActive: true } });
|
|
6042
|
+
};
|
|
6043
|
+
const user$1 = {
|
|
6044
|
+
updateEEDisabledUsersList,
|
|
6045
|
+
removeFromEEDisabledUsersList,
|
|
6046
|
+
getCurrentActiveUserCount,
|
|
6047
|
+
deleteByIds,
|
|
6048
|
+
deleteById,
|
|
6049
|
+
updateById
|
|
6050
|
+
};
|
|
6051
|
+
const getSSOProvidersList = async () => {
|
|
6052
|
+
const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
|
|
6053
|
+
return providerRegistry2.getAll().map(({ uid }) => uid);
|
|
6054
|
+
};
|
|
6055
|
+
const sendUpdateProjectInformation = async (strapi2) => {
|
|
6056
|
+
let groupProperties = {};
|
|
6057
|
+
const numberOfActiveAdminUsers = await getService("user").count({ isActive: true });
|
|
6058
|
+
const numberOfAdminUsers = await getService("user").count();
|
|
6059
|
+
if (strapi2.ee.features.isEnabled("sso")) {
|
|
6060
|
+
const SSOProviders = await getSSOProvidersList();
|
|
6061
|
+
groupProperties = fp.assign(groupProperties, {
|
|
6062
|
+
SSOProviders,
|
|
6063
|
+
isSSOConfigured: SSOProviders.length !== 0
|
|
6064
|
+
});
|
|
6065
|
+
}
|
|
6066
|
+
if (strapi2.ee.features.isEnabled("cms-content-releases")) {
|
|
6067
|
+
const numberOfContentReleases = await strapi2.db.query("plugin::content-releases.release").count();
|
|
6068
|
+
const numberOfPublishedContentReleases = await strapi2.db.query("plugin::content-releases.release").count({
|
|
6069
|
+
filters: { releasedAt: { $notNull: true } }
|
|
6070
|
+
});
|
|
6071
|
+
groupProperties = fp.assign(groupProperties, {
|
|
6072
|
+
numberOfContentReleases,
|
|
6073
|
+
numberOfPublishedContentReleases
|
|
6074
|
+
});
|
|
6075
|
+
}
|
|
6076
|
+
groupProperties = fp.assign(groupProperties, { numberOfActiveAdminUsers, numberOfAdminUsers });
|
|
6077
|
+
strapi2.telemetry.send("didUpdateProjectInformation", {
|
|
6078
|
+
groupProperties
|
|
6079
|
+
});
|
|
6080
|
+
};
|
|
6081
|
+
const startCron = (strapi2) => {
|
|
6082
|
+
strapi2.cron.add({
|
|
6083
|
+
"0 0 0 * * *": () => sendUpdateProjectInformation(strapi2)
|
|
6084
|
+
});
|
|
6085
|
+
};
|
|
6086
|
+
const metrics = { startCron, getSSOProvidersList, sendUpdateProjectInformation };
|
|
6087
|
+
const { SUPER_ADMIN_CODE } = constants$3;
|
|
6088
|
+
const getDisabledUserList = async () => {
|
|
6089
|
+
return strapi.store.get({ type: "ee", key: "disabled_users" });
|
|
6090
|
+
};
|
|
6091
|
+
const enableMaximumUserCount = async (numberOfUsersToEnable) => {
|
|
6092
|
+
const disabledUsers = await getDisabledUserList();
|
|
6093
|
+
const orderedDisabledUsers = fp.reverse(disabledUsers);
|
|
6094
|
+
const usersToEnable = fp.take(numberOfUsersToEnable, orderedDisabledUsers);
|
|
6095
|
+
await strapi.db.query("admin::user").updateMany({
|
|
6096
|
+
where: { id: fp.map(fp.prop("id"), usersToEnable) },
|
|
6097
|
+
data: { isActive: true }
|
|
6098
|
+
});
|
|
6099
|
+
const remainingDisabledUsers = fp.drop(numberOfUsersToEnable, orderedDisabledUsers);
|
|
6100
|
+
await strapi.store.set({
|
|
6101
|
+
type: "ee",
|
|
6102
|
+
key: "disabled_users",
|
|
6103
|
+
value: remainingDisabledUsers
|
|
6104
|
+
});
|
|
6105
|
+
};
|
|
6106
|
+
const disableUsersAboveLicenseLimit = async (numberOfUsersToDisable) => {
|
|
6107
|
+
const currentlyDisabledUsers = await getDisabledUserList() ?? [];
|
|
6108
|
+
const usersToDisable = [];
|
|
6109
|
+
const nonSuperAdminUsersToDisable = await strapi.db.query("admin::user").findMany({
|
|
6110
|
+
where: {
|
|
6111
|
+
isActive: true,
|
|
6112
|
+
roles: {
|
|
6113
|
+
code: { $ne: SUPER_ADMIN_CODE }
|
|
6114
|
+
}
|
|
6115
|
+
},
|
|
6116
|
+
orderBy: { createdAt: "DESC" },
|
|
6117
|
+
limit: numberOfUsersToDisable
|
|
6118
|
+
});
|
|
6119
|
+
usersToDisable.push(...nonSuperAdminUsersToDisable);
|
|
6120
|
+
if (nonSuperAdminUsersToDisable.length < numberOfUsersToDisable) {
|
|
6121
|
+
const superAdminUsersToDisable = await strapi.db.query("admin::user").findMany({
|
|
6122
|
+
where: {
|
|
6123
|
+
isActive: true,
|
|
6124
|
+
roles: { code: SUPER_ADMIN_CODE }
|
|
6125
|
+
},
|
|
6126
|
+
orderBy: { createdAt: "DESC" },
|
|
6127
|
+
limit: numberOfUsersToDisable - nonSuperAdminUsersToDisable.length
|
|
6128
|
+
});
|
|
6129
|
+
usersToDisable.push(...superAdminUsersToDisable);
|
|
6130
|
+
}
|
|
6131
|
+
await strapi.db.query("admin::user").updateMany({
|
|
6132
|
+
where: { id: fp.map(fp.prop("id"), usersToDisable) },
|
|
6133
|
+
data: { isActive: false }
|
|
6134
|
+
});
|
|
6135
|
+
await strapi.store.set({
|
|
6136
|
+
type: "ee",
|
|
6137
|
+
key: "disabled_users",
|
|
6138
|
+
value: currentlyDisabledUsers.concat(fp.map(fp.pick(["id", "isActive"]), usersToDisable))
|
|
6139
|
+
});
|
|
6140
|
+
};
|
|
6141
|
+
const syncDisabledUserRecords = async () => {
|
|
6142
|
+
const disabledUsers = await strapi.store.get({ type: "ee", key: "disabled_users" });
|
|
6143
|
+
if (!disabledUsers) {
|
|
6144
|
+
return;
|
|
6145
|
+
}
|
|
6146
|
+
await strapi.db.query("admin::user").updateMany({
|
|
6147
|
+
where: { id: fp.map(fp.prop("id"), disabledUsers) },
|
|
6148
|
+
data: { isActive: false }
|
|
6149
|
+
});
|
|
6150
|
+
};
|
|
6151
|
+
const seatEnforcementWorkflow = async () => {
|
|
6152
|
+
const adminSeats = strapi.ee.seats;
|
|
6153
|
+
if (fp.isNil(adminSeats)) {
|
|
6154
|
+
return;
|
|
6155
|
+
}
|
|
6156
|
+
await syncDisabledUserRecords();
|
|
6157
|
+
const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
|
|
6158
|
+
const adminSeatsLeft = adminSeats - currentActiveUserCount;
|
|
6159
|
+
if (adminSeatsLeft > 0) {
|
|
6160
|
+
await enableMaximumUserCount(adminSeatsLeft);
|
|
6161
|
+
} else if (adminSeatsLeft < 0) {
|
|
6162
|
+
await disableUsersAboveLicenseLimit(-adminSeatsLeft);
|
|
6163
|
+
}
|
|
6164
|
+
};
|
|
6165
|
+
const seatEnforcement = {
|
|
6166
|
+
seatEnforcementWorkflow,
|
|
6167
|
+
getDisabledUserList
|
|
6168
|
+
};
|
|
6169
|
+
const services = {
|
|
6170
|
+
auth,
|
|
6171
|
+
passport,
|
|
6172
|
+
role: role$1,
|
|
6173
|
+
user: user$1,
|
|
6174
|
+
metrics,
|
|
6175
|
+
"seat-enforcement": seatEnforcement
|
|
6176
|
+
};
|
|
6177
|
+
const providerOptionsUpdateSchema = utils$2.yup.object().shape({
|
|
6178
|
+
autoRegister: utils$2.yup.boolean().required(),
|
|
6179
|
+
defaultRole: utils$2.yup.strapiID().when("autoRegister", (value, initSchema) => {
|
|
6180
|
+
return value ? initSchema.required() : initSchema.nullable();
|
|
6181
|
+
}).test("is-valid-role", "You must submit a valid default role", (roleId) => {
|
|
6182
|
+
if (roleId === null) {
|
|
6183
|
+
return true;
|
|
6184
|
+
}
|
|
6185
|
+
return strapi.service("admin::role").exists({ id: roleId });
|
|
6186
|
+
}),
|
|
6187
|
+
ssoLockedRoles: utils$2.yup.array().nullable().of(
|
|
6188
|
+
utils$2.yup.strapiID().test(
|
|
6189
|
+
"is-valid-role",
|
|
6190
|
+
"You must submit a valid role for the SSO Locked roles",
|
|
6191
|
+
(roleId) => {
|
|
6192
|
+
return strapi.service("admin::role").exists({ id: roleId });
|
|
6193
|
+
}
|
|
6194
|
+
)
|
|
6195
|
+
)
|
|
6196
|
+
});
|
|
6197
|
+
const validateProviderOptionsUpdate = utils$2.validateYupSchema(providerOptionsUpdateSchema);
|
|
6198
|
+
const PROVIDER_REDIRECT_BASE = "/auth/login";
|
|
6199
|
+
const PROVIDER_REDIRECT_SUCCESS = `${PROVIDER_REDIRECT_BASE}/success`;
|
|
6200
|
+
const PROVIDER_REDIRECT_ERROR = `${PROVIDER_REDIRECT_BASE}/error`;
|
|
6201
|
+
const PROVIDER_URLS_MAP = {
|
|
6202
|
+
success: PROVIDER_REDIRECT_SUCCESS,
|
|
6203
|
+
error: PROVIDER_REDIRECT_ERROR
|
|
6204
|
+
};
|
|
6205
|
+
const getAdminStore = async () => strapi.store({ type: "core", name: "admin" });
|
|
6206
|
+
const getPrefixedRedirectUrls = () => {
|
|
6207
|
+
const { url: adminUrl } = strapi.config.get("admin");
|
|
6208
|
+
const prefixUrl = (url) => `${adminUrl || "/admin"}${url}`;
|
|
6209
|
+
return fp.mapValues(prefixUrl, PROVIDER_URLS_MAP);
|
|
6210
|
+
};
|
|
6211
|
+
const utils = {
|
|
6212
|
+
getAdminStore,
|
|
6213
|
+
getPrefixedRedirectUrls
|
|
6214
|
+
};
|
|
6215
|
+
const defaultConnectionError = () => new Error("Invalid connection payload");
|
|
6216
|
+
const authenticate = async (ctx, next) => {
|
|
6217
|
+
const {
|
|
6218
|
+
params: { provider }
|
|
6219
|
+
} = ctx;
|
|
6220
|
+
const redirectUrls = utils.getPrefixedRedirectUrls();
|
|
6221
|
+
return passport__default.default.authenticate(provider, null, async (error, profile) => {
|
|
6222
|
+
if (error || !profile || !profile.email) {
|
|
6223
|
+
if (error) {
|
|
6224
|
+
strapi.log.error(error);
|
|
6225
|
+
}
|
|
6226
|
+
strapi.eventHub.emit("admin.auth.error", {
|
|
6227
|
+
error: error || defaultConnectionError(),
|
|
6228
|
+
provider
|
|
6229
|
+
});
|
|
6230
|
+
return ctx.redirect(redirectUrls.error);
|
|
6231
|
+
}
|
|
6232
|
+
const user2 = await getService("user").findOneByEmail(profile.email);
|
|
6233
|
+
const scenario = user2 ? existingUserScenario : nonExistingUserScenario;
|
|
6234
|
+
return scenario(ctx, next)(user2 || profile, provider);
|
|
6235
|
+
})(ctx, next);
|
|
6236
|
+
};
|
|
6237
|
+
const existingUserScenario = (ctx, next) => async (user2, provider) => {
|
|
6238
|
+
const redirectUrls = utils.getPrefixedRedirectUrls();
|
|
6239
|
+
if (!user2.isActive) {
|
|
6240
|
+
strapi.eventHub.emit("admin.auth.error", {
|
|
6241
|
+
error: new Error(`Deactivated user tried to login (${user2.id})`),
|
|
6242
|
+
provider
|
|
6243
|
+
});
|
|
6244
|
+
return ctx.redirect(redirectUrls.error);
|
|
6245
|
+
}
|
|
6246
|
+
ctx.state.user = user2;
|
|
6247
|
+
return next();
|
|
6248
|
+
};
|
|
6249
|
+
const nonExistingUserScenario = (ctx, next) => async (profile, provider) => {
|
|
6250
|
+
const { email: email2, firstname: firstname2, lastname: lastname2, username: username2 } = profile;
|
|
6251
|
+
const redirectUrls = utils.getPrefixedRedirectUrls();
|
|
6252
|
+
const adminStore = await utils.getAdminStore();
|
|
6253
|
+
const { providers: providers2 } = await adminStore.get({ key: "auth" });
|
|
6254
|
+
const isMissingRegisterFields = !username2 && (!firstname2 || !lastname2);
|
|
6255
|
+
if (!providers2.autoRegister || !providers2.defaultRole || isMissingRegisterFields) {
|
|
6256
|
+
strapi.eventHub.emit("admin.auth.error", { error: defaultConnectionError(), provider });
|
|
6257
|
+
return ctx.redirect(redirectUrls.error);
|
|
6258
|
+
}
|
|
6259
|
+
const defaultRole = await getService("role").findOne({ id: providers2.defaultRole });
|
|
6260
|
+
if (!defaultRole) {
|
|
6261
|
+
strapi.eventHub.emit("admin.auth.error", { error: defaultConnectionError(), provider });
|
|
6262
|
+
return ctx.redirect(redirectUrls.error);
|
|
6263
|
+
}
|
|
6264
|
+
ctx.state.user = await getService("user").create({
|
|
6265
|
+
email: email2,
|
|
6266
|
+
username: username2,
|
|
6267
|
+
firstname: firstname2,
|
|
6268
|
+
lastname: lastname2,
|
|
6269
|
+
roles: [defaultRole.id],
|
|
6270
|
+
isActive: true,
|
|
6271
|
+
registrationToken: null
|
|
6272
|
+
});
|
|
6273
|
+
strapi.eventHub.emit("admin.auth.autoRegistration", {
|
|
6274
|
+
user: ctx.state.user,
|
|
6275
|
+
provider
|
|
6276
|
+
});
|
|
6277
|
+
return next();
|
|
6278
|
+
};
|
|
6279
|
+
const redirectWithAuth = (ctx) => {
|
|
6280
|
+
const {
|
|
6281
|
+
params: { provider }
|
|
6282
|
+
} = ctx;
|
|
6283
|
+
const redirectUrls = utils.getPrefixedRedirectUrls();
|
|
6284
|
+
const domain2 = strapi.config.get("admin.auth.domain");
|
|
6285
|
+
const { user: user2 } = ctx.state;
|
|
6286
|
+
const jwt2 = getService("token").createJwtToken(user2);
|
|
6287
|
+
const isProduction = strapi.config.get("environment") === "production";
|
|
6288
|
+
const cookiesOptions = { httpOnly: false, secure: isProduction, overwrite: true, domain: domain2 };
|
|
6289
|
+
const sanitizedUser = getService("user").sanitizeUser(user2);
|
|
6290
|
+
strapi.eventHub.emit("admin.auth.success", { user: sanitizedUser, provider });
|
|
6291
|
+
ctx.cookies.set("jwtToken", jwt2, cookiesOptions);
|
|
6292
|
+
ctx.redirect(redirectUrls.success);
|
|
6293
|
+
};
|
|
6294
|
+
const middlewares = {
|
|
6295
|
+
authenticate,
|
|
6296
|
+
redirectWithAuth
|
|
6297
|
+
};
|
|
6298
|
+
const toProviderDTO = fp.pick(["uid", "displayName", "icon"]);
|
|
6299
|
+
const toProviderLoginOptionsDTO = fp.pick(["autoRegister", "defaultRole", "ssoLockedRoles"]);
|
|
6300
|
+
const { ValidationError } = utils$2.errors;
|
|
6301
|
+
const providerAuthenticationFlow = compose__default.default([
|
|
6302
|
+
middlewares.authenticate,
|
|
6303
|
+
middlewares.redirectWithAuth
|
|
6304
|
+
]);
|
|
6305
|
+
const authentication = {
|
|
6306
|
+
async getProviders(ctx) {
|
|
6307
|
+
const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
|
|
6308
|
+
ctx.body = providerRegistry2.getAll().map(toProviderDTO);
|
|
6309
|
+
},
|
|
6310
|
+
async getProviderLoginOptions(ctx) {
|
|
6311
|
+
const adminStore = await utils.getAdminStore();
|
|
6312
|
+
const { providers: providersOptions } = await adminStore.get({ key: "auth" });
|
|
6313
|
+
ctx.body = {
|
|
6314
|
+
data: toProviderLoginOptionsDTO(providersOptions)
|
|
6315
|
+
};
|
|
6316
|
+
},
|
|
6317
|
+
async updateProviderLoginOptions(ctx) {
|
|
6318
|
+
const {
|
|
6319
|
+
request: { body }
|
|
6320
|
+
} = ctx;
|
|
6321
|
+
await validateProviderOptionsUpdate(body);
|
|
6322
|
+
const adminStore = await utils.getAdminStore();
|
|
6323
|
+
const currentAuthOptions = await adminStore.get({ key: "auth" });
|
|
6324
|
+
const newAuthOptions = { ...currentAuthOptions, providers: body };
|
|
6325
|
+
await adminStore.set({ key: "auth", value: newAuthOptions });
|
|
6326
|
+
strapi.telemetry.send("didUpdateSSOSettings");
|
|
6327
|
+
ctx.body = {
|
|
6328
|
+
data: toProviderLoginOptionsDTO(newAuthOptions.providers)
|
|
6329
|
+
};
|
|
6330
|
+
},
|
|
6331
|
+
providerLogin(ctx, next) {
|
|
6332
|
+
const {
|
|
6333
|
+
params: { provider: providerName }
|
|
6334
|
+
} = ctx;
|
|
6335
|
+
const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
|
|
6336
|
+
if (!providerRegistry2.has(providerName)) {
|
|
6337
|
+
throw new ValidationError(`Invalid provider supplied: ${providerName}`);
|
|
6338
|
+
}
|
|
6339
|
+
return providerAuthenticationFlow(ctx, next);
|
|
6340
|
+
}
|
|
6341
|
+
};
|
|
6342
|
+
const roleCreateSchema = utils$2.yup.object().shape({
|
|
6343
|
+
name: utils$2.yup.string().min(1).required(),
|
|
6344
|
+
description: utils$2.yup.string().nullable()
|
|
6345
|
+
}).noUnknown();
|
|
6346
|
+
const rolesDeleteSchema = utils$2.yup.object().shape({
|
|
6347
|
+
ids: utils$2.yup.array().of(utils$2.yup.strapiID()).min(1).required().test(
|
|
6348
|
+
"roles-deletion-checks",
|
|
6349
|
+
"Roles deletion checks have failed",
|
|
6350
|
+
async function rolesDeletionChecks(ids) {
|
|
6351
|
+
try {
|
|
6352
|
+
await strapi.service("admin::role").checkRolesIdForDeletion(ids);
|
|
6353
|
+
if (strapi.ee.features.isEnabled("sso")) {
|
|
6354
|
+
await strapi.service("admin::role").ssoCheckRolesIdForDeletion(ids);
|
|
6355
|
+
}
|
|
6356
|
+
} catch (e) {
|
|
6357
|
+
return this.createError({ path: "ids", message: e.message });
|
|
6358
|
+
}
|
|
6359
|
+
return true;
|
|
6360
|
+
}
|
|
6361
|
+
)
|
|
6362
|
+
}).noUnknown();
|
|
6363
|
+
const roleDeleteSchema = utils$2.yup.strapiID().required().test(
|
|
6364
|
+
"no-admin-single-delete",
|
|
6365
|
+
"Role deletion checks have failed",
|
|
6366
|
+
async function noAdminSingleDelete(id) {
|
|
6367
|
+
try {
|
|
6368
|
+
await strapi.service("admin::role").checkRolesIdForDeletion([id]);
|
|
6369
|
+
if (strapi.ee.features.isEnabled("sso")) {
|
|
6370
|
+
await strapi.service("admin::role").ssoCheckRolesIdForDeletion([id]);
|
|
6371
|
+
}
|
|
6372
|
+
} catch (e) {
|
|
6373
|
+
return this.createError({ path: "id", message: e.message });
|
|
6374
|
+
}
|
|
6375
|
+
return true;
|
|
6376
|
+
}
|
|
6377
|
+
);
|
|
6378
|
+
const validateRoleCreateInput = utils$2.validateYupSchema(roleCreateSchema);
|
|
6379
|
+
const validateRolesDeleteInput = utils$2.validateYupSchema(rolesDeleteSchema);
|
|
6380
|
+
const validateRoleDeleteInput = utils$2.validateYupSchema(roleDeleteSchema);
|
|
6381
|
+
const role = {
|
|
6382
|
+
/**
|
|
6383
|
+
* Create a new role
|
|
6384
|
+
* @param {KoaContext} ctx - koa context
|
|
6385
|
+
*/
|
|
6386
|
+
async create(ctx) {
|
|
6387
|
+
await validateRoleCreateInput(ctx.request.body);
|
|
6388
|
+
const roleService = getService("role");
|
|
6389
|
+
const role2 = await roleService.create(ctx.request.body);
|
|
6390
|
+
const sanitizedRole = roleService.sanitizeRole(role2);
|
|
6391
|
+
ctx.created({ data: sanitizedRole });
|
|
6392
|
+
},
|
|
6393
|
+
/**
|
|
6394
|
+
* Delete a role
|
|
6395
|
+
* @param {KoaContext} ctx - koa context
|
|
6396
|
+
*/
|
|
6397
|
+
async deleteOne(ctx) {
|
|
6398
|
+
const { id } = ctx.params;
|
|
6399
|
+
await validateRoleDeleteInput(id);
|
|
6400
|
+
const roleService = getService("role");
|
|
6401
|
+
const roles2 = await roleService.deleteByIds([id]);
|
|
6402
|
+
const sanitizedRole = roles2.map((role2) => roleService.sanitizeRole(role2))[0] || null;
|
|
6403
|
+
return ctx.deleted({
|
|
6404
|
+
data: sanitizedRole
|
|
6405
|
+
});
|
|
6406
|
+
},
|
|
6407
|
+
/**
|
|
6408
|
+
* delete several roles
|
|
6409
|
+
* @param {KoaContext} ctx - koa context
|
|
6410
|
+
*/
|
|
6411
|
+
async deleteMany(ctx) {
|
|
6412
|
+
const { body } = ctx.request;
|
|
6413
|
+
await validateRolesDeleteInput(body);
|
|
6414
|
+
const roleService = getService("role");
|
|
6415
|
+
const roles2 = await roleService.deleteByIds(body.ids);
|
|
6416
|
+
const sanitizedRoles = roles2.map(roleService.sanitizeRole);
|
|
6417
|
+
return ctx.deleted({
|
|
6418
|
+
data: sanitizedRoles
|
|
6419
|
+
});
|
|
6420
|
+
}
|
|
6421
|
+
};
|
|
6422
|
+
const ssoUserCreationInputExtension = utils$2.yup.object().shape({
|
|
6423
|
+
useSSORegistration: utils$2.yup.boolean()
|
|
6424
|
+
}).noUnknown();
|
|
6425
|
+
const validateUserCreationInput = (data) => {
|
|
6426
|
+
let schema = schemas.userCreationSchema;
|
|
6427
|
+
if (strapi.ee.features.isEnabled("sso")) {
|
|
6428
|
+
schema = schema.concat(ssoUserCreationInputExtension);
|
|
6429
|
+
}
|
|
6430
|
+
return utils$2.validateYupSchema(schema)(data);
|
|
6431
|
+
};
|
|
6432
|
+
const { ApplicationError, ForbiddenError } = utils$2.errors;
|
|
6433
|
+
const pickUserCreationAttributes = fp.pick(["firstname", "lastname", "email", "roles"]);
|
|
6434
|
+
const hasAdminSeatsAvaialble = async () => {
|
|
6435
|
+
if (!strapi.EE) {
|
|
6436
|
+
return true;
|
|
6437
|
+
}
|
|
6438
|
+
const permittedSeats = strapi.ee.seats;
|
|
6439
|
+
if (fp.isNil(permittedSeats)) {
|
|
6440
|
+
return true;
|
|
6441
|
+
}
|
|
6442
|
+
const userCount = await strapi.service("admin::user").getCurrentActiveUserCount();
|
|
6443
|
+
if (userCount < permittedSeats) {
|
|
6444
|
+
return true;
|
|
6445
|
+
}
|
|
6446
|
+
};
|
|
6447
|
+
const user = {
|
|
6448
|
+
async create(ctx) {
|
|
6449
|
+
if (!await hasAdminSeatsAvaialble()) {
|
|
6450
|
+
throw new ForbiddenError("License seat limit reached. You cannot create a new user");
|
|
6451
|
+
}
|
|
6452
|
+
const { body } = ctx.request;
|
|
6453
|
+
const cleanData = { ...body, email: ___namespace.default.get(body, `email`, ``).toLowerCase() };
|
|
6454
|
+
await validateUserCreationInput(cleanData);
|
|
6455
|
+
const attributes = pickUserCreationAttributes(cleanData);
|
|
6456
|
+
const { useSSORegistration } = cleanData;
|
|
6457
|
+
const userAlreadyExists = await getService("user").exists({ email: attributes.email });
|
|
6458
|
+
if (userAlreadyExists) {
|
|
6459
|
+
throw new ApplicationError("Email already taken");
|
|
6460
|
+
}
|
|
6461
|
+
if (useSSORegistration) {
|
|
6462
|
+
Object.assign(attributes, { registrationToken: null, isActive: true });
|
|
6463
|
+
}
|
|
6464
|
+
const createdUser = await getService("user").create(attributes);
|
|
6465
|
+
const userInfo = getService("user").sanitizeUser(createdUser);
|
|
6466
|
+
Object.assign(userInfo, { registrationToken: createdUser.registrationToken });
|
|
6467
|
+
ctx.created({ data: userInfo });
|
|
6468
|
+
},
|
|
6469
|
+
async update(ctx) {
|
|
6470
|
+
const { id } = ctx.params;
|
|
6471
|
+
const { body: input } = ctx.request;
|
|
6472
|
+
await validateUserUpdateInput(input);
|
|
6473
|
+
if (___namespace.default.has(input, "email")) {
|
|
6474
|
+
const uniqueEmailCheck = await getService("user").exists({
|
|
6475
|
+
id: { $ne: id },
|
|
6476
|
+
email: input.email
|
|
6477
|
+
});
|
|
6478
|
+
if (uniqueEmailCheck) {
|
|
6479
|
+
throw new ApplicationError("A user with this email address already exists");
|
|
6480
|
+
}
|
|
6481
|
+
}
|
|
6482
|
+
const user2 = await getService("user").findOne(id, null);
|
|
6483
|
+
if (!await hasAdminSeatsAvaialble() && !user2.isActive && input.isActive) {
|
|
6484
|
+
throw new ForbiddenError("License seat limit reached. You cannot active this user");
|
|
6485
|
+
}
|
|
6486
|
+
const updatedUser = await getService("user").updateById(id, input);
|
|
6487
|
+
if (!updatedUser) {
|
|
6488
|
+
return ctx.notFound("User does not exist");
|
|
6489
|
+
}
|
|
6490
|
+
ctx.body = {
|
|
6491
|
+
data: getService("user").sanitizeUser(updatedUser)
|
|
6492
|
+
};
|
|
6493
|
+
},
|
|
6494
|
+
async isSSOLocked(ctx) {
|
|
6495
|
+
const { user: user2 } = ctx.state;
|
|
6496
|
+
const isSSOLocked = await isSsoLocked(user2);
|
|
6497
|
+
ctx.body = {
|
|
6498
|
+
data: {
|
|
6499
|
+
isSSOLocked
|
|
6500
|
+
}
|
|
6501
|
+
};
|
|
6502
|
+
}
|
|
6503
|
+
};
|
|
6504
|
+
const admin$2 = {
|
|
6505
|
+
// NOTE: Overrides CE admin controller
|
|
6506
|
+
async getProjectType() {
|
|
6507
|
+
const flags = strapi.config.get("admin.flags", {});
|
|
6508
|
+
try {
|
|
6509
|
+
return { data: { isEE: strapi.EE, features: strapi.ee.features.list(), flags } };
|
|
6510
|
+
} catch (err) {
|
|
6511
|
+
return { data: { isEE: false, features: [], flags } };
|
|
6512
|
+
}
|
|
6513
|
+
},
|
|
6514
|
+
async licenseLimitInformation() {
|
|
6515
|
+
const permittedSeats = strapi.ee.seats;
|
|
6516
|
+
let shouldNotify = false;
|
|
6517
|
+
let licenseLimitStatus = null;
|
|
6518
|
+
let enforcementUserCount;
|
|
6519
|
+
const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
|
|
6520
|
+
const eeDisabledUsers = await getService("seat-enforcement").getDisabledUserList();
|
|
6521
|
+
if (eeDisabledUsers) {
|
|
6522
|
+
enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;
|
|
6523
|
+
} else {
|
|
6524
|
+
enforcementUserCount = currentActiveUserCount;
|
|
6525
|
+
}
|
|
6526
|
+
if (!fp.isNil(permittedSeats) && enforcementUserCount > permittedSeats) {
|
|
6527
|
+
shouldNotify = true;
|
|
6528
|
+
licenseLimitStatus = "OVER_LIMIT";
|
|
6529
|
+
}
|
|
6530
|
+
if (!fp.isNil(permittedSeats) && enforcementUserCount === permittedSeats) {
|
|
6531
|
+
shouldNotify = true;
|
|
6532
|
+
licenseLimitStatus = "AT_LIMIT";
|
|
6533
|
+
}
|
|
6534
|
+
const data = {
|
|
6535
|
+
enforcementUserCount,
|
|
6536
|
+
currentActiveUserCount,
|
|
6537
|
+
permittedSeats,
|
|
6538
|
+
shouldNotify,
|
|
6539
|
+
shouldStopCreate: fp.isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,
|
|
6540
|
+
licenseLimitStatus,
|
|
6541
|
+
isHostedOnStrapiCloud: utils$2.env("STRAPI_HOSTING", null) === "strapi.cloud",
|
|
6542
|
+
features: strapi.ee.features.list() ?? []
|
|
6543
|
+
};
|
|
6544
|
+
return { data };
|
|
6545
|
+
}
|
|
6546
|
+
};
|
|
6547
|
+
const controllers = {
|
|
6548
|
+
authentication,
|
|
6549
|
+
role,
|
|
6550
|
+
user,
|
|
6551
|
+
admin: admin$2
|
|
6552
|
+
};
|
|
6553
|
+
const enableFeatureMiddleware = (featureName) => (ctx, next) => {
|
|
6554
|
+
if (strapi.ee.features.isEnabled(featureName)) {
|
|
6555
|
+
return next();
|
|
6556
|
+
}
|
|
6557
|
+
ctx.status = 404;
|
|
6558
|
+
};
|
|
6559
|
+
const sso = {
|
|
6560
|
+
type: "admin",
|
|
6561
|
+
routes: [
|
|
6562
|
+
{
|
|
6563
|
+
method: "GET",
|
|
6564
|
+
path: "/providers",
|
|
6565
|
+
handler: "authentication.getProviders",
|
|
6566
|
+
config: {
|
|
6567
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6568
|
+
auth: false
|
|
6569
|
+
}
|
|
6570
|
+
},
|
|
6571
|
+
{
|
|
6572
|
+
method: "GET",
|
|
6573
|
+
path: "/connect/:provider",
|
|
6574
|
+
handler: "authentication.providerLogin",
|
|
6575
|
+
config: {
|
|
6576
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6577
|
+
auth: false
|
|
6578
|
+
}
|
|
6579
|
+
},
|
|
6580
|
+
{
|
|
6581
|
+
method: "POST",
|
|
6582
|
+
path: "/connect/:provider",
|
|
6583
|
+
handler: "authentication.providerLogin",
|
|
6584
|
+
config: {
|
|
6585
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6586
|
+
auth: false
|
|
6587
|
+
}
|
|
6588
|
+
},
|
|
6589
|
+
{
|
|
6590
|
+
method: "GET",
|
|
6591
|
+
path: "/providers/options",
|
|
6592
|
+
handler: "authentication.getProviderLoginOptions",
|
|
6593
|
+
config: {
|
|
6594
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6595
|
+
policies: [
|
|
6596
|
+
"admin::isAuthenticatedAdmin",
|
|
6597
|
+
{ name: "admin::hasPermissions", config: { actions: ["admin::provider-login.read"] } }
|
|
6598
|
+
]
|
|
6599
|
+
}
|
|
6600
|
+
},
|
|
6601
|
+
{
|
|
6602
|
+
method: "PUT",
|
|
6603
|
+
path: "/providers/options",
|
|
6604
|
+
handler: "authentication.updateProviderLoginOptions",
|
|
6605
|
+
config: {
|
|
6606
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6607
|
+
policies: [
|
|
6608
|
+
"admin::isAuthenticatedAdmin",
|
|
6609
|
+
{ name: "admin::hasPermissions", config: { actions: ["admin::provider-login.update"] } }
|
|
6610
|
+
]
|
|
6611
|
+
}
|
|
6612
|
+
},
|
|
6613
|
+
{
|
|
6614
|
+
method: "GET",
|
|
6615
|
+
path: "/providers/isSSOLocked",
|
|
6616
|
+
handler: "user.isSSOLocked",
|
|
6617
|
+
config: {
|
|
6618
|
+
middlewares: [enableFeatureMiddleware("sso")],
|
|
6619
|
+
policies: ["admin::isAuthenticatedAdmin"]
|
|
6620
|
+
}
|
|
6621
|
+
}
|
|
6622
|
+
]
|
|
6623
|
+
};
|
|
6624
|
+
const licenseLimit = {
|
|
6625
|
+
type: "admin",
|
|
6626
|
+
routes: [
|
|
6627
|
+
// License limit infos
|
|
6628
|
+
{
|
|
6629
|
+
method: "GET",
|
|
6630
|
+
path: "/license-limit-information",
|
|
6631
|
+
handler: "admin.licenseLimitInformation",
|
|
6632
|
+
config: {
|
|
6633
|
+
policies: [
|
|
6634
|
+
"admin::isAuthenticatedAdmin",
|
|
6635
|
+
{
|
|
6636
|
+
name: "admin::hasPermissions",
|
|
6637
|
+
config: {
|
|
6638
|
+
actions: [
|
|
6639
|
+
"admin::users.create",
|
|
6640
|
+
"admin::users.read",
|
|
6641
|
+
"admin::users.update",
|
|
6642
|
+
"admin::users.delete"
|
|
6643
|
+
]
|
|
6644
|
+
}
|
|
6645
|
+
}
|
|
6646
|
+
]
|
|
6647
|
+
}
|
|
6648
|
+
}
|
|
6649
|
+
]
|
|
6650
|
+
};
|
|
6651
|
+
const routes = {
|
|
6652
|
+
sso,
|
|
6653
|
+
"license-limit": licenseLimit
|
|
6654
|
+
};
|
|
6655
|
+
const auditLogsRoutes = {
|
|
6656
|
+
type: "admin",
|
|
6657
|
+
routes: [
|
|
6658
|
+
{
|
|
6659
|
+
method: "GET",
|
|
6660
|
+
path: "/audit-logs",
|
|
6661
|
+
handler: "audit-logs.findMany",
|
|
6662
|
+
config: {
|
|
6663
|
+
middlewares: [enableFeatureMiddleware("audit-logs")],
|
|
6664
|
+
policies: [
|
|
6665
|
+
"admin::isAuthenticatedAdmin",
|
|
6666
|
+
{
|
|
6667
|
+
name: "admin::hasPermissions",
|
|
6668
|
+
config: {
|
|
6669
|
+
actions: ["admin::audit-logs.read"]
|
|
6670
|
+
}
|
|
6671
|
+
}
|
|
6672
|
+
]
|
|
6673
|
+
}
|
|
6674
|
+
},
|
|
6675
|
+
{
|
|
6676
|
+
method: "GET",
|
|
6677
|
+
path: "/audit-logs/:id",
|
|
6678
|
+
handler: "audit-logs.findOne",
|
|
6679
|
+
config: {
|
|
6680
|
+
middlewares: [enableFeatureMiddleware("audit-logs")],
|
|
6681
|
+
policies: [
|
|
6682
|
+
"admin::isAuthenticatedAdmin",
|
|
6683
|
+
{
|
|
6684
|
+
name: "admin::hasPermissions",
|
|
6685
|
+
config: {
|
|
6686
|
+
actions: ["admin::audit-logs.read"]
|
|
6687
|
+
}
|
|
6688
|
+
}
|
|
6689
|
+
]
|
|
6690
|
+
}
|
|
6691
|
+
}
|
|
6692
|
+
]
|
|
6693
|
+
};
|
|
6694
|
+
const ALLOWED_SORT_STRINGS = ["action:ASC", "action:DESC", "date:ASC", "date:DESC"];
|
|
6695
|
+
const validateFindManySchema = utils$2.yup.object().shape({
|
|
6696
|
+
page: utils$2.yup.number().integer().min(1),
|
|
6697
|
+
pageSize: utils$2.yup.number().integer().min(1).max(100),
|
|
6698
|
+
sort: utils$2.yup.mixed().oneOf(ALLOWED_SORT_STRINGS)
|
|
6699
|
+
}).required();
|
|
6700
|
+
const validateFindMany = utils$2.validateYupSchema(validateFindManySchema, { strict: false });
|
|
6701
|
+
const auditLogsController = {
|
|
6702
|
+
async findMany(ctx) {
|
|
6703
|
+
const { query } = ctx.request;
|
|
6704
|
+
await validateFindMany(query);
|
|
6705
|
+
const auditLogs = strapi.get("audit-logs");
|
|
6706
|
+
const body = await auditLogs.findMany(query);
|
|
6707
|
+
ctx.body = body;
|
|
6708
|
+
},
|
|
6709
|
+
async findOne(ctx) {
|
|
6710
|
+
const { id } = ctx.params;
|
|
6711
|
+
const auditLogs = strapi.get("audit-logs");
|
|
6712
|
+
const body = await auditLogs.findOne(id);
|
|
6713
|
+
ctx.body = body;
|
|
6714
|
+
strapi.telemetry.send("didWatchAnAuditLog");
|
|
6715
|
+
}
|
|
6716
|
+
};
|
|
6717
|
+
const getSanitizedUser = (user2) => {
|
|
6718
|
+
let displayName = user2.email;
|
|
6719
|
+
if (user2.username) {
|
|
6720
|
+
displayName = user2.username;
|
|
6721
|
+
} else if (user2.firstname && user2.lastname) {
|
|
6722
|
+
displayName = `${user2.firstname} ${user2.lastname}`;
|
|
6723
|
+
}
|
|
6724
|
+
return {
|
|
6725
|
+
id: user2.id,
|
|
6726
|
+
email: user2.email,
|
|
6727
|
+
displayName
|
|
6728
|
+
};
|
|
6729
|
+
};
|
|
6730
|
+
const createAuditLogsService = (strapi2) => {
|
|
6731
|
+
return {
|
|
6732
|
+
async saveEvent(event) {
|
|
6733
|
+
const { userId, ...rest } = event;
|
|
6734
|
+
const auditLog2 = { ...rest, user: userId };
|
|
6735
|
+
await strapi2.db?.query("admin::audit-log").create({ data: auditLog2 });
|
|
6736
|
+
return this;
|
|
6737
|
+
},
|
|
6738
|
+
async findMany(query) {
|
|
6739
|
+
const { results, pagination } = await strapi2.db?.query("admin::audit-log").findPage({
|
|
6740
|
+
populate: ["user"],
|
|
6741
|
+
select: ["action", "date", "payload"],
|
|
6742
|
+
...strapi2.get("query-params").transform("admin::audit-log", query)
|
|
6743
|
+
});
|
|
6744
|
+
const sanitizedResults = results.map((result) => {
|
|
6745
|
+
const { user: user2, ...rest } = result;
|
|
6746
|
+
return {
|
|
6747
|
+
...rest,
|
|
6748
|
+
user: user2 ? getSanitizedUser(user2) : null
|
|
6749
|
+
};
|
|
6750
|
+
});
|
|
6751
|
+
return {
|
|
6752
|
+
results: sanitizedResults,
|
|
6753
|
+
pagination
|
|
6754
|
+
};
|
|
6755
|
+
},
|
|
6756
|
+
async findOne(id) {
|
|
6757
|
+
const result = await strapi2.db?.query("admin::audit-log").findOne({
|
|
6758
|
+
where: { id },
|
|
6759
|
+
populate: ["user"],
|
|
6760
|
+
select: ["action", "date", "payload"]
|
|
6761
|
+
});
|
|
6762
|
+
if (!result) {
|
|
6763
|
+
return null;
|
|
6764
|
+
}
|
|
6765
|
+
const { user: user2, ...rest } = result;
|
|
6766
|
+
return {
|
|
6767
|
+
...rest,
|
|
6768
|
+
user: user2 ? getSanitizedUser(user2) : null
|
|
6769
|
+
};
|
|
6770
|
+
},
|
|
6771
|
+
deleteExpiredEvents(expirationDate) {
|
|
6772
|
+
return strapi2.db?.query("admin::audit-log").deleteMany({
|
|
6773
|
+
where: {
|
|
6774
|
+
date: {
|
|
6775
|
+
$lt: expirationDate.toISOString()
|
|
6776
|
+
}
|
|
6777
|
+
}
|
|
6778
|
+
});
|
|
6779
|
+
}
|
|
6780
|
+
};
|
|
6781
|
+
};
|
|
6782
|
+
const DEFAULT_RETENTION_DAYS = 90;
|
|
6783
|
+
const defaultEvents = [
|
|
6784
|
+
"entry.create",
|
|
6785
|
+
"entry.update",
|
|
6786
|
+
"entry.delete",
|
|
6787
|
+
"entry.publish",
|
|
6788
|
+
"entry.unpublish",
|
|
6789
|
+
"media.create",
|
|
6790
|
+
"media.update",
|
|
6791
|
+
"media.delete",
|
|
6792
|
+
"media-folder.create",
|
|
6793
|
+
"media-folder.update",
|
|
6794
|
+
"media-folder.delete",
|
|
6795
|
+
"user.create",
|
|
6796
|
+
"user.update",
|
|
6797
|
+
"user.delete",
|
|
6798
|
+
"admin.auth.success",
|
|
6799
|
+
"admin.logout",
|
|
6800
|
+
"content-type.create",
|
|
6801
|
+
"content-type.update",
|
|
6802
|
+
"content-type.delete",
|
|
6803
|
+
"component.create",
|
|
6804
|
+
"component.update",
|
|
6805
|
+
"component.delete",
|
|
6806
|
+
"role.create",
|
|
6807
|
+
"role.update",
|
|
6808
|
+
"role.delete",
|
|
6809
|
+
"permission.create",
|
|
6810
|
+
"permission.update",
|
|
6811
|
+
"permission.delete"
|
|
6812
|
+
];
|
|
6813
|
+
const getEventMap = (defaultEvents2) => {
|
|
6814
|
+
const getDefaultPayload = (...args) => args[0];
|
|
6815
|
+
return defaultEvents2.reduce((acc, event) => {
|
|
6816
|
+
acc[event] = getDefaultPayload;
|
|
6817
|
+
return acc;
|
|
6818
|
+
}, {});
|
|
6819
|
+
};
|
|
6820
|
+
const getRetentionDays = (strapi2) => {
|
|
6821
|
+
const featureConfig = strapi2.ee.features.get("audit-logs");
|
|
6822
|
+
const licenseRetentionDays = typeof featureConfig === "object" && featureConfig?.options.retentionDays;
|
|
6823
|
+
const userRetentionDays = strapi2.config.get("admin.auditLogs.retentionDays");
|
|
6824
|
+
if (licenseRetentionDays == null) {
|
|
6825
|
+
return userRetentionDays ?? DEFAULT_RETENTION_DAYS;
|
|
6826
|
+
}
|
|
6827
|
+
if (userRetentionDays && userRetentionDays < licenseRetentionDays) {
|
|
6828
|
+
return userRetentionDays;
|
|
6829
|
+
}
|
|
6830
|
+
return licenseRetentionDays;
|
|
6831
|
+
};
|
|
6832
|
+
const createAuditLogsLifecycleService = (strapi2) => {
|
|
6833
|
+
const state = {};
|
|
6834
|
+
const auditLogsService = strapi2.get("audit-logs");
|
|
6835
|
+
const eventMap = getEventMap(defaultEvents);
|
|
6836
|
+
const processEvent = (name2, ...args) => {
|
|
6837
|
+
const requestState = strapi2.requestContext.get()?.state;
|
|
6838
|
+
const isUsingAdminAuth = requestState?.route.info.type === "admin";
|
|
6839
|
+
const user2 = requestState?.user;
|
|
6840
|
+
if (!isUsingAdminAuth || !user2) {
|
|
6841
|
+
return null;
|
|
6842
|
+
}
|
|
6843
|
+
const getPayload = eventMap[name2];
|
|
6844
|
+
if (!getPayload) {
|
|
6845
|
+
return null;
|
|
6846
|
+
}
|
|
6847
|
+
const ignoredUids = ["plugin::upload.file", "plugin::upload.folder"];
|
|
6848
|
+
if (ignoredUids.includes(args[0]?.uid)) {
|
|
6849
|
+
return null;
|
|
6850
|
+
}
|
|
6851
|
+
return {
|
|
6852
|
+
action: name2,
|
|
6853
|
+
date: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6854
|
+
payload: getPayload(...args) || {},
|
|
6855
|
+
userId: user2.id
|
|
6856
|
+
};
|
|
6857
|
+
};
|
|
6858
|
+
const handleEvent = async (name2, ...args) => {
|
|
6859
|
+
const processedEvent = processEvent(name2, ...args);
|
|
6860
|
+
if (processedEvent) {
|
|
6861
|
+
await auditLogsService.saveEvent(processedEvent);
|
|
6862
|
+
}
|
|
6863
|
+
};
|
|
6864
|
+
return {
|
|
6865
|
+
async register() {
|
|
6866
|
+
if (!state.eeEnableUnsubscribe) {
|
|
6867
|
+
state.eeEnableUnsubscribe = strapi2.eventHub.on("ee.enable", () => {
|
|
6868
|
+
this.destroy();
|
|
6869
|
+
this.register();
|
|
6870
|
+
});
|
|
6871
|
+
}
|
|
6872
|
+
if (!state.eeUpdateUnsubscribe) {
|
|
6873
|
+
state.eeUpdateUnsubscribe = strapi2.eventHub.on("ee.update", () => {
|
|
6874
|
+
this.destroy();
|
|
6875
|
+
this.register();
|
|
6876
|
+
});
|
|
6877
|
+
}
|
|
6878
|
+
state.eeDisableUnsubscribe = strapi2.eventHub.on("ee.disable", () => {
|
|
6879
|
+
this.destroy();
|
|
6880
|
+
});
|
|
6881
|
+
if (!strapi2.ee.features.isEnabled("audit-logs")) {
|
|
6882
|
+
return this;
|
|
6883
|
+
}
|
|
6884
|
+
state.eventHubUnsubscribe = strapi2.eventHub.subscribe(handleEvent);
|
|
6885
|
+
const retentionDays = getRetentionDays(strapi2);
|
|
6886
|
+
state.deleteExpiredJob = nodeSchedule.scheduleJob("0 0 * * *", () => {
|
|
6887
|
+
const expirationDate = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1e3);
|
|
6888
|
+
auditLogsService.deleteExpiredEvents(expirationDate);
|
|
6889
|
+
});
|
|
6890
|
+
return this;
|
|
6891
|
+
},
|
|
6892
|
+
unsubscribe() {
|
|
6893
|
+
if (state.eeDisableUnsubscribe) {
|
|
6894
|
+
state.eeDisableUnsubscribe();
|
|
6895
|
+
}
|
|
6896
|
+
if (state.eventHubUnsubscribe) {
|
|
6897
|
+
state.eventHubUnsubscribe();
|
|
6898
|
+
}
|
|
6899
|
+
if (state.deleteExpiredJob) {
|
|
6900
|
+
state.deleteExpiredJob.cancel();
|
|
6901
|
+
}
|
|
6902
|
+
return this;
|
|
6903
|
+
},
|
|
6904
|
+
destroy() {
|
|
6905
|
+
return this.unsubscribe();
|
|
6906
|
+
}
|
|
6907
|
+
};
|
|
6908
|
+
};
|
|
6909
|
+
const auditLog = {
|
|
6910
|
+
schema: {
|
|
6911
|
+
kind: "collectionType",
|
|
6912
|
+
collectionName: "strapi_audit_logs",
|
|
6913
|
+
info: {
|
|
6914
|
+
singularName: "audit-log",
|
|
6915
|
+
pluralName: "audit-logs",
|
|
6916
|
+
displayName: "Audit Log"
|
|
6917
|
+
},
|
|
6918
|
+
options: {
|
|
6919
|
+
timestamps: false
|
|
6920
|
+
},
|
|
6921
|
+
pluginOptions: {
|
|
6922
|
+
"content-manager": {
|
|
6923
|
+
visible: false
|
|
6924
|
+
},
|
|
6925
|
+
"content-type-builder": {
|
|
6926
|
+
visible: false
|
|
6927
|
+
}
|
|
6928
|
+
},
|
|
6929
|
+
attributes: {
|
|
6930
|
+
action: {
|
|
6931
|
+
type: "string",
|
|
6932
|
+
required: true
|
|
6933
|
+
},
|
|
6934
|
+
date: {
|
|
6935
|
+
type: "datetime",
|
|
6936
|
+
required: true
|
|
6937
|
+
},
|
|
6938
|
+
user: {
|
|
6939
|
+
type: "relation",
|
|
6940
|
+
relation: "oneToOne",
|
|
6941
|
+
target: "admin::user"
|
|
6942
|
+
},
|
|
6943
|
+
payload: {
|
|
6944
|
+
type: "json"
|
|
6945
|
+
}
|
|
6946
|
+
}
|
|
6947
|
+
}
|
|
6948
|
+
};
|
|
6949
|
+
const getAdminEE = () => {
|
|
6950
|
+
const eeAdmin = {
|
|
6951
|
+
register,
|
|
6952
|
+
bootstrap,
|
|
6953
|
+
destroy,
|
|
6954
|
+
contentTypes: {
|
|
6955
|
+
// Always register the audit-log content type to prevent data loss
|
|
6956
|
+
"audit-log": auditLog,
|
|
6957
|
+
...adminContentTypes
|
|
6958
|
+
},
|
|
6959
|
+
services,
|
|
6960
|
+
controllers,
|
|
6961
|
+
routes
|
|
6962
|
+
};
|
|
6963
|
+
if (strapi.config.get("admin.auditLogs.enabled", true) && strapi.ee.features.isEnabled("audit-logs")) {
|
|
6964
|
+
return {
|
|
6965
|
+
...eeAdmin,
|
|
6966
|
+
controllers: {
|
|
6967
|
+
...eeAdmin.controllers,
|
|
6968
|
+
"audit-logs": auditLogsController
|
|
6969
|
+
},
|
|
6970
|
+
routes: {
|
|
6971
|
+
...eeAdmin.routes,
|
|
6972
|
+
"audit-logs": auditLogsRoutes
|
|
6973
|
+
},
|
|
6974
|
+
async register({ strapi: strapi2 }) {
|
|
6975
|
+
await eeAdmin.register({ strapi: strapi2 });
|
|
6976
|
+
strapi2.add("audit-logs", createAuditLogsService(strapi2));
|
|
6977
|
+
const auditLogsLifecycle = createAuditLogsLifecycleService(strapi2);
|
|
6978
|
+
strapi2.add("audit-logs-lifecycle", auditLogsLifecycle);
|
|
6979
|
+
await auditLogsLifecycle.register();
|
|
6980
|
+
},
|
|
6981
|
+
async destroy({ strapi: strapi2 }) {
|
|
6982
|
+
strapi2.get("audit-logs-lifecycle").destroy();
|
|
6983
|
+
await eeAdmin.destroy({ strapi: strapi2 });
|
|
6984
|
+
}
|
|
6985
|
+
};
|
|
6986
|
+
}
|
|
6987
|
+
return eeAdmin;
|
|
6988
|
+
};
|
|
6989
|
+
let admin = {
|
|
6990
|
+
bootstrap: bootstrap$1,
|
|
6991
|
+
register: register$2,
|
|
6992
|
+
destroy: destroy$1,
|
|
6993
|
+
config,
|
|
6994
|
+
policies,
|
|
6995
|
+
routes: routes$1,
|
|
6996
|
+
services: services$1,
|
|
6997
|
+
controllers: controllers$1,
|
|
6998
|
+
contentTypes,
|
|
6999
|
+
middlewares: middlewares$1
|
|
7000
|
+
};
|
|
7001
|
+
const mergeRoutes = (a, b, key) => {
|
|
7002
|
+
return ___namespace.default.isArray(a) && ___namespace.default.isArray(b) && key === "routes" ? a.concat(b) : void 0;
|
|
7003
|
+
};
|
|
7004
|
+
if (strapi.EE) {
|
|
7005
|
+
admin = ___namespace.default.mergeWith({}, admin, getAdminEE(), mergeRoutes);
|
|
7006
|
+
}
|
|
7007
|
+
const admin$1 = admin;
|
|
7008
|
+
module.exports = admin$1;
|
|
5656
7009
|
//# sourceMappingURL=index.js.map
|