@strapi/admin 5.54.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.
- package/dist/admin/admin/src/components/LanguageProvider.js +35 -1
- package/dist/admin/admin/src/components/LanguageProvider.js.map +1 -1
- package/dist/admin/admin/src/components/LanguageProvider.mjs +17 -2
- package/dist/admin/admin/src/components/LanguageProvider.mjs.map +1 -1
- package/dist/admin/admin/src/components/SubNav.js +113 -35
- package/dist/admin/admin/src/components/SubNav.js.map +1 -1
- package/dist/admin/admin/src/components/SubNav.mjs +115 -37
- package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
- package/dist/admin/admin/src/components/SubNavFolder.js +188 -0
- package/dist/admin/admin/src/components/SubNavFolder.js.map +1 -0
- package/dist/admin/admin/src/components/SubNavFolder.mjs +186 -0
- package/dist/admin/admin/src/components/SubNavFolder.mjs.map +1 -0
- package/dist/admin/admin/src/features/Tracking.js.map +1 -1
- package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
- package/dist/admin/admin/src/render.js +1 -1
- package/dist/admin/admin/src/render.js.map +1 -1
- package/dist/admin/admin/src/render.mjs +1 -1
- package/dist/admin/admin/src/render.mjs.map +1 -1
- package/dist/admin/admin/src/translations/en.json.js +4 -0
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +4 -0
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/admin/ee/admin/src/hooks/useAIAvailability.js +1 -6
- package/dist/admin/ee/admin/src/hooks/useAIAvailability.js.map +1 -1
- package/dist/admin/ee/admin/src/hooks/useAIAvailability.mjs +1 -6
- package/dist/admin/ee/admin/src/hooks/useAIAvailability.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +7 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs +7 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +5 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +5 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js +0 -4
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs +0 -4
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs.map +1 -1
- package/dist/admin/src/components/SubNav.d.ts +27 -8
- package/dist/admin/src/components/SubNavFolder.d.ts +15 -0
- package/dist/admin/src/features/Tracking.d.ts +2 -1
- package/dist/admin/src/services/admin.d.ts +1 -0
- package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +4 -0
- package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
- package/dist/ee/server/src/index.d.ts.map +1 -1
- package/dist/server/ee/server/src/controllers/admin.js +1 -5
- package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
- package/dist/server/ee/server/src/controllers/admin.mjs +1 -5
- package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
- package/dist/server/ee/server/src/index.js +2 -0
- package/dist/server/ee/server/src/index.js.map +1 -1
- package/dist/server/ee/server/src/index.mjs +2 -0
- package/dist/server/ee/server/src/index.mjs.map +1 -1
- package/dist/server/server/src/ai/controllers/ai.js +3 -3
- package/dist/server/server/src/ai/controllers/ai.js.map +1 -1
- package/dist/server/server/src/ai/controllers/ai.mjs +3 -3
- package/dist/server/server/src/ai/controllers/ai.mjs.map +1 -1
- package/dist/server/server/src/ai/services/ai.js +37 -12
- package/dist/server/server/src/ai/services/ai.js.map +1 -1
- package/dist/server/server/src/ai/services/ai.mjs +37 -12
- package/dist/server/server/src/ai/services/ai.mjs.map +1 -1
- package/dist/server/server/src/audit-logs/tokens.js +106 -0
- package/dist/server/server/src/audit-logs/tokens.js.map +1 -0
- package/dist/server/server/src/audit-logs/tokens.mjs +99 -0
- package/dist/server/server/src/audit-logs/tokens.mjs.map +1 -0
- package/dist/server/server/src/controllers/admin.js +10 -1
- package/dist/server/server/src/controllers/admin.js.map +1 -1
- package/dist/server/server/src/controllers/admin.mjs +10 -1
- package/dist/server/server/src/controllers/admin.mjs.map +1 -1
- package/dist/server/server/src/services/api-token.js +106 -4
- package/dist/server/server/src/services/api-token.js.map +1 -1
- package/dist/server/server/src/services/api-token.mjs +107 -5
- package/dist/server/server/src/services/api-token.mjs.map +1 -1
- package/dist/server/server/src/services/transfer/token.js +56 -4
- package/dist/server/server/src/services/transfer/token.js.map +1 -1
- package/dist/server/server/src/services/transfer/token.mjs +57 -5
- package/dist/server/server/src/services/transfer/token.mjs.map +1 -1
- package/dist/server/src/ai/services/ai.d.ts +3 -1
- package/dist/server/src/ai/services/ai.d.ts.map +1 -1
- package/dist/server/src/audit-logs/tokens.d.ts +86 -0
- package/dist/server/src/audit-logs/tokens.d.ts.map +1 -0
- package/dist/server/src/controllers/admin.d.ts +1 -0
- package/dist/server/src/controllers/admin.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +1 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +1 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/services/api-token.d.ts.map +1 -1
- package/dist/server/src/services/transfer/token.d.ts.map +1 -1
- package/dist/shared/contracts/admin.d.ts +1 -0
- package/dist/shared/contracts/admin.d.ts.map +1 -1
- 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
|
-
...
|
|
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
|
|
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
|
|
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 || [],
|