@strapi/admin 5.55.1 → 5.56.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 (120) hide show
  1. package/dist/admin/admin/src/components/UpsellBanner.js +9 -16
  2. package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
  3. package/dist/admin/admin/src/components/UpsellBanner.mjs +11 -18
  4. package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
  5. package/dist/admin/admin/src/render.js +4 -69
  6. package/dist/admin/admin/src/render.js.map +1 -1
  7. package/dist/admin/admin/src/render.mjs +4 -69
  8. package/dist/admin/admin/src/render.mjs.map +1 -1
  9. package/dist/admin/admin/src/translations/en.json.js +10 -0
  10. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  11. package/dist/admin/admin/src/translations/en.json.mjs +10 -0
  12. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  13. package/dist/admin/admin/src/utils/browserStrapi.js +93 -0
  14. package/dist/admin/admin/src/utils/browserStrapi.js.map +1 -0
  15. package/dist/admin/admin/src/utils/browserStrapi.mjs +91 -0
  16. package/dist/admin/admin/src/utils/browserStrapi.mjs.map +1 -0
  17. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.js +2 -1
  18. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.js.map +1 -1
  19. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.mjs +2 -1
  20. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.mjs.map +1 -1
  21. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +11 -1
  22. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
  23. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +11 -1
  24. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
  25. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.js +3 -1
  26. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.js.map +1 -1
  27. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.mjs +3 -1
  28. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.mjs.map +1 -1
  29. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.js +64 -0
  30. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.js.map +1 -0
  31. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.mjs +60 -0
  32. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.mjs.map +1 -0
  33. package/dist/admin/ee/admin/src/services/auditLogs.js +2 -1
  34. package/dist/admin/ee/admin/src/services/auditLogs.js.map +1 -1
  35. package/dist/admin/ee/admin/src/services/auditLogs.mjs +2 -1
  36. package/dist/admin/ee/admin/src/services/auditLogs.mjs.map +1 -1
  37. package/dist/admin/src/components/SubNav.d.ts +2 -2
  38. package/dist/admin/src/utils/browserStrapi.d.ts +11 -0
  39. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +10 -0
  40. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.d.ts +14 -0
  41. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +10 -1
  42. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
  43. package/dist/ee/server/src/controllers/admin.d.ts +2 -28
  44. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
  45. package/dist/ee/server/src/controllers/index.d.ts +1 -28
  46. package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
  47. package/dist/ee/server/src/index.d.ts +2 -29
  48. package/dist/ee/server/src/index.d.ts.map +1 -1
  49. package/dist/ee/server/src/services/auth.d.ts +1 -1
  50. package/dist/ee/server/src/services/auth.d.ts.map +1 -1
  51. package/dist/ee/server/src/services/index.d.ts +1 -1
  52. package/dist/ee/server/src/services/user.d.ts.map +1 -1
  53. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +37 -21
  54. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
  55. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +37 -21
  56. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
  57. package/dist/server/ee/server/src/controllers/admin.js +5 -3
  58. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  59. package/dist/server/ee/server/src/controllers/admin.mjs +5 -3
  60. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  61. package/dist/server/ee/server/src/index.js +4 -0
  62. package/dist/server/ee/server/src/index.js.map +1 -1
  63. package/dist/server/ee/server/src/index.mjs +4 -0
  64. package/dist/server/ee/server/src/index.mjs.map +1 -1
  65. package/dist/server/ee/server/src/services/auth.js +1 -6
  66. package/dist/server/ee/server/src/services/auth.js.map +1 -1
  67. package/dist/server/ee/server/src/services/auth.mjs +2 -7
  68. package/dist/server/ee/server/src/services/auth.mjs.map +1 -1
  69. package/dist/server/ee/server/src/services/user.js +36 -4
  70. package/dist/server/ee/server/src/services/user.js.map +1 -1
  71. package/dist/server/ee/server/src/services/user.mjs +36 -4
  72. package/dist/server/ee/server/src/services/user.mjs.map +1 -1
  73. package/dist/server/server/src/audit-logs/admin-users.js +169 -0
  74. package/dist/server/server/src/audit-logs/admin-users.js.map +1 -0
  75. package/dist/server/server/src/audit-logs/admin-users.mjs +157 -0
  76. package/dist/server/server/src/audit-logs/admin-users.mjs.map +1 -0
  77. package/dist/server/server/src/audit-logs/webhooks.js +106 -0
  78. package/dist/server/server/src/audit-logs/webhooks.js.map +1 -0
  79. package/dist/server/server/src/audit-logs/webhooks.mjs +100 -0
  80. package/dist/server/server/src/audit-logs/webhooks.mjs.map +1 -0
  81. package/dist/server/server/src/controllers/admin.js +1 -0
  82. package/dist/server/server/src/controllers/admin.js.map +1 -1
  83. package/dist/server/server/src/controllers/admin.mjs +1 -0
  84. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  85. package/dist/server/server/src/controllers/authentication.js +8 -1
  86. package/dist/server/server/src/controllers/authentication.js.map +1 -1
  87. package/dist/server/server/src/controllers/authentication.mjs +8 -1
  88. package/dist/server/server/src/controllers/authentication.mjs.map +1 -1
  89. package/dist/server/server/src/controllers/webhooks.js +26 -0
  90. package/dist/server/server/src/controllers/webhooks.js.map +1 -1
  91. package/dist/server/server/src/controllers/webhooks.mjs +27 -1
  92. package/dist/server/server/src/controllers/webhooks.mjs.map +1 -1
  93. package/dist/server/server/src/services/auth.js +27 -6
  94. package/dist/server/server/src/services/auth.js.map +1 -1
  95. package/dist/server/server/src/services/auth.mjs +28 -8
  96. package/dist/server/server/src/services/auth.mjs.map +1 -1
  97. package/dist/server/server/src/services/user.js +48 -9
  98. package/dist/server/server/src/services/user.js.map +1 -1
  99. package/dist/server/server/src/services/user.mjs +49 -10
  100. package/dist/server/server/src/services/user.mjs.map +1 -1
  101. package/dist/server/src/audit-logs/admin-users.d.ts +119 -0
  102. package/dist/server/src/audit-logs/admin-users.d.ts.map +1 -0
  103. package/dist/server/src/audit-logs/webhooks.d.ts +59 -0
  104. package/dist/server/src/audit-logs/webhooks.d.ts.map +1 -0
  105. package/dist/server/src/controllers/admin.d.ts +2 -11
  106. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  107. package/dist/server/src/controllers/authentication.d.ts.map +1 -1
  108. package/dist/server/src/controllers/index.d.ts +1 -10
  109. package/dist/server/src/controllers/index.d.ts.map +1 -1
  110. package/dist/server/src/controllers/webhooks.d.ts.map +1 -1
  111. package/dist/server/src/domain/user.d.ts +2 -2
  112. package/dist/server/src/index.d.ts +1 -10
  113. package/dist/server/src/index.d.ts.map +1 -1
  114. package/dist/server/src/services/auth.d.ts +6 -1
  115. package/dist/server/src/services/auth.d.ts.map +1 -1
  116. package/dist/server/src/services/index.d.ts.map +1 -1
  117. package/dist/server/src/services/user.d.ts.map +1 -1
  118. package/dist/shared/contracts/admin.d.ts +36 -2
  119. package/dist/shared/contracts/admin.d.ts.map +1 -1
  120. package/package.json +11 -11
@@ -4,7 +4,9 @@ const DEFAULT_RETENTION_DAYS = 90;
4
4
  /**
5
5
  * Events audited before the payload standard; their stored shape is frozen for
6
6
  * compatibility. Do not add events here: new events come through registerEvent().
7
- * TODO: migrate these to the standard.
7
+ * The event hub still emits user.create, user.update and user.delete; the audit log
8
+ * records them as admin-user.* (server/src/audit-logs/admin-users.ts).
9
+ * TODO: migrate the rest to the standard.
8
10
  */ const defaultEvents = [
9
11
  'entry.create',
10
12
  'entry.update',
@@ -17,9 +19,6 @@ const DEFAULT_RETENTION_DAYS = 90;
17
19
  'media-folder.create',
18
20
  'media-folder.update',
19
21
  'media-folder.delete',
20
- 'user.create',
21
- 'user.update',
22
- 'user.delete',
23
22
  'admin.auth.success',
24
23
  'admin.logout',
25
24
  'content-type.create',
@@ -43,6 +42,28 @@ const getEventMap = (events)=>{
43
42
  return acc;
44
43
  }, {});
45
44
  };
45
+ const getActor = (systemOrigin, user)=>{
46
+ if (systemOrigin) {
47
+ return {
48
+ type: 'system'
49
+ };
50
+ }
51
+ if (!user) {
52
+ return {
53
+ type: 'unknown'
54
+ };
55
+ }
56
+ // We copy the user data into the row so the history stays unchanged if the user
57
+ // changes later
58
+ return {
59
+ type: 'admin-user',
60
+ user: {
61
+ id: user.id,
62
+ email: user.email,
63
+ name: getDisplayName(user)
64
+ }
65
+ };
66
+ };
46
67
  const getRetentionDays = (strapi)=>{
47
68
  const featureConfig = strapi.ee.features.get('audit-logs');
48
69
  const licenseRetentionDays = typeof featureConfig === 'object' && featureConfig?.options?.retentionDays;
@@ -86,14 +107,19 @@ const getRetentionDays = (strapi)=>{
86
107
  const isMcpAdminAction = auditSource === 'mcp';
87
108
  const user = requestState?.user;
88
109
  const systemOrigin = auditSource && SYSTEM_ORIGINS.includes(auditSource) ? auditSource : undefined;
89
- if (!systemOrigin && (!isUsingAdminAuth && !isMcpAdminAction || !user)) {
110
+ if (!systemOrigin && !isUsingAdminAuth && !isMcpAdminAction) {
111
+ return null;
112
+ }
113
+ const allowsUnknownActor = registration.kind === 'standard' && registration.options.allowUnknownActor === true;
114
+ if (!systemOrigin && !user && !allowsUnknownActor) {
90
115
  return null;
91
116
  }
92
117
  const origin = systemOrigin ?? auditSource ?? 'admin-panel';
93
118
  const date = new Date().toISOString();
94
119
  // Scheduled actions have no user, so a null user is expected. The earlier audit
95
- // entry that set the schedule records who did it.
96
- const userId = systemOrigin ? null : user.id;
120
+ // entry that set the schedule records who did it. Events allowing an unknown actor
121
+ // have no user either.
122
+ const userId = user ? user.id : null;
97
123
  if (registration.kind === 'legacy') {
98
124
  // TODO: What does this ignore in upload? Why would we want to ignore anything?
99
125
  const ignoredUids = [
@@ -113,18 +139,7 @@ const getRetentionDays = (strapi)=>{
113
139
  userId
114
140
  };
115
141
  }
116
- const actor = systemOrigin ? {
117
- type: 'system'
118
- } : {
119
- type: 'admin-user',
120
- // We copy the user data into the row so the history stays unchanged if the
121
- // user changes later
122
- user: {
123
- id: user.id,
124
- email: user.email,
125
- name: getDisplayName(user)
126
- }
127
- };
142
+ const actor = getActor(systemOrigin, user);
128
143
  let shape = null;
129
144
  try {
130
145
  shape = await registration.transform(...args);
@@ -176,7 +191,7 @@ const getRetentionDays = (strapi)=>{
176
191
  * Adds an event to the list of audited events. Plugins register their own from
177
192
  * their bootstrap; the transformer builds the audited shape
178
193
  * ({resource, details, outcome}) from the arguments passed to eventHub.emit().
179
- */ registerEvent (name, transform) {
194
+ */ registerEvent (name, transform, options = {}) {
180
195
  if (eventMap[name]?.kind === 'legacy') {
181
196
  throw new Error(`Cannot register the audit log event "${name}": it is one of the built-in events, whose stored shape is frozen.`);
182
197
  }
@@ -185,7 +200,8 @@ const getRetentionDays = (strapi)=>{
185
200
  }
186
201
  eventMap[name] = {
187
202
  kind: 'standard',
188
- transform: transform
203
+ transform: transform,
204
+ options
189
205
  };
190
206
  },
191
207
  async register () {
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycles.mjs","sources":["../../../../../../../ee/server/src/audit-logs/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules } from '@strapi/types';\n\nimport { getDisplayName } from '../utils';\n\nconst DEFAULT_RETENTION_DAYS = 90;\n\n/**\n * Events audited before the payload standard; their stored shape is frozen for\n * compatibility. Do not add events here: new events come through registerEvent().\n * TODO: migrate these to the standard.\n */\nconst defaultEvents = [\n 'entry.create',\n 'entry.update',\n 'entry.delete',\n 'entry.publish',\n 'entry.unpublish',\n 'media.create',\n 'media.update',\n 'media.delete',\n 'media-folder.create',\n 'media-folder.update',\n 'media-folder.delete',\n 'user.create',\n 'user.update',\n 'user.delete',\n 'admin.auth.success',\n 'admin.logout',\n 'content-type.create',\n 'content-type.update',\n 'content-type.delete',\n 'component.create',\n 'component.update',\n 'component.delete',\n 'role.create',\n 'role.update',\n 'role.delete',\n 'permission.create',\n 'permission.update',\n 'permission.delete',\n];\n\n/**\n * Legacy events store the first emitted argument as-is; registered events store the\n * standard shape built by their transformer.\n */\ntype EventRegistration =\n | { kind: 'legacy' }\n | { kind: 'standard'; transform: Modules.AuditLogs.EventTransformer };\n\nconst getEventMap = (events: string[]) => {\n return events.reduce(\n (acc, event) => {\n acc[event] = { kind: 'legacy' };\n return acc;\n },\n {} as Record<string, EventRegistration>\n );\n};\n\nconst getRetentionDays = (strapi: Core.Strapi) => {\n const featureConfig = strapi.ee.features.get('audit-logs');\n const licenseRetentionDays =\n typeof featureConfig === 'object' && featureConfig?.options?.retentionDays;\n const userRetentionDays = strapi.config.get('admin.auditLogs.retentionDays');\n\n // For enterprise plans, use 90 days by default, but allow users to override it\n if (licenseRetentionDays == null) {\n return userRetentionDays ?? DEFAULT_RETENTION_DAYS;\n }\n\n // Allow users to override the license retention days, but not to increase it\n if (userRetentionDays && userRetentionDays <= licenseRetentionDays) {\n return userRetentionDays;\n }\n\n // User didn't provide a retention days value, use the license one\n return licenseRetentionDays;\n};\n\n/**\n * @description\n * Manages the lifecycle of audit logs. Accessible via strapi.get('audit-logs-lifecycle')\n */\nconst createAuditLogsLifecycleService = (strapi: Core.Strapi) => {\n // Manage internal service state privately\n const state = {} as any;\n const auditLogsService = strapi.get('audit-logs');\n\n const eventMap = getEventMap(defaultEvents);\n\n /**\n * The system origins accepted from the execution context; anything else needs a\n * user. Keyed on the type, so extending SystemOrigin without gating it here fails\n * to compile.\n */\n const SYSTEM_ORIGIN_FLAGS: Record<Modules.AuditLogs.SystemOrigin, true> = {\n scheduler: true,\n };\n const SYSTEM_ORIGINS = Object.keys(SYSTEM_ORIGIN_FLAGS);\n\n const processEvent = async (name: string, ...args: any) => {\n const registration = eventMap[name];\n\n if (!registration) {\n return null;\n }\n\n const rawEvent = args[0];\n\n const requestState = strapi.requestContext.get()?.state;\n\n const isUsingAdminAuth = requestState?.route?.info?.type === 'admin';\n const auditSource = requestState?.auditSource;\n const isMcpAdminAction = auditSource === 'mcp';\n const user = requestState?.user;\n\n const systemOrigin =\n auditSource && SYSTEM_ORIGINS.includes(auditSource)\n ? (auditSource as Modules.AuditLogs.SystemOrigin)\n : undefined;\n\n if (!systemOrigin && ((!isUsingAdminAuth && !isMcpAdminAction) || !user)) {\n return null;\n }\n\n const origin: Modules.AuditLogs.AuditSource = systemOrigin ?? auditSource ?? 'admin-panel';\n const date = new Date().toISOString();\n // Scheduled actions have no user, so a null user is expected. The earlier audit\n // entry that set the schedule records who did it.\n const userId = systemOrigin ? null : user.id;\n\n if (registration.kind === 'legacy') {\n // TODO: What does this ignore in upload? Why would we want to ignore anything?\n const ignoredUids = ['plugin::upload.file', 'plugin::upload.folder'];\n if (ignoredUids.includes(rawEvent?.uid)) {\n return null;\n }\n\n return {\n action: name,\n date,\n payload: { ...rawEvent, origin },\n userId,\n };\n }\n\n const actor: Modules.AuditLogs.Actor = systemOrigin\n ? { type: 'system' }\n : {\n type: 'admin-user',\n // We copy the user data into the row so the history stays unchanged if the\n // user changes later\n user: { id: user.id, email: user.email, name: getDisplayName(user) },\n };\n\n let shape: Modules.AuditLogs.EventShape | null = null;\n\n try {\n shape = await registration.transform(...args);\n } catch (error) {\n // If the transformer fails, we still keep the audit event: the row is saved\n // with the subscriber's fields only.\n strapi.log.error(`Failed to build the audit log payload for ${name}`, { error });\n }\n\n const {\n action: _action,\n date: _date,\n actor: _actor,\n origin: _origin,\n ...rest\n } = (shape ?? {}) as Record<string, unknown>;\n const payload = shape\n ? ({ action: name, date, actor, origin, ...rest } as Modules.AuditLogs.StoredPayload)\n : { action: name, date, actor, origin };\n\n return { action: name, date, payload, userId };\n };\n\n const handleEvent = async (name: string, ...args: any) => {\n try {\n const processedEvent = await processEvent(name, ...args);\n\n if (processedEvent) {\n await auditLogsService.saveEvent(processedEvent);\n }\n } catch (error) {\n // Logged, not propagated: most emitters fire and forget (the document service\n // emits entry.* from an unawaited onCommit callback), and a rejection with no\n // one awaiting it takes the process down. Audit logging is therefore fail-open:\n // the entry is lost and only this line records it.\n strapi.log.error(`Failed to save the audit log entry for ${name}`, { error });\n }\n };\n\n return {\n /**\n * Adds an event to the list of audited events. Plugins register their own from\n * their bootstrap; the transformer builds the audited shape\n * ({resource, details, outcome}) from the arguments passed to eventHub.emit().\n */\n registerEvent<TDetails = unknown>(\n name: string,\n transform: Modules.AuditLogs.EventTransformer<TDetails>\n ) {\n if (eventMap[name]?.kind === 'legacy') {\n throw new Error(\n `Cannot register the audit log event \"${name}\": it is one of the built-in events, whose stored shape is frozen.`\n );\n }\n\n if (eventMap[name]) {\n strapi.log.warn(`The audit log event \"${name}\" was already registered and is replaced.`);\n }\n\n eventMap[name] = {\n kind: 'standard',\n transform: transform as Modules.AuditLogs.EventTransformer,\n };\n },\n\n async register() {\n // Handle license being enabled\n if (!state.eeEnableUnsubscribe) {\n // @ts-expect-error- update event hub to receive callback argument\n state.eeEnableUnsubscribe = strapi.eventHub.on('ee.enable', () => {\n // Recreate the service to use the new license info\n this.destroy();\n this.register();\n });\n }\n\n // Handle license being updated\n if (!state.eeUpdateUnsubscribe) {\n // @ts-expect-error- update event hub to receive callback argument\n state.eeUpdateUnsubscribe = strapi.eventHub.on('ee.update', () => {\n // Recreate the service to use the new license info\n this.destroy();\n this.register();\n });\n }\n\n // Handle license being disabled\n // @ts-expect-error- update event hub to receive callback argument\n state.eeDisableUnsubscribe = strapi.eventHub.on('ee.disable', () => {\n // Turn off service when the license gets disabled\n // Only ee.enable and ee.update listeners remain active to recreate the service\n this.destroy();\n });\n\n // Check current state of license\n if (!strapi.ee.features.isEnabled('audit-logs')) {\n return this;\n }\n\n // Start saving events\n state.eventHubUnsubscribe = strapi.eventHub.subscribe(handleEvent);\n\n // Manage audit logs auto deletion\n const retentionDays = getRetentionDays(strapi);\n\n strapi.cron.add({\n deleteExpiredAuditLogs: {\n async task() {\n const expirationDate = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1000);\n await auditLogsService.deleteExpiredEvents(expirationDate);\n },\n options: '0 0 * * *',\n },\n });\n\n return this;\n },\n\n unsubscribe() {\n if (state.eeDisableUnsubscribe) {\n state.eeDisableUnsubscribe();\n }\n\n if (state.eventHubUnsubscribe) {\n state.eventHubUnsubscribe();\n }\n\n strapi.cron.remove('deleteExpiredAuditLogs');\n\n return this;\n },\n\n destroy() {\n return this.unsubscribe();\n },\n };\n};\n\nexport { createAuditLogsLifecycleService };\n"],"names":["DEFAULT_RETENTION_DAYS","defaultEvents","getEventMap","events","reduce","acc","event","kind","getRetentionDays","strapi","featureConfig","ee","features","get","licenseRetentionDays","options","retentionDays","userRetentionDays","config","createAuditLogsLifecycleService","state","auditLogsService","eventMap","SYSTEM_ORIGIN_FLAGS","scheduler","SYSTEM_ORIGINS","Object","keys","processEvent","name","args","registration","rawEvent","requestState","requestContext","isUsingAdminAuth","route","info","type","auditSource","isMcpAdminAction","user","systemOrigin","includes","undefined","origin","date","Date","toISOString","userId","id","ignoredUids","uid","action","payload","actor","email","getDisplayName","shape","transform","error","log","_action","_date","_actor","_origin","rest","handleEvent","processedEvent","saveEvent","registerEvent","Error","warn","register","eeEnableUnsubscribe","eventHub","on","destroy","eeUpdateUnsubscribe","eeDisableUnsubscribe","isEnabled","eventHubUnsubscribe","subscribe","cron","add","deleteExpiredAuditLogs","task","expirationDate","now","deleteExpiredEvents","unsubscribe","remove"],"mappings":"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"}
1
+ {"version":3,"file":"lifecycles.mjs","sources":["../../../../../../../ee/server/src/audit-logs/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules } from '@strapi/types';\n\nimport { getDisplayName } from '../utils';\n\nconst DEFAULT_RETENTION_DAYS = 90;\n\n/**\n * Events audited before the payload standard; their stored shape is frozen for\n * compatibility. Do not add events here: new events come through registerEvent().\n * The event hub still emits user.create, user.update and user.delete; the audit log\n * records them as admin-user.* (server/src/audit-logs/admin-users.ts).\n * TODO: migrate the rest to the standard.\n */\nconst defaultEvents = [\n 'entry.create',\n 'entry.update',\n 'entry.delete',\n 'entry.publish',\n 'entry.unpublish',\n 'media.create',\n 'media.update',\n 'media.delete',\n 'media-folder.create',\n 'media-folder.update',\n 'media-folder.delete',\n 'admin.auth.success',\n 'admin.logout',\n 'content-type.create',\n 'content-type.update',\n 'content-type.delete',\n 'component.create',\n 'component.update',\n 'component.delete',\n 'role.create',\n 'role.update',\n 'role.delete',\n 'permission.create',\n 'permission.update',\n 'permission.delete',\n];\n\n/**\n * Legacy events store the first emitted argument as-is; registered events store the\n * standard shape built by their transformer.\n */\ntype EventRegistration =\n | { kind: 'legacy' }\n | {\n kind: 'standard';\n transform: Modules.AuditLogs.EventTransformer;\n options: RegisterEventOptions;\n };\n\nexport interface RegisterEventOptions {\n /**\n * Records the event when the request has no authenticated user, with an\n * `unknown` actor and no user column. For actions taken from public admin\n * forms (password reset, invitation). Off by default: an event with no user\n * is dropped.\n */\n allowUnknownActor?: boolean;\n}\n\nconst getEventMap = (events: string[]) => {\n return events.reduce(\n (acc, event) => {\n acc[event] = { kind: 'legacy' };\n return acc;\n },\n {} as Record<string, EventRegistration>\n );\n};\n\nconst getActor = (\n systemOrigin: Modules.AuditLogs.SystemOrigin | undefined,\n user: { id: string | number; email: string; firstname?: string; lastname?: string } | undefined\n): Modules.AuditLogs.Actor => {\n if (systemOrigin) {\n return { type: 'system' };\n }\n\n if (!user) {\n return { type: 'unknown' };\n }\n\n // We copy the user data into the row so the history stays unchanged if the user\n // changes later\n return {\n type: 'admin-user',\n user: { id: user.id, email: user.email, name: getDisplayName(user) },\n };\n};\n\nconst getRetentionDays = (strapi: Core.Strapi) => {\n const featureConfig = strapi.ee.features.get('audit-logs');\n const licenseRetentionDays =\n typeof featureConfig === 'object' && featureConfig?.options?.retentionDays;\n const userRetentionDays = strapi.config.get('admin.auditLogs.retentionDays');\n\n // For enterprise plans, use 90 days by default, but allow users to override it\n if (licenseRetentionDays == null) {\n return userRetentionDays ?? DEFAULT_RETENTION_DAYS;\n }\n\n // Allow users to override the license retention days, but not to increase it\n if (userRetentionDays && userRetentionDays <= licenseRetentionDays) {\n return userRetentionDays;\n }\n\n // User didn't provide a retention days value, use the license one\n return licenseRetentionDays;\n};\n\n/**\n * @description\n * Manages the lifecycle of audit logs. Accessible via strapi.get('audit-logs-lifecycle')\n */\nconst createAuditLogsLifecycleService = (strapi: Core.Strapi) => {\n // Manage internal service state privately\n const state = {} as any;\n const auditLogsService = strapi.get('audit-logs');\n\n const eventMap = getEventMap(defaultEvents);\n\n /**\n * The system origins accepted from the execution context; anything else needs a\n * user. Keyed on the type, so extending SystemOrigin without gating it here fails\n * to compile.\n */\n const SYSTEM_ORIGIN_FLAGS: Record<Modules.AuditLogs.SystemOrigin, true> = {\n scheduler: true,\n };\n const SYSTEM_ORIGINS = Object.keys(SYSTEM_ORIGIN_FLAGS);\n\n const processEvent = async (name: string, ...args: any) => {\n const registration = eventMap[name];\n\n if (!registration) {\n return null;\n }\n\n const rawEvent = args[0];\n\n const requestState = strapi.requestContext.get()?.state;\n\n const isUsingAdminAuth = requestState?.route?.info?.type === 'admin';\n const auditSource = requestState?.auditSource;\n const isMcpAdminAction = auditSource === 'mcp';\n const user = requestState?.user;\n\n const systemOrigin =\n auditSource && SYSTEM_ORIGINS.includes(auditSource)\n ? (auditSource as Modules.AuditLogs.SystemOrigin)\n : undefined;\n\n if (!systemOrigin && !isUsingAdminAuth && !isMcpAdminAction) {\n return null;\n }\n\n const allowsUnknownActor =\n registration.kind === 'standard' && registration.options.allowUnknownActor === true;\n\n if (!systemOrigin && !user && !allowsUnknownActor) {\n return null;\n }\n\n const origin: Modules.AuditLogs.AuditSource = systemOrigin ?? auditSource ?? 'admin-panel';\n const date = new Date().toISOString();\n // Scheduled actions have no user, so a null user is expected. The earlier audit\n // entry that set the schedule records who did it. Events allowing an unknown actor\n // have no user either.\n const userId = user ? user.id : null;\n\n if (registration.kind === 'legacy') {\n // TODO: What does this ignore in upload? Why would we want to ignore anything?\n const ignoredUids = ['plugin::upload.file', 'plugin::upload.folder'];\n if (ignoredUids.includes(rawEvent?.uid)) {\n return null;\n }\n\n return {\n action: name,\n date,\n payload: { ...rawEvent, origin },\n userId,\n };\n }\n\n const actor = getActor(systemOrigin, user);\n\n let shape: Modules.AuditLogs.EventShape | null = null;\n\n try {\n shape = await registration.transform(...args);\n } catch (error) {\n // If the transformer fails, we still keep the audit event: the row is saved\n // with the subscriber's fields only.\n strapi.log.error(`Failed to build the audit log payload for ${name}`, { error });\n }\n\n const {\n action: _action,\n date: _date,\n actor: _actor,\n origin: _origin,\n ...rest\n } = (shape ?? {}) as Record<string, unknown>;\n const payload = shape\n ? ({ action: name, date, actor, origin, ...rest } as Modules.AuditLogs.StoredPayload)\n : { action: name, date, actor, origin };\n\n return { action: name, date, payload, userId };\n };\n\n const handleEvent = async (name: string, ...args: any) => {\n try {\n const processedEvent = await processEvent(name, ...args);\n\n if (processedEvent) {\n await auditLogsService.saveEvent(processedEvent);\n }\n } catch (error) {\n // Logged, not propagated: most emitters fire and forget (the document service\n // emits entry.* from an unawaited onCommit callback), and a rejection with no\n // one awaiting it takes the process down. Audit logging is therefore fail-open:\n // the entry is lost and only this line records it.\n strapi.log.error(`Failed to save the audit log entry for ${name}`, { error });\n }\n };\n\n return {\n /**\n * Adds an event to the list of audited events. Plugins register their own from\n * their bootstrap; the transformer builds the audited shape\n * ({resource, details, outcome}) from the arguments passed to eventHub.emit().\n */\n registerEvent<TDetails = unknown>(\n name: string,\n transform: Modules.AuditLogs.EventTransformer<TDetails>,\n options: RegisterEventOptions = {}\n ) {\n if (eventMap[name]?.kind === 'legacy') {\n throw new Error(\n `Cannot register the audit log event \"${name}\": it is one of the built-in events, whose stored shape is frozen.`\n );\n }\n\n if (eventMap[name]) {\n strapi.log.warn(`The audit log event \"${name}\" was already registered and is replaced.`);\n }\n\n eventMap[name] = {\n kind: 'standard',\n transform: transform as Modules.AuditLogs.EventTransformer,\n options,\n };\n },\n\n async register() {\n // Handle license being enabled\n if (!state.eeEnableUnsubscribe) {\n // @ts-expect-error- update event hub to receive callback argument\n state.eeEnableUnsubscribe = strapi.eventHub.on('ee.enable', () => {\n // Recreate the service to use the new license info\n this.destroy();\n this.register();\n });\n }\n\n // Handle license being updated\n if (!state.eeUpdateUnsubscribe) {\n // @ts-expect-error- update event hub to receive callback argument\n state.eeUpdateUnsubscribe = strapi.eventHub.on('ee.update', () => {\n // Recreate the service to use the new license info\n this.destroy();\n this.register();\n });\n }\n\n // Handle license being disabled\n // @ts-expect-error- update event hub to receive callback argument\n state.eeDisableUnsubscribe = strapi.eventHub.on('ee.disable', () => {\n // Turn off service when the license gets disabled\n // Only ee.enable and ee.update listeners remain active to recreate the service\n this.destroy();\n });\n\n // Check current state of license\n if (!strapi.ee.features.isEnabled('audit-logs')) {\n return this;\n }\n\n // Start saving events\n state.eventHubUnsubscribe = strapi.eventHub.subscribe(handleEvent);\n\n // Manage audit logs auto deletion\n const retentionDays = getRetentionDays(strapi);\n\n strapi.cron.add({\n deleteExpiredAuditLogs: {\n async task() {\n const expirationDate = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1000);\n await auditLogsService.deleteExpiredEvents(expirationDate);\n },\n options: '0 0 * * *',\n },\n });\n\n return this;\n },\n\n unsubscribe() {\n if (state.eeDisableUnsubscribe) {\n state.eeDisableUnsubscribe();\n }\n\n if (state.eventHubUnsubscribe) {\n state.eventHubUnsubscribe();\n }\n\n strapi.cron.remove('deleteExpiredAuditLogs');\n\n return this;\n },\n\n destroy() {\n return this.unsubscribe();\n },\n };\n};\n\nexport { createAuditLogsLifecycleService };\n"],"names":["DEFAULT_RETENTION_DAYS","defaultEvents","getEventMap","events","reduce","acc","event","kind","getActor","systemOrigin","user","type","id","email","name","getDisplayName","getRetentionDays","strapi","featureConfig","ee","features","get","licenseRetentionDays","options","retentionDays","userRetentionDays","config","createAuditLogsLifecycleService","state","auditLogsService","eventMap","SYSTEM_ORIGIN_FLAGS","scheduler","SYSTEM_ORIGINS","Object","keys","processEvent","args","registration","rawEvent","requestState","requestContext","isUsingAdminAuth","route","info","auditSource","isMcpAdminAction","includes","undefined","allowsUnknownActor","allowUnknownActor","origin","date","Date","toISOString","userId","ignoredUids","uid","action","payload","actor","shape","transform","error","log","_action","_date","_actor","_origin","rest","handleEvent","processedEvent","saveEvent","registerEvent","Error","warn","register","eeEnableUnsubscribe","eventHub","on","destroy","eeUpdateUnsubscribe","eeDisableUnsubscribe","isEnabled","eventHubUnsubscribe","subscribe","cron","add","deleteExpiredAuditLogs","task","expirationDate","now","deleteExpiredEvents","unsubscribe","remove"],"mappings":"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"}
@@ -11,12 +11,13 @@ var admin = {
11
11
  try {
12
12
  return {
13
13
  data: {
14
- isEE: strapi.EE,
14
+ // The license fields are nullable internally; the contract is not.
15
+ isEE: Boolean(strapi.EE),
15
16
  isTrial: strapi.ee.isTrial,
16
17
  features: strapi.ee.features.list(),
17
18
  flags,
18
- type: strapi.ee.type,
19
- planPriceId: strapi.ee.planPriceId,
19
+ type: strapi.ee.type ?? undefined,
20
+ planPriceId: strapi.ee.planPriceId ?? undefined,
20
21
  ai: {
21
22
  enabled: strapi.ai.admin.isStrapiManagedAiEnabled()
22
23
  }
@@ -26,6 +27,7 @@ var admin = {
26
27
  return {
27
28
  data: {
28
29
  isEE: false,
30
+ isTrial: false,
29
31
  features: [],
30
32
  flags,
31
33
  ai: {
@@ -1 +1 @@
1
- {"version":3,"file":"admin.js","sources":["../../../../../../ee/server/src/controllers/admin.ts"],"sourcesContent":["import { isNil } from 'lodash/fp';\nimport { env } from '@strapi/utils';\n\nimport { getService } from '../utils';\n\nexport default {\n // NOTE: Overrides CE admin controller\n async getProjectType() {\n const flags = strapi.config.get('admin.flags', {});\n\n try {\n return {\n data: {\n isEE: strapi.EE,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list(),\n flags,\n type: strapi.ee.type,\n planPriceId: strapi.ee.planPriceId,\n ai: {\n enabled: strapi.ai.admin.isStrapiManagedAiEnabled(),\n },\n },\n };\n } catch {\n return { data: { isEE: false, features: [], flags, ai: { enabled: false } } };\n }\n },\n\n async licenseLimitInformation() {\n const permittedSeats = strapi.ee.seats;\n\n let shouldNotify = false;\n let licenseLimitStatus = null;\n let enforcementUserCount;\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const eeDisabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (eeDisabledUsers) {\n enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;\n } else {\n enforcementUserCount = currentActiveUserCount;\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount > permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'OVER_LIMIT';\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount === permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'AT_LIMIT';\n }\n\n const data = {\n enforcementUserCount,\n currentActiveUserCount,\n permittedSeats,\n shouldNotify,\n shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,\n licenseLimitStatus,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n type: strapi.ee.type,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list() ?? [],\n };\n\n return { data };\n },\n};\n"],"names":["getProjectType","flags","strapi","config","get","data","isEE","EE","isTrial","ee","features","list","type","planPriceId","ai","enabled","admin","isStrapiManagedAiEnabled","licenseLimitInformation","permittedSeats","seats","shouldNotify","licenseLimitStatus","enforcementUserCount","currentActiveUserCount","getService","getCurrentActiveUserCount","eeDisabledUsers","getDisabledUserList","length","isNil","shouldStopCreate","isHostedOnStrapiCloud","env"],"mappings":";;;;;;AAKA,YAAe;;IAEb,MAAMA,cAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAMC,QAAQC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,eAAe,EAAC,CAAA;QAEhD,IAAI;YACF,OAAO;gBACLC,IAAAA,EAAM;AACJC,oBAAAA,IAAAA,EAAMJ,OAAOK,EAAE;oBACfC,OAAAA,EAASN,MAAAA,CAAOO,EAAE,CAACD,OAAO;AAC1BE,oBAAAA,QAAAA,EAAUR,MAAAA,CAAOO,EAAE,CAACC,QAAQ,CAACC,IAAI,EAAA;AACjCV,oBAAAA,KAAAA;oBACAW,IAAAA,EAAMV,MAAAA,CAAOO,EAAE,CAACG,IAAI;oBACpBC,WAAAA,EAAaX,MAAAA,CAAOO,EAAE,CAACI,WAAW;oBAClCC,EAAAA,EAAI;AACFC,wBAAAA,OAAAA,EAASb,MAAAA,CAAOY,EAAE,CAACE,KAAK,CAACC,wBAAwB;AACnD;AACF;AACF,aAAA;AACF,QAAA,CAAA,CAAE,OAAM;YACN,OAAO;gBAAEZ,IAAAA,EAAM;oBAAEC,IAAAA,EAAM,KAAA;AAAOI,oBAAAA,QAAAA,EAAU,EAAE;AAAET,oBAAAA,KAAAA;oBAAOa,EAAAA,EAAI;wBAAEC,OAAAA,EAAS;AAAM;AAAE;AAAE,aAAA;AAC9E,QAAA;AACF,IAAA,CAAA;IAEA,MAAMG,uBAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAMC,cAAAA,GAAiBjB,MAAAA,CAAOO,EAAE,CAACW,KAAK;AAEtC,QAAA,IAAIC,YAAAA,GAAe,KAAA;AACnB,QAAA,IAAIC,kBAAAA,GAAqB,IAAA;QACzB,IAAIC,oBAAAA;AAEJ,QAAA,MAAMC,sBAAAA,GAAyB,MAAMC,gBAAAA,CAAW,MAAA,CAAA,CAAQC,yBAAyB,EAAA;AAEjF,QAAA,MAAMC,eAAAA,GAAkB,MAAMF,gBAAAA,CAAW,kBAAA,CAAA,CAAoBG,mBAAmB,EAAA;AAEhF,QAAA,IAAID,eAAAA,EAAiB;YACnBJ,oBAAAA,GAAuBC,sBAAAA,GAAyBG,gBAAgBE,MAAM;QACxE,CAAA,MAAO;YACLN,oBAAAA,GAAuBC,sBAAAA;AACzB,QAAA;AAEA,QAAA,IAAI,CAACM,QAAAA,CAAMX,cAAAA,CAAAA,IAAmBI,oBAAAA,GAAuBJ,cAAAA,EAAgB;YACnEE,YAAAA,GAAe,IAAA;YACfC,kBAAAA,GAAqB,YAAA;AACvB,QAAA;AAEA,QAAA,IAAI,CAACQ,QAAAA,CAAMX,cAAAA,CAAAA,IAAmBI,oBAAAA,KAAyBJ,cAAAA,EAAgB;YACrEE,YAAAA,GAAe,IAAA;YACfC,kBAAAA,GAAqB,UAAA;AACvB,QAAA;AAEA,QAAA,MAAMjB,IAAAA,GAAO;AACXkB,YAAAA,oBAAAA;AACAC,YAAAA,sBAAAA;AACAL,YAAAA,cAAAA;AACAE,YAAAA,YAAAA;YACAU,gBAAAA,EAAkBD,QAAAA,CAAMX,cAAAA,CAAAA,GAAkB,KAAA,GAAQK,sBAAAA,IAA0BL,cAAAA;AAC5EG,YAAAA,kBAAAA;YACAU,qBAAAA,EAAuBC,SAAAA,CAAI,kBAAkB,IAAA,CAAA,KAAU,cAAA;YACvDrB,IAAAA,EAAMV,MAAAA,CAAOO,EAAE,CAACG,IAAI;YACpBJ,OAAAA,EAASN,MAAAA,CAAOO,EAAE,CAACD,OAAO;AAC1BE,YAAAA,QAAAA,EAAUR,OAAOO,EAAE,CAACC,QAAQ,CAACC,IAAI,MAAM;AACzC,SAAA;QAEA,OAAO;AAAEN,YAAAA;AAAK,SAAA;AAChB,IAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"admin.js","sources":["../../../../../../ee/server/src/controllers/admin.ts"],"sourcesContent":["import { isNil } from 'lodash/fp';\nimport { env } from '@strapi/utils';\n\nimport { getService } from '../utils';\n\nimport type { GetProjectType } from '../../../../shared/contracts/admin';\n\nexport default {\n // NOTE: Overrides CE admin controller\n async getProjectType(): Promise<GetProjectType.Response> {\n const flags = strapi.config.get('admin.flags', {});\n\n try {\n return {\n data: {\n // The license fields are nullable internally; the contract is not.\n isEE: Boolean(strapi.EE),\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list(),\n flags,\n type: strapi.ee.type ?? undefined,\n planPriceId: strapi.ee.planPriceId ?? undefined,\n ai: {\n enabled: strapi.ai.admin.isStrapiManagedAiEnabled(),\n },\n },\n };\n } catch {\n return { data: { isEE: false, isTrial: false, features: [], flags, ai: { enabled: false } } };\n }\n },\n\n async licenseLimitInformation() {\n const permittedSeats = strapi.ee.seats;\n\n let shouldNotify = false;\n let licenseLimitStatus = null;\n let enforcementUserCount;\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const eeDisabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (eeDisabledUsers) {\n enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;\n } else {\n enforcementUserCount = currentActiveUserCount;\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount > permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'OVER_LIMIT';\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount === permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'AT_LIMIT';\n }\n\n const data = {\n enforcementUserCount,\n currentActiveUserCount,\n permittedSeats,\n shouldNotify,\n shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,\n licenseLimitStatus,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n type: strapi.ee.type,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list() ?? [],\n };\n\n return { data };\n },\n};\n"],"names":["getProjectType","flags","strapi","config","get","data","isEE","Boolean","EE","isTrial","ee","features","list","type","undefined","planPriceId","ai","enabled","admin","isStrapiManagedAiEnabled","licenseLimitInformation","permittedSeats","seats","shouldNotify","licenseLimitStatus","enforcementUserCount","currentActiveUserCount","getService","getCurrentActiveUserCount","eeDisabledUsers","getDisabledUserList","length","isNil","shouldStopCreate","isHostedOnStrapiCloud","env"],"mappings":"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"}
@@ -9,12 +9,13 @@ var admin = {
9
9
  try {
10
10
  return {
11
11
  data: {
12
- isEE: strapi.EE,
12
+ // The license fields are nullable internally; the contract is not.
13
+ isEE: Boolean(strapi.EE),
13
14
  isTrial: strapi.ee.isTrial,
14
15
  features: strapi.ee.features.list(),
15
16
  flags,
16
- type: strapi.ee.type,
17
- planPriceId: strapi.ee.planPriceId,
17
+ type: strapi.ee.type ?? undefined,
18
+ planPriceId: strapi.ee.planPriceId ?? undefined,
18
19
  ai: {
19
20
  enabled: strapi.ai.admin.isStrapiManagedAiEnabled()
20
21
  }
@@ -24,6 +25,7 @@ var admin = {
24
25
  return {
25
26
  data: {
26
27
  isEE: false,
28
+ isTrial: false,
27
29
  features: [],
28
30
  flags,
29
31
  ai: {
@@ -1 +1 @@
1
- {"version":3,"file":"admin.mjs","sources":["../../../../../../ee/server/src/controllers/admin.ts"],"sourcesContent":["import { isNil } from 'lodash/fp';\nimport { env } from '@strapi/utils';\n\nimport { getService } from '../utils';\n\nexport default {\n // NOTE: Overrides CE admin controller\n async getProjectType() {\n const flags = strapi.config.get('admin.flags', {});\n\n try {\n return {\n data: {\n isEE: strapi.EE,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list(),\n flags,\n type: strapi.ee.type,\n planPriceId: strapi.ee.planPriceId,\n ai: {\n enabled: strapi.ai.admin.isStrapiManagedAiEnabled(),\n },\n },\n };\n } catch {\n return { data: { isEE: false, features: [], flags, ai: { enabled: false } } };\n }\n },\n\n async licenseLimitInformation() {\n const permittedSeats = strapi.ee.seats;\n\n let shouldNotify = false;\n let licenseLimitStatus = null;\n let enforcementUserCount;\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const eeDisabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (eeDisabledUsers) {\n enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;\n } else {\n enforcementUserCount = currentActiveUserCount;\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount > permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'OVER_LIMIT';\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount === permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'AT_LIMIT';\n }\n\n const data = {\n enforcementUserCount,\n currentActiveUserCount,\n permittedSeats,\n shouldNotify,\n shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,\n licenseLimitStatus,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n type: strapi.ee.type,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list() ?? [],\n };\n\n return { data };\n },\n};\n"],"names":["getProjectType","flags","strapi","config","get","data","isEE","EE","isTrial","ee","features","list","type","planPriceId","ai","enabled","admin","isStrapiManagedAiEnabled","licenseLimitInformation","permittedSeats","seats","shouldNotify","licenseLimitStatus","enforcementUserCount","currentActiveUserCount","getService","getCurrentActiveUserCount","eeDisabledUsers","getDisabledUserList","length","isNil","shouldStopCreate","isHostedOnStrapiCloud","env"],"mappings":";;;;AAKA,YAAe;;IAEb,MAAMA,cAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAMC,QAAQC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,eAAe,EAAC,CAAA;QAEhD,IAAI;YACF,OAAO;gBACLC,IAAAA,EAAM;AACJC,oBAAAA,IAAAA,EAAMJ,OAAOK,EAAE;oBACfC,OAAAA,EAASN,MAAAA,CAAOO,EAAE,CAACD,OAAO;AAC1BE,oBAAAA,QAAAA,EAAUR,MAAAA,CAAOO,EAAE,CAACC,QAAQ,CAACC,IAAI,EAAA;AACjCV,oBAAAA,KAAAA;oBACAW,IAAAA,EAAMV,MAAAA,CAAOO,EAAE,CAACG,IAAI;oBACpBC,WAAAA,EAAaX,MAAAA,CAAOO,EAAE,CAACI,WAAW;oBAClCC,EAAAA,EAAI;AACFC,wBAAAA,OAAAA,EAASb,MAAAA,CAAOY,EAAE,CAACE,KAAK,CAACC,wBAAwB;AACnD;AACF;AACF,aAAA;AACF,QAAA,CAAA,CAAE,OAAM;YACN,OAAO;gBAAEZ,IAAAA,EAAM;oBAAEC,IAAAA,EAAM,KAAA;AAAOI,oBAAAA,QAAAA,EAAU,EAAE;AAAET,oBAAAA,KAAAA;oBAAOa,EAAAA,EAAI;wBAAEC,OAAAA,EAAS;AAAM;AAAE;AAAE,aAAA;AAC9E,QAAA;AACF,IAAA,CAAA;IAEA,MAAMG,uBAAAA,CAAAA,GAAAA;AACJ,QAAA,MAAMC,cAAAA,GAAiBjB,MAAAA,CAAOO,EAAE,CAACW,KAAK;AAEtC,QAAA,IAAIC,YAAAA,GAAe,KAAA;AACnB,QAAA,IAAIC,kBAAAA,GAAqB,IAAA;QACzB,IAAIC,oBAAAA;AAEJ,QAAA,MAAMC,sBAAAA,GAAyB,MAAMC,UAAAA,CAAW,MAAA,CAAA,CAAQC,yBAAyB,EAAA;AAEjF,QAAA,MAAMC,eAAAA,GAAkB,MAAMF,UAAAA,CAAW,kBAAA,CAAA,CAAoBG,mBAAmB,EAAA;AAEhF,QAAA,IAAID,eAAAA,EAAiB;YACnBJ,oBAAAA,GAAuBC,sBAAAA,GAAyBG,gBAAgBE,MAAM;QACxE,CAAA,MAAO;YACLN,oBAAAA,GAAuBC,sBAAAA;AACzB,QAAA;AAEA,QAAA,IAAI,CAACM,KAAAA,CAAMX,cAAAA,CAAAA,IAAmBI,oBAAAA,GAAuBJ,cAAAA,EAAgB;YACnEE,YAAAA,GAAe,IAAA;YACfC,kBAAAA,GAAqB,YAAA;AACvB,QAAA;AAEA,QAAA,IAAI,CAACQ,KAAAA,CAAMX,cAAAA,CAAAA,IAAmBI,oBAAAA,KAAyBJ,cAAAA,EAAgB;YACrEE,YAAAA,GAAe,IAAA;YACfC,kBAAAA,GAAqB,UAAA;AACvB,QAAA;AAEA,QAAA,MAAMjB,IAAAA,GAAO;AACXkB,YAAAA,oBAAAA;AACAC,YAAAA,sBAAAA;AACAL,YAAAA,cAAAA;AACAE,YAAAA,YAAAA;YACAU,gBAAAA,EAAkBD,KAAAA,CAAMX,cAAAA,CAAAA,GAAkB,KAAA,GAAQK,sBAAAA,IAA0BL,cAAAA;AAC5EG,YAAAA,kBAAAA;YACAU,qBAAAA,EAAuBC,GAAAA,CAAI,kBAAkB,IAAA,CAAA,KAAU,cAAA;YACvDrB,IAAAA,EAAMV,MAAAA,CAAOO,EAAE,CAACG,IAAI;YACpBJ,OAAAA,EAASN,MAAAA,CAAOO,EAAE,CAACD,OAAO;AAC1BE,YAAAA,QAAAA,EAAUR,OAAOO,EAAE,CAACC,QAAQ,CAACC,IAAI,MAAM;AACzC,SAAA;QAEA,OAAO;AAAEN,YAAAA;AAAK,SAAA;AAChB,IAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"admin.mjs","sources":["../../../../../../ee/server/src/controllers/admin.ts"],"sourcesContent":["import { isNil } from 'lodash/fp';\nimport { env } from '@strapi/utils';\n\nimport { getService } from '../utils';\n\nimport type { GetProjectType } from '../../../../shared/contracts/admin';\n\nexport default {\n // NOTE: Overrides CE admin controller\n async getProjectType(): Promise<GetProjectType.Response> {\n const flags = strapi.config.get('admin.flags', {});\n\n try {\n return {\n data: {\n // The license fields are nullable internally; the contract is not.\n isEE: Boolean(strapi.EE),\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list(),\n flags,\n type: strapi.ee.type ?? undefined,\n planPriceId: strapi.ee.planPriceId ?? undefined,\n ai: {\n enabled: strapi.ai.admin.isStrapiManagedAiEnabled(),\n },\n },\n };\n } catch {\n return { data: { isEE: false, isTrial: false, features: [], flags, ai: { enabled: false } } };\n }\n },\n\n async licenseLimitInformation() {\n const permittedSeats = strapi.ee.seats;\n\n let shouldNotify = false;\n let licenseLimitStatus = null;\n let enforcementUserCount;\n\n const currentActiveUserCount = await getService('user').getCurrentActiveUserCount();\n\n const eeDisabledUsers = await getService('seat-enforcement').getDisabledUserList();\n\n if (eeDisabledUsers) {\n enforcementUserCount = currentActiveUserCount + eeDisabledUsers.length;\n } else {\n enforcementUserCount = currentActiveUserCount;\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount > permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'OVER_LIMIT';\n }\n\n if (!isNil(permittedSeats) && enforcementUserCount === permittedSeats) {\n shouldNotify = true;\n licenseLimitStatus = 'AT_LIMIT';\n }\n\n const data = {\n enforcementUserCount,\n currentActiveUserCount,\n permittedSeats,\n shouldNotify,\n shouldStopCreate: isNil(permittedSeats) ? false : currentActiveUserCount >= permittedSeats,\n licenseLimitStatus,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n type: strapi.ee.type,\n isTrial: strapi.ee.isTrial,\n features: strapi.ee.features.list() ?? [],\n };\n\n return { data };\n },\n};\n"],"names":["getProjectType","flags","strapi","config","get","data","isEE","Boolean","EE","isTrial","ee","features","list","type","undefined","planPriceId","ai","enabled","admin","isStrapiManagedAiEnabled","licenseLimitInformation","permittedSeats","seats","shouldNotify","licenseLimitStatus","enforcementUserCount","currentActiveUserCount","getService","getCurrentActiveUserCount","eeDisabledUsers","getDisabledUserList","length","isNil","shouldStopCreate","isHostedOnStrapiCloud","env"],"mappings":"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"}
@@ -14,6 +14,8 @@ var lifecycles = require('./audit-logs/services/lifecycles.js');
14
14
  var auditLog = require('./audit-logs/content-types/audit-log.js');
15
15
  var auditLogExport = require('../../../shared/utils/audit-log-export.js');
16
16
  var tokens = require('../../../server/src/audit-logs/tokens.js');
17
+ var adminUsers = require('../../../server/src/audit-logs/admin-users.js');
18
+ var webhooks = require('../../../server/src/audit-logs/webhooks.js');
17
19
 
18
20
  const getAdminEE = ()=>{
19
21
  const eeAdmin = {
@@ -65,6 +67,8 @@ const getAdminEE = ()=>{
65
67
  }
66
68
  }));
67
69
  tokens.registerTokenAuditEvents(auditLogsLifecycle);
70
+ adminUsers.registerAdminUserAuditEvents(auditLogsLifecycle);
71
+ webhooks.registerWebhookAuditEvents(auditLogsLifecycle);
68
72
  await auditLogsLifecycle.register();
69
73
  }
70
74
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../ee/server/src/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport register from './register';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport adminContentTypes from './content-types';\nimport services from './services';\nimport controllers from './controllers';\nimport routes from './routes';\nimport auditLogsRoutes from './audit-logs/routes/audit-logs';\nimport auditLogsController from './audit-logs/controllers/audit-logs';\nimport { createAuditLogsService } from './audit-logs/services/audit-logs';\nimport { createAuditLogsLifecycleService } from './audit-logs/services/lifecycles';\nimport { auditLog } from './audit-logs/content-types/audit-log';\nimport { AUDIT_LOG_EXPORT_EVENT } from '../../../shared/utils/audit-log-export';\nimport { registerTokenAuditEvents } from '../../../server/src/audit-logs/tokens';\n\nconst getAdminEE = () => {\n const eeAdmin = {\n register,\n bootstrap,\n destroy,\n contentTypes: {\n // Always register the audit-log content type to prevent data loss\n 'audit-log': auditLog,\n ...adminContentTypes,\n },\n services,\n controllers,\n routes,\n };\n\n const isAuditLogsEnabled =\n strapi.config.get('admin.auditLogs.enabled', true) &&\n strapi.ee.features.isEnabled('audit-logs');\n return {\n ...eeAdmin,\n controllers: {\n ...eeAdmin.controllers,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsController } : {}),\n },\n routes: {\n ...eeAdmin.routes,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsRoutes } : {}),\n },\n async register({ strapi }: { strapi: Core.Strapi }) {\n // Run the default registration\n await eeAdmin.register({ strapi });\n\n if (isAuditLogsEnabled) {\n // Register an internal audit logs service\n strapi.add('audit-logs', createAuditLogsService(strapi));\n // Register an internal audit logs lifecycle service\n const auditLogsLifecycle = createAuditLogsLifecycleService(strapi);\n strapi.add('audit-logs-lifecycle', auditLogsLifecycle);\n\n auditLogsLifecycle.registerEvent(\n AUDIT_LOG_EXPORT_EVENT,\n (event: { filters?: unknown }) => ({\n resource: { type: 'audit-log' },\n details: { format: 'csv', filters: event?.filters ?? null },\n })\n );\n\n registerTokenAuditEvents(auditLogsLifecycle);\n\n await auditLogsLifecycle.register();\n }\n },\n async destroy({ strapi }: { strapi: Core.Strapi }) {\n if (isAuditLogsEnabled) {\n strapi.get('audit-logs-lifecycle').destroy();\n }\n await eeAdmin.destroy();\n },\n };\n};\n\nexport default getAdminEE;\n"],"names":["getAdminEE","eeAdmin","register","bootstrap","destroy","contentTypes","auditLog","adminContentTypes","services","controllers","routes","isAuditLogsEnabled","strapi","config","get","ee","features","isEnabled","auditLogsController","auditLogsRoutes","add","createAuditLogsService","auditLogsLifecycle","createAuditLogsLifecycleService","registerEvent","AUDIT_LOG_EXPORT_EVENT","event","resource","type","details","format","filters","registerTokenAuditEvents"],"mappings":";;;;;;;;;;;;;;;;;AAgBA,MAAMA,UAAAA,GAAa,IAAA;AACjB,IAAA,MAAMC,OAAAA,GAAU;AACdC,QAAAA,QAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA,OAAAA;QACAC,YAAAA,EAAc;;YAEZ,WAAA,EAAaC,iBAAAA;AACb,YAAA,GAAGC;AACL,SAAA;AACAC,kBAAAA,OAAAA;AACAC,qBAAAA,OAAAA;AACAC,gBAAAA;AACF,KAAA;AAEA,IAAA,MAAMC,kBAAAA,GACJC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,yBAAA,EAA2B,IAAA,CAAA,IAC7CF,MAAAA,CAAOG,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,YAAA,CAAA;IAC/B,OAAO;AACL,QAAA,GAAGhB,OAAO;QACVQ,WAAAA,EAAa;AACX,YAAA,GAAGR,QAAQQ,WAAW;AACtB,YAAA,GAAIE,kBAAAA,GAAqB;gBAAE,YAAA,EAAcO;AAAoB,aAAA,GAAI;AACnE,SAAA;QACAR,MAAAA,EAAQ;AACN,YAAA,GAAGT,QAAQS,MAAM;AACjB,YAAA,GAAIC,kBAAAA,GAAqB;gBAAE,YAAA,EAAcQ;AAAgB,aAAA,GAAI;AAC/D,SAAA;AACA,QAAA,MAAMjB,QAAAA,CAAAA,CAAS,EAAEU,MAAAA,EAAAA,OAAM,EAA2B,EAAA;;YAEhD,MAAMX,OAAAA,CAAQC,QAAQ,CAAC;gBAAEU,MAAAA,EAAAA;AAAO,aAAA,CAAA;AAEhC,YAAA,IAAID,kBAAAA,EAAoB;;gBAEtBC,OAAAA,CAAOQ,GAAG,CAAC,YAAA,EAAcC,kCAAAA,CAAuBT,OAAAA,CAAAA,CAAAA;;AAEhD,gBAAA,MAAMU,qBAAqBC,0CAAAA,CAAgCX,OAAAA,CAAAA;gBAC3DA,OAAAA,CAAOQ,GAAG,CAAC,sBAAA,EAAwBE,kBAAAA,CAAAA;AAEnCA,gBAAAA,kBAAAA,CAAmBE,aAAa,CAC9BC,qCAAAA,EACA,CAACC,SAAkC;wBACjCC,QAAAA,EAAU;4BAAEC,IAAAA,EAAM;AAAY,yBAAA;wBAC9BC,OAAAA,EAAS;4BAAEC,MAAAA,EAAQ,KAAA;AAAOC,4BAAAA,OAAAA,EAASL,OAAOK,OAAAA,IAAW;AAAK;qBAC5D,CAAA,CAAA;gBAGFC,+BAAAA,CAAyBV,kBAAAA,CAAAA;AAEzB,gBAAA,MAAMA,mBAAmBpB,QAAQ,EAAA;AACnC,YAAA;AACF,QAAA,CAAA;AACA,QAAA,MAAME,OAAAA,CAAAA,CAAQ,EAAEQ,MAAAA,EAAAA,OAAM,EAA2B,EAAA;AAC/C,YAAA,IAAID,kBAAAA,EAAoB;gBACtBC,OAAAA,CAAOE,GAAG,CAAC,sBAAA,CAAA,CAAwBV,OAAO,EAAA;AAC5C,YAAA;AACA,YAAA,MAAMH,QAAQG,OAAO,EAAA;AACvB,QAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../ee/server/src/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport register from './register';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport adminContentTypes from './content-types';\nimport services from './services';\nimport controllers from './controllers';\nimport routes from './routes';\nimport auditLogsRoutes from './audit-logs/routes/audit-logs';\nimport auditLogsController from './audit-logs/controllers/audit-logs';\nimport { createAuditLogsService } from './audit-logs/services/audit-logs';\nimport { createAuditLogsLifecycleService } from './audit-logs/services/lifecycles';\nimport { auditLog } from './audit-logs/content-types/audit-log';\nimport { AUDIT_LOG_EXPORT_EVENT } from '../../../shared/utils/audit-log-export';\nimport { registerTokenAuditEvents } from '../../../server/src/audit-logs/tokens';\nimport { registerAdminUserAuditEvents } from '../../../server/src/audit-logs/admin-users';\nimport { registerWebhookAuditEvents } from '../../../server/src/audit-logs/webhooks';\n\nconst getAdminEE = () => {\n const eeAdmin = {\n register,\n bootstrap,\n destroy,\n contentTypes: {\n // Always register the audit-log content type to prevent data loss\n 'audit-log': auditLog,\n ...adminContentTypes,\n },\n services,\n controllers,\n routes,\n };\n\n const isAuditLogsEnabled =\n strapi.config.get('admin.auditLogs.enabled', true) &&\n strapi.ee.features.isEnabled('audit-logs');\n return {\n ...eeAdmin,\n controllers: {\n ...eeAdmin.controllers,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsController } : {}),\n },\n routes: {\n ...eeAdmin.routes,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsRoutes } : {}),\n },\n async register({ strapi }: { strapi: Core.Strapi }) {\n // Run the default registration\n await eeAdmin.register({ strapi });\n\n if (isAuditLogsEnabled) {\n // Register an internal audit logs service\n strapi.add('audit-logs', createAuditLogsService(strapi));\n // Register an internal audit logs lifecycle service\n const auditLogsLifecycle = createAuditLogsLifecycleService(strapi);\n strapi.add('audit-logs-lifecycle', auditLogsLifecycle);\n\n auditLogsLifecycle.registerEvent(\n AUDIT_LOG_EXPORT_EVENT,\n (event: { filters?: unknown }) => ({\n resource: { type: 'audit-log' },\n details: { format: 'csv', filters: event?.filters ?? null },\n })\n );\n\n registerTokenAuditEvents(auditLogsLifecycle);\n registerAdminUserAuditEvents(auditLogsLifecycle);\n registerWebhookAuditEvents(auditLogsLifecycle);\n\n await auditLogsLifecycle.register();\n }\n },\n async destroy({ strapi }: { strapi: Core.Strapi }) {\n if (isAuditLogsEnabled) {\n strapi.get('audit-logs-lifecycle').destroy();\n }\n await eeAdmin.destroy();\n },\n };\n};\n\nexport default getAdminEE;\n"],"names":["getAdminEE","eeAdmin","register","bootstrap","destroy","contentTypes","auditLog","adminContentTypes","services","controllers","routes","isAuditLogsEnabled","strapi","config","get","ee","features","isEnabled","auditLogsController","auditLogsRoutes","add","createAuditLogsService","auditLogsLifecycle","createAuditLogsLifecycleService","registerEvent","AUDIT_LOG_EXPORT_EVENT","event","resource","type","details","format","filters","registerTokenAuditEvents","registerAdminUserAuditEvents","registerWebhookAuditEvents"],"mappings":";;;;;;;;;;;;;;;;;;;AAkBA,MAAMA,UAAAA,GAAa,IAAA;AACjB,IAAA,MAAMC,OAAAA,GAAU;AACdC,QAAAA,QAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA,OAAAA;QACAC,YAAAA,EAAc;;YAEZ,WAAA,EAAaC,iBAAAA;AACb,YAAA,GAAGC;AACL,SAAA;AACAC,kBAAAA,OAAAA;AACAC,qBAAAA,OAAAA;AACAC,gBAAAA;AACF,KAAA;AAEA,IAAA,MAAMC,kBAAAA,GACJC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,yBAAA,EAA2B,IAAA,CAAA,IAC7CF,MAAAA,CAAOG,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,YAAA,CAAA;IAC/B,OAAO;AACL,QAAA,GAAGhB,OAAO;QACVQ,WAAAA,EAAa;AACX,YAAA,GAAGR,QAAQQ,WAAW;AACtB,YAAA,GAAIE,kBAAAA,GAAqB;gBAAE,YAAA,EAAcO;AAAoB,aAAA,GAAI;AACnE,SAAA;QACAR,MAAAA,EAAQ;AACN,YAAA,GAAGT,QAAQS,MAAM;AACjB,YAAA,GAAIC,kBAAAA,GAAqB;gBAAE,YAAA,EAAcQ;AAAgB,aAAA,GAAI;AAC/D,SAAA;AACA,QAAA,MAAMjB,QAAAA,CAAAA,CAAS,EAAEU,MAAAA,EAAAA,OAAM,EAA2B,EAAA;;YAEhD,MAAMX,OAAAA,CAAQC,QAAQ,CAAC;gBAAEU,MAAAA,EAAAA;AAAO,aAAA,CAAA;AAEhC,YAAA,IAAID,kBAAAA,EAAoB;;gBAEtBC,OAAAA,CAAOQ,GAAG,CAAC,YAAA,EAAcC,kCAAAA,CAAuBT,OAAAA,CAAAA,CAAAA;;AAEhD,gBAAA,MAAMU,qBAAqBC,0CAAAA,CAAgCX,OAAAA,CAAAA;gBAC3DA,OAAAA,CAAOQ,GAAG,CAAC,sBAAA,EAAwBE,kBAAAA,CAAAA;AAEnCA,gBAAAA,kBAAAA,CAAmBE,aAAa,CAC9BC,qCAAAA,EACA,CAACC,SAAkC;wBACjCC,QAAAA,EAAU;4BAAEC,IAAAA,EAAM;AAAY,yBAAA;wBAC9BC,OAAAA,EAAS;4BAAEC,MAAAA,EAAQ,KAAA;AAAOC,4BAAAA,OAAAA,EAASL,OAAOK,OAAAA,IAAW;AAAK;qBAC5D,CAAA,CAAA;gBAGFC,+BAAAA,CAAyBV,kBAAAA,CAAAA;gBACzBW,uCAAAA,CAA6BX,kBAAAA,CAAAA;gBAC7BY,mCAAAA,CAA2BZ,kBAAAA,CAAAA;AAE3B,gBAAA,MAAMA,mBAAmBpB,QAAQ,EAAA;AACnC,YAAA;AACF,QAAA,CAAA;AACA,QAAA,MAAME,OAAAA,CAAAA,CAAQ,EAAEQ,MAAAA,EAAAA,OAAM,EAA2B,EAAA;AAC/C,YAAA,IAAID,kBAAAA,EAAoB;gBACtBC,OAAAA,CAAOE,GAAG,CAAC,sBAAA,CAAA,CAAwBV,OAAO,EAAA;AAC5C,YAAA;AACA,YAAA,MAAMH,QAAQG,OAAO,EAAA;AACvB,QAAA;AACF,KAAA;AACF;;;;"}
@@ -12,6 +12,8 @@ import { createAuditLogsLifecycleService } from './audit-logs/services/lifecycle
12
12
  import { auditLog } from './audit-logs/content-types/audit-log.mjs';
13
13
  import { AUDIT_LOG_EXPORT_EVENT } from '../../../shared/utils/audit-log-export.mjs';
14
14
  import { registerTokenAuditEvents } from '../../../server/src/audit-logs/tokens.mjs';
15
+ import { registerAdminUserAuditEvents } from '../../../server/src/audit-logs/admin-users.mjs';
16
+ import { registerWebhookAuditEvents } from '../../../server/src/audit-logs/webhooks.mjs';
15
17
 
16
18
  const getAdminEE = ()=>{
17
19
  const eeAdmin = {
@@ -63,6 +65,8 @@ const getAdminEE = ()=>{
63
65
  }
64
66
  }));
65
67
  registerTokenAuditEvents(auditLogsLifecycle);
68
+ registerAdminUserAuditEvents(auditLogsLifecycle);
69
+ registerWebhookAuditEvents(auditLogsLifecycle);
66
70
  await auditLogsLifecycle.register();
67
71
  }
68
72
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../../ee/server/src/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport register from './register';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport adminContentTypes from './content-types';\nimport services from './services';\nimport controllers from './controllers';\nimport routes from './routes';\nimport auditLogsRoutes from './audit-logs/routes/audit-logs';\nimport auditLogsController from './audit-logs/controllers/audit-logs';\nimport { createAuditLogsService } from './audit-logs/services/audit-logs';\nimport { createAuditLogsLifecycleService } from './audit-logs/services/lifecycles';\nimport { auditLog } from './audit-logs/content-types/audit-log';\nimport { AUDIT_LOG_EXPORT_EVENT } from '../../../shared/utils/audit-log-export';\nimport { registerTokenAuditEvents } from '../../../server/src/audit-logs/tokens';\n\nconst getAdminEE = () => {\n const eeAdmin = {\n register,\n bootstrap,\n destroy,\n contentTypes: {\n // Always register the audit-log content type to prevent data loss\n 'audit-log': auditLog,\n ...adminContentTypes,\n },\n services,\n controllers,\n routes,\n };\n\n const isAuditLogsEnabled =\n strapi.config.get('admin.auditLogs.enabled', true) &&\n strapi.ee.features.isEnabled('audit-logs');\n return {\n ...eeAdmin,\n controllers: {\n ...eeAdmin.controllers,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsController } : {}),\n },\n routes: {\n ...eeAdmin.routes,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsRoutes } : {}),\n },\n async register({ strapi }: { strapi: Core.Strapi }) {\n // Run the default registration\n await eeAdmin.register({ strapi });\n\n if (isAuditLogsEnabled) {\n // Register an internal audit logs service\n strapi.add('audit-logs', createAuditLogsService(strapi));\n // Register an internal audit logs lifecycle service\n const auditLogsLifecycle = createAuditLogsLifecycleService(strapi);\n strapi.add('audit-logs-lifecycle', auditLogsLifecycle);\n\n auditLogsLifecycle.registerEvent(\n AUDIT_LOG_EXPORT_EVENT,\n (event: { filters?: unknown }) => ({\n resource: { type: 'audit-log' },\n details: { format: 'csv', filters: event?.filters ?? null },\n })\n );\n\n registerTokenAuditEvents(auditLogsLifecycle);\n\n await auditLogsLifecycle.register();\n }\n },\n async destroy({ strapi }: { strapi: Core.Strapi }) {\n if (isAuditLogsEnabled) {\n strapi.get('audit-logs-lifecycle').destroy();\n }\n await eeAdmin.destroy();\n },\n };\n};\n\nexport default getAdminEE;\n"],"names":["getAdminEE","eeAdmin","register","bootstrap","destroy","contentTypes","auditLog","adminContentTypes","services","controllers","routes","isAuditLogsEnabled","strapi","config","get","ee","features","isEnabled","auditLogsController","auditLogsRoutes","add","createAuditLogsService","auditLogsLifecycle","createAuditLogsLifecycleService","registerEvent","AUDIT_LOG_EXPORT_EVENT","event","resource","type","details","format","filters","registerTokenAuditEvents"],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAMA,UAAAA,GAAa,IAAA;AACjB,IAAA,MAAMC,OAAAA,GAAU;AACdC,QAAAA,QAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA,OAAAA;QACAC,YAAAA,EAAc;;YAEZ,WAAA,EAAaC,QAAAA;AACb,YAAA,GAAGC;AACL,SAAA;AACAC,QAAAA,QAAAA;AACAC,QAAAA,WAAAA;AACAC,QAAAA;AACF,KAAA;AAEA,IAAA,MAAMC,kBAAAA,GACJC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,yBAAA,EAA2B,IAAA,CAAA,IAC7CF,MAAAA,CAAOG,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,YAAA,CAAA;IAC/B,OAAO;AACL,QAAA,GAAGhB,OAAO;QACVQ,WAAAA,EAAa;AACX,YAAA,GAAGR,QAAQQ,WAAW;AACtB,YAAA,GAAIE,kBAAAA,GAAqB;gBAAE,YAAA,EAAcO;AAAoB,aAAA,GAAI;AACnE,SAAA;QACAR,MAAAA,EAAQ;AACN,YAAA,GAAGT,QAAQS,MAAM;AACjB,YAAA,GAAIC,kBAAAA,GAAqB;gBAAE,YAAA,EAAcQ;AAAgB,aAAA,GAAI;AAC/D,SAAA;AACA,QAAA,MAAMjB,QAAAA,CAAAA,CAAS,EAAEU,MAAAA,EAAAA,OAAM,EAA2B,EAAA;;YAEhD,MAAMX,OAAAA,CAAQC,QAAQ,CAAC;gBAAEU,MAAAA,EAAAA;AAAO,aAAA,CAAA;AAEhC,YAAA,IAAID,kBAAAA,EAAoB;;gBAEtBC,OAAAA,CAAOQ,GAAG,CAAC,YAAA,EAAcC,sBAAAA,CAAuBT,OAAAA,CAAAA,CAAAA;;AAEhD,gBAAA,MAAMU,qBAAqBC,+BAAAA,CAAgCX,OAAAA,CAAAA;gBAC3DA,OAAAA,CAAOQ,GAAG,CAAC,sBAAA,EAAwBE,kBAAAA,CAAAA;AAEnCA,gBAAAA,kBAAAA,CAAmBE,aAAa,CAC9BC,sBAAAA,EACA,CAACC,SAAkC;wBACjCC,QAAAA,EAAU;4BAAEC,IAAAA,EAAM;AAAY,yBAAA;wBAC9BC,OAAAA,EAAS;4BAAEC,MAAAA,EAAQ,KAAA;AAAOC,4BAAAA,OAAAA,EAASL,OAAOK,OAAAA,IAAW;AAAK;qBAC5D,CAAA,CAAA;gBAGFC,wBAAAA,CAAyBV,kBAAAA,CAAAA;AAEzB,gBAAA,MAAMA,mBAAmBpB,QAAQ,EAAA;AACnC,YAAA;AACF,QAAA,CAAA;AACA,QAAA,MAAME,OAAAA,CAAAA,CAAQ,EAAEQ,MAAAA,EAAAA,OAAM,EAA2B,EAAA;AAC/C,YAAA,IAAID,kBAAAA,EAAoB;gBACtBC,OAAAA,CAAOE,GAAG,CAAC,sBAAA,CAAA,CAAwBV,OAAO,EAAA;AAC5C,YAAA;AACA,YAAA,MAAMH,QAAQG,OAAO,EAAA;AACvB,QAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../../ee/server/src/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport register from './register';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport adminContentTypes from './content-types';\nimport services from './services';\nimport controllers from './controllers';\nimport routes from './routes';\nimport auditLogsRoutes from './audit-logs/routes/audit-logs';\nimport auditLogsController from './audit-logs/controllers/audit-logs';\nimport { createAuditLogsService } from './audit-logs/services/audit-logs';\nimport { createAuditLogsLifecycleService } from './audit-logs/services/lifecycles';\nimport { auditLog } from './audit-logs/content-types/audit-log';\nimport { AUDIT_LOG_EXPORT_EVENT } from '../../../shared/utils/audit-log-export';\nimport { registerTokenAuditEvents } from '../../../server/src/audit-logs/tokens';\nimport { registerAdminUserAuditEvents } from '../../../server/src/audit-logs/admin-users';\nimport { registerWebhookAuditEvents } from '../../../server/src/audit-logs/webhooks';\n\nconst getAdminEE = () => {\n const eeAdmin = {\n register,\n bootstrap,\n destroy,\n contentTypes: {\n // Always register the audit-log content type to prevent data loss\n 'audit-log': auditLog,\n ...adminContentTypes,\n },\n services,\n controllers,\n routes,\n };\n\n const isAuditLogsEnabled =\n strapi.config.get('admin.auditLogs.enabled', true) &&\n strapi.ee.features.isEnabled('audit-logs');\n return {\n ...eeAdmin,\n controllers: {\n ...eeAdmin.controllers,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsController } : {}),\n },\n routes: {\n ...eeAdmin.routes,\n ...(isAuditLogsEnabled ? { 'audit-logs': auditLogsRoutes } : {}),\n },\n async register({ strapi }: { strapi: Core.Strapi }) {\n // Run the default registration\n await eeAdmin.register({ strapi });\n\n if (isAuditLogsEnabled) {\n // Register an internal audit logs service\n strapi.add('audit-logs', createAuditLogsService(strapi));\n // Register an internal audit logs lifecycle service\n const auditLogsLifecycle = createAuditLogsLifecycleService(strapi);\n strapi.add('audit-logs-lifecycle', auditLogsLifecycle);\n\n auditLogsLifecycle.registerEvent(\n AUDIT_LOG_EXPORT_EVENT,\n (event: { filters?: unknown }) => ({\n resource: { type: 'audit-log' },\n details: { format: 'csv', filters: event?.filters ?? null },\n })\n );\n\n registerTokenAuditEvents(auditLogsLifecycle);\n registerAdminUserAuditEvents(auditLogsLifecycle);\n registerWebhookAuditEvents(auditLogsLifecycle);\n\n await auditLogsLifecycle.register();\n }\n },\n async destroy({ strapi }: { strapi: Core.Strapi }) {\n if (isAuditLogsEnabled) {\n strapi.get('audit-logs-lifecycle').destroy();\n }\n await eeAdmin.destroy();\n },\n };\n};\n\nexport default getAdminEE;\n"],"names":["getAdminEE","eeAdmin","register","bootstrap","destroy","contentTypes","auditLog","adminContentTypes","services","controllers","routes","isAuditLogsEnabled","strapi","config","get","ee","features","isEnabled","auditLogsController","auditLogsRoutes","add","createAuditLogsService","auditLogsLifecycle","createAuditLogsLifecycleService","registerEvent","AUDIT_LOG_EXPORT_EVENT","event","resource","type","details","format","filters","registerTokenAuditEvents","registerAdminUserAuditEvents","registerWebhookAuditEvents"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,MAAMA,UAAAA,GAAa,IAAA;AACjB,IAAA,MAAMC,OAAAA,GAAU;AACdC,QAAAA,QAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA,OAAAA;QACAC,YAAAA,EAAc;;YAEZ,WAAA,EAAaC,QAAAA;AACb,YAAA,GAAGC;AACL,SAAA;AACAC,QAAAA,QAAAA;AACAC,QAAAA,WAAAA;AACAC,QAAAA;AACF,KAAA;AAEA,IAAA,MAAMC,kBAAAA,GACJC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,yBAAA,EAA2B,IAAA,CAAA,IAC7CF,MAAAA,CAAOG,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,YAAA,CAAA;IAC/B,OAAO;AACL,QAAA,GAAGhB,OAAO;QACVQ,WAAAA,EAAa;AACX,YAAA,GAAGR,QAAQQ,WAAW;AACtB,YAAA,GAAIE,kBAAAA,GAAqB;gBAAE,YAAA,EAAcO;AAAoB,aAAA,GAAI;AACnE,SAAA;QACAR,MAAAA,EAAQ;AACN,YAAA,GAAGT,QAAQS,MAAM;AACjB,YAAA,GAAIC,kBAAAA,GAAqB;gBAAE,YAAA,EAAcQ;AAAgB,aAAA,GAAI;AAC/D,SAAA;AACA,QAAA,MAAMjB,QAAAA,CAAAA,CAAS,EAAEU,MAAAA,EAAAA,OAAM,EAA2B,EAAA;;YAEhD,MAAMX,OAAAA,CAAQC,QAAQ,CAAC;gBAAEU,MAAAA,EAAAA;AAAO,aAAA,CAAA;AAEhC,YAAA,IAAID,kBAAAA,EAAoB;;gBAEtBC,OAAAA,CAAOQ,GAAG,CAAC,YAAA,EAAcC,sBAAAA,CAAuBT,OAAAA,CAAAA,CAAAA;;AAEhD,gBAAA,MAAMU,qBAAqBC,+BAAAA,CAAgCX,OAAAA,CAAAA;gBAC3DA,OAAAA,CAAOQ,GAAG,CAAC,sBAAA,EAAwBE,kBAAAA,CAAAA;AAEnCA,gBAAAA,kBAAAA,CAAmBE,aAAa,CAC9BC,sBAAAA,EACA,CAACC,SAAkC;wBACjCC,QAAAA,EAAU;4BAAEC,IAAAA,EAAM;AAAY,yBAAA;wBAC9BC,OAAAA,EAAS;4BAAEC,MAAAA,EAAQ,KAAA;AAAOC,4BAAAA,OAAAA,EAASL,OAAOK,OAAAA,IAAW;AAAK;qBAC5D,CAAA,CAAA;gBAGFC,wBAAAA,CAAyBV,kBAAAA,CAAAA;gBACzBW,4BAAAA,CAA6BX,kBAAAA,CAAAA;gBAC7BY,0BAAAA,CAA2BZ,kBAAAA,CAAAA;AAE3B,gBAAA,MAAMA,mBAAmBpB,QAAQ,EAAA;AACnC,YAAA;AACF,QAAA,CAAA;AACA,QAAA,MAAME,OAAAA,CAAAA,CAAQ,EAAEQ,MAAAA,EAAAA,OAAM,EAA2B,EAAA;AAC/C,YAAA,IAAID,kBAAAA,EAAoB;gBACtBC,OAAAA,CAAOE,GAAG,CAAC,sBAAA,CAAA,CAAwBV,OAAO,EAAA;AAC5C,YAAA;AACA,YAAA,MAAMH,QAAQG,OAAO,EAAA;AACvB,QAAA;AACF,KAAA;AACF;;;;"}
@@ -2,7 +2,6 @@
2
2
 
3
3
  var _ = require('lodash');
4
4
  var utils = require('@strapi/utils');
5
- var index = require('../utils/index.js');
6
5
  var ssoLock = require('../utils/sso-lock.js');
7
6
  var auth$1 = require('../../../../server/src/services/auth.js');
8
7
 
@@ -63,11 +62,7 @@ const { ApplicationError } = utils.errors;
63
62
  throw new ApplicationError();
64
63
  }
65
64
  await auth$1.assertResetPasswordTokenIsValid(matchingUser);
66
- return index.getService('user').updateById(matchingUser.id, {
67
- password,
68
- resetPasswordToken: null,
69
- resetPasswordTokenExpiresAt: null
70
- });
65
+ return auth$1.completePasswordReset(matchingUser, password);
71
66
  };
72
67
  var auth = {
73
68
  forgotPassword,
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sources":["../../../../../../ee/server/src/services/auth.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from '@strapi/utils';\nimport { getService } from '../utils';\nimport { isSsoLocked } from '../utils/sso-lock';\nimport {\n assignResetPasswordToken,\n assertResetPasswordTokenIsValid,\n} from '../../../../server/src/services/auth';\n\nconst { ApplicationError } = errors;\n/**\n * Send an email to the user if it exists and is not locked to SSO\n * If those conditions are not met, nothing happens\n *\n * @param {Object} param params\n * @param {string} param.email user email for which to reset the password\n */\nconst forgotPassword = async ({ email }: any = {}) => {\n const user = await strapi.db.query('admin::user').findOne({ where: { email, isActive: true } });\n\n if (!user || (await isSsoLocked(user))) {\n return;\n }\n\n const resetPasswordToken = await assignResetPasswordToken(user.id);\n\n // Send an email to the admin.\n const url = `${strapi.config.get(\n 'admin.absoluteUrl'\n )}/auth/reset-password?code=${resetPasswordToken}`;\n return strapi\n .plugin('email')\n .service('email')\n .sendTemplatedEmail(\n {\n to: user.email,\n from: strapi.config.get('admin.forgotPassword.from'),\n replyTo: strapi.config.get('admin.forgotPassword.replyTo'),\n },\n strapi.config.get('admin.forgotPassword.emailTemplate'),\n {\n url,\n user: _.pick(user, ['email', 'firstname', 'lastname', 'username']),\n }\n )\n .catch((err: unknown) => {\n // log error server side but do not disclose it to the user to avoid leaking informations\n strapi.log.error(err);\n });\n};\n\n/**\n * Reset a user password\n * @param {Object} param params\n * @param {string} param.resetPasswordToken token generated to request a password reset\n * @param {string} param.password new user password\n */\nconst resetPassword = async ({ resetPasswordToken, password }: any = {}) => {\n const matchingUser = await strapi.db\n .query('admin::user')\n .findOne({ where: { resetPasswordToken, isActive: true } });\n\n if (!matchingUser || (await isSsoLocked(matchingUser))) {\n throw new ApplicationError();\n }\n\n await assertResetPasswordTokenIsValid(matchingUser);\n\n return getService('user').updateById(matchingUser.id, {\n password,\n resetPasswordToken: null,\n resetPasswordTokenExpiresAt: null,\n });\n};\n\nexport default {\n forgotPassword,\n resetPassword,\n};\n"],"names":["ApplicationError","errors","forgotPassword","email","user","strapi","db","query","findOne","where","isActive","isSsoLocked","resetPasswordToken","assignResetPasswordToken","id","url","config","get","plugin","service","sendTemplatedEmail","to","from","replyTo","_","pick","catch","err","log","error","resetPassword","password","matchingUser","assertResetPasswordTokenIsValid","getService","updateById","resetPasswordTokenExpiresAt"],"mappings":";;;;;;;;;;;;AASA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,YAAAA;AAC7B;;;;;;IAOA,MAAMC,iBAAiB,OAAO,EAAEC,KAAK,EAAO,GAAG,EAAE,GAAA;IAC/C,MAAMC,IAAAA,GAAO,MAAMC,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAAC,aAAA,CAAA,CAAeC,OAAO,CAAC;QAAEC,KAAAA,EAAO;AAAEN,YAAAA,KAAAA;YAAOO,QAAAA,EAAU;AAAK;AAAE,KAAA,CAAA;AAE7F,IAAA,IAAI,CAACN,IAAAA,IAAS,MAAMO,mBAAAA,CAAYP,IAAAA,CAAAA,EAAQ;AACtC,QAAA;AACF,IAAA;AAEA,IAAA,MAAMQ,kBAAAA,GAAqB,MAAMC,+BAAAA,CAAyBT,IAAAA,CAAKU,EAAE,CAAA;;IAGjE,MAAMC,GAAAA,GAAM,CAAA,EAAGV,MAAAA,CAAOW,MAAM,CAACC,GAAG,CAC9B,mBAAA,CAAA,CACA,0BAA0B,EAAEL,kBAAAA,CAAAA,CAAoB;IAClD,OAAOP,MAAAA,CACJa,MAAM,CAAC,OAAA,CAAA,CACPC,OAAO,CAAC,OAAA,CAAA,CACRC,kBAAkB,CACjB;AACEC,QAAAA,EAAAA,EAAIjB,KAAKD,KAAK;AACdmB,QAAAA,IAAAA,EAAMjB,MAAAA,CAAOW,MAAM,CAACC,GAAG,CAAC,2BAAA,CAAA;AACxBM,QAAAA,OAAAA,EAASlB,MAAAA,CAAOW,MAAM,CAACC,GAAG,CAAC,8BAAA;AAC7B,KAAA,EACAZ,MAAAA,CAAOW,MAAM,CAACC,GAAG,CAAC,oCAAA,CAAA,EAClB;AACEF,QAAAA,GAAAA;QACAX,IAAAA,EAAMoB,kBAAAA,CAAEC,IAAI,CAACrB,IAAAA,EAAM;AAAC,YAAA,OAAA;AAAS,YAAA,WAAA;AAAa,YAAA,UAAA;AAAY,YAAA;AAAW,SAAA;KACnE,CAAA,CAEDsB,KAAK,CAAC,CAACC,GAAAA,GAAAA;;QAENtB,MAAAA,CAAOuB,GAAG,CAACC,KAAK,CAACF,GAAAA,CAAAA;AACnB,IAAA,CAAA,CAAA;AACJ,CAAA;AAEA;;;;;IAMA,MAAMG,aAAAA,GAAgB,OAAO,EAAElB,kBAAkB,EAAEmB,QAAQ,EAAO,GAAG,EAAE,GAAA;IACrE,MAAMC,YAAAA,GAAe,MAAM3B,MAAAA,CAAOC,EAAE,CACjCC,KAAK,CAAC,aAAA,CAAA,CACNC,OAAO,CAAC;QAAEC,KAAAA,EAAO;AAAEG,YAAAA,kBAAAA;YAAoBF,QAAAA,EAAU;AAAK;AAAE,KAAA,CAAA;AAE3D,IAAA,IAAI,CAACsB,YAAAA,IAAiB,MAAMrB,mBAAAA,CAAYqB,YAAAA,CAAAA,EAAgB;AACtD,QAAA,MAAM,IAAIhC,gBAAAA,EAAAA;AACZ,IAAA;AAEA,IAAA,MAAMiC,sCAAAA,CAAgCD,YAAAA,CAAAA;AAEtC,IAAA,OAAOE,iBAAW,MAAA,CAAA,CAAQC,UAAU,CAACH,YAAAA,CAAalB,EAAE,EAAE;AACpDiB,QAAAA,QAAAA;QACAnB,kBAAAA,EAAoB,IAAA;QACpBwB,2BAAAA,EAA6B;AAC/B,KAAA,CAAA;AACF,CAAA;AAEA,WAAe;AACblC,IAAAA,cAAAA;AACA4B,IAAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"auth.js","sources":["../../../../../../ee/server/src/services/auth.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from '@strapi/utils';\nimport { isSsoLocked } from '../utils/sso-lock';\nimport {\n assignResetPasswordToken,\n assertResetPasswordTokenIsValid,\n completePasswordReset,\n} from '../../../../server/src/services/auth';\n\nconst { ApplicationError } = errors;\n/**\n * Send an email to the user if it exists and is not locked to SSO\n * If those conditions are not met, nothing happens\n *\n * @param {Object} param params\n * @param {string} param.email user email for which to reset the password\n */\nconst forgotPassword = async ({ email }: any = {}) => {\n const user = await strapi.db.query('admin::user').findOne({ where: { email, isActive: true } });\n\n if (!user || (await isSsoLocked(user))) {\n return;\n }\n\n const resetPasswordToken = await assignResetPasswordToken(user.id);\n\n // Send an email to the admin.\n const url = `${strapi.config.get(\n 'admin.absoluteUrl'\n )}/auth/reset-password?code=${resetPasswordToken}`;\n return strapi\n .plugin('email')\n .service('email')\n .sendTemplatedEmail(\n {\n to: user.email,\n from: strapi.config.get('admin.forgotPassword.from'),\n replyTo: strapi.config.get('admin.forgotPassword.replyTo'),\n },\n strapi.config.get('admin.forgotPassword.emailTemplate'),\n {\n url,\n user: _.pick(user, ['email', 'firstname', 'lastname', 'username']),\n }\n )\n .catch((err: unknown) => {\n // log error server side but do not disclose it to the user to avoid leaking informations\n strapi.log.error(err);\n });\n};\n\n/**\n * Reset a user password\n * @param {Object} param params\n * @param {string} param.resetPasswordToken token generated to request a password reset\n * @param {string} param.password new user password\n */\nconst resetPassword = async ({ resetPasswordToken, password }: any = {}) => {\n const matchingUser = await strapi.db\n .query('admin::user')\n .findOne({ where: { resetPasswordToken, isActive: true } });\n\n if (!matchingUser || (await isSsoLocked(matchingUser))) {\n throw new ApplicationError();\n }\n\n await assertResetPasswordTokenIsValid(matchingUser);\n\n return completePasswordReset(matchingUser, password);\n};\n\nexport default {\n forgotPassword,\n resetPassword,\n};\n"],"names":["ApplicationError","errors","forgotPassword","email","user","strapi","db","query","findOne","where","isActive","isSsoLocked","resetPasswordToken","assignResetPasswordToken","id","url","config","get","plugin","service","sendTemplatedEmail","to","from","replyTo","_","pick","catch","err","log","error","resetPassword","password","matchingUser","assertResetPasswordTokenIsValid","completePasswordReset"],"mappings":";;;;;;;;;;;AASA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,YAAAA;AAC7B;;;;;;IAOA,MAAMC,iBAAiB,OAAO,EAAEC,KAAK,EAAO,GAAG,EAAE,GAAA;IAC/C,MAAMC,IAAAA,GAAO,MAAMC,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAAC,aAAA,CAAA,CAAeC,OAAO,CAAC;QAAEC,KAAAA,EAAO;AAAEN,YAAAA,KAAAA;YAAOO,QAAAA,EAAU;AAAK;AAAE,KAAA,CAAA;AAE7F,IAAA,IAAI,CAACN,IAAAA,IAAS,MAAMO,mBAAAA,CAAYP,IAAAA,CAAAA,EAAQ;AACtC,QAAA;AACF,IAAA;AAEA,IAAA,MAAMQ,kBAAAA,GAAqB,MAAMC,+BAAAA,CAAyBT,IAAAA,CAAKU,EAAE,CAAA;;IAGjE,MAAMC,GAAAA,GAAM,CAAA,EAAGV,MAAAA,CAAOW,MAAM,CAACC,GAAG,CAC9B,mBAAA,CAAA,CACA,0BAA0B,EAAEL,kBAAAA,CAAAA,CAAoB;IAClD,OAAOP,MAAAA,CACJa,MAAM,CAAC,OAAA,CAAA,CACPC,OAAO,CAAC,OAAA,CAAA,CACRC,kBAAkB,CACjB;AACEC,QAAAA,EAAAA,EAAIjB,KAAKD,KAAK;AACdmB,QAAAA,IAAAA,EAAMjB,MAAAA,CAAOW,MAAM,CAACC,GAAG,CAAC,2BAAA,CAAA;AACxBM,QAAAA,OAAAA,EAASlB,MAAAA,CAAOW,MAAM,CAACC,GAAG,CAAC,8BAAA;AAC7B,KAAA,EACAZ,MAAAA,CAAOW,MAAM,CAACC,GAAG,CAAC,oCAAA,CAAA,EAClB;AACEF,QAAAA,GAAAA;QACAX,IAAAA,EAAMoB,kBAAAA,CAAEC,IAAI,CAACrB,IAAAA,EAAM;AAAC,YAAA,OAAA;AAAS,YAAA,WAAA;AAAa,YAAA,UAAA;AAAY,YAAA;AAAW,SAAA;KACnE,CAAA,CAEDsB,KAAK,CAAC,CAACC,GAAAA,GAAAA;;QAENtB,MAAAA,CAAOuB,GAAG,CAACC,KAAK,CAACF,GAAAA,CAAAA;AACnB,IAAA,CAAA,CAAA;AACJ,CAAA;AAEA;;;;;IAMA,MAAMG,aAAAA,GAAgB,OAAO,EAAElB,kBAAkB,EAAEmB,QAAQ,EAAO,GAAG,EAAE,GAAA;IACrE,MAAMC,YAAAA,GAAe,MAAM3B,MAAAA,CAAOC,EAAE,CACjCC,KAAK,CAAC,aAAA,CAAA,CACNC,OAAO,CAAC;QAAEC,KAAAA,EAAO;AAAEG,YAAAA,kBAAAA;YAAoBF,QAAAA,EAAU;AAAK;AAAE,KAAA,CAAA;AAE3D,IAAA,IAAI,CAACsB,YAAAA,IAAiB,MAAMrB,mBAAAA,CAAYqB,YAAAA,CAAAA,EAAgB;AACtD,QAAA,MAAM,IAAIhC,gBAAAA,EAAAA;AACZ,IAAA;AAEA,IAAA,MAAMiC,sCAAAA,CAAgCD,YAAAA,CAAAA;AAEtC,IAAA,OAAOE,6BAAsBF,YAAAA,EAAcD,QAAAA,CAAAA;AAC7C,CAAA;AAEA,WAAe;AACb7B,IAAAA,cAAAA;AACA4B,IAAAA;AACF,CAAA;;;;"}
@@ -1,8 +1,7 @@
1
1
  import ___default from 'lodash';
2
2
  import { errors } from '@strapi/utils';
3
- import { getService } from '../utils/index.mjs';
4
3
  import { isSsoLocked } from '../utils/sso-lock.mjs';
5
- import { assertResetPasswordTokenIsValid, assignResetPasswordToken } from '../../../../server/src/services/auth.mjs';
4
+ import { assertResetPasswordTokenIsValid, completePasswordReset, assignResetPasswordToken } from '../../../../server/src/services/auth.mjs';
6
5
 
7
6
  const { ApplicationError } = errors;
8
7
  /**
@@ -57,11 +56,7 @@ const { ApplicationError } = errors;
57
56
  throw new ApplicationError();
58
57
  }
59
58
  await assertResetPasswordTokenIsValid(matchingUser);
60
- return getService('user').updateById(matchingUser.id, {
61
- password,
62
- resetPasswordToken: null,
63
- resetPasswordTokenExpiresAt: null
64
- });
59
+ return completePasswordReset(matchingUser, password);
65
60
  };
66
61
  var auth = {
67
62
  forgotPassword,
@@ -1 +1 @@
1
- {"version":3,"file":"auth.mjs","sources":["../../../../../../ee/server/src/services/auth.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from '@strapi/utils';\nimport { getService } from '../utils';\nimport { isSsoLocked } from '../utils/sso-lock';\nimport {\n assignResetPasswordToken,\n assertResetPasswordTokenIsValid,\n} from '../../../../server/src/services/auth';\n\nconst { ApplicationError } = errors;\n/**\n * Send an email to the user if it exists and is not locked to SSO\n * If those conditions are not met, nothing happens\n *\n * @param {Object} param params\n * @param {string} param.email user email for which to reset the password\n */\nconst forgotPassword = async ({ email }: any = {}) => {\n const user = await strapi.db.query('admin::user').findOne({ where: { email, isActive: true } });\n\n if (!user || (await isSsoLocked(user))) {\n return;\n }\n\n const resetPasswordToken = await assignResetPasswordToken(user.id);\n\n // Send an email to the admin.\n const url = `${strapi.config.get(\n 'admin.absoluteUrl'\n )}/auth/reset-password?code=${resetPasswordToken}`;\n return strapi\n .plugin('email')\n .service('email')\n .sendTemplatedEmail(\n {\n to: user.email,\n from: strapi.config.get('admin.forgotPassword.from'),\n replyTo: strapi.config.get('admin.forgotPassword.replyTo'),\n },\n strapi.config.get('admin.forgotPassword.emailTemplate'),\n {\n url,\n user: _.pick(user, ['email', 'firstname', 'lastname', 'username']),\n }\n )\n .catch((err: unknown) => {\n // log error server side but do not disclose it to the user to avoid leaking informations\n strapi.log.error(err);\n });\n};\n\n/**\n * Reset a user password\n * @param {Object} param params\n * @param {string} param.resetPasswordToken token generated to request a password reset\n * @param {string} param.password new user password\n */\nconst resetPassword = async ({ resetPasswordToken, password }: any = {}) => {\n const matchingUser = await strapi.db\n .query('admin::user')\n .findOne({ where: { resetPasswordToken, isActive: true } });\n\n if (!matchingUser || (await isSsoLocked(matchingUser))) {\n throw new ApplicationError();\n }\n\n await assertResetPasswordTokenIsValid(matchingUser);\n\n return getService('user').updateById(matchingUser.id, {\n password,\n resetPasswordToken: null,\n resetPasswordTokenExpiresAt: null,\n });\n};\n\nexport default {\n forgotPassword,\n resetPassword,\n};\n"],"names":["ApplicationError","errors","forgotPassword","email","user","strapi","db","query","findOne","where","isActive","isSsoLocked","resetPasswordToken","assignResetPasswordToken","id","url","config","get","plugin","service","sendTemplatedEmail","to","from","replyTo","_","pick","catch","err","log","error","resetPassword","password","matchingUser","assertResetPasswordTokenIsValid","getService","updateById","resetPasswordTokenExpiresAt"],"mappings":";;;;;;AASA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,MAAAA;AAC7B;;;;;;IAOA,MAAMC,iBAAiB,OAAO,EAAEC,KAAK,EAAO,GAAG,EAAE,GAAA;IAC/C,MAAMC,IAAAA,GAAO,MAAMC,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAAC,aAAA,CAAA,CAAeC,OAAO,CAAC;QAAEC,KAAAA,EAAO;AAAEN,YAAAA,KAAAA;YAAOO,QAAAA,EAAU;AAAK;AAAE,KAAA,CAAA;AAE7F,IAAA,IAAI,CAACN,IAAAA,IAAS,MAAMO,WAAAA,CAAYP,IAAAA,CAAAA,EAAQ;AACtC,QAAA;AACF,IAAA;AAEA,IAAA,MAAMQ,kBAAAA,GAAqB,MAAMC,wBAAAA,CAAyBT,IAAAA,CAAKU,EAAE,CAAA;;IAGjE,MAAMC,GAAAA,GAAM,CAAA,EAAGV,MAAAA,CAAOW,MAAM,CAACC,GAAG,CAC9B,mBAAA,CAAA,CACA,0BAA0B,EAAEL,kBAAAA,CAAAA,CAAoB;IAClD,OAAOP,MAAAA,CACJa,MAAM,CAAC,OAAA,CAAA,CACPC,OAAO,CAAC,OAAA,CAAA,CACRC,kBAAkB,CACjB;AACEC,QAAAA,EAAAA,EAAIjB,KAAKD,KAAK;AACdmB,QAAAA,IAAAA,EAAMjB,MAAAA,CAAOW,MAAM,CAACC,GAAG,CAAC,2BAAA,CAAA;AACxBM,QAAAA,OAAAA,EAASlB,MAAAA,CAAOW,MAAM,CAACC,GAAG,CAAC,8BAAA;AAC7B,KAAA,EACAZ,MAAAA,CAAOW,MAAM,CAACC,GAAG,CAAC,oCAAA,CAAA,EAClB;AACEF,QAAAA,GAAAA;QACAX,IAAAA,EAAMoB,UAAAA,CAAEC,IAAI,CAACrB,IAAAA,EAAM;AAAC,YAAA,OAAA;AAAS,YAAA,WAAA;AAAa,YAAA,UAAA;AAAY,YAAA;AAAW,SAAA;KACnE,CAAA,CAEDsB,KAAK,CAAC,CAACC,GAAAA,GAAAA;;QAENtB,MAAAA,CAAOuB,GAAG,CAACC,KAAK,CAACF,GAAAA,CAAAA;AACnB,IAAA,CAAA,CAAA;AACJ,CAAA;AAEA;;;;;IAMA,MAAMG,aAAAA,GAAgB,OAAO,EAAElB,kBAAkB,EAAEmB,QAAQ,EAAO,GAAG,EAAE,GAAA;IACrE,MAAMC,YAAAA,GAAe,MAAM3B,MAAAA,CAAOC,EAAE,CACjCC,KAAK,CAAC,aAAA,CAAA,CACNC,OAAO,CAAC;QAAEC,KAAAA,EAAO;AAAEG,YAAAA,kBAAAA;YAAoBF,QAAAA,EAAU;AAAK;AAAE,KAAA,CAAA;AAE3D,IAAA,IAAI,CAACsB,YAAAA,IAAiB,MAAMrB,WAAAA,CAAYqB,YAAAA,CAAAA,EAAgB;AACtD,QAAA,MAAM,IAAIhC,gBAAAA,EAAAA;AACZ,IAAA;AAEA,IAAA,MAAMiC,+BAAAA,CAAgCD,YAAAA,CAAAA;AAEtC,IAAA,OAAOE,WAAW,MAAA,CAAA,CAAQC,UAAU,CAACH,YAAAA,CAAalB,EAAE,EAAE;AACpDiB,QAAAA,QAAAA;QACAnB,kBAAAA,EAAoB,IAAA;QACpBwB,2BAAAA,EAA6B;AAC/B,KAAA,CAAA;AACF,CAAA;AAEA,WAAe;AACblC,IAAAA,cAAAA;AACA4B,IAAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"auth.mjs","sources":["../../../../../../ee/server/src/services/auth.ts"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from '@strapi/utils';\nimport { isSsoLocked } from '../utils/sso-lock';\nimport {\n assignResetPasswordToken,\n assertResetPasswordTokenIsValid,\n completePasswordReset,\n} from '../../../../server/src/services/auth';\n\nconst { ApplicationError } = errors;\n/**\n * Send an email to the user if it exists and is not locked to SSO\n * If those conditions are not met, nothing happens\n *\n * @param {Object} param params\n * @param {string} param.email user email for which to reset the password\n */\nconst forgotPassword = async ({ email }: any = {}) => {\n const user = await strapi.db.query('admin::user').findOne({ where: { email, isActive: true } });\n\n if (!user || (await isSsoLocked(user))) {\n return;\n }\n\n const resetPasswordToken = await assignResetPasswordToken(user.id);\n\n // Send an email to the admin.\n const url = `${strapi.config.get(\n 'admin.absoluteUrl'\n )}/auth/reset-password?code=${resetPasswordToken}`;\n return strapi\n .plugin('email')\n .service('email')\n .sendTemplatedEmail(\n {\n to: user.email,\n from: strapi.config.get('admin.forgotPassword.from'),\n replyTo: strapi.config.get('admin.forgotPassword.replyTo'),\n },\n strapi.config.get('admin.forgotPassword.emailTemplate'),\n {\n url,\n user: _.pick(user, ['email', 'firstname', 'lastname', 'username']),\n }\n )\n .catch((err: unknown) => {\n // log error server side but do not disclose it to the user to avoid leaking informations\n strapi.log.error(err);\n });\n};\n\n/**\n * Reset a user password\n * @param {Object} param params\n * @param {string} param.resetPasswordToken token generated to request a password reset\n * @param {string} param.password new user password\n */\nconst resetPassword = async ({ resetPasswordToken, password }: any = {}) => {\n const matchingUser = await strapi.db\n .query('admin::user')\n .findOne({ where: { resetPasswordToken, isActive: true } });\n\n if (!matchingUser || (await isSsoLocked(matchingUser))) {\n throw new ApplicationError();\n }\n\n await assertResetPasswordTokenIsValid(matchingUser);\n\n return completePasswordReset(matchingUser, password);\n};\n\nexport default {\n forgotPassword,\n resetPassword,\n};\n"],"names":["ApplicationError","errors","forgotPassword","email","user","strapi","db","query","findOne","where","isActive","isSsoLocked","resetPasswordToken","assignResetPasswordToken","id","url","config","get","plugin","service","sendTemplatedEmail","to","from","replyTo","_","pick","catch","err","log","error","resetPassword","password","matchingUser","assertResetPasswordTokenIsValid","completePasswordReset"],"mappings":";;;;;AASA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,MAAAA;AAC7B;;;;;;IAOA,MAAMC,iBAAiB,OAAO,EAAEC,KAAK,EAAO,GAAG,EAAE,GAAA;IAC/C,MAAMC,IAAAA,GAAO,MAAMC,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAAC,aAAA,CAAA,CAAeC,OAAO,CAAC;QAAEC,KAAAA,EAAO;AAAEN,YAAAA,KAAAA;YAAOO,QAAAA,EAAU;AAAK;AAAE,KAAA,CAAA;AAE7F,IAAA,IAAI,CAACN,IAAAA,IAAS,MAAMO,WAAAA,CAAYP,IAAAA,CAAAA,EAAQ;AACtC,QAAA;AACF,IAAA;AAEA,IAAA,MAAMQ,kBAAAA,GAAqB,MAAMC,wBAAAA,CAAyBT,IAAAA,CAAKU,EAAE,CAAA;;IAGjE,MAAMC,GAAAA,GAAM,CAAA,EAAGV,MAAAA,CAAOW,MAAM,CAACC,GAAG,CAC9B,mBAAA,CAAA,CACA,0BAA0B,EAAEL,kBAAAA,CAAAA,CAAoB;IAClD,OAAOP,MAAAA,CACJa,MAAM,CAAC,OAAA,CAAA,CACPC,OAAO,CAAC,OAAA,CAAA,CACRC,kBAAkB,CACjB;AACEC,QAAAA,EAAAA,EAAIjB,KAAKD,KAAK;AACdmB,QAAAA,IAAAA,EAAMjB,MAAAA,CAAOW,MAAM,CAACC,GAAG,CAAC,2BAAA,CAAA;AACxBM,QAAAA,OAAAA,EAASlB,MAAAA,CAAOW,MAAM,CAACC,GAAG,CAAC,8BAAA;AAC7B,KAAA,EACAZ,MAAAA,CAAOW,MAAM,CAACC,GAAG,CAAC,oCAAA,CAAA,EAClB;AACEF,QAAAA,GAAAA;QACAX,IAAAA,EAAMoB,UAAAA,CAAEC,IAAI,CAACrB,IAAAA,EAAM;AAAC,YAAA,OAAA;AAAS,YAAA,WAAA;AAAa,YAAA,UAAA;AAAY,YAAA;AAAW,SAAA;KACnE,CAAA,CAEDsB,KAAK,CAAC,CAACC,GAAAA,GAAAA;;QAENtB,MAAAA,CAAOuB,GAAG,CAACC,KAAK,CAACF,GAAAA,CAAAA;AACnB,IAAA,CAAA,CAAA;AACJ,CAAA;AAEA;;;;;IAMA,MAAMG,aAAAA,GAAgB,OAAO,EAAElB,kBAAkB,EAAEmB,QAAQ,EAAO,GAAG,EAAE,GAAA;IACrE,MAAMC,YAAAA,GAAe,MAAM3B,MAAAA,CAAOC,EAAE,CACjCC,KAAK,CAAC,aAAA,CAAA,CACNC,OAAO,CAAC;QAAEC,KAAAA,EAAO;AAAEG,YAAAA,kBAAAA;YAAoBF,QAAAA,EAAU;AAAK;AAAE,KAAA,CAAA;AAE3D,IAAA,IAAI,CAACsB,YAAAA,IAAiB,MAAMrB,WAAAA,CAAYqB,YAAAA,CAAAA,EAAgB;AACtD,QAAA,MAAM,IAAIhC,gBAAAA,EAAAA;AACZ,IAAA;AAEA,IAAA,MAAMiC,+BAAAA,CAAgCD,YAAAA,CAAAA;AAEtC,IAAA,OAAOE,sBAAsBF,YAAAA,EAAcD,QAAAA,CAAAA;AAC7C,CAAA;AAEA,WAAe;AACb7B,IAAAA,cAAAA;AACA4B,IAAAA;AACF,CAAA;;;;"}
@@ -5,6 +5,7 @@ var fp = require('lodash/fp');
5
5
  var utils = require('@strapi/utils');
6
6
  var user$1 = require('../../../../server/src/domain/user.js');
7
7
  var constants = require('../../../../server/src/services/constants.js');
8
+ var adminUsers = require('../../../../server/src/audit-logs/admin-users.js');
8
9
  var index = require('../utils/index.js');
9
10
 
10
11
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -81,6 +82,15 @@ const removeFromEEDisabledUsersList = async (ids)=>{
81
82
  throw new ValidationError('You must have at least one user with super admin role.');
82
83
  }
83
84
  }
85
+ // The audit log records what changed, so it needs the row before the write
86
+ const previous = adminUsers.touchesTrackedFields(attributes) ? await strapi.db.query('admin::user').findOne({
87
+ where: {
88
+ id
89
+ },
90
+ populate: [
91
+ 'roles'
92
+ ]
93
+ }) : null;
84
94
  // hash password if a new one is sent
85
95
  if (___default.default.has(attributes, 'password')) {
86
96
  const hashedPassword = await index.getService('auth').hashPassword(attributes.password);
@@ -96,9 +106,16 @@ const removeFromEEDisabledUsersList = async (ids)=>{
96
106
  'roles'
97
107
  ]
98
108
  });
99
- strapi.eventHub.emit('user.update', {
109
+ strapi.eventHub.emit(adminUsers.LEGACY_USER_EVENTS.UPDATE, {
100
110
  user: sanitizeUser(updatedUser)
101
111
  });
112
+ await adminUsers.emitAdminUserUpdateAudits({
113
+ strapi
114
+ }, {
115
+ previous,
116
+ updated: updatedUser,
117
+ attributes
118
+ });
102
119
  return updatedUser;
103
120
  }
104
121
  const updatedUser = await strapi.db.query('admin::user').update({
@@ -112,9 +129,16 @@ const removeFromEEDisabledUsersList = async (ids)=>{
112
129
  });
113
130
  await updateEEDisabledUsersList(id, attributes);
114
131
  if (updatedUser) {
115
- strapi.eventHub.emit('user.update', {
132
+ strapi.eventHub.emit(adminUsers.LEGACY_USER_EVENTS.UPDATE, {
116
133
  user: sanitizeUser(updatedUser)
117
134
  });
135
+ await adminUsers.emitAdminUserUpdateAudits({
136
+ strapi
137
+ }, {
138
+ previous,
139
+ updated: updatedUser,
140
+ attributes
141
+ });
118
142
  }
119
143
  return updatedUser;
120
144
  };
@@ -156,9 +180,12 @@ const removeFromEEDisabledUsersList = async (ids)=>{
156
180
  await sessionManager('admin').invalidateRefreshToken(String(id));
157
181
  }
158
182
  await removeFromEEDisabledUsersList(id);
159
- strapi.eventHub.emit('user.delete', {
183
+ strapi.eventHub.emit(adminUsers.LEGACY_USER_EVENTS.DELETE, {
160
184
  user: sanitizeUser(deletedUser)
161
185
  });
186
+ await adminUsers.emitAdminUserDeleted({
187
+ strapi
188
+ }, deletedUser);
162
189
  return deletedUser;
163
190
  };
164
191
  /** Delete a user
@@ -196,9 +223,14 @@ const removeFromEEDisabledUsersList = async (ids)=>{
196
223
  deletedUsers.push(deletedUser);
197
224
  }
198
225
  await removeFromEEDisabledUsersList(ids);
199
- strapi.eventHub.emit('user.delete', {
226
+ strapi.eventHub.emit(adminUsers.LEGACY_USER_EVENTS.DELETE, {
200
227
  users: deletedUsers.map((deletedUser)=>sanitizeUser(deletedUser))
201
228
  });
229
+ for (const deletedUser of deletedUsers){
230
+ await adminUsers.emitAdminUserDeleted({
231
+ strapi
232
+ }, deletedUser);
233
+ }
202
234
  return deletedUsers;
203
235
  };
204
236
  const sanitizeUserRoles = (role)=>___default.default.pick(role, [