@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.
- package/dist/admin/admin/src/components/FormInputs/Boolean.js +3 -2
- package/dist/admin/admin/src/components/FormInputs/Boolean.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Boolean.mjs +3 -2
- package/dist/admin/admin/src/components/FormInputs/Boolean.mjs.map +1 -1
- package/dist/admin/admin/src/constants.js +14 -0
- package/dist/admin/admin/src/constants.js.map +1 -1
- package/dist/admin/admin/src/constants.mjs +14 -0
- package/dist/admin/admin/src/constants.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js +6 -12
- package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/ResetPassword.mjs +6 -12
- package/dist/admin/admin/src/pages/Auth/components/ResetPassword.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +10 -2
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs +10 -2
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +6 -56
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +6 -56
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.js +217 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.js.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.mjs +195 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.mjs.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.js +185 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.js.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.mjs +162 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.mjs.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.js +342 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.js.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.mjs +320 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.mjs.map +1 -0
- package/dist/admin/admin/src/services/admin.js +11 -1
- package/dist/admin/admin/src/services/admin.js.map +1 -1
- package/dist/admin/admin/src/services/admin.mjs +11 -2
- package/dist/admin/admin/src/services/admin.mjs.map +1 -1
- package/dist/admin/admin/src/translations/en.json.js +71 -4
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +71 -4
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/admin/admin/src/utils/browserStrapi.js +1 -1
- package/dist/admin/admin/src/utils/browserStrapi.js.map +1 -1
- package/dist/admin/admin/src/utils/browserStrapi.mjs +1 -1
- package/dist/admin/admin/src/utils/browserStrapi.mjs.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.js +24 -0
- package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.mjs +24 -1
- package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +52 -22
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs +53 -23
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js +16 -29
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs +18 -31
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.js +473 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.js.map +1 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.mjs +471 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.mjs.map +1 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +2 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +2 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
- package/dist/admin/index.js +1 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/admin/shared/utils/get-project-type.js +49 -0
- package/dist/admin/shared/utils/get-project-type.js.map +1 -0
- package/dist/admin/shared/utils/get-project-type.mjs +46 -0
- package/dist/admin/shared/utils/get-project-type.mjs.map +1 -0
- package/dist/admin/src/constants.d.ts +10 -0
- package/dist/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.d.ts +12 -0
- package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.d.ts +14 -0
- package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.d.ts +2 -0
- package/dist/admin/src/services/admin.d.ts +2 -2
- package/dist/admin/src/types/permissions.d.ts +1 -0
- package/dist/admin/src/utils/getFetchClient.d.ts +25 -0
- package/dist/ee/admin/src/hooks/useLicenseLimits.d.ts +29 -0
- package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.d.ts +6 -1
- package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.d.ts +2 -0
- package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +2 -0
- package/dist/ee/server/src/audit-logs/entitlements.d.ts +8 -0
- package/dist/ee/server/src/audit-logs/entitlements.d.ts.map +1 -0
- package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +16 -0
- package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/admin.d.ts +36 -10
- package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/authentication-utils/middlewares.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/index.d.ts +36 -10
- package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
- package/dist/ee/server/src/index.d.ts +36 -10
- package/dist/ee/server/src/index.d.ts.map +1 -1
- package/dist/server/ee/server/src/audit-logs/entitlements.js +25 -0
- package/dist/server/ee/server/src/audit-logs/entitlements.js.map +1 -0
- package/dist/server/ee/server/src/audit-logs/entitlements.mjs +23 -0
- package/dist/server/ee/server/src/audit-logs/entitlements.mjs.map +1 -0
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +20 -8
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +19 -9
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/admin.js +76 -3
- package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
- package/dist/server/ee/server/src/controllers/admin.mjs +76 -3
- package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js +28 -10
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs +28 -10
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs.map +1 -1
- package/dist/server/ee/server/src/index.js +2 -0
- package/dist/server/ee/server/src/index.js.map +1 -1
- package/dist/server/ee/server/src/index.mjs +2 -0
- package/dist/server/ee/server/src/index.mjs.map +1 -1
- package/dist/server/server/src/audit-logs/auth.js +72 -0
- package/dist/server/server/src/audit-logs/auth.js.map +1 -0
- package/dist/server/server/src/audit-logs/auth.mjs +67 -0
- package/dist/server/server/src/audit-logs/auth.mjs.map +1 -0
- package/dist/server/server/src/config/admin-actions.js +7 -0
- package/dist/server/server/src/config/admin-actions.js.map +1 -1
- package/dist/server/server/src/config/admin-actions.mjs +7 -0
- package/dist/server/server/src/config/admin-actions.mjs.map +1 -1
- package/dist/server/server/src/controllers/admin.js +6 -0
- package/dist/server/server/src/controllers/admin.js.map +1 -1
- package/dist/server/server/src/controllers/admin.mjs +6 -0
- package/dist/server/server/src/controllers/admin.mjs.map +1 -1
- package/dist/server/server/src/controllers/authentication.js +34 -8
- package/dist/server/server/src/controllers/authentication.js.map +1 -1
- package/dist/server/server/src/controllers/authentication.mjs +34 -8
- package/dist/server/server/src/controllers/authentication.mjs.map +1 -1
- package/dist/server/server/src/register.js +4 -0
- package/dist/server/server/src/register.js.map +1 -1
- package/dist/server/server/src/register.mjs +4 -0
- package/dist/server/server/src/register.mjs.map +1 -1
- package/dist/server/server/src/routes/admin.js +18 -0
- package/dist/server/server/src/routes/admin.js.map +1 -1
- package/dist/server/server/src/routes/admin.mjs +18 -0
- package/dist/server/server/src/routes/admin.mjs.map +1 -1
- package/dist/server/server/src/services/auth.js +4 -2
- package/dist/server/server/src/services/auth.js.map +1 -1
- package/dist/server/server/src/services/auth.mjs +4 -3
- package/dist/server/server/src/services/auth.mjs.map +1 -1
- package/dist/server/server/src/services/debug-dump.js +173 -0
- package/dist/server/server/src/services/debug-dump.js.map +1 -0
- package/dist/server/server/src/services/debug-dump.mjs +166 -0
- package/dist/server/server/src/services/debug-dump.mjs.map +1 -0
- package/dist/server/server/src/services/index.js +3 -1
- package/dist/server/server/src/services/index.js.map +1 -1
- package/dist/server/server/src/services/index.mjs +3 -1
- package/dist/server/server/src/services/index.mjs.map +1 -1
- package/dist/server/server/src/utils/debug-dump/redact.js +197 -0
- package/dist/server/server/src/utils/debug-dump/redact.js.map +1 -0
- package/dist/server/server/src/utils/debug-dump/redact.mjs +194 -0
- package/dist/server/server/src/utils/debug-dump/redact.mjs.map +1 -0
- package/dist/server/shared/utils/get-project-type.js +49 -0
- package/dist/server/shared/utils/get-project-type.js.map +1 -0
- package/dist/server/shared/utils/get-project-type.mjs +46 -0
- package/dist/server/shared/utils/get-project-type.mjs.map +1 -0
- package/dist/server/src/audit-logs/auth.d.ts +72 -0
- package/dist/server/src/audit-logs/auth.d.ts.map +1 -0
- package/dist/server/src/config/admin-actions.d.ts.map +1 -1
- package/dist/server/src/controllers/admin.d.ts +3 -0
- package/dist/server/src/controllers/admin.d.ts.map +1 -1
- package/dist/server/src/controllers/authentication.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +3 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +8 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/routes/admin.d.ts.map +1 -1
- package/dist/server/src/services/auth.d.ts +6 -0
- package/dist/server/src/services/auth.d.ts.map +1 -1
- package/dist/server/src/services/debug-dump.d.ts +9 -0
- package/dist/server/src/services/debug-dump.d.ts.map +1 -0
- package/dist/server/src/services/index.d.ts +5 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/utils/debug-dump/redact.d.ts +8 -0
- package/dist/server/src/utils/debug-dump/redact.d.ts.map +1 -0
- package/dist/shared/contracts/admin.d.ts +106 -0
- package/dist/shared/contracts/admin.d.ts.map +1 -1
- package/dist/shared/utils/__tests__/get-project-type.test.d.ts +1 -0
- package/dist/shared/utils/__tests__/get-project-type.test.d.ts.map +1 -0
- package/dist/shared/utils/get-project-type.d.ts +37 -0
- package/dist/shared/utils/get-project-type.d.ts.map +1 -0
- package/package.json +8 -8
- package/dist/admin/admin/src/utils/getProjectType.js +0 -22
- package/dist/admin/admin/src/utils/getProjectType.js.map +0 -1
- package/dist/admin/admin/src/utils/getProjectType.mjs +0 -20
- package/dist/admin/admin/src/utils/getProjectType.mjs.map +0 -1
- 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
|
|
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:
|
|
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":"
|
|
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":"
|
|
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;;;;"}
|