@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.
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sources":["../../../../../../server/src/services/transfer/token.ts"],"sourcesContent":["import crypto from 'crypto';\nimport assert from 'assert';\nimport { map, isArray, omit, uniq, isNil, difference, isEmpty, isNumber } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport '@strapi/types';\nimport constants from '../constants';\nimport { getService } from '../../utils';\nimport {\n DatabaseTransferToken,\n SanitizedTransferToken,\n TokenCreatePayload,\n TokenUpdatePayload,\n TransferToken,\n TransferTokenPermission,\n} from '../../../../shared/contracts/transfer';\n\nconst { ValidationError, NotFoundError } = errors;\n\nconst TRANSFER_TOKEN_UID = 'admin::transfer-token';\nconst TRANSFER_TOKEN_PERMISSION_UID = 'admin::transfer-token-permission';\n\nconst SELECT_FIELDS = [\n 'id',\n 'name',\n 'description',\n 'lastUsedAt',\n 'lifespan',\n 'expiresAt',\n 'createdAt',\n 'updatedAt',\n] as const;\n\nconst POPULATE_FIELDS = ['permissions'] as const;\n\n/**\n * Return a list of all tokens and their permissions\n */\nconst list = async (): Promise<SanitizedTransferToken[]> => {\n const tokens: DatabaseTransferToken[] = await strapi.db.query(TRANSFER_TOKEN_UID).findMany({\n select: SELECT_FIELDS,\n populate: POPULATE_FIELDS,\n orderBy: { name: 'ASC' },\n });\n\n if (!tokens) return tokens;\n return tokens.map((token) => flattenTokenPermissions(token));\n};\n\n/**\n * Create a random token's access key\n */\nconst generateRandomAccessKey = (): string => crypto.randomBytes(128).toString('hex');\n\n/**\n * Validate the given access key's format and returns it if valid\n */\nconst validateAccessKey = (accessKey: string): string => {\n assert(typeof accessKey === 'string', 'Access key needs to be a string');\n assert(accessKey.length >= 15, 'Access key needs to have at least 15 characters');\n\n return accessKey;\n};\n\nexport const hasAccessKey = <T extends { accessKey?: string }>(\n attributes: T\n): attributes is T & { accessKey: string } => {\n return 'accessKey' in attributes;\n};\n\n/**\n * Create a token and its permissions\n */\nconst create = async (attributes: TokenCreatePayload): Promise<TransferToken> => {\n const accessKey = hasAccessKey(attributes)\n ? validateAccessKey(attributes.accessKey)\n : generateRandomAccessKey();\n\n // Make sure the access key isn't picked up directly from the attributes for the next steps\n delete attributes.accessKey;\n\n assertTokenPermissionsValidity(attributes);\n assertValidLifespan(attributes.lifespan);\n\n const result = (await strapi.db.transaction(async () => {\n const transferToken = await strapi.db.query(TRANSFER_TOKEN_UID).create({\n select: SELECT_FIELDS,\n populate: POPULATE_FIELDS,\n data: {\n ...omit('permissions', attributes),\n accessKey: hash(accessKey),\n ...getExpirationFields(attributes.lifespan),\n },\n });\n\n await Promise.all(\n uniq(attributes.permissions).map((action) =>\n strapi.db\n .query(TRANSFER_TOKEN_PERMISSION_UID)\n .create({ data: { action, token: transferToken } })\n )\n );\n\n const currentPermissions: TransferTokenPermission[] = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(transferToken, 'permissions');\n\n if (currentPermissions) {\n Object.assign(transferToken, { permissions: map('action', currentPermissions) });\n }\n\n return transferToken;\n })) as TransferToken;\n\n return { ...result, accessKey };\n};\n\n/**\n * Update a token and its permissions\n */\nconst update = async (\n id: string | number,\n attributes: TokenUpdatePayload\n): Promise<SanitizedTransferToken> => {\n // retrieve token without permissions\n const originalToken = await strapi.db.query(TRANSFER_TOKEN_UID).findOne({ where: { id } });\n\n if (!originalToken) {\n throw new NotFoundError('Token not found');\n }\n\n assertTokenPermissionsValidity(attributes);\n assertValidLifespan(attributes.lifespan);\n\n return strapi.db.transaction(async () => {\n const updatedToken = await strapi.db.query(TRANSFER_TOKEN_UID).update({\n select: SELECT_FIELDS,\n where: { id },\n data: {\n ...omit('permissions', attributes),\n },\n });\n\n if (attributes.permissions) {\n const currentPermissionsResult = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(updatedToken, 'permissions');\n\n const currentPermissions = map('action', currentPermissionsResult || []);\n const newPermissions = uniq(attributes.permissions);\n\n const actionsToDelete = difference(currentPermissions, newPermissions);\n const actionsToAdd = difference(newPermissions, currentPermissions);\n\n // TODO: improve efficiency here\n // method using a loop -- works but very inefficient\n await Promise.all(\n actionsToDelete.map((action) =>\n strapi.db.query(TRANSFER_TOKEN_PERMISSION_UID).delete({\n where: { action, token: id },\n })\n )\n );\n\n // TODO: improve efficiency here\n // using a loop -- works but very inefficient\n await Promise.all(\n actionsToAdd.map((action) =>\n strapi.db.query(TRANSFER_TOKEN_PERMISSION_UID).create({\n data: { action, token: id },\n })\n )\n );\n }\n\n // retrieve permissions\n const permissionsFromDb: TransferTokenPermission[] = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(updatedToken, 'permissions');\n\n return {\n ...updatedToken,\n permissions: permissionsFromDb ? permissionsFromDb.map((p) => p.action) : undefined,\n };\n }) as unknown as Promise<SanitizedTransferToken>;\n};\n\n/**\n * Revoke (delete) a token\n */\nconst revoke = async (id: string | number): Promise<SanitizedTransferToken> => {\n return strapi.db.transaction(async () =>\n strapi.db\n .query(TRANSFER_TOKEN_UID)\n .delete({ select: SELECT_FIELDS, populate: POPULATE_FIELDS, where: { id } })\n ) as unknown as Promise<SanitizedTransferToken>;\n};\n\n/**\n * Get a token\n */\nconst getBy = async (\n whereParams = {} as {\n id?: string | number;\n name?: string;\n lastUsedAt?: number;\n description?: string;\n accessKey?: string;\n }\n): Promise<SanitizedTransferToken | null> => {\n if (Object.keys(whereParams).length === 0) {\n return null;\n }\n\n const token = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .findOne({ select: SELECT_FIELDS, populate: POPULATE_FIELDS, where: whereParams });\n\n if (!token) {\n return token;\n }\n\n return flattenTokenPermissions(token);\n};\n\n/**\n * Retrieve a token by id\n */\nconst getById = async (id: string | number): Promise<SanitizedTransferToken | null> => {\n return getBy({ id });\n};\n\n/**\n * Retrieve a token by name\n */\nconst getByName = async (name: string): Promise<SanitizedTransferToken | null> => {\n return getBy({ name });\n};\n\n/**\n * Check if token exists\n */\nconst exists = async (\n whereParams = {} as {\n id?: string | number;\n name?: string;\n lastUsedAt?: number;\n description?: string;\n accessKey?: string;\n }\n): Promise<boolean> => {\n const transferToken = await getBy(whereParams);\n\n return !!transferToken;\n};\n\nconst regenerate = async (id: string | number): Promise<TransferToken> => {\n const accessKey = crypto.randomBytes(128).toString('hex');\n const transferToken = (await strapi.db.transaction(async () =>\n strapi.db.query(TRANSFER_TOKEN_UID).update({\n select: ['id', 'accessKey'],\n where: { id },\n data: {\n accessKey: hash(accessKey),\n },\n })\n )) as Promise<TransferToken>;\n\n if (!transferToken) {\n throw new NotFoundError('The provided token id does not exist');\n }\n\n return {\n ...transferToken,\n accessKey,\n };\n};\n\nconst getExpirationFields = (lifespan: TransferToken['lifespan']) => {\n // it must be nil or a finite number >= 0\n const isValidNumber = isNumber(lifespan) && Number.isFinite(lifespan) && lifespan > 0;\n if (!isValidNumber && !isNil(lifespan)) {\n throw new ValidationError('lifespan must be a positive number or null');\n }\n\n return {\n lifespan: lifespan || null,\n expiresAt: lifespan ? Date.now() + lifespan : null,\n };\n};\n\n/**\n * Return a secure sha512 hash of an accessKey\n */\nconst hash = (accessKey: string): string => {\n const { hasValidTokenSalt } = getService('transfer').utils;\n\n if (!hasValidTokenSalt()) {\n throw new TypeError('Required token salt is not defined');\n }\n\n return crypto\n .createHmac('sha512', strapi.config.get('admin.transfer.token.salt'))\n .update(accessKey)\n .digest('hex');\n};\n\nconst checkSaltIsDefined = () => {\n const { hasValidTokenSalt } = getService('transfer').utils;\n\n // Ignore the check if the data-transfer feature is manually disabled\n if (!strapi.config.get('server.transfer.remote.enabled')) {\n return;\n }\n\n if (!hasValidTokenSalt()) {\n process.emitWarning(\n `Missing transfer.token.salt: Data transfer features have been disabled.\nPlease set transfer.token.salt in config/admin.js (ex: you can generate one using Node with \\`crypto.randomBytes(16).toString('base64')\\`)\nFor security reasons, prefer storing the secret in an environment variable and read it in config/admin.js. See https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/configurations/optional/environment.html#configuration-using-environment-variables.`\n );\n }\n};\n\n/**\n * Flatten a token's database permissions objects to an array of strings\n */\nconst flattenTokenPermissions = (token: DatabaseTransferToken): TransferToken => {\n if (!token) {\n return token;\n }\n\n return {\n ...token,\n permissions: isArray(token.permissions)\n ? map('action', token.permissions as TransferTokenPermission[])\n : token.permissions,\n };\n};\n\n/**\n * Assert that a token's permissions are valid\n */\nconst assertTokenPermissionsValidity = (attributes: TokenUpdatePayload) => {\n const permissionService = strapi.service('admin::transfer').permission;\n const validPermissions = permissionService.providers.action.keys();\n const invalidPermissions = difference(attributes.permissions, validPermissions);\n\n if (!isEmpty(invalidPermissions)) {\n throw new ValidationError(`Unknown permissions provided: ${invalidPermissions.join(', ')}`);\n }\n};\n\n/**\n * Check if a token's lifespan is valid\n */\nconst isValidLifespan = (lifespan: unknown) => {\n if (isNil(lifespan)) {\n return true;\n }\n\n if (\n !isNumber(lifespan) ||\n !Object.values(constants.TRANSFER_TOKEN_LIFESPANS).includes(lifespan)\n ) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Assert that a token's lifespan is valid\n */\nconst assertValidLifespan = (lifespan: unknown) => {\n if (!isValidLifespan(lifespan)) {\n throw new ValidationError(\n `lifespan must be one of the following values:\n ${Object.values(constants.TRANSFER_TOKEN_LIFESPANS).join(', ')}`\n );\n }\n};\n\nexport {\n create,\n list,\n exists,\n getBy,\n getById,\n getByName,\n update,\n revoke,\n regenerate,\n hash,\n checkSaltIsDefined,\n};\n"],"names":["ValidationError","NotFoundError","errors","TRANSFER_TOKEN_UID","TRANSFER_TOKEN_PERMISSION_UID","SELECT_FIELDS","POPULATE_FIELDS","list","tokens","strapi","db","query","findMany","select","populate","orderBy","name","map","token","flattenTokenPermissions","generateRandomAccessKey","crypto","randomBytes","toString","validateAccessKey","accessKey","assert","length","hasAccessKey","attributes","create","assertTokenPermissionsValidity","assertValidLifespan","lifespan","result","transaction","transferToken","data","omit","hash","getExpirationFields","Promise","all","uniq","permissions","action","currentPermissions","load","Object","assign","update","id","originalToken","findOne","where","updatedToken","currentPermissionsResult","newPermissions","actionsToDelete","difference","actionsToAdd","delete","permissionsFromDb","p","undefined","revoke","getBy","whereParams","keys","getById","getByName","exists","regenerate","isValidNumber","isNumber","Number","isFinite","isNil","expiresAt","Date","now","hasValidTokenSalt","getService","utils","TypeError","createHmac","config","get","digest","checkSaltIsDefined","process","emitWarning","isArray","permissionService","service","permission","validPermissions","providers","invalidPermissions","isEmpty","join","isValidLifespan","values","constants","TRANSFER_TOKEN_LIFESPANS","includes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"token.js","sources":["../../../../../../server/src/services/transfer/token.ts"],"sourcesContent":["import crypto from 'crypto';\nimport assert from 'assert';\nimport { map, isArray, omit, uniq, isNil, difference, isEmpty, isNumber } from 'lodash/fp';\nimport { errors, emitAudit } from '@strapi/utils';\nimport '@strapi/types';\nimport constants from '../constants';\nimport { getService } from '../../utils';\nimport { AUDITED_EVENTS, getTokenChanges, toActionRefs } from '../../audit-logs/tokens';\nimport {\n DatabaseTransferToken,\n SanitizedTransferToken,\n TokenCreatePayload,\n TokenUpdatePayload,\n TransferToken,\n TransferTokenPermission,\n} from '../../../../shared/contracts/transfer';\n\nconst { ValidationError, NotFoundError } = errors;\n\nconst TRANSFER_TOKEN_UID = 'admin::transfer-token';\nconst TRANSFER_TOKEN_PERMISSION_UID = 'admin::transfer-token-permission';\n\nconst SELECT_FIELDS = [\n 'id',\n 'name',\n 'description',\n 'lastUsedAt',\n 'lifespan',\n 'expiresAt',\n 'createdAt',\n 'updatedAt',\n] as const;\n\nconst POPULATE_FIELDS = ['permissions'] as const;\n\n/**\n * Return a list of all tokens and their permissions\n */\nconst list = async (): Promise<SanitizedTransferToken[]> => {\n const tokens: DatabaseTransferToken[] = await strapi.db.query(TRANSFER_TOKEN_UID).findMany({\n select: SELECT_FIELDS,\n populate: POPULATE_FIELDS,\n orderBy: { name: 'ASC' },\n });\n\n if (!tokens) return tokens;\n return tokens.map((token) => flattenTokenPermissions(token));\n};\n\n/**\n * Create a random token's access key\n */\nconst generateRandomAccessKey = (): string => crypto.randomBytes(128).toString('hex');\n\n/**\n * Validate the given access key's format and returns it if valid\n */\nconst validateAccessKey = (accessKey: string): string => {\n assert(typeof accessKey === 'string', 'Access key needs to be a string');\n assert(accessKey.length >= 15, 'Access key needs to have at least 15 characters');\n\n return accessKey;\n};\n\nexport const hasAccessKey = <T extends { accessKey?: string }>(\n attributes: T\n): attributes is T & { accessKey: string } => {\n return 'accessKey' in attributes;\n};\n\n/**\n * Create a token and its permissions\n */\nconst create = async (attributes: TokenCreatePayload): Promise<TransferToken> => {\n const accessKey = hasAccessKey(attributes)\n ? validateAccessKey(attributes.accessKey)\n : generateRandomAccessKey();\n\n // Make sure the access key isn't picked up directly from the attributes for the next steps\n delete attributes.accessKey;\n\n assertTokenPermissionsValidity(attributes);\n assertValidLifespan(attributes.lifespan);\n\n const result = (await strapi.db.transaction(async () => {\n const transferToken = await strapi.db.query(TRANSFER_TOKEN_UID).create({\n select: SELECT_FIELDS,\n populate: POPULATE_FIELDS,\n data: {\n ...omit('permissions', attributes),\n accessKey: hash(accessKey),\n ...getExpirationFields(attributes.lifespan),\n },\n });\n\n await Promise.all(\n uniq(attributes.permissions).map((action) =>\n strapi.db\n .query(TRANSFER_TOKEN_PERMISSION_UID)\n .create({ data: { action, token: transferToken } })\n )\n );\n\n const currentPermissions: TransferTokenPermission[] = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(transferToken, 'permissions');\n\n if (currentPermissions) {\n Object.assign(transferToken, { permissions: map('action', currentPermissions) });\n }\n\n return transferToken;\n })) as TransferToken;\n\n await emitAudit({ strapi }, AUDITED_EVENTS.TOKEN_CREATE, {\n tokenId: result.id,\n name: result.name,\n kind: 'transfer',\n description: result.description ?? null,\n lifespan: result.lifespan,\n expiresAt: result.expiresAt,\n permissions: result.permissions ?? [],\n });\n\n return { ...result, accessKey };\n};\n\n/**\n * Update a token and its permissions\n */\nconst update = async (\n id: string | number,\n attributes: TokenUpdatePayload\n): Promise<SanitizedTransferToken> => {\n // Populated with its permissions: the audit row for this update lists what changed,\n // so the state before the write is needed.\n const originalToken: DatabaseTransferToken | null = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .findOne({ where: { id }, populate: POPULATE_FIELDS });\n\n if (!originalToken) {\n throw new NotFoundError('Token not found');\n }\n\n assertTokenPermissionsValidity(attributes);\n assertValidLifespan(attributes.lifespan);\n\n const updated = (await strapi.db.transaction(async () => {\n const updatedToken = await strapi.db.query(TRANSFER_TOKEN_UID).update({\n select: SELECT_FIELDS,\n where: { id },\n data: {\n ...omit('permissions', attributes),\n },\n });\n\n if (attributes.permissions) {\n const currentPermissionsResult = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(updatedToken, 'permissions');\n\n const currentPermissions = map('action', currentPermissionsResult || []);\n const newPermissions = uniq(attributes.permissions);\n\n const actionsToDelete = difference(currentPermissions, newPermissions);\n const actionsToAdd = difference(newPermissions, currentPermissions);\n\n // TODO: improve efficiency here\n // method using a loop -- works but very inefficient\n await Promise.all(\n actionsToDelete.map((action) =>\n strapi.db.query(TRANSFER_TOKEN_PERMISSION_UID).delete({\n where: { action, token: id },\n })\n )\n );\n\n // TODO: improve efficiency here\n // using a loop -- works but very inefficient\n await Promise.all(\n actionsToAdd.map((action) =>\n strapi.db.query(TRANSFER_TOKEN_PERMISSION_UID).create({\n data: { action, token: id },\n })\n )\n );\n }\n\n // retrieve permissions\n const permissionsFromDb: TransferTokenPermission[] = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(updatedToken, 'permissions');\n\n return {\n ...updatedToken,\n permissions: permissionsFromDb ? permissionsFromDb.map((p) => p.action) : undefined,\n };\n })) as SanitizedTransferToken;\n\n const changes = getTokenChanges(\n {\n name: originalToken.name,\n description: originalToken.description,\n permissions: toActionRefs(originalToken.permissions),\n },\n { name: updated.name, description: updated.description, permissions: updated.permissions ?? [] }\n );\n\n if (Object.keys(changes).length > 0) {\n await emitAudit({ strapi }, AUDITED_EVENTS.TOKEN_UPDATE, {\n tokenId: originalToken.id,\n name: updated.name,\n kind: 'transfer',\n changes,\n });\n }\n\n return updated;\n};\n\n/**\n * Revoke (delete) a token\n */\nconst revoke = async (id: string | number): Promise<SanitizedTransferToken> => {\n const deleted = (await strapi.db.transaction(async () =>\n strapi.db\n .query(TRANSFER_TOKEN_UID)\n .delete({ select: SELECT_FIELDS, populate: POPULATE_FIELDS, where: { id } })\n )) as SanitizedTransferToken | null;\n\n if (deleted) {\n await emitAudit({ strapi }, AUDITED_EVENTS.TOKEN_DELETE, {\n tokenId: deleted.id,\n name: deleted.name,\n kind: 'transfer',\n });\n }\n\n return deleted as SanitizedTransferToken;\n};\n\n/**\n * Get a token\n */\nconst getBy = async (\n whereParams = {} as {\n id?: string | number;\n name?: string;\n lastUsedAt?: number;\n description?: string;\n accessKey?: string;\n }\n): Promise<SanitizedTransferToken | null> => {\n if (Object.keys(whereParams).length === 0) {\n return null;\n }\n\n const token = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .findOne({ select: SELECT_FIELDS, populate: POPULATE_FIELDS, where: whereParams });\n\n if (!token) {\n return token;\n }\n\n return flattenTokenPermissions(token);\n};\n\n/**\n * Retrieve a token by id\n */\nconst getById = async (id: string | number): Promise<SanitizedTransferToken | null> => {\n return getBy({ id });\n};\n\n/**\n * Retrieve a token by name\n */\nconst getByName = async (name: string): Promise<SanitizedTransferToken | null> => {\n return getBy({ name });\n};\n\n/**\n * Check if token exists\n */\nconst exists = async (\n whereParams = {} as {\n id?: string | number;\n name?: string;\n lastUsedAt?: number;\n description?: string;\n accessKey?: string;\n }\n): Promise<boolean> => {\n const transferToken = await getBy(whereParams);\n\n return !!transferToken;\n};\n\nconst regenerate = async (id: string | number): Promise<TransferToken> => {\n const accessKey = crypto.randomBytes(128).toString('hex');\n const transferToken = (await strapi.db.transaction(async () =>\n strapi.db.query(TRANSFER_TOKEN_UID).update({\n select: ['id', 'name', 'accessKey'],\n where: { id },\n data: {\n accessKey: hash(accessKey),\n },\n })\n )) as TransferToken;\n\n if (!transferToken) {\n throw new NotFoundError('The provided token id does not exist');\n }\n\n await emitAudit({ strapi }, AUDITED_EVENTS.TOKEN_REGENERATE, {\n tokenId: transferToken.id,\n name: transferToken.name,\n kind: 'transfer',\n });\n\n return {\n ...transferToken,\n accessKey,\n };\n};\n\nconst getExpirationFields = (lifespan: TransferToken['lifespan']) => {\n // it must be nil or a finite number >= 0\n const isValidNumber = isNumber(lifespan) && Number.isFinite(lifespan) && lifespan > 0;\n if (!isValidNumber && !isNil(lifespan)) {\n throw new ValidationError('lifespan must be a positive number or null');\n }\n\n return {\n lifespan: lifespan || null,\n expiresAt: lifespan ? Date.now() + lifespan : null,\n };\n};\n\n/**\n * Return a secure sha512 hash of an accessKey\n */\nconst hash = (accessKey: string): string => {\n const { hasValidTokenSalt } = getService('transfer').utils;\n\n if (!hasValidTokenSalt()) {\n throw new TypeError('Required token salt is not defined');\n }\n\n return crypto\n .createHmac('sha512', strapi.config.get('admin.transfer.token.salt'))\n .update(accessKey)\n .digest('hex');\n};\n\nconst checkSaltIsDefined = () => {\n const { hasValidTokenSalt } = getService('transfer').utils;\n\n // Ignore the check if the data-transfer feature is manually disabled\n if (!strapi.config.get('server.transfer.remote.enabled')) {\n return;\n }\n\n if (!hasValidTokenSalt()) {\n process.emitWarning(\n `Missing transfer.token.salt: Data transfer features have been disabled.\nPlease set transfer.token.salt in config/admin.js (ex: you can generate one using Node with \\`crypto.randomBytes(16).toString('base64')\\`)\nFor security reasons, prefer storing the secret in an environment variable and read it in config/admin.js. See https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/configurations/optional/environment.html#configuration-using-environment-variables.`\n );\n }\n};\n\n/**\n * Flatten a token's database permissions objects to an array of strings\n */\nconst flattenTokenPermissions = (token: DatabaseTransferToken): TransferToken => {\n if (!token) {\n return token;\n }\n\n return {\n ...token,\n permissions: isArray(token.permissions)\n ? map('action', token.permissions as TransferTokenPermission[])\n : token.permissions,\n };\n};\n\n/**\n * Assert that a token's permissions are valid\n */\nconst assertTokenPermissionsValidity = (attributes: TokenUpdatePayload) => {\n const permissionService = strapi.service('admin::transfer').permission;\n const validPermissions = permissionService.providers.action.keys();\n const invalidPermissions = difference(attributes.permissions, validPermissions);\n\n if (!isEmpty(invalidPermissions)) {\n throw new ValidationError(`Unknown permissions provided: ${invalidPermissions.join(', ')}`);\n }\n};\n\n/**\n * Check if a token's lifespan is valid\n */\nconst isValidLifespan = (lifespan: unknown) => {\n if (isNil(lifespan)) {\n return true;\n }\n\n if (\n !isNumber(lifespan) ||\n !Object.values(constants.TRANSFER_TOKEN_LIFESPANS).includes(lifespan)\n ) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Assert that a token's lifespan is valid\n */\nconst assertValidLifespan = (lifespan: unknown) => {\n if (!isValidLifespan(lifespan)) {\n throw new ValidationError(\n `lifespan must be one of the following values:\n ${Object.values(constants.TRANSFER_TOKEN_LIFESPANS).join(', ')}`\n );\n }\n};\n\nexport {\n create,\n list,\n exists,\n getBy,\n getById,\n getByName,\n update,\n revoke,\n regenerate,\n hash,\n checkSaltIsDefined,\n};\n"],"names":["ValidationError","NotFoundError","errors","TRANSFER_TOKEN_UID","TRANSFER_TOKEN_PERMISSION_UID","SELECT_FIELDS","POPULATE_FIELDS","list","tokens","strapi","db","query","findMany","select","populate","orderBy","name","map","token","flattenTokenPermissions","generateRandomAccessKey","crypto","randomBytes","toString","validateAccessKey","accessKey","assert","length","hasAccessKey","attributes","create","assertTokenPermissionsValidity","assertValidLifespan","lifespan","result","transaction","transferToken","data","omit","hash","getExpirationFields","Promise","all","uniq","permissions","action","currentPermissions","load","Object","assign","emitAudit","AUDITED_EVENTS","TOKEN_CREATE","tokenId","id","kind","description","expiresAt","update","originalToken","findOne","where","updated","updatedToken","currentPermissionsResult","newPermissions","actionsToDelete","difference","actionsToAdd","delete","permissionsFromDb","p","undefined","changes","getTokenChanges","toActionRefs","keys","TOKEN_UPDATE","revoke","deleted","TOKEN_DELETE","getBy","whereParams","getById","getByName","exists","regenerate","TOKEN_REGENERATE","isValidNumber","isNumber","Number","isFinite","isNil","Date","now","hasValidTokenSalt","getService","utils","TypeError","createHmac","config","get","digest","checkSaltIsDefined","process","emitWarning","isArray","permissionService","service","permission","validPermissions","providers","invalidPermissions","isEmpty","join","isValidLifespan","values","constants","TRANSFER_TOKEN_LIFESPANS","includes"],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import crypto from 'crypto';
|
|
2
2
|
import assert from 'assert';
|
|
3
3
|
import { omit, uniq, map, difference, isEmpty, isNumber, isNil, isArray } from 'lodash/fp';
|
|
4
|
-
import { errors } from '@strapi/utils';
|
|
4
|
+
import { errors, emitAudit } from '@strapi/utils';
|
|
5
5
|
import '@strapi/types';
|
|
6
6
|
import constants from '../constants.mjs';
|
|
7
7
|
import { getService } from '../../utils/index.mjs';
|
|
8
|
+
import { AUDITED_EVENTS, getTokenChanges, toActionRefs } from '../../audit-logs/tokens.mjs';
|
|
8
9
|
|
|
9
10
|
const { ValidationError, NotFoundError } = errors;
|
|
10
11
|
const TRANSFER_TOKEN_UID = 'admin::transfer-token';
|
|
@@ -80,6 +81,17 @@ const hasAccessKey = (attributes)=>{
|
|
|
80
81
|
}
|
|
81
82
|
return transferToken;
|
|
82
83
|
});
|
|
84
|
+
await emitAudit({
|
|
85
|
+
strapi
|
|
86
|
+
}, AUDITED_EVENTS.TOKEN_CREATE, {
|
|
87
|
+
tokenId: result.id,
|
|
88
|
+
name: result.name,
|
|
89
|
+
kind: 'transfer',
|
|
90
|
+
description: result.description ?? null,
|
|
91
|
+
lifespan: result.lifespan,
|
|
92
|
+
expiresAt: result.expiresAt,
|
|
93
|
+
permissions: result.permissions ?? []
|
|
94
|
+
});
|
|
83
95
|
return {
|
|
84
96
|
...result,
|
|
85
97
|
accessKey
|
|
@@ -88,18 +100,20 @@ const hasAccessKey = (attributes)=>{
|
|
|
88
100
|
/**
|
|
89
101
|
* Update a token and its permissions
|
|
90
102
|
*/ const update = async (id, attributes)=>{
|
|
91
|
-
//
|
|
103
|
+
// Populated with its permissions: the audit row for this update lists what changed,
|
|
104
|
+
// so the state before the write is needed.
|
|
92
105
|
const originalToken = await strapi.db.query(TRANSFER_TOKEN_UID).findOne({
|
|
93
106
|
where: {
|
|
94
107
|
id
|
|
95
|
-
}
|
|
108
|
+
},
|
|
109
|
+
populate: POPULATE_FIELDS
|
|
96
110
|
});
|
|
97
111
|
if (!originalToken) {
|
|
98
112
|
throw new NotFoundError('Token not found');
|
|
99
113
|
}
|
|
100
114
|
assertTokenPermissionsValidity(attributes);
|
|
101
115
|
assertValidLifespan(attributes.lifespan);
|
|
102
|
-
|
|
116
|
+
const updated = await strapi.db.transaction(async ()=>{
|
|
103
117
|
const updatedToken = await strapi.db.query(TRANSFER_TOKEN_UID).update({
|
|
104
118
|
select: SELECT_FIELDS,
|
|
105
119
|
where: {
|
|
@@ -139,17 +153,47 @@ const hasAccessKey = (attributes)=>{
|
|
|
139
153
|
permissions: permissionsFromDb ? permissionsFromDb.map((p)=>p.action) : undefined
|
|
140
154
|
};
|
|
141
155
|
});
|
|
156
|
+
const changes = getTokenChanges({
|
|
157
|
+
name: originalToken.name,
|
|
158
|
+
description: originalToken.description,
|
|
159
|
+
permissions: toActionRefs(originalToken.permissions)
|
|
160
|
+
}, {
|
|
161
|
+
name: updated.name,
|
|
162
|
+
description: updated.description,
|
|
163
|
+
permissions: updated.permissions ?? []
|
|
164
|
+
});
|
|
165
|
+
if (Object.keys(changes).length > 0) {
|
|
166
|
+
await emitAudit({
|
|
167
|
+
strapi
|
|
168
|
+
}, AUDITED_EVENTS.TOKEN_UPDATE, {
|
|
169
|
+
tokenId: originalToken.id,
|
|
170
|
+
name: updated.name,
|
|
171
|
+
kind: 'transfer',
|
|
172
|
+
changes
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
return updated;
|
|
142
176
|
};
|
|
143
177
|
/**
|
|
144
178
|
* Revoke (delete) a token
|
|
145
179
|
*/ const revoke = async (id)=>{
|
|
146
|
-
|
|
180
|
+
const deleted = await strapi.db.transaction(async ()=>strapi.db.query(TRANSFER_TOKEN_UID).delete({
|
|
147
181
|
select: SELECT_FIELDS,
|
|
148
182
|
populate: POPULATE_FIELDS,
|
|
149
183
|
where: {
|
|
150
184
|
id
|
|
151
185
|
}
|
|
152
186
|
}));
|
|
187
|
+
if (deleted) {
|
|
188
|
+
await emitAudit({
|
|
189
|
+
strapi
|
|
190
|
+
}, AUDITED_EVENTS.TOKEN_DELETE, {
|
|
191
|
+
tokenId: deleted.id,
|
|
192
|
+
name: deleted.name,
|
|
193
|
+
kind: 'transfer'
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
return deleted;
|
|
153
197
|
};
|
|
154
198
|
/**
|
|
155
199
|
* Get a token
|
|
@@ -192,6 +236,7 @@ const regenerate = async (id)=>{
|
|
|
192
236
|
const transferToken = await strapi.db.transaction(async ()=>strapi.db.query(TRANSFER_TOKEN_UID).update({
|
|
193
237
|
select: [
|
|
194
238
|
'id',
|
|
239
|
+
'name',
|
|
195
240
|
'accessKey'
|
|
196
241
|
],
|
|
197
242
|
where: {
|
|
@@ -204,6 +249,13 @@ const regenerate = async (id)=>{
|
|
|
204
249
|
if (!transferToken) {
|
|
205
250
|
throw new NotFoundError('The provided token id does not exist');
|
|
206
251
|
}
|
|
252
|
+
await emitAudit({
|
|
253
|
+
strapi
|
|
254
|
+
}, AUDITED_EVENTS.TOKEN_REGENERATE, {
|
|
255
|
+
tokenId: transferToken.id,
|
|
256
|
+
name: transferToken.name,
|
|
257
|
+
kind: 'transfer'
|
|
258
|
+
});
|
|
207
259
|
return {
|
|
208
260
|
...transferToken,
|
|
209
261
|
accessKey
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.mjs","sources":["../../../../../../server/src/services/transfer/token.ts"],"sourcesContent":["import crypto from 'crypto';\nimport assert from 'assert';\nimport { map, isArray, omit, uniq, isNil, difference, isEmpty, isNumber } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport '@strapi/types';\nimport constants from '../constants';\nimport { getService } from '../../utils';\nimport {\n DatabaseTransferToken,\n SanitizedTransferToken,\n TokenCreatePayload,\n TokenUpdatePayload,\n TransferToken,\n TransferTokenPermission,\n} from '../../../../shared/contracts/transfer';\n\nconst { ValidationError, NotFoundError } = errors;\n\nconst TRANSFER_TOKEN_UID = 'admin::transfer-token';\nconst TRANSFER_TOKEN_PERMISSION_UID = 'admin::transfer-token-permission';\n\nconst SELECT_FIELDS = [\n 'id',\n 'name',\n 'description',\n 'lastUsedAt',\n 'lifespan',\n 'expiresAt',\n 'createdAt',\n 'updatedAt',\n] as const;\n\nconst POPULATE_FIELDS = ['permissions'] as const;\n\n/**\n * Return a list of all tokens and their permissions\n */\nconst list = async (): Promise<SanitizedTransferToken[]> => {\n const tokens: DatabaseTransferToken[] = await strapi.db.query(TRANSFER_TOKEN_UID).findMany({\n select: SELECT_FIELDS,\n populate: POPULATE_FIELDS,\n orderBy: { name: 'ASC' },\n });\n\n if (!tokens) return tokens;\n return tokens.map((token) => flattenTokenPermissions(token));\n};\n\n/**\n * Create a random token's access key\n */\nconst generateRandomAccessKey = (): string => crypto.randomBytes(128).toString('hex');\n\n/**\n * Validate the given access key's format and returns it if valid\n */\nconst validateAccessKey = (accessKey: string): string => {\n assert(typeof accessKey === 'string', 'Access key needs to be a string');\n assert(accessKey.length >= 15, 'Access key needs to have at least 15 characters');\n\n return accessKey;\n};\n\nexport const hasAccessKey = <T extends { accessKey?: string }>(\n attributes: T\n): attributes is T & { accessKey: string } => {\n return 'accessKey' in attributes;\n};\n\n/**\n * Create a token and its permissions\n */\nconst create = async (attributes: TokenCreatePayload): Promise<TransferToken> => {\n const accessKey = hasAccessKey(attributes)\n ? validateAccessKey(attributes.accessKey)\n : generateRandomAccessKey();\n\n // Make sure the access key isn't picked up directly from the attributes for the next steps\n delete attributes.accessKey;\n\n assertTokenPermissionsValidity(attributes);\n assertValidLifespan(attributes.lifespan);\n\n const result = (await strapi.db.transaction(async () => {\n const transferToken = await strapi.db.query(TRANSFER_TOKEN_UID).create({\n select: SELECT_FIELDS,\n populate: POPULATE_FIELDS,\n data: {\n ...omit('permissions', attributes),\n accessKey: hash(accessKey),\n ...getExpirationFields(attributes.lifespan),\n },\n });\n\n await Promise.all(\n uniq(attributes.permissions).map((action) =>\n strapi.db\n .query(TRANSFER_TOKEN_PERMISSION_UID)\n .create({ data: { action, token: transferToken } })\n )\n );\n\n const currentPermissions: TransferTokenPermission[] = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(transferToken, 'permissions');\n\n if (currentPermissions) {\n Object.assign(transferToken, { permissions: map('action', currentPermissions) });\n }\n\n return transferToken;\n })) as TransferToken;\n\n return { ...result, accessKey };\n};\n\n/**\n * Update a token and its permissions\n */\nconst update = async (\n id: string | number,\n attributes: TokenUpdatePayload\n): Promise<SanitizedTransferToken> => {\n // retrieve token without permissions\n const originalToken = await strapi.db.query(TRANSFER_TOKEN_UID).findOne({ where: { id } });\n\n if (!originalToken) {\n throw new NotFoundError('Token not found');\n }\n\n assertTokenPermissionsValidity(attributes);\n assertValidLifespan(attributes.lifespan);\n\n return strapi.db.transaction(async () => {\n const updatedToken = await strapi.db.query(TRANSFER_TOKEN_UID).update({\n select: SELECT_FIELDS,\n where: { id },\n data: {\n ...omit('permissions', attributes),\n },\n });\n\n if (attributes.permissions) {\n const currentPermissionsResult = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(updatedToken, 'permissions');\n\n const currentPermissions = map('action', currentPermissionsResult || []);\n const newPermissions = uniq(attributes.permissions);\n\n const actionsToDelete = difference(currentPermissions, newPermissions);\n const actionsToAdd = difference(newPermissions, currentPermissions);\n\n // TODO: improve efficiency here\n // method using a loop -- works but very inefficient\n await Promise.all(\n actionsToDelete.map((action) =>\n strapi.db.query(TRANSFER_TOKEN_PERMISSION_UID).delete({\n where: { action, token: id },\n })\n )\n );\n\n // TODO: improve efficiency here\n // using a loop -- works but very inefficient\n await Promise.all(\n actionsToAdd.map((action) =>\n strapi.db.query(TRANSFER_TOKEN_PERMISSION_UID).create({\n data: { action, token: id },\n })\n )\n );\n }\n\n // retrieve permissions\n const permissionsFromDb: TransferTokenPermission[] = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(updatedToken, 'permissions');\n\n return {\n ...updatedToken,\n permissions: permissionsFromDb ? permissionsFromDb.map((p) => p.action) : undefined,\n };\n }) as unknown as Promise<SanitizedTransferToken>;\n};\n\n/**\n * Revoke (delete) a token\n */\nconst revoke = async (id: string | number): Promise<SanitizedTransferToken> => {\n return strapi.db.transaction(async () =>\n strapi.db\n .query(TRANSFER_TOKEN_UID)\n .delete({ select: SELECT_FIELDS, populate: POPULATE_FIELDS, where: { id } })\n ) as unknown as Promise<SanitizedTransferToken>;\n};\n\n/**\n * Get a token\n */\nconst getBy = async (\n whereParams = {} as {\n id?: string | number;\n name?: string;\n lastUsedAt?: number;\n description?: string;\n accessKey?: string;\n }\n): Promise<SanitizedTransferToken | null> => {\n if (Object.keys(whereParams).length === 0) {\n return null;\n }\n\n const token = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .findOne({ select: SELECT_FIELDS, populate: POPULATE_FIELDS, where: whereParams });\n\n if (!token) {\n return token;\n }\n\n return flattenTokenPermissions(token);\n};\n\n/**\n * Retrieve a token by id\n */\nconst getById = async (id: string | number): Promise<SanitizedTransferToken | null> => {\n return getBy({ id });\n};\n\n/**\n * Retrieve a token by name\n */\nconst getByName = async (name: string): Promise<SanitizedTransferToken | null> => {\n return getBy({ name });\n};\n\n/**\n * Check if token exists\n */\nconst exists = async (\n whereParams = {} as {\n id?: string | number;\n name?: string;\n lastUsedAt?: number;\n description?: string;\n accessKey?: string;\n }\n): Promise<boolean> => {\n const transferToken = await getBy(whereParams);\n\n return !!transferToken;\n};\n\nconst regenerate = async (id: string | number): Promise<TransferToken> => {\n const accessKey = crypto.randomBytes(128).toString('hex');\n const transferToken = (await strapi.db.transaction(async () =>\n strapi.db.query(TRANSFER_TOKEN_UID).update({\n select: ['id', 'accessKey'],\n where: { id },\n data: {\n accessKey: hash(accessKey),\n },\n })\n )) as Promise<TransferToken>;\n\n if (!transferToken) {\n throw new NotFoundError('The provided token id does not exist');\n }\n\n return {\n ...transferToken,\n accessKey,\n };\n};\n\nconst getExpirationFields = (lifespan: TransferToken['lifespan']) => {\n // it must be nil or a finite number >= 0\n const isValidNumber = isNumber(lifespan) && Number.isFinite(lifespan) && lifespan > 0;\n if (!isValidNumber && !isNil(lifespan)) {\n throw new ValidationError('lifespan must be a positive number or null');\n }\n\n return {\n lifespan: lifespan || null,\n expiresAt: lifespan ? Date.now() + lifespan : null,\n };\n};\n\n/**\n * Return a secure sha512 hash of an accessKey\n */\nconst hash = (accessKey: string): string => {\n const { hasValidTokenSalt } = getService('transfer').utils;\n\n if (!hasValidTokenSalt()) {\n throw new TypeError('Required token salt is not defined');\n }\n\n return crypto\n .createHmac('sha512', strapi.config.get('admin.transfer.token.salt'))\n .update(accessKey)\n .digest('hex');\n};\n\nconst checkSaltIsDefined = () => {\n const { hasValidTokenSalt } = getService('transfer').utils;\n\n // Ignore the check if the data-transfer feature is manually disabled\n if (!strapi.config.get('server.transfer.remote.enabled')) {\n return;\n }\n\n if (!hasValidTokenSalt()) {\n process.emitWarning(\n `Missing transfer.token.salt: Data transfer features have been disabled.\nPlease set transfer.token.salt in config/admin.js (ex: you can generate one using Node with \\`crypto.randomBytes(16).toString('base64')\\`)\nFor security reasons, prefer storing the secret in an environment variable and read it in config/admin.js. See https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/configurations/optional/environment.html#configuration-using-environment-variables.`\n );\n }\n};\n\n/**\n * Flatten a token's database permissions objects to an array of strings\n */\nconst flattenTokenPermissions = (token: DatabaseTransferToken): TransferToken => {\n if (!token) {\n return token;\n }\n\n return {\n ...token,\n permissions: isArray(token.permissions)\n ? map('action', token.permissions as TransferTokenPermission[])\n : token.permissions,\n };\n};\n\n/**\n * Assert that a token's permissions are valid\n */\nconst assertTokenPermissionsValidity = (attributes: TokenUpdatePayload) => {\n const permissionService = strapi.service('admin::transfer').permission;\n const validPermissions = permissionService.providers.action.keys();\n const invalidPermissions = difference(attributes.permissions, validPermissions);\n\n if (!isEmpty(invalidPermissions)) {\n throw new ValidationError(`Unknown permissions provided: ${invalidPermissions.join(', ')}`);\n }\n};\n\n/**\n * Check if a token's lifespan is valid\n */\nconst isValidLifespan = (lifespan: unknown) => {\n if (isNil(lifespan)) {\n return true;\n }\n\n if (\n !isNumber(lifespan) ||\n !Object.values(constants.TRANSFER_TOKEN_LIFESPANS).includes(lifespan)\n ) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Assert that a token's lifespan is valid\n */\nconst assertValidLifespan = (lifespan: unknown) => {\n if (!isValidLifespan(lifespan)) {\n throw new ValidationError(\n `lifespan must be one of the following values:\n ${Object.values(constants.TRANSFER_TOKEN_LIFESPANS).join(', ')}`\n );\n }\n};\n\nexport {\n create,\n list,\n exists,\n getBy,\n getById,\n getByName,\n update,\n revoke,\n regenerate,\n hash,\n checkSaltIsDefined,\n};\n"],"names":["ValidationError","NotFoundError","errors","TRANSFER_TOKEN_UID","TRANSFER_TOKEN_PERMISSION_UID","SELECT_FIELDS","POPULATE_FIELDS","list","tokens","strapi","db","query","findMany","select","populate","orderBy","name","map","token","flattenTokenPermissions","generateRandomAccessKey","crypto","randomBytes","toString","validateAccessKey","accessKey","assert","length","hasAccessKey","attributes","create","assertTokenPermissionsValidity","assertValidLifespan","lifespan","result","transaction","transferToken","data","omit","hash","getExpirationFields","Promise","all","uniq","permissions","action","currentPermissions","load","Object","assign","update","id","originalToken","findOne","where","updatedToken","currentPermissionsResult","newPermissions","actionsToDelete","difference","actionsToAdd","delete","permissionsFromDb","p","undefined","revoke","getBy","whereParams","keys","getById","getByName","exists","regenerate","isValidNumber","isNumber","Number","isFinite","isNil","expiresAt","Date","now","hasValidTokenSalt","getService","utils","TypeError","createHmac","config","get","digest","checkSaltIsDefined","process","emitWarning","isArray","permissionService","service","permission","validPermissions","providers","invalidPermissions","isEmpty","join","isValidLifespan","values","constants","TRANSFER_TOKEN_LIFESPANS","includes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"token.mjs","sources":["../../../../../../server/src/services/transfer/token.ts"],"sourcesContent":["import crypto from 'crypto';\nimport assert from 'assert';\nimport { map, isArray, omit, uniq, isNil, difference, isEmpty, isNumber } from 'lodash/fp';\nimport { errors, emitAudit } from '@strapi/utils';\nimport '@strapi/types';\nimport constants from '../constants';\nimport { getService } from '../../utils';\nimport { AUDITED_EVENTS, getTokenChanges, toActionRefs } from '../../audit-logs/tokens';\nimport {\n DatabaseTransferToken,\n SanitizedTransferToken,\n TokenCreatePayload,\n TokenUpdatePayload,\n TransferToken,\n TransferTokenPermission,\n} from '../../../../shared/contracts/transfer';\n\nconst { ValidationError, NotFoundError } = errors;\n\nconst TRANSFER_TOKEN_UID = 'admin::transfer-token';\nconst TRANSFER_TOKEN_PERMISSION_UID = 'admin::transfer-token-permission';\n\nconst SELECT_FIELDS = [\n 'id',\n 'name',\n 'description',\n 'lastUsedAt',\n 'lifespan',\n 'expiresAt',\n 'createdAt',\n 'updatedAt',\n] as const;\n\nconst POPULATE_FIELDS = ['permissions'] as const;\n\n/**\n * Return a list of all tokens and their permissions\n */\nconst list = async (): Promise<SanitizedTransferToken[]> => {\n const tokens: DatabaseTransferToken[] = await strapi.db.query(TRANSFER_TOKEN_UID).findMany({\n select: SELECT_FIELDS,\n populate: POPULATE_FIELDS,\n orderBy: { name: 'ASC' },\n });\n\n if (!tokens) return tokens;\n return tokens.map((token) => flattenTokenPermissions(token));\n};\n\n/**\n * Create a random token's access key\n */\nconst generateRandomAccessKey = (): string => crypto.randomBytes(128).toString('hex');\n\n/**\n * Validate the given access key's format and returns it if valid\n */\nconst validateAccessKey = (accessKey: string): string => {\n assert(typeof accessKey === 'string', 'Access key needs to be a string');\n assert(accessKey.length >= 15, 'Access key needs to have at least 15 characters');\n\n return accessKey;\n};\n\nexport const hasAccessKey = <T extends { accessKey?: string }>(\n attributes: T\n): attributes is T & { accessKey: string } => {\n return 'accessKey' in attributes;\n};\n\n/**\n * Create a token and its permissions\n */\nconst create = async (attributes: TokenCreatePayload): Promise<TransferToken> => {\n const accessKey = hasAccessKey(attributes)\n ? validateAccessKey(attributes.accessKey)\n : generateRandomAccessKey();\n\n // Make sure the access key isn't picked up directly from the attributes for the next steps\n delete attributes.accessKey;\n\n assertTokenPermissionsValidity(attributes);\n assertValidLifespan(attributes.lifespan);\n\n const result = (await strapi.db.transaction(async () => {\n const transferToken = await strapi.db.query(TRANSFER_TOKEN_UID).create({\n select: SELECT_FIELDS,\n populate: POPULATE_FIELDS,\n data: {\n ...omit('permissions', attributes),\n accessKey: hash(accessKey),\n ...getExpirationFields(attributes.lifespan),\n },\n });\n\n await Promise.all(\n uniq(attributes.permissions).map((action) =>\n strapi.db\n .query(TRANSFER_TOKEN_PERMISSION_UID)\n .create({ data: { action, token: transferToken } })\n )\n );\n\n const currentPermissions: TransferTokenPermission[] = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(transferToken, 'permissions');\n\n if (currentPermissions) {\n Object.assign(transferToken, { permissions: map('action', currentPermissions) });\n }\n\n return transferToken;\n })) as TransferToken;\n\n await emitAudit({ strapi }, AUDITED_EVENTS.TOKEN_CREATE, {\n tokenId: result.id,\n name: result.name,\n kind: 'transfer',\n description: result.description ?? null,\n lifespan: result.lifespan,\n expiresAt: result.expiresAt,\n permissions: result.permissions ?? [],\n });\n\n return { ...result, accessKey };\n};\n\n/**\n * Update a token and its permissions\n */\nconst update = async (\n id: string | number,\n attributes: TokenUpdatePayload\n): Promise<SanitizedTransferToken> => {\n // Populated with its permissions: the audit row for this update lists what changed,\n // so the state before the write is needed.\n const originalToken: DatabaseTransferToken | null = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .findOne({ where: { id }, populate: POPULATE_FIELDS });\n\n if (!originalToken) {\n throw new NotFoundError('Token not found');\n }\n\n assertTokenPermissionsValidity(attributes);\n assertValidLifespan(attributes.lifespan);\n\n const updated = (await strapi.db.transaction(async () => {\n const updatedToken = await strapi.db.query(TRANSFER_TOKEN_UID).update({\n select: SELECT_FIELDS,\n where: { id },\n data: {\n ...omit('permissions', attributes),\n },\n });\n\n if (attributes.permissions) {\n const currentPermissionsResult = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(updatedToken, 'permissions');\n\n const currentPermissions = map('action', currentPermissionsResult || []);\n const newPermissions = uniq(attributes.permissions);\n\n const actionsToDelete = difference(currentPermissions, newPermissions);\n const actionsToAdd = difference(newPermissions, currentPermissions);\n\n // TODO: improve efficiency here\n // method using a loop -- works but very inefficient\n await Promise.all(\n actionsToDelete.map((action) =>\n strapi.db.query(TRANSFER_TOKEN_PERMISSION_UID).delete({\n where: { action, token: id },\n })\n )\n );\n\n // TODO: improve efficiency here\n // using a loop -- works but very inefficient\n await Promise.all(\n actionsToAdd.map((action) =>\n strapi.db.query(TRANSFER_TOKEN_PERMISSION_UID).create({\n data: { action, token: id },\n })\n )\n );\n }\n\n // retrieve permissions\n const permissionsFromDb: TransferTokenPermission[] = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .load(updatedToken, 'permissions');\n\n return {\n ...updatedToken,\n permissions: permissionsFromDb ? permissionsFromDb.map((p) => p.action) : undefined,\n };\n })) as SanitizedTransferToken;\n\n const changes = getTokenChanges(\n {\n name: originalToken.name,\n description: originalToken.description,\n permissions: toActionRefs(originalToken.permissions),\n },\n { name: updated.name, description: updated.description, permissions: updated.permissions ?? [] }\n );\n\n if (Object.keys(changes).length > 0) {\n await emitAudit({ strapi }, AUDITED_EVENTS.TOKEN_UPDATE, {\n tokenId: originalToken.id,\n name: updated.name,\n kind: 'transfer',\n changes,\n });\n }\n\n return updated;\n};\n\n/**\n * Revoke (delete) a token\n */\nconst revoke = async (id: string | number): Promise<SanitizedTransferToken> => {\n const deleted = (await strapi.db.transaction(async () =>\n strapi.db\n .query(TRANSFER_TOKEN_UID)\n .delete({ select: SELECT_FIELDS, populate: POPULATE_FIELDS, where: { id } })\n )) as SanitizedTransferToken | null;\n\n if (deleted) {\n await emitAudit({ strapi }, AUDITED_EVENTS.TOKEN_DELETE, {\n tokenId: deleted.id,\n name: deleted.name,\n kind: 'transfer',\n });\n }\n\n return deleted as SanitizedTransferToken;\n};\n\n/**\n * Get a token\n */\nconst getBy = async (\n whereParams = {} as {\n id?: string | number;\n name?: string;\n lastUsedAt?: number;\n description?: string;\n accessKey?: string;\n }\n): Promise<SanitizedTransferToken | null> => {\n if (Object.keys(whereParams).length === 0) {\n return null;\n }\n\n const token = await strapi.db\n .query(TRANSFER_TOKEN_UID)\n .findOne({ select: SELECT_FIELDS, populate: POPULATE_FIELDS, where: whereParams });\n\n if (!token) {\n return token;\n }\n\n return flattenTokenPermissions(token);\n};\n\n/**\n * Retrieve a token by id\n */\nconst getById = async (id: string | number): Promise<SanitizedTransferToken | null> => {\n return getBy({ id });\n};\n\n/**\n * Retrieve a token by name\n */\nconst getByName = async (name: string): Promise<SanitizedTransferToken | null> => {\n return getBy({ name });\n};\n\n/**\n * Check if token exists\n */\nconst exists = async (\n whereParams = {} as {\n id?: string | number;\n name?: string;\n lastUsedAt?: number;\n description?: string;\n accessKey?: string;\n }\n): Promise<boolean> => {\n const transferToken = await getBy(whereParams);\n\n return !!transferToken;\n};\n\nconst regenerate = async (id: string | number): Promise<TransferToken> => {\n const accessKey = crypto.randomBytes(128).toString('hex');\n const transferToken = (await strapi.db.transaction(async () =>\n strapi.db.query(TRANSFER_TOKEN_UID).update({\n select: ['id', 'name', 'accessKey'],\n where: { id },\n data: {\n accessKey: hash(accessKey),\n },\n })\n )) as TransferToken;\n\n if (!transferToken) {\n throw new NotFoundError('The provided token id does not exist');\n }\n\n await emitAudit({ strapi }, AUDITED_EVENTS.TOKEN_REGENERATE, {\n tokenId: transferToken.id,\n name: transferToken.name,\n kind: 'transfer',\n });\n\n return {\n ...transferToken,\n accessKey,\n };\n};\n\nconst getExpirationFields = (lifespan: TransferToken['lifespan']) => {\n // it must be nil or a finite number >= 0\n const isValidNumber = isNumber(lifespan) && Number.isFinite(lifespan) && lifespan > 0;\n if (!isValidNumber && !isNil(lifespan)) {\n throw new ValidationError('lifespan must be a positive number or null');\n }\n\n return {\n lifespan: lifespan || null,\n expiresAt: lifespan ? Date.now() + lifespan : null,\n };\n};\n\n/**\n * Return a secure sha512 hash of an accessKey\n */\nconst hash = (accessKey: string): string => {\n const { hasValidTokenSalt } = getService('transfer').utils;\n\n if (!hasValidTokenSalt()) {\n throw new TypeError('Required token salt is not defined');\n }\n\n return crypto\n .createHmac('sha512', strapi.config.get('admin.transfer.token.salt'))\n .update(accessKey)\n .digest('hex');\n};\n\nconst checkSaltIsDefined = () => {\n const { hasValidTokenSalt } = getService('transfer').utils;\n\n // Ignore the check if the data-transfer feature is manually disabled\n if (!strapi.config.get('server.transfer.remote.enabled')) {\n return;\n }\n\n if (!hasValidTokenSalt()) {\n process.emitWarning(\n `Missing transfer.token.salt: Data transfer features have been disabled.\nPlease set transfer.token.salt in config/admin.js (ex: you can generate one using Node with \\`crypto.randomBytes(16).toString('base64')\\`)\nFor security reasons, prefer storing the secret in an environment variable and read it in config/admin.js. See https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/configurations/optional/environment.html#configuration-using-environment-variables.`\n );\n }\n};\n\n/**\n * Flatten a token's database permissions objects to an array of strings\n */\nconst flattenTokenPermissions = (token: DatabaseTransferToken): TransferToken => {\n if (!token) {\n return token;\n }\n\n return {\n ...token,\n permissions: isArray(token.permissions)\n ? map('action', token.permissions as TransferTokenPermission[])\n : token.permissions,\n };\n};\n\n/**\n * Assert that a token's permissions are valid\n */\nconst assertTokenPermissionsValidity = (attributes: TokenUpdatePayload) => {\n const permissionService = strapi.service('admin::transfer').permission;\n const validPermissions = permissionService.providers.action.keys();\n const invalidPermissions = difference(attributes.permissions, validPermissions);\n\n if (!isEmpty(invalidPermissions)) {\n throw new ValidationError(`Unknown permissions provided: ${invalidPermissions.join(', ')}`);\n }\n};\n\n/**\n * Check if a token's lifespan is valid\n */\nconst isValidLifespan = (lifespan: unknown) => {\n if (isNil(lifespan)) {\n return true;\n }\n\n if (\n !isNumber(lifespan) ||\n !Object.values(constants.TRANSFER_TOKEN_LIFESPANS).includes(lifespan)\n ) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Assert that a token's lifespan is valid\n */\nconst assertValidLifespan = (lifespan: unknown) => {\n if (!isValidLifespan(lifespan)) {\n throw new ValidationError(\n `lifespan must be one of the following values:\n ${Object.values(constants.TRANSFER_TOKEN_LIFESPANS).join(', ')}`\n );\n }\n};\n\nexport {\n create,\n list,\n exists,\n getBy,\n getById,\n getByName,\n update,\n revoke,\n regenerate,\n hash,\n checkSaltIsDefined,\n};\n"],"names":["ValidationError","NotFoundError","errors","TRANSFER_TOKEN_UID","TRANSFER_TOKEN_PERMISSION_UID","SELECT_FIELDS","POPULATE_FIELDS","list","tokens","strapi","db","query","findMany","select","populate","orderBy","name","map","token","flattenTokenPermissions","generateRandomAccessKey","crypto","randomBytes","toString","validateAccessKey","accessKey","assert","length","hasAccessKey","attributes","create","assertTokenPermissionsValidity","assertValidLifespan","lifespan","result","transaction","transferToken","data","omit","hash","getExpirationFields","Promise","all","uniq","permissions","action","currentPermissions","load","Object","assign","emitAudit","AUDITED_EVENTS","TOKEN_CREATE","tokenId","id","kind","description","expiresAt","update","originalToken","findOne","where","updated","updatedToken","currentPermissionsResult","newPermissions","actionsToDelete","difference","actionsToAdd","delete","permissionsFromDb","p","undefined","changes","getTokenChanges","toActionRefs","keys","TOKEN_UPDATE","revoke","deleted","TOKEN_DELETE","getBy","whereParams","getById","getByName","exists","regenerate","TOKEN_REGENERATE","isValidNumber","isNumber","Number","isFinite","isNil","Date","now","hasValidTokenSalt","getService","utils","TypeError","createHmac","config","get","digest","checkSaltIsDefined","process","emitWarning","isArray","permissionService","service","permission","validPermissions","providers","invalidPermissions","isEmpty","join","isValidLifespan","values","constants","TRANSFER_TOKEN_LIFESPANS","includes"],"mappings":";;;;;;;;;AAiBA,MAAM,EAAEA,eAAe,EAAEC,aAAa,EAAE,GAAGC,MAAAA;AAE3C,MAAMC,kBAAAA,GAAqB,uBAAA;AAC3B,MAAMC,6BAAAA,GAAgC,kCAAA;AAEtC,MAAMC,aAAAA,GAAgB;AACpB,IAAA,IAAA;AACA,IAAA,MAAA;AACA,IAAA,aAAA;AACA,IAAA,YAAA;AACA,IAAA,UAAA;AACA,IAAA,WAAA;AACA,IAAA,WAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,eAAAA,GAAkB;AAAC,IAAA;AAAc,CAAA;AAEvC;;AAEC,UACKC,IAAAA,GAAO,UAAA;IACX,MAAMC,MAAAA,GAAkC,MAAMC,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACR,kBAAAA,CAAAA,CAAoBS,QAAQ,CAAC;QACzFC,MAAAA,EAAQR,aAAAA;QACRS,QAAAA,EAAUR,eAAAA;QACVS,OAAAA,EAAS;YAAEC,IAAAA,EAAM;AAAM;AACzB,KAAA,CAAA;IAEA,IAAI,CAACR,QAAQ,OAAOA,MAAAA;AACpB,IAAA,OAAOA,MAAAA,CAAOS,GAAG,CAAC,CAACC,QAAUC,uBAAAA,CAAwBD,KAAAA,CAAAA,CAAAA;AACvD;AAEA;;IAGA,MAAME,0BAA0B,IAAcC,MAAAA,CAAOC,WAAW,CAAC,GAAA,CAAA,CAAKC,QAAQ,CAAC,KAAA,CAAA;AAE/E;;IAGA,MAAMC,oBAAoB,CAACC,SAAAA,GAAAA;IACzBC,MAAAA,CAAO,OAAOD,cAAc,QAAA,EAAU,iCAAA,CAAA;IACtCC,MAAAA,CAAOD,SAAAA,CAAUE,MAAM,IAAI,EAAA,EAAI,iDAAA,CAAA;IAE/B,OAAOF,SAAAA;AACT,CAAA;AAEO,MAAMG,eAAe,CAC1BC,UAAAA,GAAAA;AAEA,IAAA,OAAO,WAAA,IAAeA,UAAAA;AACxB;AAEA;;IAGA,MAAMC,SAAS,OAAOD,UAAAA,GAAAA;AACpB,IAAA,MAAMJ,YAAYG,YAAAA,CAAaC,UAAAA,CAAAA,GAC3BL,iBAAAA,CAAkBK,UAAAA,CAAWJ,SAAS,CAAA,GACtCL,uBAAAA,EAAAA;;AAGJ,IAAA,OAAOS,WAAWJ,SAAS;IAE3BM,8BAAAA,CAA+BF,UAAAA,CAAAA;AAC/BG,IAAAA,mBAAAA,CAAoBH,WAAWI,QAAQ,CAAA;AAEvC,IAAA,MAAMC,SAAU,MAAMzB,MAAAA,CAAOC,EAAE,CAACyB,WAAW,CAAC,UAAA;QAC1C,MAAMC,aAAAA,GAAgB,MAAM3B,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACR,kBAAAA,CAAAA,CAAoB2B,MAAM,CAAC;YACrEjB,MAAAA,EAAQR,aAAAA;YACRS,QAAAA,EAAUR,eAAAA;YACV+B,IAAAA,EAAM;gBACJ,GAAGC,IAAAA,CAAK,eAAeT,UAAAA,CAAW;AAClCJ,gBAAAA,SAAAA,EAAWc,IAAAA,CAAKd,SAAAA,CAAAA;gBAChB,GAAGe,mBAAAA,CAAoBX,UAAAA,CAAWI,QAAQ;AAC5C;AACF,SAAA,CAAA;AAEA,QAAA,MAAMQ,QAAQC,GAAG,CACfC,KAAKd,UAAAA,CAAWe,WAAW,EAAE3B,GAAG,CAAC,CAAC4B,MAAAA,GAChCpC,OAAOC,EAAE,CACNC,KAAK,CAACP,6BAAAA,CAAAA,CACN0B,MAAM,CAAC;gBAAEO,IAAAA,EAAM;AAAEQ,oBAAAA,MAAAA;oBAAQ3B,KAAAA,EAAOkB;AAAc;AAAE,aAAA,CAAA,CAAA,CAAA;QAIvD,MAAMU,kBAAAA,GAAgD,MAAMrC,MAAAA,CAAOC,EAAE,CAClEC,KAAK,CAACR,kBAAAA,CAAAA,CACN4C,IAAI,CAACX,aAAAA,EAAe,aAAA,CAAA;AAEvB,QAAA,IAAIU,kBAAAA,EAAoB;YACtBE,MAAAA,CAAOC,MAAM,CAACb,aAAAA,EAAe;AAAEQ,gBAAAA,WAAAA,EAAa3B,IAAI,QAAA,EAAU6B,kBAAAA;AAAoB,aAAA,CAAA;AAChF,QAAA;QAEA,OAAOV,aAAAA;AACT,IAAA,CAAA,CAAA;AAEA,IAAA,MAAMc,SAAAA,CAAU;AAAEzC,QAAAA;KAAO,EAAG0C,cAAAA,CAAeC,YAAY,EAAE;AACvDC,QAAAA,OAAAA,EAASnB,OAAOoB,EAAE;AAClBtC,QAAAA,IAAAA,EAAMkB,OAAOlB,IAAI;QACjBuC,IAAAA,EAAM,UAAA;QACNC,WAAAA,EAAatB,MAAAA,CAAOsB,WAAW,IAAI,IAAA;AACnCvB,QAAAA,QAAAA,EAAUC,OAAOD,QAAQ;AACzBwB,QAAAA,SAAAA,EAAWvB,OAAOuB,SAAS;QAC3Bb,WAAAA,EAAaV,MAAAA,CAAOU,WAAW,IAAI;AACrC,KAAA,CAAA;IAEA,OAAO;AAAE,QAAA,GAAGV,MAAM;AAAET,QAAAA;AAAU,KAAA;AAChC;AAEA;;IAGA,MAAMiC,MAAAA,GAAS,OACbJ,EAAAA,EACAzB,UAAAA,GAAAA;;;IAIA,MAAM8B,aAAAA,GAA8C,MAAMlD,MAAAA,CAAOC,EAAE,CAChEC,KAAK,CAACR,kBAAAA,CAAAA,CACNyD,OAAO,CAAC;QAAEC,KAAAA,EAAO;AAAEP,YAAAA;AAAG,SAAA;QAAGxC,QAAAA,EAAUR;AAAgB,KAAA,CAAA;AAEtD,IAAA,IAAI,CAACqD,aAAAA,EAAe;AAClB,QAAA,MAAM,IAAI1D,aAAAA,CAAc,iBAAA,CAAA;AAC1B,IAAA;IAEA8B,8BAAAA,CAA+BF,UAAAA,CAAAA;AAC/BG,IAAAA,mBAAAA,CAAoBH,WAAWI,QAAQ,CAAA;AAEvC,IAAA,MAAM6B,UAAW,MAAMrD,MAAAA,CAAOC,EAAE,CAACyB,WAAW,CAAC,UAAA;QAC3C,MAAM4B,YAAAA,GAAe,MAAMtD,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACR,kBAAAA,CAAAA,CAAoBuD,MAAM,CAAC;YACpE7C,MAAAA,EAAQR,aAAAA;YACRwD,KAAAA,EAAO;AAAEP,gBAAAA;AAAG,aAAA;YACZjB,IAAAA,EAAM;gBACJ,GAAGC,IAAAA,CAAK,eAAeT,UAAAA;AACzB;AACF,SAAA,CAAA;QAEA,IAAIA,UAAAA,CAAWe,WAAW,EAAE;YAC1B,MAAMoB,wBAAAA,GAA2B,MAAMvD,MAAAA,CAAOC,EAAE,CAC7CC,KAAK,CAACR,kBAAAA,CAAAA,CACN4C,IAAI,CAACgB,YAAAA,EAAc,aAAA,CAAA;AAEtB,YAAA,MAAMjB,kBAAAA,GAAqB7B,GAAAA,CAAI,QAAA,EAAU+C,wBAAAA,IAA4B,EAAE,CAAA;YACvE,MAAMC,cAAAA,GAAiBtB,IAAAA,CAAKd,UAAAA,CAAWe,WAAW,CAAA;YAElD,MAAMsB,eAAAA,GAAkBC,WAAWrB,kBAAAA,EAAoBmB,cAAAA,CAAAA;YACvD,MAAMG,YAAAA,GAAeD,WAAWF,cAAAA,EAAgBnB,kBAAAA,CAAAA;;;AAIhD,YAAA,MAAML,OAAAA,CAAQC,GAAG,CACfwB,eAAAA,CAAgBjD,GAAG,CAAC,CAAC4B,MAAAA,GACnBpC,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACP,6BAAAA,CAAAA,CAA+BiE,MAAM,CAAC;oBACpDR,KAAAA,EAAO;AAAEhB,wBAAAA,MAAAA;wBAAQ3B,KAAAA,EAAOoC;AAAG;AAC7B,iBAAA,CAAA,CAAA,CAAA;;;AAMJ,YAAA,MAAMb,OAAAA,CAAQC,GAAG,CACf0B,YAAAA,CAAanD,GAAG,CAAC,CAAC4B,MAAAA,GAChBpC,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACP,6BAAAA,CAAAA,CAA+B0B,MAAM,CAAC;oBACpDO,IAAAA,EAAM;AAAEQ,wBAAAA,MAAAA;wBAAQ3B,KAAAA,EAAOoC;AAAG;AAC5B,iBAAA,CAAA,CAAA,CAAA;AAGN,QAAA;;QAGA,MAAMgB,iBAAAA,GAA+C,MAAM7D,MAAAA,CAAOC,EAAE,CACjEC,KAAK,CAACR,kBAAAA,CAAAA,CACN4C,IAAI,CAACgB,YAAAA,EAAc,aAAA,CAAA;QAEtB,OAAO;AACL,YAAA,GAAGA,YAAY;YACfnB,WAAAA,EAAa0B,iBAAAA,GAAoBA,kBAAkBrD,GAAG,CAAC,CAACsD,CAAAA,GAAMA,CAAAA,CAAE1B,MAAM,CAAA,GAAI2B;AAC5E,SAAA;AACF,IAAA,CAAA,CAAA;AAEA,IAAA,MAAMC,UAAUC,eAAAA,CACd;AACE1D,QAAAA,IAAAA,EAAM2C,cAAc3C,IAAI;AACxBwC,QAAAA,WAAAA,EAAaG,cAAcH,WAAW;QACtCZ,WAAAA,EAAa+B,YAAAA,CAAahB,cAAcf,WAAW;KACrD,EACA;AAAE5B,QAAAA,IAAAA,EAAM8C,QAAQ9C,IAAI;AAAEwC,QAAAA,WAAAA,EAAaM,QAAQN,WAAW;QAAEZ,WAAAA,EAAakB,OAAAA,CAAQlB,WAAW,IAAI;AAAG,KAAA,CAAA;AAGjG,IAAA,IAAII,OAAO4B,IAAI,CAACH,OAAAA,CAAAA,CAAS9C,MAAM,GAAG,CAAA,EAAG;AACnC,QAAA,MAAMuB,SAAAA,CAAU;AAAEzC,YAAAA;SAAO,EAAG0C,cAAAA,CAAe0B,YAAY,EAAE;AACvDxB,YAAAA,OAAAA,EAASM,cAAcL,EAAE;AACzBtC,YAAAA,IAAAA,EAAM8C,QAAQ9C,IAAI;YAClBuC,IAAAA,EAAM,UAAA;AACNkB,YAAAA;AACF,SAAA,CAAA;AACF,IAAA;IAEA,OAAOX,OAAAA;AACT;AAEA;;IAGA,MAAMgB,SAAS,OAAOxB,EAAAA,GAAAA;AACpB,IAAA,MAAMyB,OAAAA,GAAW,MAAMtE,MAAAA,CAAOC,EAAE,CAACyB,WAAW,CAAC,UAC3C1B,MAAAA,CAAOC,EAAE,CACNC,KAAK,CAACR,kBAAAA,CAAAA,CACNkE,MAAM,CAAC;YAAExD,MAAAA,EAAQR,aAAAA;YAAeS,QAAAA,EAAUR,eAAAA;YAAiBuD,KAAAA,EAAO;AAAEP,gBAAAA;AAAG;AAAE,SAAA,CAAA,CAAA;AAG9E,IAAA,IAAIyB,OAAAA,EAAS;AACX,QAAA,MAAM7B,SAAAA,CAAU;AAAEzC,YAAAA;SAAO,EAAG0C,cAAAA,CAAe6B,YAAY,EAAE;AACvD3B,YAAAA,OAAAA,EAAS0B,QAAQzB,EAAE;AACnBtC,YAAAA,IAAAA,EAAM+D,QAAQ/D,IAAI;YAClBuC,IAAAA,EAAM;AACR,SAAA,CAAA;AACF,IAAA;IAEA,OAAOwB,OAAAA;AACT;AAEA;;AAEC,IACD,MAAME,KAAAA,GAAQ,OACZC,WAAAA,GAAc,EAMb,GAAA;AAED,IAAA,IAAIlC,OAAO4B,IAAI,CAACM,WAAAA,CAAAA,CAAavD,MAAM,KAAK,CAAA,EAAG;QACzC,OAAO,IAAA;AACT,IAAA;IAEA,MAAMT,KAAAA,GAAQ,MAAMT,MAAAA,CAAOC,EAAE,CAC1BC,KAAK,CAACR,kBAAAA,CAAAA,CACNyD,OAAO,CAAC;QAAE/C,MAAAA,EAAQR,aAAAA;QAAeS,QAAAA,EAAUR,eAAAA;QAAiBuD,KAAAA,EAAOqB;AAAY,KAAA,CAAA;AAElF,IAAA,IAAI,CAAChE,KAAAA,EAAO;QACV,OAAOA,KAAAA;AACT,IAAA;AAEA,IAAA,OAAOC,uBAAAA,CAAwBD,KAAAA,CAAAA;AACjC;AAEA;;IAGA,MAAMiE,UAAU,OAAO7B,EAAAA,GAAAA;AACrB,IAAA,OAAO2B,KAAAA,CAAM;AAAE3B,QAAAA;AAAG,KAAA,CAAA;AACpB;AAEA;;IAGA,MAAM8B,YAAY,OAAOpE,IAAAA,GAAAA;AACvB,IAAA,OAAOiE,KAAAA,CAAM;AAAEjE,QAAAA;AAAK,KAAA,CAAA;AACtB;AAEA;;AAEC,IACD,MAAMqE,MAAAA,GAAS,OACbH,WAAAA,GAAc,EAMb,GAAA;IAED,MAAM9C,aAAAA,GAAgB,MAAM6C,KAAAA,CAAMC,WAAAA,CAAAA;AAElC,IAAA,OAAO,CAAC,CAAC9C,aAAAA;AACX;AAEA,MAAMkD,aAAa,OAAOhC,EAAAA,GAAAA;AACxB,IAAA,MAAM7B,YAAYJ,MAAAA,CAAOC,WAAW,CAAC,GAAA,CAAA,CAAKC,QAAQ,CAAC,KAAA,CAAA;AACnD,IAAA,MAAMa,aAAAA,GAAiB,MAAM3B,MAAAA,CAAOC,EAAE,CAACyB,WAAW,CAAC,UACjD1B,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAACR,kBAAAA,CAAAA,CAAoBuD,MAAM,CAAC;YACzC7C,MAAAA,EAAQ;AAAC,gBAAA,IAAA;AAAM,gBAAA,MAAA;AAAQ,gBAAA;AAAY,aAAA;YACnCgD,KAAAA,EAAO;AAAEP,gBAAAA;AAAG,aAAA;YACZjB,IAAAA,EAAM;AACJZ,gBAAAA,SAAAA,EAAWc,IAAAA,CAAKd,SAAAA;AAClB;AACF,SAAA,CAAA,CAAA;AAGF,IAAA,IAAI,CAACW,aAAAA,EAAe;AAClB,QAAA,MAAM,IAAInC,aAAAA,CAAc,sCAAA,CAAA;AAC1B,IAAA;AAEA,IAAA,MAAMiD,SAAAA,CAAU;AAAEzC,QAAAA;KAAO,EAAG0C,cAAAA,CAAeoC,gBAAgB,EAAE;AAC3DlC,QAAAA,OAAAA,EAASjB,cAAckB,EAAE;AACzBtC,QAAAA,IAAAA,EAAMoB,cAAcpB,IAAI;QACxBuC,IAAAA,EAAM;AACR,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,GAAGnB,aAAa;AAChBX,QAAAA;AACF,KAAA;AACF;AAEA,MAAMe,sBAAsB,CAACP,QAAAA,GAAAA;;AAE3B,IAAA,MAAMuD,gBAAgBC,QAAAA,CAASxD,QAAAA,CAAAA,IAAayD,OAAOC,QAAQ,CAAC1D,aAAaA,QAAAA,GAAW,CAAA;AACpF,IAAA,IAAI,CAACuD,aAAAA,IAAiB,CAACI,KAAAA,CAAM3D,QAAAA,CAAAA,EAAW;AACtC,QAAA,MAAM,IAAIjC,eAAAA,CAAgB,4CAAA,CAAA;AAC5B,IAAA;IAEA,OAAO;AACLiC,QAAAA,QAAAA,EAAUA,QAAAA,IAAY,IAAA;AACtBwB,QAAAA,SAAAA,EAAWxB,QAAAA,GAAW4D,IAAAA,CAAKC,GAAG,EAAA,GAAK7D,QAAAA,GAAW;AAChD,KAAA;AACF,CAAA;AAEA;;IAGA,MAAMM,OAAO,CAACd,SAAAA,GAAAA;AACZ,IAAA,MAAM,EAAEsE,iBAAiB,EAAE,GAAGC,UAAAA,CAAW,YAAYC,KAAK;AAE1D,IAAA,IAAI,CAACF,iBAAAA,EAAAA,EAAqB;AACxB,QAAA,MAAM,IAAIG,SAAAA,CAAU,oCAAA,CAAA;AACtB,IAAA;AAEA,IAAA,OAAO7E,MAAAA,CACJ8E,UAAU,CAAC,QAAA,EAAU1F,OAAO2F,MAAM,CAACC,GAAG,CAAC,2BAAA,CAAA,CAAA,CACvC3C,MAAM,CAACjC,SAAAA,CAAAA,CACP6E,MAAM,CAAC,KAAA,CAAA;AACZ;AAEA,MAAMC,kBAAAA,GAAqB,IAAA;AACzB,IAAA,MAAM,EAAER,iBAAiB,EAAE,GAAGC,UAAAA,CAAW,YAAYC,KAAK;;AAG1D,IAAA,IAAI,CAACxF,MAAAA,CAAO2F,MAAM,CAACC,GAAG,CAAC,gCAAA,CAAA,EAAmC;AACxD,QAAA;AACF,IAAA;AAEA,IAAA,IAAI,CAACN,iBAAAA,EAAAA,EAAqB;QACxBS,OAAAA,CAAQC,WAAW,CACjB,CAAC;;uQAEgQ,CAAC,CAAA;AAEtQ,IAAA;AACF;AAEA;;IAGA,MAAMtF,0BAA0B,CAACD,KAAAA,GAAAA;AAC/B,IAAA,IAAI,CAACA,KAAAA,EAAO;QACV,OAAOA,KAAAA;AACT,IAAA;IAEA,OAAO;AACL,QAAA,GAAGA,KAAK;QACR0B,WAAAA,EAAa8D,OAAAA,CAAQxF,KAAAA,CAAM0B,WAAW,CAAA,GAClC3B,GAAAA,CAAI,UAAUC,KAAAA,CAAM0B,WAAW,CAAA,GAC/B1B,KAAAA,CAAM0B;AACZ,KAAA;AACF,CAAA;AAEA;;IAGA,MAAMb,iCAAiC,CAACF,UAAAA,GAAAA;AACtC,IAAA,MAAM8E,iBAAAA,GAAoBlG,MAAAA,CAAOmG,OAAO,CAAC,mBAAmBC,UAAU;AACtE,IAAA,MAAMC,mBAAmBH,iBAAAA,CAAkBI,SAAS,CAAClE,MAAM,CAAC+B,IAAI,EAAA;AAChE,IAAA,MAAMoC,kBAAAA,GAAqB7C,UAAAA,CAAWtC,UAAAA,CAAWe,WAAW,EAAEkE,gBAAAA,CAAAA;IAE9D,IAAI,CAACG,QAAQD,kBAAAA,CAAAA,EAAqB;QAChC,MAAM,IAAIhH,gBAAgB,CAAC,8BAA8B,EAAEgH,kBAAAA,CAAmBE,IAAI,CAAC,IAAA,CAAA,CAAA,CAAO,CAAA;AAC5F,IAAA;AACF,CAAA;AAEA;;IAGA,MAAMC,kBAAkB,CAAClF,QAAAA,GAAAA;AACvB,IAAA,IAAI2D,MAAM3D,QAAAA,CAAAA,EAAW;QACnB,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,IACE,CAACwD,QAAAA,CAASxD,QAAAA,CAAAA,IACV,CAACe,MAAAA,CAAOoE,MAAM,CAACC,SAAAA,CAAUC,wBAAwB,CAAA,CAAEC,QAAQ,CAACtF,QAAAA,CAAAA,EAC5D;QACA,OAAO,KAAA;AACT,IAAA;IAEA,OAAO,IAAA;AACT,CAAA;AAEA;;IAGA,MAAMD,sBAAsB,CAACC,QAAAA,GAAAA;IAC3B,IAAI,CAACkF,gBAAgBlF,QAAAA,CAAAA,EAAW;QAC9B,MAAM,IAAIjC,gBACR,CAAC;MACD,EAAEgD,MAAAA,CAAOoE,MAAM,CAACC,SAAAA,CAAUC,wBAAwB,CAAA,CAAEJ,IAAI,CAAC,IAAA,CAAA,CAAA,CAAO,CAAA;AAEpE,IAAA;AACF,CAAA;;;;"}
|
|
@@ -2,7 +2,9 @@ import type { Core } from '@strapi/types';
|
|
|
2
2
|
declare const createAiAdminService: ({ strapi }: {
|
|
3
3
|
strapi: Core.Strapi;
|
|
4
4
|
}) => {
|
|
5
|
-
|
|
5
|
+
isAvailable: () => boolean;
|
|
6
|
+
isStrapiManagedAiEnabled: () => boolean;
|
|
7
|
+
authorizeCustomProvider: () => boolean;
|
|
6
8
|
getAiFeatureConfig: () => Promise<{
|
|
7
9
|
isAiI18nConfigured: boolean;
|
|
8
10
|
isAiMediaLibraryConfigured: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../../../../server/src/ai/services/ai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../../../../server/src/ai/services/ai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAS1C,QAAA,MAAM,oBAAoB,GAAI,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE;uBAkBvC,OAAO;oCAGM,OAAO;mCAKR,OAAO;;;;;;;;;;;4BAiQjB,MAAM;yBACT,MAAM;gCACC,MAAM;kCACJ,OAAO;0BACf,OAAO;8BACH,MAAM;kCACF,MAAM;8BACV,MAAM;4BACR,MAAM;;0BAVE,MAAM;;CA4CzC,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { Data, Modules } from '@strapi/types';
|
|
2
|
+
import type { Permission } from '../../../shared/contracts/shared';
|
|
3
|
+
export declare const AUDITED_EVENTS: {
|
|
4
|
+
readonly TOKEN_CREATE: "token.create";
|
|
5
|
+
readonly TOKEN_UPDATE: "token.update";
|
|
6
|
+
readonly TOKEN_DELETE: "token.delete";
|
|
7
|
+
readonly TOKEN_REGENERATE: "token.regenerate";
|
|
8
|
+
};
|
|
9
|
+
export type TokenKind = 'content-api' | 'admin' | 'transfer';
|
|
10
|
+
/**
|
|
11
|
+
* A token permission as recorded in the audit log: action, subject and properties.
|
|
12
|
+
* The row id says nothing to an auditor, and conditions are not part of the token:
|
|
13
|
+
* they are copied from the owner's role and cannot be set per token.
|
|
14
|
+
*/
|
|
15
|
+
export interface AdminPermissionRef {
|
|
16
|
+
action: string;
|
|
17
|
+
subject: string | null;
|
|
18
|
+
properties: Permission['properties'];
|
|
19
|
+
}
|
|
20
|
+
export type PermissionRef = string | AdminPermissionRef;
|
|
21
|
+
export declare const toAdminPermissionRefs: (permissions: Array<Pick<Permission, "action" | "subject" | "properties">> | null | undefined) => AdminPermissionRef[];
|
|
22
|
+
export declare const toActionRefs: (permissions: Array<string | {
|
|
23
|
+
action: string;
|
|
24
|
+
}> | null | undefined) => string[];
|
|
25
|
+
/**
|
|
26
|
+
* The owner is recorded as an id: the user object carries the email, which has no place
|
|
27
|
+
* in the log.
|
|
28
|
+
*/
|
|
29
|
+
export interface TokenEvent {
|
|
30
|
+
tokenId: Data.ID;
|
|
31
|
+
name: string;
|
|
32
|
+
kind: TokenKind;
|
|
33
|
+
adminUserOwner?: Data.ID;
|
|
34
|
+
}
|
|
35
|
+
export interface TokenResource extends Modules.AuditLogs.Resource {
|
|
36
|
+
type: TokenKind;
|
|
37
|
+
}
|
|
38
|
+
export interface CreateDetails {
|
|
39
|
+
description: string | null;
|
|
40
|
+
/** Milliseconds. The column is a biginteger and comes back as a string. */
|
|
41
|
+
lifespan: number | null;
|
|
42
|
+
expiresAt: string | null;
|
|
43
|
+
/** content-api only: read-only | full-access | custom */
|
|
44
|
+
type?: string;
|
|
45
|
+
/** content-api (custom), transfer and admin tokens */
|
|
46
|
+
permissions?: PermissionRef[];
|
|
47
|
+
adminUserOwner?: Data.ID;
|
|
48
|
+
}
|
|
49
|
+
export type CreateEvent = TokenEvent & {
|
|
50
|
+
description?: string | null;
|
|
51
|
+
lifespan?: string | number | null;
|
|
52
|
+
expiresAt?: string | number | Date | null;
|
|
53
|
+
type?: string;
|
|
54
|
+
permissions?: PermissionRef[];
|
|
55
|
+
};
|
|
56
|
+
export declare const TOKEN_EDITABLE_FIELDS: readonly ["name", "description", "type"];
|
|
57
|
+
export type TokenChanges = Partial<{
|
|
58
|
+
name: Modules.AuditLogs.FieldChange<string | null>;
|
|
59
|
+
description: Modules.AuditLogs.FieldChange<string | null>;
|
|
60
|
+
type: Modules.AuditLogs.FieldChange<string | null>;
|
|
61
|
+
permissions: Modules.AuditLogs.FieldChange<PermissionRef[]>;
|
|
62
|
+
}>;
|
|
63
|
+
export interface UpdateDetails {
|
|
64
|
+
changes: TokenChanges;
|
|
65
|
+
adminUserOwner?: Data.ID;
|
|
66
|
+
}
|
|
67
|
+
export type UpdateEvent = TokenEvent & {
|
|
68
|
+
changes: TokenChanges;
|
|
69
|
+
};
|
|
70
|
+
export interface TokenSnapshot {
|
|
71
|
+
name?: string | null;
|
|
72
|
+
description?: string | null;
|
|
73
|
+
type?: string | null;
|
|
74
|
+
permissions?: PermissionRef[];
|
|
75
|
+
}
|
|
76
|
+
export declare const getTokenChanges: (previous: TokenSnapshot, next: TokenSnapshot) => TokenChanges;
|
|
77
|
+
/**
|
|
78
|
+
* The part of the audit-logs lifecycle service used here.
|
|
79
|
+
* The full service type lives in the Admin EE package.
|
|
80
|
+
*/
|
|
81
|
+
interface AuditLogsLifecycle {
|
|
82
|
+
registerEvent<TDetails>(name: string, transform: Modules.AuditLogs.EventTransformer<TDetails>): void;
|
|
83
|
+
}
|
|
84
|
+
export declare const registerTokenAuditEvents: (auditLogsLifecycle: AuditLogsLifecycle) => void;
|
|
85
|
+
export {};
|
|
86
|
+
//# sourceMappingURL=tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../../server/src/audit-logs/tokens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAEnE,eAAO,MAAM,cAAc;;;;;CAKjB,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,OAAO,GAAG,UAAU,CAAC;AAE7D;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;CACtC;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,kBAAkB,CAAC;AAExD,eAAO,MAAM,qBAAqB,GAChC,aAAa,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,KAC3F,kBAAkB,EAKhB,CAAC;AAEN,eAAO,MAAM,YAAY,GACvB,aAAa,KAAK,CAAC,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,GAAG,SAAS,KACjE,MAAM,EAGN,CAAC;AAEJ;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,cAAc,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,aAAc,SAAQ,OAAO,CAAC,SAAS,CAAC,QAAQ;IAC/D,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;CAC1B;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG;IACrC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,qBAAqB,0CAA2C,CAAC;AAE9E,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC;IACjC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnD,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1D,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnD,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,CAAC;CAC7D,CAAC,CAAC;AAEH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,YAAY,CAAC;IACtB,cAAc,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;CAC1B;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;CAC/B;AASD,eAAO,MAAM,eAAe,GAAI,UAAU,aAAa,EAAE,MAAM,aAAa,KAAG,YAsB9E,CAAC;AAKF;;;GAGG;AACH,UAAU,kBAAkB;IAC1B,aAAa,CAAC,QAAQ,EACpB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GACtD,IAAI,CAAC;CACT;AAED,eAAO,MAAM,wBAAwB,GAAI,oBAAoB,kBAAkB,SAgD9E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/admin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAenC,OAAO,KAAK,EAEV,kBAAkB,EAMnB,MAAM,iCAAiC,CAAC;AAezC;;GAEG;;;;;;;;;;;;;;;;;;;;;+BA2CgC,OAAO;6BAmBT,OAAO
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/admin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAenC,OAAO,KAAK,EAEV,kBAAkB,EAMnB,MAAM,iCAAiC,CAAC;AAezC;;GAEG;;;;;;;;;;;;;;;;;;;;;+BA2CgC,OAAO;6BAmBT,OAAO;;;;;;;;;;;;;;;;;;;;;;;iBA0EnB,OAAO;;;;2BAmCG,OAAO;;;;;;;AA1KtC,wBAoLE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,wBAeE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":"AAeA,QAAA,IAAI,KAAK;;;;;;;;;;;;;;;;;;;;;;sBAPG,GAAG;;;;;sBAAH,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA6Bu9C,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":"AAeA,QAAA,IAAI,KAAK;;;;;;;;;;;;;;;;;;;;;;sBAPG,GAAG;;;;;sBAAH,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA6Bu9C,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eA3Bn9C,0BAAW,EAAC,wBAAW;gCAN5B,0BAAW,EAAC,wBACtB;;CAqBJ,CAAC;AAUF,eAAe,KAAK,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-token.d.ts","sourceRoot":"","sources":["../../../../server/src/services/api-token.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAQ,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"api-token.d.ts","sourceRoot":"","sources":["../../../../server/src/services/api-token.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../../../server/src/services/transfer/token.ts"],"names":[],"mappings":"AAIA,OAAO,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../../../server/src/services/transfer/token.ts"],"names":[],"mappings":"AAIA,OAAO,eAAe,CAAC;AAIvB,OAAO,EAEL,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EAEd,MAAM,uCAAuC,CAAC;AAoB/C;;GAEG;AACH,QAAA,MAAM,IAAI,QAAa,OAAO,CAAC,sBAAsB,EAAE,CAStD,CAAC;AAiBF,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC3D,YAAY,CAAC,KACZ,UAAU,IAAI,CAAC,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAEvC,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,MAAM,GAAU,YAAY,kBAAkB,KAAG,OAAO,CAAC,aAAa,CAoD3E,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,MAAM,GACV,IAAI,MAAM,GAAG,MAAM,EACnB,YAAY,kBAAkB,KAC7B,OAAO,CAAC,sBAAsB,CAqFhC,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,MAAM,GAAU,IAAI,MAAM,GAAG,MAAM,KAAG,OAAO,CAAC,sBAAsB,CAgBzE,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,KAAK,GACT,cAAoB;IAClB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,KACA,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAcvC,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,OAAO,GAAU,IAAI,MAAM,GAAG,MAAM,KAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAEjF,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,SAAS,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAE5E,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,MAAM,GACV,cAAoB;IAClB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,KACA,OAAO,CAAC,OAAO,CAIjB,CAAC;AAEF,QAAA,MAAM,UAAU,GAAU,IAAI,MAAM,GAAG,MAAM,KAAG,OAAO,CAAC,aAAa,CA0BpE,CAAC;AAeF;;GAEG;AACH,QAAA,MAAM,IAAI,GAAI,WAAW,MAAM,KAAG,MAWjC,CAAC;AAEF,QAAA,MAAM,kBAAkB,YAevB,CAAC;AA6DF,OAAO,EACL,MAAM,EACN,IAAI,EACJ,MAAM,EACN,KAAK,EACL,OAAO,EACP,SAAS,EACT,MAAM,EACN,MAAM,EACN,UAAU,EACV,IAAI,EACJ,kBAAkB,GACnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../shared/contracts/admin.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../shared/contracts/admin.ts"],"names":[],"mappings":"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"}
|