@strapi/admin 5.57.0 → 5.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/dist/admin/admin/src/components/FormInputs/Boolean.js +3 -2
  2. package/dist/admin/admin/src/components/FormInputs/Boolean.js.map +1 -1
  3. package/dist/admin/admin/src/components/FormInputs/Boolean.mjs +3 -2
  4. package/dist/admin/admin/src/components/FormInputs/Boolean.mjs.map +1 -1
  5. package/dist/admin/admin/src/constants.js +14 -0
  6. package/dist/admin/admin/src/constants.js.map +1 -1
  7. package/dist/admin/admin/src/constants.mjs +14 -0
  8. package/dist/admin/admin/src/constants.mjs.map +1 -1
  9. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js +6 -12
  10. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js.map +1 -1
  11. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.mjs +6 -12
  12. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.mjs.map +1 -1
  13. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +10 -2
  14. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
  15. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs +10 -2
  16. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
  17. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +6 -56
  18. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
  19. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +6 -56
  20. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
  21. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.js +217 -0
  22. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.js.map +1 -0
  23. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.mjs +195 -0
  24. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.mjs.map +1 -0
  25. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.js +185 -0
  26. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.js.map +1 -0
  27. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.mjs +162 -0
  28. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.mjs.map +1 -0
  29. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.js +342 -0
  30. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.js.map +1 -0
  31. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.mjs +320 -0
  32. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.mjs.map +1 -0
  33. package/dist/admin/admin/src/services/admin.js +11 -1
  34. package/dist/admin/admin/src/services/admin.js.map +1 -1
  35. package/dist/admin/admin/src/services/admin.mjs +11 -2
  36. package/dist/admin/admin/src/services/admin.mjs.map +1 -1
  37. package/dist/admin/admin/src/translations/en.json.js +71 -4
  38. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  39. package/dist/admin/admin/src/translations/en.json.mjs +71 -4
  40. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  41. package/dist/admin/admin/src/utils/browserStrapi.js +1 -1
  42. package/dist/admin/admin/src/utils/browserStrapi.js.map +1 -1
  43. package/dist/admin/admin/src/utils/browserStrapi.mjs +1 -1
  44. package/dist/admin/admin/src/utils/browserStrapi.mjs.map +1 -1
  45. package/dist/admin/admin/src/utils/getFetchClient.js +24 -0
  46. package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
  47. package/dist/admin/admin/src/utils/getFetchClient.mjs +24 -1
  48. package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
  49. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +52 -22
  50. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -1
  51. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs +53 -23
  52. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs.map +1 -1
  53. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js +16 -29
  54. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js.map +1 -1
  55. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs +18 -31
  56. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs.map +1 -1
  57. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.js +473 -0
  58. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.js.map +1 -0
  59. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.mjs +471 -0
  60. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.mjs.map +1 -0
  61. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +2 -0
  62. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
  63. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +2 -0
  64. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
  65. package/dist/admin/index.js +1 -0
  66. package/dist/admin/index.js.map +1 -1
  67. package/dist/admin/index.mjs +1 -1
  68. package/dist/admin/shared/utils/get-project-type.js +49 -0
  69. package/dist/admin/shared/utils/get-project-type.js.map +1 -0
  70. package/dist/admin/shared/utils/get-project-type.mjs +46 -0
  71. package/dist/admin/shared/utils/get-project-type.mjs.map +1 -0
  72. package/dist/admin/src/constants.d.ts +10 -0
  73. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.d.ts +1 -1
  74. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.d.ts +12 -0
  75. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.d.ts +14 -0
  76. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.d.ts +2 -0
  77. package/dist/admin/src/services/admin.d.ts +2 -2
  78. package/dist/admin/src/types/permissions.d.ts +1 -0
  79. package/dist/admin/src/utils/getFetchClient.d.ts +25 -0
  80. package/dist/ee/admin/src/hooks/useLicenseLimits.d.ts +29 -0
  81. package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.d.ts +6 -1
  82. package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.d.ts +2 -0
  83. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +2 -0
  84. package/dist/ee/server/src/audit-logs/entitlements.d.ts +8 -0
  85. package/dist/ee/server/src/audit-logs/entitlements.d.ts.map +1 -0
  86. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +16 -0
  87. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
  88. package/dist/ee/server/src/controllers/admin.d.ts +36 -10
  89. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
  90. package/dist/ee/server/src/controllers/authentication-utils/middlewares.d.ts.map +1 -1
  91. package/dist/ee/server/src/controllers/index.d.ts +36 -10
  92. package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
  93. package/dist/ee/server/src/index.d.ts +36 -10
  94. package/dist/ee/server/src/index.d.ts.map +1 -1
  95. package/dist/server/ee/server/src/audit-logs/entitlements.js +25 -0
  96. package/dist/server/ee/server/src/audit-logs/entitlements.js.map +1 -0
  97. package/dist/server/ee/server/src/audit-logs/entitlements.mjs +23 -0
  98. package/dist/server/ee/server/src/audit-logs/entitlements.mjs.map +1 -0
  99. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +20 -8
  100. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
  101. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +19 -9
  102. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
  103. package/dist/server/ee/server/src/controllers/admin.js +76 -3
  104. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  105. package/dist/server/ee/server/src/controllers/admin.mjs +76 -3
  106. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  107. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js +28 -10
  108. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js.map +1 -1
  109. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs +28 -10
  110. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs.map +1 -1
  111. package/dist/server/ee/server/src/index.js +2 -0
  112. package/dist/server/ee/server/src/index.js.map +1 -1
  113. package/dist/server/ee/server/src/index.mjs +2 -0
  114. package/dist/server/ee/server/src/index.mjs.map +1 -1
  115. package/dist/server/server/src/audit-logs/auth.js +72 -0
  116. package/dist/server/server/src/audit-logs/auth.js.map +1 -0
  117. package/dist/server/server/src/audit-logs/auth.mjs +67 -0
  118. package/dist/server/server/src/audit-logs/auth.mjs.map +1 -0
  119. package/dist/server/server/src/config/admin-actions.js +7 -0
  120. package/dist/server/server/src/config/admin-actions.js.map +1 -1
  121. package/dist/server/server/src/config/admin-actions.mjs +7 -0
  122. package/dist/server/server/src/config/admin-actions.mjs.map +1 -1
  123. package/dist/server/server/src/controllers/admin.js +6 -0
  124. package/dist/server/server/src/controllers/admin.js.map +1 -1
  125. package/dist/server/server/src/controllers/admin.mjs +6 -0
  126. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  127. package/dist/server/server/src/controllers/authentication.js +34 -8
  128. package/dist/server/server/src/controllers/authentication.js.map +1 -1
  129. package/dist/server/server/src/controllers/authentication.mjs +34 -8
  130. package/dist/server/server/src/controllers/authentication.mjs.map +1 -1
  131. package/dist/server/server/src/register.js +4 -0
  132. package/dist/server/server/src/register.js.map +1 -1
  133. package/dist/server/server/src/register.mjs +4 -0
  134. package/dist/server/server/src/register.mjs.map +1 -1
  135. package/dist/server/server/src/routes/admin.js +18 -0
  136. package/dist/server/server/src/routes/admin.js.map +1 -1
  137. package/dist/server/server/src/routes/admin.mjs +18 -0
  138. package/dist/server/server/src/routes/admin.mjs.map +1 -1
  139. package/dist/server/server/src/services/auth.js +4 -2
  140. package/dist/server/server/src/services/auth.js.map +1 -1
  141. package/dist/server/server/src/services/auth.mjs +4 -3
  142. package/dist/server/server/src/services/auth.mjs.map +1 -1
  143. package/dist/server/server/src/services/debug-dump.js +173 -0
  144. package/dist/server/server/src/services/debug-dump.js.map +1 -0
  145. package/dist/server/server/src/services/debug-dump.mjs +166 -0
  146. package/dist/server/server/src/services/debug-dump.mjs.map +1 -0
  147. package/dist/server/server/src/services/index.js +3 -1
  148. package/dist/server/server/src/services/index.js.map +1 -1
  149. package/dist/server/server/src/services/index.mjs +3 -1
  150. package/dist/server/server/src/services/index.mjs.map +1 -1
  151. package/dist/server/server/src/utils/debug-dump/redact.js +197 -0
  152. package/dist/server/server/src/utils/debug-dump/redact.js.map +1 -0
  153. package/dist/server/server/src/utils/debug-dump/redact.mjs +194 -0
  154. package/dist/server/server/src/utils/debug-dump/redact.mjs.map +1 -0
  155. package/dist/server/shared/utils/get-project-type.js +49 -0
  156. package/dist/server/shared/utils/get-project-type.js.map +1 -0
  157. package/dist/server/shared/utils/get-project-type.mjs +46 -0
  158. package/dist/server/shared/utils/get-project-type.mjs.map +1 -0
  159. package/dist/server/src/audit-logs/auth.d.ts +72 -0
  160. package/dist/server/src/audit-logs/auth.d.ts.map +1 -0
  161. package/dist/server/src/config/admin-actions.d.ts.map +1 -1
  162. package/dist/server/src/controllers/admin.d.ts +3 -0
  163. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  164. package/dist/server/src/controllers/authentication.d.ts.map +1 -1
  165. package/dist/server/src/controllers/index.d.ts +3 -0
  166. package/dist/server/src/controllers/index.d.ts.map +1 -1
  167. package/dist/server/src/index.d.ts +8 -0
  168. package/dist/server/src/index.d.ts.map +1 -1
  169. package/dist/server/src/register.d.ts.map +1 -1
  170. package/dist/server/src/routes/admin.d.ts.map +1 -1
  171. package/dist/server/src/services/auth.d.ts +6 -0
  172. package/dist/server/src/services/auth.d.ts.map +1 -1
  173. package/dist/server/src/services/debug-dump.d.ts +9 -0
  174. package/dist/server/src/services/debug-dump.d.ts.map +1 -0
  175. package/dist/server/src/services/index.d.ts +5 -0
  176. package/dist/server/src/services/index.d.ts.map +1 -1
  177. package/dist/server/src/utils/debug-dump/redact.d.ts +8 -0
  178. package/dist/server/src/utils/debug-dump/redact.d.ts.map +1 -0
  179. package/dist/shared/contracts/admin.d.ts +106 -0
  180. package/dist/shared/contracts/admin.d.ts.map +1 -1
  181. package/dist/shared/utils/__tests__/get-project-type.test.d.ts +1 -0
  182. package/dist/shared/utils/__tests__/get-project-type.test.d.ts.map +1 -0
  183. package/dist/shared/utils/get-project-type.d.ts +37 -0
  184. package/dist/shared/utils/get-project-type.d.ts.map +1 -0
  185. package/package.json +8 -8
  186. package/dist/admin/admin/src/utils/getProjectType.js +0 -22
  187. package/dist/admin/admin/src/utils/getProjectType.js.map +0 -1
  188. package/dist/admin/admin/src/utils/getProjectType.mjs +0 -20
  189. package/dist/admin/admin/src/utils/getProjectType.mjs.map +0 -1
  190. package/dist/admin/src/utils/getProjectType.d.ts +0 -16
@@ -85,7 +85,8 @@ const DEFAULT_RESET_PASSWORD_TOKEN_EXPIRES_IN = '1h';
85
85
  * Check login credentials
86
86
  * @param email the users email address
87
87
  * @param password the users password
88
- */ const checkCredentials = async ({ email, password })=>{
88
+ */ const USER_NOT_ACTIVE_MESSAGE = 'User not active';
89
+ const checkCredentials = async ({ email, password })=>{
89
90
  const user = await strapi.db.query('admin::user').findOne({
90
91
  where: {
91
92
  email
@@ -115,7 +116,7 @@ const DEFAULT_RESET_PASSWORD_TOKEN_EXPIRES_IN = '1h';
115
116
  null,
116
117
  false,
117
118
  {
118
- message: 'User not active'
119
+ message: USER_NOT_ACTIVE_MESSAGE
119
120
  }
120
121
  ];
121
122
  }
@@ -182,5 +183,5 @@ var auth = {
182
183
  resetPassword
183
184
  };
184
185
 
185
- export { assertResetPasswordTokenIsValid, assignResetPasswordToken, completePasswordReset, auth as default, getResetPasswordTokenTTL };
186
+ export { USER_NOT_ACTIVE_MESSAGE, assertResetPasswordTokenIsValid, assignResetPasswordToken, completePasswordReset, auth as default, getResetPasswordTokenTTL };
186
187
  //# sourceMappingURL=auth.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.mjs","sources":["../../../../../server/src/services/auth.ts"],"sourcesContent":["import bcrypt from 'bcryptjs';\nimport _ from 'lodash';\nimport { errors, emitAudit } from '@strapi/utils';\nimport { getService } from '../utils';\nimport { expiresInToSeconds } from './token';\nimport { AUDITED_EVENTS, toAdminUserEvent } from '../audit-logs/admin-users';\nimport type { AdminUser } from '../../../shared/contracts/shared';\nimport '@strapi/types';\n\nconst { ApplicationError } = errors;\n\n// Default lifetime of an admin reset-password token. Overridable via\n// `admin.forgotPassword.expiresIn` (number of seconds or a shorthand like '15m', '1h').\nconst DEFAULT_RESET_PASSWORD_TOKEN_EXPIRES_IN = '1h';\n\n/**\n * Resolve the reset-password token lifetime, in milliseconds, from config.\n * Falls back to {@link DEFAULT_RESET_PASSWORD_TOKEN_EXPIRES_IN} for unset/invalid values.\n */\nconst getResetPasswordTokenTTL = (): number => {\n const configured = strapi.config.get(\n 'admin.forgotPassword.expiresIn',\n DEFAULT_RESET_PASSWORD_TOKEN_EXPIRES_IN\n );\n const seconds =\n expiresInToSeconds(configured) ??\n (expiresInToSeconds(DEFAULT_RESET_PASSWORD_TOKEN_EXPIRES_IN) as number);\n return seconds * 1000;\n};\n\n/**\n * Create a reset-password token with an expiry and persist it on the user.\n * Shared by the CE and EE auth services so the expiry behaviour can't drift.\n * @returns the generated reset-password token\n */\nconst assignResetPasswordToken = async (userId: AdminUser['id']): Promise<string> => {\n const resetPasswordToken = getService('token').createToken();\n const resetPasswordTokenExpiresAt = new Date(Date.now() + getResetPasswordTokenTTL());\n\n const user = await getService('user').updateById(userId, {\n resetPasswordToken,\n resetPasswordTokenExpiresAt,\n });\n\n // null when the account was deleted between the caller's lookup and this write\n if (user) {\n await emitAudit({ strapi }, AUDITED_EVENTS.PASSWORD_RESET_CREATE, {\n ...toAdminUserEvent(user),\n expiresAt: user.resetPasswordTokenExpiresAt,\n });\n }\n\n return resetPasswordToken;\n};\n\n/**\n * Set the new password and consume the reset token. Shared by the CE and EE auth\n * services, after each has validated the token.\n */\nconst completePasswordReset = async (user: AdminUser, password: string): Promise<AdminUser> => {\n const updatedUser = await getService('user').updateById(user.id, {\n password,\n resetPasswordToken: null,\n resetPasswordTokenExpiresAt: null,\n });\n\n await emitAudit({ strapi }, AUDITED_EVENTS.PASSWORD_RESET_CONFIRM, toAdminUserEvent(updatedUser));\n\n return updatedUser;\n};\n\n/**\n * Reject a reset-password token that has expired — or that has no expiry at all\n * (tokens issued before this was introduced) — clearing the stale token so it\n * cannot be retried. Shared by the CE and EE auth services. (GH#25711)\n */\nconst assertResetPasswordTokenIsValid = async (user: AdminUser): Promise<void> => {\n const { resetPasswordTokenExpiresAt } = user;\n const isExpired =\n !resetPasswordTokenExpiresAt || new Date(resetPasswordTokenExpiresAt).getTime() <= Date.now();\n\n if (isExpired) {\n // Clear the stale token so it can no longer be retried.\n await getService('user').updateById(user.id, {\n resetPasswordToken: null,\n resetPasswordTokenExpiresAt: null,\n });\n throw new ApplicationError('This reset password token has expired');\n }\n};\n\n/**\n * hashes a password\n * @param password - password to hash\n * @returns hashed password\n */\nconst hashPassword = (password: string) => bcrypt.hash(password, 10);\n\n/**\n * Validate a password\n * @param password\n * @param hash\n * @returns {Promise<boolean>} is the password valid\n */\nconst validatePassword = (password: string, hash: string) => bcrypt.compare(password, hash);\n\n/**\n * Check login credentials\n * @param email the users email address\n * @param password the users password\n */\nconst checkCredentials = async ({ email, password }: { email: string; password: string }) => {\n const user: AdminUser = await strapi.db.query('admin::user').findOne({ where: { email } });\n\n if (!user || !user.password) {\n return [null, false, { message: 'Invalid credentials' }];\n }\n\n const isValid = await validatePassword(password, user.password);\n\n if (!isValid) {\n return [null, false, { message: 'Invalid credentials' }];\n }\n\n if (!(user.isActive === true)) {\n return [null, false, { message: 'User not active' }];\n }\n\n return [null, user];\n};\n\n/**\n * Send an email to the user if it exists or do nothing\n * @param email user email for which to reset the password\n */\nconst forgotPassword = async ({ email } = {} as { email: string }) => {\n const user: AdminUser = await strapi.db\n .query('admin::user')\n .findOne({ where: { email, isActive: true } });\n if (!user) {\n return;\n }\n\n const resetPasswordToken = await assignResetPasswordToken(user.id);\n\n // Send an email to the admin.\n const url = `${strapi.config.get(\n 'admin.absoluteUrl'\n )}/auth/reset-password?code=${resetPasswordToken}`;\n\n return strapi\n .plugin('email')\n .service('email')\n .sendTemplatedEmail(\n {\n to: user.email,\n from: strapi.config.get('admin.forgotPassword.from'),\n replyTo: strapi.config.get('admin.forgotPassword.replyTo'),\n },\n strapi.config.get('admin.forgotPassword.emailTemplate'),\n {\n url,\n user: _.pick(user, ['email', 'firstname', 'lastname', 'username']),\n }\n )\n .catch((err: unknown) => {\n // log error server side but do not disclose it to the user to avoid leaking informations\n strapi.log.error(err);\n });\n};\n\n/**\n * Reset a user password\n * @param resetPasswordToken token generated to request a password reset\n * @param password new user password\n */\nconst resetPassword = async (\n { resetPasswordToken, password } = {} as { resetPasswordToken: string; password: string }\n) => {\n const matchingUser: AdminUser | undefined = await strapi.db\n .query('admin::user')\n .findOne({ where: { resetPasswordToken, isActive: true } });\n\n if (!matchingUser) {\n throw new ApplicationError();\n }\n\n await assertResetPasswordTokenIsValid(matchingUser);\n\n return completePasswordReset(matchingUser, password);\n};\n\nexport default { checkCredentials, validatePassword, hashPassword, forgotPassword, resetPassword };\nexport {\n getResetPasswordTokenTTL,\n assignResetPasswordToken,\n assertResetPasswordTokenIsValid,\n completePasswordReset,\n};\n"],"names":["ApplicationError","errors","DEFAULT_RESET_PASSWORD_TOKEN_EXPIRES_IN","getResetPasswordTokenTTL","configured","strapi","config","get","seconds","expiresInToSeconds","assignResetPasswordToken","userId","resetPasswordToken","getService","createToken","resetPasswordTokenExpiresAt","Date","now","user","updateById","emitAudit","AUDITED_EVENTS","PASSWORD_RESET_CREATE","toAdminUserEvent","expiresAt","completePasswordReset","password","updatedUser","id","PASSWORD_RESET_CONFIRM","assertResetPasswordTokenIsValid","isExpired","getTime","hashPassword","bcrypt","hash","validatePassword","compare","checkCredentials","email","db","query","findOne","where","message","isValid","isActive","forgotPassword","url","plugin","service","sendTemplatedEmail","to","from","replyTo","_","pick","catch","err","log","error","resetPassword","matchingUser"],"mappings":"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"}
1
+ {"version":3,"file":"auth.mjs","sources":["../../../../../server/src/services/auth.ts"],"sourcesContent":["import bcrypt from 'bcryptjs';\nimport _ from 'lodash';\nimport { errors, emitAudit } from '@strapi/utils';\nimport { getService } from '../utils';\nimport { expiresInToSeconds } from './token';\nimport { AUDITED_EVENTS, toAdminUserEvent } from '../audit-logs/admin-users';\nimport type { AdminUser } from '../../../shared/contracts/shared';\nimport '@strapi/types';\n\nconst { ApplicationError } = errors;\n\n// Default lifetime of an admin reset-password token. Overridable via\n// `admin.forgotPassword.expiresIn` (number of seconds or a shorthand like '15m', '1h').\nconst DEFAULT_RESET_PASSWORD_TOKEN_EXPIRES_IN = '1h';\n\n/**\n * Resolve the reset-password token lifetime, in milliseconds, from config.\n * Falls back to {@link DEFAULT_RESET_PASSWORD_TOKEN_EXPIRES_IN} for unset/invalid values.\n */\nconst getResetPasswordTokenTTL = (): number => {\n const configured = strapi.config.get(\n 'admin.forgotPassword.expiresIn',\n DEFAULT_RESET_PASSWORD_TOKEN_EXPIRES_IN\n );\n const seconds =\n expiresInToSeconds(configured) ??\n (expiresInToSeconds(DEFAULT_RESET_PASSWORD_TOKEN_EXPIRES_IN) as number);\n return seconds * 1000;\n};\n\n/**\n * Create a reset-password token with an expiry and persist it on the user.\n * Shared by the CE and EE auth services so the expiry behaviour can't drift.\n * @returns the generated reset-password token\n */\nconst assignResetPasswordToken = async (userId: AdminUser['id']): Promise<string> => {\n const resetPasswordToken = getService('token').createToken();\n const resetPasswordTokenExpiresAt = new Date(Date.now() + getResetPasswordTokenTTL());\n\n const user = await getService('user').updateById(userId, {\n resetPasswordToken,\n resetPasswordTokenExpiresAt,\n });\n\n // null when the account was deleted between the caller's lookup and this write\n if (user) {\n await emitAudit({ strapi }, AUDITED_EVENTS.PASSWORD_RESET_CREATE, {\n ...toAdminUserEvent(user),\n expiresAt: user.resetPasswordTokenExpiresAt,\n });\n }\n\n return resetPasswordToken;\n};\n\n/**\n * Set the new password and consume the reset token. Shared by the CE and EE auth\n * services, after each has validated the token.\n */\nconst completePasswordReset = async (user: AdminUser, password: string): Promise<AdminUser> => {\n const updatedUser = await getService('user').updateById(user.id, {\n password,\n resetPasswordToken: null,\n resetPasswordTokenExpiresAt: null,\n });\n\n await emitAudit({ strapi }, AUDITED_EVENTS.PASSWORD_RESET_CONFIRM, toAdminUserEvent(updatedUser));\n\n return updatedUser;\n};\n\n/**\n * Reject a reset-password token that has expired — or that has no expiry at all\n * (tokens issued before this was introduced) — clearing the stale token so it\n * cannot be retried. Shared by the CE and EE auth services. (GH#25711)\n */\nconst assertResetPasswordTokenIsValid = async (user: AdminUser): Promise<void> => {\n const { resetPasswordTokenExpiresAt } = user;\n const isExpired =\n !resetPasswordTokenExpiresAt || new Date(resetPasswordTokenExpiresAt).getTime() <= Date.now();\n\n if (isExpired) {\n // Clear the stale token so it can no longer be retried.\n await getService('user').updateById(user.id, {\n resetPasswordToken: null,\n resetPasswordTokenExpiresAt: null,\n });\n throw new ApplicationError('This reset password token has expired');\n }\n};\n\n/**\n * hashes a password\n * @param password - password to hash\n * @returns hashed password\n */\nconst hashPassword = (password: string) => bcrypt.hash(password, 10);\n\n/**\n * Validate a password\n * @param password\n * @param hash\n * @returns {Promise<boolean>} is the password valid\n */\nconst validatePassword = (password: string, hash: string) => bcrypt.compare(password, hash);\n\n/**\n * Check login credentials\n * @param email the users email address\n * @param password the users password\n */\nexport const USER_NOT_ACTIVE_MESSAGE = 'User not active';\n\nconst checkCredentials = async ({ email, password }: { email: string; password: string }) => {\n const user: AdminUser = await strapi.db.query('admin::user').findOne({ where: { email } });\n\n if (!user || !user.password) {\n return [null, false, { message: 'Invalid credentials' }];\n }\n\n const isValid = await validatePassword(password, user.password);\n\n if (!isValid) {\n return [null, false, { message: 'Invalid credentials' }];\n }\n\n if (!(user.isActive === true)) {\n return [null, false, { message: USER_NOT_ACTIVE_MESSAGE }];\n }\n\n return [null, user];\n};\n\n/**\n * Send an email to the user if it exists or do nothing\n * @param email user email for which to reset the password\n */\nconst forgotPassword = async ({ email } = {} as { email: string }) => {\n const user: AdminUser = await strapi.db\n .query('admin::user')\n .findOne({ where: { email, isActive: true } });\n if (!user) {\n return;\n }\n\n const resetPasswordToken = await assignResetPasswordToken(user.id);\n\n // Send an email to the admin.\n const url = `${strapi.config.get(\n 'admin.absoluteUrl'\n )}/auth/reset-password?code=${resetPasswordToken}`;\n\n return strapi\n .plugin('email')\n .service('email')\n .sendTemplatedEmail(\n {\n to: user.email,\n from: strapi.config.get('admin.forgotPassword.from'),\n replyTo: strapi.config.get('admin.forgotPassword.replyTo'),\n },\n strapi.config.get('admin.forgotPassword.emailTemplate'),\n {\n url,\n user: _.pick(user, ['email', 'firstname', 'lastname', 'username']),\n }\n )\n .catch((err: unknown) => {\n // log error server side but do not disclose it to the user to avoid leaking informations\n strapi.log.error(err);\n });\n};\n\n/**\n * Reset a user password\n * @param resetPasswordToken token generated to request a password reset\n * @param password new user password\n */\nconst resetPassword = async (\n { resetPasswordToken, password } = {} as { resetPasswordToken: string; password: string }\n) => {\n const matchingUser: AdminUser | undefined = await strapi.db\n .query('admin::user')\n .findOne({ where: { resetPasswordToken, isActive: true } });\n\n if (!matchingUser) {\n throw new ApplicationError();\n }\n\n await assertResetPasswordTokenIsValid(matchingUser);\n\n return completePasswordReset(matchingUser, password);\n};\n\nexport default { checkCredentials, validatePassword, hashPassword, forgotPassword, resetPassword };\nexport {\n getResetPasswordTokenTTL,\n assignResetPasswordToken,\n assertResetPasswordTokenIsValid,\n completePasswordReset,\n};\n"],"names":["ApplicationError","errors","DEFAULT_RESET_PASSWORD_TOKEN_EXPIRES_IN","getResetPasswordTokenTTL","configured","strapi","config","get","seconds","expiresInToSeconds","assignResetPasswordToken","userId","resetPasswordToken","getService","createToken","resetPasswordTokenExpiresAt","Date","now","user","updateById","emitAudit","AUDITED_EVENTS","PASSWORD_RESET_CREATE","toAdminUserEvent","expiresAt","completePasswordReset","password","updatedUser","id","PASSWORD_RESET_CONFIRM","assertResetPasswordTokenIsValid","isExpired","getTime","hashPassword","bcrypt","hash","validatePassword","compare","USER_NOT_ACTIVE_MESSAGE","checkCredentials","email","db","query","findOne","where","message","isValid","isActive","forgotPassword","url","plugin","service","sendTemplatedEmail","to","from","replyTo","_","pick","catch","err","log","error","resetPassword","matchingUser"],"mappings":"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"}
@@ -0,0 +1,173 @@
1
+ 'use strict';
2
+
3
+ var os = require('os');
4
+ var path = require('path');
5
+ var redact = require('../utils/debug-dump/redact.js');
6
+ var getProjectType = require('../../../shared/utils/get-project-type.js');
7
+
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
+
10
+ var os__default = /*#__PURE__*/_interopDefault(os);
11
+ var path__default = /*#__PURE__*/_interopDefault(path);
12
+
13
+ // Only these process.env keys are ever emitted (never the whole environment).
14
+ const ENV_ALLOWLIST = [
15
+ 'NODE_ENV',
16
+ 'STRAPI_HOSTING',
17
+ 'STRAPI_DISABLE_LICENSE_PING',
18
+ 'STRAPI_DISABLE_EE'
19
+ ];
20
+ // Sensitive config subtrees masked wholesale (in addition to the key/value scrubber).
21
+ const SENSITIVE_CONFIG_PATHS = [
22
+ 'server.app.keys',
23
+ 'database.connection.connection',
24
+ 'admin.auth.secret',
25
+ 'admin.apiToken.salt',
26
+ 'admin.transfer.token.salt',
27
+ 'admin.secrets',
28
+ 'plugin::email.providerOptions',
29
+ 'plugin::email.settings',
30
+ 'plugin::upload.providerOptions'
31
+ ];
32
+ const debugDumpService = ({ strapi })=>({
33
+ async generate () {
34
+ const appRoot = strapi.config.get('dirs.app.root', '');
35
+ const homeDir = os__default.default.homedir();
36
+ const packageJson = strapi.config.get('info', {}) ?? {};
37
+ // The config provider (packages/core/core/src/services/config.ts) spreads the config it was
38
+ // built with onto itself, next to its get/set/has methods, and `get('')` does not return the
39
+ // root. Module config (plugin::*, api::*) is stored later with config.set, so it is never an
40
+ // own property of the provider. Take the top-level names from both places and read every
41
+ // value through config.get, which always sees the live tree.
42
+ const configNames = new Set([
43
+ ...Object.keys(strapi.config).filter((key)=>![
44
+ 'get',
45
+ 'set',
46
+ 'has'
47
+ ].includes(key)),
48
+ ...Object.keys(strapi.get('modules').getAll())
49
+ ]);
50
+ const rawConfig = {};
51
+ for (const name of configNames){
52
+ const value = strapi.config.get(name);
53
+ if (value !== undefined) {
54
+ rawConfig[name] = value;
55
+ }
56
+ }
57
+ const fullConfig = redact.scrub(rawConfig, {
58
+ appRoot,
59
+ homeDir,
60
+ extraPaths: SENSITIVE_CONFIG_PATHS
61
+ });
62
+ const env = {};
63
+ for (const key of ENV_ALLOWLIST){
64
+ env[key] = process.env[key];
65
+ }
66
+ let uploadPrivate = false;
67
+ try {
68
+ uploadPrivate = await strapi.plugin('upload').provider.isPrivate();
69
+ } catch {
70
+ uploadPrivate = false;
71
+ }
72
+ const retained = strapi.ee.retainedLicense;
73
+ // getInfo() makes a SQLite path relative to the working directory, which can still climb
74
+ // into a home directory (`../../home/<user>/...`). Resolve it and relativize it like every
75
+ // other path in the dump, so it reads `<app>/...` or `<home>/...`.
76
+ const databaseInfo = strapi.db.getInfo();
77
+ if (databaseInfo.client === 'sqlite' && databaseInfo.displayName) {
78
+ databaseInfo.displayName = redact.scrub(path__default.default.resolve(process.cwd(), databaseInfo.displayName), {
79
+ appRoot,
80
+ homeDir
81
+ });
82
+ }
83
+ const payload = {
84
+ dumpVersion: 1,
85
+ generatedAt: new Date().toISOString(),
86
+ strapi: {
87
+ version: strapi.config.get('info.strapi', null),
88
+ edition: strapi.EE ? 'EE' : 'CE',
89
+ // `edition` is the edition actually running, so a lapsed license reports CE. The plan
90
+ // still comes off the license, otherwise a dump from an expired Enterprise instance is
91
+ // indistinguishable from a project that never had a license, which is exactly the case
92
+ // Support is most likely to receive one for. `licenseStatus` below tells them apart.
93
+ projectType: getProjectType.getLicensedPlan({
94
+ licenseStatus: strapi.ee.licenseStatus,
95
+ type: strapi.ee.type ?? retained?.type,
96
+ planPriceId: strapi.ee.planPriceId ?? retained?.planPriceId
97
+ }),
98
+ environment: strapi.config.get('environment', ''),
99
+ autoReload: strapi.config.get('autoReload', false)
100
+ },
101
+ system: {
102
+ nodeVersion: process.version,
103
+ os: {
104
+ type: os__default.default.type(),
105
+ platform: os__default.default.platform(),
106
+ arch: os__default.default.arch(),
107
+ release: os__default.default.release()
108
+ },
109
+ isHostedOnStrapiCloud: process.env.STRAPI_HOSTING === 'strapi.cloud'
110
+ },
111
+ database: databaseInfo,
112
+ plugins: Object.keys(strapi.plugins),
113
+ providers: {
114
+ // A local provider is wired by its absolute path, so these go through scrub() too
115
+ upload: {
116
+ name: redact.scrub(strapi.config.get('plugin::upload.provider', 'local'), {
117
+ appRoot,
118
+ homeDir
119
+ }),
120
+ isPrivate: uploadPrivate
121
+ },
122
+ email: {
123
+ name: redact.scrub(strapi.config.get('plugin::email.provider', undefined), {
124
+ appRoot,
125
+ homeDir
126
+ })
127
+ }
128
+ },
129
+ contentModel: {
130
+ counts: {
131
+ contentTypes: Object.keys(strapi.contentTypes).length,
132
+ components: Object.keys(strapi.components).length
133
+ },
134
+ contentTypes: redact.scrub(Object.values(strapi.contentTypes), {
135
+ appRoot,
136
+ homeDir
137
+ }),
138
+ components: redact.scrub(Object.values(strapi.components), {
139
+ appRoot,
140
+ homeDir
141
+ })
142
+ },
143
+ customizations: strapi.getCustomizations(),
144
+ config: fullConfig,
145
+ packageJson: redact.scrub(packageJson, {
146
+ appRoot,
147
+ homeDir
148
+ }),
149
+ env
150
+ };
151
+ // Emitted whenever this instance has ever had a license, not only while one is usable, so
152
+ // an expired license still reports its plan, seats and subscription. `disable()` wipes
153
+ // `licenseInfo` and keeps a display-only snapshot in `retainedLicense`, so read through to
154
+ // it the same way `licenseLimitInformation` does.
155
+ if (strapi.EE || retained) {
156
+ payload.license = {
157
+ licenseStatus: strapi.ee.licenseStatus,
158
+ type: strapi.ee.type ?? retained?.type ?? null,
159
+ // Live only, like the license endpoint: disable() clears it, so an ended trial is not one.
160
+ isTrial: strapi.ee.isTrial,
161
+ expireAt: strapi.ee.expireAt ?? retained?.expireAt ?? null,
162
+ seats: strapi.ee.seats ?? retained?.seats ?? null,
163
+ subscriptionId: strapi.ee.subscriptionId ?? retained?.subscriptionId ?? null,
164
+ features: strapi.EE ? strapi.ee.features.list() : retained?.features ?? [],
165
+ entitlements: strapi.EE ? strapi.ee.entitlements.list() : strapi.ee.entitlements.listRetained()
166
+ };
167
+ }
168
+ return payload;
169
+ }
170
+ });
171
+
172
+ module.exports = debugDumpService;
173
+ //# sourceMappingURL=debug-dump.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-dump.js","sources":["../../../../../server/src/services/debug-dump.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport type { Core } from '@strapi/types';\nimport { scrub } from '../utils/debug-dump/redact';\nimport type { DebugDumpPayload } from '../../../shared/contracts/admin';\nimport { getLicensedPlan } from '../../../shared/utils/get-project-type';\n\n// Only these process.env keys are ever emitted (never the whole environment).\nconst ENV_ALLOWLIST = [\n 'NODE_ENV',\n 'STRAPI_HOSTING',\n 'STRAPI_DISABLE_LICENSE_PING',\n 'STRAPI_DISABLE_EE',\n] as const;\n\n// Sensitive config subtrees masked wholesale (in addition to the key/value scrubber).\nconst SENSITIVE_CONFIG_PATHS = [\n 'server.app.keys',\n 'database.connection.connection',\n 'admin.auth.secret',\n 'admin.apiToken.salt',\n 'admin.transfer.token.salt',\n 'admin.secrets',\n 'plugin::email.providerOptions',\n 'plugin::email.settings',\n 'plugin::upload.providerOptions',\n];\n\nconst debugDumpService = ({ strapi }: { strapi: Core.Strapi }) => ({\n async generate(): Promise<DebugDumpPayload> {\n const appRoot: string = strapi.config.get('dirs.app.root', '') as string;\n const homeDir = os.homedir();\n\n const packageJson = (strapi.config.get('info', {}) ?? {}) as Record<string, unknown>;\n\n // The config provider (packages/core/core/src/services/config.ts) spreads the config it was\n // built with onto itself, next to its get/set/has methods, and `get('')` does not return the\n // root. Module config (plugin::*, api::*) is stored later with config.set, so it is never an\n // own property of the provider. Take the top-level names from both places and read every\n // value through config.get, which always sees the live tree.\n const configNames = new Set([\n ...Object.keys(strapi.config).filter((key) => !['get', 'set', 'has'].includes(key)),\n ...Object.keys(strapi.get('modules').getAll()),\n ]);\n const rawConfig: Record<string, unknown> = {};\n for (const name of configNames) {\n const value = strapi.config.get(name);\n if (value !== undefined) {\n rawConfig[name] = value;\n }\n }\n const fullConfig = scrub(rawConfig, {\n appRoot,\n homeDir,\n extraPaths: SENSITIVE_CONFIG_PATHS,\n }) as Record<string, unknown>;\n\n const env: Record<string, string | undefined> = {};\n for (const key of ENV_ALLOWLIST) {\n env[key] = process.env[key];\n }\n\n let uploadPrivate = false;\n try {\n uploadPrivate = await strapi.plugin('upload').provider.isPrivate();\n } catch {\n uploadPrivate = false;\n }\n\n const retained = strapi.ee.retainedLicense;\n\n // getInfo() makes a SQLite path relative to the working directory, which can still climb\n // into a home directory (`../../home/<user>/...`). Resolve it and relativize it like every\n // other path in the dump, so it reads `<app>/...` or `<home>/...`.\n const databaseInfo = strapi.db.getInfo();\n if (databaseInfo.client === 'sqlite' && databaseInfo.displayName) {\n databaseInfo.displayName = scrub(path.resolve(process.cwd(), databaseInfo.displayName), {\n appRoot,\n homeDir,\n }) as string;\n }\n\n const payload: DebugDumpPayload = {\n dumpVersion: 1,\n generatedAt: new Date().toISOString(),\n strapi: {\n version: strapi.config.get('info.strapi', null) as string | null,\n edition: strapi.EE ? 'EE' : 'CE',\n // `edition` is the edition actually running, so a lapsed license reports CE. The plan\n // still comes off the license, otherwise a dump from an expired Enterprise instance is\n // indistinguishable from a project that never had a license, which is exactly the case\n // Support is most likely to receive one for. `licenseStatus` below tells them apart.\n projectType: getLicensedPlan({\n licenseStatus: strapi.ee.licenseStatus,\n type: strapi.ee.type ?? retained?.type,\n planPriceId: strapi.ee.planPriceId ?? retained?.planPriceId,\n }),\n environment: strapi.config.get('environment', '') as string,\n autoReload: strapi.config.get('autoReload', false) as boolean,\n },\n system: {\n nodeVersion: process.version,\n os: { type: os.type(), platform: os.platform(), arch: os.arch(), release: os.release() },\n isHostedOnStrapiCloud: process.env.STRAPI_HOSTING === 'strapi.cloud',\n },\n database: databaseInfo,\n plugins: Object.keys(strapi.plugins),\n providers: {\n // A local provider is wired by its absolute path, so these go through scrub() too\n upload: {\n name: scrub(strapi.config.get('plugin::upload.provider', 'local'), {\n appRoot,\n homeDir,\n }) as string,\n isPrivate: uploadPrivate,\n },\n email: {\n name: scrub(strapi.config.get('plugin::email.provider', undefined), {\n appRoot,\n homeDir,\n }) as string | undefined,\n },\n },\n contentModel: {\n counts: {\n contentTypes: Object.keys(strapi.contentTypes).length,\n components: Object.keys(strapi.components).length,\n },\n contentTypes: scrub(Object.values(strapi.contentTypes), { appRoot, homeDir }) as unknown[],\n components: scrub(Object.values(strapi.components), { appRoot, homeDir }) as unknown[],\n },\n customizations: strapi.getCustomizations(),\n config: fullConfig,\n packageJson: scrub(packageJson, { appRoot, homeDir }) as Record<string, unknown>,\n env,\n };\n\n // Emitted whenever this instance has ever had a license, not only while one is usable, so\n // an expired license still reports its plan, seats and subscription. `disable()` wipes\n // `licenseInfo` and keeps a display-only snapshot in `retainedLicense`, so read through to\n // it the same way `licenseLimitInformation` does.\n if (strapi.EE || retained) {\n payload.license = {\n licenseStatus: strapi.ee.licenseStatus,\n type: strapi.ee.type ?? retained?.type ?? null,\n // Live only, like the license endpoint: disable() clears it, so an ended trial is not one.\n isTrial: strapi.ee.isTrial,\n expireAt: strapi.ee.expireAt ?? retained?.expireAt ?? null,\n seats: strapi.ee.seats ?? retained?.seats ?? null,\n subscriptionId: strapi.ee.subscriptionId ?? retained?.subscriptionId ?? null,\n features: strapi.EE ? strapi.ee.features.list() : (retained?.features ?? []),\n entitlements: strapi.EE\n ? strapi.ee.entitlements.list()\n : strapi.ee.entitlements.listRetained(),\n };\n }\n\n return payload;\n },\n});\n\nexport default debugDumpService;\n"],"names":["ENV_ALLOWLIST","SENSITIVE_CONFIG_PATHS","debugDumpService","strapi","generate","appRoot","config","get","homeDir","os","homedir","packageJson","configNames","Set","Object","keys","filter","key","includes","getAll","rawConfig","name","value","undefined","fullConfig","scrub","extraPaths","env","process","uploadPrivate","plugin","provider","isPrivate","retained","ee","retainedLicense","databaseInfo","db","getInfo","client","displayName","path","resolve","cwd","payload","dumpVersion","generatedAt","Date","toISOString","version","edition","EE","projectType","getLicensedPlan","licenseStatus","type","planPriceId","environment","autoReload","system","nodeVersion","platform","arch","release","isHostedOnStrapiCloud","STRAPI_HOSTING","database","plugins","providers","upload","email","contentModel","counts","contentTypes","length","components","values","customizations","getCustomizations","license","isTrial","expireAt","seats","subscriptionId","features","list","entitlements","listRetained"],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ import os from 'os';
2
+ import path from 'path';
3
+ import { scrub } from '../utils/debug-dump/redact.mjs';
4
+ import { getLicensedPlan } from '../../../shared/utils/get-project-type.mjs';
5
+
6
+ // Only these process.env keys are ever emitted (never the whole environment).
7
+ const ENV_ALLOWLIST = [
8
+ 'NODE_ENV',
9
+ 'STRAPI_HOSTING',
10
+ 'STRAPI_DISABLE_LICENSE_PING',
11
+ 'STRAPI_DISABLE_EE'
12
+ ];
13
+ // Sensitive config subtrees masked wholesale (in addition to the key/value scrubber).
14
+ const SENSITIVE_CONFIG_PATHS = [
15
+ 'server.app.keys',
16
+ 'database.connection.connection',
17
+ 'admin.auth.secret',
18
+ 'admin.apiToken.salt',
19
+ 'admin.transfer.token.salt',
20
+ 'admin.secrets',
21
+ 'plugin::email.providerOptions',
22
+ 'plugin::email.settings',
23
+ 'plugin::upload.providerOptions'
24
+ ];
25
+ const debugDumpService = ({ strapi })=>({
26
+ async generate () {
27
+ const appRoot = strapi.config.get('dirs.app.root', '');
28
+ const homeDir = os.homedir();
29
+ const packageJson = strapi.config.get('info', {}) ?? {};
30
+ // The config provider (packages/core/core/src/services/config.ts) spreads the config it was
31
+ // built with onto itself, next to its get/set/has methods, and `get('')` does not return the
32
+ // root. Module config (plugin::*, api::*) is stored later with config.set, so it is never an
33
+ // own property of the provider. Take the top-level names from both places and read every
34
+ // value through config.get, which always sees the live tree.
35
+ const configNames = new Set([
36
+ ...Object.keys(strapi.config).filter((key)=>![
37
+ 'get',
38
+ 'set',
39
+ 'has'
40
+ ].includes(key)),
41
+ ...Object.keys(strapi.get('modules').getAll())
42
+ ]);
43
+ const rawConfig = {};
44
+ for (const name of configNames){
45
+ const value = strapi.config.get(name);
46
+ if (value !== undefined) {
47
+ rawConfig[name] = value;
48
+ }
49
+ }
50
+ const fullConfig = scrub(rawConfig, {
51
+ appRoot,
52
+ homeDir,
53
+ extraPaths: SENSITIVE_CONFIG_PATHS
54
+ });
55
+ const env = {};
56
+ for (const key of ENV_ALLOWLIST){
57
+ env[key] = process.env[key];
58
+ }
59
+ let uploadPrivate = false;
60
+ try {
61
+ uploadPrivate = await strapi.plugin('upload').provider.isPrivate();
62
+ } catch {
63
+ uploadPrivate = false;
64
+ }
65
+ const retained = strapi.ee.retainedLicense;
66
+ // getInfo() makes a SQLite path relative to the working directory, which can still climb
67
+ // into a home directory (`../../home/<user>/...`). Resolve it and relativize it like every
68
+ // other path in the dump, so it reads `<app>/...` or `<home>/...`.
69
+ const databaseInfo = strapi.db.getInfo();
70
+ if (databaseInfo.client === 'sqlite' && databaseInfo.displayName) {
71
+ databaseInfo.displayName = scrub(path.resolve(process.cwd(), databaseInfo.displayName), {
72
+ appRoot,
73
+ homeDir
74
+ });
75
+ }
76
+ const payload = {
77
+ dumpVersion: 1,
78
+ generatedAt: new Date().toISOString(),
79
+ strapi: {
80
+ version: strapi.config.get('info.strapi', null),
81
+ edition: strapi.EE ? 'EE' : 'CE',
82
+ // `edition` is the edition actually running, so a lapsed license reports CE. The plan
83
+ // still comes off the license, otherwise a dump from an expired Enterprise instance is
84
+ // indistinguishable from a project that never had a license, which is exactly the case
85
+ // Support is most likely to receive one for. `licenseStatus` below tells them apart.
86
+ projectType: getLicensedPlan({
87
+ licenseStatus: strapi.ee.licenseStatus,
88
+ type: strapi.ee.type ?? retained?.type,
89
+ planPriceId: strapi.ee.planPriceId ?? retained?.planPriceId
90
+ }),
91
+ environment: strapi.config.get('environment', ''),
92
+ autoReload: strapi.config.get('autoReload', false)
93
+ },
94
+ system: {
95
+ nodeVersion: process.version,
96
+ os: {
97
+ type: os.type(),
98
+ platform: os.platform(),
99
+ arch: os.arch(),
100
+ release: os.release()
101
+ },
102
+ isHostedOnStrapiCloud: process.env.STRAPI_HOSTING === 'strapi.cloud'
103
+ },
104
+ database: databaseInfo,
105
+ plugins: Object.keys(strapi.plugins),
106
+ providers: {
107
+ // A local provider is wired by its absolute path, so these go through scrub() too
108
+ upload: {
109
+ name: scrub(strapi.config.get('plugin::upload.provider', 'local'), {
110
+ appRoot,
111
+ homeDir
112
+ }),
113
+ isPrivate: uploadPrivate
114
+ },
115
+ email: {
116
+ name: scrub(strapi.config.get('plugin::email.provider', undefined), {
117
+ appRoot,
118
+ homeDir
119
+ })
120
+ }
121
+ },
122
+ contentModel: {
123
+ counts: {
124
+ contentTypes: Object.keys(strapi.contentTypes).length,
125
+ components: Object.keys(strapi.components).length
126
+ },
127
+ contentTypes: scrub(Object.values(strapi.contentTypes), {
128
+ appRoot,
129
+ homeDir
130
+ }),
131
+ components: scrub(Object.values(strapi.components), {
132
+ appRoot,
133
+ homeDir
134
+ })
135
+ },
136
+ customizations: strapi.getCustomizations(),
137
+ config: fullConfig,
138
+ packageJson: scrub(packageJson, {
139
+ appRoot,
140
+ homeDir
141
+ }),
142
+ env
143
+ };
144
+ // Emitted whenever this instance has ever had a license, not only while one is usable, so
145
+ // an expired license still reports its plan, seats and subscription. `disable()` wipes
146
+ // `licenseInfo` and keeps a display-only snapshot in `retainedLicense`, so read through to
147
+ // it the same way `licenseLimitInformation` does.
148
+ if (strapi.EE || retained) {
149
+ payload.license = {
150
+ licenseStatus: strapi.ee.licenseStatus,
151
+ type: strapi.ee.type ?? retained?.type ?? null,
152
+ // Live only, like the license endpoint: disable() clears it, so an ended trial is not one.
153
+ isTrial: strapi.ee.isTrial,
154
+ expireAt: strapi.ee.expireAt ?? retained?.expireAt ?? null,
155
+ seats: strapi.ee.seats ?? retained?.seats ?? null,
156
+ subscriptionId: strapi.ee.subscriptionId ?? retained?.subscriptionId ?? null,
157
+ features: strapi.EE ? strapi.ee.features.list() : retained?.features ?? [],
158
+ entitlements: strapi.EE ? strapi.ee.entitlements.list() : strapi.ee.entitlements.listRetained()
159
+ };
160
+ }
161
+ return payload;
162
+ }
163
+ });
164
+
165
+ export { debugDumpService as default };
166
+ //# sourceMappingURL=debug-dump.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-dump.mjs","sources":["../../../../../server/src/services/debug-dump.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport type { Core } from '@strapi/types';\nimport { scrub } from '../utils/debug-dump/redact';\nimport type { DebugDumpPayload } from '../../../shared/contracts/admin';\nimport { getLicensedPlan } from '../../../shared/utils/get-project-type';\n\n// Only these process.env keys are ever emitted (never the whole environment).\nconst ENV_ALLOWLIST = [\n 'NODE_ENV',\n 'STRAPI_HOSTING',\n 'STRAPI_DISABLE_LICENSE_PING',\n 'STRAPI_DISABLE_EE',\n] as const;\n\n// Sensitive config subtrees masked wholesale (in addition to the key/value scrubber).\nconst SENSITIVE_CONFIG_PATHS = [\n 'server.app.keys',\n 'database.connection.connection',\n 'admin.auth.secret',\n 'admin.apiToken.salt',\n 'admin.transfer.token.salt',\n 'admin.secrets',\n 'plugin::email.providerOptions',\n 'plugin::email.settings',\n 'plugin::upload.providerOptions',\n];\n\nconst debugDumpService = ({ strapi }: { strapi: Core.Strapi }) => ({\n async generate(): Promise<DebugDumpPayload> {\n const appRoot: string = strapi.config.get('dirs.app.root', '') as string;\n const homeDir = os.homedir();\n\n const packageJson = (strapi.config.get('info', {}) ?? {}) as Record<string, unknown>;\n\n // The config provider (packages/core/core/src/services/config.ts) spreads the config it was\n // built with onto itself, next to its get/set/has methods, and `get('')` does not return the\n // root. Module config (plugin::*, api::*) is stored later with config.set, so it is never an\n // own property of the provider. Take the top-level names from both places and read every\n // value through config.get, which always sees the live tree.\n const configNames = new Set([\n ...Object.keys(strapi.config).filter((key) => !['get', 'set', 'has'].includes(key)),\n ...Object.keys(strapi.get('modules').getAll()),\n ]);\n const rawConfig: Record<string, unknown> = {};\n for (const name of configNames) {\n const value = strapi.config.get(name);\n if (value !== undefined) {\n rawConfig[name] = value;\n }\n }\n const fullConfig = scrub(rawConfig, {\n appRoot,\n homeDir,\n extraPaths: SENSITIVE_CONFIG_PATHS,\n }) as Record<string, unknown>;\n\n const env: Record<string, string | undefined> = {};\n for (const key of ENV_ALLOWLIST) {\n env[key] = process.env[key];\n }\n\n let uploadPrivate = false;\n try {\n uploadPrivate = await strapi.plugin('upload').provider.isPrivate();\n } catch {\n uploadPrivate = false;\n }\n\n const retained = strapi.ee.retainedLicense;\n\n // getInfo() makes a SQLite path relative to the working directory, which can still climb\n // into a home directory (`../../home/<user>/...`). Resolve it and relativize it like every\n // other path in the dump, so it reads `<app>/...` or `<home>/...`.\n const databaseInfo = strapi.db.getInfo();\n if (databaseInfo.client === 'sqlite' && databaseInfo.displayName) {\n databaseInfo.displayName = scrub(path.resolve(process.cwd(), databaseInfo.displayName), {\n appRoot,\n homeDir,\n }) as string;\n }\n\n const payload: DebugDumpPayload = {\n dumpVersion: 1,\n generatedAt: new Date().toISOString(),\n strapi: {\n version: strapi.config.get('info.strapi', null) as string | null,\n edition: strapi.EE ? 'EE' : 'CE',\n // `edition` is the edition actually running, so a lapsed license reports CE. The plan\n // still comes off the license, otherwise a dump from an expired Enterprise instance is\n // indistinguishable from a project that never had a license, which is exactly the case\n // Support is most likely to receive one for. `licenseStatus` below tells them apart.\n projectType: getLicensedPlan({\n licenseStatus: strapi.ee.licenseStatus,\n type: strapi.ee.type ?? retained?.type,\n planPriceId: strapi.ee.planPriceId ?? retained?.planPriceId,\n }),\n environment: strapi.config.get('environment', '') as string,\n autoReload: strapi.config.get('autoReload', false) as boolean,\n },\n system: {\n nodeVersion: process.version,\n os: { type: os.type(), platform: os.platform(), arch: os.arch(), release: os.release() },\n isHostedOnStrapiCloud: process.env.STRAPI_HOSTING === 'strapi.cloud',\n },\n database: databaseInfo,\n plugins: Object.keys(strapi.plugins),\n providers: {\n // A local provider is wired by its absolute path, so these go through scrub() too\n upload: {\n name: scrub(strapi.config.get('plugin::upload.provider', 'local'), {\n appRoot,\n homeDir,\n }) as string,\n isPrivate: uploadPrivate,\n },\n email: {\n name: scrub(strapi.config.get('plugin::email.provider', undefined), {\n appRoot,\n homeDir,\n }) as string | undefined,\n },\n },\n contentModel: {\n counts: {\n contentTypes: Object.keys(strapi.contentTypes).length,\n components: Object.keys(strapi.components).length,\n },\n contentTypes: scrub(Object.values(strapi.contentTypes), { appRoot, homeDir }) as unknown[],\n components: scrub(Object.values(strapi.components), { appRoot, homeDir }) as unknown[],\n },\n customizations: strapi.getCustomizations(),\n config: fullConfig,\n packageJson: scrub(packageJson, { appRoot, homeDir }) as Record<string, unknown>,\n env,\n };\n\n // Emitted whenever this instance has ever had a license, not only while one is usable, so\n // an expired license still reports its plan, seats and subscription. `disable()` wipes\n // `licenseInfo` and keeps a display-only snapshot in `retainedLicense`, so read through to\n // it the same way `licenseLimitInformation` does.\n if (strapi.EE || retained) {\n payload.license = {\n licenseStatus: strapi.ee.licenseStatus,\n type: strapi.ee.type ?? retained?.type ?? null,\n // Live only, like the license endpoint: disable() clears it, so an ended trial is not one.\n isTrial: strapi.ee.isTrial,\n expireAt: strapi.ee.expireAt ?? retained?.expireAt ?? null,\n seats: strapi.ee.seats ?? retained?.seats ?? null,\n subscriptionId: strapi.ee.subscriptionId ?? retained?.subscriptionId ?? null,\n features: strapi.EE ? strapi.ee.features.list() : (retained?.features ?? []),\n entitlements: strapi.EE\n ? strapi.ee.entitlements.list()\n : strapi.ee.entitlements.listRetained(),\n };\n }\n\n return payload;\n },\n});\n\nexport default debugDumpService;\n"],"names":["ENV_ALLOWLIST","SENSITIVE_CONFIG_PATHS","debugDumpService","strapi","generate","appRoot","config","get","homeDir","os","homedir","packageJson","configNames","Set","Object","keys","filter","key","includes","getAll","rawConfig","name","value","undefined","fullConfig","scrub","extraPaths","env","process","uploadPrivate","plugin","provider","isPrivate","retained","ee","retainedLicense","databaseInfo","db","getInfo","client","displayName","path","resolve","cwd","payload","dumpVersion","generatedAt","Date","toISOString","version","edition","EE","projectType","getLicensedPlan","licenseStatus","type","planPriceId","environment","autoReload","system","nodeVersion","platform","arch","release","isHostedOnStrapiCloud","STRAPI_HOSTING","database","plugins","providers","upload","email","contentModel","counts","contentTypes","length","components","values","customizations","getCustomizations","license","isTrial","expireAt","seats","subscriptionId","features","list","entitlements","listRetained"],"mappings":"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"}
@@ -16,6 +16,7 @@ var apiToken = require('./api-token.js');
16
16
  var index = require('./transfer/index.js');
17
17
  var projectSettings = require('./project-settings.js');
18
18
  var homepage = require('./homepage.js');
19
+ var debugDump = require('./debug-dump.js');
19
20
 
20
21
  function _interopNamespaceDefaultOnly (e) { return Object.freeze({ __proto__: null, default: e }); }
21
22
 
@@ -43,7 +44,8 @@ var services = {
43
44
  transfer: index,
44
45
  'project-settings': projectSettings,
45
46
  encryption,
46
- homepage: homepage.homepageService
47
+ homepage: homepage.homepageService,
48
+ 'debug-dump': debugDump
47
49
  };
48
50
 
49
51
  module.exports = services;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../server/src/services/index.ts"],"sourcesContent":["// NOTE: Make sure to use default export for services overwritten in EE\nimport auth from './auth';\nimport user from './user';\nimport role from './role';\nimport passport from './passport';\nimport metrics from './metrics';\nimport encryption from './encryption';\nimport * as token from './token';\nimport * as permission from './permission';\nimport * as contentType from './content-type';\nimport * as constants from './constants';\nimport * as condition from './condition';\nimport * as action from './action';\nimport { createTokenService } from './api-token';\nimport * as transfer from './transfer';\nimport * as projectSettings from './project-settings';\nimport { homepageService } from './homepage';\n\nconst contentApiTokenService = createTokenService('content-api');\nconst adminTokenService = createTokenService('admin');\n\n// TODO: TS - Export services one by one as this export is cjs\nexport default {\n auth,\n user,\n role,\n passport,\n token,\n permission,\n metrics,\n 'content-type': contentType,\n constants,\n condition,\n action,\n /** @deprecated Use 'api-token-content-api' instead */\n 'api-token': contentApiTokenService,\n 'api-token-content-api': contentApiTokenService,\n 'api-token-admin': adminTokenService,\n transfer,\n 'project-settings': projectSettings,\n encryption,\n homepage: homepageService,\n};\n"],"names":["contentApiTokenService","createTokenService","adminTokenService","auth","user","role","passport","token","permission","metrics","contentType","constants","condition","action","transfer","projectSettings","encryption","homepage","homepageService"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAkBA,MAAMA,yBAAyBC,2BAAAA,CAAmB,aAAA,CAAA;AAClD,MAAMC,oBAAoBD,2BAAAA,CAAmB,OAAA,CAAA;AAE7C;AACA,eAAe;AACbE,UAAAA,YAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,QAAAA;AACAC,IAAAA,KAAAA;AACAC,IAAAA,UAAAA;AACAC,IAAAA,OAAAA;IACA,cAAA,EAAgBC,WAAAA;AAChBC,eAAAA,oBAAAA;AACAC,IAAAA,SAAAA;AACAC,IAAAA,MAAAA;AACA,2DACA,WAAA,EAAab,sBAAAA;IACb,uBAAA,EAAyBA,sBAAAA;IACzB,iBAAA,EAAmBE,iBAAAA;AACnBY,cAAAA,KAAAA;IACA,kBAAA,EAAoBC,eAAAA;AACpBC,IAAAA,UAAAA;IACAC,QAAAA,EAAUC;AACZ,CAAA;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../server/src/services/index.ts"],"sourcesContent":["// NOTE: Make sure to use default export for services overwritten in EE\nimport auth from './auth';\nimport user from './user';\nimport role from './role';\nimport passport from './passport';\nimport metrics from './metrics';\nimport encryption from './encryption';\nimport * as token from './token';\nimport * as permission from './permission';\nimport * as contentType from './content-type';\nimport * as constants from './constants';\nimport * as condition from './condition';\nimport * as action from './action';\nimport { createTokenService } from './api-token';\nimport * as transfer from './transfer';\nimport * as projectSettings from './project-settings';\nimport { homepageService } from './homepage';\nimport debugDump from './debug-dump';\n\nconst contentApiTokenService = createTokenService('content-api');\nconst adminTokenService = createTokenService('admin');\n\n// TODO: TS - Export services one by one as this export is cjs\nexport default {\n auth,\n user,\n role,\n passport,\n token,\n permission,\n metrics,\n 'content-type': contentType,\n constants,\n condition,\n action,\n /** @deprecated Use 'api-token-content-api' instead */\n 'api-token': contentApiTokenService,\n 'api-token-content-api': contentApiTokenService,\n 'api-token-admin': adminTokenService,\n transfer,\n 'project-settings': projectSettings,\n encryption,\n homepage: homepageService,\n 'debug-dump': debugDump,\n};\n"],"names":["contentApiTokenService","createTokenService","adminTokenService","auth","user","role","passport","token","permission","metrics","contentType","constants","condition","action","transfer","projectSettings","encryption","homepage","homepageService","debugDump"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAmBA,MAAMA,yBAAyBC,2BAAAA,CAAmB,aAAA,CAAA;AAClD,MAAMC,oBAAoBD,2BAAAA,CAAmB,OAAA,CAAA;AAE7C;AACA,eAAe;AACbE,UAAAA,YAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,QAAAA;AACAC,IAAAA,KAAAA;AACAC,IAAAA,UAAAA;AACAC,IAAAA,OAAAA;IACA,cAAA,EAAgBC,WAAAA;AAChBC,eAAAA,oBAAAA;AACAC,IAAAA,SAAAA;AACAC,IAAAA,MAAAA;AACA,2DACA,WAAA,EAAab,sBAAAA;IACb,uBAAA,EAAyBA,sBAAAA;IACzB,iBAAA,EAAmBE,iBAAAA;AACnBY,cAAAA,KAAAA;IACA,kBAAA,EAAoBC,eAAAA;AACpBC,IAAAA,UAAAA;IACAC,QAAAA,EAAUC,wBAAAA;IACV,YAAA,EAAcC;AAChB,CAAA;;;;"}
@@ -14,6 +14,7 @@ import { createTokenService } from './api-token.mjs';
14
14
  import * as index from './transfer/index.mjs';
15
15
  import * as projectSettings from './project-settings.mjs';
16
16
  import { homepageService } from './homepage.mjs';
17
+ import debugDumpService from './debug-dump.mjs';
17
18
 
18
19
  // NOTE: Make sure to use default export for services overwritten in EE
19
20
  const contentApiTokenService = createTokenService('content-api');
@@ -37,7 +38,8 @@ var services = {
37
38
  transfer: index,
38
39
  'project-settings': projectSettings,
39
40
  encryption,
40
- homepage: homepageService
41
+ homepage: homepageService,
42
+ 'debug-dump': debugDumpService
41
43
  };
42
44
 
43
45
  export { services as default };
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../../server/src/services/index.ts"],"sourcesContent":["// NOTE: Make sure to use default export for services overwritten in EE\nimport auth from './auth';\nimport user from './user';\nimport role from './role';\nimport passport from './passport';\nimport metrics from './metrics';\nimport encryption from './encryption';\nimport * as token from './token';\nimport * as permission from './permission';\nimport * as contentType from './content-type';\nimport * as constants from './constants';\nimport * as condition from './condition';\nimport * as action from './action';\nimport { createTokenService } from './api-token';\nimport * as transfer from './transfer';\nimport * as projectSettings from './project-settings';\nimport { homepageService } from './homepage';\n\nconst contentApiTokenService = createTokenService('content-api');\nconst adminTokenService = createTokenService('admin');\n\n// TODO: TS - Export services one by one as this export is cjs\nexport default {\n auth,\n user,\n role,\n passport,\n token,\n permission,\n metrics,\n 'content-type': contentType,\n constants,\n condition,\n action,\n /** @deprecated Use 'api-token-content-api' instead */\n 'api-token': contentApiTokenService,\n 'api-token-content-api': contentApiTokenService,\n 'api-token-admin': adminTokenService,\n transfer,\n 'project-settings': projectSettings,\n encryption,\n homepage: homepageService,\n};\n"],"names":["contentApiTokenService","createTokenService","adminTokenService","auth","user","role","passport","token","permission","metrics","contentType","constants","condition","action","transfer","projectSettings","encryption","homepage","homepageService"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAkBA,MAAMA,yBAAyBC,kBAAAA,CAAmB,aAAA,CAAA;AAClD,MAAMC,oBAAoBD,kBAAAA,CAAmB,OAAA,CAAA;AAE7C;AACA,eAAe;AACbE,IAAAA,IAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,QAAAA;AACAC,IAAAA,KAAAA;AACAC,IAAAA,UAAAA;AACAC,IAAAA,OAAAA;IACA,cAAA,EAAgBC,WAAAA;AAChBC,IAAAA,SAAAA;AACAC,IAAAA,SAAAA;AACAC,IAAAA,MAAAA;AACA,2DACA,WAAA,EAAab,sBAAAA;IACb,uBAAA,EAAyBA,sBAAAA;IACzB,iBAAA,EAAmBE,iBAAAA;AACnBY,cAAAA,KAAAA;IACA,kBAAA,EAAoBC,eAAAA;AACpBC,IAAAA,UAAAA;IACAC,QAAAA,EAAUC;AACZ,CAAA;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../../server/src/services/index.ts"],"sourcesContent":["// NOTE: Make sure to use default export for services overwritten in EE\nimport auth from './auth';\nimport user from './user';\nimport role from './role';\nimport passport from './passport';\nimport metrics from './metrics';\nimport encryption from './encryption';\nimport * as token from './token';\nimport * as permission from './permission';\nimport * as contentType from './content-type';\nimport * as constants from './constants';\nimport * as condition from './condition';\nimport * as action from './action';\nimport { createTokenService } from './api-token';\nimport * as transfer from './transfer';\nimport * as projectSettings from './project-settings';\nimport { homepageService } from './homepage';\nimport debugDump from './debug-dump';\n\nconst contentApiTokenService = createTokenService('content-api');\nconst adminTokenService = createTokenService('admin');\n\n// TODO: TS - Export services one by one as this export is cjs\nexport default {\n auth,\n user,\n role,\n passport,\n token,\n permission,\n metrics,\n 'content-type': contentType,\n constants,\n condition,\n action,\n /** @deprecated Use 'api-token-content-api' instead */\n 'api-token': contentApiTokenService,\n 'api-token-content-api': contentApiTokenService,\n 'api-token-admin': adminTokenService,\n transfer,\n 'project-settings': projectSettings,\n encryption,\n homepage: homepageService,\n 'debug-dump': debugDump,\n};\n"],"names":["contentApiTokenService","createTokenService","adminTokenService","auth","user","role","passport","token","permission","metrics","contentType","constants","condition","action","transfer","projectSettings","encryption","homepage","homepageService","debugDump"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAmBA,MAAMA,yBAAyBC,kBAAAA,CAAmB,aAAA,CAAA;AAClD,MAAMC,oBAAoBD,kBAAAA,CAAmB,OAAA,CAAA;AAE7C;AACA,eAAe;AACbE,IAAAA,IAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,QAAAA;AACAC,IAAAA,KAAAA;AACAC,IAAAA,UAAAA;AACAC,IAAAA,OAAAA;IACA,cAAA,EAAgBC,WAAAA;AAChBC,IAAAA,SAAAA;AACAC,IAAAA,SAAAA;AACAC,IAAAA,MAAAA;AACA,2DACA,WAAA,EAAab,sBAAAA;IACb,uBAAA,EAAyBA,sBAAAA;IACzB,iBAAA,EAAmBE,iBAAAA;AACnBY,cAAAA,KAAAA;IACA,kBAAA,EAAoBC,eAAAA;AACpBC,IAAAA,UAAAA;IACAC,QAAAA,EAAUC,eAAAA;IACV,YAAA,EAAcC;AAChB,CAAA;;;;"}