@strapi/admin 5.53.0 → 5.55.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 (183) hide show
  1. package/dist/admin/admin/src/App.js +1 -1
  2. package/dist/admin/admin/src/App.js.map +1 -1
  3. package/dist/admin/admin/src/App.mjs +1 -1
  4. package/dist/admin/admin/src/App.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/DismissibleBanner.js +60 -0
  6. package/dist/admin/admin/src/components/DismissibleBanner.js.map +1 -0
  7. package/dist/admin/admin/src/components/DismissibleBanner.mjs +58 -0
  8. package/dist/admin/admin/src/components/DismissibleBanner.mjs.map +1 -0
  9. package/dist/admin/admin/src/components/Form.js +11 -2
  10. package/dist/admin/admin/src/components/Form.js.map +1 -1
  11. package/dist/admin/admin/src/components/Form.mjs +11 -2
  12. package/dist/admin/admin/src/components/Form.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/FormInputs/DateTime.js +1 -1
  14. package/dist/admin/admin/src/components/FormInputs/DateTime.js.map +1 -1
  15. package/dist/admin/admin/src/components/FormInputs/DateTime.mjs +1 -1
  16. package/dist/admin/admin/src/components/FormInputs/DateTime.mjs.map +1 -1
  17. package/dist/admin/admin/src/components/FormInputs/Time.js +1 -1
  18. package/dist/admin/admin/src/components/FormInputs/Time.js.map +1 -1
  19. package/dist/admin/admin/src/components/FormInputs/Time.mjs +1 -1
  20. package/dist/admin/admin/src/components/FormInputs/Time.mjs.map +1 -1
  21. package/dist/admin/admin/src/components/LanguageProvider.js +35 -1
  22. package/dist/admin/admin/src/components/LanguageProvider.js.map +1 -1
  23. package/dist/admin/admin/src/components/LanguageProvider.mjs +17 -2
  24. package/dist/admin/admin/src/components/LanguageProvider.mjs.map +1 -1
  25. package/dist/admin/admin/src/components/MainNav/NavUser.js +1 -2
  26. package/dist/admin/admin/src/components/MainNav/NavUser.js.map +1 -1
  27. package/dist/admin/admin/src/components/MainNav/NavUser.mjs +1 -2
  28. package/dist/admin/admin/src/components/MainNav/NavUser.mjs.map +1 -1
  29. package/dist/admin/admin/src/components/MediaLibraryBanner.js +85 -0
  30. package/dist/admin/admin/src/components/MediaLibraryBanner.js.map +1 -0
  31. package/dist/admin/admin/src/components/MediaLibraryBanner.mjs +83 -0
  32. package/dist/admin/admin/src/components/MediaLibraryBanner.mjs.map +1 -0
  33. package/dist/admin/admin/src/components/Providers.js +6 -6
  34. package/dist/admin/admin/src/components/Providers.js.map +1 -1
  35. package/dist/admin/admin/src/components/Providers.mjs +6 -6
  36. package/dist/admin/admin/src/components/Providers.mjs.map +1 -1
  37. package/dist/admin/admin/src/components/SubNav.js +113 -35
  38. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  39. package/dist/admin/admin/src/components/SubNav.mjs +115 -37
  40. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  41. package/dist/admin/admin/src/components/SubNavFolder.js +188 -0
  42. package/dist/admin/admin/src/components/SubNavFolder.js.map +1 -0
  43. package/dist/admin/admin/src/components/SubNavFolder.mjs +186 -0
  44. package/dist/admin/admin/src/components/SubNavFolder.mjs.map +1 -0
  45. package/dist/admin/admin/src/components/UpsellBanner.js +56 -86
  46. package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
  47. package/dist/admin/admin/src/components/UpsellBanner.mjs +58 -88
  48. package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
  49. package/dist/admin/admin/src/core/store/configure.js +14 -2
  50. package/dist/admin/admin/src/core/store/configure.js.map +1 -1
  51. package/dist/admin/admin/src/core/store/configure.mjs +14 -2
  52. package/dist/admin/admin/src/core/store/configure.mjs.map +1 -1
  53. package/dist/admin/admin/src/core/store/hooks.mjs +1 -1
  54. package/dist/admin/admin/src/features/Auth.js +162 -46
  55. package/dist/admin/admin/src/features/Auth.js.map +1 -1
  56. package/dist/admin/admin/src/features/Auth.mjs +164 -48
  57. package/dist/admin/admin/src/features/Auth.mjs.map +1 -1
  58. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  59. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  60. package/dist/admin/admin/src/hooks/useRegisterUnsavedChanges.js +19 -0
  61. package/dist/admin/admin/src/hooks/useRegisterUnsavedChanges.js.map +1 -0
  62. package/dist/admin/admin/src/hooks/useRegisterUnsavedChanges.mjs +17 -0
  63. package/dist/admin/admin/src/hooks/useRegisterUnsavedChanges.mjs.map +1 -0
  64. package/dist/admin/admin/src/hooks/{useIdleSessionLogout.js → useSessionKeepalive.js} +34 -27
  65. package/dist/admin/admin/src/hooks/useSessionKeepalive.js.map +1 -0
  66. package/dist/admin/admin/src/hooks/{useIdleSessionLogout.mjs → useSessionKeepalive.mjs} +34 -27
  67. package/dist/admin/admin/src/hooks/useSessionKeepalive.mjs.map +1 -0
  68. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +2 -0
  69. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
  70. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +2 -0
  71. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
  72. package/dist/admin/admin/src/pages/SessionsPage.js +2 -5
  73. package/dist/admin/admin/src/pages/SessionsPage.js.map +1 -1
  74. package/dist/admin/admin/src/pages/SessionsPage.mjs +2 -5
  75. package/dist/admin/admin/src/pages/SessionsPage.mjs.map +1 -1
  76. package/dist/admin/admin/src/render.js +6 -1
  77. package/dist/admin/admin/src/render.js.map +1 -1
  78. package/dist/admin/admin/src/render.mjs +6 -1
  79. package/dist/admin/admin/src/render.mjs.map +1 -1
  80. package/dist/admin/admin/src/translations/en.json.js +16 -0
  81. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  82. package/dist/admin/admin/src/translations/en.json.mjs +16 -0
  83. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  84. package/dist/admin/admin/src/utils/baseQuery.js +3 -13
  85. package/dist/admin/admin/src/utils/baseQuery.js.map +1 -1
  86. package/dist/admin/admin/src/utils/baseQuery.mjs +3 -13
  87. package/dist/admin/admin/src/utils/baseQuery.mjs.map +1 -1
  88. package/dist/admin/admin/src/utils/getFetchClient.js +34 -5
  89. package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
  90. package/dist/admin/admin/src/utils/getFetchClient.mjs +34 -6
  91. package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
  92. package/dist/admin/admin/src/utils/unsavedChangesRegistry.js +25 -0
  93. package/dist/admin/admin/src/utils/unsavedChangesRegistry.js.map +1 -0
  94. package/dist/admin/admin/src/utils/unsavedChangesRegistry.mjs +22 -0
  95. package/dist/admin/admin/src/utils/unsavedChangesRegistry.mjs.map +1 -0
  96. package/dist/admin/admin/tests/utils.js +14 -14
  97. package/dist/admin/admin/tests/utils.js.map +1 -1
  98. package/dist/admin/admin/tests/utils.mjs +14 -14
  99. package/dist/admin/admin/tests/utils.mjs.map +1 -1
  100. package/dist/admin/ee/admin/src/hooks/useAIAvailability.js +1 -6
  101. package/dist/admin/ee/admin/src/hooks/useAIAvailability.js.map +1 -1
  102. package/dist/admin/ee/admin/src/hooks/useAIAvailability.mjs +1 -6
  103. package/dist/admin/ee/admin/src/hooks/useAIAvailability.mjs.map +1 -1
  104. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +7 -1
  105. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -1
  106. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs +7 -1
  107. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs.map +1 -1
  108. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +9 -1
  109. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
  110. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +9 -1
  111. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
  112. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js +0 -4
  113. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js.map +1 -1
  114. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs +0 -4
  115. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs.map +1 -1
  116. package/dist/admin/index.js +1 -0
  117. package/dist/admin/index.js.map +1 -1
  118. package/dist/admin/index.mjs +1 -1
  119. package/dist/admin/src/components/DismissibleBanner.d.ts +8 -0
  120. package/dist/admin/src/components/MediaLibraryBanner.d.ts +2 -0
  121. package/dist/admin/src/components/SubNav.d.ts +27 -8
  122. package/dist/admin/src/components/SubNavFolder.d.ts +15 -0
  123. package/dist/admin/src/features/Tracking.d.ts +2 -1
  124. package/dist/admin/src/hooks/useRegisterUnsavedChanges.d.ts +6 -0
  125. package/dist/admin/src/hooks/useSessionKeepalive.d.ts +88 -0
  126. package/dist/admin/src/services/admin.d.ts +1 -0
  127. package/dist/admin/src/utils/getFetchClient.d.ts +14 -6
  128. package/dist/admin/src/utils/unsavedChangesRegistry.d.ts +11 -0
  129. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +8 -0
  130. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
  131. package/dist/ee/server/src/index.d.ts.map +1 -1
  132. package/dist/server/ee/server/src/controllers/admin.js +1 -5
  133. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  134. package/dist/server/ee/server/src/controllers/admin.mjs +1 -5
  135. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  136. package/dist/server/ee/server/src/index.js +2 -0
  137. package/dist/server/ee/server/src/index.js.map +1 -1
  138. package/dist/server/ee/server/src/index.mjs +2 -0
  139. package/dist/server/ee/server/src/index.mjs.map +1 -1
  140. package/dist/server/server/src/ai/controllers/ai.js +3 -3
  141. package/dist/server/server/src/ai/controllers/ai.js.map +1 -1
  142. package/dist/server/server/src/ai/controllers/ai.mjs +3 -3
  143. package/dist/server/server/src/ai/controllers/ai.mjs.map +1 -1
  144. package/dist/server/server/src/ai/services/ai.js +37 -12
  145. package/dist/server/server/src/ai/services/ai.js.map +1 -1
  146. package/dist/server/server/src/ai/services/ai.mjs +37 -12
  147. package/dist/server/server/src/ai/services/ai.mjs.map +1 -1
  148. package/dist/server/server/src/audit-logs/tokens.js +106 -0
  149. package/dist/server/server/src/audit-logs/tokens.js.map +1 -0
  150. package/dist/server/server/src/audit-logs/tokens.mjs +99 -0
  151. package/dist/server/server/src/audit-logs/tokens.mjs.map +1 -0
  152. package/dist/server/server/src/controllers/admin.js +10 -1
  153. package/dist/server/server/src/controllers/admin.js.map +1 -1
  154. package/dist/server/server/src/controllers/admin.mjs +10 -1
  155. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  156. package/dist/server/server/src/services/api-token.js +106 -4
  157. package/dist/server/server/src/services/api-token.js.map +1 -1
  158. package/dist/server/server/src/services/api-token.mjs +107 -5
  159. package/dist/server/server/src/services/api-token.mjs.map +1 -1
  160. package/dist/server/server/src/services/transfer/token.js +56 -4
  161. package/dist/server/server/src/services/transfer/token.js.map +1 -1
  162. package/dist/server/server/src/services/transfer/token.mjs +57 -5
  163. package/dist/server/server/src/services/transfer/token.mjs.map +1 -1
  164. package/dist/server/src/ai/services/ai.d.ts +3 -1
  165. package/dist/server/src/ai/services/ai.d.ts.map +1 -1
  166. package/dist/server/src/audit-logs/tokens.d.ts +86 -0
  167. package/dist/server/src/audit-logs/tokens.d.ts.map +1 -0
  168. package/dist/server/src/controllers/admin.d.ts +1 -0
  169. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  170. package/dist/server/src/controllers/index.d.ts +1 -0
  171. package/dist/server/src/controllers/index.d.ts.map +1 -1
  172. package/dist/server/src/index.d.ts +1 -0
  173. package/dist/server/src/index.d.ts.map +1 -1
  174. package/dist/server/src/services/api-token.d.ts.map +1 -1
  175. package/dist/server/src/services/transfer/token.d.ts.map +1 -1
  176. package/dist/shared/contracts/admin.d.ts +1 -0
  177. package/dist/shared/contracts/admin.d.ts.map +1 -1
  178. package/dist/shared/contracts/shared.d.ts +1 -0
  179. package/dist/shared/contracts/shared.d.ts.map +1 -1
  180. package/package.json +7 -7
  181. package/dist/admin/admin/src/hooks/useIdleSessionLogout.js.map +0 -1
  182. package/dist/admin/admin/src/hooks/useIdleSessionLogout.mjs.map +0 -1
  183. package/dist/admin/src/hooks/useIdleSessionLogout.d.ts +0 -87
@@ -1,11 +1,12 @@
1
1
  import crypto from 'crypto';
2
2
  import { pick, uniq, differenceWith, prop, omit, map, difference, isEqual, isArray, isEmpty, isNumber, isNil } from 'lodash/fp';
3
- import { errors } from '@strapi/utils';
3
+ import { errors, emitAudit } from '@strapi/utils';
4
4
  import constants from './constants.mjs';
5
5
  import { getService } from '../utils/index.mjs';
6
6
  import permissionDomain from '../domain/permission/index.mjs';
7
7
  import { validatePermissionsExist } from '../validation/permission.mjs';
8
8
  import { checkExpiry, updateLastUsedAt } from '../strategies/api-token-utils.mjs';
9
+ import { AUDITED_EVENTS, toAdminPermissionRefs, toActionRefs, getTokenChanges } from '../audit-logs/tokens.mjs';
9
10
 
10
11
  const { SUPER_ADMIN_CODE } = constants;
11
12
  const { ValidationError, NotFoundError, UnauthorizedError } = errors;
@@ -628,6 +629,20 @@ const getExpirationFields = (lifespan)=>{
628
629
  });
629
630
  }
630
631
  }
632
+ await emitAudit({
633
+ strapi
634
+ }, AUDITED_EVENTS.TOKEN_CREATE, {
635
+ tokenId: apiToken.id,
636
+ name: apiToken.name,
637
+ kind: 'content-api',
638
+ description: apiToken.description ?? null,
639
+ lifespan: apiToken.lifespan,
640
+ expiresAt: apiToken.expiresAt,
641
+ type: apiToken.type,
642
+ ...apiToken.type === constants.API_TOKEN_TYPE.CUSTOM && {
643
+ permissions: result.permissions ?? []
644
+ }
645
+ });
631
646
  // Casted to any to avoid complex type duplication
632
647
  return omit([
633
648
  'adminPermissions',
@@ -680,6 +695,18 @@ const getExpirationFields = (lifespan)=>{
680
695
  });
681
696
  }
682
697
  }
698
+ await emitAudit({
699
+ strapi
700
+ }, AUDITED_EVENTS.TOKEN_CREATE, {
701
+ tokenId: apiToken.id,
702
+ name: apiToken.name,
703
+ kind: 'admin',
704
+ adminUserOwner: ownerId,
705
+ description: apiToken.description ?? null,
706
+ lifespan: apiToken.lifespan,
707
+ expiresAt: apiToken.expiresAt,
708
+ permissions: toAdminPermissionRefs(result.adminPermissions)
709
+ });
683
710
  // Casted to any to avoid complex type duplication
684
711
  return {
685
712
  ...omit([
@@ -695,9 +722,18 @@ const regenerate = async (id)=>{
695
722
  const apiToken = await strapi.db.query('admin::api-token').update({
696
723
  select: [
697
724
  'id',
725
+ 'name',
698
726
  'accessKey',
699
727
  'kind'
700
728
  ],
729
+ // The owner id only, for the audit row; it is stripped from the response below
730
+ populate: {
731
+ adminUserOwner: {
732
+ select: [
733
+ 'id'
734
+ ]
735
+ }
736
+ },
701
737
  where: {
702
738
  id
703
739
  },
@@ -709,8 +745,21 @@ const regenerate = async (id)=>{
709
745
  if (!apiToken) {
710
746
  throw new NotFoundError('The provided token id does not exist');
711
747
  }
748
+ const ownerId = apiToken.kind === 'admin' ? resolveAdminTokenOwnerId(apiToken) : null;
749
+ await emitAudit({
750
+ strapi
751
+ }, AUDITED_EVENTS.TOKEN_REGENERATE, {
752
+ tokenId: apiToken.id,
753
+ name: apiToken.name,
754
+ kind: apiToken.kind ?? 'content-api',
755
+ ...ownerId != null && {
756
+ adminUserOwner: ownerId
757
+ }
758
+ });
712
759
  return {
713
- ...apiToken,
760
+ ...omit([
761
+ 'adminUserOwner'
762
+ ], apiToken),
714
763
  kind: apiToken.kind ?? 'content-api',
715
764
  accessKey
716
765
  };
@@ -825,6 +874,17 @@ For security reasons, prefer storing the secret in an environment variable and r
825
874
  if (deletedToken === null || deletedToken === undefined) {
826
875
  return deletedToken;
827
876
  }
877
+ const ownerId = deletedToken.kind === 'admin' ? resolveAdminTokenOwnerId(deletedToken) : null;
878
+ await emitAudit({
879
+ strapi
880
+ }, AUDITED_EVENTS.TOKEN_DELETE, {
881
+ tokenId: deletedToken.id,
882
+ name: deletedToken.name,
883
+ kind: deletedToken.kind ?? 'content-api',
884
+ ...ownerId != null && {
885
+ adminUserOwner: ownerId
886
+ }
887
+ });
828
888
  if (deletedToken.kind === 'admin') {
829
889
  return {
830
890
  ...deletedToken,
@@ -847,7 +907,9 @@ For security reasons, prefer storing the secret in an environment variable and r
847
907
  const originalToken = await strapi.db.query('admin::api-token').findOne({
848
908
  select: SELECT_FIELDS,
849
909
  populate: [
850
- 'adminUserOwner'
910
+ 'adminUserOwner',
911
+ 'permissions',
912
+ 'adminPermissions'
851
913
  ],
852
914
  where: {
853
915
  id
@@ -856,6 +918,34 @@ For security reasons, prefer storing the secret in an environment variable and r
856
918
  if (!originalToken) {
857
919
  throw new NotFoundError('Token not found');
858
920
  }
921
+ // Populated with its permissions: the audit row for this update lists what changed,
922
+ // so the state before the write is needed. `type` is a content-api concept: admin
923
+ // tokens only carry the column default.
924
+ const previousSnapshot = {
925
+ name: originalToken.name,
926
+ description: originalToken.description,
927
+ ...originalToken.kind !== 'admin' && {
928
+ type: originalToken.type
929
+ },
930
+ permissions: originalToken.kind === 'admin' ? toAdminPermissionRefs(originalToken.adminPermissions) : toActionRefs(originalToken.permissions)
931
+ };
932
+ const emitUpdate = async (kind, next, adminUserOwner)=>{
933
+ const changes = getTokenChanges(previousSnapshot, next);
934
+ if (Object.keys(changes).length === 0) {
935
+ return;
936
+ }
937
+ await emitAudit({
938
+ strapi
939
+ }, AUDITED_EVENTS.TOKEN_UPDATE, {
940
+ tokenId: originalToken.id,
941
+ name: next.name,
942
+ kind,
943
+ changes,
944
+ ...adminUserOwner != null && {
945
+ adminUserOwner
946
+ }
947
+ });
948
+ };
859
949
  const raw = attributes;
860
950
  // kind is immutable after creation.
861
951
  // Null-kind rows are legacy content-api tokens — treat null and 'content-api' as the same
@@ -874,7 +964,7 @@ For security reasons, prefer storing the secret in an environment variable and r
874
964
  const changingTypeToCustom = incomingType === constants.API_TOKEN_TYPE.CUSTOM && originalToken.type !== constants.API_TOKEN_TYPE.CUSTOM;
875
965
  // Only re-validate if permissions or type are being changed
876
966
  if (incomingPermissions !== undefined || changingTypeToCustom) {
877
- assertCustomTokenPermissionsValidity(resolvedType, incomingPermissions ?? originalToken.permissions);
967
+ assertCustomTokenPermissionsValidity(resolvedType, incomingPermissions);
878
968
  }
879
969
  } else if (originalToken.kind === 'admin') {
880
970
  assertAdminKindFields(attributes);
@@ -945,9 +1035,16 @@ For security reasons, prefer storing the secret in an environment variable and r
945
1035
  });
946
1036
  }
947
1037
  const permissionsFromDb = await strapi.db.query('admin::api-token').load(updatedToken, 'permissions');
1038
+ const permissions = permissionsFromDb ? toActionRefs(permissionsFromDb) : undefined;
1039
+ await emitUpdate('content-api', {
1040
+ name: updatedToken.name,
1041
+ description: updatedToken.description ?? null,
1042
+ type: updatedToken.type,
1043
+ permissions: permissions ?? []
1044
+ });
948
1045
  return {
949
1046
  ...updatedToken,
950
- permissions: permissionsFromDb ? permissionsFromDb.map((p)=>p.action) : undefined
1047
+ permissions
951
1048
  };
952
1049
  }
953
1050
  // kind === 'admin'
@@ -959,6 +1056,11 @@ For security reasons, prefer storing the secret in an environment variable and r
959
1056
  }
960
1057
  const adminPermissionsFromDb = await strapi.db.query('admin::api-token').load(updatedToken, 'adminPermissions');
961
1058
  const adminUserOwnerFromDb = await strapi.db.query('admin::api-token').load(updatedToken, 'adminUserOwner');
1059
+ await emitUpdate('admin', {
1060
+ name: updatedToken.name,
1061
+ description: updatedToken.description ?? null,
1062
+ permissions: toAdminPermissionRefs(adminPermissionsFromDb || [])
1063
+ }, resolveAdminTokenOwnerId(originalToken));
962
1064
  return {
963
1065
  ...updatedToken,
964
1066
  adminPermissions: adminPermissionsFromDb || [],