@strapi/admin 5.54.0 → 5.55.1

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 (92) hide show
  1. package/dist/admin/admin/src/components/LanguageProvider.js +35 -1
  2. package/dist/admin/admin/src/components/LanguageProvider.js.map +1 -1
  3. package/dist/admin/admin/src/components/LanguageProvider.mjs +17 -2
  4. package/dist/admin/admin/src/components/LanguageProvider.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/SubNav.js +113 -35
  6. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  7. package/dist/admin/admin/src/components/SubNav.mjs +115 -37
  8. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/SubNavFolder.js +188 -0
  10. package/dist/admin/admin/src/components/SubNavFolder.js.map +1 -0
  11. package/dist/admin/admin/src/components/SubNavFolder.mjs +186 -0
  12. package/dist/admin/admin/src/components/SubNavFolder.mjs.map +1 -0
  13. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  14. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  15. package/dist/admin/admin/src/render.js +1 -1
  16. package/dist/admin/admin/src/render.js.map +1 -1
  17. package/dist/admin/admin/src/render.mjs +1 -1
  18. package/dist/admin/admin/src/render.mjs.map +1 -1
  19. package/dist/admin/admin/src/translations/en.json.js +4 -0
  20. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  21. package/dist/admin/admin/src/translations/en.json.mjs +4 -0
  22. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  23. package/dist/admin/ee/admin/src/hooks/useAIAvailability.js +1 -6
  24. package/dist/admin/ee/admin/src/hooks/useAIAvailability.js.map +1 -1
  25. package/dist/admin/ee/admin/src/hooks/useAIAvailability.mjs +1 -6
  26. package/dist/admin/ee/admin/src/hooks/useAIAvailability.mjs.map +1 -1
  27. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +7 -1
  28. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -1
  29. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs +7 -1
  30. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs.map +1 -1
  31. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +5 -1
  32. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
  33. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +5 -1
  34. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
  35. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js +0 -4
  36. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js.map +1 -1
  37. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs +0 -4
  38. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs.map +1 -1
  39. package/dist/admin/src/components/SubNav.d.ts +27 -8
  40. package/dist/admin/src/components/SubNavFolder.d.ts +15 -0
  41. package/dist/admin/src/features/Tracking.d.ts +2 -1
  42. package/dist/admin/src/services/admin.d.ts +1 -0
  43. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +4 -0
  44. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
  45. package/dist/ee/server/src/index.d.ts.map +1 -1
  46. package/dist/server/ee/server/src/controllers/admin.js +1 -5
  47. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  48. package/dist/server/ee/server/src/controllers/admin.mjs +1 -5
  49. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  50. package/dist/server/ee/server/src/index.js +2 -0
  51. package/dist/server/ee/server/src/index.js.map +1 -1
  52. package/dist/server/ee/server/src/index.mjs +2 -0
  53. package/dist/server/ee/server/src/index.mjs.map +1 -1
  54. package/dist/server/server/src/ai/controllers/ai.js +3 -3
  55. package/dist/server/server/src/ai/controllers/ai.js.map +1 -1
  56. package/dist/server/server/src/ai/controllers/ai.mjs +3 -3
  57. package/dist/server/server/src/ai/controllers/ai.mjs.map +1 -1
  58. package/dist/server/server/src/ai/services/ai.js +37 -12
  59. package/dist/server/server/src/ai/services/ai.js.map +1 -1
  60. package/dist/server/server/src/ai/services/ai.mjs +37 -12
  61. package/dist/server/server/src/ai/services/ai.mjs.map +1 -1
  62. package/dist/server/server/src/audit-logs/tokens.js +106 -0
  63. package/dist/server/server/src/audit-logs/tokens.js.map +1 -0
  64. package/dist/server/server/src/audit-logs/tokens.mjs +99 -0
  65. package/dist/server/server/src/audit-logs/tokens.mjs.map +1 -0
  66. package/dist/server/server/src/controllers/admin.js +10 -1
  67. package/dist/server/server/src/controllers/admin.js.map +1 -1
  68. package/dist/server/server/src/controllers/admin.mjs +10 -1
  69. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  70. package/dist/server/server/src/services/api-token.js +106 -4
  71. package/dist/server/server/src/services/api-token.js.map +1 -1
  72. package/dist/server/server/src/services/api-token.mjs +107 -5
  73. package/dist/server/server/src/services/api-token.mjs.map +1 -1
  74. package/dist/server/server/src/services/transfer/token.js +56 -4
  75. package/dist/server/server/src/services/transfer/token.js.map +1 -1
  76. package/dist/server/server/src/services/transfer/token.mjs +57 -5
  77. package/dist/server/server/src/services/transfer/token.mjs.map +1 -1
  78. package/dist/server/src/ai/services/ai.d.ts +3 -1
  79. package/dist/server/src/ai/services/ai.d.ts.map +1 -1
  80. package/dist/server/src/audit-logs/tokens.d.ts +86 -0
  81. package/dist/server/src/audit-logs/tokens.d.ts.map +1 -0
  82. package/dist/server/src/controllers/admin.d.ts +1 -0
  83. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  84. package/dist/server/src/controllers/index.d.ts +1 -0
  85. package/dist/server/src/controllers/index.d.ts.map +1 -1
  86. package/dist/server/src/index.d.ts +1 -0
  87. package/dist/server/src/index.d.ts.map +1 -1
  88. package/dist/server/src/services/api-token.d.ts.map +1 -1
  89. package/dist/server/src/services/transfer/token.d.ts.map +1 -1
  90. package/dist/shared/contracts/admin.d.ts +1 -0
  91. package/dist/shared/contracts/admin.d.ts.map +1 -1
  92. package/package.json +7 -7
@@ -8,6 +8,7 @@ var index = require('../utils/index.js');
8
8
  var index$1 = require('../domain/permission/index.js');
9
9
  var permission = require('../validation/permission.js');
10
10
  var apiTokenUtils = require('../strategies/api-token-utils.js');
11
+ var tokens = require('../audit-logs/tokens.js');
11
12
 
12
13
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
13
14
 
@@ -634,6 +635,20 @@ const getExpirationFields = (lifespan)=>{
634
635
  });
635
636
  }
636
637
  }
638
+ await utils.emitAudit({
639
+ strapi
640
+ }, tokens.AUDITED_EVENTS.TOKEN_CREATE, {
641
+ tokenId: apiToken.id,
642
+ name: apiToken.name,
643
+ kind: 'content-api',
644
+ description: apiToken.description ?? null,
645
+ lifespan: apiToken.lifespan,
646
+ expiresAt: apiToken.expiresAt,
647
+ type: apiToken.type,
648
+ ...apiToken.type === constants.API_TOKEN_TYPE.CUSTOM && {
649
+ permissions: result.permissions ?? []
650
+ }
651
+ });
637
652
  // Casted to any to avoid complex type duplication
638
653
  return fp.omit([
639
654
  'adminPermissions',
@@ -686,6 +701,18 @@ const getExpirationFields = (lifespan)=>{
686
701
  });
687
702
  }
688
703
  }
704
+ await utils.emitAudit({
705
+ strapi
706
+ }, tokens.AUDITED_EVENTS.TOKEN_CREATE, {
707
+ tokenId: apiToken.id,
708
+ name: apiToken.name,
709
+ kind: 'admin',
710
+ adminUserOwner: ownerId,
711
+ description: apiToken.description ?? null,
712
+ lifespan: apiToken.lifespan,
713
+ expiresAt: apiToken.expiresAt,
714
+ permissions: tokens.toAdminPermissionRefs(result.adminPermissions)
715
+ });
689
716
  // Casted to any to avoid complex type duplication
690
717
  return {
691
718
  ...fp.omit([
@@ -701,9 +728,18 @@ const regenerate = async (id)=>{
701
728
  const apiToken = await strapi.db.query('admin::api-token').update({
702
729
  select: [
703
730
  'id',
731
+ 'name',
704
732
  'accessKey',
705
733
  'kind'
706
734
  ],
735
+ // The owner id only, for the audit row; it is stripped from the response below
736
+ populate: {
737
+ adminUserOwner: {
738
+ select: [
739
+ 'id'
740
+ ]
741
+ }
742
+ },
707
743
  where: {
708
744
  id
709
745
  },
@@ -715,8 +751,21 @@ const regenerate = async (id)=>{
715
751
  if (!apiToken) {
716
752
  throw new NotFoundError('The provided token id does not exist');
717
753
  }
754
+ const ownerId = apiToken.kind === 'admin' ? resolveAdminTokenOwnerId(apiToken) : null;
755
+ await utils.emitAudit({
756
+ strapi
757
+ }, tokens.AUDITED_EVENTS.TOKEN_REGENERATE, {
758
+ tokenId: apiToken.id,
759
+ name: apiToken.name,
760
+ kind: apiToken.kind ?? 'content-api',
761
+ ...ownerId != null && {
762
+ adminUserOwner: ownerId
763
+ }
764
+ });
718
765
  return {
719
- ...apiToken,
766
+ ...fp.omit([
767
+ 'adminUserOwner'
768
+ ], apiToken),
720
769
  kind: apiToken.kind ?? 'content-api',
721
770
  accessKey
722
771
  };
@@ -831,6 +880,17 @@ For security reasons, prefer storing the secret in an environment variable and r
831
880
  if (deletedToken === null || deletedToken === undefined) {
832
881
  return deletedToken;
833
882
  }
883
+ const ownerId = deletedToken.kind === 'admin' ? resolveAdminTokenOwnerId(deletedToken) : null;
884
+ await utils.emitAudit({
885
+ strapi
886
+ }, tokens.AUDITED_EVENTS.TOKEN_DELETE, {
887
+ tokenId: deletedToken.id,
888
+ name: deletedToken.name,
889
+ kind: deletedToken.kind ?? 'content-api',
890
+ ...ownerId != null && {
891
+ adminUserOwner: ownerId
892
+ }
893
+ });
834
894
  if (deletedToken.kind === 'admin') {
835
895
  return {
836
896
  ...deletedToken,
@@ -853,7 +913,9 @@ For security reasons, prefer storing the secret in an environment variable and r
853
913
  const originalToken = await strapi.db.query('admin::api-token').findOne({
854
914
  select: SELECT_FIELDS,
855
915
  populate: [
856
- 'adminUserOwner'
916
+ 'adminUserOwner',
917
+ 'permissions',
918
+ 'adminPermissions'
857
919
  ],
858
920
  where: {
859
921
  id
@@ -862,6 +924,34 @@ For security reasons, prefer storing the secret in an environment variable and r
862
924
  if (!originalToken) {
863
925
  throw new NotFoundError('Token not found');
864
926
  }
927
+ // Populated with its permissions: the audit row for this update lists what changed,
928
+ // so the state before the write is needed. `type` is a content-api concept: admin
929
+ // tokens only carry the column default.
930
+ const previousSnapshot = {
931
+ name: originalToken.name,
932
+ description: originalToken.description,
933
+ ...originalToken.kind !== 'admin' && {
934
+ type: originalToken.type
935
+ },
936
+ permissions: originalToken.kind === 'admin' ? tokens.toAdminPermissionRefs(originalToken.adminPermissions) : tokens.toActionRefs(originalToken.permissions)
937
+ };
938
+ const emitUpdate = async (kind, next, adminUserOwner)=>{
939
+ const changes = tokens.getTokenChanges(previousSnapshot, next);
940
+ if (Object.keys(changes).length === 0) {
941
+ return;
942
+ }
943
+ await utils.emitAudit({
944
+ strapi
945
+ }, tokens.AUDITED_EVENTS.TOKEN_UPDATE, {
946
+ tokenId: originalToken.id,
947
+ name: next.name,
948
+ kind,
949
+ changes,
950
+ ...adminUserOwner != null && {
951
+ adminUserOwner
952
+ }
953
+ });
954
+ };
865
955
  const raw = attributes;
866
956
  // kind is immutable after creation.
867
957
  // Null-kind rows are legacy content-api tokens — treat null and 'content-api' as the same
@@ -880,7 +970,7 @@ For security reasons, prefer storing the secret in an environment variable and r
880
970
  const changingTypeToCustom = incomingType === constants.API_TOKEN_TYPE.CUSTOM && originalToken.type !== constants.API_TOKEN_TYPE.CUSTOM;
881
971
  // Only re-validate if permissions or type are being changed
882
972
  if (incomingPermissions !== undefined || changingTypeToCustom) {
883
- assertCustomTokenPermissionsValidity(resolvedType, incomingPermissions ?? originalToken.permissions);
973
+ assertCustomTokenPermissionsValidity(resolvedType, incomingPermissions);
884
974
  }
885
975
  } else if (originalToken.kind === 'admin') {
886
976
  assertAdminKindFields(attributes);
@@ -951,9 +1041,16 @@ For security reasons, prefer storing the secret in an environment variable and r
951
1041
  });
952
1042
  }
953
1043
  const permissionsFromDb = await strapi.db.query('admin::api-token').load(updatedToken, 'permissions');
1044
+ const permissions = permissionsFromDb ? tokens.toActionRefs(permissionsFromDb) : undefined;
1045
+ await emitUpdate('content-api', {
1046
+ name: updatedToken.name,
1047
+ description: updatedToken.description ?? null,
1048
+ type: updatedToken.type,
1049
+ permissions: permissions ?? []
1050
+ });
954
1051
  return {
955
1052
  ...updatedToken,
956
- permissions: permissionsFromDb ? permissionsFromDb.map((p)=>p.action) : undefined
1053
+ permissions
957
1054
  };
958
1055
  }
959
1056
  // kind === 'admin'
@@ -965,6 +1062,11 @@ For security reasons, prefer storing the secret in an environment variable and r
965
1062
  }
966
1063
  const adminPermissionsFromDb = await strapi.db.query('admin::api-token').load(updatedToken, 'adminPermissions');
967
1064
  const adminUserOwnerFromDb = await strapi.db.query('admin::api-token').load(updatedToken, 'adminUserOwner');
1065
+ await emitUpdate('admin', {
1066
+ name: updatedToken.name,
1067
+ description: updatedToken.description ?? null,
1068
+ permissions: tokens.toAdminPermissionRefs(adminPermissionsFromDb || [])
1069
+ }, resolveAdminTokenOwnerId(originalToken));
968
1070
  return {
969
1071
  ...updatedToken,
970
1072
  adminPermissions: adminPermissionsFromDb || [],