@strapi/admin 5.0.0-rc.8 → 5.0.0

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