@strapi/admin 5.0.0-rc.3 → 5.0.0-rc.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (389) hide show
  1. package/dist/admin/{AdminSeatInfo-E8azTFQY.js → AdminSeatInfo-8vtNB3ck.js} +4 -4
  2. package/dist/admin/AdminSeatInfo-8vtNB3ck.js.map +1 -0
  3. package/dist/admin/{AdminSeatInfo-Q_hUNC5B.mjs → AdminSeatInfo-qIgh5-QA.mjs} +5 -5
  4. package/dist/admin/AdminSeatInfo-qIgh5-QA.mjs.map +1 -0
  5. package/dist/admin/{ApplicationInfoPage-noPIfujW.js → ApplicationInfoPage-ezUPoomC.js} +10 -10
  6. package/dist/admin/ApplicationInfoPage-ezUPoomC.js.map +1 -0
  7. package/dist/admin/{ApplicationInfoPage-kEld-u0P.mjs → ApplicationInfoPage-hvwQQDfu.mjs} +10 -10
  8. package/dist/admin/ApplicationInfoPage-hvwQQDfu.mjs.map +1 -0
  9. package/dist/admin/{AuthResponse-J8A48xdo.mjs → AuthResponse-HYXVuTDF.mjs} +2 -2
  10. package/dist/admin/{AuthResponse-J8A48xdo.mjs.map → AuthResponse-HYXVuTDF.mjs.map} +1 -1
  11. package/dist/admin/{AuthResponse-KlTDmm2i.js → AuthResponse-R8kR_yqS.js} +2 -2
  12. package/dist/admin/{AuthResponse-KlTDmm2i.js.map → AuthResponse-R8kR_yqS.js.map} +1 -1
  13. package/dist/admin/{AuthenticatedLayout-zYfAXNPg.mjs → AuthenticatedLayout-L-NNsHI6.mjs} +69 -82
  14. package/dist/admin/AuthenticatedLayout-L-NNsHI6.mjs.map +1 -0
  15. package/dist/admin/{AuthenticatedLayout-kLMmhrNQ.js → AuthenticatedLayout-U_Y1i-L-.js} +68 -81
  16. package/dist/admin/AuthenticatedLayout-U_Y1i-L-.js.map +1 -0
  17. package/dist/admin/{CreateActionEE-Yfp4hs7a.mjs → CreateActionEE-X2nnG2dm.mjs} +2 -2
  18. package/dist/admin/{CreateActionEE-Yfp4hs7a.mjs.map → CreateActionEE-X2nnG2dm.mjs.map} +1 -1
  19. package/dist/admin/{CreatePage-I7iAq1hY.mjs → CreatePage-J5u689Z3.mjs} +3 -3
  20. package/dist/admin/{CreatePage-I7iAq1hY.mjs.map → CreatePage-J5u689Z3.mjs.map} +1 -1
  21. package/dist/admin/{CreatePage-CUxfLM1W.js → CreatePage-hVCdmn57.js} +3 -3
  22. package/dist/admin/{CreatePage-CUxfLM1W.js.map → CreatePage-hVCdmn57.js.map} +1 -1
  23. package/dist/admin/{CreatePage-bJgO6DND.mjs → CreatePage-kEk8SJfP.mjs} +7 -7
  24. package/dist/admin/CreatePage-kEk8SJfP.mjs.map +1 -0
  25. package/dist/admin/{CreatePage-0dG6JVsn.js → CreatePage-wgAv5nl3.js} +6 -6
  26. package/dist/admin/CreatePage-wgAv5nl3.js.map +1 -0
  27. package/dist/admin/{CreateView-_K_RroGC.js → CreateView-jmN888jP.js} +3 -3
  28. package/dist/admin/{CreateView-_K_RroGC.js.map → CreateView-jmN888jP.js.map} +1 -1
  29. package/dist/admin/{CreateView-uZSogyWz.mjs → CreateView-jyUut1x5.mjs} +3 -3
  30. package/dist/admin/{CreateView-uZSogyWz.mjs.map → CreateView-jyUut1x5.mjs.map} +1 -1
  31. package/dist/admin/{CreateView-dpvub7Dn.mjs → CreateView-m1DVHo7c.mjs} +3 -3
  32. package/dist/admin/{CreateView-dpvub7Dn.mjs.map → CreateView-m1DVHo7c.mjs.map} +1 -1
  33. package/dist/admin/{CreateView-8WdBrUg7.js → CreateView-ormHpP1q.js} +3 -3
  34. package/dist/admin/{CreateView-8WdBrUg7.js.map → CreateView-ormHpP1q.js.map} +1 -1
  35. package/dist/admin/{EditPage-T7HhMiw2.js → EditPage-5io6Tp6t.js} +8 -8
  36. package/dist/admin/EditPage-5io6Tp6t.js.map +1 -0
  37. package/dist/admin/{EditPage-D5r0GV3j.mjs → EditPage-Od_v4_be.mjs} +42 -29
  38. package/dist/admin/EditPage-Od_v4_be.mjs.map +1 -0
  39. package/dist/admin/{EditPage-X8jnX0_l.js → EditPage-Pt5W8neh.js} +40 -27
  40. package/dist/admin/EditPage-Pt5W8neh.js.map +1 -0
  41. package/dist/admin/{EditPage-iksJke6K.js → EditPage-Q95nrnV7.js} +25 -16
  42. package/dist/admin/EditPage-Q95nrnV7.js.map +1 -0
  43. package/dist/admin/{EditPage-Bx_qeoOF.mjs → EditPage-lgiRfwaF.mjs} +26 -17
  44. package/dist/admin/EditPage-lgiRfwaF.mjs.map +1 -0
  45. package/dist/admin/{EditPage-yBDiueEy.mjs → EditPage-tOIK-Cfa.mjs} +9 -9
  46. package/dist/admin/EditPage-tOIK-Cfa.mjs.map +1 -0
  47. package/dist/admin/{EditView-9nfADKvX.mjs → EditView-C2YwNWBO.mjs} +11 -12
  48. package/dist/admin/EditView-C2YwNWBO.mjs.map +1 -0
  49. package/dist/admin/{EditView-kxg0Wurs.js → EditView-gMzPUOqp.js} +9 -10
  50. package/dist/admin/EditView-gMzPUOqp.js.map +1 -0
  51. package/dist/admin/{EditViewPage-PmrZwoCk.mjs → EditViewPage-BgCS0-PW.mjs} +77 -54
  52. package/dist/admin/EditViewPage-BgCS0-PW.mjs.map +1 -0
  53. package/dist/admin/{EditViewPage-I5bq_bCv.js → EditViewPage-ejtUKO-R.js} +76 -53
  54. package/dist/admin/EditViewPage-ejtUKO-R.js.map +1 -0
  55. package/dist/admin/{EventsTable-uNKFTehG.js → EventsTable-A7mZRfim.js} +2 -2
  56. package/dist/admin/{EventsTable-uNKFTehG.js.map → EventsTable-A7mZRfim.js.map} +1 -1
  57. package/dist/admin/{EventsTable-d03-9tkm.mjs → EventsTable-t4y4yZXc.mjs} +2 -2
  58. package/dist/admin/{EventsTable-d03-9tkm.mjs.map → EventsTable-t4y4yZXc.mjs.map} +1 -1
  59. package/dist/admin/{HomePage-183EKMLK.mjs → HomePage-1wvgf7Va.mjs} +3 -3
  60. package/dist/admin/{HomePage-183EKMLK.mjs.map → HomePage-1wvgf7Va.mjs.map} +1 -1
  61. package/dist/admin/{HomePage-n2buy2O4.mjs → HomePage-Uy655P1o.mjs} +11 -14
  62. package/dist/admin/HomePage-Uy655P1o.mjs.map +1 -0
  63. package/dist/admin/{HomePage-XakoaT95.js → HomePage-l2K5VEES.js} +19 -22
  64. package/dist/admin/HomePage-l2K5VEES.js.map +1 -0
  65. package/dist/admin/{HomePage-8mwfR9nn.js → HomePage-zvRCtbch.js} +3 -3
  66. package/dist/admin/{HomePage-8mwfR9nn.js.map → HomePage-zvRCtbch.js.map} +1 -1
  67. package/dist/admin/{InstalledPluginsPage--BdpZuNa.js → InstalledPlugins-SpFdFYND.js} +9 -11
  68. package/dist/admin/InstalledPlugins-SpFdFYND.js.map +1 -0
  69. package/dist/admin/{InstalledPluginsPage-nFNbVJPm.mjs → InstalledPlugins-wPRaVeug.mjs} +9 -11
  70. package/dist/admin/InstalledPlugins-wPRaVeug.mjs.map +1 -0
  71. package/dist/admin/{Layout-2ucTUD08.js → Layout-1pNNiYP1.js} +5 -5
  72. package/dist/admin/{Layout-2ucTUD08.js.map → Layout-1pNNiYP1.js.map} +1 -1
  73. package/dist/admin/{Layout-rXyzByjE.mjs → Layout-WNZbvlel.mjs} +5 -5
  74. package/dist/admin/{Layout-rXyzByjE.mjs.map → Layout-WNZbvlel.mjs.map} +1 -1
  75. package/dist/admin/{ListPage-iBPceR0S.mjs → ListPage-9efPpe0f.mjs} +7 -7
  76. package/dist/admin/ListPage-9efPpe0f.mjs.map +1 -0
  77. package/dist/admin/{ListPage-U0JQnpSG.js → ListPage-C9_pjixy.js} +3 -3
  78. package/dist/admin/{ListPage-U0JQnpSG.js.map → ListPage-C9_pjixy.js.map} +1 -1
  79. package/dist/admin/{ListPage-vZsQ_8fm.mjs → ListPage-RaBcFl-9.mjs} +3 -3
  80. package/dist/admin/{ListPage-vZsQ_8fm.mjs.map → ListPage-RaBcFl-9.mjs.map} +1 -1
  81. package/dist/admin/{ListPage-pwMqUvh3.js → ListPage-SNyqdq5P.js} +46 -28
  82. package/dist/admin/ListPage-SNyqdq5P.js.map +1 -0
  83. package/dist/admin/{ListPage-SnKebmiT.js → ListPage-UJdwjcJg.js} +5 -5
  84. package/dist/admin/ListPage-UJdwjcJg.js.map +1 -0
  85. package/dist/admin/{ListPage-nXLMZNTC.js → ListPage-dkI5xNaW.js} +7 -7
  86. package/dist/admin/ListPage-dkI5xNaW.js.map +1 -0
  87. package/dist/admin/{ListPage-j-5j-VkL.mjs → ListPage-jfLUMF0B.mjs} +5 -5
  88. package/dist/admin/{ListPage-j-5j-VkL.mjs.map → ListPage-jfLUMF0B.mjs.map} +1 -1
  89. package/dist/admin/{ListPage-GUI-KsYW.js → ListPage-vWxKV7tW.js} +6 -6
  90. package/dist/admin/{ListPage-GUI-KsYW.js.map → ListPage-vWxKV7tW.js.map} +1 -1
  91. package/dist/admin/{ListPage-k3F774YE.mjs → ListPage-wxodcCqH.mjs} +6 -6
  92. package/dist/admin/ListPage-wxodcCqH.mjs.map +1 -0
  93. package/dist/admin/{ListPage-pdwlNZO5.mjs → ListPage-z_lGScc3.mjs} +48 -30
  94. package/dist/admin/ListPage-z_lGScc3.mjs.map +1 -0
  95. package/dist/admin/{ListView-6t08ndE1.js → ListView-96suJOx8.js} +4 -4
  96. package/dist/admin/{ListView-6t08ndE1.js.map → ListView-96suJOx8.js.map} +1 -1
  97. package/dist/admin/{ListView-mhOmYiYT.js → ListView-9c2btOtu.js} +5 -5
  98. package/dist/admin/{ListView-mhOmYiYT.js.map → ListView-9c2btOtu.js.map} +1 -1
  99. package/dist/admin/{ListView-vbeM6zm_.mjs → ListView-WuLI8P9g.mjs} +5 -5
  100. package/dist/admin/{ListView-vbeM6zm_.mjs.map → ListView-WuLI8P9g.mjs.map} +1 -1
  101. package/dist/admin/{ListView-gd-uUYo3.mjs → ListView-Xh4ewfST.mjs} +5 -5
  102. package/dist/admin/{ListView-gd-uUYo3.mjs.map → ListView-Xh4ewfST.mjs.map} +1 -1
  103. package/dist/admin/{Login-VnmdXnMj.mjs → Login-Che5xFmG.mjs} +4 -4
  104. package/dist/admin/{Login-VnmdXnMj.mjs.map → Login-Che5xFmG.mjs.map} +1 -1
  105. package/dist/admin/{Login-KEjxL7NL.js → Login-FibrFNCh.js} +4 -4
  106. package/dist/admin/{Login-KEjxL7NL.js.map → Login-FibrFNCh.js.map} +1 -1
  107. package/dist/admin/{MagicLinkEE-lbZ8IiEW.mjs → MagicLinkEE-FrMh9qpI.mjs} +3 -3
  108. package/dist/admin/{MagicLinkEE-lbZ8IiEW.mjs.map → MagicLinkEE-FrMh9qpI.mjs.map} +1 -1
  109. package/dist/admin/{MagicLinkEE-_uF-eBZl.js → MagicLinkEE-XeVNxSHy.js} +3 -3
  110. package/dist/admin/{MagicLinkEE-_uF-eBZl.js.map → MagicLinkEE-XeVNxSHy.js.map} +1 -1
  111. package/dist/admin/{MarketplacePage-Pwwe_Pr9.js → MarketplacePage-BPe_3jP4.js} +87 -74
  112. package/dist/admin/MarketplacePage-BPe_3jP4.js.map +1 -0
  113. package/dist/admin/{MarketplacePage--aN208CJ.mjs → MarketplacePage-hQE7ybnf.mjs} +86 -73
  114. package/dist/admin/MarketplacePage-hQE7ybnf.mjs.map +1 -0
  115. package/dist/admin/{Permissions-oxdduJgE.mjs → Permissions-aSGK8VGG.mjs} +3 -3
  116. package/dist/admin/{Permissions-oxdduJgE.mjs.map → Permissions-aSGK8VGG.mjs.map} +1 -1
  117. package/dist/admin/{Permissions-SuZE5tW3.js → Permissions-bmMBmcv7.js} +3 -3
  118. package/dist/admin/{Permissions-SuZE5tW3.js.map → Permissions-bmMBmcv7.js.map} +1 -1
  119. package/dist/admin/{PrivateRoute-ndqg7K6H.js → PrivateRoute-LO9G_pCJ.js} +2 -2
  120. package/dist/admin/{PrivateRoute-ndqg7K6H.js.map → PrivateRoute-LO9G_pCJ.js.map} +1 -1
  121. package/dist/admin/{PrivateRoute-4oRTB_tX.mjs → PrivateRoute-S4Lol0B9.mjs} +2 -2
  122. package/dist/admin/{PrivateRoute-4oRTB_tX.mjs.map → PrivateRoute-S4Lol0B9.mjs.map} +1 -1
  123. package/dist/admin/{ProfilePage-wo_TrDuQ.mjs → ProfilePage-RM2Dol_b.mjs} +9 -9
  124. package/dist/admin/ProfilePage-RM2Dol_b.mjs.map +1 -0
  125. package/dist/admin/{ProfilePage-9GtyEQef.js → ProfilePage-kBO5al50.js} +8 -8
  126. package/dist/admin/ProfilePage-kBO5al50.js.map +1 -0
  127. package/dist/admin/{PurchaseAuditLogs-YYOVsNMr.js → PurchaseAuditLogs-2mIURI7O.js} +2 -2
  128. package/dist/admin/{PurchaseAuditLogs-YYOVsNMr.js.map → PurchaseAuditLogs-2mIURI7O.js.map} +1 -1
  129. package/dist/admin/{PurchaseAuditLogs-KuzDXxa_.mjs → PurchaseAuditLogs-Mzq8o-DK.mjs} +2 -2
  130. package/dist/admin/{PurchaseAuditLogs-KuzDXxa_.mjs.map → PurchaseAuditLogs-Mzq8o-DK.mjs.map} +1 -1
  131. package/dist/admin/{PurchaseSingleSignOn-UF2SMczk.js → PurchaseSingleSignOn-P_X-9MEx.js} +2 -2
  132. package/dist/admin/{PurchaseSingleSignOn-UF2SMczk.js.map → PurchaseSingleSignOn-P_X-9MEx.js.map} +1 -1
  133. package/dist/admin/{PurchaseSingleSignOn-4m19d5bJ.mjs → PurchaseSingleSignOn-cMTLeK2B.mjs} +2 -2
  134. package/dist/admin/{PurchaseSingleSignOn-4m19d5bJ.mjs.map → PurchaseSingleSignOn-cMTLeK2B.mjs.map} +1 -1
  135. package/dist/admin/{SSOProviders-QBcyB9VI.js → SSOProviders-9-d1vYXb.js} +4 -4
  136. package/dist/admin/SSOProviders-9-d1vYXb.js.map +1 -0
  137. package/dist/admin/{SSOProviders-nMmBLr8g.mjs → SSOProviders-sy3Xon2A.mjs} +4 -4
  138. package/dist/admin/SSOProviders-sy3Xon2A.mjs.map +1 -0
  139. package/dist/admin/{SelectRoles-82KlaNv9.mjs → SelectRoles-MZNlONGM.mjs} +7 -7
  140. package/dist/admin/SelectRoles-MZNlONGM.mjs.map +1 -0
  141. package/dist/admin/{SelectRoles-iUoQ1i46.js → SelectRoles-W7y7odaY.js} +8 -8
  142. package/dist/admin/SelectRoles-W7y7odaY.js.map +1 -0
  143. package/dist/admin/{SingleSignOnPage-xBAVG_IK.js → SingleSignOnPage-OwgCN2hp.js} +14 -5
  144. package/dist/admin/SingleSignOnPage-OwgCN2hp.js.map +1 -0
  145. package/dist/admin/{SingleSignOnPage-N3e0bw3O.mjs → SingleSignOnPage-gvYva6J8.mjs} +15 -6
  146. package/dist/admin/SingleSignOnPage-gvYva6J8.mjs.map +1 -0
  147. package/dist/admin/{Table-YZ9eQlTc.mjs → Table-a9i0e2LJ.mjs} +13 -20
  148. package/dist/admin/Table-a9i0e2LJ.mjs.map +1 -0
  149. package/dist/admin/{Table-M_g0IUVs.js → Table-mhCUTq4S.js} +13 -20
  150. package/dist/admin/Table-mhCUTq4S.js.map +1 -0
  151. package/dist/admin/{Theme-PrUuuGtN.mjs → Theme-frC82ceE.mjs} +221 -20
  152. package/dist/admin/Theme-frC82ceE.mjs.map +1 -0
  153. package/dist/admin/{Theme-7W0we6BI.js → Theme-y_rWTknM.js} +225 -19
  154. package/dist/admin/Theme-y_rWTknM.js.map +1 -0
  155. package/dist/admin/{TokenTypeSelect-vAeDNBmG.mjs → TokenTypeSelect-WifdoxkK.mjs} +5 -6
  156. package/dist/admin/TokenTypeSelect-WifdoxkK.mjs.map +1 -0
  157. package/dist/admin/{TokenTypeSelect-HMyBvTwA.js → TokenTypeSelect-XdGVptL-.js} +5 -6
  158. package/dist/admin/TokenTypeSelect-XdGVptL-.js.map +1 -0
  159. package/dist/admin/{UseCasePage-VlWOTc-k.js → UseCasePage-MjT4gpNe.js} +14 -8
  160. package/dist/admin/UseCasePage-MjT4gpNe.js.map +1 -0
  161. package/dist/admin/{UseCasePage-GupUMZgN.mjs → UseCasePage-URqtqwgm.mjs} +14 -8
  162. package/dist/admin/{UseCasePage-GupUMZgN.mjs.map → UseCasePage-URqtqwgm.mjs.map} +1 -1
  163. package/dist/admin/{admin-B6AW0Kov.mjs → admin-GZ-AP2T0.mjs} +2 -2
  164. package/dist/admin/{admin-B6AW0Kov.mjs.map → admin-GZ-AP2T0.mjs.map} +1 -1
  165. package/dist/admin/{apiTokens-YMUmHnrH.mjs → apiTokens-GQe-GqwZ.mjs} +2 -2
  166. package/dist/admin/{apiTokens-YMUmHnrH.mjs.map → apiTokens-GQe-GqwZ.mjs.map} +1 -1
  167. package/dist/admin/{constants-hpTrGuiB.mjs → constants-HotVFBqh.mjs} +4 -4
  168. package/dist/admin/{constants-hpTrGuiB.mjs.map → constants-HotVFBqh.mjs.map} +1 -1
  169. package/dist/admin/{constants-2ESPgM_p.js → constants-j8FcH7FB.js} +4 -4
  170. package/dist/admin/{constants-2ESPgM_p.js.map → constants-j8FcH7FB.js.map} +1 -1
  171. package/dist/admin/ee.mjs +1 -1
  172. package/dist/admin/{en-TbnMBjZf.js → en-_1-Nn7iH.js} +3 -2
  173. package/dist/admin/{en-TbnMBjZf.js.map → en-_1-Nn7iH.js.map} +1 -1
  174. package/dist/admin/{en-0Ld-ipyI.mjs → en-lDO5lPD0.mjs} +3 -2
  175. package/dist/admin/{en-0Ld-ipyI.mjs.map → en-lDO5lPD0.mjs.map} +1 -1
  176. package/dist/admin/{index-qf9IxVeZ.js → index-h7R8mHHX.js} +145 -291
  177. package/dist/admin/index-h7R8mHHX.js.map +1 -0
  178. package/dist/admin/{index-6pjQxyB0.mjs → index-ukxNzreH.mjs} +141 -284
  179. package/dist/admin/index-ukxNzreH.mjs.map +1 -0
  180. package/dist/admin/index.js +5 -4
  181. package/dist/admin/index.js.map +1 -1
  182. package/dist/admin/index.mjs +3 -3
  183. package/dist/admin/{selectors-ZpHhvPK4.mjs → selectors--muHmKGe.mjs} +2 -2
  184. package/dist/admin/{selectors-ZpHhvPK4.mjs.map → selectors--muHmKGe.mjs.map} +1 -1
  185. package/dist/admin/{selectors-zQKcCNuz.js → selectors-1ySxKbos.js} +2 -2
  186. package/dist/admin/{selectors-zQKcCNuz.js.map → selectors-1ySxKbos.js.map} +1 -1
  187. package/dist/admin/src/StrapiApp.d.ts +8 -6
  188. package/dist/admin/src/components/Form.d.ts +3 -1
  189. package/dist/admin/src/components/FormInputs/Json.d.ts +2 -2
  190. package/dist/admin/src/components/GuidedTour/Provider.d.ts +0 -4
  191. package/dist/admin/src/constants.d.ts +10 -0
  192. package/dist/admin/src/features/Auth.d.ts +1 -1
  193. package/dist/admin/src/hooks/useRBAC.d.ts +1 -1
  194. package/dist/admin/src/index.d.ts +3 -0
  195. package/dist/admin/src/layouts/UnauthenticatedLayout.d.ts +1 -1
  196. package/dist/admin/src/pages/Marketplace/hooks/useMarketplaceData.d.ts +2 -1
  197. package/dist/admin/src/pages/Settings/pages/InstalledPlugins.d.ts +3 -0
  198. package/dist/admin/src/pages/Settings/pages/Roles/components/CollapseLabel.d.ts +1 -1
  199. package/dist/admin/src/types/permissions.d.ts +3 -1
  200. package/dist/admin/test.js +3 -3
  201. package/dist/admin/test.js.map +1 -1
  202. package/dist/admin/test.mjs +4 -4
  203. package/dist/admin/test.mjs.map +1 -1
  204. package/dist/admin/{transferTokens-CNI0TFdA.mjs → transferTokens-v8tNpI_l.mjs} +2 -2
  205. package/dist/admin/{transferTokens-CNI0TFdA.mjs.map → transferTokens-v8tNpI_l.mjs.map} +1 -1
  206. package/dist/admin/{useAdminRoles-8Uy9-IbL.js → useAdminRoles-BxjzG1Wt.js} +2 -2
  207. package/dist/admin/{useAdminRoles-8Uy9-IbL.js.map → useAdminRoles-BxjzG1Wt.js.map} +1 -1
  208. package/dist/admin/{useAdminRoles-a4_GH7yG.mjs → useAdminRoles-fAp7mZbB.mjs} +2 -2
  209. package/dist/admin/{useAdminRoles-a4_GH7yG.mjs.map → useAdminRoles-fAp7mZbB.mjs.map} +1 -1
  210. package/dist/admin/{useLicenseLimitNotification-PaR7jmqd.mjs → useLicenseLimitNotification-Qx_rSpUQ.mjs} +3 -3
  211. package/dist/admin/{useLicenseLimitNotification-PaR7jmqd.mjs.map → useLicenseLimitNotification-Qx_rSpUQ.mjs.map} +1 -1
  212. package/dist/admin/{useLicenseLimitNotification-g1vq6nzk.js → useLicenseLimitNotification-eau4ja6h.js} +2 -2
  213. package/dist/admin/{useLicenseLimitNotification-g1vq6nzk.js.map → useLicenseLimitNotification-eau4ja6h.js.map} +1 -1
  214. package/dist/admin/{useLicenseLimits-Jy6E6qc2.mjs → useLicenseLimits-j5znikzW.mjs} +2 -2
  215. package/dist/admin/{useLicenseLimits-Jy6E6qc2.mjs.map → useLicenseLimits-j5znikzW.mjs.map} +1 -1
  216. package/dist/admin/{useWebhooks-7thg-d57.mjs → useWebhooks-upF7mgdZ.mjs} +2 -2
  217. package/dist/admin/{useWebhooks-7thg-d57.mjs.map → useWebhooks-upF7mgdZ.mjs.map} +1 -1
  218. package/dist/admin/{validation-ODUz3BOU.js → validation-6SSeyGur.js} +4 -4
  219. package/dist/admin/validation-6SSeyGur.js.map +1 -0
  220. package/dist/admin/{validation-YqwSDeRS.mjs → validation-cMzmzqCF.mjs} +4 -4
  221. package/dist/admin/validation-cMzmzqCF.mjs.map +1 -0
  222. package/dist/ee/server/src/audit-logs/content-types/audit-log.d.ts +41 -0
  223. package/dist/ee/server/src/audit-logs/content-types/audit-log.d.ts.map +1 -0
  224. package/dist/ee/server/src/audit-logs/controllers/audit-logs.d.ts +7 -0
  225. package/dist/ee/server/src/audit-logs/controllers/audit-logs.d.ts.map +1 -0
  226. package/dist/ee/server/src/audit-logs/routes/audit-logs.d.ts +19 -0
  227. package/dist/ee/server/src/audit-logs/routes/audit-logs.d.ts.map +1 -0
  228. package/dist/ee/server/src/audit-logs/services/audit-logs.d.ts +27 -0
  229. package/dist/ee/server/src/audit-logs/services/audit-logs.d.ts.map +1 -0
  230. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +12 -0
  231. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -0
  232. package/dist/ee/server/src/audit-logs/validation/audit-logs.d.ts +6 -0
  233. package/dist/ee/server/src/audit-logs/validation/audit-logs.d.ts.map +1 -0
  234. package/dist/ee/server/src/bootstrap.d.ts +3 -0
  235. package/dist/ee/server/src/bootstrap.d.ts.map +1 -0
  236. package/dist/ee/server/src/config/admin-actions.d.ts +20 -0
  237. package/dist/ee/server/src/config/admin-actions.d.ts.map +1 -0
  238. package/dist/ee/server/src/content-types/index.d.ts +3 -0
  239. package/dist/ee/server/src/content-types/index.d.ts.map +1 -0
  240. package/dist/ee/server/src/controllers/admin.d.ts +29 -0
  241. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -0
  242. package/dist/ee/server/src/controllers/authentication-utils/constants.d.ts +10 -0
  243. package/dist/ee/server/src/controllers/authentication-utils/constants.d.ts.map +1 -0
  244. package/dist/ee/server/src/controllers/authentication-utils/index.d.ts +5 -0
  245. package/dist/ee/server/src/controllers/authentication-utils/index.d.ts.map +1 -0
  246. package/dist/ee/server/src/controllers/authentication-utils/middlewares.d.ts +9 -0
  247. package/dist/ee/server/src/controllers/authentication-utils/middlewares.d.ts.map +1 -0
  248. package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts +55 -0
  249. package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts.map +1 -0
  250. package/dist/ee/server/src/controllers/authentication.d.ts +9 -0
  251. package/dist/ee/server/src/controllers/authentication.d.ts.map +1 -0
  252. package/dist/ee/server/src/controllers/index.d.ts +48 -0
  253. package/dist/ee/server/src/controllers/index.d.ts.map +1 -0
  254. package/dist/ee/server/src/controllers/role.d.ts +20 -0
  255. package/dist/ee/server/src/controllers/role.d.ts.map +1 -0
  256. package/dist/ee/server/src/controllers/user.d.ts +8 -0
  257. package/dist/ee/server/src/controllers/user.d.ts.map +1 -0
  258. package/dist/ee/server/src/destroy.d.ts +6 -0
  259. package/dist/ee/server/src/destroy.d.ts.map +1 -0
  260. package/dist/ee/server/src/index.d.ts +380 -0
  261. package/dist/ee/server/src/index.d.ts.map +1 -0
  262. package/dist/ee/server/src/register.d.ts +6 -0
  263. package/dist/ee/server/src/register.d.ts.map +1 -0
  264. package/dist/ee/server/src/routes/index.d.ts +47 -0
  265. package/dist/ee/server/src/routes/index.d.ts.map +1 -0
  266. package/dist/ee/server/src/routes/license-limit.d.ts +18 -0
  267. package/dist/ee/server/src/routes/license-limit.d.ts.map +1 -0
  268. package/dist/ee/server/src/routes/sso.d.ts +29 -0
  269. package/dist/ee/server/src/routes/sso.d.ts.map +1 -0
  270. package/dist/ee/server/src/routes/utils.d.ts +3 -0
  271. package/dist/ee/server/src/routes/utils.d.ts.map +1 -0
  272. package/dist/ee/server/src/services/auth.d.ts +6 -0
  273. package/dist/ee/server/src/services/auth.d.ts.map +1 -0
  274. package/dist/ee/server/src/services/index.d.ts +39 -0
  275. package/dist/ee/server/src/services/index.d.ts.map +1 -0
  276. package/dist/ee/server/src/services/metrics.d.ts +8 -0
  277. package/dist/ee/server/src/services/metrics.d.ts.map +1 -0
  278. package/dist/ee/server/src/services/passport/provider-registry.d.ts +4 -0
  279. package/dist/ee/server/src/services/passport/provider-registry.d.ts.map +1 -0
  280. package/dist/ee/server/src/services/passport/sso.d.ts +19 -0
  281. package/dist/ee/server/src/services/passport/sso.d.ts.map +1 -0
  282. package/dist/ee/server/src/services/passport.d.ts +13 -0
  283. package/dist/ee/server/src/services/passport.d.ts.map +1 -0
  284. package/dist/ee/server/src/services/role.d.ts +5 -0
  285. package/dist/ee/server/src/services/role.d.ts.map +1 -0
  286. package/dist/ee/server/src/services/seat-enforcement.d.ts +6 -0
  287. package/dist/ee/server/src/services/seat-enforcement.d.ts.map +1 -0
  288. package/dist/ee/server/src/services/user.d.ts +10 -0
  289. package/dist/ee/server/src/services/user.d.ts.map +1 -0
  290. package/dist/ee/server/src/utils/index.d.ts +11 -0
  291. package/dist/ee/server/src/utils/index.d.ts.map +1 -0
  292. package/dist/ee/server/src/utils/persisted-tables.d.ts +42 -0
  293. package/dist/ee/server/src/utils/persisted-tables.d.ts.map +1 -0
  294. package/dist/ee/server/src/utils/sso-lock.d.ts +6 -0
  295. package/dist/ee/server/src/utils/sso-lock.d.ts.map +1 -0
  296. package/dist/ee/server/src/validation/authentication.d.ts +15 -0
  297. package/dist/ee/server/src/validation/authentication.d.ts.map +1 -0
  298. package/dist/ee/server/src/validation/role.d.ts +21 -0
  299. package/dist/ee/server/src/validation/role.d.ts.map +1 -0
  300. package/dist/ee/server/src/validation/user.d.ts +19 -0
  301. package/dist/ee/server/src/validation/user.d.ts.map +1 -0
  302. package/dist/package.json.d.ts +16 -15
  303. package/dist/server/index.js +1934 -539
  304. package/dist/server/index.js.map +1 -1
  305. package/dist/server/index.mjs +1734 -338
  306. package/dist/server/index.mjs.map +1 -1
  307. package/dist/server/src/config/admin-actions.d.ts +26 -0
  308. package/dist/server/src/config/admin-actions.d.ts.map +1 -1
  309. package/dist/server/src/domain/action/index.d.ts +51 -1
  310. package/dist/server/src/domain/action/index.d.ts.map +1 -1
  311. package/dist/server/src/domain/action/provider.d.ts +10 -13
  312. package/dist/server/src/domain/action/provider.d.ts.map +1 -1
  313. package/dist/server/src/domain/condition/provider.d.ts +5 -6
  314. package/dist/server/src/domain/condition/provider.d.ts.map +1 -1
  315. package/dist/server/src/domain/permission/index.d.ts +2 -2
  316. package/dist/server/src/domain/permission/index.d.ts.map +1 -1
  317. package/dist/server/src/index.d.ts +738 -10
  318. package/dist/server/src/index.d.ts.map +1 -1
  319. package/dist/server/src/services/action.d.ts +1 -3
  320. package/dist/server/src/services/action.d.ts.map +1 -1
  321. package/dist/server/src/services/permission.d.ts +11 -18
  322. package/dist/server/src/services/permission.d.ts.map +1 -1
  323. package/dist/server/src/services/transfer/permission.d.ts +6 -2
  324. package/dist/server/src/services/transfer/permission.d.ts.map +1 -1
  325. package/dist/server/src/validation/action-provider.d.ts.map +1 -1
  326. package/dist/shared/contracts/admin.d.ts +1 -0
  327. package/dist/shared/contracts/admin.d.ts.map +1 -1
  328. package/dist/shared/contracts/user.d.ts +1 -1
  329. package/dist/shared/contracts/user.d.ts.map +1 -1
  330. package/package.json +17 -16
  331. package/dist/admin/AdminSeatInfo-E8azTFQY.js.map +0 -1
  332. package/dist/admin/AdminSeatInfo-Q_hUNC5B.mjs.map +0 -1
  333. package/dist/admin/ApplicationInfoPage-kEld-u0P.mjs.map +0 -1
  334. package/dist/admin/ApplicationInfoPage-noPIfujW.js.map +0 -1
  335. package/dist/admin/AuthenticatedLayout-kLMmhrNQ.js.map +0 -1
  336. package/dist/admin/AuthenticatedLayout-zYfAXNPg.mjs.map +0 -1
  337. package/dist/admin/ContentBox-3MRTNw0X.js +0 -43
  338. package/dist/admin/ContentBox-3MRTNw0X.js.map +0 -1
  339. package/dist/admin/ContentBox-9LBDzws0.mjs +0 -41
  340. package/dist/admin/ContentBox-9LBDzws0.mjs.map +0 -1
  341. package/dist/admin/CreatePage-0dG6JVsn.js.map +0 -1
  342. package/dist/admin/CreatePage-bJgO6DND.mjs.map +0 -1
  343. package/dist/admin/EditPage-Bx_qeoOF.mjs.map +0 -1
  344. package/dist/admin/EditPage-D5r0GV3j.mjs.map +0 -1
  345. package/dist/admin/EditPage-T7HhMiw2.js.map +0 -1
  346. package/dist/admin/EditPage-X8jnX0_l.js.map +0 -1
  347. package/dist/admin/EditPage-iksJke6K.js.map +0 -1
  348. package/dist/admin/EditPage-yBDiueEy.mjs.map +0 -1
  349. package/dist/admin/EditView-9nfADKvX.mjs.map +0 -1
  350. package/dist/admin/EditView-kxg0Wurs.js.map +0 -1
  351. package/dist/admin/EditViewPage-I5bq_bCv.js.map +0 -1
  352. package/dist/admin/EditViewPage-PmrZwoCk.mjs.map +0 -1
  353. package/dist/admin/HomePage-XakoaT95.js.map +0 -1
  354. package/dist/admin/HomePage-n2buy2O4.mjs.map +0 -1
  355. package/dist/admin/InstalledPluginsPage--BdpZuNa.js.map +0 -1
  356. package/dist/admin/InstalledPluginsPage-nFNbVJPm.mjs.map +0 -1
  357. package/dist/admin/ListPage-SnKebmiT.js.map +0 -1
  358. package/dist/admin/ListPage-iBPceR0S.mjs.map +0 -1
  359. package/dist/admin/ListPage-k3F774YE.mjs.map +0 -1
  360. package/dist/admin/ListPage-nXLMZNTC.js.map +0 -1
  361. package/dist/admin/ListPage-pdwlNZO5.mjs.map +0 -1
  362. package/dist/admin/ListPage-pwMqUvh3.js.map +0 -1
  363. package/dist/admin/MarketplacePage--aN208CJ.mjs.map +0 -1
  364. package/dist/admin/MarketplacePage-Pwwe_Pr9.js.map +0 -1
  365. package/dist/admin/ProfilePage-9GtyEQef.js.map +0 -1
  366. package/dist/admin/ProfilePage-wo_TrDuQ.mjs.map +0 -1
  367. package/dist/admin/SSOProviders-QBcyB9VI.js.map +0 -1
  368. package/dist/admin/SSOProviders-nMmBLr8g.mjs.map +0 -1
  369. package/dist/admin/SelectRoles-82KlaNv9.mjs.map +0 -1
  370. package/dist/admin/SelectRoles-iUoQ1i46.js.map +0 -1
  371. package/dist/admin/SingleSignOnPage-N3e0bw3O.mjs.map +0 -1
  372. package/dist/admin/SingleSignOnPage-xBAVG_IK.js.map +0 -1
  373. package/dist/admin/Table-M_g0IUVs.js.map +0 -1
  374. package/dist/admin/Table-YZ9eQlTc.mjs.map +0 -1
  375. package/dist/admin/Theme-7W0we6BI.js.map +0 -1
  376. package/dist/admin/Theme-PrUuuGtN.mjs.map +0 -1
  377. package/dist/admin/TokenTypeSelect-HMyBvTwA.js.map +0 -1
  378. package/dist/admin/TokenTypeSelect-vAeDNBmG.mjs.map +0 -1
  379. package/dist/admin/UseCasePage-VlWOTc-k.js.map +0 -1
  380. package/dist/admin/index-6pjQxyB0.mjs.map +0 -1
  381. package/dist/admin/index-qf9IxVeZ.js.map +0 -1
  382. package/dist/admin/src/pages/InstalledPluginsPage.d.ts +0 -3
  383. package/dist/admin/validation-ODUz3BOU.js.map +0 -1
  384. package/dist/admin/validation-YqwSDeRS.mjs.map +0 -1
  385. package/dist/ee/server/index.js +0 -2180
  386. package/dist/ee/server/index.js.map +0 -1
  387. package/dist/ee/server/index.mjs +0 -2175
  388. package/dist/ee/server/index.mjs.map +0 -1
  389. package/strapi-server.js +0 -18
@@ -1,2175 +0,0 @@
1
- import { resolve, basename, join, extname } from "path";
2
- import fse from "fs-extra";
3
- import koaStatic from "koa-static";
4
- import { isNil, castArray, merge, map, uniq, difference, differenceWith, isEqual, isEmpty, toLower, isFunction, toString, pipe, toNumber, assign, reverse, take, prop, drop, pick, mapValues, curry, includes, isArray, set, omit, has, isUndefined } from "lodash/fp";
5
- import { differenceInHours, parseISO } from "date-fns";
6
- import { errors, async, arrays, yup, validateYupSchema, env } from "@strapi/utils";
7
- import "@strapi/types";
8
- import _ from "lodash";
9
- import { Strategy } from "passport-local";
10
- import passport$2 from "koa-passport";
11
- import compose from "koa-compose";
12
- import { scheduleJob } from "node-schedule";
13
- const registerAdminPanelRoute = ({ strapi: strapi2 }) => {
14
- let buildDir = resolve(strapi2.dirs.dist.root, "build");
15
- if (!fse.pathExistsSync(buildDir)) {
16
- buildDir = resolve(__dirname, "../../build");
17
- }
18
- const serveAdminMiddleware = async (ctx, next) => {
19
- await next();
20
- if (ctx.method !== "HEAD" && ctx.method !== "GET") {
21
- return;
22
- }
23
- if (ctx.body != null || ctx.status !== 404) {
24
- return;
25
- }
26
- ctx.type = "html";
27
- ctx.body = fse.createReadStream(join(buildDir, "index.html"));
28
- };
29
- strapi2.server.routes([
30
- {
31
- method: "GET",
32
- path: `${strapi2.config.admin.path}/:path*`,
33
- handler: [
34
- serveAdminMiddleware,
35
- serveStatic(buildDir, {
36
- maxage: 31536e3,
37
- defer: false,
38
- index: "index.html",
39
- setHeaders(res, path) {
40
- const ext = extname(path);
41
- if (ext !== ".html") {
42
- res.setHeader("cache-control", "public, max-age=31536000, immutable");
43
- }
44
- }
45
- })
46
- ],
47
- config: { auth: false }
48
- }
49
- ]);
50
- };
51
- const serveStatic = (filesDir, koaStaticOptions = {}) => {
52
- const serve = koaStatic(filesDir, koaStaticOptions);
53
- return async (ctx, next) => {
54
- const prev = ctx.path;
55
- const newPath = basename(ctx.path);
56
- ctx.path = newPath;
57
- await serve(ctx, async () => {
58
- ctx.path = prev;
59
- await next();
60
- ctx.path = newPath;
61
- });
62
- ctx.path = prev;
63
- };
64
- };
65
- const getService$1 = (name2) => {
66
- return strapi.service(`admin::${name2}`);
67
- };
68
- const authenticate$2 = async (ctx) => {
69
- const { authorization } = ctx.request.header;
70
- if (!authorization) {
71
- return { authenticated: false };
72
- }
73
- const parts = authorization.split(/\s+/);
74
- if (parts[0].toLowerCase() !== "bearer" || parts.length !== 2) {
75
- return { authenticated: false };
76
- }
77
- const token = parts[1];
78
- const { payload, isValid } = getService$1("token").decodeJwtToken(token);
79
- if (!isValid) {
80
- return { authenticated: false };
81
- }
82
- const user2 = await strapi.db.query("admin::user").findOne({ where: { id: payload.id }, populate: ["roles"] });
83
- if (!user2 || !(user2.isActive === true)) {
84
- return { authenticated: false };
85
- }
86
- const userAbility = await getService$1("permission").engine.generateUserAbility(user2);
87
- ctx.state.userAbility = userAbility;
88
- ctx.state.user = user2;
89
- return {
90
- authenticated: true,
91
- credentials: user2,
92
- ability: userAbility
93
- };
94
- };
95
- const name = "admin";
96
- const adminAuthStrategy = {
97
- name,
98
- authenticate: authenticate$2
99
- };
100
- const DAY_IN_MS = 24 * 60 * 60 * 1e3;
101
- const constants = {
102
- CONTENT_TYPE_SECTION: "contentTypes",
103
- SUPER_ADMIN_CODE: "strapi-super-admin",
104
- EDITOR_CODE: "strapi-editor",
105
- AUTHOR_CODE: "strapi-author",
106
- READ_ACTION: "plugin::content-manager.explorer.read",
107
- CREATE_ACTION: "plugin::content-manager.explorer.create",
108
- UPDATE_ACTION: "plugin::content-manager.explorer.update",
109
- DELETE_ACTION: "plugin::content-manager.explorer.delete",
110
- PUBLISH_ACTION: "plugin::content-manager.explorer.publish",
111
- API_TOKEN_TYPE: {
112
- READ_ONLY: "read-only",
113
- FULL_ACCESS: "full-access",
114
- CUSTOM: "custom"
115
- },
116
- // The front-end only displays these values
117
- API_TOKEN_LIFESPANS: {
118
- UNLIMITED: null,
119
- DAYS_7: 7 * DAY_IN_MS,
120
- DAYS_30: 30 * DAY_IN_MS,
121
- DAYS_90: 90 * DAY_IN_MS
122
- },
123
- TRANSFER_TOKEN_TYPE: {
124
- PUSH: "push",
125
- PULL: "pull"
126
- },
127
- TRANSFER_TOKEN_LIFESPANS: {
128
- UNLIMITED: null,
129
- DAYS_7: 7 * DAY_IN_MS,
130
- DAYS_30: 30 * DAY_IN_MS,
131
- DAYS_90: 90 * DAY_IN_MS
132
- }
133
- };
134
- const { UnauthorizedError: UnauthorizedError$1, ForbiddenError: ForbiddenError$1 } = errors;
135
- const isReadScope = (scope) => scope.endsWith("find") || scope.endsWith("findOne");
136
- const extractToken = (ctx) => {
137
- if (ctx.request && ctx.request.header && ctx.request.header.authorization) {
138
- const parts = ctx.request.header.authorization.split(/\s+/);
139
- if (parts[0].toLowerCase() !== "bearer" || parts.length !== 2) {
140
- return null;
141
- }
142
- return parts[1];
143
- }
144
- return null;
145
- };
146
- const authenticate$1 = async (ctx) => {
147
- const apiTokenService = getService$1("api-token");
148
- const token = extractToken(ctx);
149
- if (!token) {
150
- return { authenticated: false };
151
- }
152
- const apiToken = await apiTokenService.getBy({
153
- accessKey: apiTokenService.hash(token)
154
- });
155
- if (!apiToken) {
156
- return { authenticated: false };
157
- }
158
- const currentDate = /* @__PURE__ */ new Date();
159
- if (!isNil(apiToken.expiresAt)) {
160
- const expirationDate = new Date(apiToken.expiresAt);
161
- if (expirationDate < currentDate) {
162
- return { authenticated: false, error: new UnauthorizedError$1("Token expired") };
163
- }
164
- }
165
- const hoursSinceLastUsed = differenceInHours(currentDate, parseISO(apiToken.lastUsedAt));
166
- if (hoursSinceLastUsed >= 1) {
167
- await strapi.db.query("admin::api-token").update({
168
- where: { id: apiToken.id },
169
- data: { lastUsedAt: currentDate }
170
- });
171
- }
172
- if (apiToken.type === constants.API_TOKEN_TYPE.CUSTOM) {
173
- const ability = await strapi.contentAPI.permissions.engine.generateAbility(
174
- apiToken.permissions.map((action) => ({ action }))
175
- );
176
- return { authenticated: true, ability, credentials: apiToken };
177
- }
178
- return { authenticated: true, credentials: apiToken };
179
- };
180
- const verify = (auth2, config) => {
181
- const { credentials: apiToken, ability } = auth2;
182
- if (!apiToken) {
183
- throw new UnauthorizedError$1("Token not found");
184
- }
185
- const currentDate = /* @__PURE__ */ new Date();
186
- if (!isNil(apiToken.expiresAt)) {
187
- const expirationDate = new Date(apiToken.expiresAt);
188
- if (expirationDate < currentDate) {
189
- throw new UnauthorizedError$1("Token expired");
190
- }
191
- }
192
- if (apiToken.type === constants.API_TOKEN_TYPE.FULL_ACCESS) {
193
- return;
194
- }
195
- if (apiToken.type === constants.API_TOKEN_TYPE.READ_ONLY) {
196
- const scopes = castArray(config.scope);
197
- if (config.scope && scopes.every(isReadScope)) {
198
- return;
199
- }
200
- } else if (apiToken.type === constants.API_TOKEN_TYPE.CUSTOM) {
201
- if (!ability) {
202
- throw new ForbiddenError$1();
203
- }
204
- const scopes = castArray(config.scope);
205
- const isAllowed = scopes.every((scope) => ability.can(scope));
206
- if (isAllowed) {
207
- return;
208
- }
209
- }
210
- throw new ForbiddenError$1();
211
- };
212
- const apiTokenAuthStrategy = {
213
- name: "api-token",
214
- authenticate: authenticate$1,
215
- verify
216
- };
217
- const executeCERegister = ({ strapi: strapi2 }) => {
218
- const passportMiddleware = strapi2.service("admin::passport").init();
219
- strapi2.server.api("admin").use(passportMiddleware);
220
- strapi2.get("auth").register("admin", adminAuthStrategy);
221
- strapi2.get("auth").register("content-api", apiTokenAuthStrategy);
222
- if (strapi2.config.get("admin.serveAdminPanel")) {
223
- registerAdminPanelRoute({ strapi: strapi2 });
224
- }
225
- };
226
- const register = async ({ strapi: strapi2 }) => {
227
- await executeCERegister({ strapi: strapi2 });
228
- };
229
- const actions$1 = [
230
- {
231
- uid: "marketplace.read",
232
- displayName: "Access the marketplace",
233
- pluginName: "admin",
234
- section: "settings",
235
- category: "plugins and marketplace",
236
- subCategory: "marketplace"
237
- },
238
- {
239
- uid: "webhooks.create",
240
- displayName: "Create",
241
- pluginName: "admin",
242
- section: "settings",
243
- category: "webhooks"
244
- },
245
- {
246
- uid: "webhooks.read",
247
- displayName: "Read",
248
- pluginName: "admin",
249
- section: "settings",
250
- category: "webhooks"
251
- },
252
- {
253
- uid: "webhooks.update",
254
- displayName: "Update",
255
- pluginName: "admin",
256
- section: "settings",
257
- category: "webhooks"
258
- },
259
- {
260
- uid: "webhooks.delete",
261
- displayName: "Delete",
262
- pluginName: "admin",
263
- section: "settings",
264
- category: "webhooks"
265
- },
266
- {
267
- uid: "users.create",
268
- displayName: "Create (invite)",
269
- pluginName: "admin",
270
- section: "settings",
271
- category: "users and roles",
272
- subCategory: "users"
273
- },
274
- {
275
- uid: "users.read",
276
- displayName: "Read",
277
- pluginName: "admin",
278
- section: "settings",
279
- category: "users and roles",
280
- subCategory: "users"
281
- },
282
- {
283
- uid: "users.update",
284
- displayName: "Update",
285
- pluginName: "admin",
286
- section: "settings",
287
- category: "users and roles",
288
- subCategory: "users"
289
- },
290
- {
291
- uid: "users.delete",
292
- displayName: "Delete",
293
- pluginName: "admin",
294
- section: "settings",
295
- category: "users and roles",
296
- subCategory: "users"
297
- },
298
- {
299
- uid: "roles.create",
300
- displayName: "Create",
301
- pluginName: "admin",
302
- section: "settings",
303
- category: "users and roles",
304
- subCategory: "roles"
305
- },
306
- {
307
- uid: "roles.read",
308
- displayName: "Read",
309
- pluginName: "admin",
310
- section: "settings",
311
- category: "users and roles",
312
- subCategory: "roles"
313
- },
314
- {
315
- uid: "roles.update",
316
- displayName: "Update",
317
- pluginName: "admin",
318
- section: "settings",
319
- category: "users and roles",
320
- subCategory: "roles"
321
- },
322
- {
323
- uid: "roles.delete",
324
- displayName: "Delete",
325
- pluginName: "admin",
326
- section: "settings",
327
- category: "users and roles",
328
- subCategory: "roles"
329
- },
330
- {
331
- uid: "api-tokens.access",
332
- displayName: "Access the API tokens settings page",
333
- pluginName: "admin",
334
- section: "settings",
335
- category: "api tokens",
336
- subCategory: "api Tokens"
337
- },
338
- {
339
- uid: "api-tokens.create",
340
- displayName: "Create (generate)",
341
- pluginName: "admin",
342
- section: "settings",
343
- category: "api tokens",
344
- subCategory: "general"
345
- },
346
- {
347
- uid: "api-tokens.read",
348
- displayName: "Read",
349
- pluginName: "admin",
350
- section: "settings",
351
- category: "api tokens",
352
- subCategory: "general"
353
- },
354
- {
355
- uid: "api-tokens.update",
356
- displayName: "Update",
357
- pluginName: "admin",
358
- section: "settings",
359
- category: "api tokens",
360
- subCategory: "general"
361
- },
362
- {
363
- uid: "api-tokens.regenerate",
364
- displayName: "Regenerate",
365
- pluginName: "admin",
366
- section: "settings",
367
- category: "api tokens",
368
- subCategory: "general"
369
- },
370
- {
371
- uid: "api-tokens.delete",
372
- displayName: "Delete (revoke)",
373
- pluginName: "admin",
374
- section: "settings",
375
- category: "api tokens",
376
- subCategory: "general"
377
- },
378
- {
379
- uid: "project-settings.update",
380
- displayName: "Update the project level settings",
381
- pluginName: "admin",
382
- section: "settings",
383
- category: "project"
384
- },
385
- {
386
- uid: "project-settings.read",
387
- displayName: "Read the project level settings",
388
- pluginName: "admin",
389
- section: "settings",
390
- category: "project"
391
- },
392
- {
393
- uid: "transfer.tokens.access",
394
- displayName: "Access the transfer tokens settings page",
395
- pluginName: "admin",
396
- section: "settings",
397
- category: "transfer tokens",
398
- subCategory: "transfer tokens"
399
- },
400
- {
401
- uid: "transfer.tokens.create",
402
- displayName: "Create (generate)",
403
- pluginName: "admin",
404
- section: "settings",
405
- category: "transfer tokens",
406
- subCategory: "general"
407
- },
408
- {
409
- uid: "transfer.tokens.read",
410
- displayName: "Read",
411
- pluginName: "admin",
412
- section: "settings",
413
- category: "transfer tokens",
414
- subCategory: "general"
415
- },
416
- {
417
- uid: "transfer.tokens.update",
418
- displayName: "Update",
419
- pluginName: "admin",
420
- section: "settings",
421
- category: "transfer tokens",
422
- subCategory: "general"
423
- },
424
- {
425
- uid: "transfer.tokens.regenerate",
426
- displayName: "Regenerate",
427
- pluginName: "admin",
428
- section: "settings",
429
- category: "transfer tokens",
430
- subCategory: "general"
431
- },
432
- {
433
- uid: "transfer.tokens.delete",
434
- displayName: "Delete (revoke)",
435
- pluginName: "admin",
436
- section: "settings",
437
- category: "transfer tokens",
438
- subCategory: "general"
439
- }
440
- ];
441
- const adminActions = {
442
- actions: actions$1
443
- };
444
- const conditions = [
445
- {
446
- displayName: "Is creator",
447
- name: "is-creator",
448
- plugin: "admin",
449
- handler: (user2) => ({ "createdBy.id": user2.id })
450
- },
451
- {
452
- displayName: "Has same role as creator",
453
- name: "has-same-role-as-creator",
454
- plugin: "admin",
455
- handler: (user2) => ({
456
- "createdBy.roles": {
457
- $elemMatch: {
458
- id: {
459
- $in: user2.roles.map((r) => r.id)
460
- }
461
- }
462
- }
463
- })
464
- }
465
- ];
466
- const adminConditions = {
467
- conditions
468
- };
469
- const defaultAdminAuthSettings = {
470
- providers: {
471
- autoRegister: false,
472
- defaultRole: null,
473
- ssoLockedRoles: null
474
- }
475
- };
476
- const registerPermissionActions = async () => {
477
- await getService$1("permission").actionProvider.registerMany(adminActions.actions);
478
- };
479
- const registerAdminConditions = async () => {
480
- await getService$1("permission").conditionProvider.registerMany(adminConditions.conditions);
481
- };
482
- const registerModelHooks = () => {
483
- const { sendDidChangeInterfaceLanguage } = getService$1("metrics");
484
- strapi.db.lifecycles.subscribe({
485
- models: ["admin::user"],
486
- afterCreate: sendDidChangeInterfaceLanguage,
487
- afterDelete: sendDidChangeInterfaceLanguage,
488
- afterUpdate({ params }) {
489
- if (params.data.preferedLanguage) {
490
- sendDidChangeInterfaceLanguage();
491
- }
492
- }
493
- });
494
- };
495
- const syncAuthSettings = async () => {
496
- const adminStore = await strapi.store({ type: "core", name: "admin" });
497
- const adminAuthSettings = await adminStore.get({ key: "auth" });
498
- const newAuthSettings = merge(defaultAdminAuthSettings, adminAuthSettings);
499
- const roleExists = await getService$1("role").exists({
500
- id: newAuthSettings.providers.defaultRole
501
- });
502
- if (!roleExists) {
503
- newAuthSettings.providers.defaultRole = null;
504
- }
505
- await adminStore.set({ key: "auth", value: newAuthSettings });
506
- };
507
- const syncAPITokensPermissions = async () => {
508
- const validPermissions = strapi.contentAPI.permissions.providers.action.keys();
509
- const permissionsInDB = await async.pipe(
510
- strapi.db.query("admin::api-token-permission").findMany,
511
- map("action")
512
- )();
513
- const unknownPermissions = uniq(difference(permissionsInDB, validPermissions));
514
- if (unknownPermissions.length > 0) {
515
- await strapi.db.query("admin::api-token-permission").deleteMany({ where: { action: { $in: unknownPermissions } } });
516
- }
517
- };
518
- const executeCEBootstrap = async ({ strapi: strapi2 }) => {
519
- await registerAdminConditions();
520
- await registerPermissionActions();
521
- registerModelHooks();
522
- const permissionService = getService$1("permission");
523
- const userService = getService$1("user");
524
- const roleService = getService$1("role");
525
- const apiTokenService = getService$1("api-token");
526
- const transferService = getService$1("transfer");
527
- const tokenService = getService$1("token");
528
- await roleService.createRolesIfNoneExist();
529
- await roleService.resetSuperAdminPermissions();
530
- await roleService.displayWarningIfNoSuperAdmin();
531
- await permissionService.cleanPermissionsInDatabase();
532
- await userService.displayWarningIfUsersDontHaveRole();
533
- await syncAuthSettings();
534
- await syncAPITokensPermissions();
535
- await getService$1("metrics").sendUpdateProjectInformation(strapi2);
536
- getService$1("metrics").startCron(strapi2);
537
- apiTokenService.checkSaltIsDefined();
538
- transferService.token.checkSaltIsDefined();
539
- tokenService.checkSecretIsDefined();
540
- };
541
- const getService = (name2, { strapi: strapi2 } = { strapi: global.strapi }) => {
542
- return strapi2.service(`admin::${name2}`);
543
- };
544
- const actions = {
545
- sso: [
546
- {
547
- uid: "provider-login.read",
548
- displayName: "Read",
549
- pluginName: "admin",
550
- section: "settings",
551
- category: "single sign on",
552
- subCategory: "options"
553
- },
554
- {
555
- uid: "provider-login.update",
556
- displayName: "Update",
557
- pluginName: "admin",
558
- section: "settings",
559
- category: "single sign on",
560
- subCategory: "options"
561
- }
562
- ],
563
- auditLogs: [
564
- {
565
- uid: "audit-logs.read",
566
- displayName: "Read",
567
- pluginName: "admin",
568
- section: "settings",
569
- category: "audit logs",
570
- subCategory: "options"
571
- }
572
- ]
573
- };
574
- const transformTableName = (table) => {
575
- if (typeof table === "string") {
576
- return { name: table };
577
- }
578
- return table;
579
- };
580
- async function findTables({ strapi: strapi2 }, regex) {
581
- const tables = await strapi2.db.dialect.schemaInspector.getTables();
582
- return tables.filter((tableName) => regex.test(tableName));
583
- }
584
- async function addPersistTables({ strapi: strapi2 }, tableNames) {
585
- const persistedTables = await getPersistedTables({ strapi: strapi2 });
586
- const tables = tableNames.map(transformTableName);
587
- const notPersistedTableNames = differenceWith(isEqual, tables, persistedTables);
588
- const tablesToPersist = differenceWith(
589
- (t1, t2) => t1.name === t2.name,
590
- persistedTables,
591
- notPersistedTableNames
592
- );
593
- if (!notPersistedTableNames.length) {
594
- return;
595
- }
596
- tablesToPersist.push(...notPersistedTableNames);
597
- await strapi2.store.set({
598
- type: "core",
599
- key: "persisted_tables",
600
- value: tablesToPersist
601
- });
602
- }
603
- async function getPersistedTables({ strapi: strapi2 }) {
604
- const persistedTables = await strapi2.store.get({
605
- type: "core",
606
- key: "persisted_tables"
607
- });
608
- return (persistedTables || []).map(transformTableName);
609
- }
610
- const persistTablesWithPrefix = async (tableNamePrefix) => {
611
- const tableNameRegex = new RegExp(`^${tableNamePrefix}.*`);
612
- const tableNames = await findTables({ strapi }, tableNameRegex);
613
- await addPersistTables({ strapi }, tableNames);
614
- };
615
- const bootstrap = async (args) => {
616
- const { actionProvider } = getService("permission");
617
- if (strapi.ee.features.isEnabled("sso")) {
618
- await actionProvider.registerMany(actions.sso);
619
- }
620
- if (strapi.ee.features.isEnabled("audit-logs")) {
621
- await persistTablesWithPrefix("strapi_audit_logs");
622
- await actionProvider.registerMany(actions.auditLogs);
623
- }
624
- await getService("seat-enforcement").seatEnforcementWorkflow();
625
- await executeCEBootstrap(args);
626
- };
627
- const executeCEDestroy = async () => {
628
- const { conditionProvider, actionProvider } = getService$1("permission");
629
- await conditionProvider.clear();
630
- await actionProvider.clear();
631
- };
632
- const destroy = async ({ strapi: strapi2 }) => {
633
- await executeCEDestroy();
634
- };
635
- const adminContentTypes = {};
636
- const isSsoLocked = async (user2) => {
637
- if (!strapi.ee.features.isEnabled("sso")) {
638
- return false;
639
- }
640
- if (!user2) {
641
- throw new Error("Missing user object");
642
- }
643
- const adminStore = await strapi.store({ type: "core", name: "admin" });
644
- const { providers } = await adminStore.get({ key: "auth" });
645
- const lockedRoles = providers.ssoLockedRoles ?? [];
646
- if (isEmpty(lockedRoles)) {
647
- return false;
648
- }
649
- const roles2 = (
650
- // If the roles are pre-loaded for the given user, then use them
651
- user2.roles ?? // Otherwise, try to load the role based on the given user ID
652
- await strapi.db.query("admin::user").load(user2, "roles", { roles: { fields: ["id"] } }) ?? // If the query fails somehow, default to an empty array
653
- []
654
- );
655
- const isLocked = lockedRoles.some(
656
- (lockedId) => (
657
- // lockedRoles will be a string to avoid issues with frontend and bigints
658
- roles2.some((role2) => lockedId === role2.id.toString())
659
- )
660
- );
661
- return isLocked;
662
- };
663
- const { ApplicationError: ApplicationError$2 } = errors;
664
- const forgotPassword = async ({ email: email2 } = {}) => {
665
- const user2 = await strapi.db.query("admin::user").findOne({ where: { email: email2, isActive: true } });
666
- if (!user2 || await isSsoLocked(user2)) {
667
- return;
668
- }
669
- const resetPasswordToken = getService("token").createToken();
670
- await getService("user").updateById(user2.id, { resetPasswordToken });
671
- const url = `${strapi.config.get(
672
- "admin.absoluteUrl"
673
- )}/auth/reset-password?code=${resetPasswordToken}`;
674
- return strapi.plugin("email").service("email").sendTemplatedEmail(
675
- {
676
- to: user2.email,
677
- from: strapi.config.get("admin.forgotPassword.from"),
678
- replyTo: strapi.config.get("admin.forgotPassword.replyTo")
679
- },
680
- strapi.config.get("admin.forgotPassword.emailTemplate"),
681
- {
682
- url,
683
- user: _.pick(user2, ["email", "firstname", "lastname", "username"])
684
- }
685
- ).catch((err) => {
686
- strapi.log.error(err);
687
- });
688
- };
689
- const resetPassword = async ({ resetPasswordToken, password: password2 } = {}) => {
690
- const matchingUser = await strapi.db.query("admin::user").findOne({ where: { resetPasswordToken, isActive: true } });
691
- if (!matchingUser || await isSsoLocked(matchingUser)) {
692
- throw new ApplicationError$2();
693
- }
694
- return getService("user").updateById(matchingUser.id, {
695
- password: password2,
696
- resetPasswordToken: null
697
- });
698
- };
699
- const auth = {
700
- forgotPassword,
701
- resetPassword
702
- };
703
- const createLocalStrategy = (strapi2, middleware) => {
704
- return new Strategy(
705
- {
706
- usernameField: "email",
707
- passwordField: "password",
708
- session: false
709
- },
710
- (email2, password2, done) => {
711
- return getService$1("auth").checkCredentials({ email: toLower(email2), password: password2 }).then(async ([error, user2, message]) => {
712
- if (middleware) {
713
- return middleware([error, user2, message], done);
714
- }
715
- return done(error, user2, message);
716
- }).catch((error) => done(error));
717
- }
718
- );
719
- };
720
- const authEventsMapper = {
721
- onConnectionSuccess: "admin.auth.success",
722
- onConnectionError: "admin.auth.error"
723
- };
724
- const valueIsFunctionType = ([, value]) => isFunction(value);
725
- const keyIsValidEventName = ([key]) => {
726
- return Object.keys(strapi.service("admin::passport").authEventsMapper).includes(key);
727
- };
728
- const getPassportStrategies$1 = () => [createLocalStrategy(strapi)];
729
- const registerAuthEvents = () => {
730
- const { events = {} } = strapi.config.get("admin.auth", {});
731
- const { authEventsMapper: authEventsMapper2 } = strapi.service("admin::passport");
732
- const eventList = Object.entries(events).filter(keyIsValidEventName).filter(valueIsFunctionType);
733
- for (const [eventName, handler] of eventList) {
734
- strapi.eventHub.on(authEventsMapper2[eventName], handler);
735
- }
736
- };
737
- const init = () => {
738
- strapi.service("admin::passport").getPassportStrategies().forEach((strategy) => passport$2.use(strategy));
739
- registerAuthEvents();
740
- return passport$2.initialize();
741
- };
742
- const passport$1 = { init, getPassportStrategies: getPassportStrategies$1, authEventsMapper };
743
- const createProviderRegistry = () => {
744
- const registry = /* @__PURE__ */ new Map();
745
- Object.assign(registry, {
746
- register(provider) {
747
- if (strapi.isLoaded) {
748
- throw new Error(`You can't register new provider after the bootstrap`);
749
- }
750
- this.set(provider.uid, provider);
751
- },
752
- registerMany(providers) {
753
- providers.forEach((provider) => {
754
- this.register(provider);
755
- });
756
- },
757
- getAll() {
758
- return Array.from(this.values());
759
- }
760
- });
761
- return registry;
762
- };
763
- const providerRegistry = createProviderRegistry();
764
- const errorMessage = "SSO is disabled. Its functionnalities cannot be accessed.";
765
- const getStrategyCallbackURL = (providerName) => {
766
- if (!strapi.ee.features.isEnabled("sso")) {
767
- throw new Error(errorMessage);
768
- }
769
- return `/admin/connect/${providerName}`;
770
- };
771
- const syncProviderRegistryWithConfig = () => {
772
- if (!strapi.ee.features.isEnabled("sso")) {
773
- throw new Error(errorMessage);
774
- }
775
- const { providers = [] } = strapi.config.get("admin.auth", {});
776
- providerRegistry.registerMany(providers);
777
- };
778
- const SSOAuthEventsMapper = {
779
- onSSOAutoRegistration: "admin.auth.autoRegistration"
780
- };
781
- const sso$1 = {
782
- providerRegistry,
783
- getStrategyCallbackURL,
784
- syncProviderRegistryWithConfig,
785
- authEventsMapper: { ...passport$1.authEventsMapper, ...SSOAuthEventsMapper }
786
- };
787
- const { UnauthorizedError } = errors;
788
- const localStrategyMiddleware = async ([error, user2, message], done) => {
789
- if (user2 && !error && await isSsoLocked(user2)) {
790
- return done(
791
- new UnauthorizedError("Login not allowed, please contact your administrator", {
792
- code: "LOGIN_NOT_ALLOWED"
793
- }),
794
- user2,
795
- message
796
- );
797
- }
798
- return done(error, user2, message);
799
- };
800
- const getPassportStrategies = () => {
801
- if (!strapi.ee.features.isEnabled("sso")) {
802
- return [createLocalStrategy(strapi)];
803
- }
804
- const localStrategy = createLocalStrategy(strapi, localStrategyMiddleware);
805
- if (!strapi.isLoaded) {
806
- sso$1.syncProviderRegistryWithConfig();
807
- }
808
- const providers = sso$1.providerRegistry.getAll();
809
- const strategies = providers.map((provider) => provider.createStrategy(strapi));
810
- return [localStrategy, ...strategies];
811
- };
812
- const passport = {
813
- getPassportStrategies,
814
- ...sso$1
815
- };
816
- const { ApplicationError: ApplicationError$1 } = errors;
817
- const ssoCheckRolesIdForDeletion = async (ids) => {
818
- const adminStore = await strapi.store({ type: "core", name: "admin" });
819
- const {
820
- providers: { defaultRole }
821
- } = await adminStore.get({ key: "auth" });
822
- for (const roleId of ids) {
823
- if (defaultRole && toString(defaultRole) === toString(roleId)) {
824
- throw new ApplicationError$1(
825
- "This role is used as the default SSO role. Make sure to change this configuration before deleting the role"
826
- );
827
- }
828
- }
829
- };
830
- const role$1 = {
831
- ssoCheckRolesIdForDeletion
832
- };
833
- const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$2 } = constants;
834
- const hasSuperAdminRole = (user2) => {
835
- return user2.roles.filter((role2) => role2.code === SUPER_ADMIN_CODE$2).length > 0;
836
- };
837
- const { ValidationError: ValidationError$1 } = errors;
838
- const { SUPER_ADMIN_CODE: SUPER_ADMIN_CODE$1 } = constants;
839
- const updateEEDisabledUsersList = async (id, input) => {
840
- const disabledUsers = await getService("seat-enforcement").getDisabledUserList();
841
- if (!disabledUsers) {
842
- return;
843
- }
844
- const user2 = disabledUsers.find((user22) => user22.id === Number(id));
845
- if (!user2) {
846
- return;
847
- }
848
- if (user2.isActive !== input.isActive) {
849
- const newDisabledUsersList = disabledUsers.filter((user22) => user22.id !== Number(id));
850
- await strapi.store.set({
851
- type: "ee",
852
- key: "disabled_users",
853
- value: newDisabledUsersList
854
- });
855
- }
856
- };
857
- const castNumberArray = pipe(castArray, map(toNumber));
858
- const removeFromEEDisabledUsersList = async (ids) => {
859
- let idsToCheck;
860
- if (typeof ids === "object") {
861
- idsToCheck = castNumberArray(ids);
862
- } else {
863
- idsToCheck = [Number(ids)];
864
- }
865
- const disabledUsers = await getService("seat-enforcement").getDisabledUserList();
866
- if (!disabledUsers) {
867
- return;
868
- }
869
- const newDisabledUsersList = disabledUsers.filter((user2) => !idsToCheck.includes(user2.id));
870
- await strapi.store.set({
871
- type: "ee",
872
- key: "disabled_users",
873
- value: newDisabledUsersList
874
- });
875
- };
876
- const updateById = async (id, attributes) => {
877
- if (_.has(attributes, "roles")) {
878
- const lastAdminUser = await isLastSuperAdminUser(id);
879
- const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
880
- const willRemoveSuperAdminRole = !arrays.includesString(attributes.roles, superAdminRole.id);
881
- if (lastAdminUser && willRemoveSuperAdminRole) {
882
- throw new ValidationError$1("You must have at least one user with super admin role.");
883
- }
884
- }
885
- if (attributes.isActive === false) {
886
- const lastAdminUser = await isLastSuperAdminUser(id);
887
- if (lastAdminUser) {
888
- throw new ValidationError$1("You must have at least one user with super admin role.");
889
- }
890
- }
891
- if (_.has(attributes, "password")) {
892
- const hashedPassword = await getService("auth").hashPassword(attributes.password);
893
- const updatedUser2 = await strapi.db.query("admin::user").update({
894
- where: { id },
895
- data: {
896
- ...attributes,
897
- password: hashedPassword
898
- },
899
- populate: ["roles"]
900
- });
901
- strapi.eventHub.emit("user.update", { user: sanitizeUser(updatedUser2) });
902
- return updatedUser2;
903
- }
904
- const updatedUser = await strapi.db.query("admin::user").update({
905
- where: { id },
906
- data: attributes,
907
- populate: ["roles"]
908
- });
909
- await updateEEDisabledUsersList(id, attributes);
910
- if (updatedUser) {
911
- strapi.eventHub.emit("user.update", { user: sanitizeUser(updatedUser) });
912
- }
913
- return updatedUser;
914
- };
915
- const deleteById = async (id) => {
916
- const userToDelete = await strapi.db.query("admin::user").findOne({
917
- where: { id },
918
- populate: ["roles"]
919
- });
920
- if (!userToDelete) {
921
- return null;
922
- }
923
- if (userToDelete) {
924
- if (userToDelete.roles.some((r) => r.code === SUPER_ADMIN_CODE$1)) {
925
- const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
926
- if (superAdminRole.usersCount === 1) {
927
- throw new ValidationError$1("You must have at least one user with super admin role.");
928
- }
929
- }
930
- }
931
- const deletedUser = await strapi.db.query("admin::user").delete({ where: { id }, populate: ["roles"] });
932
- await removeFromEEDisabledUsersList(id);
933
- strapi.eventHub.emit("user.delete", { user: sanitizeUser(deletedUser) });
934
- return deletedUser;
935
- };
936
- const deleteByIds = async (ids) => {
937
- const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
938
- const nbOfSuperAdminToDelete = await strapi.db.query("admin::user").count({
939
- where: {
940
- id: ids,
941
- roles: { id: superAdminRole.id }
942
- }
943
- });
944
- if (superAdminRole.usersCount === nbOfSuperAdminToDelete) {
945
- throw new ValidationError$1("You must have at least one user with super admin role.");
946
- }
947
- const deletedUsers = [];
948
- for (const id of ids) {
949
- const deletedUser = await strapi.db.query("admin::user").delete({
950
- where: { id },
951
- populate: ["roles"]
952
- });
953
- deletedUsers.push(deletedUser);
954
- }
955
- await removeFromEEDisabledUsersList(ids);
956
- strapi.eventHub.emit("user.delete", {
957
- users: deletedUsers.map((deletedUser) => sanitizeUser(deletedUser))
958
- });
959
- return deletedUsers;
960
- };
961
- const sanitizeUserRoles = (role2) => _.pick(role2, ["id", "name", "description", "code"]);
962
- const isLastSuperAdminUser = async (userId) => {
963
- const user2 = await findOne(userId);
964
- const superAdminRole = await getService("role").getSuperAdminWithUsersCount();
965
- return superAdminRole.usersCount === 1 && hasSuperAdminRole(user2);
966
- };
967
- const sanitizeUser = (user2) => {
968
- return {
969
- ..._.omit(user2, ["password", "resetPasswordToken", "registrationToken", "roles"]),
970
- roles: user2.roles && user2.roles.map(sanitizeUserRoles)
971
- };
972
- };
973
- const findOne = async (id, populate = ["roles"]) => {
974
- return strapi.db.query("admin::user").findOne({ where: { id }, populate });
975
- };
976
- const getCurrentActiveUserCount = async () => {
977
- return strapi.db.query("admin::user").count({ where: { isActive: true } });
978
- };
979
- const user$1 = {
980
- updateEEDisabledUsersList,
981
- removeFromEEDisabledUsersList,
982
- getCurrentActiveUserCount,
983
- deleteByIds,
984
- deleteById,
985
- updateById
986
- };
987
- const getSSOProvidersList = async () => {
988
- const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
989
- return providerRegistry2.getAll().map(({ uid }) => uid);
990
- };
991
- const sendUpdateProjectInformation = async (strapi2) => {
992
- let groupProperties = {};
993
- const numberOfActiveAdminUsers = await getService("user").count({ isActive: true });
994
- const numberOfAdminUsers = await getService("user").count();
995
- if (strapi2.ee.features.isEnabled("sso")) {
996
- const SSOProviders = await getSSOProvidersList();
997
- groupProperties = assign(groupProperties, {
998
- SSOProviders,
999
- isSSOConfigured: SSOProviders.length !== 0
1000
- });
1001
- }
1002
- if (strapi2.ee.features.isEnabled("cms-content-releases")) {
1003
- const numberOfContentReleases = await strapi2.db.query("plugin::content-releases.release").count();
1004
- const numberOfPublishedContentReleases = await strapi2.db.query("plugin::content-releases.release").count({
1005
- filters: { releasedAt: { $notNull: true } }
1006
- });
1007
- groupProperties = assign(groupProperties, {
1008
- numberOfContentReleases,
1009
- numberOfPublishedContentReleases
1010
- });
1011
- }
1012
- groupProperties = assign(groupProperties, { numberOfActiveAdminUsers, numberOfAdminUsers });
1013
- strapi2.telemetry.send("didUpdateProjectInformation", {
1014
- groupProperties
1015
- });
1016
- };
1017
- const startCron = (strapi2) => {
1018
- strapi2.cron.add({
1019
- "0 0 0 * * *": () => sendUpdateProjectInformation(strapi2)
1020
- });
1021
- };
1022
- const metrics = { startCron, getSSOProvidersList, sendUpdateProjectInformation };
1023
- const { SUPER_ADMIN_CODE } = constants;
1024
- const getDisabledUserList = async () => {
1025
- return strapi.store.get({ type: "ee", key: "disabled_users" });
1026
- };
1027
- const enableMaximumUserCount = async (numberOfUsersToEnable) => {
1028
- const disabledUsers = await getDisabledUserList();
1029
- const orderedDisabledUsers = reverse(disabledUsers);
1030
- const usersToEnable = take(numberOfUsersToEnable, orderedDisabledUsers);
1031
- await strapi.db.query("admin::user").updateMany({
1032
- where: { id: map(prop("id"), usersToEnable) },
1033
- data: { isActive: true }
1034
- });
1035
- const remainingDisabledUsers = drop(numberOfUsersToEnable, orderedDisabledUsers);
1036
- await strapi.store.set({
1037
- type: "ee",
1038
- key: "disabled_users",
1039
- value: remainingDisabledUsers
1040
- });
1041
- };
1042
- const disableUsersAboveLicenseLimit = async (numberOfUsersToDisable) => {
1043
- const currentlyDisabledUsers = await getDisabledUserList() ?? [];
1044
- const usersToDisable = [];
1045
- const nonSuperAdminUsersToDisable = await strapi.db.query("admin::user").findMany({
1046
- where: {
1047
- isActive: true,
1048
- roles: {
1049
- code: { $ne: SUPER_ADMIN_CODE }
1050
- }
1051
- },
1052
- orderBy: { createdAt: "DESC" },
1053
- limit: numberOfUsersToDisable
1054
- });
1055
- usersToDisable.push(...nonSuperAdminUsersToDisable);
1056
- if (nonSuperAdminUsersToDisable.length < numberOfUsersToDisable) {
1057
- const superAdminUsersToDisable = await strapi.db.query("admin::user").findMany({
1058
- where: {
1059
- isActive: true,
1060
- roles: { code: SUPER_ADMIN_CODE }
1061
- },
1062
- orderBy: { createdAt: "DESC" },
1063
- limit: numberOfUsersToDisable - nonSuperAdminUsersToDisable.length
1064
- });
1065
- usersToDisable.push(...superAdminUsersToDisable);
1066
- }
1067
- await strapi.db.query("admin::user").updateMany({
1068
- where: { id: map(prop("id"), usersToDisable) },
1069
- data: { isActive: false }
1070
- });
1071
- await strapi.store.set({
1072
- type: "ee",
1073
- key: "disabled_users",
1074
- value: currentlyDisabledUsers.concat(map(pick(["id", "isActive"]), usersToDisable))
1075
- });
1076
- };
1077
- const syncDisabledUserRecords = async () => {
1078
- const disabledUsers = await strapi.store.get({ type: "ee", key: "disabled_users" });
1079
- if (!disabledUsers) {
1080
- return;
1081
- }
1082
- await strapi.db.query("admin::user").updateMany({
1083
- where: { id: map(prop("id"), disabledUsers) },
1084
- data: { isActive: false }
1085
- });
1086
- };
1087
- const seatEnforcementWorkflow = async () => {
1088
- const adminSeats = strapi.ee.seats;
1089
- if (isNil(adminSeats)) {
1090
- return;
1091
- }
1092
- await syncDisabledUserRecords();
1093
- const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
1094
- const adminSeatsLeft = adminSeats - currentActiveUserCount;
1095
- if (adminSeatsLeft > 0) {
1096
- await enableMaximumUserCount(adminSeatsLeft);
1097
- } else if (adminSeatsLeft < 0) {
1098
- await disableUsersAboveLicenseLimit(-adminSeatsLeft);
1099
- }
1100
- };
1101
- const seatEnforcement = {
1102
- seatEnforcementWorkflow,
1103
- getDisabledUserList
1104
- };
1105
- const services = {
1106
- auth,
1107
- passport,
1108
- role: role$1,
1109
- user: user$1,
1110
- metrics,
1111
- "seat-enforcement": seatEnforcement
1112
- };
1113
- const providerOptionsUpdateSchema = yup.object().shape({
1114
- autoRegister: yup.boolean().required(),
1115
- defaultRole: yup.strapiID().when("autoRegister", (value, initSchema) => {
1116
- return value ? initSchema.required() : initSchema.nullable();
1117
- }).test("is-valid-role", "You must submit a valid default role", (roleId) => {
1118
- if (roleId === null) {
1119
- return true;
1120
- }
1121
- return strapi.service("admin::role").exists({ id: roleId });
1122
- }),
1123
- ssoLockedRoles: yup.array().nullable().of(
1124
- yup.strapiID().test(
1125
- "is-valid-role",
1126
- "You must submit a valid role for the SSO Locked roles",
1127
- (roleId) => {
1128
- return strapi.service("admin::role").exists({ id: roleId });
1129
- }
1130
- )
1131
- )
1132
- });
1133
- const validateProviderOptionsUpdate = validateYupSchema(providerOptionsUpdateSchema);
1134
- const PROVIDER_REDIRECT_BASE = "/auth/login";
1135
- const PROVIDER_REDIRECT_SUCCESS = `${PROVIDER_REDIRECT_BASE}/success`;
1136
- const PROVIDER_REDIRECT_ERROR = `${PROVIDER_REDIRECT_BASE}/error`;
1137
- const PROVIDER_URLS_MAP = {
1138
- success: PROVIDER_REDIRECT_SUCCESS,
1139
- error: PROVIDER_REDIRECT_ERROR
1140
- };
1141
- const getAdminStore = async () => strapi.store({ type: "core", name: "admin" });
1142
- const getPrefixedRedirectUrls = () => {
1143
- const { url: adminUrl } = strapi.config.get("admin");
1144
- const prefixUrl = (url) => `${adminUrl || "/admin"}${url}`;
1145
- return mapValues(prefixUrl, PROVIDER_URLS_MAP);
1146
- };
1147
- const utils = {
1148
- getAdminStore,
1149
- getPrefixedRedirectUrls
1150
- };
1151
- const defaultConnectionError = () => new Error("Invalid connection payload");
1152
- const authenticate = async (ctx, next) => {
1153
- const {
1154
- params: { provider }
1155
- } = ctx;
1156
- const redirectUrls = utils.getPrefixedRedirectUrls();
1157
- return passport$2.authenticate(provider, null, async (error, profile) => {
1158
- if (error || !profile || !profile.email) {
1159
- if (error) {
1160
- strapi.log.error(error);
1161
- }
1162
- strapi.eventHub.emit("admin.auth.error", {
1163
- error: error || defaultConnectionError(),
1164
- provider
1165
- });
1166
- return ctx.redirect(redirectUrls.error);
1167
- }
1168
- const user2 = await getService("user").findOneByEmail(profile.email);
1169
- const scenario = user2 ? existingUserScenario : nonExistingUserScenario;
1170
- return scenario(ctx, next)(user2 || profile, provider);
1171
- })(ctx, next);
1172
- };
1173
- const existingUserScenario = (ctx, next) => async (user2, provider) => {
1174
- const redirectUrls = utils.getPrefixedRedirectUrls();
1175
- if (!user2.isActive) {
1176
- strapi.eventHub.emit("admin.auth.error", {
1177
- error: new Error(`Deactivated user tried to login (${user2.id})`),
1178
- provider
1179
- });
1180
- return ctx.redirect(redirectUrls.error);
1181
- }
1182
- ctx.state.user = user2;
1183
- return next();
1184
- };
1185
- const nonExistingUserScenario = (ctx, next) => async (profile, provider) => {
1186
- const { email: email2, firstname: firstname2, lastname: lastname2, username: username2 } = profile;
1187
- const redirectUrls = utils.getPrefixedRedirectUrls();
1188
- const adminStore = await utils.getAdminStore();
1189
- const { providers } = await adminStore.get({ key: "auth" });
1190
- const isMissingRegisterFields = !username2 && (!firstname2 || !lastname2);
1191
- if (!providers.autoRegister || !providers.defaultRole || isMissingRegisterFields) {
1192
- strapi.eventHub.emit("admin.auth.error", { error: defaultConnectionError(), provider });
1193
- return ctx.redirect(redirectUrls.error);
1194
- }
1195
- const defaultRole = await getService("role").findOne({ id: providers.defaultRole });
1196
- if (!defaultRole) {
1197
- strapi.eventHub.emit("admin.auth.error", { error: defaultConnectionError(), provider });
1198
- return ctx.redirect(redirectUrls.error);
1199
- }
1200
- ctx.state.user = await getService("user").create({
1201
- email: email2,
1202
- username: username2,
1203
- firstname: firstname2,
1204
- lastname: lastname2,
1205
- roles: [defaultRole.id],
1206
- isActive: true,
1207
- registrationToken: null
1208
- });
1209
- strapi.eventHub.emit("admin.auth.autoRegistration", {
1210
- user: ctx.state.user,
1211
- provider
1212
- });
1213
- return next();
1214
- };
1215
- const redirectWithAuth = (ctx) => {
1216
- const {
1217
- params: { provider }
1218
- } = ctx;
1219
- const redirectUrls = utils.getPrefixedRedirectUrls();
1220
- const domain = strapi.config.get("admin.auth.domain");
1221
- const { user: user2 } = ctx.state;
1222
- const jwt = getService("token").createJwtToken(user2);
1223
- const isProduction = strapi.config.get("environment") === "production";
1224
- const cookiesOptions = { httpOnly: false, secure: isProduction, overwrite: true, domain };
1225
- const sanitizedUser = getService("user").sanitizeUser(user2);
1226
- strapi.eventHub.emit("admin.auth.success", { user: sanitizedUser, provider });
1227
- ctx.cookies.set("jwtToken", jwt, cookiesOptions);
1228
- ctx.redirect(redirectUrls.success);
1229
- };
1230
- const middlewares = {
1231
- authenticate,
1232
- redirectWithAuth
1233
- };
1234
- const toProviderDTO = pick(["uid", "displayName", "icon"]);
1235
- const toProviderLoginOptionsDTO = pick(["autoRegister", "defaultRole", "ssoLockedRoles"]);
1236
- const { ValidationError } = errors;
1237
- const providerAuthenticationFlow = compose([
1238
- middlewares.authenticate,
1239
- middlewares.redirectWithAuth
1240
- ]);
1241
- const authentication = {
1242
- async getProviders(ctx) {
1243
- const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
1244
- ctx.body = providerRegistry2.getAll().map(toProviderDTO);
1245
- },
1246
- async getProviderLoginOptions(ctx) {
1247
- const adminStore = await utils.getAdminStore();
1248
- const { providers: providersOptions } = await adminStore.get({ key: "auth" });
1249
- ctx.body = {
1250
- data: toProviderLoginOptionsDTO(providersOptions)
1251
- };
1252
- },
1253
- async updateProviderLoginOptions(ctx) {
1254
- const {
1255
- request: { body }
1256
- } = ctx;
1257
- await validateProviderOptionsUpdate(body);
1258
- const adminStore = await utils.getAdminStore();
1259
- const currentAuthOptions = await adminStore.get({ key: "auth" });
1260
- const newAuthOptions = { ...currentAuthOptions, providers: body };
1261
- await adminStore.set({ key: "auth", value: newAuthOptions });
1262
- strapi.telemetry.send("didUpdateSSOSettings");
1263
- ctx.body = {
1264
- data: toProviderLoginOptionsDTO(newAuthOptions.providers)
1265
- };
1266
- },
1267
- providerLogin(ctx, next) {
1268
- const {
1269
- params: { provider: providerName }
1270
- } = ctx;
1271
- const { providerRegistry: providerRegistry2 } = strapi.service("admin::passport");
1272
- if (!providerRegistry2.has(providerName)) {
1273
- throw new ValidationError(`Invalid provider supplied: ${providerName}`);
1274
- }
1275
- return providerAuthenticationFlow(ctx, next);
1276
- }
1277
- };
1278
- const roleCreateSchema = yup.object().shape({
1279
- name: yup.string().min(1).required(),
1280
- description: yup.string().nullable()
1281
- }).noUnknown();
1282
- const rolesDeleteSchema = yup.object().shape({
1283
- ids: yup.array().of(yup.strapiID()).min(1).required().test(
1284
- "roles-deletion-checks",
1285
- "Roles deletion checks have failed",
1286
- async function rolesDeletionChecks(ids) {
1287
- try {
1288
- await strapi.service("admin::role").checkRolesIdForDeletion(ids);
1289
- if (strapi.ee.features.isEnabled("sso")) {
1290
- await strapi.service("admin::role").ssoCheckRolesIdForDeletion(ids);
1291
- }
1292
- } catch (e) {
1293
- return this.createError({ path: "ids", message: e.message });
1294
- }
1295
- return true;
1296
- }
1297
- )
1298
- }).noUnknown();
1299
- const roleDeleteSchema = yup.strapiID().required().test(
1300
- "no-admin-single-delete",
1301
- "Role deletion checks have failed",
1302
- async function noAdminSingleDelete(id) {
1303
- try {
1304
- await strapi.service("admin::role").checkRolesIdForDeletion([id]);
1305
- if (strapi.ee.features.isEnabled("sso")) {
1306
- await strapi.service("admin::role").ssoCheckRolesIdForDeletion([id]);
1307
- }
1308
- } catch (e) {
1309
- return this.createError({ path: "id", message: e.message });
1310
- }
1311
- return true;
1312
- }
1313
- );
1314
- const validateRoleCreateInput = validateYupSchema(roleCreateSchema);
1315
- const validateRolesDeleteInput = validateYupSchema(rolesDeleteSchema);
1316
- const validateRoleDeleteInput = validateYupSchema(roleDeleteSchema);
1317
- const role = {
1318
- /**
1319
- * Create a new role
1320
- * @param {KoaContext} ctx - koa context
1321
- */
1322
- async create(ctx) {
1323
- await validateRoleCreateInput(ctx.request.body);
1324
- const roleService = getService("role");
1325
- const role2 = await roleService.create(ctx.request.body);
1326
- const sanitizedRole = roleService.sanitizeRole(role2);
1327
- ctx.created({ data: sanitizedRole });
1328
- },
1329
- /**
1330
- * Delete a role
1331
- * @param {KoaContext} ctx - koa context
1332
- */
1333
- async deleteOne(ctx) {
1334
- const { id } = ctx.params;
1335
- await validateRoleDeleteInput(id);
1336
- const roleService = getService("role");
1337
- const roles2 = await roleService.deleteByIds([id]);
1338
- const sanitizedRole = roles2.map((role2) => roleService.sanitizeRole(role2))[0] || null;
1339
- return ctx.deleted({
1340
- data: sanitizedRole
1341
- });
1342
- },
1343
- /**
1344
- * delete several roles
1345
- * @param {KoaContext} ctx - koa context
1346
- */
1347
- async deleteMany(ctx) {
1348
- const { body } = ctx.request;
1349
- await validateRolesDeleteInput(body);
1350
- const roleService = getService("role");
1351
- const roles2 = await roleService.deleteByIds(body.ids);
1352
- const sanitizedRoles = roles2.map(roleService.sanitizeRole);
1353
- return ctx.deleted({
1354
- data: sanitizedRoles
1355
- });
1356
- }
1357
- };
1358
- const getDefaultActionAttributes = () => ({
1359
- options: {
1360
- applyToProperties: null
1361
- }
1362
- });
1363
- const actionFields = [
1364
- "section",
1365
- "displayName",
1366
- "category",
1367
- "subCategory",
1368
- "pluginName",
1369
- "subjects",
1370
- "options",
1371
- "actionId"
1372
- ];
1373
- const sanitizeActionAttributes = pick(actionFields);
1374
- const computeActionId = (attributes) => {
1375
- const { pluginName, uid } = attributes;
1376
- if (!pluginName) {
1377
- return `api::${uid}`;
1378
- }
1379
- if (pluginName === "admin") {
1380
- return `admin::${uid}`;
1381
- }
1382
- return `plugin::${pluginName}.${uid}`;
1383
- };
1384
- const assignActionId = (attrs) => set("actionId", computeActionId(attrs), attrs);
1385
- const assignOrOmitSubCategory = (action) => {
1386
- const shouldHaveSubCategory = ["settings", "plugins"].includes(action.section);
1387
- return shouldHaveSubCategory ? set("subCategory", action.subCategory || "general", action) : omit("subCategory", action);
1388
- };
1389
- const appliesToProperty = curry((property, action) => {
1390
- return pipe(prop("options.applyToProperties"), includes(property))(action);
1391
- });
1392
- const appliesToSubject = curry((subject, action) => {
1393
- return isArray(action.subjects) && includes(subject, action.subjects);
1394
- });
1395
- const create = pipe(
1396
- // Create and assign an action identifier to the action
1397
- // (need to be done before the sanitizeActionAttributes since we need the uid here)
1398
- assignActionId,
1399
- // Add or remove the sub category field based on the pluginName attribute
1400
- assignOrOmitSubCategory,
1401
- // Remove unwanted attributes from the payload
1402
- sanitizeActionAttributes,
1403
- // Complete the action creation by adding default values for some attributes
1404
- merge(getDefaultActionAttributes())
1405
- );
1406
- const actionDomain = {
1407
- actionFields,
1408
- appliesToProperty,
1409
- appliesToSubject,
1410
- assignActionId,
1411
- assignOrOmitSubCategory,
1412
- create,
1413
- computeActionId,
1414
- getDefaultActionAttributes,
1415
- sanitizeActionAttributes
1416
- };
1417
- const checkFieldsAreCorrectlyNested = (fields) => {
1418
- if (_.isNil(fields)) {
1419
- return true;
1420
- }
1421
- if (!Array.isArray(fields)) {
1422
- return false;
1423
- }
1424
- let failed = false;
1425
- for (let indexA = 0; indexA < fields.length; indexA += 1) {
1426
- failed = fields.slice(indexA + 1).some(
1427
- (fieldB) => fieldB.startsWith(`${fields[indexA]}.`) || fields[indexA].startsWith(`${fieldB}.`)
1428
- );
1429
- if (failed)
1430
- break;
1431
- }
1432
- return !failed;
1433
- };
1434
- const checkFieldsDontHaveDuplicates = (fields) => {
1435
- if (_.isNil(fields)) {
1436
- return true;
1437
- }
1438
- if (!Array.isArray(fields)) {
1439
- return false;
1440
- }
1441
- return _.uniq(fields).length === fields.length;
1442
- };
1443
- const getActionFromProvider = (actionId) => {
1444
- return getService$1("permission").actionProvider.get(actionId);
1445
- };
1446
- const email = yup.string().email().lowercase();
1447
- const firstname = yup.string().trim().min(1);
1448
- const lastname = yup.string();
1449
- const username = yup.string().min(1);
1450
- const password = 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");
1451
- const roles = yup.array(yup.strapiID()).min(1);
1452
- const isAPluginName = yup.string().test("is-a-plugin-name", "is not a plugin name", function(value) {
1453
- return [void 0, "admin", ...Object.keys(strapi.plugins)].includes(value) ? true : this.createError({ path: this.path, message: `${this.path} is not an existing plugin` });
1454
- });
1455
- const arrayOfConditionNames = yup.array().of(yup.string()).test("is-an-array-of-conditions", "is not a plugin name", function(value) {
1456
- const ids = strapi.service("admin::permission").conditionProvider.keys();
1457
- return _.isUndefined(value) || _.difference(value, ids).length === 0 ? true : this.createError({ path: this.path, message: `contains conditions that don't exist` });
1458
- });
1459
- const permissionsAreEquals = (a, b) => a.action === b.action && (a.subject === b.subject || _.isNil(a.subject) && _.isNil(b.subject));
1460
- const checkNoDuplicatedPermissions = (permissions) => !Array.isArray(permissions) || permissions.every(
1461
- (permA, i) => permissions.slice(i + 1).every((permB) => !permissionsAreEquals(permA, permB))
1462
- );
1463
- const checkNilFields = (action) => function(fields) {
1464
- if (isNil(action)) {
1465
- return true;
1466
- }
1467
- return actionDomain.appliesToProperty("fields", action) || isNil(fields);
1468
- };
1469
- const fieldsPropertyValidation = (action) => yup.array().of(yup.string()).nullable().test(
1470
- "field-nested",
1471
- "Fields format are incorrect (bad nesting).",
1472
- checkFieldsAreCorrectlyNested
1473
- ).test(
1474
- "field-nested",
1475
- "Fields format are incorrect (duplicates).",
1476
- checkFieldsDontHaveDuplicates
1477
- ).test(
1478
- "fields-restriction",
1479
- "The permission at ${path} must have fields set to null or undefined",
1480
- // @ts-expect-error yup types
1481
- checkNilFields(action)
1482
- );
1483
- const permission = yup.object().shape({
1484
- action: yup.string().required().test("action-validity", "action is not an existing permission action", function(actionId) {
1485
- if (isNil(actionId)) {
1486
- return true;
1487
- }
1488
- return !!getActionFromProvider(actionId);
1489
- }),
1490
- actionParameters: yup.object().nullable(),
1491
- subject: yup.string().nullable().test("subject-validity", "Invalid subject submitted", function(subject) {
1492
- const action = getActionFromProvider(this.options.parent.action);
1493
- if (!action) {
1494
- return true;
1495
- }
1496
- if (isNil(action.subjects)) {
1497
- return isNil(subject);
1498
- }
1499
- if (isArray(action.subjects)) {
1500
- return action.subjects.includes(subject);
1501
- }
1502
- return false;
1503
- }),
1504
- properties: yup.object().test("properties-structure", "Invalid property set at ${path}", function(properties) {
1505
- const action = getActionFromProvider(this.options.parent.action);
1506
- const hasNoProperties = isEmpty(properties) || isNil(properties);
1507
- if (!has("options.applyToProperties", action)) {
1508
- return hasNoProperties;
1509
- }
1510
- if (hasNoProperties) {
1511
- return true;
1512
- }
1513
- const { applyToProperties } = action.options;
1514
- if (!isArray(applyToProperties)) {
1515
- return false;
1516
- }
1517
- return Object.keys(properties).every((property) => applyToProperties.includes(property));
1518
- }).test(
1519
- "fields-property",
1520
- "Invalid fields property at ${path}",
1521
- async function(properties = {}) {
1522
- const action = getActionFromProvider(this.options.parent.action);
1523
- if (!action || !properties) {
1524
- return true;
1525
- }
1526
- if (!actionDomain.appliesToProperty("fields", action)) {
1527
- return true;
1528
- }
1529
- try {
1530
- await fieldsPropertyValidation(action).validate(properties.fields, {
1531
- strict: true,
1532
- abortEarly: false
1533
- });
1534
- return true;
1535
- } catch (e) {
1536
- throw this.createError({
1537
- message: e.message,
1538
- path: `${this.path}.fields`
1539
- });
1540
- }
1541
- }
1542
- ),
1543
- conditions: yup.array().of(yup.string())
1544
- }).noUnknown();
1545
- const updatePermissions = yup.object().shape({
1546
- permissions: yup.array().required().of(permission).test(
1547
- "duplicated-permissions",
1548
- "Some permissions are duplicated (same action and subject)",
1549
- checkNoDuplicatedPermissions
1550
- )
1551
- }).required().noUnknown();
1552
- const validators = {
1553
- email,
1554
- firstname,
1555
- lastname,
1556
- username,
1557
- password,
1558
- roles,
1559
- isAPluginName,
1560
- arrayOfConditionNames,
1561
- permission,
1562
- updatePermissions
1563
- };
1564
- const userCreationSchema = yup.object().shape({
1565
- email: validators.email.required(),
1566
- firstname: validators.firstname.required(),
1567
- lastname: validators.lastname,
1568
- roles: validators.roles.min(1),
1569
- preferedLanguage: yup.string().nullable()
1570
- }).noUnknown();
1571
- const profileUpdateSchema = yup.object().shape({
1572
- email: validators.email.notNull(),
1573
- firstname: validators.firstname.notNull(),
1574
- lastname: validators.lastname.nullable(),
1575
- username: validators.username.nullable(),
1576
- password: validators.password.notNull(),
1577
- currentPassword: yup.string().when(
1578
- "password",
1579
- (password2, schema) => !isUndefined(password2) ? schema.required() : schema
1580
- ).notNull(),
1581
- preferedLanguage: yup.string().nullable()
1582
- }).noUnknown();
1583
- const userUpdateSchema = yup.object().shape({
1584
- email: validators.email.notNull(),
1585
- firstname: validators.firstname.notNull(),
1586
- lastname: validators.lastname.nullable(),
1587
- username: validators.username.nullable(),
1588
- password: validators.password.notNull(),
1589
- isActive: yup.bool().notNull(),
1590
- roles: validators.roles.min(1).notNull()
1591
- }).noUnknown();
1592
- const usersDeleteSchema = yup.object().shape({
1593
- ids: yup.array().of(yup.strapiID()).min(1).required()
1594
- }).noUnknown();
1595
- validateYupSchema(userCreationSchema);
1596
- validateYupSchema(profileUpdateSchema);
1597
- const validateUserUpdateInput = validateYupSchema(userUpdateSchema);
1598
- validateYupSchema(usersDeleteSchema);
1599
- const schemas = {
1600
- userCreationSchema,
1601
- usersDeleteSchema,
1602
- userUpdateSchema
1603
- };
1604
- const ssoUserCreationInputExtension = yup.object().shape({
1605
- useSSORegistration: yup.boolean()
1606
- }).noUnknown();
1607
- const validateUserCreationInput = (data) => {
1608
- let schema = schemas.userCreationSchema;
1609
- if (strapi.ee.features.isEnabled("sso")) {
1610
- schema = schema.concat(ssoUserCreationInputExtension);
1611
- }
1612
- return validateYupSchema(schema)(data);
1613
- };
1614
- const { ApplicationError, ForbiddenError } = errors;
1615
- const pickUserCreationAttributes = pick(["firstname", "lastname", "email", "roles"]);
1616
- const hasAdminSeatsAvaialble = async () => {
1617
- if (!strapi.EE) {
1618
- return true;
1619
- }
1620
- const permittedSeats = strapi.ee.seats;
1621
- if (isNil(permittedSeats)) {
1622
- return true;
1623
- }
1624
- const userCount = await strapi.service("admin::user").getCurrentActiveUserCount();
1625
- if (userCount < permittedSeats) {
1626
- return true;
1627
- }
1628
- };
1629
- const user = {
1630
- async create(ctx) {
1631
- if (!await hasAdminSeatsAvaialble()) {
1632
- throw new ForbiddenError("License seat limit reached. You cannot create a new user");
1633
- }
1634
- const { body } = ctx.request;
1635
- const cleanData = { ...body, email: _.get(body, `email`, ``).toLowerCase() };
1636
- await validateUserCreationInput(cleanData);
1637
- const attributes = pickUserCreationAttributes(cleanData);
1638
- const { useSSORegistration } = cleanData;
1639
- const userAlreadyExists = await getService("user").exists({ email: attributes.email });
1640
- if (userAlreadyExists) {
1641
- throw new ApplicationError("Email already taken");
1642
- }
1643
- if (useSSORegistration) {
1644
- Object.assign(attributes, { registrationToken: null, isActive: true });
1645
- }
1646
- const createdUser = await getService("user").create(attributes);
1647
- const userInfo = getService("user").sanitizeUser(createdUser);
1648
- Object.assign(userInfo, { registrationToken: createdUser.registrationToken });
1649
- ctx.created({ data: userInfo });
1650
- },
1651
- async update(ctx) {
1652
- const { id } = ctx.params;
1653
- const { body: input } = ctx.request;
1654
- await validateUserUpdateInput(input);
1655
- if (_.has(input, "email")) {
1656
- const uniqueEmailCheck = await getService("user").exists({
1657
- id: { $ne: id },
1658
- email: input.email
1659
- });
1660
- if (uniqueEmailCheck) {
1661
- throw new ApplicationError("A user with this email address already exists");
1662
- }
1663
- }
1664
- const user2 = await getService("user").findOne(id, null);
1665
- if (!await hasAdminSeatsAvaialble() && !user2.isActive && input.isActive) {
1666
- throw new ForbiddenError("License seat limit reached. You cannot active this user");
1667
- }
1668
- const updatedUser = await getService("user").updateById(id, input);
1669
- if (!updatedUser) {
1670
- return ctx.notFound("User does not exist");
1671
- }
1672
- ctx.body = {
1673
- data: getService("user").sanitizeUser(updatedUser)
1674
- };
1675
- },
1676
- async isSSOLocked(ctx) {
1677
- const { user: user2 } = ctx.state;
1678
- const isSSOLocked = await isSsoLocked(user2);
1679
- ctx.body = {
1680
- data: {
1681
- isSSOLocked
1682
- }
1683
- };
1684
- }
1685
- };
1686
- const admin = {
1687
- // NOTE: Overrides CE admin controller
1688
- async getProjectType() {
1689
- const flags = strapi.config.get("admin.flags", {});
1690
- try {
1691
- return { data: { isEE: strapi.EE, features: strapi.ee.features.list(), flags } };
1692
- } catch (err) {
1693
- return { data: { isEE: false, features: [], flags } };
1694
- }
1695
- },
1696
- async licenseLimitInformation() {
1697
- const permittedSeats = strapi.ee.seats;
1698
- let shouldNotify = false;
1699
- let licenseLimitStatus = null;
1700
- let enforcementUserCount;
1701
- const currentActiveUserCount = await getService("user").getCurrentActiveUserCount();
1702
- const eeDisabledUsers = await getService("seat-enforcement").getDisabledUserList();
1703
- if (eeDisabledUsers) {
1704
- enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;
1705
- } else {
1706
- enforcementUserCount = currentActiveUserCount;
1707
- }
1708
- if (!isNil(permittedSeats) && enforcementUserCount > permittedSeats) {
1709
- shouldNotify = true;
1710
- licenseLimitStatus = "OVER_LIMIT";
1711
- }
1712
- if (!isNil(permittedSeats) && enforcementUserCount === permittedSeats) {
1713
- shouldNotify = true;
1714
- licenseLimitStatus = "AT_LIMIT";
1715
- }
1716
- const data = {
1717
- enforcementUserCount,
1718
- currentActiveUserCount,
1719
- permittedSeats,
1720
- shouldNotify,
1721
- shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,
1722
- licenseLimitStatus,
1723
- isHostedOnStrapiCloud: env("STRAPI_HOSTING", null) === "strapi.cloud",
1724
- features: strapi.ee.features.list() ?? []
1725
- };
1726
- return { data };
1727
- }
1728
- };
1729
- const controllers = {
1730
- authentication,
1731
- role,
1732
- user,
1733
- admin
1734
- };
1735
- const enableFeatureMiddleware = (featureName) => (ctx, next) => {
1736
- if (strapi.ee.features.isEnabled(featureName)) {
1737
- return next();
1738
- }
1739
- ctx.status = 404;
1740
- };
1741
- const sso = {
1742
- type: "admin",
1743
- routes: [
1744
- {
1745
- method: "GET",
1746
- path: "/providers",
1747
- handler: "authentication.getProviders",
1748
- config: {
1749
- middlewares: [enableFeatureMiddleware("sso")],
1750
- auth: false
1751
- }
1752
- },
1753
- {
1754
- method: "GET",
1755
- path: "/connect/:provider",
1756
- handler: "authentication.providerLogin",
1757
- config: {
1758
- middlewares: [enableFeatureMiddleware("sso")],
1759
- auth: false
1760
- }
1761
- },
1762
- {
1763
- method: "POST",
1764
- path: "/connect/:provider",
1765
- handler: "authentication.providerLogin",
1766
- config: {
1767
- middlewares: [enableFeatureMiddleware("sso")],
1768
- auth: false
1769
- }
1770
- },
1771
- {
1772
- method: "GET",
1773
- path: "/providers/options",
1774
- handler: "authentication.getProviderLoginOptions",
1775
- config: {
1776
- middlewares: [enableFeatureMiddleware("sso")],
1777
- policies: [
1778
- "admin::isAuthenticatedAdmin",
1779
- { name: "admin::hasPermissions", config: { actions: ["admin::provider-login.read"] } }
1780
- ]
1781
- }
1782
- },
1783
- {
1784
- method: "PUT",
1785
- path: "/providers/options",
1786
- handler: "authentication.updateProviderLoginOptions",
1787
- config: {
1788
- middlewares: [enableFeatureMiddleware("sso")],
1789
- policies: [
1790
- "admin::isAuthenticatedAdmin",
1791
- { name: "admin::hasPermissions", config: { actions: ["admin::provider-login.update"] } }
1792
- ]
1793
- }
1794
- },
1795
- {
1796
- method: "GET",
1797
- path: "/providers/isSSOLocked",
1798
- handler: "user.isSSOLocked",
1799
- config: {
1800
- middlewares: [enableFeatureMiddleware("sso")],
1801
- policies: ["admin::isAuthenticatedAdmin"]
1802
- }
1803
- }
1804
- ]
1805
- };
1806
- const licenseLimit = {
1807
- type: "admin",
1808
- routes: [
1809
- // License limit infos
1810
- {
1811
- method: "GET",
1812
- path: "/license-limit-information",
1813
- handler: "admin.licenseLimitInformation",
1814
- config: {
1815
- policies: [
1816
- "admin::isAuthenticatedAdmin",
1817
- {
1818
- name: "admin::hasPermissions",
1819
- config: {
1820
- actions: [
1821
- "admin::users.create",
1822
- "admin::users.read",
1823
- "admin::users.update",
1824
- "admin::users.delete"
1825
- ]
1826
- }
1827
- }
1828
- ]
1829
- }
1830
- }
1831
- ]
1832
- };
1833
- const routes = {
1834
- sso,
1835
- "license-limit": licenseLimit
1836
- };
1837
- const auditLogsRoutes = {
1838
- type: "admin",
1839
- routes: [
1840
- {
1841
- method: "GET",
1842
- path: "/audit-logs",
1843
- handler: "audit-logs.findMany",
1844
- config: {
1845
- middlewares: [enableFeatureMiddleware("audit-logs")],
1846
- policies: [
1847
- "admin::isAuthenticatedAdmin",
1848
- {
1849
- name: "admin::hasPermissions",
1850
- config: {
1851
- actions: ["admin::audit-logs.read"]
1852
- }
1853
- }
1854
- ]
1855
- }
1856
- },
1857
- {
1858
- method: "GET",
1859
- path: "/audit-logs/:id",
1860
- handler: "audit-logs.findOne",
1861
- config: {
1862
- middlewares: [enableFeatureMiddleware("audit-logs")],
1863
- policies: [
1864
- "admin::isAuthenticatedAdmin",
1865
- {
1866
- name: "admin::hasPermissions",
1867
- config: {
1868
- actions: ["admin::audit-logs.read"]
1869
- }
1870
- }
1871
- ]
1872
- }
1873
- }
1874
- ]
1875
- };
1876
- const ALLOWED_SORT_STRINGS = ["action:ASC", "action:DESC", "date:ASC", "date:DESC"];
1877
- const validateFindManySchema = yup.object().shape({
1878
- page: yup.number().integer().min(1),
1879
- pageSize: yup.number().integer().min(1).max(100),
1880
- sort: yup.mixed().oneOf(ALLOWED_SORT_STRINGS)
1881
- }).required();
1882
- const validateFindMany = validateYupSchema(validateFindManySchema, { strict: false });
1883
- const auditLogsController = {
1884
- async findMany(ctx) {
1885
- const { query } = ctx.request;
1886
- await validateFindMany(query);
1887
- const auditLogs = strapi.get("audit-logs");
1888
- const body = await auditLogs.findMany(query);
1889
- ctx.body = body;
1890
- },
1891
- async findOne(ctx) {
1892
- const { id } = ctx.params;
1893
- const auditLogs = strapi.get("audit-logs");
1894
- const body = await auditLogs.findOne(id);
1895
- ctx.body = body;
1896
- strapi.telemetry.send("didWatchAnAuditLog");
1897
- }
1898
- };
1899
- const getSanitizedUser = (user2) => {
1900
- let displayName = user2.email;
1901
- if (user2.username) {
1902
- displayName = user2.username;
1903
- } else if (user2.firstname && user2.lastname) {
1904
- displayName = `${user2.firstname} ${user2.lastname}`;
1905
- }
1906
- return {
1907
- id: user2.id,
1908
- email: user2.email,
1909
- displayName
1910
- };
1911
- };
1912
- const createAuditLogsService = (strapi2) => {
1913
- return {
1914
- async saveEvent(event) {
1915
- const { userId, ...rest } = event;
1916
- const auditLog2 = { ...rest, user: userId };
1917
- await strapi2.db?.query("admin::audit-log").create({ data: auditLog2 });
1918
- return this;
1919
- },
1920
- async findMany(query) {
1921
- const { results, pagination } = await strapi2.db?.query("admin::audit-log").findPage({
1922
- populate: ["user"],
1923
- select: ["action", "date", "payload"],
1924
- ...strapi2.get("query-params").transform("admin::audit-log", query)
1925
- });
1926
- const sanitizedResults = results.map((result) => {
1927
- const { user: user2, ...rest } = result;
1928
- return {
1929
- ...rest,
1930
- user: user2 ? getSanitizedUser(user2) : null
1931
- };
1932
- });
1933
- return {
1934
- results: sanitizedResults,
1935
- pagination
1936
- };
1937
- },
1938
- async findOne(id) {
1939
- const result = await strapi2.db?.query("admin::audit-log").findOne({
1940
- where: { id },
1941
- populate: ["user"],
1942
- select: ["action", "date", "payload"]
1943
- });
1944
- if (!result) {
1945
- return null;
1946
- }
1947
- const { user: user2, ...rest } = result;
1948
- return {
1949
- ...rest,
1950
- user: user2 ? getSanitizedUser(user2) : null
1951
- };
1952
- },
1953
- deleteExpiredEvents(expirationDate) {
1954
- return strapi2.db?.query("admin::audit-log").deleteMany({
1955
- where: {
1956
- date: {
1957
- $lt: expirationDate.toISOString()
1958
- }
1959
- }
1960
- });
1961
- }
1962
- };
1963
- };
1964
- const DEFAULT_RETENTION_DAYS = 90;
1965
- const defaultEvents = [
1966
- "entry.create",
1967
- "entry.update",
1968
- "entry.delete",
1969
- "entry.publish",
1970
- "entry.unpublish",
1971
- "media.create",
1972
- "media.update",
1973
- "media.delete",
1974
- "media-folder.create",
1975
- "media-folder.update",
1976
- "media-folder.delete",
1977
- "user.create",
1978
- "user.update",
1979
- "user.delete",
1980
- "admin.auth.success",
1981
- "admin.logout",
1982
- "content-type.create",
1983
- "content-type.update",
1984
- "content-type.delete",
1985
- "component.create",
1986
- "component.update",
1987
- "component.delete",
1988
- "role.create",
1989
- "role.update",
1990
- "role.delete",
1991
- "permission.create",
1992
- "permission.update",
1993
- "permission.delete"
1994
- ];
1995
- const getEventMap = (defaultEvents2) => {
1996
- const getDefaultPayload = (...args) => args[0];
1997
- return defaultEvents2.reduce((acc, event) => {
1998
- acc[event] = getDefaultPayload;
1999
- return acc;
2000
- }, {});
2001
- };
2002
- const getRetentionDays = (strapi2) => {
2003
- const featureConfig = strapi2.ee.features.get("audit-logs");
2004
- const licenseRetentionDays = typeof featureConfig === "object" && featureConfig?.options.retentionDays;
2005
- const userRetentionDays = strapi2.config.get("admin.auditLogs.retentionDays");
2006
- if (licenseRetentionDays == null) {
2007
- return userRetentionDays ?? DEFAULT_RETENTION_DAYS;
2008
- }
2009
- if (userRetentionDays && userRetentionDays < licenseRetentionDays) {
2010
- return userRetentionDays;
2011
- }
2012
- return licenseRetentionDays;
2013
- };
2014
- const createAuditLogsLifecycleService = (strapi2) => {
2015
- const state = {};
2016
- const auditLogsService = strapi2.get("audit-logs");
2017
- const eventMap = getEventMap(defaultEvents);
2018
- const processEvent = (name2, ...args) => {
2019
- const requestState = strapi2.requestContext.get()?.state;
2020
- const isUsingAdminAuth = requestState?.route.info.type === "admin";
2021
- const user2 = requestState?.user;
2022
- if (!isUsingAdminAuth || !user2) {
2023
- return null;
2024
- }
2025
- const getPayload = eventMap[name2];
2026
- if (!getPayload) {
2027
- return null;
2028
- }
2029
- const ignoredUids = ["plugin::upload.file", "plugin::upload.folder"];
2030
- if (ignoredUids.includes(args[0]?.uid)) {
2031
- return null;
2032
- }
2033
- return {
2034
- action: name2,
2035
- date: (/* @__PURE__ */ new Date()).toISOString(),
2036
- payload: getPayload(...args) || {},
2037
- userId: user2.id
2038
- };
2039
- };
2040
- const handleEvent = async (name2, ...args) => {
2041
- const processedEvent = processEvent(name2, ...args);
2042
- if (processedEvent) {
2043
- await auditLogsService.saveEvent(processedEvent);
2044
- }
2045
- };
2046
- return {
2047
- async register() {
2048
- if (!state.eeEnableUnsubscribe) {
2049
- state.eeEnableUnsubscribe = strapi2.eventHub.on("ee.enable", () => {
2050
- this.destroy();
2051
- this.register();
2052
- });
2053
- }
2054
- if (!state.eeUpdateUnsubscribe) {
2055
- state.eeUpdateUnsubscribe = strapi2.eventHub.on("ee.update", () => {
2056
- this.destroy();
2057
- this.register();
2058
- });
2059
- }
2060
- state.eeDisableUnsubscribe = strapi2.eventHub.on("ee.disable", () => {
2061
- this.destroy();
2062
- });
2063
- if (!strapi2.ee.features.isEnabled("audit-logs")) {
2064
- return this;
2065
- }
2066
- state.eventHubUnsubscribe = strapi2.eventHub.subscribe(handleEvent);
2067
- const retentionDays = getRetentionDays(strapi2);
2068
- state.deleteExpiredJob = scheduleJob("0 0 * * *", () => {
2069
- const expirationDate = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1e3);
2070
- auditLogsService.deleteExpiredEvents(expirationDate);
2071
- });
2072
- return this;
2073
- },
2074
- unsubscribe() {
2075
- if (state.eeDisableUnsubscribe) {
2076
- state.eeDisableUnsubscribe();
2077
- }
2078
- if (state.eventHubUnsubscribe) {
2079
- state.eventHubUnsubscribe();
2080
- }
2081
- if (state.deleteExpiredJob) {
2082
- state.deleteExpiredJob.cancel();
2083
- }
2084
- return this;
2085
- },
2086
- destroy() {
2087
- return this.unsubscribe();
2088
- }
2089
- };
2090
- };
2091
- const auditLog = {
2092
- schema: {
2093
- kind: "collectionType",
2094
- collectionName: "strapi_audit_logs",
2095
- info: {
2096
- singularName: "audit-log",
2097
- pluralName: "audit-logs",
2098
- displayName: "Audit Log"
2099
- },
2100
- options: {
2101
- timestamps: false
2102
- },
2103
- pluginOptions: {
2104
- "content-manager": {
2105
- visible: false
2106
- },
2107
- "content-type-builder": {
2108
- visible: false
2109
- }
2110
- },
2111
- attributes: {
2112
- action: {
2113
- type: "string",
2114
- required: true
2115
- },
2116
- date: {
2117
- type: "datetime",
2118
- required: true
2119
- },
2120
- user: {
2121
- type: "relation",
2122
- relation: "oneToOne",
2123
- target: "admin::user"
2124
- },
2125
- payload: {
2126
- type: "json"
2127
- }
2128
- }
2129
- }
2130
- };
2131
- const getAdminEE = () => {
2132
- const eeAdmin = {
2133
- register,
2134
- bootstrap,
2135
- destroy,
2136
- contentTypes: {
2137
- // Always register the audit-log content type to prevent data loss
2138
- "audit-log": auditLog,
2139
- ...adminContentTypes
2140
- },
2141
- services,
2142
- controllers,
2143
- routes
2144
- };
2145
- if (strapi.config.get("admin.auditLogs.enabled", true) && strapi.ee.features.isEnabled("audit-logs")) {
2146
- return {
2147
- ...eeAdmin,
2148
- controllers: {
2149
- ...eeAdmin.controllers,
2150
- "audit-logs": auditLogsController
2151
- },
2152
- routes: {
2153
- ...eeAdmin.routes,
2154
- "audit-logs": auditLogsRoutes
2155
- },
2156
- async register({ strapi: strapi2 }) {
2157
- await eeAdmin.register({ strapi: strapi2 });
2158
- strapi2.add("audit-logs", createAuditLogsService(strapi2));
2159
- const auditLogsLifecycle = createAuditLogsLifecycleService(strapi2);
2160
- strapi2.add("audit-logs-lifecycle", auditLogsLifecycle);
2161
- await auditLogsLifecycle.register();
2162
- },
2163
- async destroy({ strapi: strapi2 }) {
2164
- strapi2.get("audit-logs-lifecycle").destroy();
2165
- await eeAdmin.destroy({ strapi: strapi2 });
2166
- }
2167
- };
2168
- }
2169
- return eeAdmin;
2170
- };
2171
- const index = getAdminEE();
2172
- export {
2173
- index as default
2174
- };
2175
- //# sourceMappingURL=index.mjs.map