@strapi/admin 5.55.1 → 5.57.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/admin/src/components/Filters.js +1 -1
  2. package/dist/admin/admin/src/components/Filters.js.map +1 -1
  3. package/dist/admin/admin/src/components/Filters.mjs +1 -1
  4. package/dist/admin/admin/src/components/Filters.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/FormInputs/Enumeration.js +2 -2
  6. package/dist/admin/admin/src/components/FormInputs/Enumeration.js.map +1 -1
  7. package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs +2 -2
  8. package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/MediaLibraryBanner.js +38 -2
  10. package/dist/admin/admin/src/components/MediaLibraryBanner.js.map +1 -1
  11. package/dist/admin/admin/src/components/MediaLibraryBanner.mjs +18 -2
  12. package/dist/admin/admin/src/components/MediaLibraryBanner.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/RelativeTime.js +9 -0
  14. package/dist/admin/admin/src/components/RelativeTime.js.map +1 -1
  15. package/dist/admin/admin/src/components/RelativeTime.mjs +10 -1
  16. package/dist/admin/admin/src/components/RelativeTime.mjs.map +1 -1
  17. package/dist/admin/admin/src/components/TopBanners.js +52 -0
  18. package/dist/admin/admin/src/components/TopBanners.js.map +1 -0
  19. package/dist/admin/admin/src/components/TopBanners.mjs +30 -0
  20. package/dist/admin/admin/src/components/TopBanners.mjs.map +1 -0
  21. package/dist/admin/admin/src/components/UpsellBanner.js +9 -16
  22. package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
  23. package/dist/admin/admin/src/components/UpsellBanner.mjs +11 -18
  24. package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
  25. package/dist/admin/admin/src/features/Tracking.js +28 -8
  26. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  27. package/dist/admin/admin/src/features/Tracking.mjs +29 -10
  28. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  29. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +4 -20
  30. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
  31. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +4 -20
  32. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
  33. package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.js +59 -0
  34. package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.js.map +1 -0
  35. package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.mjs +37 -0
  36. package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.mjs.map +1 -0
  37. package/dist/admin/admin/src/render.js +4 -69
  38. package/dist/admin/admin/src/render.js.map +1 -1
  39. package/dist/admin/admin/src/render.mjs +4 -69
  40. package/dist/admin/admin/src/render.mjs.map +1 -1
  41. package/dist/admin/admin/src/translations/en.json.js +15 -0
  42. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  43. package/dist/admin/admin/src/translations/en.json.mjs +15 -0
  44. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  45. package/dist/admin/admin/src/utils/browserStrapi.js +93 -0
  46. package/dist/admin/admin/src/utils/browserStrapi.js.map +1 -0
  47. package/dist/admin/admin/src/utils/browserStrapi.mjs +91 -0
  48. package/dist/admin/admin/src/utils/browserStrapi.mjs.map +1 -0
  49. package/dist/admin/admin/src/utils/getFetchClient.js +3 -3
  50. package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
  51. package/dist/admin/admin/src/utils/getFetchClient.mjs +2 -2
  52. package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
  53. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.js +2 -1
  54. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.js.map +1 -1
  55. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.mjs +2 -1
  56. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.mjs.map +1 -1
  57. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +16 -1
  58. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
  59. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +16 -1
  60. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
  61. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.js +3 -1
  62. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.js.map +1 -1
  63. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.mjs +3 -1
  64. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.mjs.map +1 -1
  65. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.js +64 -0
  66. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.js.map +1 -0
  67. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.mjs +60 -0
  68. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.mjs.map +1 -0
  69. package/dist/admin/ee/admin/src/services/auditLogs.js +2 -1
  70. package/dist/admin/ee/admin/src/services/auditLogs.js.map +1 -1
  71. package/dist/admin/ee/admin/src/services/auditLogs.mjs +2 -1
  72. package/dist/admin/ee/admin/src/services/auditLogs.mjs.map +1 -1
  73. package/dist/admin/src/components/MediaLibraryBanner.d.ts +10 -1
  74. package/dist/admin/src/components/SubNav.d.ts +2 -2
  75. package/dist/admin/src/components/TopBanners.d.ts +8 -0
  76. package/dist/admin/src/features/Tracking.d.ts +12 -1
  77. package/dist/admin/src/layouts/useAuthenticatedAccessTracking.d.ts +6 -0
  78. package/dist/admin/src/utils/browserStrapi.d.ts +11 -0
  79. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +15 -0
  80. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.d.ts +14 -0
  81. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +10 -1
  82. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
  83. package/dist/ee/server/src/controllers/admin.d.ts +2 -28
  84. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
  85. package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts +8 -2
  86. package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts.map +1 -1
  87. package/dist/ee/server/src/controllers/authentication.d.ts.map +1 -1
  88. package/dist/ee/server/src/controllers/index.d.ts +1 -28
  89. package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
  90. package/dist/ee/server/src/controllers/user.d.ts.map +1 -1
  91. package/dist/ee/server/src/index.d.ts +6 -30
  92. package/dist/ee/server/src/index.d.ts.map +1 -1
  93. package/dist/ee/server/src/services/auth.d.ts +1 -1
  94. package/dist/ee/server/src/services/auth.d.ts.map +1 -1
  95. package/dist/ee/server/src/services/index.d.ts +5 -2
  96. package/dist/ee/server/src/services/index.d.ts.map +1 -1
  97. package/dist/ee/server/src/services/metrics.d.ts.map +1 -1
  98. package/dist/ee/server/src/services/persist-tables.d.ts.map +1 -1
  99. package/dist/ee/server/src/services/seat-enforcement.d.ts +3 -1
  100. package/dist/ee/server/src/services/seat-enforcement.d.ts.map +1 -1
  101. package/dist/ee/server/src/services/user.d.ts.map +1 -1
  102. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +37 -21
  103. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
  104. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +37 -21
  105. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
  106. package/dist/server/ee/server/src/controllers/admin.js +8 -7
  107. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  108. package/dist/server/ee/server/src/controllers/admin.mjs +8 -7
  109. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  110. package/dist/server/ee/server/src/controllers/authentication-utils/utils.js +2 -2
  111. package/dist/server/ee/server/src/controllers/authentication-utils/utils.js.map +1 -1
  112. package/dist/server/ee/server/src/controllers/authentication-utils/utils.mjs +2 -2
  113. package/dist/server/ee/server/src/controllers/authentication-utils/utils.mjs.map +1 -1
  114. package/dist/server/ee/server/src/controllers/authentication.js +11 -11
  115. package/dist/server/ee/server/src/controllers/authentication.js.map +1 -1
  116. package/dist/server/ee/server/src/controllers/authentication.mjs +11 -11
  117. package/dist/server/ee/server/src/controllers/authentication.mjs.map +1 -1
  118. package/dist/server/ee/server/src/controllers/user.js +7 -8
  119. package/dist/server/ee/server/src/controllers/user.js.map +1 -1
  120. package/dist/server/ee/server/src/controllers/user.mjs +8 -9
  121. package/dist/server/ee/server/src/controllers/user.mjs.map +1 -1
  122. package/dist/server/ee/server/src/index.js +4 -0
  123. package/dist/server/ee/server/src/index.js.map +1 -1
  124. package/dist/server/ee/server/src/index.mjs +4 -0
  125. package/dist/server/ee/server/src/index.mjs.map +1 -1
  126. package/dist/server/ee/server/src/services/auth.js +1 -6
  127. package/dist/server/ee/server/src/services/auth.js.map +1 -1
  128. package/dist/server/ee/server/src/services/auth.mjs +2 -7
  129. package/dist/server/ee/server/src/services/auth.mjs.map +1 -1
  130. package/dist/server/ee/server/src/services/metrics.js +9 -7
  131. package/dist/server/ee/server/src/services/metrics.js.map +1 -1
  132. package/dist/server/ee/server/src/services/metrics.mjs +9 -7
  133. package/dist/server/ee/server/src/services/metrics.mjs.map +1 -1
  134. package/dist/server/ee/server/src/services/persist-tables.js +3 -4
  135. package/dist/server/ee/server/src/services/persist-tables.js.map +1 -1
  136. package/dist/server/ee/server/src/services/persist-tables.mjs +3 -4
  137. package/dist/server/ee/server/src/services/persist-tables.mjs.map +1 -1
  138. package/dist/server/ee/server/src/services/role.js +2 -2
  139. package/dist/server/ee/server/src/services/role.js.map +1 -1
  140. package/dist/server/ee/server/src/services/role.mjs +1 -1
  141. package/dist/server/ee/server/src/services/role.mjs.map +1 -1
  142. package/dist/server/ee/server/src/services/seat-enforcement.js +20 -20
  143. package/dist/server/ee/server/src/services/seat-enforcement.js.map +1 -1
  144. package/dist/server/ee/server/src/services/seat-enforcement.mjs +20 -20
  145. package/dist/server/ee/server/src/services/seat-enforcement.mjs.map +1 -1
  146. package/dist/server/ee/server/src/services/user.js +37 -6
  147. package/dist/server/ee/server/src/services/user.js.map +1 -1
  148. package/dist/server/ee/server/src/services/user.mjs +38 -7
  149. package/dist/server/ee/server/src/services/user.mjs.map +1 -1
  150. package/dist/server/ee/server/src/utils/sso-lock.js +2 -2
  151. package/dist/server/ee/server/src/utils/sso-lock.js.map +1 -1
  152. package/dist/server/ee/server/src/utils/sso-lock.mjs +1 -1
  153. package/dist/server/ee/server/src/utils/sso-lock.mjs.map +1 -1
  154. package/dist/server/server/src/audit-logs/admin-users.js +169 -0
  155. package/dist/server/server/src/audit-logs/admin-users.js.map +1 -0
  156. package/dist/server/server/src/audit-logs/admin-users.mjs +157 -0
  157. package/dist/server/server/src/audit-logs/admin-users.mjs.map +1 -0
  158. package/dist/server/server/src/audit-logs/tokens.js +3 -3
  159. package/dist/server/server/src/audit-logs/tokens.js.map +1 -1
  160. package/dist/server/server/src/audit-logs/tokens.mjs +2 -2
  161. package/dist/server/server/src/audit-logs/tokens.mjs.map +1 -1
  162. package/dist/server/server/src/audit-logs/webhooks.js +106 -0
  163. package/dist/server/server/src/audit-logs/webhooks.js.map +1 -0
  164. package/dist/server/server/src/audit-logs/webhooks.mjs +100 -0
  165. package/dist/server/server/src/audit-logs/webhooks.mjs.map +1 -0
  166. package/dist/server/server/src/bootstrap.js +6 -4
  167. package/dist/server/server/src/bootstrap.js.map +1 -1
  168. package/dist/server/server/src/bootstrap.mjs +6 -4
  169. package/dist/server/server/src/bootstrap.mjs.map +1 -1
  170. package/dist/server/server/src/controllers/admin-token.js +8 -8
  171. package/dist/server/server/src/controllers/admin-token.js.map +1 -1
  172. package/dist/server/server/src/controllers/admin-token.mjs +4 -4
  173. package/dist/server/server/src/controllers/admin-token.mjs.map +1 -1
  174. package/dist/server/server/src/controllers/admin.js +4 -5
  175. package/dist/server/server/src/controllers/admin.js.map +1 -1
  176. package/dist/server/server/src/controllers/admin.mjs +3 -4
  177. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  178. package/dist/server/server/src/controllers/api-token.js +8 -8
  179. package/dist/server/server/src/controllers/api-token.js.map +1 -1
  180. package/dist/server/server/src/controllers/api-token.mjs +4 -4
  181. package/dist/server/server/src/controllers/api-token.mjs.map +1 -1
  182. package/dist/server/server/src/controllers/authentication.js +8 -1
  183. package/dist/server/server/src/controllers/authentication.js.map +1 -1
  184. package/dist/server/server/src/controllers/authentication.mjs +8 -1
  185. package/dist/server/server/src/controllers/authentication.mjs.map +1 -1
  186. package/dist/server/server/src/controllers/formatters/conditions.js +2 -2
  187. package/dist/server/server/src/controllers/formatters/conditions.js.map +1 -1
  188. package/dist/server/server/src/controllers/formatters/conditions.mjs +2 -2
  189. package/dist/server/server/src/controllers/formatters/conditions.mjs.map +1 -1
  190. package/dist/server/server/src/controllers/transfer/index.js +2 -2
  191. package/dist/server/server/src/controllers/transfer/index.js.map +1 -1
  192. package/dist/server/server/src/controllers/transfer/index.mjs +2 -2
  193. package/dist/server/server/src/controllers/transfer/index.mjs.map +1 -1
  194. package/dist/server/server/src/controllers/transfer/token.js +8 -8
  195. package/dist/server/server/src/controllers/transfer/token.js.map +1 -1
  196. package/dist/server/server/src/controllers/transfer/token.mjs +4 -4
  197. package/dist/server/server/src/controllers/transfer/token.mjs.map +1 -1
  198. package/dist/server/server/src/controllers/webhooks.js +26 -0
  199. package/dist/server/server/src/controllers/webhooks.js.map +1 -1
  200. package/dist/server/server/src/controllers/webhooks.mjs +27 -1
  201. package/dist/server/server/src/controllers/webhooks.mjs.map +1 -1
  202. package/dist/server/server/src/domain/action/index.js +18 -16
  203. package/dist/server/server/src/domain/action/index.js.map +1 -1
  204. package/dist/server/server/src/domain/action/index.mjs +16 -14
  205. package/dist/server/server/src/domain/action/index.mjs.map +1 -1
  206. package/dist/server/server/src/domain/action/provider.mjs +4 -4
  207. package/dist/server/server/src/domain/action/provider.mjs.map +1 -1
  208. package/dist/server/server/src/domain/condition/index.js +7 -4
  209. package/dist/server/server/src/domain/condition/index.js.map +1 -1
  210. package/dist/server/server/src/domain/condition/index.mjs +7 -4
  211. package/dist/server/server/src/domain/condition/index.mjs.map +1 -1
  212. package/dist/server/server/src/domain/permission/index.js +24 -15
  213. package/dist/server/server/src/domain/permission/index.js.map +1 -1
  214. package/dist/server/server/src/domain/permission/index.mjs +21 -12
  215. package/dist/server/server/src/domain/permission/index.mjs.map +1 -1
  216. package/dist/server/server/src/middlewares/rateLimit.js +5 -5
  217. package/dist/server/server/src/middlewares/rateLimit.js.map +1 -1
  218. package/dist/server/server/src/middlewares/rateLimit.mjs +4 -4
  219. package/dist/server/server/src/middlewares/rateLimit.mjs.map +1 -1
  220. package/dist/server/server/src/register.js +6 -0
  221. package/dist/server/server/src/register.js.map +1 -1
  222. package/dist/server/server/src/register.mjs +6 -0
  223. package/dist/server/server/src/register.mjs.map +1 -1
  224. package/dist/server/server/src/services/action.js +1 -2
  225. package/dist/server/server/src/services/action.js.map +1 -1
  226. package/dist/server/server/src/services/action.mjs +1 -2
  227. package/dist/server/server/src/services/action.mjs.map +1 -1
  228. package/dist/server/server/src/services/api-token.js +61 -49
  229. package/dist/server/server/src/services/api-token.js.map +1 -1
  230. package/dist/server/server/src/services/api-token.mjs +53 -41
  231. package/dist/server/server/src/services/api-token.mjs.map +1 -1
  232. package/dist/server/server/src/services/auth.js +27 -6
  233. package/dist/server/server/src/services/auth.js.map +1 -1
  234. package/dist/server/server/src/services/auth.mjs +28 -8
  235. package/dist/server/server/src/services/auth.mjs.map +1 -1
  236. package/dist/server/server/src/services/condition.js +2 -2
  237. package/dist/server/server/src/services/condition.js.map +1 -1
  238. package/dist/server/server/src/services/condition.mjs +1 -1
  239. package/dist/server/server/src/services/condition.mjs.map +1 -1
  240. package/dist/server/server/src/services/content-type.js +5 -4
  241. package/dist/server/server/src/services/content-type.js.map +1 -1
  242. package/dist/server/server/src/services/content-type.mjs +8 -7
  243. package/dist/server/server/src/services/content-type.mjs.map +1 -1
  244. package/dist/server/server/src/services/homepage.js +2 -1
  245. package/dist/server/server/src/services/homepage.js.map +1 -1
  246. package/dist/server/server/src/services/homepage.mjs +2 -1
  247. package/dist/server/server/src/services/homepage.mjs.map +1 -1
  248. package/dist/server/server/src/services/passport/local-strategy.js +2 -2
  249. package/dist/server/server/src/services/passport/local-strategy.js.map +1 -1
  250. package/dist/server/server/src/services/passport/local-strategy.mjs +1 -1
  251. package/dist/server/server/src/services/passport/local-strategy.mjs.map +1 -1
  252. package/dist/server/server/src/services/passport.js +1 -2
  253. package/dist/server/server/src/services/passport.js.map +1 -1
  254. package/dist/server/server/src/services/passport.mjs +1 -2
  255. package/dist/server/server/src/services/passport.mjs.map +1 -1
  256. package/dist/server/server/src/services/permission/engine.js +4 -4
  257. package/dist/server/server/src/services/permission/engine.js.map +1 -1
  258. package/dist/server/server/src/services/permission/engine.mjs +2 -2
  259. package/dist/server/server/src/services/permission/engine.mjs.map +1 -1
  260. package/dist/server/server/src/services/permission/permissions-manager/index.js +2 -3
  261. package/dist/server/server/src/services/permission/permissions-manager/index.js.map +1 -1
  262. package/dist/server/server/src/services/permission/permissions-manager/index.mjs +1 -2
  263. package/dist/server/server/src/services/permission/permissions-manager/index.mjs.map +1 -1
  264. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js +6 -6
  265. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js.map +1 -1
  266. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs +4 -4
  267. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs.map +1 -1
  268. package/dist/server/server/src/services/permission/permissions-manager/sanitize.js +47 -41
  269. package/dist/server/server/src/services/permission/permissions-manager/sanitize.js.map +1 -1
  270. package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs +44 -38
  271. package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs.map +1 -1
  272. package/dist/server/server/src/services/permission/permissions-manager/validate.js +30 -26
  273. package/dist/server/server/src/services/permission/permissions-manager/validate.js.map +1 -1
  274. package/dist/server/server/src/services/permission/permissions-manager/validate.mjs +28 -24
  275. package/dist/server/server/src/services/permission/permissions-manager/validate.mjs.map +1 -1
  276. package/dist/server/server/src/services/permission/queries.js +9 -9
  277. package/dist/server/server/src/services/permission/queries.js.map +1 -1
  278. package/dist/server/server/src/services/permission/queries.mjs +9 -9
  279. package/dist/server/server/src/services/permission/queries.mjs.map +1 -1
  280. package/dist/server/server/src/services/permission/rename-fields.js +118 -0
  281. package/dist/server/server/src/services/permission/rename-fields.js.map +1 -0
  282. package/dist/server/server/src/services/permission/rename-fields.mjs +116 -0
  283. package/dist/server/server/src/services/permission/rename-fields.mjs.map +1 -0
  284. package/dist/server/server/src/services/permission/sections-builder/index.js +2 -2
  285. package/dist/server/server/src/services/permission/sections-builder/index.js.map +1 -1
  286. package/dist/server/server/src/services/permission/sections-builder/index.mjs +2 -2
  287. package/dist/server/server/src/services/permission/sections-builder/index.mjs.map +1 -1
  288. package/dist/server/server/src/services/permission/sections-builder/section.js +1 -2
  289. package/dist/server/server/src/services/permission/sections-builder/section.js.map +1 -1
  290. package/dist/server/server/src/services/permission/sections-builder/section.mjs +1 -2
  291. package/dist/server/server/src/services/permission/sections-builder/section.mjs.map +1 -1
  292. package/dist/server/server/src/services/permission/sections-builder/utils.js +6 -6
  293. package/dist/server/server/src/services/permission/sections-builder/utils.js.map +1 -1
  294. package/dist/server/server/src/services/permission/sections-builder/utils.mjs +4 -4
  295. package/dist/server/server/src/services/permission/sections-builder/utils.mjs.map +1 -1
  296. package/dist/server/server/src/services/role.js +20 -19
  297. package/dist/server/server/src/services/role.js.map +1 -1
  298. package/dist/server/server/src/services/role.mjs +20 -19
  299. package/dist/server/server/src/services/role.mjs.map +1 -1
  300. package/dist/server/server/src/services/transfer/token.js +20 -16
  301. package/dist/server/server/src/services/transfer/token.js.map +1 -1
  302. package/dist/server/server/src/services/transfer/token.mjs +14 -10
  303. package/dist/server/server/src/services/transfer/token.mjs.map +1 -1
  304. package/dist/server/server/src/services/user.js +50 -12
  305. package/dist/server/server/src/services/user.js.map +1 -1
  306. package/dist/server/server/src/services/user.mjs +52 -14
  307. package/dist/server/server/src/services/user.mjs.map +1 -1
  308. package/dist/server/server/src/strategies/api-token-utils.js +2 -3
  309. package/dist/server/server/src/strategies/api-token-utils.js.map +1 -1
  310. package/dist/server/server/src/strategies/api-token-utils.mjs +2 -3
  311. package/dist/server/server/src/strategies/api-token-utils.mjs.map +1 -1
  312. package/dist/server/server/src/strategies/content-api-token.js +3 -3
  313. package/dist/server/server/src/strategies/content-api-token.js.map +1 -1
  314. package/dist/server/server/src/strategies/content-api-token.mjs +1 -1
  315. package/dist/server/server/src/strategies/content-api-token.mjs.map +1 -1
  316. package/dist/server/server/src/strategies/data-transfer.js +4 -4
  317. package/dist/server/server/src/strategies/data-transfer.js.map +1 -1
  318. package/dist/server/server/src/strategies/data-transfer.mjs +3 -3
  319. package/dist/server/server/src/strategies/data-transfer.mjs.map +1 -1
  320. package/dist/server/server/src/validation/common-validators.js +9 -10
  321. package/dist/server/server/src/validation/common-validators.js.map +1 -1
  322. package/dist/server/server/src/validation/common-validators.mjs +13 -14
  323. package/dist/server/server/src/validation/common-validators.mjs.map +1 -1
  324. package/dist/server/server/src/validation/user.js +1 -2
  325. package/dist/server/server/src/validation/user.js.map +1 -1
  326. package/dist/server/server/src/validation/user.mjs +1 -2
  327. package/dist/server/server/src/validation/user.mjs.map +1 -1
  328. package/dist/server/src/audit-logs/admin-users.d.ts +119 -0
  329. package/dist/server/src/audit-logs/admin-users.d.ts.map +1 -0
  330. package/dist/server/src/audit-logs/tokens.d.ts.map +1 -1
  331. package/dist/server/src/audit-logs/webhooks.d.ts +59 -0
  332. package/dist/server/src/audit-logs/webhooks.d.ts.map +1 -0
  333. package/dist/server/src/bootstrap.d.ts.map +1 -1
  334. package/dist/server/src/controllers/admin-token.d.ts.map +1 -1
  335. package/dist/server/src/controllers/admin.d.ts +2 -11
  336. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  337. package/dist/server/src/controllers/api-token.d.ts.map +1 -1
  338. package/dist/server/src/controllers/authentication.d.ts.map +1 -1
  339. package/dist/server/src/controllers/formatters/conditions.d.ts +1 -1
  340. package/dist/server/src/controllers/formatters/conditions.d.ts.map +1 -1
  341. package/dist/server/src/controllers/homepage.d.ts +1 -1
  342. package/dist/server/src/controllers/index.d.ts +2 -11
  343. package/dist/server/src/controllers/index.d.ts.map +1 -1
  344. package/dist/server/src/controllers/transfer/index.d.ts.map +1 -1
  345. package/dist/server/src/controllers/transfer/token.d.ts.map +1 -1
  346. package/dist/server/src/controllers/webhooks.d.ts.map +1 -1
  347. package/dist/server/src/domain/action/index.d.ts +1 -0
  348. package/dist/server/src/domain/action/index.d.ts.map +1 -1
  349. package/dist/server/src/domain/condition/index.d.ts +2 -2
  350. package/dist/server/src/domain/condition/index.d.ts.map +1 -1
  351. package/dist/server/src/domain/permission/index.d.ts.map +1 -1
  352. package/dist/server/src/domain/user.d.ts +2 -2
  353. package/dist/server/src/index.d.ts +4 -13
  354. package/dist/server/src/index.d.ts.map +1 -1
  355. package/dist/server/src/middlewares/index.d.ts.map +1 -1
  356. package/dist/server/src/middlewares/rateLimit.d.ts.map +1 -1
  357. package/dist/server/src/register.d.ts.map +1 -1
  358. package/dist/server/src/services/action.d.ts.map +1 -1
  359. package/dist/server/src/services/api-token.d.ts.map +1 -1
  360. package/dist/server/src/services/auth.d.ts +6 -1
  361. package/dist/server/src/services/auth.d.ts.map +1 -1
  362. package/dist/server/src/services/condition.d.ts.map +1 -1
  363. package/dist/server/src/services/content-type.d.ts.map +1 -1
  364. package/dist/server/src/services/homepage.d.ts +1 -1
  365. package/dist/server/src/services/homepage.d.ts.map +1 -1
  366. package/dist/server/src/services/index.d.ts +2 -2
  367. package/dist/server/src/services/index.d.ts.map +1 -1
  368. package/dist/server/src/services/passport/local-strategy.d.ts.map +1 -1
  369. package/dist/server/src/services/passport.d.ts.map +1 -1
  370. package/dist/server/src/services/permission/engine.d.ts.map +1 -1
  371. package/dist/server/src/services/permission/permissions-manager/permission-fields.d.ts.map +1 -1
  372. package/dist/server/src/services/permission/permissions-manager/sanitize.d.ts.map +1 -1
  373. package/dist/server/src/services/permission/permissions-manager/validate.d.ts.map +1 -1
  374. package/dist/server/src/services/permission/queries.d.ts.map +1 -1
  375. package/dist/server/src/services/permission/rename-fields.d.ts +21 -0
  376. package/dist/server/src/services/permission/rename-fields.d.ts.map +1 -0
  377. package/dist/server/src/services/permission/sections-builder/section.d.ts.map +1 -1
  378. package/dist/server/src/services/permission/sections-builder/utils.d.ts +1 -1
  379. package/dist/server/src/services/permission/sections-builder/utils.d.ts.map +1 -1
  380. package/dist/server/src/services/role.d.ts +1 -1
  381. package/dist/server/src/services/role.d.ts.map +1 -1
  382. package/dist/server/src/services/transfer/token.d.ts.map +1 -1
  383. package/dist/server/src/services/user.d.ts.map +1 -1
  384. package/dist/server/src/strategies/content-api-token.d.ts.map +1 -1
  385. package/dist/server/src/validation/user.d.ts.map +1 -1
  386. package/dist/shared/contracts/admin.d.ts +36 -2
  387. package/dist/shared/contracts/admin.d.ts.map +1 -1
  388. package/package.json +13 -13
@@ -1,31 +1,34 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var index = require('../utils/index.js');
5
5
  var constants = require('../../../../server/src/services/constants.js');
6
6
 
7
7
  const { SUPER_ADMIN_CODE } = constants;
8
8
  /**
9
- * Keeps the list of users disabled by the seat enforcement service
9
+ * Returns users disabled by seat enforcement, or an empty list when none are stored.
10
10
  */ const getDisabledUserList = async ()=>{
11
- return strapi.store.get({
11
+ const disabledUsers = await strapi.store.get({
12
12
  type: 'ee',
13
13
  key: 'disabled_users'
14
14
  });
15
+ return disabledUsers ?? [];
15
16
  };
16
17
  const enableMaximumUserCount = async (numberOfUsersToEnable)=>{
17
18
  const disabledUsers = await getDisabledUserList();
18
- const orderedDisabledUsers = fp.reverse(disabledUsers);
19
- const usersToEnable = fp.take(numberOfUsersToEnable, orderedDisabledUsers);
19
+ const orderedDisabledUsers = [
20
+ ...disabledUsers
21
+ ].reverse();
22
+ const usersToEnable = _.take(orderedDisabledUsers, numberOfUsersToEnable);
20
23
  await strapi.db.query('admin::user').updateMany({
21
24
  where: {
22
- id: fp.map(fp.prop('id'), usersToEnable)
25
+ id: usersToEnable.map((user)=>user?.id)
23
26
  },
24
27
  data: {
25
28
  isActive: true
26
29
  }
27
30
  });
28
- const remainingDisabledUsers = fp.drop(numberOfUsersToEnable, orderedDisabledUsers);
31
+ const remainingDisabledUsers = _.drop(orderedDisabledUsers, numberOfUsersToEnable);
29
32
  await strapi.store.set({
30
33
  type: 'ee',
31
34
  key: 'disabled_users',
@@ -33,7 +36,7 @@ const enableMaximumUserCount = async (numberOfUsersToEnable)=>{
33
36
  });
34
37
  };
35
38
  const disableUsersAboveLicenseLimit = async (numberOfUsersToDisable)=>{
36
- const currentlyDisabledUsers = await getDisabledUserList() ?? [];
39
+ const currentlyDisabledUsers = await getDisabledUserList();
37
40
  const usersToDisable = [];
38
41
  const nonSuperAdminUsersToDisable = await strapi.db.query('admin::user').findMany({
39
42
  where: {
@@ -67,7 +70,7 @@ const disableUsersAboveLicenseLimit = async (numberOfUsersToDisable)=>{
67
70
  }
68
71
  await strapi.db.query('admin::user').updateMany({
69
72
  where: {
70
- id: fp.map(fp.prop('id'), usersToDisable)
73
+ id: usersToDisable.map((user)=>user?.id)
71
74
  },
72
75
  data: {
73
76
  isActive: false
@@ -76,23 +79,20 @@ const disableUsersAboveLicenseLimit = async (numberOfUsersToDisable)=>{
76
79
  await strapi.store.set({
77
80
  type: 'ee',
78
81
  key: 'disabled_users',
79
- value: currentlyDisabledUsers.concat(fp.map(fp.pick([
80
- 'id',
81
- 'isActive'
82
- ]), usersToDisable))
82
+ value: currentlyDisabledUsers.concat(usersToDisable.map((user)=>_.pick(user, [
83
+ 'id',
84
+ 'isActive'
85
+ ])))
83
86
  });
84
87
  };
85
88
  const syncDisabledUserRecords = async ()=>{
86
- const disabledUsers = await strapi.store.get({
87
- type: 'ee',
88
- key: 'disabled_users'
89
- });
90
- if (!disabledUsers) {
89
+ const disabledUsers = await getDisabledUserList();
90
+ if (disabledUsers.length === 0) {
91
91
  return;
92
92
  }
93
93
  await strapi.db.query('admin::user').updateMany({
94
94
  where: {
95
- id: fp.map(fp.prop('id'), disabledUsers)
95
+ id: Array.from(disabledUsers, (user)=>user?.id)
96
96
  },
97
97
  data: {
98
98
  isActive: false
@@ -101,7 +101,7 @@ const syncDisabledUserRecords = async ()=>{
101
101
  };
102
102
  const seatEnforcementWorkflow = async ()=>{
103
103
  const adminSeats = strapi.ee.seats;
104
- if (fp.isNil(adminSeats)) {
104
+ if (adminSeats == null) {
105
105
  return;
106
106
  }
107
107
  // TODO: we need to make sure an admin can decide to disable specific user and reactivate others
@@ -1 +1 @@
1
- {"version":3,"file":"seat-enforcement.js","sources":["../../../../../../ee/server/src/services/seat-enforcement.ts"],"sourcesContent":["import { take, drop, map, prop, pick, reverse, isNil } from 'lodash/fp';\nimport { getService } from '../utils';\nimport constants from '../../../../server/src/services/constants';\n\nconst { SUPER_ADMIN_CODE } = constants;\n\n/**\n * Keeps the list of users disabled by the seat enforcement service\n */\nconst getDisabledUserList = async () => {\n return strapi.store.get({ type: 'ee', key: 'disabled_users' });\n};\n\nconst enableMaximumUserCount = async (numberOfUsersToEnable: number) => {\n const disabledUsers = (await getDisabledUserList()) as any;\n const orderedDisabledUsers = reverse(disabledUsers);\n\n const usersToEnable = take(numberOfUsersToEnable, orderedDisabledUsers);\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: map(prop('id'), usersToEnable) },\n data: { isActive: true },\n });\n\n const remainingDisabledUsers = drop(numberOfUsersToEnable, orderedDisabledUsers);\n\n await strapi.store.set({\n type: 'ee',\n key: 'disabled_users',\n value: remainingDisabledUsers,\n });\n};\n\nconst disableUsersAboveLicenseLimit = async (numberOfUsersToDisable: number) => {\n const currentlyDisabledUsers: any = (await getDisabledUserList()) ?? [];\n\n const usersToDisable = [];\n const nonSuperAdminUsersToDisable = await strapi.db.query('admin::user').findMany({\n where: {\n isActive: true,\n roles: {\n code: { $ne: SUPER_ADMIN_CODE },\n },\n },\n orderBy: { createdAt: 'DESC' },\n limit: numberOfUsersToDisable,\n });\n\n usersToDisable.push(...nonSuperAdminUsersToDisable);\n\n if (nonSuperAdminUsersToDisable.length < numberOfUsersToDisable) {\n const superAdminUsersToDisable = await strapi.db.query('admin::user').findMany({\n where: {\n isActive: true,\n roles: { code: SUPER_ADMIN_CODE },\n },\n orderBy: { createdAt: 'DESC' },\n limit: numberOfUsersToDisable - nonSuperAdminUsersToDisable.length,\n });\n\n usersToDisable.push(...superAdminUsersToDisable);\n }\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: map(prop('id'), usersToDisable) },\n data: { isActive: false },\n });\n\n await strapi.store.set({\n type: 'ee',\n key: 'disabled_users',\n value: currentlyDisabledUsers.concat(map(pick(['id', 'isActive']), usersToDisable)),\n });\n};\n\nconst syncDisabledUserRecords = async () => {\n const disabledUsers = await strapi.store.get({ type: 'ee', key: 'disabled_users' });\n\n if (!disabledUsers) {\n return;\n }\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: map(prop('id'), disabledUsers) },\n data: { isActive: false },\n });\n};\n\nconst seatEnforcementWorkflow = async () => {\n const adminSeats = strapi.ee.seats;\n if (isNil(adminSeats)) {\n return;\n }\n\n // TODO: we need to make sure an admin can decide to disable specific user and reactivate others\n await syncDisabledUserRecords();\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const adminSeatsLeft = adminSeats - currentActiveUserCount;\n\n if (adminSeatsLeft > 0) {\n await enableMaximumUserCount(adminSeatsLeft);\n } else if (adminSeatsLeft < 0) {\n await disableUsersAboveLicenseLimit(-adminSeatsLeft);\n }\n};\n\nexport default {\n seatEnforcementWorkflow,\n getDisabledUserList,\n};\n"],"names":["SUPER_ADMIN_CODE","constants","getDisabledUserList","strapi","store","get","type","key","enableMaximumUserCount","numberOfUsersToEnable","disabledUsers","orderedDisabledUsers","reverse","usersToEnable","take","db","query","updateMany","where","id","map","prop","data","isActive","remainingDisabledUsers","drop","set","value","disableUsersAboveLicenseLimit","numberOfUsersToDisable","currentlyDisabledUsers","usersToDisable","nonSuperAdminUsersToDisable","findMany","roles","code","$ne","orderBy","createdAt","limit","push","length","superAdminUsersToDisable","concat","pick","syncDisabledUserRecords","seatEnforcementWorkflow","adminSeats","ee","seats","isNil","currentActiveUserCount","getService","getCurrentActiveUserCount","adminSeatsLeft"],"mappings":"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"}
1
+ {"version":3,"file":"seat-enforcement.js","sources":["../../../../../../ee/server/src/services/seat-enforcement.ts"],"sourcesContent":["import { pick, take, drop } from 'lodash';\n\nimport { getService } from '../utils';\nimport constants from '../../../../server/src/services/constants';\nimport type { AdminUser } from '../../../../shared/contracts/shared';\n\nconst { SUPER_ADMIN_CODE } = constants;\n\ntype DisabledUser = Pick<AdminUser, 'id' | 'isActive'>;\n\n/**\n * Returns users disabled by seat enforcement, or an empty list when none are stored.\n */\nconst getDisabledUserList = async (): Promise<DisabledUser[]> => {\n const disabledUsers = (await strapi.store.get({ type: 'ee', key: 'disabled_users' })) as\n | DisabledUser[]\n | null\n | undefined;\n\n return disabledUsers ?? [];\n};\n\nconst enableMaximumUserCount = async (numberOfUsersToEnable: number) => {\n const disabledUsers = await getDisabledUserList();\n const orderedDisabledUsers = [...disabledUsers].reverse();\n\n const usersToEnable = take(orderedDisabledUsers, numberOfUsersToEnable);\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: usersToEnable.map((user) => user?.id) },\n data: { isActive: true },\n });\n\n const remainingDisabledUsers = drop(orderedDisabledUsers, numberOfUsersToEnable);\n\n await strapi.store.set({\n type: 'ee',\n key: 'disabled_users',\n value: remainingDisabledUsers,\n });\n};\n\nconst disableUsersAboveLicenseLimit = async (numberOfUsersToDisable: number) => {\n const currentlyDisabledUsers = await getDisabledUserList();\n\n const usersToDisable = [];\n const nonSuperAdminUsersToDisable = await strapi.db.query('admin::user').findMany({\n where: {\n isActive: true,\n roles: {\n code: { $ne: SUPER_ADMIN_CODE },\n },\n },\n orderBy: { createdAt: 'DESC' },\n limit: numberOfUsersToDisable,\n });\n\n usersToDisable.push(...nonSuperAdminUsersToDisable);\n\n if (nonSuperAdminUsersToDisable.length < numberOfUsersToDisable) {\n const superAdminUsersToDisable = await strapi.db.query('admin::user').findMany({\n where: {\n isActive: true,\n roles: { code: SUPER_ADMIN_CODE },\n },\n orderBy: { createdAt: 'DESC' },\n limit: numberOfUsersToDisable - nonSuperAdminUsersToDisable.length,\n });\n\n usersToDisable.push(...superAdminUsersToDisable);\n }\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: usersToDisable.map((user) => user?.id) },\n data: { isActive: false },\n });\n\n await strapi.store.set({\n type: 'ee',\n key: 'disabled_users',\n value: currentlyDisabledUsers.concat(\n usersToDisable.map((user) => pick(user, ['id', 'isActive']))\n ),\n });\n};\n\nconst syncDisabledUserRecords = async () => {\n const disabledUsers = await getDisabledUserList();\n\n if (disabledUsers.length === 0) {\n return;\n }\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: Array.from(disabledUsers, (user) => user?.id) },\n data: { isActive: false },\n });\n};\n\nconst seatEnforcementWorkflow = async () => {\n const adminSeats = strapi.ee.seats;\n if (adminSeats == null) {\n return;\n }\n\n // TODO: we need to make sure an admin can decide to disable specific user and reactivate others\n await syncDisabledUserRecords();\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const adminSeatsLeft = adminSeats - currentActiveUserCount;\n\n if (adminSeatsLeft > 0) {\n await enableMaximumUserCount(adminSeatsLeft);\n } else if (adminSeatsLeft < 0) {\n await disableUsersAboveLicenseLimit(-adminSeatsLeft);\n }\n};\n\nexport default {\n seatEnforcementWorkflow,\n getDisabledUserList,\n};\n"],"names":["SUPER_ADMIN_CODE","constants","getDisabledUserList","disabledUsers","strapi","store","get","type","key","enableMaximumUserCount","numberOfUsersToEnable","orderedDisabledUsers","reverse","usersToEnable","take","db","query","updateMany","where","id","map","user","data","isActive","remainingDisabledUsers","drop","set","value","disableUsersAboveLicenseLimit","numberOfUsersToDisable","currentlyDisabledUsers","usersToDisable","nonSuperAdminUsersToDisable","findMany","roles","code","$ne","orderBy","createdAt","limit","push","length","superAdminUsersToDisable","concat","pick","syncDisabledUserRecords","Array","from","seatEnforcementWorkflow","adminSeats","ee","seats","currentActiveUserCount","getService","getCurrentActiveUserCount","adminSeatsLeft"],"mappings":"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"}
@@ -1,29 +1,32 @@
1
- import { isNil, map, prop, reverse, take, drop, pick } from 'lodash/fp';
1
+ import { take, drop, pick } from 'lodash';
2
2
  import { getService } from '../utils/index.mjs';
3
3
  import constants from '../../../../server/src/services/constants.mjs';
4
4
 
5
5
  const { SUPER_ADMIN_CODE } = constants;
6
6
  /**
7
- * Keeps the list of users disabled by the seat enforcement service
7
+ * Returns users disabled by seat enforcement, or an empty list when none are stored.
8
8
  */ const getDisabledUserList = async ()=>{
9
- return strapi.store.get({
9
+ const disabledUsers = await strapi.store.get({
10
10
  type: 'ee',
11
11
  key: 'disabled_users'
12
12
  });
13
+ return disabledUsers ?? [];
13
14
  };
14
15
  const enableMaximumUserCount = async (numberOfUsersToEnable)=>{
15
16
  const disabledUsers = await getDisabledUserList();
16
- const orderedDisabledUsers = reverse(disabledUsers);
17
- const usersToEnable = take(numberOfUsersToEnable, orderedDisabledUsers);
17
+ const orderedDisabledUsers = [
18
+ ...disabledUsers
19
+ ].reverse();
20
+ const usersToEnable = take(orderedDisabledUsers, numberOfUsersToEnable);
18
21
  await strapi.db.query('admin::user').updateMany({
19
22
  where: {
20
- id: map(prop('id'), usersToEnable)
23
+ id: usersToEnable.map((user)=>user?.id)
21
24
  },
22
25
  data: {
23
26
  isActive: true
24
27
  }
25
28
  });
26
- const remainingDisabledUsers = drop(numberOfUsersToEnable, orderedDisabledUsers);
29
+ const remainingDisabledUsers = drop(orderedDisabledUsers, numberOfUsersToEnable);
27
30
  await strapi.store.set({
28
31
  type: 'ee',
29
32
  key: 'disabled_users',
@@ -31,7 +34,7 @@ const enableMaximumUserCount = async (numberOfUsersToEnable)=>{
31
34
  });
32
35
  };
33
36
  const disableUsersAboveLicenseLimit = async (numberOfUsersToDisable)=>{
34
- const currentlyDisabledUsers = await getDisabledUserList() ?? [];
37
+ const currentlyDisabledUsers = await getDisabledUserList();
35
38
  const usersToDisable = [];
36
39
  const nonSuperAdminUsersToDisable = await strapi.db.query('admin::user').findMany({
37
40
  where: {
@@ -65,7 +68,7 @@ const disableUsersAboveLicenseLimit = async (numberOfUsersToDisable)=>{
65
68
  }
66
69
  await strapi.db.query('admin::user').updateMany({
67
70
  where: {
68
- id: map(prop('id'), usersToDisable)
71
+ id: usersToDisable.map((user)=>user?.id)
69
72
  },
70
73
  data: {
71
74
  isActive: false
@@ -74,23 +77,20 @@ const disableUsersAboveLicenseLimit = async (numberOfUsersToDisable)=>{
74
77
  await strapi.store.set({
75
78
  type: 'ee',
76
79
  key: 'disabled_users',
77
- value: currentlyDisabledUsers.concat(map(pick([
78
- 'id',
79
- 'isActive'
80
- ]), usersToDisable))
80
+ value: currentlyDisabledUsers.concat(usersToDisable.map((user)=>pick(user, [
81
+ 'id',
82
+ 'isActive'
83
+ ])))
81
84
  });
82
85
  };
83
86
  const syncDisabledUserRecords = async ()=>{
84
- const disabledUsers = await strapi.store.get({
85
- type: 'ee',
86
- key: 'disabled_users'
87
- });
88
- if (!disabledUsers) {
87
+ const disabledUsers = await getDisabledUserList();
88
+ if (disabledUsers.length === 0) {
89
89
  return;
90
90
  }
91
91
  await strapi.db.query('admin::user').updateMany({
92
92
  where: {
93
- id: map(prop('id'), disabledUsers)
93
+ id: Array.from(disabledUsers, (user)=>user?.id)
94
94
  },
95
95
  data: {
96
96
  isActive: false
@@ -99,7 +99,7 @@ const syncDisabledUserRecords = async ()=>{
99
99
  };
100
100
  const seatEnforcementWorkflow = async ()=>{
101
101
  const adminSeats = strapi.ee.seats;
102
- if (isNil(adminSeats)) {
102
+ if (adminSeats == null) {
103
103
  return;
104
104
  }
105
105
  // TODO: we need to make sure an admin can decide to disable specific user and reactivate others
@@ -1 +1 @@
1
- {"version":3,"file":"seat-enforcement.mjs","sources":["../../../../../../ee/server/src/services/seat-enforcement.ts"],"sourcesContent":["import { take, drop, map, prop, pick, reverse, isNil } from 'lodash/fp';\nimport { getService } from '../utils';\nimport constants from '../../../../server/src/services/constants';\n\nconst { SUPER_ADMIN_CODE } = constants;\n\n/**\n * Keeps the list of users disabled by the seat enforcement service\n */\nconst getDisabledUserList = async () => {\n return strapi.store.get({ type: 'ee', key: 'disabled_users' });\n};\n\nconst enableMaximumUserCount = async (numberOfUsersToEnable: number) => {\n const disabledUsers = (await getDisabledUserList()) as any;\n const orderedDisabledUsers = reverse(disabledUsers);\n\n const usersToEnable = take(numberOfUsersToEnable, orderedDisabledUsers);\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: map(prop('id'), usersToEnable) },\n data: { isActive: true },\n });\n\n const remainingDisabledUsers = drop(numberOfUsersToEnable, orderedDisabledUsers);\n\n await strapi.store.set({\n type: 'ee',\n key: 'disabled_users',\n value: remainingDisabledUsers,\n });\n};\n\nconst disableUsersAboveLicenseLimit = async (numberOfUsersToDisable: number) => {\n const currentlyDisabledUsers: any = (await getDisabledUserList()) ?? [];\n\n const usersToDisable = [];\n const nonSuperAdminUsersToDisable = await strapi.db.query('admin::user').findMany({\n where: {\n isActive: true,\n roles: {\n code: { $ne: SUPER_ADMIN_CODE },\n },\n },\n orderBy: { createdAt: 'DESC' },\n limit: numberOfUsersToDisable,\n });\n\n usersToDisable.push(...nonSuperAdminUsersToDisable);\n\n if (nonSuperAdminUsersToDisable.length < numberOfUsersToDisable) {\n const superAdminUsersToDisable = await strapi.db.query('admin::user').findMany({\n where: {\n isActive: true,\n roles: { code: SUPER_ADMIN_CODE },\n },\n orderBy: { createdAt: 'DESC' },\n limit: numberOfUsersToDisable - nonSuperAdminUsersToDisable.length,\n });\n\n usersToDisable.push(...superAdminUsersToDisable);\n }\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: map(prop('id'), usersToDisable) },\n data: { isActive: false },\n });\n\n await strapi.store.set({\n type: 'ee',\n key: 'disabled_users',\n value: currentlyDisabledUsers.concat(map(pick(['id', 'isActive']), usersToDisable)),\n });\n};\n\nconst syncDisabledUserRecords = async () => {\n const disabledUsers = await strapi.store.get({ type: 'ee', key: 'disabled_users' });\n\n if (!disabledUsers) {\n return;\n }\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: map(prop('id'), disabledUsers) },\n data: { isActive: false },\n });\n};\n\nconst seatEnforcementWorkflow = async () => {\n const adminSeats = strapi.ee.seats;\n if (isNil(adminSeats)) {\n return;\n }\n\n // TODO: we need to make sure an admin can decide to disable specific user and reactivate others\n await syncDisabledUserRecords();\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const adminSeatsLeft = adminSeats - currentActiveUserCount;\n\n if (adminSeatsLeft > 0) {\n await enableMaximumUserCount(adminSeatsLeft);\n } else if (adminSeatsLeft < 0) {\n await disableUsersAboveLicenseLimit(-adminSeatsLeft);\n }\n};\n\nexport default {\n seatEnforcementWorkflow,\n getDisabledUserList,\n};\n"],"names":["SUPER_ADMIN_CODE","constants","getDisabledUserList","strapi","store","get","type","key","enableMaximumUserCount","numberOfUsersToEnable","disabledUsers","orderedDisabledUsers","reverse","usersToEnable","take","db","query","updateMany","where","id","map","prop","data","isActive","remainingDisabledUsers","drop","set","value","disableUsersAboveLicenseLimit","numberOfUsersToDisable","currentlyDisabledUsers","usersToDisable","nonSuperAdminUsersToDisable","findMany","roles","code","$ne","orderBy","createdAt","limit","push","length","superAdminUsersToDisable","concat","pick","syncDisabledUserRecords","seatEnforcementWorkflow","adminSeats","ee","seats","isNil","currentActiveUserCount","getService","getCurrentActiveUserCount","adminSeatsLeft"],"mappings":"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"}
1
+ {"version":3,"file":"seat-enforcement.mjs","sources":["../../../../../../ee/server/src/services/seat-enforcement.ts"],"sourcesContent":["import { pick, take, drop } from 'lodash';\n\nimport { getService } from '../utils';\nimport constants from '../../../../server/src/services/constants';\nimport type { AdminUser } from '../../../../shared/contracts/shared';\n\nconst { SUPER_ADMIN_CODE } = constants;\n\ntype DisabledUser = Pick<AdminUser, 'id' | 'isActive'>;\n\n/**\n * Returns users disabled by seat enforcement, or an empty list when none are stored.\n */\nconst getDisabledUserList = async (): Promise<DisabledUser[]> => {\n const disabledUsers = (await strapi.store.get({ type: 'ee', key: 'disabled_users' })) as\n | DisabledUser[]\n | null\n | undefined;\n\n return disabledUsers ?? [];\n};\n\nconst enableMaximumUserCount = async (numberOfUsersToEnable: number) => {\n const disabledUsers = await getDisabledUserList();\n const orderedDisabledUsers = [...disabledUsers].reverse();\n\n const usersToEnable = take(orderedDisabledUsers, numberOfUsersToEnable);\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: usersToEnable.map((user) => user?.id) },\n data: { isActive: true },\n });\n\n const remainingDisabledUsers = drop(orderedDisabledUsers, numberOfUsersToEnable);\n\n await strapi.store.set({\n type: 'ee',\n key: 'disabled_users',\n value: remainingDisabledUsers,\n });\n};\n\nconst disableUsersAboveLicenseLimit = async (numberOfUsersToDisable: number) => {\n const currentlyDisabledUsers = await getDisabledUserList();\n\n const usersToDisable = [];\n const nonSuperAdminUsersToDisable = await strapi.db.query('admin::user').findMany({\n where: {\n isActive: true,\n roles: {\n code: { $ne: SUPER_ADMIN_CODE },\n },\n },\n orderBy: { createdAt: 'DESC' },\n limit: numberOfUsersToDisable,\n });\n\n usersToDisable.push(...nonSuperAdminUsersToDisable);\n\n if (nonSuperAdminUsersToDisable.length < numberOfUsersToDisable) {\n const superAdminUsersToDisable = await strapi.db.query('admin::user').findMany({\n where: {\n isActive: true,\n roles: { code: SUPER_ADMIN_CODE },\n },\n orderBy: { createdAt: 'DESC' },\n limit: numberOfUsersToDisable - nonSuperAdminUsersToDisable.length,\n });\n\n usersToDisable.push(...superAdminUsersToDisable);\n }\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: usersToDisable.map((user) => user?.id) },\n data: { isActive: false },\n });\n\n await strapi.store.set({\n type: 'ee',\n key: 'disabled_users',\n value: currentlyDisabledUsers.concat(\n usersToDisable.map((user) => pick(user, ['id', 'isActive']))\n ),\n });\n};\n\nconst syncDisabledUserRecords = async () => {\n const disabledUsers = await getDisabledUserList();\n\n if (disabledUsers.length === 0) {\n return;\n }\n\n await strapi.db.query('admin::user').updateMany({\n where: { id: Array.from(disabledUsers, (user) => user?.id) },\n data: { isActive: false },\n });\n};\n\nconst seatEnforcementWorkflow = async () => {\n const adminSeats = strapi.ee.seats;\n if (adminSeats == null) {\n return;\n }\n\n // TODO: we need to make sure an admin can decide to disable specific user and reactivate others\n await syncDisabledUserRecords();\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const adminSeatsLeft = adminSeats - currentActiveUserCount;\n\n if (adminSeatsLeft > 0) {\n await enableMaximumUserCount(adminSeatsLeft);\n } else if (adminSeatsLeft < 0) {\n await disableUsersAboveLicenseLimit(-adminSeatsLeft);\n }\n};\n\nexport default {\n seatEnforcementWorkflow,\n getDisabledUserList,\n};\n"],"names":["SUPER_ADMIN_CODE","constants","getDisabledUserList","disabledUsers","strapi","store","get","type","key","enableMaximumUserCount","numberOfUsersToEnable","orderedDisabledUsers","reverse","usersToEnable","take","db","query","updateMany","where","id","map","user","data","isActive","remainingDisabledUsers","drop","set","value","disableUsersAboveLicenseLimit","numberOfUsersToDisable","currentlyDisabledUsers","usersToDisable","nonSuperAdminUsersToDisable","findMany","roles","code","$ne","orderBy","createdAt","limit","push","length","superAdminUsersToDisable","concat","pick","syncDisabledUserRecords","Array","from","seatEnforcementWorkflow","adminSeats","ee","seats","currentActiveUserCount","getService","getCurrentActiveUserCount","adminSeatsLeft"],"mappings":";;;;AAMA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,SAAAA;AAI7B;;AAEC,IACD,MAAMC,mBAAAA,GAAsB,UAAA;AAC1B,IAAA,MAAMC,gBAAiB,MAAMC,MAAAA,CAAOC,KAAK,CAACC,GAAG,CAAC;QAAEC,IAAAA,EAAM,IAAA;QAAMC,GAAAA,EAAK;AAAiB,KAAA,CAAA;AAKlF,IAAA,OAAOL,iBAAiB,EAAE;AAC5B,CAAA;AAEA,MAAMM,yBAAyB,OAAOC,qBAAAA,GAAAA;AACpC,IAAA,MAAMP,gBAAgB,MAAMD,mBAAAA,EAAAA;AAC5B,IAAA,MAAMS,oBAAAA,GAAuB;AAAIR,QAAAA,GAAAA;AAAc,KAAA,CAACS,OAAO,EAAA;IAEvD,MAAMC,aAAAA,GAAgBC,KAAKH,oBAAAA,EAAsBD,qBAAAA,CAAAA;AAEjD,IAAA,MAAMN,OAAOW,EAAE,CAACC,KAAK,CAAC,aAAA,CAAA,CAAeC,UAAU,CAAC;QAC9CC,KAAAA,EAAO;AAAEC,YAAAA,EAAAA,EAAIN,aAAAA,CAAcO,GAAG,CAAC,CAACC,OAASA,IAAAA,EAAMF,EAAAA;AAAI,SAAA;QACnDG,IAAAA,EAAM;YAAEC,QAAAA,EAAU;AAAK;AACzB,KAAA,CAAA;IAEA,MAAMC,sBAAAA,GAAyBC,KAAKd,oBAAAA,EAAsBD,qBAAAA,CAAAA;AAE1D,IAAA,MAAMN,MAAAA,CAAOC,KAAK,CAACqB,GAAG,CAAC;QACrBnB,IAAAA,EAAM,IAAA;QACNC,GAAAA,EAAK,gBAAA;QACLmB,KAAAA,EAAOH;AACT,KAAA,CAAA;AACF,CAAA;AAEA,MAAMI,gCAAgC,OAAOC,sBAAAA,GAAAA;AAC3C,IAAA,MAAMC,yBAAyB,MAAM5B,mBAAAA,EAAAA;AAErC,IAAA,MAAM6B,iBAAiB,EAAE;IACzB,MAAMC,2BAAAA,GAA8B,MAAM5B,MAAAA,CAAOW,EAAE,CAACC,KAAK,CAAC,aAAA,CAAA,CAAeiB,QAAQ,CAAC;QAChFf,KAAAA,EAAO;YACLK,QAAAA,EAAU,IAAA;YACVW,KAAAA,EAAO;gBACLC,IAAAA,EAAM;oBAAEC,GAAAA,EAAKpC;AAAiB;AAChC;AACF,SAAA;QACAqC,OAAAA,EAAS;YAAEC,SAAAA,EAAW;AAAO,SAAA;QAC7BC,KAAAA,EAAOV;AACT,KAAA,CAAA;AAEAE,IAAAA,cAAAA,CAAeS,IAAI,CAAA,GAAIR,2BAAAA,CAAAA;IAEvB,IAAIA,2BAAAA,CAA4BS,MAAM,GAAGZ,sBAAAA,EAAwB;QAC/D,MAAMa,wBAAAA,GAA2B,MAAMtC,MAAAA,CAAOW,EAAE,CAACC,KAAK,CAAC,aAAA,CAAA,CAAeiB,QAAQ,CAAC;YAC7Ef,KAAAA,EAAO;gBACLK,QAAAA,EAAU,IAAA;gBACVW,KAAAA,EAAO;oBAAEC,IAAAA,EAAMnC;AAAiB;AAClC,aAAA;YACAqC,OAAAA,EAAS;gBAAEC,SAAAA,EAAW;AAAO,aAAA;YAC7BC,KAAAA,EAAOV,sBAAAA,GAAyBG,4BAA4BS;AAC9D,SAAA,CAAA;AAEAV,QAAAA,cAAAA,CAAeS,IAAI,CAAA,GAAIE,wBAAAA,CAAAA;AACzB,IAAA;AAEA,IAAA,MAAMtC,OAAOW,EAAE,CAACC,KAAK,CAAC,aAAA,CAAA,CAAeC,UAAU,CAAC;QAC9CC,KAAAA,EAAO;AAAEC,YAAAA,EAAAA,EAAIY,cAAAA,CAAeX,GAAG,CAAC,CAACC,OAASA,IAAAA,EAAMF,EAAAA;AAAI,SAAA;QACpDG,IAAAA,EAAM;YAAEC,QAAAA,EAAU;AAAM;AAC1B,KAAA,CAAA;AAEA,IAAA,MAAMnB,MAAAA,CAAOC,KAAK,CAACqB,GAAG,CAAC;QACrBnB,IAAAA,EAAM,IAAA;QACNC,GAAAA,EAAK,gBAAA;QACLmB,KAAAA,EAAOG,sBAAAA,CAAuBa,MAAM,CAClCZ,cAAAA,CAAeX,GAAG,CAAC,CAACC,IAAAA,GAASuB,IAAAA,CAAKvB,IAAAA,EAAM;AAAC,gBAAA,IAAA;AAAM,gBAAA;AAAW,aAAA,CAAA,CAAA;AAE9D,KAAA,CAAA;AACF,CAAA;AAEA,MAAMwB,uBAAAA,GAA0B,UAAA;AAC9B,IAAA,MAAM1C,gBAAgB,MAAMD,mBAAAA,EAAAA;IAE5B,IAAIC,aAAAA,CAAcsC,MAAM,KAAK,CAAA,EAAG;AAC9B,QAAA;AACF,IAAA;AAEA,IAAA,MAAMrC,OAAOW,EAAE,CAACC,KAAK,CAAC,aAAA,CAAA,CAAeC,UAAU,CAAC;QAC9CC,KAAAA,EAAO;AAAEC,YAAAA,EAAAA,EAAI2B,MAAMC,IAAI,CAAC5C,aAAAA,EAAe,CAACkB,OAASA,IAAAA,EAAMF,EAAAA;AAAI,SAAA;QAC3DG,IAAAA,EAAM;YAAEC,QAAAA,EAAU;AAAM;AAC1B,KAAA,CAAA;AACF,CAAA;AAEA,MAAMyB,uBAAAA,GAA0B,UAAA;AAC9B,IAAA,MAAMC,UAAAA,GAAa7C,MAAAA,CAAO8C,EAAE,CAACC,KAAK;AAClC,IAAA,IAAIF,cAAc,IAAA,EAAM;AACtB,QAAA;AACF,IAAA;;IAGA,MAAMJ,uBAAAA,EAAAA;AAEN,IAAA,MAAMO,sBAAAA,GAAyB,MAAMC,UAAAA,CAAW,MAAA,CAAA,CAAQC,yBAAyB,EAAA;AAEjF,IAAA,MAAMC,iBAAiBN,UAAAA,GAAaG,sBAAAA;AAEpC,IAAA,IAAIG,iBAAiB,CAAA,EAAG;AACtB,QAAA,MAAM9C,sBAAAA,CAAuB8C,cAAAA,CAAAA;IAC/B,CAAA,MAAO,IAAIA,iBAAiB,CAAA,EAAG;AAC7B,QAAA,MAAM3B,8BAA8B,CAAC2B,cAAAA,CAAAA;AACvC,IAAA;AACF,CAAA;AAEA,sBAAe;AACbP,IAAAA,uBAAAA;AACA9C,IAAAA;AACF,CAAA;;;;"}
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
3
  var _ = require('lodash');
4
- var fp = require('lodash/fp');
5
4
  var utils = require('@strapi/utils');
6
5
  var user$1 = require('../../../../server/src/domain/user.js');
7
6
  var constants = require('../../../../server/src/services/constants.js');
7
+ var adminUsers = require('../../../../server/src/audit-logs/admin-users.js');
8
8
  var index = require('../utils/index.js');
9
9
 
10
10
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -38,7 +38,7 @@ const getSessionManager = ()=>{
38
38
  });
39
39
  }
40
40
  };
41
- const castNumberArray = fp.pipe(fp.castArray, fp.map(fp.toNumber));
41
+ const castNumberArray = (ids)=>_.castArray(ids).map((id)=>_.toNumber(id));
42
42
  const removeFromEEDisabledUsersList = async (ids)=>{
43
43
  let idsToCheck;
44
44
  if (typeof ids === 'object') {
@@ -81,6 +81,15 @@ const removeFromEEDisabledUsersList = async (ids)=>{
81
81
  throw new ValidationError('You must have at least one user with super admin role.');
82
82
  }
83
83
  }
84
+ // The audit log records what changed, so it needs the row before the write
85
+ const previous = adminUsers.touchesTrackedFields(attributes) ? await strapi.db.query('admin::user').findOne({
86
+ where: {
87
+ id
88
+ },
89
+ populate: [
90
+ 'roles'
91
+ ]
92
+ }) : null;
84
93
  // hash password if a new one is sent
85
94
  if (___default.default.has(attributes, 'password')) {
86
95
  const hashedPassword = await index.getService('auth').hashPassword(attributes.password);
@@ -96,9 +105,16 @@ const removeFromEEDisabledUsersList = async (ids)=>{
96
105
  'roles'
97
106
  ]
98
107
  });
99
- strapi.eventHub.emit('user.update', {
108
+ strapi.eventHub.emit(adminUsers.LEGACY_USER_EVENTS.UPDATE, {
100
109
  user: sanitizeUser(updatedUser)
101
110
  });
111
+ await adminUsers.emitAdminUserUpdateAudits({
112
+ strapi
113
+ }, {
114
+ previous,
115
+ updated: updatedUser,
116
+ attributes
117
+ });
102
118
  return updatedUser;
103
119
  }
104
120
  const updatedUser = await strapi.db.query('admin::user').update({
@@ -112,9 +128,16 @@ const removeFromEEDisabledUsersList = async (ids)=>{
112
128
  });
113
129
  await updateEEDisabledUsersList(id, attributes);
114
130
  if (updatedUser) {
115
- strapi.eventHub.emit('user.update', {
131
+ strapi.eventHub.emit(adminUsers.LEGACY_USER_EVENTS.UPDATE, {
116
132
  user: sanitizeUser(updatedUser)
117
133
  });
134
+ await adminUsers.emitAdminUserUpdateAudits({
135
+ strapi
136
+ }, {
137
+ previous,
138
+ updated: updatedUser,
139
+ attributes
140
+ });
118
141
  }
119
142
  return updatedUser;
120
143
  };
@@ -156,9 +179,12 @@ const removeFromEEDisabledUsersList = async (ids)=>{
156
179
  await sessionManager('admin').invalidateRefreshToken(String(id));
157
180
  }
158
181
  await removeFromEEDisabledUsersList(id);
159
- strapi.eventHub.emit('user.delete', {
182
+ strapi.eventHub.emit(adminUsers.LEGACY_USER_EVENTS.DELETE, {
160
183
  user: sanitizeUser(deletedUser)
161
184
  });
185
+ await adminUsers.emitAdminUserDeleted({
186
+ strapi
187
+ }, deletedUser);
162
188
  return deletedUser;
163
189
  };
164
190
  /** Delete a user
@@ -196,9 +222,14 @@ const removeFromEEDisabledUsersList = async (ids)=>{
196
222
  deletedUsers.push(deletedUser);
197
223
  }
198
224
  await removeFromEEDisabledUsersList(ids);
199
- strapi.eventHub.emit('user.delete', {
225
+ strapi.eventHub.emit(adminUsers.LEGACY_USER_EVENTS.DELETE, {
200
226
  users: deletedUsers.map((deletedUser)=>sanitizeUser(deletedUser))
201
227
  });
228
+ for (const deletedUser of deletedUsers){
229
+ await adminUsers.emitAdminUserDeleted({
230
+ strapi
231
+ }, deletedUser);
232
+ }
202
233
  return deletedUsers;
203
234
  };
204
235
  const sanitizeUserRoles = (role)=>___default.default.pick(role, [
@@ -1 +1 @@
1
- {"version":3,"file":"user.js","sources":["../../../../../../ee/server/src/services/user.ts"],"sourcesContent":["import _ from 'lodash';\nimport { pipe, map, castArray, toNumber } from 'lodash/fp';\nimport { arrays, errors } from '@strapi/utils';\nimport { hasSuperAdminRole } from '../../../../server/src/domain/user';\nimport constants from '../../../../server/src/services/constants';\nimport { getService } from '../utils';\n\nconst { ValidationError } = errors;\nconst { SUPER_ADMIN_CODE } = constants;\n\nconst getSessionManager = () => {\n const manager = strapi.sessionManager;\n return manager ?? null;\n};\n\n/** Checks if ee disabled users list needs to be updated\n * @param {string} id\n * @param {object} input\n */\nconst updateEEDisabledUsersList = async (id: string, input: any) => {\n const disabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (!disabledUsers) {\n return;\n }\n\n const user = disabledUsers.find((user: any) => user.id === Number(id));\n if (!user) {\n return;\n }\n\n if (user.isActive !== input.isActive) {\n const newDisabledUsersList = disabledUsers.filter((user: any) => user.id !== Number(id));\n await strapi.store.set({\n type: 'ee',\n key: 'disabled_users',\n value: newDisabledUsersList,\n });\n }\n};\n\nconst castNumberArray = pipe(castArray, map(toNumber));\n\nconst removeFromEEDisabledUsersList = async (ids: unknown) => {\n let idsToCheck: any;\n if (typeof ids === 'object') {\n idsToCheck = castNumberArray(ids);\n } else {\n idsToCheck = [Number(ids)];\n }\n\n const disabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (!disabledUsers) {\n return;\n }\n\n const newDisabledUsersList = disabledUsers.filter((user: any) => !idsToCheck.includes(user.id));\n await strapi.store.set({\n type: 'ee',\n key: 'disabled_users',\n value: newDisabledUsersList,\n });\n};\n\n/**\n * Update a user in database\n * @param id query params to find the user to update\n * @param attributes A partial user object\n * @returns {Promise<user>}\n */\nconst updateById = async (id: any, attributes: any) => {\n // Check at least one super admin remains\n if (_.has(attributes, 'roles')) {\n const lastAdminUser = await isLastSuperAdminUser(id);\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n const willRemoveSuperAdminRole = !arrays.includesString(attributes.roles, superAdminRole.id);\n\n if (lastAdminUser && willRemoveSuperAdminRole) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n\n // cannot disable last super admin\n if (attributes.isActive === false) {\n const lastAdminUser = await isLastSuperAdminUser(id);\n if (lastAdminUser) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n\n // hash password if a new one is sent\n if (_.has(attributes, 'password')) {\n const hashedPassword = await getService('auth').hashPassword(attributes.password);\n\n const updatedUser = await strapi.db.query('admin::user').update({\n where: { id },\n data: {\n ...attributes,\n password: hashedPassword,\n },\n populate: ['roles'],\n });\n\n strapi.eventHub.emit('user.update', { user: sanitizeUser(updatedUser) });\n\n return updatedUser;\n }\n\n const updatedUser = await strapi.db.query('admin::user').update({\n where: { id },\n data: attributes,\n populate: ['roles'],\n });\n\n await updateEEDisabledUsersList(id, attributes);\n\n if (updatedUser) {\n strapi.eventHub.emit('user.update', { user: sanitizeUser(updatedUser) });\n }\n\n return updatedUser;\n};\n\n/** Delete a user\n * @param id id of the user to delete\n * @returns {Promise<user>}\n */\nconst deleteById = async (id: unknown) => {\n // Check at least one super admin remains\n const userToDelete = await strapi.db.query('admin::user').findOne({\n where: { id },\n populate: ['roles'],\n });\n\n if (!userToDelete) {\n return null;\n }\n\n if (userToDelete) {\n if (userToDelete.roles.some((r: any) => r.code === SUPER_ADMIN_CODE)) {\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n if (superAdminRole.usersCount === 1) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n }\n\n const deletedUser = await strapi.db\n .query('admin::user')\n .delete({ where: { id }, populate: ['roles'] });\n\n // Invalidate all sessions for the deleted user\n const sessionManager = getSessionManager();\n if (sessionManager && sessionManager.hasOrigin('admin')) {\n await sessionManager('admin').invalidateRefreshToken(String(id));\n }\n\n await removeFromEEDisabledUsersList(id);\n\n strapi.eventHub.emit('user.delete', { user: sanitizeUser(deletedUser) });\n\n return deletedUser;\n};\n\n/** Delete a user\n * @param ids ids of the users to delete\n * @returns {Promise<user>}\n */\nconst deleteByIds = async (ids: any) => {\n // Check at least one super admin remains\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n const nbOfSuperAdminToDelete = await strapi.db.query('admin::user').count({\n where: {\n id: ids,\n roles: { id: superAdminRole.id },\n },\n });\n\n if (superAdminRole.usersCount === nbOfSuperAdminToDelete) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n\n const deletedUsers = [];\n for (const id of ids) {\n const deletedUser = await strapi.db.query('admin::user').delete({\n where: { id },\n populate: ['roles'],\n });\n\n // Invalidate all sessions for the deleted user\n const sessionManager = getSessionManager();\n if (sessionManager && sessionManager.hasOrigin('admin')) {\n await sessionManager('admin').invalidateRefreshToken(String(id));\n }\n\n deletedUsers.push(deletedUser);\n }\n\n await removeFromEEDisabledUsersList(ids);\n\n strapi.eventHub.emit('user.delete', {\n users: deletedUsers.map((deletedUser) => sanitizeUser(deletedUser)),\n });\n\n return deletedUsers;\n};\n\nconst sanitizeUserRoles = (role: unknown) => _.pick(role, ['id', 'name', 'description', 'code']);\n\n/**\n * Check if a user is the last super admin\n * @param {int|string} userId user's id to look for\n */\nconst isLastSuperAdminUser = async (userId: unknown) => {\n const user = (await findOne(userId)) as any;\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n\n return superAdminRole.usersCount === 1 && hasSuperAdminRole(user);\n};\n\n/**\n * Remove private user fields\n * @param {Object} user - user to sanitize\n */\nconst sanitizeUser = (user: any) => {\n return {\n ..._.omit(user, [\n 'password',\n 'resetPasswordToken',\n 'resetPasswordTokenExpiresAt',\n 'registrationToken',\n 'roles',\n ]),\n roles: user.roles && user.roles.map(sanitizeUserRoles),\n };\n};\n\n/**\n * Find one user\n */\nconst findOne = async (id: any, populate = ['roles']) => {\n return strapi.db.query('admin::user').findOne({ where: { id }, populate });\n};\n\nconst getCurrentActiveUserCount = async () => {\n return strapi.db.query('admin::user').count({ where: { isActive: true } });\n};\n\nexport default {\n updateEEDisabledUsersList,\n removeFromEEDisabledUsersList,\n getCurrentActiveUserCount,\n deleteByIds,\n deleteById,\n updateById,\n};\n"],"names":["ValidationError","errors","SUPER_ADMIN_CODE","constants","getSessionManager","manager","strapi","sessionManager","updateEEDisabledUsersList","id","input","disabledUsers","getService","getDisabledUserList","user","find","Number","isActive","newDisabledUsersList","filter","store","set","type","key","value","castNumberArray","pipe","castArray","map","toNumber","removeFromEEDisabledUsersList","ids","idsToCheck","includes","updateById","attributes","_","has","lastAdminUser","isLastSuperAdminUser","superAdminRole","getSuperAdminWithUsersCount","willRemoveSuperAdminRole","arrays","includesString","roles","hashedPassword","hashPassword","password","updatedUser","db","query","update","where","data","populate","eventHub","emit","sanitizeUser","deleteById","userToDelete","findOne","some","r","code","usersCount","deletedUser","delete","hasOrigin","invalidateRefreshToken","String","deleteByIds","nbOfSuperAdminToDelete","count","deletedUsers","push","users","sanitizeUserRoles","role","pick","userId","hasSuperAdminRole","omit","getCurrentActiveUserCount"],"mappings":"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"}
1
+ {"version":3,"file":"user.js","sources":["../../../../../../ee/server/src/services/user.ts"],"sourcesContent":["import _, { castArray, toNumber } from 'lodash';\n\nimport { arrays, errors } from '@strapi/utils';\nimport { hasSuperAdminRole } from '../../../../server/src/domain/user';\nimport constants from '../../../../server/src/services/constants';\nimport {\n LEGACY_USER_EVENTS,\n emitAdminUserDeleted,\n emitAdminUserUpdateAudits,\n touchesTrackedFields,\n} from '../../../../server/src/audit-logs/admin-users';\nimport { getService } from '../utils';\n\nconst { ValidationError } = errors;\nconst { SUPER_ADMIN_CODE } = constants;\n\nconst getSessionManager = () => {\n const manager = strapi.sessionManager;\n return manager ?? null;\n};\n\n/** Checks if ee disabled users list needs to be updated\n * @param {string} id\n * @param {object} input\n */\nconst updateEEDisabledUsersList = async (id: string, input: any) => {\n const disabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (!disabledUsers) {\n return;\n }\n\n const user = disabledUsers.find((user: any) => user.id === Number(id));\n if (!user) {\n return;\n }\n\n if (user.isActive !== input.isActive) {\n const newDisabledUsersList = disabledUsers.filter((user: any) => user.id !== Number(id));\n await strapi.store.set({\n type: 'ee',\n key: 'disabled_users',\n value: newDisabledUsersList,\n });\n }\n};\n\nconst castNumberArray = (ids: unknown) => castArray(ids).map((id) => toNumber(id));\n\nconst removeFromEEDisabledUsersList = async (ids: unknown) => {\n let idsToCheck: any;\n if (typeof ids === 'object') {\n idsToCheck = castNumberArray(ids);\n } else {\n idsToCheck = [Number(ids)];\n }\n\n const disabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (!disabledUsers) {\n return;\n }\n\n const newDisabledUsersList = disabledUsers.filter((user: any) => !idsToCheck.includes(user.id));\n await strapi.store.set({\n type: 'ee',\n key: 'disabled_users',\n value: newDisabledUsersList,\n });\n};\n\n/**\n * Update a user in database\n * @param id query params to find the user to update\n * @param attributes A partial user object\n * @returns {Promise<user>}\n */\nconst updateById = async (id: any, attributes: any) => {\n // Check at least one super admin remains\n if (_.has(attributes, 'roles')) {\n const lastAdminUser = await isLastSuperAdminUser(id);\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n const willRemoveSuperAdminRole = !arrays.includesString(attributes.roles, superAdminRole.id);\n\n if (lastAdminUser && willRemoveSuperAdminRole) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n\n // cannot disable last super admin\n if (attributes.isActive === false) {\n const lastAdminUser = await isLastSuperAdminUser(id);\n if (lastAdminUser) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n\n // The audit log records what changed, so it needs the row before the write\n const previous = touchesTrackedFields(attributes)\n ? await strapi.db.query('admin::user').findOne({ where: { id }, populate: ['roles'] })\n : null;\n\n // hash password if a new one is sent\n if (_.has(attributes, 'password')) {\n const hashedPassword = await getService('auth').hashPassword(attributes.password);\n\n const updatedUser = await strapi.db.query('admin::user').update({\n where: { id },\n data: {\n ...attributes,\n password: hashedPassword,\n },\n populate: ['roles'],\n });\n\n strapi.eventHub.emit(LEGACY_USER_EVENTS.UPDATE, { user: sanitizeUser(updatedUser) });\n await emitAdminUserUpdateAudits({ strapi }, { previous, updated: updatedUser, attributes });\n\n return updatedUser;\n }\n\n const updatedUser = await strapi.db.query('admin::user').update({\n where: { id },\n data: attributes,\n populate: ['roles'],\n });\n\n await updateEEDisabledUsersList(id, attributes);\n\n if (updatedUser) {\n strapi.eventHub.emit(LEGACY_USER_EVENTS.UPDATE, { user: sanitizeUser(updatedUser) });\n await emitAdminUserUpdateAudits({ strapi }, { previous, updated: updatedUser, attributes });\n }\n\n return updatedUser;\n};\n\n/** Delete a user\n * @param id id of the user to delete\n * @returns {Promise<user>}\n */\nconst deleteById = async (id: unknown) => {\n // Check at least one super admin remains\n const userToDelete = await strapi.db.query('admin::user').findOne({\n where: { id },\n populate: ['roles'],\n });\n\n if (!userToDelete) {\n return null;\n }\n\n if (userToDelete) {\n if (userToDelete.roles.some((r: any) => r.code === SUPER_ADMIN_CODE)) {\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n if (superAdminRole.usersCount === 1) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n }\n\n const deletedUser = await strapi.db\n .query('admin::user')\n .delete({ where: { id }, populate: ['roles'] });\n\n // Invalidate all sessions for the deleted user\n const sessionManager = getSessionManager();\n if (sessionManager && sessionManager.hasOrigin('admin')) {\n await sessionManager('admin').invalidateRefreshToken(String(id));\n }\n\n await removeFromEEDisabledUsersList(id);\n\n strapi.eventHub.emit(LEGACY_USER_EVENTS.DELETE, { user: sanitizeUser(deletedUser) });\n await emitAdminUserDeleted({ strapi }, deletedUser);\n\n return deletedUser;\n};\n\n/** Delete a user\n * @param ids ids of the users to delete\n * @returns {Promise<user>}\n */\nconst deleteByIds = async (ids: any) => {\n // Check at least one super admin remains\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n const nbOfSuperAdminToDelete = await strapi.db.query('admin::user').count({\n where: {\n id: ids,\n roles: { id: superAdminRole.id },\n },\n });\n\n if (superAdminRole.usersCount === nbOfSuperAdminToDelete) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n\n const deletedUsers = [];\n for (const id of ids) {\n const deletedUser = await strapi.db.query('admin::user').delete({\n where: { id },\n populate: ['roles'],\n });\n\n // Invalidate all sessions for the deleted user\n const sessionManager = getSessionManager();\n if (sessionManager && sessionManager.hasOrigin('admin')) {\n await sessionManager('admin').invalidateRefreshToken(String(id));\n }\n\n deletedUsers.push(deletedUser);\n }\n\n await removeFromEEDisabledUsersList(ids);\n\n strapi.eventHub.emit(LEGACY_USER_EVENTS.DELETE, {\n users: deletedUsers.map((deletedUser) => sanitizeUser(deletedUser)),\n });\n\n for (const deletedUser of deletedUsers) {\n await emitAdminUserDeleted({ strapi }, deletedUser);\n }\n\n return deletedUsers;\n};\n\nconst sanitizeUserRoles = (role: unknown) => _.pick(role, ['id', 'name', 'description', 'code']);\n\n/**\n * Check if a user is the last super admin\n * @param {int|string} userId user's id to look for\n */\nconst isLastSuperAdminUser = async (userId: unknown) => {\n const user = (await findOne(userId)) as any;\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n\n return superAdminRole.usersCount === 1 && hasSuperAdminRole(user);\n};\n\n/**\n * Remove private user fields\n * @param {Object} user - user to sanitize\n */\nconst sanitizeUser = (user: any) => {\n return {\n ..._.omit(user, [\n 'password',\n 'resetPasswordToken',\n 'resetPasswordTokenExpiresAt',\n 'registrationToken',\n 'roles',\n ]),\n roles: user.roles && user.roles.map(sanitizeUserRoles),\n };\n};\n\n/**\n * Find one user\n */\nconst findOne = async (id: any, populate = ['roles']) => {\n return strapi.db.query('admin::user').findOne({ where: { id }, populate });\n};\n\nconst getCurrentActiveUserCount = async () => {\n return strapi.db.query('admin::user').count({ where: { isActive: true } });\n};\n\nexport default {\n updateEEDisabledUsersList,\n removeFromEEDisabledUsersList,\n getCurrentActiveUserCount,\n deleteByIds,\n deleteById,\n updateById,\n};\n"],"names":["ValidationError","errors","SUPER_ADMIN_CODE","constants","getSessionManager","manager","strapi","sessionManager","updateEEDisabledUsersList","id","input","disabledUsers","getService","getDisabledUserList","user","find","Number","isActive","newDisabledUsersList","filter","store","set","type","key","value","castNumberArray","ids","castArray","map","toNumber","removeFromEEDisabledUsersList","idsToCheck","includes","updateById","attributes","_","has","lastAdminUser","isLastSuperAdminUser","superAdminRole","getSuperAdminWithUsersCount","willRemoveSuperAdminRole","arrays","includesString","roles","previous","touchesTrackedFields","db","query","findOne","where","populate","hashedPassword","hashPassword","password","updatedUser","update","data","eventHub","emit","LEGACY_USER_EVENTS","UPDATE","sanitizeUser","emitAdminUserUpdateAudits","updated","deleteById","userToDelete","some","r","code","usersCount","deletedUser","delete","hasOrigin","invalidateRefreshToken","String","DELETE","emitAdminUserDeleted","deleteByIds","nbOfSuperAdminToDelete","count","deletedUsers","push","users","sanitizeUserRoles","role","pick","userId","hasSuperAdminRole","omit","getCurrentActiveUserCount"],"mappings":";;;;;;;;;;;;;AAaA,MAAM,EAAEA,eAAe,EAAE,GAAGC,YAAAA;AAC5B,MAAM,EAAEC,gBAAgB,EAAE,GAAGC,SAAAA;AAE7B,MAAMC,iBAAAA,GAAoB,IAAA;IACxB,MAAMC,OAAAA,GAAUC,OAAOC,cAAc;AACrC,IAAA,OAAOF,OAAAA,IAAW,IAAA;AACpB,CAAA;AAEA;;;IAIA,MAAMG,yBAAAA,GAA4B,OAAOC,EAAAA,EAAYC,KAAAA,GAAAA;AACnD,IAAA,MAAMC,aAAAA,GAAgB,MAAMC,gBAAAA,CAAW,kBAAA,CAAA,CAAoBC,mBAAmB,EAAA;AAE9E,IAAA,IAAI,CAACF,aAAAA,EAAe;AAClB,QAAA;AACF,IAAA;IAEA,MAAMG,IAAAA,GAAOH,cAAcI,IAAI,CAAC,CAACD,IAAAA,GAAcA,IAAAA,CAAKL,EAAE,KAAKO,MAAAA,CAAOP,EAAAA,CAAAA,CAAAA;AAClE,IAAA,IAAI,CAACK,IAAAA,EAAM;AACT,QAAA;AACF,IAAA;AAEA,IAAA,IAAIA,IAAAA,CAAKG,QAAQ,KAAKP,KAAAA,CAAMO,QAAQ,EAAE;QACpC,MAAMC,oBAAAA,GAAuBP,cAAcQ,MAAM,CAAC,CAACL,IAAAA,GAAcA,IAAAA,CAAKL,EAAE,KAAKO,MAAAA,CAAOP,EAAAA,CAAAA,CAAAA;AACpF,QAAA,MAAMH,MAAAA,CAAOc,KAAK,CAACC,GAAG,CAAC;YACrBC,IAAAA,EAAM,IAAA;YACNC,GAAAA,EAAK,gBAAA;YACLC,KAAAA,EAAON;AACT,SAAA,CAAA;AACF,IAAA;AACF,CAAA;AAEA,MAAMO,eAAAA,GAAkB,CAACC,GAAAA,GAAiBC,WAAAA,CAAUD,KAAKE,GAAG,CAAC,CAACnB,EAAAA,GAAOoB,UAAAA,CAASpB,EAAAA,CAAAA,CAAAA;AAE9E,MAAMqB,gCAAgC,OAAOJ,GAAAA,GAAAA;IAC3C,IAAIK,UAAAA;IACJ,IAAI,OAAOL,QAAQ,QAAA,EAAU;AAC3BK,QAAAA,UAAAA,GAAaN,eAAAA,CAAgBC,GAAAA,CAAAA;IAC/B,CAAA,MAAO;QACLK,UAAAA,GAAa;YAACf,MAAAA,CAAOU,GAAAA;AAAK,SAAA;AAC5B,IAAA;AAEA,IAAA,MAAMf,aAAAA,GAAgB,MAAMC,gBAAAA,CAAW,kBAAA,CAAA,CAAoBC,mBAAmB,EAAA;AAE9E,IAAA,IAAI,CAACF,aAAAA,EAAe;AAClB,QAAA;AACF,IAAA;IAEA,MAAMO,oBAAAA,GAAuBP,aAAAA,CAAcQ,MAAM,CAAC,CAACL,IAAAA,GAAc,CAACiB,UAAAA,CAAWC,QAAQ,CAAClB,IAAAA,CAAKL,EAAE,CAAA,CAAA;AAC7F,IAAA,MAAMH,MAAAA,CAAOc,KAAK,CAACC,GAAG,CAAC;QACrBC,IAAAA,EAAM,IAAA;QACNC,GAAAA,EAAK,gBAAA;QACLC,KAAAA,EAAON;AACT,KAAA,CAAA;AACF,CAAA;AAEA;;;;;IAMA,MAAMe,UAAAA,GAAa,OAAOxB,EAAAA,EAASyB,UAAAA,GAAAA;;AAEjC,IAAA,IAAIC,kBAAAA,CAAEC,GAAG,CAACF,UAAAA,EAAY,OAAA,CAAA,EAAU;QAC9B,MAAMG,aAAAA,GAAgB,MAAMC,oBAAAA,CAAqB7B,EAAAA,CAAAA;AACjD,QAAA,MAAM8B,cAAAA,GAAiB,MAAM3B,gBAAAA,CAAW,MAAA,CAAA,CAAQ4B,2BAA2B,EAAA;QAC3E,MAAMC,wBAAAA,GAA2B,CAACC,YAAAA,CAAOC,cAAc,CAACT,UAAAA,CAAWU,KAAK,EAAEL,cAAAA,CAAe9B,EAAE,CAAA;AAE3F,QAAA,IAAI4B,iBAAiBI,wBAAAA,EAA0B;AAC7C,YAAA,MAAM,IAAIzC,eAAAA,CAAgB,wDAAA,CAAA;AAC5B,QAAA;AACF,IAAA;;IAGA,IAAIkC,UAAAA,CAAWjB,QAAQ,KAAK,KAAA,EAAO;QACjC,MAAMoB,aAAAA,GAAgB,MAAMC,oBAAAA,CAAqB7B,EAAAA,CAAAA;AACjD,QAAA,IAAI4B,aAAAA,EAAe;AACjB,YAAA,MAAM,IAAIrC,eAAAA,CAAgB,wDAAA,CAAA;AAC5B,QAAA;AACF,IAAA;;IAGA,MAAM6C,QAAAA,GAAWC,+BAAAA,CAAqBZ,UAAAA,CAAAA,GAClC,MAAM5B,MAAAA,CAAOyC,EAAE,CAACC,KAAK,CAAC,aAAA,CAAA,CAAeC,OAAO,CAAC;QAAEC,KAAAA,EAAO;AAAEzC,YAAAA;AAAG,SAAA;QAAG0C,QAAAA,EAAU;AAAC,YAAA;AAAQ;KAAC,CAAA,GAClF,IAAA;;AAGJ,IAAA,IAAIhB,kBAAAA,CAAEC,GAAG,CAACF,UAAAA,EAAY,UAAA,CAAA,EAAa;AACjC,QAAA,MAAMkB,iBAAiB,MAAMxC,gBAAAA,CAAW,QAAQyC,YAAY,CAACnB,WAAWoB,QAAQ,CAAA;QAEhF,MAAMC,WAAAA,GAAc,MAAMjD,MAAAA,CAAOyC,EAAE,CAACC,KAAK,CAAC,aAAA,CAAA,CAAeQ,MAAM,CAAC;YAC9DN,KAAAA,EAAO;AAAEzC,gBAAAA;AAAG,aAAA;YACZgD,IAAAA,EAAM;AACJ,gBAAA,GAAGvB,UAAU;gBACboB,QAAAA,EAAUF;AACZ,aAAA;YACAD,QAAAA,EAAU;AAAC,gBAAA;AAAQ;AACrB,SAAA,CAAA;AAEA7C,QAAAA,MAAAA,CAAOoD,QAAQ,CAACC,IAAI,CAACC,6BAAAA,CAAmBC,MAAM,EAAE;AAAE/C,YAAAA,IAAAA,EAAMgD,YAAAA,CAAaP,WAAAA;AAAa,SAAA,CAAA;AAClF,QAAA,MAAMQ,oCAAAA,CAA0B;AAAEzD,YAAAA;SAAO,EAAG;AAAEuC,YAAAA,QAAAA;YAAUmB,OAAAA,EAAST,WAAAA;AAAarB,YAAAA;AAAW,SAAA,CAAA;QAEzF,OAAOqB,WAAAA;AACT,IAAA;IAEA,MAAMA,WAAAA,GAAc,MAAMjD,MAAAA,CAAOyC,EAAE,CAACC,KAAK,CAAC,aAAA,CAAA,CAAeQ,MAAM,CAAC;QAC9DN,KAAAA,EAAO;AAAEzC,YAAAA;AAAG,SAAA;QACZgD,IAAAA,EAAMvB,UAAAA;QACNiB,QAAAA,EAAU;AAAC,YAAA;AAAQ;AACrB,KAAA,CAAA;AAEA,IAAA,MAAM3C,0BAA0BC,EAAAA,EAAIyB,UAAAA,CAAAA;AAEpC,IAAA,IAAIqB,WAAAA,EAAa;AACfjD,QAAAA,MAAAA,CAAOoD,QAAQ,CAACC,IAAI,CAACC,6BAAAA,CAAmBC,MAAM,EAAE;AAAE/C,YAAAA,IAAAA,EAAMgD,YAAAA,CAAaP,WAAAA;AAAa,SAAA,CAAA;AAClF,QAAA,MAAMQ,oCAAAA,CAA0B;AAAEzD,YAAAA;SAAO,EAAG;AAAEuC,YAAAA,QAAAA;YAAUmB,OAAAA,EAAST,WAAAA;AAAarB,YAAAA;AAAW,SAAA,CAAA;AAC3F,IAAA;IAEA,OAAOqB,WAAAA;AACT,CAAA;AAEA;;;IAIA,MAAMU,aAAa,OAAOxD,EAAAA,GAAAA;;IAExB,MAAMyD,YAAAA,GAAe,MAAM5D,MAAAA,CAAOyC,EAAE,CAACC,KAAK,CAAC,aAAA,CAAA,CAAeC,OAAO,CAAC;QAChEC,KAAAA,EAAO;AAAEzC,YAAAA;AAAG,SAAA;QACZ0C,QAAAA,EAAU;AAAC,YAAA;AAAQ;AACrB,KAAA,CAAA;AAEA,IAAA,IAAI,CAACe,YAAAA,EAAc;QACjB,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,IAAIA,YAAAA,EAAc;QAChB,IAAIA,YAAAA,CAAatB,KAAK,CAACuB,IAAI,CAAC,CAACC,CAAAA,GAAWA,CAAAA,CAAEC,IAAI,KAAKnE,gBAAAA,CAAAA,EAAmB;AACpE,YAAA,MAAMqC,cAAAA,GAAiB,MAAM3B,gBAAAA,CAAW,MAAA,CAAA,CAAQ4B,2BAA2B,EAAA;YAC3E,IAAID,cAAAA,CAAe+B,UAAU,KAAK,CAAA,EAAG;AACnC,gBAAA,MAAM,IAAItE,eAAAA,CAAgB,wDAAA,CAAA;AAC5B,YAAA;AACF,QAAA;AACF,IAAA;IAEA,MAAMuE,WAAAA,GAAc,MAAMjE,MAAAA,CAAOyC,EAAE,CAChCC,KAAK,CAAC,aAAA,CAAA,CACNwB,MAAM,CAAC;QAAEtB,KAAAA,EAAO;AAAEzC,YAAAA;AAAG,SAAA;QAAG0C,QAAAA,EAAU;AAAC,YAAA;AAAQ;AAAC,KAAA,CAAA;;AAG/C,IAAA,MAAM5C,cAAAA,GAAiBH,iBAAAA,EAAAA;AACvB,IAAA,IAAIG,cAAAA,IAAkBA,cAAAA,CAAekE,SAAS,CAAC,OAAA,CAAA,EAAU;AACvD,QAAA,MAAMlE,cAAAA,CAAe,OAAA,CAAA,CAASmE,sBAAsB,CAACC,MAAAA,CAAOlE,EAAAA,CAAAA,CAAAA;AAC9D,IAAA;AAEA,IAAA,MAAMqB,6BAAAA,CAA8BrB,EAAAA,CAAAA;AAEpCH,IAAAA,MAAAA,CAAOoD,QAAQ,CAACC,IAAI,CAACC,6BAAAA,CAAmBgB,MAAM,EAAE;AAAE9D,QAAAA,IAAAA,EAAMgD,YAAAA,CAAaS,WAAAA;AAAa,KAAA,CAAA;AAClF,IAAA,MAAMM,+BAAAA,CAAqB;AAAEvE,QAAAA;KAAO,EAAGiE,WAAAA,CAAAA;IAEvC,OAAOA,WAAAA;AACT,CAAA;AAEA;;;IAIA,MAAMO,cAAc,OAAOpD,GAAAA,GAAAA;;AAEzB,IAAA,MAAMa,cAAAA,GAAiB,MAAM3B,gBAAAA,CAAW,MAAA,CAAA,CAAQ4B,2BAA2B,EAAA;IAC3E,MAAMuC,sBAAAA,GAAyB,MAAMzE,MAAAA,CAAOyC,EAAE,CAACC,KAAK,CAAC,aAAA,CAAA,CAAegC,KAAK,CAAC;QACxE9B,KAAAA,EAAO;YACLzC,EAAAA,EAAIiB,GAAAA;YACJkB,KAAAA,EAAO;AAAEnC,gBAAAA,EAAAA,EAAI8B,eAAe9B;AAAG;AACjC;AACF,KAAA,CAAA;IAEA,IAAI8B,cAAAA,CAAe+B,UAAU,KAAKS,sBAAAA,EAAwB;AACxD,QAAA,MAAM,IAAI/E,eAAAA,CAAgB,wDAAA,CAAA;AAC5B,IAAA;AAEA,IAAA,MAAMiF,eAAe,EAAE;IACvB,KAAK,MAAMxE,MAAMiB,GAAAA,CAAK;QACpB,MAAM6C,WAAAA,GAAc,MAAMjE,MAAAA,CAAOyC,EAAE,CAACC,KAAK,CAAC,aAAA,CAAA,CAAewB,MAAM,CAAC;YAC9DtB,KAAAA,EAAO;AAAEzC,gBAAAA;AAAG,aAAA;YACZ0C,QAAAA,EAAU;AAAC,gBAAA;AAAQ;AACrB,SAAA,CAAA;;AAGA,QAAA,MAAM5C,cAAAA,GAAiBH,iBAAAA,EAAAA;AACvB,QAAA,IAAIG,cAAAA,IAAkBA,cAAAA,CAAekE,SAAS,CAAC,OAAA,CAAA,EAAU;AACvD,YAAA,MAAMlE,cAAAA,CAAe,OAAA,CAAA,CAASmE,sBAAsB,CAACC,MAAAA,CAAOlE,EAAAA,CAAAA,CAAAA;AAC9D,QAAA;AAEAwE,QAAAA,YAAAA,CAAaC,IAAI,CAACX,WAAAA,CAAAA;AACpB,IAAA;AAEA,IAAA,MAAMzC,6BAAAA,CAA8BJ,GAAAA,CAAAA;AAEpCpB,IAAAA,MAAAA,CAAOoD,QAAQ,CAACC,IAAI,CAACC,6BAAAA,CAAmBgB,MAAM,EAAE;AAC9CO,QAAAA,KAAAA,EAAOF,YAAAA,CAAarD,GAAG,CAAC,CAAC2C,cAAgBT,YAAAA,CAAaS,WAAAA,CAAAA;AACxD,KAAA,CAAA;IAEA,KAAK,MAAMA,eAAeU,YAAAA,CAAc;AACtC,QAAA,MAAMJ,+BAAAA,CAAqB;AAAEvE,YAAAA;SAAO,EAAGiE,WAAAA,CAAAA;AACzC,IAAA;IAEA,OAAOU,YAAAA;AACT,CAAA;AAEA,MAAMG,oBAAoB,CAACC,IAAAA,GAAkBlD,kBAAAA,CAAEmD,IAAI,CAACD,IAAAA,EAAM;AAAC,QAAA,IAAA;AAAM,QAAA,MAAA;AAAQ,QAAA,aAAA;AAAe,QAAA;AAAO,KAAA,CAAA;AAE/F;;;IAIA,MAAM/C,uBAAuB,OAAOiD,MAAAA,GAAAA;IAClC,MAAMzE,IAAAA,GAAQ,MAAMmC,OAAAA,CAAQsC,MAAAA,CAAAA;AAC5B,IAAA,MAAMhD,cAAAA,GAAiB,MAAM3B,gBAAAA,CAAW,MAAA,CAAA,CAAQ4B,2BAA2B,EAAA;AAE3E,IAAA,OAAOD,cAAAA,CAAe+B,UAAU,KAAK,CAAA,IAAKkB,wBAAAA,CAAkB1E,IAAAA,CAAAA;AAC9D,CAAA;AAEA;;;IAIA,MAAMgD,eAAe,CAAChD,IAAAA,GAAAA;IACpB,OAAO;QACL,GAAGqB,kBAAAA,CAAEsD,IAAI,CAAC3E,IAAAA,EAAM;AACd,YAAA,UAAA;AACA,YAAA,oBAAA;AACA,YAAA,6BAAA;AACA,YAAA,mBAAA;AACA,YAAA;SACD,CAAC;AACF8B,QAAAA,KAAAA,EAAO9B,KAAK8B,KAAK,IAAI9B,KAAK8B,KAAK,CAAChB,GAAG,CAACwD,iBAAAA;AACtC,KAAA;AACF,CAAA;AAEA;;AAEC,IACD,MAAMnC,OAAAA,GAAU,OAAOxC,EAAAA,EAAS0C,QAAAA,GAAW;AAAC,IAAA;AAAQ,CAAA,GAAA;AAClD,IAAA,OAAO7C,OAAOyC,EAAE,CAACC,KAAK,CAAC,aAAA,CAAA,CAAeC,OAAO,CAAC;QAAEC,KAAAA,EAAO;AAAEzC,YAAAA;AAAG,SAAA;AAAG0C,QAAAA;AAAS,KAAA,CAAA;AAC1E,CAAA;AAEA,MAAMuC,yBAAAA,GAA4B,UAAA;AAChC,IAAA,OAAOpF,OAAOyC,EAAE,CAACC,KAAK,CAAC,aAAA,CAAA,CAAegC,KAAK,CAAC;QAAE9B,KAAAA,EAAO;YAAEjC,QAAAA,EAAU;AAAK;AAAE,KAAA,CAAA;AAC1E,CAAA;AAEA,WAAe;AACbT,IAAAA,yBAAAA;AACAsB,IAAAA,6BAAAA;AACA4D,IAAAA,yBAAAA;AACAZ,IAAAA,WAAAA;AACAb,IAAAA,UAAAA;AACAhC,IAAAA;AACF,CAAA;;;;"}
@@ -1,8 +1,8 @@
1
- import ___default from 'lodash';
2
- import { pipe, castArray, map, toNumber } from 'lodash/fp';
1
+ import ___default, { castArray, toNumber } from 'lodash';
3
2
  import { errors, arrays } from '@strapi/utils';
4
3
  import { hasSuperAdminRole } from '../../../../server/src/domain/user.mjs';
5
4
  import constants from '../../../../server/src/services/constants.mjs';
5
+ import { touchesTrackedFields, LEGACY_USER_EVENTS, emitAdminUserUpdateAudits, emitAdminUserDeleted } from '../../../../server/src/audit-logs/admin-users.mjs';
6
6
  import { getService } from '../utils/index.mjs';
7
7
 
8
8
  const { ValidationError } = errors;
@@ -32,7 +32,7 @@ const getSessionManager = ()=>{
32
32
  });
33
33
  }
34
34
  };
35
- const castNumberArray = pipe(castArray, map(toNumber));
35
+ const castNumberArray = (ids)=>castArray(ids).map((id)=>toNumber(id));
36
36
  const removeFromEEDisabledUsersList = async (ids)=>{
37
37
  let idsToCheck;
38
38
  if (typeof ids === 'object') {
@@ -75,6 +75,15 @@ const removeFromEEDisabledUsersList = async (ids)=>{
75
75
  throw new ValidationError('You must have at least one user with super admin role.');
76
76
  }
77
77
  }
78
+ // The audit log records what changed, so it needs the row before the write
79
+ const previous = touchesTrackedFields(attributes) ? await strapi.db.query('admin::user').findOne({
80
+ where: {
81
+ id
82
+ },
83
+ populate: [
84
+ 'roles'
85
+ ]
86
+ }) : null;
78
87
  // hash password if a new one is sent
79
88
  if (___default.has(attributes, 'password')) {
80
89
  const hashedPassword = await getService('auth').hashPassword(attributes.password);
@@ -90,9 +99,16 @@ const removeFromEEDisabledUsersList = async (ids)=>{
90
99
  'roles'
91
100
  ]
92
101
  });
93
- strapi.eventHub.emit('user.update', {
102
+ strapi.eventHub.emit(LEGACY_USER_EVENTS.UPDATE, {
94
103
  user: sanitizeUser(updatedUser)
95
104
  });
105
+ await emitAdminUserUpdateAudits({
106
+ strapi
107
+ }, {
108
+ previous,
109
+ updated: updatedUser,
110
+ attributes
111
+ });
96
112
  return updatedUser;
97
113
  }
98
114
  const updatedUser = await strapi.db.query('admin::user').update({
@@ -106,9 +122,16 @@ const removeFromEEDisabledUsersList = async (ids)=>{
106
122
  });
107
123
  await updateEEDisabledUsersList(id, attributes);
108
124
  if (updatedUser) {
109
- strapi.eventHub.emit('user.update', {
125
+ strapi.eventHub.emit(LEGACY_USER_EVENTS.UPDATE, {
110
126
  user: sanitizeUser(updatedUser)
111
127
  });
128
+ await emitAdminUserUpdateAudits({
129
+ strapi
130
+ }, {
131
+ previous,
132
+ updated: updatedUser,
133
+ attributes
134
+ });
112
135
  }
113
136
  return updatedUser;
114
137
  };
@@ -150,9 +173,12 @@ const removeFromEEDisabledUsersList = async (ids)=>{
150
173
  await sessionManager('admin').invalidateRefreshToken(String(id));
151
174
  }
152
175
  await removeFromEEDisabledUsersList(id);
153
- strapi.eventHub.emit('user.delete', {
176
+ strapi.eventHub.emit(LEGACY_USER_EVENTS.DELETE, {
154
177
  user: sanitizeUser(deletedUser)
155
178
  });
179
+ await emitAdminUserDeleted({
180
+ strapi
181
+ }, deletedUser);
156
182
  return deletedUser;
157
183
  };
158
184
  /** Delete a user
@@ -190,9 +216,14 @@ const removeFromEEDisabledUsersList = async (ids)=>{
190
216
  deletedUsers.push(deletedUser);
191
217
  }
192
218
  await removeFromEEDisabledUsersList(ids);
193
- strapi.eventHub.emit('user.delete', {
219
+ strapi.eventHub.emit(LEGACY_USER_EVENTS.DELETE, {
194
220
  users: deletedUsers.map((deletedUser)=>sanitizeUser(deletedUser))
195
221
  });
222
+ for (const deletedUser of deletedUsers){
223
+ await emitAdminUserDeleted({
224
+ strapi
225
+ }, deletedUser);
226
+ }
196
227
  return deletedUsers;
197
228
  };
198
229
  const sanitizeUserRoles = (role)=>___default.pick(role, [