@strapi/admin 5.24.0 → 5.24.2

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.
@@ -93,8 +93,7 @@ const syncAPITokensPermissions = async ()=>{
93
93
  }
94
94
  };
95
95
  var bootstrap = (async ({ strapi: strapi1 })=>{
96
- // Fallback for backward compatibility: if the new maxRefreshTokenLifespan is not set,
97
- // reuse the legacy admin.auth.options.expiresIn value (previously the sole JWT lifespan)
96
+ // Get the merged token options (includes defaults merged with user config)
98
97
  const { options } = token.getTokenOptions();
99
98
  const legacyMaxRefreshFallback = token.expiresInToSeconds(options?.expiresIn) ?? sessionAuth.DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN;
100
99
  const legacyMaxSessionFallback = token.expiresInToSeconds(options?.expiresIn) ?? sessionAuth.DEFAULT_MAX_SESSION_LIFESPAN;
@@ -111,7 +110,10 @@ var bootstrap = (async ({ strapi: strapi1 })=>{
111
110
  maxRefreshTokenLifespan: strapi1.config.get('admin.auth.sessions.maxRefreshTokenLifespan', legacyMaxRefreshFallback),
112
111
  idleRefreshTokenLifespan: strapi1.config.get('admin.auth.sessions.idleRefreshTokenLifespan', sessionAuth.DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN),
113
112
  maxSessionLifespan: strapi1.config.get('admin.auth.sessions.maxSessionLifespan', legacyMaxSessionFallback),
114
- idleSessionLifespan: strapi1.config.get('admin.auth.sessions.idleSessionLifespan', sessionAuth.DEFAULT_IDLE_SESSION_LIFESPAN)
113
+ idleSessionLifespan: strapi1.config.get('admin.auth.sessions.idleSessionLifespan', sessionAuth.DEFAULT_IDLE_SESSION_LIFESPAN),
114
+ algorithm: options?.algorithm,
115
+ // Pass through all JWT options (includes privateKey, publicKey, and any other options)
116
+ jwtOptions: options
115
117
  });
116
118
  await registerAdminConditions();
117
119
  await registerPermissionActions();
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sources":["../../../../server/src/bootstrap.ts"],"sourcesContent":["import { merge, map, difference, uniq } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { getService } from './utils';\nimport { getTokenOptions, expiresInToSeconds } from './services/token';\nimport adminActions from './config/admin-actions';\nimport adminConditions from './config/admin-conditions';\nimport constants from './services/constants';\nimport {\n DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN,\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN,\n DEFAULT_MAX_SESSION_LIFESPAN,\n DEFAULT_IDLE_SESSION_LIFESPAN,\n} from '../../shared/utils/session-auth';\n\nconst defaultAdminAuthSettings = {\n providers: {\n autoRegister: false,\n defaultRole: null,\n ssoLockedRoles: null,\n },\n};\n\nconst registerPermissionActions = async () => {\n await getService('permission').actionProvider.registerMany(adminActions.actions);\n};\n\nconst registerAdminConditions = async () => {\n await getService('permission').conditionProvider.registerMany(adminConditions.conditions);\n};\n\nconst registerModelHooks = () => {\n const { sendDidChangeInterfaceLanguage } = getService('metrics');\n\n strapi.db.lifecycles.subscribe({\n models: ['admin::user'],\n afterCreate: sendDidChangeInterfaceLanguage,\n afterDelete: sendDidChangeInterfaceLanguage,\n afterUpdate({ params }) {\n if (params.data.preferedLanguage) {\n sendDidChangeInterfaceLanguage();\n }\n },\n });\n};\n\nconst syncAuthSettings = async () => {\n const adminStore = await strapi.store({ type: 'core', name: 'admin' });\n const adminAuthSettings = await adminStore.get({ key: 'auth' });\n const newAuthSettings = merge(defaultAdminAuthSettings, adminAuthSettings);\n\n const roleExists = await getService('role').exists({\n id: newAuthSettings.providers.defaultRole,\n });\n\n // Reset the default SSO role if it has been deleted manually\n if (!roleExists) {\n newAuthSettings.providers.defaultRole = null;\n }\n\n await adminStore.set({ key: 'auth', value: newAuthSettings });\n};\n\nconst syncAPITokensPermissions = async () => {\n const validPermissions = strapi.contentAPI.permissions.providers.action.keys();\n const permissionsInDB = await async.pipe(\n strapi.db.query('admin::api-token-permission').findMany,\n map('action')\n )();\n\n const unknownPermissions = uniq(difference(permissionsInDB, validPermissions));\n\n if (unknownPermissions.length > 0) {\n await strapi.db\n .query('admin::api-token-permission')\n .deleteMany({ where: { action: { $in: unknownPermissions } } });\n }\n};\n\n/**\n * Ensures the creation of default API tokens during the app creation.\n *\n * Checks the database for existing users and API tokens:\n * - If there are no users and no API tokens, it creates two default API tokens:\n * 1. A \"Read Only\" API token with permissions for accessing resources.\n * 2. A \"Full Access\" API token with permissions for accessing and modifying resources.\n *\n * @sideEffects Creates new API tokens in the database if conditions are met.\n */\n\nconst createDefaultAPITokensIfNeeded = async () => {\n const userService = getService('user');\n const apiTokenService = getService('api-token');\n\n const usersCount = await userService.count();\n const apiTokenCount = await apiTokenService.count();\n\n if (usersCount === 0 && apiTokenCount === 0) {\n for (const token of constants.DEFAULT_API_TOKENS) {\n await apiTokenService.create(token);\n }\n }\n};\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Fallback for backward compatibility: if the new maxRefreshTokenLifespan is not set,\n // reuse the legacy admin.auth.options.expiresIn value (previously the sole JWT lifespan)\n const { options } = getTokenOptions();\n const legacyMaxRefreshFallback =\n expiresInToSeconds(options?.expiresIn) ?? DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN;\n const legacyMaxSessionFallback =\n expiresInToSeconds(options?.expiresIn) ?? DEFAULT_MAX_SESSION_LIFESPAN;\n\n // Warn if using deprecated legacy expiresIn for new session settings\n const hasLegacyExpires = options?.expiresIn != null;\n const hasNewMaxRefresh = strapi.config.get('admin.auth.sessions.maxRefreshTokenLifespan') != null;\n const hasNewMaxSession = strapi.config.get('admin.auth.sessions.maxSessionLifespan') != null;\n\n if (hasLegacyExpires && (!hasNewMaxRefresh || !hasNewMaxSession)) {\n strapi.log.warn(\n 'admin.auth.options.expiresIn is deprecated and will be removed in Strapi 6. Please configure admin.auth.sessions.maxRefreshTokenLifespan and admin.auth.sessions.maxSessionLifespan.'\n );\n }\n\n strapi.sessionManager.defineOrigin('admin', {\n jwtSecret: strapi.config.get('admin.auth.secret'),\n accessTokenLifespan: strapi.config.get('admin.auth.sessions.accessTokenLifespan', 30 * 60),\n maxRefreshTokenLifespan: strapi.config.get(\n 'admin.auth.sessions.maxRefreshTokenLifespan',\n legacyMaxRefreshFallback\n ),\n idleRefreshTokenLifespan: strapi.config.get(\n 'admin.auth.sessions.idleRefreshTokenLifespan',\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN\n ),\n maxSessionLifespan: strapi.config.get(\n 'admin.auth.sessions.maxSessionLifespan',\n legacyMaxSessionFallback\n ),\n idleSessionLifespan: strapi.config.get(\n 'admin.auth.sessions.idleSessionLifespan',\n DEFAULT_IDLE_SESSION_LIFESPAN\n ),\n });\n\n await registerAdminConditions();\n await registerPermissionActions();\n registerModelHooks();\n\n const permissionService = getService('permission');\n const userService = getService('user');\n const roleService = getService('role');\n const apiTokenService = getService('api-token');\n const transferService = getService('transfer');\n const tokenService = getService('token');\n\n await roleService.createRolesIfNoneExist();\n await roleService.resetSuperAdminPermissions();\n await roleService.displayWarningIfNoSuperAdmin();\n\n await permissionService.cleanPermissionsInDatabase();\n\n await userService.displayWarningIfUsersDontHaveRole();\n\n await syncAuthSettings();\n await syncAPITokensPermissions();\n\n await getService('metrics').sendUpdateProjectInformation(strapi);\n getService('metrics').startCron(strapi);\n\n apiTokenService.checkSaltIsDefined();\n transferService.token.checkSaltIsDefined();\n tokenService.checkSecretIsDefined();\n\n await createDefaultAPITokensIfNeeded();\n};\n"],"names":["defaultAdminAuthSettings","providers","autoRegister","defaultRole","ssoLockedRoles","registerPermissionActions","getService","actionProvider","registerMany","adminActions","actions","registerAdminConditions","conditionProvider","adminConditions","conditions","registerModelHooks","sendDidChangeInterfaceLanguage","strapi","db","lifecycles","subscribe","models","afterCreate","afterDelete","afterUpdate","params","data","preferedLanguage","syncAuthSettings","adminStore","store","type","name","adminAuthSettings","get","key","newAuthSettings","merge","roleExists","exists","id","set","value","syncAPITokensPermissions","validPermissions","contentAPI","permissions","action","keys","permissionsInDB","async","pipe","query","findMany","map","unknownPermissions","uniq","difference","length","deleteMany","where","$in","createDefaultAPITokensIfNeeded","userService","apiTokenService","usersCount","count","apiTokenCount","token","constants","DEFAULT_API_TOKENS","create","options","getTokenOptions","legacyMaxRefreshFallback","expiresInToSeconds","expiresIn","DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN","legacyMaxSessionFallback","DEFAULT_MAX_SESSION_LIFESPAN","hasLegacyExpires","hasNewMaxRefresh","config","hasNewMaxSession","log","warn","sessionManager","defineOrigin","jwtSecret","accessTokenLifespan","maxRefreshTokenLifespan","idleRefreshTokenLifespan","DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN","maxSessionLifespan","idleSessionLifespan","DEFAULT_IDLE_SESSION_LIFESPAN","permissionService","roleService","transferService","tokenService","createRolesIfNoneExist","resetSuperAdminPermissions","displayWarningIfNoSuperAdmin","cleanPermissionsInDatabase","displayWarningIfUsersDontHaveRole","sendUpdateProjectInformation","startCron","checkSaltIsDefined","checkSecretIsDefined"],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap.js","sources":["../../../../server/src/bootstrap.ts"],"sourcesContent":["import { merge, map, difference, uniq } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { getService } from './utils';\nimport { getTokenOptions, expiresInToSeconds } from './services/token';\nimport adminActions from './config/admin-actions';\nimport adminConditions from './config/admin-conditions';\nimport constants from './services/constants';\nimport {\n DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN,\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN,\n DEFAULT_MAX_SESSION_LIFESPAN,\n DEFAULT_IDLE_SESSION_LIFESPAN,\n} from '../../shared/utils/session-auth';\n\nconst defaultAdminAuthSettings = {\n providers: {\n autoRegister: false,\n defaultRole: null,\n ssoLockedRoles: null,\n },\n};\n\nconst registerPermissionActions = async () => {\n await getService('permission').actionProvider.registerMany(adminActions.actions);\n};\n\nconst registerAdminConditions = async () => {\n await getService('permission').conditionProvider.registerMany(adminConditions.conditions);\n};\n\nconst registerModelHooks = () => {\n const { sendDidChangeInterfaceLanguage } = getService('metrics');\n\n strapi.db.lifecycles.subscribe({\n models: ['admin::user'],\n afterCreate: sendDidChangeInterfaceLanguage,\n afterDelete: sendDidChangeInterfaceLanguage,\n afterUpdate({ params }) {\n if (params.data.preferedLanguage) {\n sendDidChangeInterfaceLanguage();\n }\n },\n });\n};\n\nconst syncAuthSettings = async () => {\n const adminStore = await strapi.store({ type: 'core', name: 'admin' });\n const adminAuthSettings = await adminStore.get({ key: 'auth' });\n const newAuthSettings = merge(defaultAdminAuthSettings, adminAuthSettings);\n\n const roleExists = await getService('role').exists({\n id: newAuthSettings.providers.defaultRole,\n });\n\n // Reset the default SSO role if it has been deleted manually\n if (!roleExists) {\n newAuthSettings.providers.defaultRole = null;\n }\n\n await adminStore.set({ key: 'auth', value: newAuthSettings });\n};\n\nconst syncAPITokensPermissions = async () => {\n const validPermissions = strapi.contentAPI.permissions.providers.action.keys();\n const permissionsInDB = await async.pipe(\n strapi.db.query('admin::api-token-permission').findMany,\n map('action')\n )();\n\n const unknownPermissions = uniq(difference(permissionsInDB, validPermissions));\n\n if (unknownPermissions.length > 0) {\n await strapi.db\n .query('admin::api-token-permission')\n .deleteMany({ where: { action: { $in: unknownPermissions } } });\n }\n};\n\n/**\n * Ensures the creation of default API tokens during the app creation.\n *\n * Checks the database for existing users and API tokens:\n * - If there are no users and no API tokens, it creates two default API tokens:\n * 1. A \"Read Only\" API token with permissions for accessing resources.\n * 2. A \"Full Access\" API token with permissions for accessing and modifying resources.\n *\n * @sideEffects Creates new API tokens in the database if conditions are met.\n */\n\nconst createDefaultAPITokensIfNeeded = async () => {\n const userService = getService('user');\n const apiTokenService = getService('api-token');\n\n const usersCount = await userService.count();\n const apiTokenCount = await apiTokenService.count();\n\n if (usersCount === 0 && apiTokenCount === 0) {\n for (const token of constants.DEFAULT_API_TOKENS) {\n await apiTokenService.create(token);\n }\n }\n};\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Get the merged token options (includes defaults merged with user config)\n const { options } = getTokenOptions();\n const legacyMaxRefreshFallback =\n expiresInToSeconds(options?.expiresIn) ?? DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN;\n const legacyMaxSessionFallback =\n expiresInToSeconds(options?.expiresIn) ?? DEFAULT_MAX_SESSION_LIFESPAN;\n\n // Warn if using deprecated legacy expiresIn for new session settings\n const hasLegacyExpires = options?.expiresIn != null;\n const hasNewMaxRefresh = strapi.config.get('admin.auth.sessions.maxRefreshTokenLifespan') != null;\n const hasNewMaxSession = strapi.config.get('admin.auth.sessions.maxSessionLifespan') != null;\n\n if (hasLegacyExpires && (!hasNewMaxRefresh || !hasNewMaxSession)) {\n strapi.log.warn(\n 'admin.auth.options.expiresIn is deprecated and will be removed in Strapi 6. Please configure admin.auth.sessions.maxRefreshTokenLifespan and admin.auth.sessions.maxSessionLifespan.'\n );\n }\n\n strapi.sessionManager.defineOrigin('admin', {\n jwtSecret: strapi.config.get('admin.auth.secret'),\n accessTokenLifespan: strapi.config.get('admin.auth.sessions.accessTokenLifespan', 30 * 60),\n maxRefreshTokenLifespan: strapi.config.get(\n 'admin.auth.sessions.maxRefreshTokenLifespan',\n legacyMaxRefreshFallback\n ),\n idleRefreshTokenLifespan: strapi.config.get(\n 'admin.auth.sessions.idleRefreshTokenLifespan',\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN\n ),\n maxSessionLifespan: strapi.config.get(\n 'admin.auth.sessions.maxSessionLifespan',\n legacyMaxSessionFallback\n ),\n idleSessionLifespan: strapi.config.get(\n 'admin.auth.sessions.idleSessionLifespan',\n DEFAULT_IDLE_SESSION_LIFESPAN\n ),\n algorithm: options?.algorithm,\n // Pass through all JWT options (includes privateKey, publicKey, and any other options)\n jwtOptions: options,\n });\n\n await registerAdminConditions();\n await registerPermissionActions();\n registerModelHooks();\n\n const permissionService = getService('permission');\n const userService = getService('user');\n const roleService = getService('role');\n const apiTokenService = getService('api-token');\n const transferService = getService('transfer');\n const tokenService = getService('token');\n\n await roleService.createRolesIfNoneExist();\n await roleService.resetSuperAdminPermissions();\n await roleService.displayWarningIfNoSuperAdmin();\n\n await permissionService.cleanPermissionsInDatabase();\n\n await userService.displayWarningIfUsersDontHaveRole();\n\n await syncAuthSettings();\n await syncAPITokensPermissions();\n\n await getService('metrics').sendUpdateProjectInformation(strapi);\n getService('metrics').startCron(strapi);\n\n apiTokenService.checkSaltIsDefined();\n transferService.token.checkSaltIsDefined();\n tokenService.checkSecretIsDefined();\n\n await createDefaultAPITokensIfNeeded();\n};\n"],"names":["defaultAdminAuthSettings","providers","autoRegister","defaultRole","ssoLockedRoles","registerPermissionActions","getService","actionProvider","registerMany","adminActions","actions","registerAdminConditions","conditionProvider","adminConditions","conditions","registerModelHooks","sendDidChangeInterfaceLanguage","strapi","db","lifecycles","subscribe","models","afterCreate","afterDelete","afterUpdate","params","data","preferedLanguage","syncAuthSettings","adminStore","store","type","name","adminAuthSettings","get","key","newAuthSettings","merge","roleExists","exists","id","set","value","syncAPITokensPermissions","validPermissions","contentAPI","permissions","action","keys","permissionsInDB","async","pipe","query","findMany","map","unknownPermissions","uniq","difference","length","deleteMany","where","$in","createDefaultAPITokensIfNeeded","userService","apiTokenService","usersCount","count","apiTokenCount","token","constants","DEFAULT_API_TOKENS","create","options","getTokenOptions","legacyMaxRefreshFallback","expiresInToSeconds","expiresIn","DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN","legacyMaxSessionFallback","DEFAULT_MAX_SESSION_LIFESPAN","hasLegacyExpires","hasNewMaxRefresh","config","hasNewMaxSession","log","warn","sessionManager","defineOrigin","jwtSecret","accessTokenLifespan","maxRefreshTokenLifespan","idleRefreshTokenLifespan","DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN","maxSessionLifespan","idleSessionLifespan","DEFAULT_IDLE_SESSION_LIFESPAN","algorithm","jwtOptions","permissionService","roleService","transferService","tokenService","createRolesIfNoneExist","resetSuperAdminPermissions","displayWarningIfNoSuperAdmin","cleanPermissionsInDatabase","displayWarningIfUsersDontHaveRole","sendUpdateProjectInformation","startCron","checkSaltIsDefined","checkSecretIsDefined"],"mappings":";;;;;;;;;;;AAeA,MAAMA,wBAA2B,GAAA;IAC/BC,SAAW,EAAA;QACTC,YAAc,EAAA,KAAA;QACdC,WAAa,EAAA,IAAA;QACbC,cAAgB,EAAA;AAClB;AACF,CAAA;AAEA,MAAMC,yBAA4B,GAAA,UAAA;AAChC,IAAA,MAAMC,iBAAW,YAAcC,CAAAA,CAAAA,cAAc,CAACC,YAAY,CAACC,qBAAaC,OAAO,CAAA;AACjF,CAAA;AAEA,MAAMC,uBAA0B,GAAA,UAAA;AAC9B,IAAA,MAAML,iBAAW,YAAcM,CAAAA,CAAAA,iBAAiB,CAACJ,YAAY,CAACK,wBAAgBC,UAAU,CAAA;AAC1F,CAAA;AAEA,MAAMC,kBAAqB,GAAA,IAAA;AACzB,IAAA,MAAM,EAAEC,8BAA8B,EAAE,GAAGV,gBAAW,CAAA,SAAA,CAAA;AAEtDW,IAAAA,MAAAA,CAAOC,EAAE,CAACC,UAAU,CAACC,SAAS,CAAC;QAC7BC,MAAQ,EAAA;AAAC,YAAA;AAAc,SAAA;QACvBC,WAAaN,EAAAA,8BAAAA;QACbO,WAAaP,EAAAA,8BAAAA;QACbQ,WAAY,CAAA,CAAA,EAAEC,MAAM,EAAE,EAAA;AACpB,YAAA,IAAIA,MAAOC,CAAAA,IAAI,CAACC,gBAAgB,EAAE;AAChCX,gBAAAA,8BAAAA,EAAAA;AACF;AACF;AACF,KAAA,CAAA;AACF,CAAA;AAEA,MAAMY,gBAAmB,GAAA,UAAA;AACvB,IAAA,MAAMC,UAAa,GAAA,MAAMZ,MAAOa,CAAAA,KAAK,CAAC;QAAEC,IAAM,EAAA,MAAA;QAAQC,IAAM,EAAA;AAAQ,KAAA,CAAA;AACpE,IAAA,MAAMC,iBAAoB,GAAA,MAAMJ,UAAWK,CAAAA,GAAG,CAAC;QAAEC,GAAK,EAAA;AAAO,KAAA,CAAA;IAC7D,MAAMC,eAAAA,GAAkBC,SAAMrC,wBAA0BiC,EAAAA,iBAAAA,CAAAA;AAExD,IAAA,MAAMK,UAAa,GAAA,MAAMhC,gBAAW,CAAA,MAAA,CAAA,CAAQiC,MAAM,CAAC;QACjDC,EAAIJ,EAAAA,eAAAA,CAAgBnC,SAAS,CAACE;AAChC,KAAA,CAAA;;AAGA,IAAA,IAAI,CAACmC,UAAY,EAAA;QACfF,eAAgBnC,CAAAA,SAAS,CAACE,WAAW,GAAG,IAAA;AAC1C;IAEA,MAAM0B,UAAAA,CAAWY,GAAG,CAAC;QAAEN,GAAK,EAAA,MAAA;QAAQO,KAAON,EAAAA;AAAgB,KAAA,CAAA;AAC7D,CAAA;AAEA,MAAMO,wBAA2B,GAAA,UAAA;IAC/B,MAAMC,gBAAAA,GAAmB3B,MAAO4B,CAAAA,UAAU,CAACC,WAAW,CAAC7C,SAAS,CAAC8C,MAAM,CAACC,IAAI,EAAA;AAC5E,IAAA,MAAMC,eAAkB,GAAA,MAAMC,WAAMC,CAAAA,IAAI,CACtClC,MAAAA,CAAOC,EAAE,CAACkC,KAAK,CAAC,6BAA+BC,CAAAA,CAAAA,QAAQ,EACvDC,MAAI,CAAA,QAAA,CAAA,CAAA,EAAA;IAGN,MAAMC,kBAAAA,GAAqBC,OAAKC,CAAAA,aAAAA,CAAWR,eAAiBL,EAAAA,gBAAAA,CAAAA,CAAAA;IAE5D,IAAIW,kBAAAA,CAAmBG,MAAM,GAAG,CAAG,EAAA;AACjC,QAAA,MAAMzC,OAAOC,EAAE,CACZkC,KAAK,CAAC,6BAAA,CAAA,CACNO,UAAU,CAAC;YAAEC,KAAO,EAAA;gBAAEb,MAAQ,EAAA;oBAAEc,GAAKN,EAAAA;AAAmB;AAAE;AAAE,SAAA,CAAA;AACjE;AACF,CAAA;AAEA;;;;;;;;;AASC,IAED,MAAMO,8BAAiC,GAAA,UAAA;AACrC,IAAA,MAAMC,cAAczD,gBAAW,CAAA,MAAA,CAAA;AAC/B,IAAA,MAAM0D,kBAAkB1D,gBAAW,CAAA,WAAA,CAAA;IAEnC,MAAM2D,UAAAA,GAAa,MAAMF,WAAAA,CAAYG,KAAK,EAAA;IAC1C,MAAMC,aAAAA,GAAgB,MAAMH,eAAAA,CAAgBE,KAAK,EAAA;IAEjD,IAAID,UAAAA,KAAe,CAAKE,IAAAA,aAAAA,KAAkB,CAAG,EAAA;AAC3C,QAAA,KAAK,MAAMC,KAAAA,IAASC,SAAUC,CAAAA,kBAAkB,CAAE;YAChD,MAAMN,eAAAA,CAAgBO,MAAM,CAACH,KAAAA,CAAAA;AAC/B;AACF;AACF,CAAA;AAEA,gBAAe,CAAA,OAAO,EAAEnD,MAAAA,EAAAA,OAAM,EAA2B,GAAA;;IAEvD,MAAM,EAAEuD,OAAO,EAAE,GAAGC,qBAAAA,EAAAA;IACpB,MAAMC,wBAAAA,GACJC,wBAAmBH,CAAAA,OAAAA,EAASI,SAAcC,CAAAA,IAAAA,8CAAAA;IAC5C,MAAMC,wBAAAA,GACJH,wBAAmBH,CAAAA,OAAAA,EAASI,SAAcG,CAAAA,IAAAA,wCAAAA;;IAG5C,MAAMC,gBAAAA,GAAmBR,SAASI,SAAa,IAAA,IAAA;AAC/C,IAAA,MAAMK,mBAAmBhE,OAAOiE,CAAAA,MAAM,CAAChD,GAAG,CAAC,6CAAkD,CAAA,IAAA,IAAA;AAC7F,IAAA,MAAMiD,mBAAmBlE,OAAOiE,CAAAA,MAAM,CAAChD,GAAG,CAAC,wCAA6C,CAAA,IAAA,IAAA;AAExF,IAAA,IAAI8C,qBAAqB,CAACC,gBAAoB,IAAA,CAACE,gBAAe,CAAI,EAAA;QAChElE,OAAOmE,CAAAA,GAAG,CAACC,IAAI,CACb,sLAAA,CAAA;AAEJ;AAEApE,IAAAA,OAAAA,CAAOqE,cAAc,CAACC,YAAY,CAAC,OAAS,EAAA;AAC1CC,QAAAA,SAAAA,EAAWvE,OAAOiE,CAAAA,MAAM,CAAChD,GAAG,CAAC,mBAAA,CAAA;AAC7BuD,QAAAA,mBAAAA,EAAqBxE,QAAOiE,MAAM,CAAChD,GAAG,CAAC,2CAA2C,EAAK,GAAA,EAAA,CAAA;AACvFwD,QAAAA,uBAAAA,EAAyBzE,OAAOiE,CAAAA,MAAM,CAAChD,GAAG,CACxC,6CACAwC,EAAAA,wBAAAA,CAAAA;AAEFiB,QAAAA,wBAAAA,EAA0B1E,OAAOiE,CAAAA,MAAM,CAAChD,GAAG,CACzC,8CACA0D,EAAAA,+CAAAA,CAAAA;AAEFC,QAAAA,kBAAAA,EAAoB5E,OAAOiE,CAAAA,MAAM,CAAChD,GAAG,CACnC,wCACA4C,EAAAA,wBAAAA,CAAAA;AAEFgB,QAAAA,mBAAAA,EAAqB7E,OAAOiE,CAAAA,MAAM,CAAChD,GAAG,CACpC,yCACA6D,EAAAA,yCAAAA,CAAAA;AAEFC,QAAAA,SAAAA,EAAWxB,OAASwB,EAAAA,SAAAA;;QAEpBC,UAAYzB,EAAAA;AACd,KAAA,CAAA;IAEA,MAAM7D,uBAAAA,EAAAA;IACN,MAAMN,yBAAAA,EAAAA;AACNU,IAAAA,kBAAAA,EAAAA;AAEA,IAAA,MAAMmF,oBAAoB5F,gBAAW,CAAA,YAAA,CAAA;AACrC,IAAA,MAAMyD,cAAczD,gBAAW,CAAA,MAAA,CAAA;AAC/B,IAAA,MAAM6F,cAAc7F,gBAAW,CAAA,MAAA,CAAA;AAC/B,IAAA,MAAM0D,kBAAkB1D,gBAAW,CAAA,WAAA,CAAA;AACnC,IAAA,MAAM8F,kBAAkB9F,gBAAW,CAAA,UAAA,CAAA;AACnC,IAAA,MAAM+F,eAAe/F,gBAAW,CAAA,OAAA,CAAA;AAEhC,IAAA,MAAM6F,YAAYG,sBAAsB,EAAA;AACxC,IAAA,MAAMH,YAAYI,0BAA0B,EAAA;AAC5C,IAAA,MAAMJ,YAAYK,4BAA4B,EAAA;AAE9C,IAAA,MAAMN,kBAAkBO,0BAA0B,EAAA;AAElD,IAAA,MAAM1C,YAAY2C,iCAAiC,EAAA;IAEnD,MAAM9E,gBAAAA,EAAAA;IACN,MAAMe,wBAAAA,EAAAA;IAEN,MAAMrC,gBAAAA,CAAW,SAAWqG,CAAAA,CAAAA,4BAA4B,CAAC1F,OAAAA,CAAAA;IACzDX,gBAAW,CAAA,SAAA,CAAA,CAAWsG,SAAS,CAAC3F,OAAAA,CAAAA;AAEhC+C,IAAAA,eAAAA,CAAgB6C,kBAAkB,EAAA;IAClCT,eAAgBhC,CAAAA,KAAK,CAACyC,kBAAkB,EAAA;AACxCR,IAAAA,YAAAA,CAAaS,oBAAoB,EAAA;IAEjC,MAAMhD,8BAAAA,EAAAA;AACR,CAAA;;;;"}
@@ -91,8 +91,7 @@ const syncAPITokensPermissions = async ()=>{
91
91
  }
92
92
  };
93
93
  var bootstrap = (async ({ strapi: strapi1 })=>{
94
- // Fallback for backward compatibility: if the new maxRefreshTokenLifespan is not set,
95
- // reuse the legacy admin.auth.options.expiresIn value (previously the sole JWT lifespan)
94
+ // Get the merged token options (includes defaults merged with user config)
96
95
  const { options } = getTokenOptions();
97
96
  const legacyMaxRefreshFallback = expiresInToSeconds(options?.expiresIn) ?? DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN;
98
97
  const legacyMaxSessionFallback = expiresInToSeconds(options?.expiresIn) ?? DEFAULT_MAX_SESSION_LIFESPAN;
@@ -109,7 +108,10 @@ var bootstrap = (async ({ strapi: strapi1 })=>{
109
108
  maxRefreshTokenLifespan: strapi1.config.get('admin.auth.sessions.maxRefreshTokenLifespan', legacyMaxRefreshFallback),
110
109
  idleRefreshTokenLifespan: strapi1.config.get('admin.auth.sessions.idleRefreshTokenLifespan', DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN),
111
110
  maxSessionLifespan: strapi1.config.get('admin.auth.sessions.maxSessionLifespan', legacyMaxSessionFallback),
112
- idleSessionLifespan: strapi1.config.get('admin.auth.sessions.idleSessionLifespan', DEFAULT_IDLE_SESSION_LIFESPAN)
111
+ idleSessionLifespan: strapi1.config.get('admin.auth.sessions.idleSessionLifespan', DEFAULT_IDLE_SESSION_LIFESPAN),
112
+ algorithm: options?.algorithm,
113
+ // Pass through all JWT options (includes privateKey, publicKey, and any other options)
114
+ jwtOptions: options
113
115
  });
114
116
  await registerAdminConditions();
115
117
  await registerPermissionActions();
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.mjs","sources":["../../../../server/src/bootstrap.ts"],"sourcesContent":["import { merge, map, difference, uniq } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { getService } from './utils';\nimport { getTokenOptions, expiresInToSeconds } from './services/token';\nimport adminActions from './config/admin-actions';\nimport adminConditions from './config/admin-conditions';\nimport constants from './services/constants';\nimport {\n DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN,\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN,\n DEFAULT_MAX_SESSION_LIFESPAN,\n DEFAULT_IDLE_SESSION_LIFESPAN,\n} from '../../shared/utils/session-auth';\n\nconst defaultAdminAuthSettings = {\n providers: {\n autoRegister: false,\n defaultRole: null,\n ssoLockedRoles: null,\n },\n};\n\nconst registerPermissionActions = async () => {\n await getService('permission').actionProvider.registerMany(adminActions.actions);\n};\n\nconst registerAdminConditions = async () => {\n await getService('permission').conditionProvider.registerMany(adminConditions.conditions);\n};\n\nconst registerModelHooks = () => {\n const { sendDidChangeInterfaceLanguage } = getService('metrics');\n\n strapi.db.lifecycles.subscribe({\n models: ['admin::user'],\n afterCreate: sendDidChangeInterfaceLanguage,\n afterDelete: sendDidChangeInterfaceLanguage,\n afterUpdate({ params }) {\n if (params.data.preferedLanguage) {\n sendDidChangeInterfaceLanguage();\n }\n },\n });\n};\n\nconst syncAuthSettings = async () => {\n const adminStore = await strapi.store({ type: 'core', name: 'admin' });\n const adminAuthSettings = await adminStore.get({ key: 'auth' });\n const newAuthSettings = merge(defaultAdminAuthSettings, adminAuthSettings);\n\n const roleExists = await getService('role').exists({\n id: newAuthSettings.providers.defaultRole,\n });\n\n // Reset the default SSO role if it has been deleted manually\n if (!roleExists) {\n newAuthSettings.providers.defaultRole = null;\n }\n\n await adminStore.set({ key: 'auth', value: newAuthSettings });\n};\n\nconst syncAPITokensPermissions = async () => {\n const validPermissions = strapi.contentAPI.permissions.providers.action.keys();\n const permissionsInDB = await async.pipe(\n strapi.db.query('admin::api-token-permission').findMany,\n map('action')\n )();\n\n const unknownPermissions = uniq(difference(permissionsInDB, validPermissions));\n\n if (unknownPermissions.length > 0) {\n await strapi.db\n .query('admin::api-token-permission')\n .deleteMany({ where: { action: { $in: unknownPermissions } } });\n }\n};\n\n/**\n * Ensures the creation of default API tokens during the app creation.\n *\n * Checks the database for existing users and API tokens:\n * - If there are no users and no API tokens, it creates two default API tokens:\n * 1. A \"Read Only\" API token with permissions for accessing resources.\n * 2. A \"Full Access\" API token with permissions for accessing and modifying resources.\n *\n * @sideEffects Creates new API tokens in the database if conditions are met.\n */\n\nconst createDefaultAPITokensIfNeeded = async () => {\n const userService = getService('user');\n const apiTokenService = getService('api-token');\n\n const usersCount = await userService.count();\n const apiTokenCount = await apiTokenService.count();\n\n if (usersCount === 0 && apiTokenCount === 0) {\n for (const token of constants.DEFAULT_API_TOKENS) {\n await apiTokenService.create(token);\n }\n }\n};\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Fallback for backward compatibility: if the new maxRefreshTokenLifespan is not set,\n // reuse the legacy admin.auth.options.expiresIn value (previously the sole JWT lifespan)\n const { options } = getTokenOptions();\n const legacyMaxRefreshFallback =\n expiresInToSeconds(options?.expiresIn) ?? DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN;\n const legacyMaxSessionFallback =\n expiresInToSeconds(options?.expiresIn) ?? DEFAULT_MAX_SESSION_LIFESPAN;\n\n // Warn if using deprecated legacy expiresIn for new session settings\n const hasLegacyExpires = options?.expiresIn != null;\n const hasNewMaxRefresh = strapi.config.get('admin.auth.sessions.maxRefreshTokenLifespan') != null;\n const hasNewMaxSession = strapi.config.get('admin.auth.sessions.maxSessionLifespan') != null;\n\n if (hasLegacyExpires && (!hasNewMaxRefresh || !hasNewMaxSession)) {\n strapi.log.warn(\n 'admin.auth.options.expiresIn is deprecated and will be removed in Strapi 6. Please configure admin.auth.sessions.maxRefreshTokenLifespan and admin.auth.sessions.maxSessionLifespan.'\n );\n }\n\n strapi.sessionManager.defineOrigin('admin', {\n jwtSecret: strapi.config.get('admin.auth.secret'),\n accessTokenLifespan: strapi.config.get('admin.auth.sessions.accessTokenLifespan', 30 * 60),\n maxRefreshTokenLifespan: strapi.config.get(\n 'admin.auth.sessions.maxRefreshTokenLifespan',\n legacyMaxRefreshFallback\n ),\n idleRefreshTokenLifespan: strapi.config.get(\n 'admin.auth.sessions.idleRefreshTokenLifespan',\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN\n ),\n maxSessionLifespan: strapi.config.get(\n 'admin.auth.sessions.maxSessionLifespan',\n legacyMaxSessionFallback\n ),\n idleSessionLifespan: strapi.config.get(\n 'admin.auth.sessions.idleSessionLifespan',\n DEFAULT_IDLE_SESSION_LIFESPAN\n ),\n });\n\n await registerAdminConditions();\n await registerPermissionActions();\n registerModelHooks();\n\n const permissionService = getService('permission');\n const userService = getService('user');\n const roleService = getService('role');\n const apiTokenService = getService('api-token');\n const transferService = getService('transfer');\n const tokenService = getService('token');\n\n await roleService.createRolesIfNoneExist();\n await roleService.resetSuperAdminPermissions();\n await roleService.displayWarningIfNoSuperAdmin();\n\n await permissionService.cleanPermissionsInDatabase();\n\n await userService.displayWarningIfUsersDontHaveRole();\n\n await syncAuthSettings();\n await syncAPITokensPermissions();\n\n await getService('metrics').sendUpdateProjectInformation(strapi);\n getService('metrics').startCron(strapi);\n\n apiTokenService.checkSaltIsDefined();\n transferService.token.checkSaltIsDefined();\n tokenService.checkSecretIsDefined();\n\n await createDefaultAPITokensIfNeeded();\n};\n"],"names":["defaultAdminAuthSettings","providers","autoRegister","defaultRole","ssoLockedRoles","registerPermissionActions","getService","actionProvider","registerMany","adminActions","actions","registerAdminConditions","conditionProvider","adminConditions","conditions","registerModelHooks","sendDidChangeInterfaceLanguage","strapi","db","lifecycles","subscribe","models","afterCreate","afterDelete","afterUpdate","params","data","preferedLanguage","syncAuthSettings","adminStore","store","type","name","adminAuthSettings","get","key","newAuthSettings","merge","roleExists","exists","id","set","value","syncAPITokensPermissions","validPermissions","contentAPI","permissions","action","keys","permissionsInDB","async","pipe","query","findMany","map","unknownPermissions","uniq","difference","length","deleteMany","where","$in","createDefaultAPITokensIfNeeded","userService","apiTokenService","usersCount","count","apiTokenCount","token","constants","DEFAULT_API_TOKENS","create","options","getTokenOptions","legacyMaxRefreshFallback","expiresInToSeconds","expiresIn","DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN","legacyMaxSessionFallback","DEFAULT_MAX_SESSION_LIFESPAN","hasLegacyExpires","hasNewMaxRefresh","config","hasNewMaxSession","log","warn","sessionManager","defineOrigin","jwtSecret","accessTokenLifespan","maxRefreshTokenLifespan","idleRefreshTokenLifespan","DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN","maxSessionLifespan","idleSessionLifespan","DEFAULT_IDLE_SESSION_LIFESPAN","permissionService","roleService","transferService","tokenService","createRolesIfNoneExist","resetSuperAdminPermissions","displayWarningIfNoSuperAdmin","cleanPermissionsInDatabase","displayWarningIfUsersDontHaveRole","sendUpdateProjectInformation","startCron","checkSaltIsDefined","checkSecretIsDefined"],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap.mjs","sources":["../../../../server/src/bootstrap.ts"],"sourcesContent":["import { merge, map, difference, uniq } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { getService } from './utils';\nimport { getTokenOptions, expiresInToSeconds } from './services/token';\nimport adminActions from './config/admin-actions';\nimport adminConditions from './config/admin-conditions';\nimport constants from './services/constants';\nimport {\n DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN,\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN,\n DEFAULT_MAX_SESSION_LIFESPAN,\n DEFAULT_IDLE_SESSION_LIFESPAN,\n} from '../../shared/utils/session-auth';\n\nconst defaultAdminAuthSettings = {\n providers: {\n autoRegister: false,\n defaultRole: null,\n ssoLockedRoles: null,\n },\n};\n\nconst registerPermissionActions = async () => {\n await getService('permission').actionProvider.registerMany(adminActions.actions);\n};\n\nconst registerAdminConditions = async () => {\n await getService('permission').conditionProvider.registerMany(adminConditions.conditions);\n};\n\nconst registerModelHooks = () => {\n const { sendDidChangeInterfaceLanguage } = getService('metrics');\n\n strapi.db.lifecycles.subscribe({\n models: ['admin::user'],\n afterCreate: sendDidChangeInterfaceLanguage,\n afterDelete: sendDidChangeInterfaceLanguage,\n afterUpdate({ params }) {\n if (params.data.preferedLanguage) {\n sendDidChangeInterfaceLanguage();\n }\n },\n });\n};\n\nconst syncAuthSettings = async () => {\n const adminStore = await strapi.store({ type: 'core', name: 'admin' });\n const adminAuthSettings = await adminStore.get({ key: 'auth' });\n const newAuthSettings = merge(defaultAdminAuthSettings, adminAuthSettings);\n\n const roleExists = await getService('role').exists({\n id: newAuthSettings.providers.defaultRole,\n });\n\n // Reset the default SSO role if it has been deleted manually\n if (!roleExists) {\n newAuthSettings.providers.defaultRole = null;\n }\n\n await adminStore.set({ key: 'auth', value: newAuthSettings });\n};\n\nconst syncAPITokensPermissions = async () => {\n const validPermissions = strapi.contentAPI.permissions.providers.action.keys();\n const permissionsInDB = await async.pipe(\n strapi.db.query('admin::api-token-permission').findMany,\n map('action')\n )();\n\n const unknownPermissions = uniq(difference(permissionsInDB, validPermissions));\n\n if (unknownPermissions.length > 0) {\n await strapi.db\n .query('admin::api-token-permission')\n .deleteMany({ where: { action: { $in: unknownPermissions } } });\n }\n};\n\n/**\n * Ensures the creation of default API tokens during the app creation.\n *\n * Checks the database for existing users and API tokens:\n * - If there are no users and no API tokens, it creates two default API tokens:\n * 1. A \"Read Only\" API token with permissions for accessing resources.\n * 2. A \"Full Access\" API token with permissions for accessing and modifying resources.\n *\n * @sideEffects Creates new API tokens in the database if conditions are met.\n */\n\nconst createDefaultAPITokensIfNeeded = async () => {\n const userService = getService('user');\n const apiTokenService = getService('api-token');\n\n const usersCount = await userService.count();\n const apiTokenCount = await apiTokenService.count();\n\n if (usersCount === 0 && apiTokenCount === 0) {\n for (const token of constants.DEFAULT_API_TOKENS) {\n await apiTokenService.create(token);\n }\n }\n};\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Get the merged token options (includes defaults merged with user config)\n const { options } = getTokenOptions();\n const legacyMaxRefreshFallback =\n expiresInToSeconds(options?.expiresIn) ?? DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN;\n const legacyMaxSessionFallback =\n expiresInToSeconds(options?.expiresIn) ?? DEFAULT_MAX_SESSION_LIFESPAN;\n\n // Warn if using deprecated legacy expiresIn for new session settings\n const hasLegacyExpires = options?.expiresIn != null;\n const hasNewMaxRefresh = strapi.config.get('admin.auth.sessions.maxRefreshTokenLifespan') != null;\n const hasNewMaxSession = strapi.config.get('admin.auth.sessions.maxSessionLifespan') != null;\n\n if (hasLegacyExpires && (!hasNewMaxRefresh || !hasNewMaxSession)) {\n strapi.log.warn(\n 'admin.auth.options.expiresIn is deprecated and will be removed in Strapi 6. Please configure admin.auth.sessions.maxRefreshTokenLifespan and admin.auth.sessions.maxSessionLifespan.'\n );\n }\n\n strapi.sessionManager.defineOrigin('admin', {\n jwtSecret: strapi.config.get('admin.auth.secret'),\n accessTokenLifespan: strapi.config.get('admin.auth.sessions.accessTokenLifespan', 30 * 60),\n maxRefreshTokenLifespan: strapi.config.get(\n 'admin.auth.sessions.maxRefreshTokenLifespan',\n legacyMaxRefreshFallback\n ),\n idleRefreshTokenLifespan: strapi.config.get(\n 'admin.auth.sessions.idleRefreshTokenLifespan',\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN\n ),\n maxSessionLifespan: strapi.config.get(\n 'admin.auth.sessions.maxSessionLifespan',\n legacyMaxSessionFallback\n ),\n idleSessionLifespan: strapi.config.get(\n 'admin.auth.sessions.idleSessionLifespan',\n DEFAULT_IDLE_SESSION_LIFESPAN\n ),\n algorithm: options?.algorithm,\n // Pass through all JWT options (includes privateKey, publicKey, and any other options)\n jwtOptions: options,\n });\n\n await registerAdminConditions();\n await registerPermissionActions();\n registerModelHooks();\n\n const permissionService = getService('permission');\n const userService = getService('user');\n const roleService = getService('role');\n const apiTokenService = getService('api-token');\n const transferService = getService('transfer');\n const tokenService = getService('token');\n\n await roleService.createRolesIfNoneExist();\n await roleService.resetSuperAdminPermissions();\n await roleService.displayWarningIfNoSuperAdmin();\n\n await permissionService.cleanPermissionsInDatabase();\n\n await userService.displayWarningIfUsersDontHaveRole();\n\n await syncAuthSettings();\n await syncAPITokensPermissions();\n\n await getService('metrics').sendUpdateProjectInformation(strapi);\n getService('metrics').startCron(strapi);\n\n apiTokenService.checkSaltIsDefined();\n transferService.token.checkSaltIsDefined();\n tokenService.checkSecretIsDefined();\n\n await createDefaultAPITokensIfNeeded();\n};\n"],"names":["defaultAdminAuthSettings","providers","autoRegister","defaultRole","ssoLockedRoles","registerPermissionActions","getService","actionProvider","registerMany","adminActions","actions","registerAdminConditions","conditionProvider","adminConditions","conditions","registerModelHooks","sendDidChangeInterfaceLanguage","strapi","db","lifecycles","subscribe","models","afterCreate","afterDelete","afterUpdate","params","data","preferedLanguage","syncAuthSettings","adminStore","store","type","name","adminAuthSettings","get","key","newAuthSettings","merge","roleExists","exists","id","set","value","syncAPITokensPermissions","validPermissions","contentAPI","permissions","action","keys","permissionsInDB","async","pipe","query","findMany","map","unknownPermissions","uniq","difference","length","deleteMany","where","$in","createDefaultAPITokensIfNeeded","userService","apiTokenService","usersCount","count","apiTokenCount","token","constants","DEFAULT_API_TOKENS","create","options","getTokenOptions","legacyMaxRefreshFallback","expiresInToSeconds","expiresIn","DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN","legacyMaxSessionFallback","DEFAULT_MAX_SESSION_LIFESPAN","hasLegacyExpires","hasNewMaxRefresh","config","hasNewMaxSession","log","warn","sessionManager","defineOrigin","jwtSecret","accessTokenLifespan","maxRefreshTokenLifespan","idleRefreshTokenLifespan","DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN","maxSessionLifespan","idleSessionLifespan","DEFAULT_IDLE_SESSION_LIFESPAN","algorithm","jwtOptions","permissionService","roleService","transferService","tokenService","createRolesIfNoneExist","resetSuperAdminPermissions","displayWarningIfNoSuperAdmin","cleanPermissionsInDatabase","displayWarningIfUsersDontHaveRole","sendUpdateProjectInformation","startCron","checkSaltIsDefined","checkSecretIsDefined"],"mappings":"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"}
@@ -8,9 +8,13 @@ const defaultJwtOptions = {
8
8
  };
9
9
  const getTokenOptions = ()=>{
10
10
  const { options, secret } = strapi.config.get('admin.auth', {});
11
+ // Check for new sessions.options configuration
12
+ const sessionsOptions = strapi.config.get('admin.auth.sessions.options', {});
13
+ // Merge with legacy options for backward compatibility
14
+ const mergedOptions = _.merge({}, defaultJwtOptions, options, sessionsOptions);
11
15
  return {
12
16
  secret,
13
- options: _.merge(defaultJwtOptions, options)
17
+ options: mergedOptions
14
18
  };
15
19
  };
16
20
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"token.js","sources":["../../../../../server/src/services/token.ts"],"sourcesContent":["import crypto from 'crypto';\nimport _ from 'lodash';\nimport type { Algorithm } from 'jsonwebtoken';\nimport type { AdminUser } from '../../../shared/contracts/shared';\n\nconst defaultJwtOptions = { expiresIn: '30d' };\n\nexport type TokenOptions = {\n expiresIn?: string;\n algorithm?: Algorithm;\n [key: string]: unknown;\n};\n\nexport type TokenPayload = {\n id: AdminUser['id'];\n};\n\nexport type AdminAuthConfig = {\n secret: string;\n options: TokenOptions;\n};\n\nconst getTokenOptions = () => {\n const { options, secret } = strapi.config.get<AdminAuthConfig>(\n 'admin.auth',\n {} as AdminAuthConfig\n );\n\n return {\n secret,\n options: _.merge(defaultJwtOptions, options),\n };\n};\n\n/**\n * Create a random token\n */\nconst createToken = (): string => {\n return crypto.randomBytes(20).toString('hex');\n};\n\nconst checkSecretIsDefined = () => {\n if (strapi.config.get('admin.serveAdminPanel') && !strapi.config.get('admin.auth.secret')) {\n throw new Error(\n `Missing auth.secret. Please set auth.secret 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\nexport { createToken, getTokenOptions, checkSecretIsDefined };\n\n/**\n * Convert an expiresIn value (string or number) into seconds.\n * Supported formats:\n * - number: treated as seconds\n * - numeric string (e.g. \"180\"): treated as seconds\n * - shorthand string: \"Xs\", \"Xm\", \"Xh\", \"Xd\", \"Xw\" (case-insensitive)\n * Returns undefined when value is not set or invalid.\n */\nexport const expiresInToSeconds = (expiresIn: unknown): number | undefined => {\n if (expiresIn == null) return undefined;\n\n // Numeric input => seconds\n if (typeof expiresIn === 'number' && Number.isFinite(expiresIn)) {\n return Math.max(0, Math.floor(expiresIn));\n }\n\n if (typeof expiresIn !== 'string') return undefined;\n\n const value = expiresIn.trim().toLowerCase();\n\n // Pure numeric string => seconds\n if (/^\\d+$/.test(value)) {\n const seconds = Number.parseInt(value, 10);\n return Number.isFinite(seconds) ? Math.max(0, seconds) : undefined;\n }\n\n // Shorthand formats (s, m, h, d, w)\n const match = value.match(/^(\\d+)\\s*(ms|s|m|h|d|w)$/i);\n if (!match) return undefined;\n\n const amount = Number.parseInt(match[1], 10);\n if (!Number.isFinite(amount)) return undefined;\n\n const unit = match[2];\n switch (unit) {\n case 'ms':\n return Math.max(0, Math.floor(amount / 1000));\n case 's':\n return Math.max(0, amount);\n case 'm':\n return Math.max(0, amount * 60);\n case 'h':\n return Math.max(0, amount * 60 * 60);\n case 'd':\n return Math.max(0, amount * 24 * 60 * 60);\n case 'w':\n return Math.max(0, amount * 7 * 24 * 60 * 60);\n default:\n return undefined;\n }\n};\n"],"names":["defaultJwtOptions","expiresIn","getTokenOptions","options","secret","strapi","config","get","_","merge","createToken","crypto","randomBytes","toString","checkSecretIsDefined","Error","expiresInToSeconds","undefined","Number","isFinite","Math","max","floor","value","trim","toLowerCase","test","seconds","parseInt","match","amount","unit"],"mappings":";;;;;AAKA,MAAMA,iBAAoB,GAAA;IAAEC,SAAW,EAAA;AAAM,CAAA;AAiB7C,MAAMC,eAAkB,GAAA,IAAA;AACtB,IAAA,MAAM,EAAEC,OAAO,EAAEC,MAAM,EAAE,GAAGC,MAAOC,CAAAA,MAAM,CAACC,GAAG,CAC3C,YAAA,EACA,EAAC,CAAA;IAGH,OAAO;AACLH,QAAAA,MAAAA;QACAD,OAASK,EAAAA,CAAAA,CAAEC,KAAK,CAACT,iBAAmBG,EAAAA,OAAAA;AACtC,KAAA;AACF;AAEA;;AAEC,UACKO,WAAc,GAAA,IAAA;AAClB,IAAA,OAAOC,MAAOC,CAAAA,WAAW,CAAC,EAAA,CAAA,CAAIC,QAAQ,CAAC,KAAA,CAAA;AACzC;AAEA,MAAMC,oBAAuB,GAAA,IAAA;AAC3B,IAAA,IAAIT,MAAOC,CAAAA,MAAM,CAACC,GAAG,CAAC,uBAAA,CAAA,IAA4B,CAACF,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,mBAAsB,CAAA,EAAA;QACzF,MAAM,IAAIQ,MACR,CAAC;uQACgQ,CAAC,CAAA;AAEtQ;AACF;AAIA;;;;;;;IAQaC,MAAAA,kBAAAA,GAAqB,CAACf,SAAAA,GAAAA;IACjC,IAAIA,SAAAA,IAAa,MAAM,OAAOgB,SAAAA;;AAG9B,IAAA,IAAI,OAAOhB,SAAc,KAAA,QAAA,IAAYiB,MAAOC,CAAAA,QAAQ,CAAClB,SAAY,CAAA,EAAA;AAC/D,QAAA,OAAOmB,KAAKC,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,KAAK,CAACrB,SAAAA,CAAAA,CAAAA;AAChC;IAEA,IAAI,OAAOA,SAAc,KAAA,QAAA,EAAU,OAAOgB,SAAAA;AAE1C,IAAA,MAAMM,KAAQtB,GAAAA,SAAAA,CAAUuB,IAAI,EAAA,CAAGC,WAAW,EAAA;;IAG1C,IAAI,OAAA,CAAQC,IAAI,CAACH,KAAQ,CAAA,EAAA;AACvB,QAAA,MAAMI,OAAUT,GAAAA,MAAAA,CAAOU,QAAQ,CAACL,KAAO,EAAA,EAAA,CAAA;QACvC,OAAOL,MAAAA,CAAOC,QAAQ,CAACQ,OAAAA,CAAAA,GAAWP,KAAKC,GAAG,CAAC,GAAGM,OAAWV,CAAAA,GAAAA,SAAAA;AAC3D;;IAGA,MAAMY,KAAAA,GAAQN,KAAMM,CAAAA,KAAK,CAAC,2BAAA,CAAA;IAC1B,IAAI,CAACA,OAAO,OAAOZ,SAAAA;AAEnB,IAAA,MAAMa,SAASZ,MAAOU,CAAAA,QAAQ,CAACC,KAAK,CAAC,EAAE,EAAE,EAAA,CAAA;AACzC,IAAA,IAAI,CAACX,MAAAA,CAAOC,QAAQ,CAACW,SAAS,OAAOb,SAAAA;IAErC,MAAMc,IAAAA,GAAOF,KAAK,CAAC,CAAE,CAAA;IACrB,OAAQE,IAAAA;QACN,KAAK,IAAA;AACH,YAAA,OAAOX,KAAKC,GAAG,CAAC,GAAGD,IAAKE,CAAAA,KAAK,CAACQ,MAAS,GAAA,IAAA,CAAA,CAAA;QACzC,KAAK,GAAA;YACH,OAAOV,IAAAA,CAAKC,GAAG,CAAC,CAAGS,EAAAA,MAAAA,CAAAA;QACrB,KAAK,GAAA;AACH,YAAA,OAAOV,IAAKC,CAAAA,GAAG,CAAC,CAAA,EAAGS,MAAS,GAAA,EAAA,CAAA;QAC9B,KAAK,GAAA;AACH,YAAA,OAAOV,IAAKC,CAAAA,GAAG,CAAC,CAAA,EAAGS,SAAS,EAAK,GAAA,EAAA,CAAA;QACnC,KAAK,GAAA;AACH,YAAA,OAAOV,KAAKC,GAAG,CAAC,CAAGS,EAAAA,MAAAA,GAAS,KAAK,EAAK,GAAA,EAAA,CAAA;QACxC,KAAK,GAAA;AACH,YAAA,OAAOV,KAAKC,GAAG,CAAC,GAAGS,MAAS,GAAA,CAAA,GAAI,KAAK,EAAK,GAAA,EAAA,CAAA;AAC5C,QAAA;YACE,OAAOb,SAAAA;AACX;AACF;;;;;;;"}
1
+ {"version":3,"file":"token.js","sources":["../../../../../server/src/services/token.ts"],"sourcesContent":["import crypto from 'crypto';\nimport _ from 'lodash';\nimport type { Algorithm } from 'jsonwebtoken';\nimport type { AdminUser } from '../../../shared/contracts/shared';\n\nconst defaultJwtOptions = { expiresIn: '30d' };\n\nexport type TokenOptions = {\n expiresIn?: string;\n algorithm?: Algorithm;\n privateKey?: string;\n publicKey?: string;\n [key: string]: unknown;\n};\n\nexport type TokenPayload = {\n id: AdminUser['id'];\n};\n\nexport type AdminAuthConfig = {\n secret: string;\n options: TokenOptions;\n};\n\nconst getTokenOptions = () => {\n const { options, secret } = strapi.config.get<AdminAuthConfig>(\n 'admin.auth',\n {} as AdminAuthConfig\n );\n\n // Check for new sessions.options configuration\n const sessionsOptions = strapi.config.get('admin.auth.sessions.options', {});\n\n // Merge with legacy options for backward compatibility\n const mergedOptions = _.merge({}, defaultJwtOptions, options, sessionsOptions);\n\n return {\n secret,\n options: mergedOptions,\n };\n};\n\n/**\n * Create a random token\n */\nconst createToken = (): string => {\n return crypto.randomBytes(20).toString('hex');\n};\n\nconst checkSecretIsDefined = () => {\n if (strapi.config.get('admin.serveAdminPanel') && !strapi.config.get('admin.auth.secret')) {\n throw new Error(\n `Missing auth.secret. Please set auth.secret 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\nexport { createToken, getTokenOptions, checkSecretIsDefined };\n\n/**\n * Convert an expiresIn value (string or number) into seconds.\n * Supported formats:\n * - number: treated as seconds\n * - numeric string (e.g. \"180\"): treated as seconds\n * - shorthand string: \"Xs\", \"Xm\", \"Xh\", \"Xd\", \"Xw\" (case-insensitive)\n * Returns undefined when value is not set or invalid.\n */\nexport const expiresInToSeconds = (expiresIn: unknown): number | undefined => {\n if (expiresIn == null) return undefined;\n\n // Numeric input => seconds\n if (typeof expiresIn === 'number' && Number.isFinite(expiresIn)) {\n return Math.max(0, Math.floor(expiresIn));\n }\n\n if (typeof expiresIn !== 'string') return undefined;\n\n const value = expiresIn.trim().toLowerCase();\n\n // Pure numeric string => seconds\n if (/^\\d+$/.test(value)) {\n const seconds = Number.parseInt(value, 10);\n return Number.isFinite(seconds) ? Math.max(0, seconds) : undefined;\n }\n\n // Shorthand formats (s, m, h, d, w)\n const match = value.match(/^(\\d+)\\s*(ms|s|m|h|d|w)$/i);\n if (!match) return undefined;\n\n const amount = Number.parseInt(match[1], 10);\n if (!Number.isFinite(amount)) return undefined;\n\n const unit = match[2];\n switch (unit) {\n case 'ms':\n return Math.max(0, Math.floor(amount / 1000));\n case 's':\n return Math.max(0, amount);\n case 'm':\n return Math.max(0, amount * 60);\n case 'h':\n return Math.max(0, amount * 60 * 60);\n case 'd':\n return Math.max(0, amount * 24 * 60 * 60);\n case 'w':\n return Math.max(0, amount * 7 * 24 * 60 * 60);\n default:\n return undefined;\n }\n};\n"],"names":["defaultJwtOptions","expiresIn","getTokenOptions","options","secret","strapi","config","get","sessionsOptions","mergedOptions","_","merge","createToken","crypto","randomBytes","toString","checkSecretIsDefined","Error","expiresInToSeconds","undefined","Number","isFinite","Math","max","floor","value","trim","toLowerCase","test","seconds","parseInt","match","amount","unit"],"mappings":"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"}
@@ -6,9 +6,13 @@ const defaultJwtOptions = {
6
6
  };
7
7
  const getTokenOptions = ()=>{
8
8
  const { options, secret } = strapi.config.get('admin.auth', {});
9
+ // Check for new sessions.options configuration
10
+ const sessionsOptions = strapi.config.get('admin.auth.sessions.options', {});
11
+ // Merge with legacy options for backward compatibility
12
+ const mergedOptions = ___default.merge({}, defaultJwtOptions, options, sessionsOptions);
9
13
  return {
10
14
  secret,
11
- options: ___default.merge(defaultJwtOptions, options)
15
+ options: mergedOptions
12
16
  };
13
17
  };
14
18
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"token.mjs","sources":["../../../../../server/src/services/token.ts"],"sourcesContent":["import crypto from 'crypto';\nimport _ from 'lodash';\nimport type { Algorithm } from 'jsonwebtoken';\nimport type { AdminUser } from '../../../shared/contracts/shared';\n\nconst defaultJwtOptions = { expiresIn: '30d' };\n\nexport type TokenOptions = {\n expiresIn?: string;\n algorithm?: Algorithm;\n [key: string]: unknown;\n};\n\nexport type TokenPayload = {\n id: AdminUser['id'];\n};\n\nexport type AdminAuthConfig = {\n secret: string;\n options: TokenOptions;\n};\n\nconst getTokenOptions = () => {\n const { options, secret } = strapi.config.get<AdminAuthConfig>(\n 'admin.auth',\n {} as AdminAuthConfig\n );\n\n return {\n secret,\n options: _.merge(defaultJwtOptions, options),\n };\n};\n\n/**\n * Create a random token\n */\nconst createToken = (): string => {\n return crypto.randomBytes(20).toString('hex');\n};\n\nconst checkSecretIsDefined = () => {\n if (strapi.config.get('admin.serveAdminPanel') && !strapi.config.get('admin.auth.secret')) {\n throw new Error(\n `Missing auth.secret. Please set auth.secret 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\nexport { createToken, getTokenOptions, checkSecretIsDefined };\n\n/**\n * Convert an expiresIn value (string or number) into seconds.\n * Supported formats:\n * - number: treated as seconds\n * - numeric string (e.g. \"180\"): treated as seconds\n * - shorthand string: \"Xs\", \"Xm\", \"Xh\", \"Xd\", \"Xw\" (case-insensitive)\n * Returns undefined when value is not set or invalid.\n */\nexport const expiresInToSeconds = (expiresIn: unknown): number | undefined => {\n if (expiresIn == null) return undefined;\n\n // Numeric input => seconds\n if (typeof expiresIn === 'number' && Number.isFinite(expiresIn)) {\n return Math.max(0, Math.floor(expiresIn));\n }\n\n if (typeof expiresIn !== 'string') return undefined;\n\n const value = expiresIn.trim().toLowerCase();\n\n // Pure numeric string => seconds\n if (/^\\d+$/.test(value)) {\n const seconds = Number.parseInt(value, 10);\n return Number.isFinite(seconds) ? Math.max(0, seconds) : undefined;\n }\n\n // Shorthand formats (s, m, h, d, w)\n const match = value.match(/^(\\d+)\\s*(ms|s|m|h|d|w)$/i);\n if (!match) return undefined;\n\n const amount = Number.parseInt(match[1], 10);\n if (!Number.isFinite(amount)) return undefined;\n\n const unit = match[2];\n switch (unit) {\n case 'ms':\n return Math.max(0, Math.floor(amount / 1000));\n case 's':\n return Math.max(0, amount);\n case 'm':\n return Math.max(0, amount * 60);\n case 'h':\n return Math.max(0, amount * 60 * 60);\n case 'd':\n return Math.max(0, amount * 24 * 60 * 60);\n case 'w':\n return Math.max(0, amount * 7 * 24 * 60 * 60);\n default:\n return undefined;\n }\n};\n"],"names":["defaultJwtOptions","expiresIn","getTokenOptions","options","secret","strapi","config","get","_","merge","createToken","crypto","randomBytes","toString","checkSecretIsDefined","Error","expiresInToSeconds","undefined","Number","isFinite","Math","max","floor","value","trim","toLowerCase","test","seconds","parseInt","match","amount","unit"],"mappings":"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"}
1
+ {"version":3,"file":"token.mjs","sources":["../../../../../server/src/services/token.ts"],"sourcesContent":["import crypto from 'crypto';\nimport _ from 'lodash';\nimport type { Algorithm } from 'jsonwebtoken';\nimport type { AdminUser } from '../../../shared/contracts/shared';\n\nconst defaultJwtOptions = { expiresIn: '30d' };\n\nexport type TokenOptions = {\n expiresIn?: string;\n algorithm?: Algorithm;\n privateKey?: string;\n publicKey?: string;\n [key: string]: unknown;\n};\n\nexport type TokenPayload = {\n id: AdminUser['id'];\n};\n\nexport type AdminAuthConfig = {\n secret: string;\n options: TokenOptions;\n};\n\nconst getTokenOptions = () => {\n const { options, secret } = strapi.config.get<AdminAuthConfig>(\n 'admin.auth',\n {} as AdminAuthConfig\n );\n\n // Check for new sessions.options configuration\n const sessionsOptions = strapi.config.get('admin.auth.sessions.options', {});\n\n // Merge with legacy options for backward compatibility\n const mergedOptions = _.merge({}, defaultJwtOptions, options, sessionsOptions);\n\n return {\n secret,\n options: mergedOptions,\n };\n};\n\n/**\n * Create a random token\n */\nconst createToken = (): string => {\n return crypto.randomBytes(20).toString('hex');\n};\n\nconst checkSecretIsDefined = () => {\n if (strapi.config.get('admin.serveAdminPanel') && !strapi.config.get('admin.auth.secret')) {\n throw new Error(\n `Missing auth.secret. Please set auth.secret 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\nexport { createToken, getTokenOptions, checkSecretIsDefined };\n\n/**\n * Convert an expiresIn value (string or number) into seconds.\n * Supported formats:\n * - number: treated as seconds\n * - numeric string (e.g. \"180\"): treated as seconds\n * - shorthand string: \"Xs\", \"Xm\", \"Xh\", \"Xd\", \"Xw\" (case-insensitive)\n * Returns undefined when value is not set or invalid.\n */\nexport const expiresInToSeconds = (expiresIn: unknown): number | undefined => {\n if (expiresIn == null) return undefined;\n\n // Numeric input => seconds\n if (typeof expiresIn === 'number' && Number.isFinite(expiresIn)) {\n return Math.max(0, Math.floor(expiresIn));\n }\n\n if (typeof expiresIn !== 'string') return undefined;\n\n const value = expiresIn.trim().toLowerCase();\n\n // Pure numeric string => seconds\n if (/^\\d+$/.test(value)) {\n const seconds = Number.parseInt(value, 10);\n return Number.isFinite(seconds) ? Math.max(0, seconds) : undefined;\n }\n\n // Shorthand formats (s, m, h, d, w)\n const match = value.match(/^(\\d+)\\s*(ms|s|m|h|d|w)$/i);\n if (!match) return undefined;\n\n const amount = Number.parseInt(match[1], 10);\n if (!Number.isFinite(amount)) return undefined;\n\n const unit = match[2];\n switch (unit) {\n case 'ms':\n return Math.max(0, Math.floor(amount / 1000));\n case 's':\n return Math.max(0, amount);\n case 'm':\n return Math.max(0, amount * 60);\n case 'h':\n return Math.max(0, amount * 60 * 60);\n case 'd':\n return Math.max(0, amount * 24 * 60 * 60);\n case 'w':\n return Math.max(0, amount * 7 * 24 * 60 * 60);\n default:\n return undefined;\n }\n};\n"],"names":["defaultJwtOptions","expiresIn","getTokenOptions","options","secret","strapi","config","get","sessionsOptions","mergedOptions","_","merge","createToken","crypto","randomBytes","toString","checkSecretIsDefined","Error","expiresInToSeconds","undefined","Number","isFinite","Math","max","floor","value","trim","toLowerCase","test","seconds","parseInt","match","amount","unit"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../server/src/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;qCAuGR;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;AAAzD,wBAuEE"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../server/src/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;qCAuGR;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;AAAzD,wBAyEE"}
@@ -3,6 +3,8 @@ import type { AdminUser } from '../../../shared/contracts/shared';
3
3
  export type TokenOptions = {
4
4
  expiresIn?: string;
5
5
  algorithm?: Algorithm;
6
+ privateKey?: string;
7
+ publicKey?: string;
6
8
  [key: string]: unknown;
7
9
  };
8
10
  export type TokenPayload = {
@@ -1 +1 @@
1
- {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../../server/src/services/token.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAIlE,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF,QAAA,MAAM,eAAe;;;;;CAUpB,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,WAAW,QAAO,MAEvB,CAAC;AAEF,QAAA,MAAM,oBAAoB,YAOzB,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,oBAAoB,EAAE,CAAC;AAE9D;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,cAAe,OAAO,KAAG,MAAM,GAAG,SA0ChE,CAAC"}
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../../server/src/services/token.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAIlE,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF,QAAA,MAAM,eAAe;;;;;CAgBpB,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,WAAW,QAAO,MAEvB,CAAC;AAEF,QAAA,MAAM,oBAAoB,YAOzB,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,oBAAoB,EAAE,CAAC;AAE9D;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,cAAe,OAAO,KAAG,MAAM,GAAG,SA0ChE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/admin",
3
- "version": "5.24.0",
3
+ "version": "5.24.2",
4
4
  "description": "Strapi Admin",
5
5
  "repository": {
6
6
  "type": "git",
@@ -86,10 +86,10 @@
86
86
  "@reduxjs/toolkit": "1.9.7",
87
87
  "@strapi/design-system": "2.0.0-rc.29",
88
88
  "@strapi/icons": "2.0.0-rc.29",
89
- "@strapi/permissions": "5.24.0",
90
- "@strapi/types": "5.24.0",
91
- "@strapi/typescript-utils": "5.24.0",
92
- "@strapi/utils": "5.24.0",
89
+ "@strapi/permissions": "5.24.2",
90
+ "@strapi/types": "5.24.2",
91
+ "@strapi/typescript-utils": "5.24.2",
92
+ "@strapi/utils": "5.24.2",
93
93
  "@testing-library/dom": "10.1.0",
94
94
  "@testing-library/react": "15.0.7",
95
95
  "@testing-library/user-event": "14.5.2",
@@ -143,8 +143,8 @@
143
143
  "zod": "3.25.67"
144
144
  },
145
145
  "devDependencies": {
146
- "@strapi/admin-test-utils": "5.24.0",
147
- "@strapi/data-transfer": "5.24.0",
146
+ "@strapi/admin-test-utils": "5.24.2",
147
+ "@strapi/data-transfer": "5.24.2",
148
148
  "@types/codemirror5": "npm:@types/codemirror@^5.60.15",
149
149
  "@types/fs-extra": "11.0.4",
150
150
  "@types/invariant": "2.2.36",