@strapi/admin 5.51.2 → 5.52.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.
@@ -283,7 +283,111 @@ var id = {
283
283
  "notification.permission.not-allowed-read": "Anda tidak diizinkan untuk melihat dokumen ini",
284
284
  "notification.success.delete": "Item telah dihapus",
285
285
  "notification.success.saved": "Disimpan",
286
- "request.error.model.unknown": "Model ini tidak ada"
286
+ "request.error.model.unknown": "Model ini tidak ada",
287
+ "HomePage.widget.error": "Tidak dapat memuat konten widget.",
288
+ "Settings.permissions.auditLogs.filters.combobox.aria-label": "Cari dan pilih opsi untuk memfilter",
289
+ "Auth.form.button.password-recovery": "Pemulihan Kata Sandi",
290
+ "Settings.permissions.auditLogs.permission.update": "Perbarui izin",
291
+ "Auth.form.register.subtitle": "Kredensial hanya digunakan untuk mengautentikasi di Strapi. Semua data yang disimpan akan berada di database Anda.",
292
+ "Settings.adminTokens.create": "Buat Token Admin baru",
293
+ "Settings.permissions.auditLogs.content-type.delete": "Hapus tipe konten",
294
+ "Settings.permissions.select-by-permission": "Pilih izin {label}",
295
+ "Auth.components.Oops.title": "Ups...",
296
+ "Settings.permissions.users.listview.header.subtitle": "Semua pengguna yang memiliki akses ke panel admin Strapi",
297
+ "Settings.application.node-version": "Versi node",
298
+ "Settings.application.customization.carousel-hint": "Ubah logo panel admin (Dimensi maks: {dimension}x{dimension}, Ukuran file maks: {size}KB)",
299
+ "HomePage.header.title": "Halo {name}",
300
+ "Settings.apiTokens.createPage.permissions.header.hint": "Pilih aksi aplikasi atau aksi plugin dan klik ikon roda gigi untuk menampilkan rute yang terikat",
301
+ "Settings.apiTokens.addNewToken": "Tambahkan Token API baru",
302
+ "Settings.permissions.select-all-by-permission": "Pilih semua izin {label}",
303
+ "Settings.permissions.auditLogs.user.create": "Buat pengguna",
304
+ "Auth.form.button.login.strapi": "Masuk melalui Strapi",
305
+ "Settings.permissions.users.active": "Aktif",
306
+ "Settings.permissions.auditLogs.entry.unpublish": "Batal terbitkan entri{model, select, undefined {} other { ({model})}}",
307
+ "Settings.application.customization.modal.pending.title": "Logo siap diunggah",
308
+ "HomePage.widget.no-permissions": "Anda tidak memiliki izin untuk melihat widget ini",
309
+ "Settings.permissions.auditLogs.user": "Pengguna",
310
+ "Auth.components.Oops.text.admin": "Jika ini adalah kesalahan, silakan hubungi administrator Anda.",
311
+ "Settings.permissions.auditLogs.user.delete": "Hapus pengguna",
312
+ "Settings.adminTokens.ListView.headers.name": "Nama",
313
+ "Settings.application.customization.carousel-slide.label": "Slide logo",
314
+ "Settings.application.customization.modal.upload.error-network": "Kesalahan jaringan",
315
+ "Settings.application.customization.modal.upload.from-computer": "Dari komputer",
316
+ "Settings.apiTokens.createPage.title": "Buat Token API",
317
+ "Settings.adminTokens.description": "Daftar token yang dibuat untuk mengakses fitur admin secara terprogram",
318
+ "Settings.permissions.users.strapi-editor": "Editor",
319
+ "Settings.adminTokens.ListView.headers.owner": "Pemilik",
320
+ "Settings.adminTokens.title": "Token Admin",
321
+ "Settings.permissions.auditLogs.entry.publish": "Terbitkan entri {model, select, undefined {} other {({model})}}",
322
+ "Settings.permissions.auditLogs.admin.auth.success": "Login Admin",
323
+ "Settings.apiTokens.ListView.headers.type": "Tipe token",
324
+ "Settings.permissions.auditLogs.payload": "Payload",
325
+ "Auth.form.welcome.subtitle": "Masuk ke akun Strapi Anda",
326
+ "Settings.adminTokens.addFirstToken": "Buat Token Admin pertama Anda",
327
+ "Settings.application.customization.modal.upload.cta.browse": "Telusuri file",
328
+ "Settings.apiTokens.createPage.permissions.header.title": "Pengaturan lanjutan",
329
+ "Settings.application.plan-title": "Paket saat ini",
330
+ "Settings.application.ee.admin-seats.add-seats": "Kelola langganan",
331
+ "Settings.permissions.auditLogs.admin.logout": "Logout Admin",
332
+ "Settings.apiTokens.regenerate": "Buat ulang",
333
+ "Auth.form.active.label": "Aktif",
334
+ "Roles.RoleRow.user-count": "{number, plural, =0 {# pengguna} one {# pengguna} other {# pengguna}}",
335
+ "Settings.permissions.auditLogs.role.create": "Buat peran",
336
+ "Settings.permissions.auditLogs.user.fullname": "{firstname} {lastname}",
337
+ "Settings.permissions.auditLogs.permission.create": "Buat izin",
338
+ "Settings.application.strapiVersion": "Versi Strapi",
339
+ "Settings.adminTokens.editPage.title": "Edit Token Admin",
340
+ "Settings.application.customization.modal.upload.error-format": "Format yang diunggah salah (hanya menerima format: jpeg, jpg, png, svg).",
341
+ "Settings.application.ee.admin-seats.count": "<text>{enforcementUserCount}</text>/{permittedSeats}",
342
+ "Settings.application.customization.carousel.auth-logo.title": "Logo Auth",
343
+ "Settings.application.customization.menu-logo.carousel-hint": "Ganti logo di navigasi utama",
344
+ "Auth.form.password.hint": "Harus minimal 8 karakter, 1 huruf besar, 1 huruf kecil & 1 angka",
345
+ "Settings.permissions.auditLogs.component.delete": "Hapus komponen",
346
+ "Auth.login.sso.divider": "Atau masuk dengan",
347
+ "Settings.application.customization.modal.upload": "Unggah logo",
348
+ "Settings.apiTokens.ListView.headers.description": "Deskripsi",
349
+ "Settings.application.customization.modal.pending.upload": "Unggah logo",
350
+ "Settings.permissions.auditLogs.listview.header.subtitle": "Log semua aktivitas yang terjadi di lingkungan Anda",
351
+ "Settings.adminTokens.ListView.headers.lastUsedAt": "Terakhir digunakan",
352
+ "Settings.permissions.auditLogs.content-type.create": "Buat tipe konten",
353
+ "HomePage.widget.loading": "Memuat konten widget",
354
+ "Auth.form.welcome.title": "Selamat datang di Strapi!",
355
+ "HomePage.header.subtitle": "Selamat datang di panel administrasi Anda",
356
+ "Settings.apiTokens.copy.lastWarning": "Salin token Anda",
357
+ "Settings.adminTokens.ListView.headers.createdAt": "Dibuat pada",
358
+ "Settings.apiTokens.ListView.headers.createdAt": "Dibuat pada",
359
+ "Settings.apiTokens.createPage.BoundRoute.title": "Rute terikat ke",
360
+ "Settings.permissions.auditLogs.entry.create": "Buat entri{model, select, undefined {} other { ({model})}}",
361
+ "Settings.apiTokens.addFirstToken": "Tambahkan Token API pertama Anda",
362
+ "Auth.form.password.hide-password": "Sembunyikan kata sandi",
363
+ "Settings.permissions.auditLogs.userId": "ID Pengguna",
364
+ "Auth.login.sso.subtitle": "Masuk ke akun Anda via SSO",
365
+ "HomePage.widget.no-data": "Tidak ada konten yang ditemukan.",
366
+ "Settings.permissions.auditLogs.role.update": "Perbarui peran",
367
+ "Auth.login.sso.loading": "Memuat penyedia...",
368
+ "Settings.application.customization.carousel.title": "Logo",
369
+ "Settings.permissions.auditLogs.user.update": "Perbarui pengguna",
370
+ "Settings.application.link-upgrade": "Tingkatkan panel admin Anda",
371
+ "Auth.reset-password.title": "Setel ulang kata sandi",
372
+ "Auth.form.button.login.providers.error": "Kami tidak dapat menghubungkan Anda melalui penyedia yang dipilih.",
373
+ "Settings.permissions.auditLogs.component.create": "Buat komponen",
374
+ "Settings.apiTokens.emptyStateLayout": "Anda belum memiliki konten apa pun...",
375
+ "Settings.apiTokens.title": "Token API",
376
+ "Settings.permissions.auditLogs.action": "Aksi",
377
+ "Settings.permissions.auditLogs.details": "Detail Log",
378
+ "Settings.permissions.conditions.define-conditions": "Tetapkan kondisi",
379
+ "Settings.application.customization.modal.upload.error-size": "File yang diunggah terlalu besar (dimensi maks: {dimension}x{dimension}, ukuran file maks: {size}KB)",
380
+ "Settings.application.customization.modal.tab.label": "Bagaimana Anda ingin mengunggah aset Anda?",
381
+ "Settings.permissions.users.strapi-author": "Penulis",
382
+ "Settings.permissions.auditLogs.entry.update": "Perbarui entri{model, select, undefined {} other { ({model})}}",
383
+ "Settings.application.customization.modal.upload.from-url": "Dari URL",
384
+ "Settings.application.customization.modal.upload.next": "Berikutnya",
385
+ "Settings.apiTokens.createPage.permissions.title": "Izin",
386
+ "Settings.application.customization.carousel.reset-action": "Setel ulang logo",
387
+ "Settings.application.strapi-version": "Versi Strapi",
388
+ "Settings.application.get-help": "Dapatkan bantuan",
389
+ "Auth.form.currentPassword.label": "Kata Sandi Saat Ini",
390
+ "Settings.permissions.users.roles": "Peran"
287
391
  };
288
392
 
289
393
  export { Analytics, Documentation, Email, Password, Provider, ResetPasswordToken, Role, Username, Users, id as default };
@@ -1 +1 @@
1
- {"version":3,"file":"id.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"id.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -7,13 +7,20 @@ interface FilterFormData {
7
7
  filter: string;
8
8
  value?: string;
9
9
  }
10
+ /**
11
+ * Carries the position in the `$and` array so we replace that exact entry, not every entry
12
+ * sharing the same `(name, operator, value)`.
13
+ */
14
+ interface EditingFilter extends FilterFormData {
15
+ index: number;
16
+ }
10
17
  interface FitlersContextValue {
11
18
  disabled: boolean;
12
19
  onChange: (data: FilterFormData) => void;
13
20
  options: Filters.Filter[];
14
21
  setOpen: (open: boolean) => void;
15
- editingFilter: FilterFormData | null;
16
- setEditingFilter: (filter: FilterFormData | null) => void;
22
+ editingFilter: EditingFilter | null;
23
+ setEditingFilter: (filter: EditingFilter | null) => void;
17
24
  }
18
25
  interface RootProps extends Partial<Pick<FitlersContextValue, 'disabled' | 'onChange' | 'options'>>, Popover.Props {
19
26
  children: React.ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycles.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/audit-logs/services/lifecycles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAiE1C;;;GAGG;AACH,QAAA,MAAM,+BAA+B,GAAI,QAAQ,IAAI,CAAC,MAAM;;;;CAwH3D,CAAC;AAEF,OAAO,EAAE,+BAA+B,EAAE,CAAC"}
1
+ {"version":3,"file":"lifecycles.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/audit-logs/services/lifecycles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAW,MAAM,eAAe,CAAC;AAiEnD;;;GAGG;AACH,QAAA,MAAM,+BAA+B,GAAI,QAAQ,IAAI,CAAC,MAAM;;;;CA4H3D,CAAC;AAEF,OAAO,EAAE,+BAA+B,EAAE,CAAC"}
@@ -65,12 +65,15 @@ const getRetentionDays = (strapi)=>{
65
65
  const eventMap = getEventMap(defaultEvents);
66
66
  const processEvent = (name, ...args)=>{
67
67
  const requestState = strapi.requestContext.get()?.state;
68
- // Ignore events with auth strategies different from admin
68
+ // Only audit admin-authenticated actions, plus MCP actions flagged via auditSource.
69
69
  const isUsingAdminAuth = requestState?.route.info.type === 'admin';
70
+ const auditSource = requestState?.auditSource;
71
+ const isMcpAdminAction = auditSource === 'mcp';
70
72
  const user = requestState?.user;
71
- if (!isUsingAdminAuth || !user) {
73
+ if (!isUsingAdminAuth && !isMcpAdminAction || !user) {
72
74
  return null;
73
75
  }
76
+ const origin = auditSource ?? 'admin';
74
77
  const getPayload = eventMap[name];
75
78
  // Ignore the event if it's not in the map
76
79
  if (!getPayload) {
@@ -88,7 +91,10 @@ const getRetentionDays = (strapi)=>{
88
91
  return {
89
92
  action: name,
90
93
  date: new Date().toISOString(),
91
- payload: getPayload(...args) || {},
94
+ payload: {
95
+ ...getPayload(...args) || {},
96
+ origin
97
+ },
92
98
  userId: user.id
93
99
  };
94
100
  };
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycles.js","sources":["../../../../../../../ee/server/src/audit-logs/services/lifecycles.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nconst DEFAULT_RETENTION_DAYS = 90;\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\nconst getEventMap = (defaultEvents: any) => {\n const getDefaultPayload = (...args: any) => args[0];\n\n // Use the default payload for all default events\n return defaultEvents.reduce((acc: any, event: any) => {\n acc[event] = getDefaultPayload;\n return acc;\n }, {} as any);\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-lifecycles')\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 // NOTE: providers should be able to replace getEventMap to add or remove events\n const eventMap = getEventMap(defaultEvents);\n\n const processEvent = (name: string, ...args: any) => {\n const requestState = strapi.requestContext.get()?.state;\n\n // Ignore events with auth strategies different from admin\n const isUsingAdminAuth = requestState?.route.info.type === 'admin';\n const user = requestState?.user;\n if (!isUsingAdminAuth || !user) {\n return null;\n }\n\n const getPayload = eventMap[name];\n\n // Ignore the event if it's not in the map\n if (!getPayload) {\n return null;\n }\n\n // Ignore some events based on payload\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(args[0]?.uid)) {\n return null;\n }\n\n return {\n action: name,\n date: new Date().toISOString(),\n payload: getPayload(...args) || {},\n userId: user.id,\n };\n };\n\n const handleEvent = async (name: string, ...args: any) => {\n const processedEvent = processEvent(name, ...args);\n\n if (processedEvent) {\n await auditLogsService.saveEvent(processedEvent);\n }\n };\n\n return {\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","getDefaultPayload","args","reduce","acc","event","getRetentionDays","strapi","featureConfig","ee","features","get","licenseRetentionDays","options","retentionDays","userRetentionDays","config","createAuditLogsLifecycleService","state","auditLogsService","eventMap","processEvent","name","requestState","requestContext","isUsingAdminAuth","route","info","type","user","getPayload","ignoredUids","includes","uid","action","date","Date","toISOString","payload","userId","id","handleEvent","processedEvent","saveEvent","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.js","sources":["../../../../../../../ee/server/src/audit-logs/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules } from '@strapi/types';\n\nconst DEFAULT_RETENTION_DAYS = 90;\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\nconst getEventMap = (defaultEvents: any) => {\n const getDefaultPayload = (...args: any) => args[0];\n\n // Use the default payload for all default events\n return defaultEvents.reduce((acc: any, event: any) => {\n acc[event] = getDefaultPayload;\n return acc;\n }, {} as any);\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-lifecycles')\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 // NOTE: providers should be able to replace getEventMap to add or remove events\n const eventMap = getEventMap(defaultEvents);\n\n const processEvent = (name: string, ...args: any) => {\n const requestState = strapi.requestContext.get()?.state;\n\n // Only audit admin-authenticated actions, plus MCP actions flagged via auditSource.\n const isUsingAdminAuth = requestState?.route.info.type === 'admin';\n const auditSource = requestState?.auditSource;\n const isMcpAdminAction = auditSource === 'mcp';\n const user = requestState?.user;\n if ((!isUsingAdminAuth && !isMcpAdminAction) || !user) {\n return null;\n }\n\n const origin: Modules.AuditLogs.AuditSource = auditSource ?? 'admin';\n\n const getPayload = eventMap[name];\n\n // Ignore the event if it's not in the map\n if (!getPayload) {\n return null;\n }\n\n // Ignore some events based on payload\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(args[0]?.uid)) {\n return null;\n }\n\n return {\n action: name,\n date: new Date().toISOString(),\n payload: { ...(getPayload(...args) || {}), origin },\n userId: user.id,\n };\n };\n\n const handleEvent = async (name: string, ...args: any) => {\n const processedEvent = processEvent(name, ...args);\n\n if (processedEvent) {\n await auditLogsService.saveEvent(processedEvent);\n }\n };\n\n return {\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","getDefaultPayload","args","reduce","acc","event","getRetentionDays","strapi","featureConfig","ee","features","get","licenseRetentionDays","options","retentionDays","userRetentionDays","config","createAuditLogsLifecycleService","state","auditLogsService","eventMap","processEvent","name","requestState","requestContext","isUsingAdminAuth","route","info","type","auditSource","isMcpAdminAction","user","origin","getPayload","ignoredUids","includes","uid","action","date","Date","toISOString","payload","userId","id","handleEvent","processedEvent","saveEvent","register","eeEnableUnsubscribe","eventHub","on","destroy","eeUpdateUnsubscribe","eeDisableUnsubscribe","isEnabled","eventHubUnsubscribe","subscribe","cron","add","deleteExpiredAuditLogs","task","expirationDate","now","deleteExpiredEvents","unsubscribe","remove"],"mappings":"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"}
@@ -63,12 +63,15 @@ const getRetentionDays = (strapi)=>{
63
63
  const eventMap = getEventMap(defaultEvents);
64
64
  const processEvent = (name, ...args)=>{
65
65
  const requestState = strapi.requestContext.get()?.state;
66
- // Ignore events with auth strategies different from admin
66
+ // Only audit admin-authenticated actions, plus MCP actions flagged via auditSource.
67
67
  const isUsingAdminAuth = requestState?.route.info.type === 'admin';
68
+ const auditSource = requestState?.auditSource;
69
+ const isMcpAdminAction = auditSource === 'mcp';
68
70
  const user = requestState?.user;
69
- if (!isUsingAdminAuth || !user) {
71
+ if (!isUsingAdminAuth && !isMcpAdminAction || !user) {
70
72
  return null;
71
73
  }
74
+ const origin = auditSource ?? 'admin';
72
75
  const getPayload = eventMap[name];
73
76
  // Ignore the event if it's not in the map
74
77
  if (!getPayload) {
@@ -86,7 +89,10 @@ const getRetentionDays = (strapi)=>{
86
89
  return {
87
90
  action: name,
88
91
  date: new Date().toISOString(),
89
- payload: getPayload(...args) || {},
92
+ payload: {
93
+ ...getPayload(...args) || {},
94
+ origin
95
+ },
90
96
  userId: user.id
91
97
  };
92
98
  };
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycles.mjs","sources":["../../../../../../../ee/server/src/audit-logs/services/lifecycles.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nconst DEFAULT_RETENTION_DAYS = 90;\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\nconst getEventMap = (defaultEvents: any) => {\n const getDefaultPayload = (...args: any) => args[0];\n\n // Use the default payload for all default events\n return defaultEvents.reduce((acc: any, event: any) => {\n acc[event] = getDefaultPayload;\n return acc;\n }, {} as any);\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-lifecycles')\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 // NOTE: providers should be able to replace getEventMap to add or remove events\n const eventMap = getEventMap(defaultEvents);\n\n const processEvent = (name: string, ...args: any) => {\n const requestState = strapi.requestContext.get()?.state;\n\n // Ignore events with auth strategies different from admin\n const isUsingAdminAuth = requestState?.route.info.type === 'admin';\n const user = requestState?.user;\n if (!isUsingAdminAuth || !user) {\n return null;\n }\n\n const getPayload = eventMap[name];\n\n // Ignore the event if it's not in the map\n if (!getPayload) {\n return null;\n }\n\n // Ignore some events based on payload\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(args[0]?.uid)) {\n return null;\n }\n\n return {\n action: name,\n date: new Date().toISOString(),\n payload: getPayload(...args) || {},\n userId: user.id,\n };\n };\n\n const handleEvent = async (name: string, ...args: any) => {\n const processedEvent = processEvent(name, ...args);\n\n if (processedEvent) {\n await auditLogsService.saveEvent(processedEvent);\n }\n };\n\n return {\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","getDefaultPayload","args","reduce","acc","event","getRetentionDays","strapi","featureConfig","ee","features","get","licenseRetentionDays","options","retentionDays","userRetentionDays","config","createAuditLogsLifecycleService","state","auditLogsService","eventMap","processEvent","name","requestState","requestContext","isUsingAdminAuth","route","info","type","user","getPayload","ignoredUids","includes","uid","action","date","Date","toISOString","payload","userId","id","handleEvent","processedEvent","saveEvent","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\nconst DEFAULT_RETENTION_DAYS = 90;\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\nconst getEventMap = (defaultEvents: any) => {\n const getDefaultPayload = (...args: any) => args[0];\n\n // Use the default payload for all default events\n return defaultEvents.reduce((acc: any, event: any) => {\n acc[event] = getDefaultPayload;\n return acc;\n }, {} as any);\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-lifecycles')\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 // NOTE: providers should be able to replace getEventMap to add or remove events\n const eventMap = getEventMap(defaultEvents);\n\n const processEvent = (name: string, ...args: any) => {\n const requestState = strapi.requestContext.get()?.state;\n\n // Only audit admin-authenticated actions, plus MCP actions flagged via auditSource.\n const isUsingAdminAuth = requestState?.route.info.type === 'admin';\n const auditSource = requestState?.auditSource;\n const isMcpAdminAction = auditSource === 'mcp';\n const user = requestState?.user;\n if ((!isUsingAdminAuth && !isMcpAdminAction) || !user) {\n return null;\n }\n\n const origin: Modules.AuditLogs.AuditSource = auditSource ?? 'admin';\n\n const getPayload = eventMap[name];\n\n // Ignore the event if it's not in the map\n if (!getPayload) {\n return null;\n }\n\n // Ignore some events based on payload\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(args[0]?.uid)) {\n return null;\n }\n\n return {\n action: name,\n date: new Date().toISOString(),\n payload: { ...(getPayload(...args) || {}), origin },\n userId: user.id,\n };\n };\n\n const handleEvent = async (name: string, ...args: any) => {\n const processedEvent = processEvent(name, ...args);\n\n if (processedEvent) {\n await auditLogsService.saveEvent(processedEvent);\n }\n };\n\n return {\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","getDefaultPayload","args","reduce","acc","event","getRetentionDays","strapi","featureConfig","ee","features","get","licenseRetentionDays","options","retentionDays","userRetentionDays","config","createAuditLogsLifecycleService","state","auditLogsService","eventMap","processEvent","name","requestState","requestContext","isUsingAdminAuth","route","info","type","auditSource","isMcpAdminAction","user","origin","getPayload","ignoredUids","includes","uid","action","date","Date","toISOString","payload","userId","id","handleEvent","processedEvent","saveEvent","register","eeEnableUnsubscribe","eventHub","on","destroy","eeUpdateUnsubscribe","eeDisableUnsubscribe","isEnabled","eventHubUnsubscribe","subscribe","cron","add","deleteExpiredAuditLogs","task","expirationDate","now","deleteExpiredEvents","unsubscribe","remove"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/admin",
3
- "version": "5.51.2",
3
+ "version": "5.52.0",
4
4
  "description": "Strapi Admin",
5
5
  "homepage": "https://strapi.io",
6
6
  "bugs": {
@@ -89,12 +89,12 @@
89
89
  "@radix-ui/react-context": "1.0.1",
90
90
  "@radix-ui/react-toolbar": "1.1.11",
91
91
  "@reduxjs/toolkit": "1.9.7",
92
- "@strapi/design-system": "2.2.3",
93
- "@strapi/icons": "2.2.3",
94
- "@strapi/permissions": "5.51.2",
95
- "@strapi/types": "5.51.2",
96
- "@strapi/typescript-utils": "5.51.2",
97
- "@strapi/utils": "5.51.2",
92
+ "@strapi/design-system": "2.2.4",
93
+ "@strapi/icons": "2.2.4",
94
+ "@strapi/permissions": "5.52.0",
95
+ "@strapi/types": "5.52.0",
96
+ "@strapi/typescript-utils": "5.52.0",
97
+ "@strapi/utils": "5.52.0",
98
98
  "@testing-library/dom": "10.4.1",
99
99
  "@testing-library/react": "16.3.2",
100
100
  "@testing-library/user-event": "14.6.1",
@@ -148,8 +148,8 @@
148
148
  "zod": "3.25.76"
149
149
  },
150
150
  "devDependencies": {
151
- "@strapi/admin-test-utils": "5.51.2",
152
- "@strapi/data-transfer": "5.51.2",
151
+ "@strapi/admin-test-utils": "5.52.0",
152
+ "@strapi/data-transfer": "5.52.0",
153
153
  "@testing-library/jest-dom": "6.9.1",
154
154
  "@types/codemirror5": "npm:@types/codemirror@^5.60.15",
155
155
  "@types/fs-extra": "11.0.4",