@strapi/plugin-users-permissions 5.52.0 → 5.52.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server/controllers/auth.js +3 -0
- package/dist/server/controllers/auth.js.map +1 -1
- package/dist/server/controllers/auth.mjs +3 -0
- package/dist/server/controllers/auth.mjs.map +1 -1
- package/dist/server/services/users-permissions.js +10 -10
- package/dist/server/services/users-permissions.js.map +1 -1
- package/dist/server/services/users-permissions.mjs +10 -10
- package/dist/server/services/users-permissions.mjs.map +1 -1
- package/package.json +6 -4
- package/server/src/controllers/auth.js +5 -1
- package/server/src/services/users-permissions.js +10 -10
|
@@ -333,7 +333,10 @@ function requireAuth() {
|
|
|
333
333
|
const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';
|
|
334
334
|
if (upSessions?.httpOnly || requestHttpOnly) {
|
|
335
335
|
const cookieName = upSessions.cookie?.name || 'strapi_up_refresh';
|
|
336
|
+
const isProduction = process.env.NODE_ENV === 'production';
|
|
337
|
+
const { maxAge, ...cookieOptions } = buildRefreshCookieOptions(upSessions, isProduction);
|
|
336
338
|
ctx.cookies.set(cookieName, '', {
|
|
339
|
+
...cookieOptions,
|
|
337
340
|
expires: new Date(0)
|
|
338
341
|
});
|
|
339
342
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sources":["../../../server/src/controllers/auth.js"],"sourcesContent":["'use strict';\n\n/**\n * Auth.js controller\n *\n * @description: A set of functions called \"actions\" for managing `Auth`.\n */\n\n/* eslint-disable no-useless-escape */\nconst crypto = require('crypto');\nconst _ = require('lodash');\nconst { concat, compact, isArray } = require('lodash/fp');\nconst utils = require('@strapi/utils');\nconst { getService } = require('../utils');\nconst { buildRefreshCookieOptions } = require('../utils/refresh-cookie-options');\nconst {\n validateCallbackBody,\n validateRegisterBody,\n validateSendEmailConfirmationBody,\n validateForgotPasswordBody,\n validateResetPasswordBody,\n validateEmailConfirmationBody,\n validateChangePasswordBody,\n} = require('./validation/auth');\n\nconst { ApplicationError, ValidationError, ForbiddenError } = utils.errors;\nconst { buildSessionMetadata, sanitizeSessionEntry, sortSessionsForDisplay } = utils;\n\nconst sanitizeUser = (user, ctx) => {\n const { auth } = ctx.state;\n const userSchema = strapi.getModel('plugin::users-permissions.user');\n\n return strapi.contentAPI.sanitize.output(user, userSchema, { auth });\n};\n\nconst extractDeviceId = (requestBody) => {\n const { deviceId } = requestBody || {};\n\n return typeof deviceId === 'string' && deviceId.length > 0 ? deviceId : undefined;\n};\n\nconst buildSessionMetadataFromContext = (ctx) =>\n buildSessionMetadata({\n userAgent: ctx.request.headers['user-agent'],\n });\n\nconst sendRefreshAuthResponse = async (strapi, ctx, user, { metadata } = {}) => {\n const deviceId = extractDeviceId(ctx.request.body);\n const tokenOptions = { type: 'refresh', ...(metadata ? { metadata } : {}) };\n\n const refresh = await strapi\n .sessionManager('users-permissions')\n .generateRefreshToken(String(user.id), deviceId, tokenOptions);\n\n const access = await strapi\n .sessionManager('users-permissions')\n .generateAccessToken(refresh.token);\n if ('error' in access) {\n throw new ApplicationError('Invalid credentials');\n }\n\n const upSessions = strapi.config.get('plugin::users-permissions.sessions');\n const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';\n\n if (upSessions?.httpOnly || requestHttpOnly) {\n const cookieName = upSessions.cookie?.name || 'strapi_up_refresh';\n const isProduction = process.env.NODE_ENV === 'production';\n ctx.cookies.set(cookieName, refresh.token, buildRefreshCookieOptions(upSessions, isProduction));\n return ctx.send({ jwt: access.token, user: await sanitizeUser(user, ctx) });\n }\n\n return ctx.send({\n jwt: access.token,\n refreshToken: refresh.token,\n user: await sanitizeUser(user, ctx),\n });\n};\n\nconst reissueTokensAfterPasswordChange = async (strapi, ctx, user) => {\n const deviceId = extractDeviceId(ctx.request.body);\n\n await strapi.sessionManager('users-permissions').invalidateRefreshToken(String(user.id));\n\n const newDeviceId = deviceId || crypto.randomUUID();\n const refresh = await strapi\n .sessionManager('users-permissions')\n .generateRefreshToken(String(user.id), newDeviceId, { type: 'refresh' });\n\n const access = await strapi\n .sessionManager('users-permissions')\n .generateAccessToken(refresh.token);\n if ('error' in access) {\n throw new ApplicationError('Invalid credentials');\n }\n\n return ctx.send({\n jwt: access.token,\n refreshToken: refresh.token,\n user: await sanitizeUser(user, ctx),\n });\n};\n\nconst revokeLogoutSessions = async (strapi, ctx, userId, { scope, deviceId, body }) => {\n const sessionManager = strapi.sessionManager('users-permissions');\n const upSessions = strapi.config.get('plugin::users-permissions.sessions');\n\n if (scope === 'all') {\n await sessionManager.invalidateRefreshToken(userId);\n return;\n }\n\n if (deviceId) {\n await sessionManager.invalidateRefreshToken(userId, deviceId);\n return;\n }\n\n let currentSessionId = ctx.state.session?.id;\n const cookieName = upSessions?.cookie?.name || 'strapi_up_refresh';\n const refreshToken =\n ctx.cookies.get(cookieName) ||\n (typeof body.refreshToken === 'string' ? body.refreshToken : undefined);\n\n if (refreshToken) {\n const validation = await sessionManager.validateRefreshToken(refreshToken);\n if (validation.isValid) {\n currentSessionId = validation.sessionId;\n }\n }\n\n if (currentSessionId) {\n await sessionManager.revokeSessionById(userId, currentSessionId);\n return;\n }\n\n await sessionManager.invalidateRefreshToken(userId);\n};\n\nmodule.exports = ({ strapi }) => ({\n async callback(ctx) {\n const provider = ctx.params.provider || 'local';\n const params = ctx.request.body;\n\n const store = strapi.store({ type: 'plugin', name: 'users-permissions' });\n const grantSettings = await store.get({ key: 'grant' });\n\n const grantProvider = provider === 'local' ? 'email' : provider;\n\n if (!_.get(grantSettings, [grantProvider, 'enabled'])) {\n throw new ApplicationError('This provider is disabled');\n }\n\n if (provider === 'local') {\n await validateCallbackBody(params);\n\n const { identifier } = params;\n\n // Check if the user exists.\n const user = await strapi.db.query('plugin::users-permissions.user').findOne({\n where: {\n provider,\n $or: [{ email: identifier.toLowerCase() }, { username: identifier }],\n },\n });\n\n if (!user) {\n throw new ValidationError('Invalid identifier or password');\n }\n\n if (!user.password) {\n throw new ValidationError('Invalid identifier or password');\n }\n\n const validPassword = await getService('user').validatePassword(\n params.password,\n user.password\n );\n\n if (!validPassword) {\n throw new ValidationError('Invalid identifier or password');\n }\n\n const advancedSettings = await store.get({ key: 'advanced' });\n const requiresConfirmation = _.get(advancedSettings, 'email_confirmation');\n\n if (requiresConfirmation && user.confirmed !== true) {\n throw new ApplicationError('Your account email is not confirmed');\n }\n\n if (user.blocked === true) {\n throw new ApplicationError('Your account has been blocked by an administrator');\n }\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n return sendRefreshAuthResponse(strapi, ctx, user, {\n metadata: buildSessionMetadataFromContext(ctx),\n });\n }\n\n return ctx.send({\n jwt: getService('jwt').issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n }\n\n // Connect the user with the third-party provider.\n try {\n const user = await getService('providers').connect(provider, ctx.query);\n\n if (user.blocked) {\n throw new ForbiddenError('Your account has been blocked by an administrator');\n }\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n return sendRefreshAuthResponse(strapi, ctx, user, {\n metadata: buildSessionMetadataFromContext(ctx),\n });\n }\n\n return ctx.send({\n jwt: getService('jwt').issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n } catch (error) {\n throw new ApplicationError(error.message);\n }\n },\n\n async changePassword(ctx) {\n if (!ctx.state.user) {\n throw new ApplicationError('You must be authenticated to reset your password');\n }\n\n const validations = strapi.config.get('plugin::users-permissions.validationRules');\n\n const { currentPassword, password } = await validateChangePasswordBody(\n ctx.request.body,\n validations\n );\n\n const user = await strapi.db\n .query('plugin::users-permissions.user')\n .findOne({ where: { id: ctx.state.user.id } });\n\n const validPassword = await getService('user').validatePassword(currentPassword, user.password);\n\n if (!validPassword) {\n throw new ValidationError('The provided current password is invalid');\n }\n\n if (currentPassword === password) {\n throw new ValidationError('Your new password must be different than your current password');\n }\n\n await getService('user').edit(user.id, { password });\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n return reissueTokensAfterPasswordChange(strapi, ctx, user);\n }\n\n return ctx.send({\n jwt: getService('jwt').issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n },\n\n async resetPassword(ctx) {\n const validations = strapi.config.get('plugin::users-permissions.validationRules');\n\n const { password, passwordConfirmation, code } = await validateResetPasswordBody(\n ctx.request.body,\n validations\n );\n\n if (password !== passwordConfirmation) {\n throw new ValidationError('Passwords do not match');\n }\n\n const user = await strapi.db\n .query('plugin::users-permissions.user')\n .findOne({ where: { resetPasswordToken: code } });\n\n if (!user) {\n throw new ValidationError('Incorrect code provided');\n }\n\n await getService('user').edit(user.id, {\n resetPasswordToken: null,\n password,\n });\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n return reissueTokensAfterPasswordChange(strapi, ctx, user);\n }\n\n return ctx.send({\n jwt: getService('jwt').issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n },\n async refresh(ctx) {\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode !== 'refresh') {\n return ctx.notFound();\n }\n\n const upSessions = strapi.config.get('plugin::users-permissions.sessions');\n const cookieName = upSessions?.cookie?.name || 'strapi_up_refresh';\n\n // Check for refresh token in cookie first (if httpOnly is configured), then in body\n let refreshToken = ctx.cookies.get(cookieName);\n if (!refreshToken) {\n refreshToken = ctx.request.body?.refreshToken;\n }\n\n if (!refreshToken || typeof refreshToken !== 'string') {\n return ctx.badRequest('Missing refresh token');\n }\n\n const rotation = await strapi\n .sessionManager('users-permissions')\n .rotateRefreshToken(refreshToken);\n if ('error' in rotation) {\n return ctx.unauthorized('Invalid refresh token');\n }\n\n const result = await strapi\n .sessionManager('users-permissions')\n .generateAccessToken(rotation.token);\n if ('error' in result) {\n return ctx.unauthorized('Invalid refresh token');\n }\n\n const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';\n if (upSessions?.httpOnly || requestHttpOnly) {\n const isProduction = process.env.NODE_ENV === 'production';\n ctx.cookies.set(\n cookieName,\n rotation.token,\n buildRefreshCookieOptions(upSessions, isProduction)\n );\n return ctx.send({ jwt: result.token });\n }\n return ctx.send({ jwt: result.token, refreshToken: rotation.token });\n },\n async logout(ctx) {\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode !== 'refresh') {\n return ctx.notFound();\n }\n\n if (!ctx.state.user) {\n return ctx.unauthorized('Missing authentication');\n }\n\n const userId = String(ctx.state.user.id);\n const upSessions = strapi.config.get('plugin::users-permissions.sessions');\n const body = ctx.request.body || {};\n const scope = typeof body.scope === 'string' ? body.scope : undefined;\n const deviceId = extractDeviceId(body);\n\n try {\n await revokeLogoutSessions(strapi, ctx, userId, { scope, deviceId, body });\n } catch (err) {\n strapi.log.error('UP logout failed', err);\n }\n\n const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';\n if (upSessions?.httpOnly || requestHttpOnly) {\n const cookieName = upSessions.cookie?.name || 'strapi_up_refresh';\n ctx.cookies.set(cookieName, '', { expires: new Date(0) });\n }\n return ctx.send({ ok: true });\n },\n async getSessions(ctx) {\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode !== 'refresh') {\n return ctx.notFound();\n }\n\n if (!ctx.state.user) {\n return ctx.unauthorized('Missing authentication');\n }\n\n const currentSessionId = ctx.state.session?.id;\n const sessions = await strapi\n .sessionManager('users-permissions')\n .listSessions(String(ctx.state.user.id));\n\n const data = sortSessionsForDisplay(\n sessions.map((session) => sanitizeSessionEntry(session, currentSessionId))\n );\n\n return ctx.send({ data });\n },\n async revokeSession(ctx) {\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode !== 'refresh') {\n return ctx.notFound();\n }\n\n if (!ctx.state.user) {\n return ctx.unauthorized('Missing authentication');\n }\n\n const { sessionId } = ctx.params;\n const revoked = await strapi\n .sessionManager('users-permissions')\n .revokeSessionById(String(ctx.state.user.id), sessionId);\n\n if (!revoked) {\n return ctx.notFound('Session not found');\n }\n\n return ctx.send({ data: {} });\n },\n async connect(ctx, next) {\n const providers = await strapi\n .store({ type: 'plugin', name: 'users-permissions', key: 'grant' })\n .get();\n\n const [requestPath] = ctx.request.url.split('?');\n const provider = requestPath.split('/connect/')[1].split('/')[0];\n\n if (!_.get(providers, [provider, 'enabled'])) {\n throw new ApplicationError('This provider is disabled');\n }\n\n if (!strapi.config.server.url.startsWith('http')) {\n strapi.log.warn(\n 'You are using a third party provider for login. Make sure to set an absolute url in config/server.js. More info here: https://docs.strapi.io/developer-docs/latest/plugins/users-permissions.html#setting-up-the-server-url'\n );\n }\n\n const queryCustomCallback = _.get(ctx, 'query.callback');\n const dynamicSessionCallback = _.get(ctx, 'session.grant.dynamic.callback');\n const customCallback = queryCustomCallback ?? dynamicSessionCallback;\n\n if (customCallback !== undefined) {\n try {\n const { validate: validateCallback } = strapi\n .plugin('users-permissions')\n .config('callback');\n\n await validateCallback(customCallback, providers[provider]);\n\n // Persist across the provider redirect round-trip (request state alone is lost).\n ctx.session = ctx.session || {};\n ctx.session.grant = ctx.session.grant || {};\n ctx.session.grant.dynamic = {\n ...ctx.session.grant.dynamic,\n callback: customCallback,\n };\n ctx.state.oauthConnect = { callback: customCallback };\n } catch {\n throw new ValidationError('Invalid callback URL provided', { callback: customCallback });\n }\n }\n\n const { createOAuthConnectMiddleware } = require('../utils/oauth-connect');\n const oauthConnect = createOAuthConnectMiddleware();\n\n return oauthConnect(ctx, next);\n },\n\n async forgotPassword(ctx) {\n const { email } = await validateForgotPasswordBody(ctx.request.body);\n\n const pluginStore = await strapi.store({ type: 'plugin', name: 'users-permissions' });\n\n const emailSettings = await pluginStore.get({ key: 'email' });\n const advancedSettings = await pluginStore.get({ key: 'advanced' });\n\n // Find the user by email.\n const user = await strapi.db\n .query('plugin::users-permissions.user')\n .findOne({ where: { email: email.toLowerCase() } });\n\n if (!user || user.blocked) {\n return ctx.send({ ok: true });\n }\n\n // Generate random token.\n const userInfo = await sanitizeUser(user, ctx);\n\n const resetPasswordToken = crypto.randomBytes(64).toString('hex');\n\n const resetPasswordSettings = _.get(emailSettings, 'reset_password.options', {});\n const emailBody = await getService('users-permissions').template(\n resetPasswordSettings.message,\n {\n URL: advancedSettings.email_reset_password,\n SERVER_URL: strapi.config.get('server.absoluteUrl'),\n ADMIN_URL: strapi.config.get('admin.absoluteUrl'),\n USER: userInfo,\n TOKEN: resetPasswordToken,\n }\n );\n\n const emailObject = await getService('users-permissions').template(\n resetPasswordSettings.object,\n {\n USER: userInfo,\n }\n );\n\n const emailToSend = {\n to: user.email,\n from:\n resetPasswordSettings.from.email || resetPasswordSettings.from.name\n ? `${resetPasswordSettings.from.name} <${resetPasswordSettings.from.email}>`\n : undefined,\n replyTo: resetPasswordSettings.response_email,\n subject: emailObject,\n text: emailBody,\n html: emailBody,\n };\n\n // NOTE: Update the user before sending the email so an Admin can generate the link if the email fails\n await getService('user').edit(user.id, { resetPasswordToken });\n\n // Send an email to the user.\n await strapi.plugin('email').service('email').send(emailToSend);\n\n ctx.send({ ok: true });\n },\n\n async register(ctx) {\n const pluginStore = await strapi.store({ type: 'plugin', name: 'users-permissions' });\n\n const settings = await pluginStore.get({ key: 'advanced' });\n\n if (!settings.allow_register) {\n throw new ApplicationError('Register action is currently disabled');\n }\n\n const { register } = strapi.config.get('plugin::users-permissions');\n const alwaysAllowedKeys = ['username', 'password', 'email'];\n\n // Note that we intentionally do not filter allowedFields to allow a project to explicitly accept private or other Strapi field on registration\n const allowedKeys = compact(\n concat(alwaysAllowedKeys, isArray(register?.allowedFields) ? register.allowedFields : [])\n );\n\n // Check if there are any keys in requestBody that are not in allowedKeys\n const invalidKeys = Object.keys(ctx.request.body).filter((key) => !allowedKeys.includes(key));\n\n if (invalidKeys.length > 0) {\n // If there are invalid keys, throw an error\n throw new ValidationError(`Invalid parameters: ${invalidKeys.join(', ')}`);\n }\n\n const params = {\n ..._.pick(ctx.request.body, allowedKeys),\n provider: 'local',\n };\n\n const validations = strapi.config.get('plugin::users-permissions.validationRules');\n\n await validateRegisterBody(params, validations);\n\n const role = await strapi.db\n .query('plugin::users-permissions.role')\n .findOne({ where: { type: settings.default_role } });\n\n if (!role) {\n throw new ApplicationError('Impossible to find the default role');\n }\n\n const { email, username, provider } = params;\n\n const identifierFilter = {\n $or: [\n { email: email.toLowerCase() },\n { username: email.toLowerCase() },\n { username },\n { email: username },\n ],\n };\n\n const conflictingUserCount = await strapi.db.query('plugin::users-permissions.user').count({\n where: { ...identifierFilter, provider },\n });\n\n if (conflictingUserCount > 0) {\n throw new ApplicationError('Email or Username are already taken');\n }\n\n if (settings.unique_email) {\n const conflictingUserCount = await strapi.db.query('plugin::users-permissions.user').count({\n where: { ...identifierFilter },\n });\n\n if (conflictingUserCount > 0) {\n throw new ApplicationError('Email or Username are already taken');\n }\n }\n\n const newUser = {\n ...params,\n role: role.id,\n email: email.toLowerCase(),\n username,\n confirmed: !settings.email_confirmation,\n };\n\n const user = await getService('user').add(newUser);\n\n const sanitizedUser = await sanitizeUser(user, ctx);\n\n if (settings.email_confirmation) {\n try {\n await getService('user').sendConfirmationEmail(sanitizedUser);\n } catch (err) {\n strapi.log.error(err);\n throw new ApplicationError('Error sending confirmation email');\n }\n\n return ctx.send({ user: sanitizedUser });\n }\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n const deviceId = extractDeviceId(ctx.request.body) || crypto.randomUUID();\n\n const refresh = await strapi\n .sessionManager('users-permissions')\n .generateRefreshToken(String(user.id), deviceId, {\n type: 'refresh',\n metadata: buildSessionMetadataFromContext(ctx),\n });\n\n const access = await strapi\n .sessionManager('users-permissions')\n .generateAccessToken(refresh.token);\n if ('error' in access) {\n throw new ApplicationError('Invalid credentials');\n }\n\n return ctx.send({ jwt: access.token, refreshToken: refresh.token, user: sanitizedUser });\n }\n\n const jwt = getService('jwt').issue(_.pick(user, ['id']));\n return ctx.send({ jwt, user: sanitizedUser });\n },\n\n async emailConfirmation(ctx, next, returnUser) {\n const { confirmation: confirmationToken } = await validateEmailConfirmationBody(ctx.query);\n\n const userService = getService('user');\n const jwtService = getService('jwt');\n\n const [user] = await userService.fetchAll({ filters: { confirmationToken } });\n\n if (!user) {\n throw new ValidationError('Invalid token');\n }\n\n await userService.edit(user.id, { confirmed: true, confirmationToken: null });\n\n if (returnUser) {\n ctx.send({\n jwt: jwtService.issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n } else {\n const settings = await strapi\n .store({ type: 'plugin', name: 'users-permissions', key: 'advanced' })\n .get();\n\n ctx.redirect(settings.email_confirmation_redirection || '/');\n }\n },\n\n async sendEmailConfirmation(ctx) {\n const { email } = await validateSendEmailConfirmationBody(ctx.request.body);\n\n const user = await strapi.db.query('plugin::users-permissions.user').findOne({\n where: { email: email.toLowerCase() },\n });\n\n if (!user) {\n return ctx.send({ email, sent: true });\n }\n\n if (user.confirmed) {\n throw new ApplicationError('Already confirmed');\n }\n\n if (user.blocked) {\n throw new ApplicationError('User blocked');\n }\n\n await getService('user').sendConfirmationEmail(user);\n\n ctx.send({\n email: user.email,\n sent: true,\n });\n },\n});\n"],"names":["crypto","require$$0","_","require$$1","concat","compact","isArray","require$$2","utils","require$$3","getService","require$$4","buildRefreshCookieOptions","require$$5","validateCallbackBody","validateRegisterBody","validateSendEmailConfirmationBody","validateForgotPasswordBody","validateResetPasswordBody","validateEmailConfirmationBody","validateChangePasswordBody","require$$6","ApplicationError","ValidationError","ForbiddenError","errors","buildSessionMetadata","sanitizeSessionEntry","sortSessionsForDisplay","sanitizeUser","user","ctx","auth","state","userSchema","strapi","getModel","contentAPI","sanitize","output","extractDeviceId","requestBody","deviceId","length","undefined","buildSessionMetadataFromContext","userAgent","request","headers","sendRefreshAuthResponse","metadata","body","tokenOptions","type","refresh","sessionManager","generateRefreshToken","String","id","access","generateAccessToken","token","upSessions","config","get","requestHttpOnly","header","httpOnly","cookieName","cookie","name","isProduction","process","env","NODE_ENV","cookies","set","send","jwt","refreshToken","reissueTokensAfterPasswordChange","invalidateRefreshToken","newDeviceId","randomUUID","revokeLogoutSessions","userId","scope","currentSessionId","session","validation","validateRefreshToken","isValid","sessionId","revokeSessionById","callback","provider","params","store","grantSettings","key","grantProvider","identifier","db","query","findOne","where","$or","email","toLowerCase","username","password","validPassword","validatePassword","advancedSettings","requiresConfirmation","confirmed","blocked","mode","issue","connect","error","message","changePassword","validations","currentPassword","edit","resetPassword","passwordConfirmation","code","resetPasswordToken","notFound","badRequest","rotation","rotateRefreshToken","unauthorized","result","logout","err","log","expires","Date","ok","getSessions","sessions","listSessions","data","map","revokeSession","revoked","next","providers","requestPath","url","split","server","startsWith","warn","queryCustomCallback","dynamicSessionCallback","customCallback","validate","validateCallback","plugin","grant","dynamic","oauthConnect","createOAuthConnectMiddleware","require$$7","forgotPassword","pluginStore","emailSettings","userInfo","randomBytes","toString","resetPasswordSettings","emailBody","template","URL","email_reset_password","SERVER_URL","ADMIN_URL","USER","TOKEN","emailObject","object","emailToSend","to","from","replyTo","response_email","subject","text","html","service","register","settings","allow_register","alwaysAllowedKeys","allowedKeys","allowedFields","invalidKeys","Object","keys","filter","includes","join","pick","role","default_role","identifierFilter","conflictingUserCount","count","unique_email","newUser","email_confirmation","add","sanitizedUser","sendConfirmationEmail","emailConfirmation","returnUser","confirmation","confirmationToken","userService","jwtService","fetchAll","filters","redirect","email_confirmation_redirection","sendEmailConfirmation","sent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth.js","sources":["../../../server/src/controllers/auth.js"],"sourcesContent":["'use strict';\n\n/**\n * Auth.js controller\n *\n * @description: A set of functions called \"actions\" for managing `Auth`.\n */\n\n/* eslint-disable no-useless-escape */\nconst crypto = require('crypto');\nconst _ = require('lodash');\nconst { concat, compact, isArray } = require('lodash/fp');\nconst utils = require('@strapi/utils');\nconst { getService } = require('../utils');\nconst { buildRefreshCookieOptions } = require('../utils/refresh-cookie-options');\nconst {\n validateCallbackBody,\n validateRegisterBody,\n validateSendEmailConfirmationBody,\n validateForgotPasswordBody,\n validateResetPasswordBody,\n validateEmailConfirmationBody,\n validateChangePasswordBody,\n} = require('./validation/auth');\n\nconst { ApplicationError, ValidationError, ForbiddenError } = utils.errors;\nconst { buildSessionMetadata, sanitizeSessionEntry, sortSessionsForDisplay } = utils;\n\nconst sanitizeUser = (user, ctx) => {\n const { auth } = ctx.state;\n const userSchema = strapi.getModel('plugin::users-permissions.user');\n\n return strapi.contentAPI.sanitize.output(user, userSchema, { auth });\n};\n\nconst extractDeviceId = (requestBody) => {\n const { deviceId } = requestBody || {};\n\n return typeof deviceId === 'string' && deviceId.length > 0 ? deviceId : undefined;\n};\n\nconst buildSessionMetadataFromContext = (ctx) =>\n buildSessionMetadata({\n userAgent: ctx.request.headers['user-agent'],\n });\n\nconst sendRefreshAuthResponse = async (strapi, ctx, user, { metadata } = {}) => {\n const deviceId = extractDeviceId(ctx.request.body);\n const tokenOptions = { type: 'refresh', ...(metadata ? { metadata } : {}) };\n\n const refresh = await strapi\n .sessionManager('users-permissions')\n .generateRefreshToken(String(user.id), deviceId, tokenOptions);\n\n const access = await strapi\n .sessionManager('users-permissions')\n .generateAccessToken(refresh.token);\n if ('error' in access) {\n throw new ApplicationError('Invalid credentials');\n }\n\n const upSessions = strapi.config.get('plugin::users-permissions.sessions');\n const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';\n\n if (upSessions?.httpOnly || requestHttpOnly) {\n const cookieName = upSessions.cookie?.name || 'strapi_up_refresh';\n const isProduction = process.env.NODE_ENV === 'production';\n ctx.cookies.set(cookieName, refresh.token, buildRefreshCookieOptions(upSessions, isProduction));\n return ctx.send({ jwt: access.token, user: await sanitizeUser(user, ctx) });\n }\n\n return ctx.send({\n jwt: access.token,\n refreshToken: refresh.token,\n user: await sanitizeUser(user, ctx),\n });\n};\n\nconst reissueTokensAfterPasswordChange = async (strapi, ctx, user) => {\n const deviceId = extractDeviceId(ctx.request.body);\n\n await strapi.sessionManager('users-permissions').invalidateRefreshToken(String(user.id));\n\n const newDeviceId = deviceId || crypto.randomUUID();\n const refresh = await strapi\n .sessionManager('users-permissions')\n .generateRefreshToken(String(user.id), newDeviceId, { type: 'refresh' });\n\n const access = await strapi\n .sessionManager('users-permissions')\n .generateAccessToken(refresh.token);\n if ('error' in access) {\n throw new ApplicationError('Invalid credentials');\n }\n\n return ctx.send({\n jwt: access.token,\n refreshToken: refresh.token,\n user: await sanitizeUser(user, ctx),\n });\n};\n\nconst revokeLogoutSessions = async (strapi, ctx, userId, { scope, deviceId, body }) => {\n const sessionManager = strapi.sessionManager('users-permissions');\n const upSessions = strapi.config.get('plugin::users-permissions.sessions');\n\n if (scope === 'all') {\n await sessionManager.invalidateRefreshToken(userId);\n return;\n }\n\n if (deviceId) {\n await sessionManager.invalidateRefreshToken(userId, deviceId);\n return;\n }\n\n let currentSessionId = ctx.state.session?.id;\n const cookieName = upSessions?.cookie?.name || 'strapi_up_refresh';\n const refreshToken =\n ctx.cookies.get(cookieName) ||\n (typeof body.refreshToken === 'string' ? body.refreshToken : undefined);\n\n if (refreshToken) {\n const validation = await sessionManager.validateRefreshToken(refreshToken);\n if (validation.isValid) {\n currentSessionId = validation.sessionId;\n }\n }\n\n if (currentSessionId) {\n await sessionManager.revokeSessionById(userId, currentSessionId);\n return;\n }\n\n await sessionManager.invalidateRefreshToken(userId);\n};\n\nmodule.exports = ({ strapi }) => ({\n async callback(ctx) {\n const provider = ctx.params.provider || 'local';\n const params = ctx.request.body;\n\n const store = strapi.store({ type: 'plugin', name: 'users-permissions' });\n const grantSettings = await store.get({ key: 'grant' });\n\n const grantProvider = provider === 'local' ? 'email' : provider;\n\n if (!_.get(grantSettings, [grantProvider, 'enabled'])) {\n throw new ApplicationError('This provider is disabled');\n }\n\n if (provider === 'local') {\n await validateCallbackBody(params);\n\n const { identifier } = params;\n\n // Check if the user exists.\n const user = await strapi.db.query('plugin::users-permissions.user').findOne({\n where: {\n provider,\n $or: [{ email: identifier.toLowerCase() }, { username: identifier }],\n },\n });\n\n if (!user) {\n throw new ValidationError('Invalid identifier or password');\n }\n\n if (!user.password) {\n throw new ValidationError('Invalid identifier or password');\n }\n\n const validPassword = await getService('user').validatePassword(\n params.password,\n user.password\n );\n\n if (!validPassword) {\n throw new ValidationError('Invalid identifier or password');\n }\n\n const advancedSettings = await store.get({ key: 'advanced' });\n const requiresConfirmation = _.get(advancedSettings, 'email_confirmation');\n\n if (requiresConfirmation && user.confirmed !== true) {\n throw new ApplicationError('Your account email is not confirmed');\n }\n\n if (user.blocked === true) {\n throw new ApplicationError('Your account has been blocked by an administrator');\n }\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n return sendRefreshAuthResponse(strapi, ctx, user, {\n metadata: buildSessionMetadataFromContext(ctx),\n });\n }\n\n return ctx.send({\n jwt: getService('jwt').issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n }\n\n // Connect the user with the third-party provider.\n try {\n const user = await getService('providers').connect(provider, ctx.query);\n\n if (user.blocked) {\n throw new ForbiddenError('Your account has been blocked by an administrator');\n }\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n return sendRefreshAuthResponse(strapi, ctx, user, {\n metadata: buildSessionMetadataFromContext(ctx),\n });\n }\n\n return ctx.send({\n jwt: getService('jwt').issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n } catch (error) {\n throw new ApplicationError(error.message);\n }\n },\n\n async changePassword(ctx) {\n if (!ctx.state.user) {\n throw new ApplicationError('You must be authenticated to reset your password');\n }\n\n const validations = strapi.config.get('plugin::users-permissions.validationRules');\n\n const { currentPassword, password } = await validateChangePasswordBody(\n ctx.request.body,\n validations\n );\n\n const user = await strapi.db\n .query('plugin::users-permissions.user')\n .findOne({ where: { id: ctx.state.user.id } });\n\n const validPassword = await getService('user').validatePassword(currentPassword, user.password);\n\n if (!validPassword) {\n throw new ValidationError('The provided current password is invalid');\n }\n\n if (currentPassword === password) {\n throw new ValidationError('Your new password must be different than your current password');\n }\n\n await getService('user').edit(user.id, { password });\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n return reissueTokensAfterPasswordChange(strapi, ctx, user);\n }\n\n return ctx.send({\n jwt: getService('jwt').issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n },\n\n async resetPassword(ctx) {\n const validations = strapi.config.get('plugin::users-permissions.validationRules');\n\n const { password, passwordConfirmation, code } = await validateResetPasswordBody(\n ctx.request.body,\n validations\n );\n\n if (password !== passwordConfirmation) {\n throw new ValidationError('Passwords do not match');\n }\n\n const user = await strapi.db\n .query('plugin::users-permissions.user')\n .findOne({ where: { resetPasswordToken: code } });\n\n if (!user) {\n throw new ValidationError('Incorrect code provided');\n }\n\n await getService('user').edit(user.id, {\n resetPasswordToken: null,\n password,\n });\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n return reissueTokensAfterPasswordChange(strapi, ctx, user);\n }\n\n return ctx.send({\n jwt: getService('jwt').issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n },\n async refresh(ctx) {\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode !== 'refresh') {\n return ctx.notFound();\n }\n\n const upSessions = strapi.config.get('plugin::users-permissions.sessions');\n const cookieName = upSessions?.cookie?.name || 'strapi_up_refresh';\n\n // Check for refresh token in cookie first (if httpOnly is configured), then in body\n let refreshToken = ctx.cookies.get(cookieName);\n if (!refreshToken) {\n refreshToken = ctx.request.body?.refreshToken;\n }\n\n if (!refreshToken || typeof refreshToken !== 'string') {\n return ctx.badRequest('Missing refresh token');\n }\n\n const rotation = await strapi\n .sessionManager('users-permissions')\n .rotateRefreshToken(refreshToken);\n if ('error' in rotation) {\n return ctx.unauthorized('Invalid refresh token');\n }\n\n const result = await strapi\n .sessionManager('users-permissions')\n .generateAccessToken(rotation.token);\n if ('error' in result) {\n return ctx.unauthorized('Invalid refresh token');\n }\n\n const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';\n if (upSessions?.httpOnly || requestHttpOnly) {\n const isProduction = process.env.NODE_ENV === 'production';\n ctx.cookies.set(\n cookieName,\n rotation.token,\n buildRefreshCookieOptions(upSessions, isProduction)\n );\n return ctx.send({ jwt: result.token });\n }\n return ctx.send({ jwt: result.token, refreshToken: rotation.token });\n },\n async logout(ctx) {\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode !== 'refresh') {\n return ctx.notFound();\n }\n\n if (!ctx.state.user) {\n return ctx.unauthorized('Missing authentication');\n }\n\n const userId = String(ctx.state.user.id);\n const upSessions = strapi.config.get('plugin::users-permissions.sessions');\n const body = ctx.request.body || {};\n const scope = typeof body.scope === 'string' ? body.scope : undefined;\n const deviceId = extractDeviceId(body);\n\n try {\n await revokeLogoutSessions(strapi, ctx, userId, { scope, deviceId, body });\n } catch (err) {\n strapi.log.error('UP logout failed', err);\n }\n\n const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';\n if (upSessions?.httpOnly || requestHttpOnly) {\n const cookieName = upSessions.cookie?.name || 'strapi_up_refresh';\n const isProduction = process.env.NODE_ENV === 'production';\n\n const { maxAge, ...cookieOptions } = buildRefreshCookieOptions(upSessions, isProduction);\n\n ctx.cookies.set(cookieName, '', { ...cookieOptions, expires: new Date(0) });\n }\n return ctx.send({ ok: true });\n },\n async getSessions(ctx) {\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode !== 'refresh') {\n return ctx.notFound();\n }\n\n if (!ctx.state.user) {\n return ctx.unauthorized('Missing authentication');\n }\n\n const currentSessionId = ctx.state.session?.id;\n const sessions = await strapi\n .sessionManager('users-permissions')\n .listSessions(String(ctx.state.user.id));\n\n const data = sortSessionsForDisplay(\n sessions.map((session) => sanitizeSessionEntry(session, currentSessionId))\n );\n\n return ctx.send({ data });\n },\n async revokeSession(ctx) {\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode !== 'refresh') {\n return ctx.notFound();\n }\n\n if (!ctx.state.user) {\n return ctx.unauthorized('Missing authentication');\n }\n\n const { sessionId } = ctx.params;\n const revoked = await strapi\n .sessionManager('users-permissions')\n .revokeSessionById(String(ctx.state.user.id), sessionId);\n\n if (!revoked) {\n return ctx.notFound('Session not found');\n }\n\n return ctx.send({ data: {} });\n },\n async connect(ctx, next) {\n const providers = await strapi\n .store({ type: 'plugin', name: 'users-permissions', key: 'grant' })\n .get();\n\n const [requestPath] = ctx.request.url.split('?');\n const provider = requestPath.split('/connect/')[1].split('/')[0];\n\n if (!_.get(providers, [provider, 'enabled'])) {\n throw new ApplicationError('This provider is disabled');\n }\n\n if (!strapi.config.server.url.startsWith('http')) {\n strapi.log.warn(\n 'You are using a third party provider for login. Make sure to set an absolute url in config/server.js. More info here: https://docs.strapi.io/developer-docs/latest/plugins/users-permissions.html#setting-up-the-server-url'\n );\n }\n\n const queryCustomCallback = _.get(ctx, 'query.callback');\n const dynamicSessionCallback = _.get(ctx, 'session.grant.dynamic.callback');\n const customCallback = queryCustomCallback ?? dynamicSessionCallback;\n\n if (customCallback !== undefined) {\n try {\n const { validate: validateCallback } = strapi\n .plugin('users-permissions')\n .config('callback');\n\n await validateCallback(customCallback, providers[provider]);\n\n // Persist across the provider redirect round-trip (request state alone is lost).\n ctx.session = ctx.session || {};\n ctx.session.grant = ctx.session.grant || {};\n ctx.session.grant.dynamic = {\n ...ctx.session.grant.dynamic,\n callback: customCallback,\n };\n ctx.state.oauthConnect = { callback: customCallback };\n } catch {\n throw new ValidationError('Invalid callback URL provided', { callback: customCallback });\n }\n }\n\n const { createOAuthConnectMiddleware } = require('../utils/oauth-connect');\n const oauthConnect = createOAuthConnectMiddleware();\n\n return oauthConnect(ctx, next);\n },\n\n async forgotPassword(ctx) {\n const { email } = await validateForgotPasswordBody(ctx.request.body);\n\n const pluginStore = await strapi.store({ type: 'plugin', name: 'users-permissions' });\n\n const emailSettings = await pluginStore.get({ key: 'email' });\n const advancedSettings = await pluginStore.get({ key: 'advanced' });\n\n // Find the user by email.\n const user = await strapi.db\n .query('plugin::users-permissions.user')\n .findOne({ where: { email: email.toLowerCase() } });\n\n if (!user || user.blocked) {\n return ctx.send({ ok: true });\n }\n\n // Generate random token.\n const userInfo = await sanitizeUser(user, ctx);\n\n const resetPasswordToken = crypto.randomBytes(64).toString('hex');\n\n const resetPasswordSettings = _.get(emailSettings, 'reset_password.options', {});\n const emailBody = await getService('users-permissions').template(\n resetPasswordSettings.message,\n {\n URL: advancedSettings.email_reset_password,\n SERVER_URL: strapi.config.get('server.absoluteUrl'),\n ADMIN_URL: strapi.config.get('admin.absoluteUrl'),\n USER: userInfo,\n TOKEN: resetPasswordToken,\n }\n );\n\n const emailObject = await getService('users-permissions').template(\n resetPasswordSettings.object,\n {\n USER: userInfo,\n }\n );\n\n const emailToSend = {\n to: user.email,\n from:\n resetPasswordSettings.from.email || resetPasswordSettings.from.name\n ? `${resetPasswordSettings.from.name} <${resetPasswordSettings.from.email}>`\n : undefined,\n replyTo: resetPasswordSettings.response_email,\n subject: emailObject,\n text: emailBody,\n html: emailBody,\n };\n\n // NOTE: Update the user before sending the email so an Admin can generate the link if the email fails\n await getService('user').edit(user.id, { resetPasswordToken });\n\n // Send an email to the user.\n await strapi.plugin('email').service('email').send(emailToSend);\n\n ctx.send({ ok: true });\n },\n\n async register(ctx) {\n const pluginStore = await strapi.store({ type: 'plugin', name: 'users-permissions' });\n\n const settings = await pluginStore.get({ key: 'advanced' });\n\n if (!settings.allow_register) {\n throw new ApplicationError('Register action is currently disabled');\n }\n\n const { register } = strapi.config.get('plugin::users-permissions');\n const alwaysAllowedKeys = ['username', 'password', 'email'];\n\n // Note that we intentionally do not filter allowedFields to allow a project to explicitly accept private or other Strapi field on registration\n const allowedKeys = compact(\n concat(alwaysAllowedKeys, isArray(register?.allowedFields) ? register.allowedFields : [])\n );\n\n // Check if there are any keys in requestBody that are not in allowedKeys\n const invalidKeys = Object.keys(ctx.request.body).filter((key) => !allowedKeys.includes(key));\n\n if (invalidKeys.length > 0) {\n // If there are invalid keys, throw an error\n throw new ValidationError(`Invalid parameters: ${invalidKeys.join(', ')}`);\n }\n\n const params = {\n ..._.pick(ctx.request.body, allowedKeys),\n provider: 'local',\n };\n\n const validations = strapi.config.get('plugin::users-permissions.validationRules');\n\n await validateRegisterBody(params, validations);\n\n const role = await strapi.db\n .query('plugin::users-permissions.role')\n .findOne({ where: { type: settings.default_role } });\n\n if (!role) {\n throw new ApplicationError('Impossible to find the default role');\n }\n\n const { email, username, provider } = params;\n\n const identifierFilter = {\n $or: [\n { email: email.toLowerCase() },\n { username: email.toLowerCase() },\n { username },\n { email: username },\n ],\n };\n\n const conflictingUserCount = await strapi.db.query('plugin::users-permissions.user').count({\n where: { ...identifierFilter, provider },\n });\n\n if (conflictingUserCount > 0) {\n throw new ApplicationError('Email or Username are already taken');\n }\n\n if (settings.unique_email) {\n const conflictingUserCount = await strapi.db.query('plugin::users-permissions.user').count({\n where: { ...identifierFilter },\n });\n\n if (conflictingUserCount > 0) {\n throw new ApplicationError('Email or Username are already taken');\n }\n }\n\n const newUser = {\n ...params,\n role: role.id,\n email: email.toLowerCase(),\n username,\n confirmed: !settings.email_confirmation,\n };\n\n const user = await getService('user').add(newUser);\n\n const sanitizedUser = await sanitizeUser(user, ctx);\n\n if (settings.email_confirmation) {\n try {\n await getService('user').sendConfirmationEmail(sanitizedUser);\n } catch (err) {\n strapi.log.error(err);\n throw new ApplicationError('Error sending confirmation email');\n }\n\n return ctx.send({ user: sanitizedUser });\n }\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n const deviceId = extractDeviceId(ctx.request.body) || crypto.randomUUID();\n\n const refresh = await strapi\n .sessionManager('users-permissions')\n .generateRefreshToken(String(user.id), deviceId, {\n type: 'refresh',\n metadata: buildSessionMetadataFromContext(ctx),\n });\n\n const access = await strapi\n .sessionManager('users-permissions')\n .generateAccessToken(refresh.token);\n if ('error' in access) {\n throw new ApplicationError('Invalid credentials');\n }\n\n return ctx.send({ jwt: access.token, refreshToken: refresh.token, user: sanitizedUser });\n }\n\n const jwt = getService('jwt').issue(_.pick(user, ['id']));\n return ctx.send({ jwt, user: sanitizedUser });\n },\n\n async emailConfirmation(ctx, next, returnUser) {\n const { confirmation: confirmationToken } = await validateEmailConfirmationBody(ctx.query);\n\n const userService = getService('user');\n const jwtService = getService('jwt');\n\n const [user] = await userService.fetchAll({ filters: { confirmationToken } });\n\n if (!user) {\n throw new ValidationError('Invalid token');\n }\n\n await userService.edit(user.id, { confirmed: true, confirmationToken: null });\n\n if (returnUser) {\n ctx.send({\n jwt: jwtService.issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n } else {\n const settings = await strapi\n .store({ type: 'plugin', name: 'users-permissions', key: 'advanced' })\n .get();\n\n ctx.redirect(settings.email_confirmation_redirection || '/');\n }\n },\n\n async sendEmailConfirmation(ctx) {\n const { email } = await validateSendEmailConfirmationBody(ctx.request.body);\n\n const user = await strapi.db.query('plugin::users-permissions.user').findOne({\n where: { email: email.toLowerCase() },\n });\n\n if (!user) {\n return ctx.send({ email, sent: true });\n }\n\n if (user.confirmed) {\n throw new ApplicationError('Already confirmed');\n }\n\n if (user.blocked) {\n throw new ApplicationError('User blocked');\n }\n\n await getService('user').sendConfirmationEmail(user);\n\n ctx.send({\n email: user.email,\n sent: true,\n });\n },\n});\n"],"names":["crypto","require$$0","_","require$$1","concat","compact","isArray","require$$2","utils","require$$3","getService","require$$4","buildRefreshCookieOptions","require$$5","validateCallbackBody","validateRegisterBody","validateSendEmailConfirmationBody","validateForgotPasswordBody","validateResetPasswordBody","validateEmailConfirmationBody","validateChangePasswordBody","require$$6","ApplicationError","ValidationError","ForbiddenError","errors","buildSessionMetadata","sanitizeSessionEntry","sortSessionsForDisplay","sanitizeUser","user","ctx","auth","state","userSchema","strapi","getModel","contentAPI","sanitize","output","extractDeviceId","requestBody","deviceId","length","undefined","buildSessionMetadataFromContext","userAgent","request","headers","sendRefreshAuthResponse","metadata","body","tokenOptions","type","refresh","sessionManager","generateRefreshToken","String","id","access","generateAccessToken","token","upSessions","config","get","requestHttpOnly","header","httpOnly","cookieName","cookie","name","isProduction","process","env","NODE_ENV","cookies","set","send","jwt","refreshToken","reissueTokensAfterPasswordChange","invalidateRefreshToken","newDeviceId","randomUUID","revokeLogoutSessions","userId","scope","currentSessionId","session","validation","validateRefreshToken","isValid","sessionId","revokeSessionById","callback","provider","params","store","grantSettings","key","grantProvider","identifier","db","query","findOne","where","$or","email","toLowerCase","username","password","validPassword","validatePassword","advancedSettings","requiresConfirmation","confirmed","blocked","mode","issue","connect","error","message","changePassword","validations","currentPassword","edit","resetPassword","passwordConfirmation","code","resetPasswordToken","notFound","badRequest","rotation","rotateRefreshToken","unauthorized","result","logout","err","log","maxAge","cookieOptions","expires","Date","ok","getSessions","sessions","listSessions","data","map","revokeSession","revoked","next","providers","requestPath","url","split","server","startsWith","warn","queryCustomCallback","dynamicSessionCallback","customCallback","validate","validateCallback","plugin","grant","dynamic","oauthConnect","createOAuthConnectMiddleware","require$$7","forgotPassword","pluginStore","emailSettings","userInfo","randomBytes","toString","resetPasswordSettings","emailBody","template","URL","email_reset_password","SERVER_URL","ADMIN_URL","USER","TOKEN","emailObject","object","emailToSend","to","from","replyTo","response_email","subject","text","html","service","register","settings","allow_register","alwaysAllowedKeys","allowedKeys","allowedFields","invalidKeys","Object","keys","filter","includes","join","pick","role","default_role","identifierFilter","conflictingUserCount","count","unique_email","newUser","email_confirmation","add","sanitizedUser","sendConfirmationEmail","emailConfirmation","returnUser","confirmation","confirmationToken","userService","jwtService","fetchAll","filters","redirect","email_confirmation_redirection","sendEmailConfirmation","sent"],"mappings":"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"}
|
|
@@ -324,7 +324,10 @@ function requireAuth() {
|
|
|
324
324
|
const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';
|
|
325
325
|
if (upSessions?.httpOnly || requestHttpOnly) {
|
|
326
326
|
const cookieName = upSessions.cookie?.name || 'strapi_up_refresh';
|
|
327
|
+
const isProduction = process.env.NODE_ENV === 'production';
|
|
328
|
+
const { maxAge, ...cookieOptions } = buildRefreshCookieOptions(upSessions, isProduction);
|
|
327
329
|
ctx.cookies.set(cookieName, '', {
|
|
330
|
+
...cookieOptions,
|
|
328
331
|
expires: new Date(0)
|
|
329
332
|
});
|
|
330
333
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.mjs","sources":["../../../server/src/controllers/auth.js"],"sourcesContent":["'use strict';\n\n/**\n * Auth.js controller\n *\n * @description: A set of functions called \"actions\" for managing `Auth`.\n */\n\n/* eslint-disable no-useless-escape */\nconst crypto = require('crypto');\nconst _ = require('lodash');\nconst { concat, compact, isArray } = require('lodash/fp');\nconst utils = require('@strapi/utils');\nconst { getService } = require('../utils');\nconst { buildRefreshCookieOptions } = require('../utils/refresh-cookie-options');\nconst {\n validateCallbackBody,\n validateRegisterBody,\n validateSendEmailConfirmationBody,\n validateForgotPasswordBody,\n validateResetPasswordBody,\n validateEmailConfirmationBody,\n validateChangePasswordBody,\n} = require('./validation/auth');\n\nconst { ApplicationError, ValidationError, ForbiddenError } = utils.errors;\nconst { buildSessionMetadata, sanitizeSessionEntry, sortSessionsForDisplay } = utils;\n\nconst sanitizeUser = (user, ctx) => {\n const { auth } = ctx.state;\n const userSchema = strapi.getModel('plugin::users-permissions.user');\n\n return strapi.contentAPI.sanitize.output(user, userSchema, { auth });\n};\n\nconst extractDeviceId = (requestBody) => {\n const { deviceId } = requestBody || {};\n\n return typeof deviceId === 'string' && deviceId.length > 0 ? deviceId : undefined;\n};\n\nconst buildSessionMetadataFromContext = (ctx) =>\n buildSessionMetadata({\n userAgent: ctx.request.headers['user-agent'],\n });\n\nconst sendRefreshAuthResponse = async (strapi, ctx, user, { metadata } = {}) => {\n const deviceId = extractDeviceId(ctx.request.body);\n const tokenOptions = { type: 'refresh', ...(metadata ? { metadata } : {}) };\n\n const refresh = await strapi\n .sessionManager('users-permissions')\n .generateRefreshToken(String(user.id), deviceId, tokenOptions);\n\n const access = await strapi\n .sessionManager('users-permissions')\n .generateAccessToken(refresh.token);\n if ('error' in access) {\n throw new ApplicationError('Invalid credentials');\n }\n\n const upSessions = strapi.config.get('plugin::users-permissions.sessions');\n const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';\n\n if (upSessions?.httpOnly || requestHttpOnly) {\n const cookieName = upSessions.cookie?.name || 'strapi_up_refresh';\n const isProduction = process.env.NODE_ENV === 'production';\n ctx.cookies.set(cookieName, refresh.token, buildRefreshCookieOptions(upSessions, isProduction));\n return ctx.send({ jwt: access.token, user: await sanitizeUser(user, ctx) });\n }\n\n return ctx.send({\n jwt: access.token,\n refreshToken: refresh.token,\n user: await sanitizeUser(user, ctx),\n });\n};\n\nconst reissueTokensAfterPasswordChange = async (strapi, ctx, user) => {\n const deviceId = extractDeviceId(ctx.request.body);\n\n await strapi.sessionManager('users-permissions').invalidateRefreshToken(String(user.id));\n\n const newDeviceId = deviceId || crypto.randomUUID();\n const refresh = await strapi\n .sessionManager('users-permissions')\n .generateRefreshToken(String(user.id), newDeviceId, { type: 'refresh' });\n\n const access = await strapi\n .sessionManager('users-permissions')\n .generateAccessToken(refresh.token);\n if ('error' in access) {\n throw new ApplicationError('Invalid credentials');\n }\n\n return ctx.send({\n jwt: access.token,\n refreshToken: refresh.token,\n user: await sanitizeUser(user, ctx),\n });\n};\n\nconst revokeLogoutSessions = async (strapi, ctx, userId, { scope, deviceId, body }) => {\n const sessionManager = strapi.sessionManager('users-permissions');\n const upSessions = strapi.config.get('plugin::users-permissions.sessions');\n\n if (scope === 'all') {\n await sessionManager.invalidateRefreshToken(userId);\n return;\n }\n\n if (deviceId) {\n await sessionManager.invalidateRefreshToken(userId, deviceId);\n return;\n }\n\n let currentSessionId = ctx.state.session?.id;\n const cookieName = upSessions?.cookie?.name || 'strapi_up_refresh';\n const refreshToken =\n ctx.cookies.get(cookieName) ||\n (typeof body.refreshToken === 'string' ? body.refreshToken : undefined);\n\n if (refreshToken) {\n const validation = await sessionManager.validateRefreshToken(refreshToken);\n if (validation.isValid) {\n currentSessionId = validation.sessionId;\n }\n }\n\n if (currentSessionId) {\n await sessionManager.revokeSessionById(userId, currentSessionId);\n return;\n }\n\n await sessionManager.invalidateRefreshToken(userId);\n};\n\nmodule.exports = ({ strapi }) => ({\n async callback(ctx) {\n const provider = ctx.params.provider || 'local';\n const params = ctx.request.body;\n\n const store = strapi.store({ type: 'plugin', name: 'users-permissions' });\n const grantSettings = await store.get({ key: 'grant' });\n\n const grantProvider = provider === 'local' ? 'email' : provider;\n\n if (!_.get(grantSettings, [grantProvider, 'enabled'])) {\n throw new ApplicationError('This provider is disabled');\n }\n\n if (provider === 'local') {\n await validateCallbackBody(params);\n\n const { identifier } = params;\n\n // Check if the user exists.\n const user = await strapi.db.query('plugin::users-permissions.user').findOne({\n where: {\n provider,\n $or: [{ email: identifier.toLowerCase() }, { username: identifier }],\n },\n });\n\n if (!user) {\n throw new ValidationError('Invalid identifier or password');\n }\n\n if (!user.password) {\n throw new ValidationError('Invalid identifier or password');\n }\n\n const validPassword = await getService('user').validatePassword(\n params.password,\n user.password\n );\n\n if (!validPassword) {\n throw new ValidationError('Invalid identifier or password');\n }\n\n const advancedSettings = await store.get({ key: 'advanced' });\n const requiresConfirmation = _.get(advancedSettings, 'email_confirmation');\n\n if (requiresConfirmation && user.confirmed !== true) {\n throw new ApplicationError('Your account email is not confirmed');\n }\n\n if (user.blocked === true) {\n throw new ApplicationError('Your account has been blocked by an administrator');\n }\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n return sendRefreshAuthResponse(strapi, ctx, user, {\n metadata: buildSessionMetadataFromContext(ctx),\n });\n }\n\n return ctx.send({\n jwt: getService('jwt').issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n }\n\n // Connect the user with the third-party provider.\n try {\n const user = await getService('providers').connect(provider, ctx.query);\n\n if (user.blocked) {\n throw new ForbiddenError('Your account has been blocked by an administrator');\n }\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n return sendRefreshAuthResponse(strapi, ctx, user, {\n metadata: buildSessionMetadataFromContext(ctx),\n });\n }\n\n return ctx.send({\n jwt: getService('jwt').issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n } catch (error) {\n throw new ApplicationError(error.message);\n }\n },\n\n async changePassword(ctx) {\n if (!ctx.state.user) {\n throw new ApplicationError('You must be authenticated to reset your password');\n }\n\n const validations = strapi.config.get('plugin::users-permissions.validationRules');\n\n const { currentPassword, password } = await validateChangePasswordBody(\n ctx.request.body,\n validations\n );\n\n const user = await strapi.db\n .query('plugin::users-permissions.user')\n .findOne({ where: { id: ctx.state.user.id } });\n\n const validPassword = await getService('user').validatePassword(currentPassword, user.password);\n\n if (!validPassword) {\n throw new ValidationError('The provided current password is invalid');\n }\n\n if (currentPassword === password) {\n throw new ValidationError('Your new password must be different than your current password');\n }\n\n await getService('user').edit(user.id, { password });\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n return reissueTokensAfterPasswordChange(strapi, ctx, user);\n }\n\n return ctx.send({\n jwt: getService('jwt').issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n },\n\n async resetPassword(ctx) {\n const validations = strapi.config.get('plugin::users-permissions.validationRules');\n\n const { password, passwordConfirmation, code } = await validateResetPasswordBody(\n ctx.request.body,\n validations\n );\n\n if (password !== passwordConfirmation) {\n throw new ValidationError('Passwords do not match');\n }\n\n const user = await strapi.db\n .query('plugin::users-permissions.user')\n .findOne({ where: { resetPasswordToken: code } });\n\n if (!user) {\n throw new ValidationError('Incorrect code provided');\n }\n\n await getService('user').edit(user.id, {\n resetPasswordToken: null,\n password,\n });\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n return reissueTokensAfterPasswordChange(strapi, ctx, user);\n }\n\n return ctx.send({\n jwt: getService('jwt').issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n },\n async refresh(ctx) {\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode !== 'refresh') {\n return ctx.notFound();\n }\n\n const upSessions = strapi.config.get('plugin::users-permissions.sessions');\n const cookieName = upSessions?.cookie?.name || 'strapi_up_refresh';\n\n // Check for refresh token in cookie first (if httpOnly is configured), then in body\n let refreshToken = ctx.cookies.get(cookieName);\n if (!refreshToken) {\n refreshToken = ctx.request.body?.refreshToken;\n }\n\n if (!refreshToken || typeof refreshToken !== 'string') {\n return ctx.badRequest('Missing refresh token');\n }\n\n const rotation = await strapi\n .sessionManager('users-permissions')\n .rotateRefreshToken(refreshToken);\n if ('error' in rotation) {\n return ctx.unauthorized('Invalid refresh token');\n }\n\n const result = await strapi\n .sessionManager('users-permissions')\n .generateAccessToken(rotation.token);\n if ('error' in result) {\n return ctx.unauthorized('Invalid refresh token');\n }\n\n const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';\n if (upSessions?.httpOnly || requestHttpOnly) {\n const isProduction = process.env.NODE_ENV === 'production';\n ctx.cookies.set(\n cookieName,\n rotation.token,\n buildRefreshCookieOptions(upSessions, isProduction)\n );\n return ctx.send({ jwt: result.token });\n }\n return ctx.send({ jwt: result.token, refreshToken: rotation.token });\n },\n async logout(ctx) {\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode !== 'refresh') {\n return ctx.notFound();\n }\n\n if (!ctx.state.user) {\n return ctx.unauthorized('Missing authentication');\n }\n\n const userId = String(ctx.state.user.id);\n const upSessions = strapi.config.get('plugin::users-permissions.sessions');\n const body = ctx.request.body || {};\n const scope = typeof body.scope === 'string' ? body.scope : undefined;\n const deviceId = extractDeviceId(body);\n\n try {\n await revokeLogoutSessions(strapi, ctx, userId, { scope, deviceId, body });\n } catch (err) {\n strapi.log.error('UP logout failed', err);\n }\n\n const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';\n if (upSessions?.httpOnly || requestHttpOnly) {\n const cookieName = upSessions.cookie?.name || 'strapi_up_refresh';\n ctx.cookies.set(cookieName, '', { expires: new Date(0) });\n }\n return ctx.send({ ok: true });\n },\n async getSessions(ctx) {\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode !== 'refresh') {\n return ctx.notFound();\n }\n\n if (!ctx.state.user) {\n return ctx.unauthorized('Missing authentication');\n }\n\n const currentSessionId = ctx.state.session?.id;\n const sessions = await strapi\n .sessionManager('users-permissions')\n .listSessions(String(ctx.state.user.id));\n\n const data = sortSessionsForDisplay(\n sessions.map((session) => sanitizeSessionEntry(session, currentSessionId))\n );\n\n return ctx.send({ data });\n },\n async revokeSession(ctx) {\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode !== 'refresh') {\n return ctx.notFound();\n }\n\n if (!ctx.state.user) {\n return ctx.unauthorized('Missing authentication');\n }\n\n const { sessionId } = ctx.params;\n const revoked = await strapi\n .sessionManager('users-permissions')\n .revokeSessionById(String(ctx.state.user.id), sessionId);\n\n if (!revoked) {\n return ctx.notFound('Session not found');\n }\n\n return ctx.send({ data: {} });\n },\n async connect(ctx, next) {\n const providers = await strapi\n .store({ type: 'plugin', name: 'users-permissions', key: 'grant' })\n .get();\n\n const [requestPath] = ctx.request.url.split('?');\n const provider = requestPath.split('/connect/')[1].split('/')[0];\n\n if (!_.get(providers, [provider, 'enabled'])) {\n throw new ApplicationError('This provider is disabled');\n }\n\n if (!strapi.config.server.url.startsWith('http')) {\n strapi.log.warn(\n 'You are using a third party provider for login. Make sure to set an absolute url in config/server.js. More info here: https://docs.strapi.io/developer-docs/latest/plugins/users-permissions.html#setting-up-the-server-url'\n );\n }\n\n const queryCustomCallback = _.get(ctx, 'query.callback');\n const dynamicSessionCallback = _.get(ctx, 'session.grant.dynamic.callback');\n const customCallback = queryCustomCallback ?? dynamicSessionCallback;\n\n if (customCallback !== undefined) {\n try {\n const { validate: validateCallback } = strapi\n .plugin('users-permissions')\n .config('callback');\n\n await validateCallback(customCallback, providers[provider]);\n\n // Persist across the provider redirect round-trip (request state alone is lost).\n ctx.session = ctx.session || {};\n ctx.session.grant = ctx.session.grant || {};\n ctx.session.grant.dynamic = {\n ...ctx.session.grant.dynamic,\n callback: customCallback,\n };\n ctx.state.oauthConnect = { callback: customCallback };\n } catch {\n throw new ValidationError('Invalid callback URL provided', { callback: customCallback });\n }\n }\n\n const { createOAuthConnectMiddleware } = require('../utils/oauth-connect');\n const oauthConnect = createOAuthConnectMiddleware();\n\n return oauthConnect(ctx, next);\n },\n\n async forgotPassword(ctx) {\n const { email } = await validateForgotPasswordBody(ctx.request.body);\n\n const pluginStore = await strapi.store({ type: 'plugin', name: 'users-permissions' });\n\n const emailSettings = await pluginStore.get({ key: 'email' });\n const advancedSettings = await pluginStore.get({ key: 'advanced' });\n\n // Find the user by email.\n const user = await strapi.db\n .query('plugin::users-permissions.user')\n .findOne({ where: { email: email.toLowerCase() } });\n\n if (!user || user.blocked) {\n return ctx.send({ ok: true });\n }\n\n // Generate random token.\n const userInfo = await sanitizeUser(user, ctx);\n\n const resetPasswordToken = crypto.randomBytes(64).toString('hex');\n\n const resetPasswordSettings = _.get(emailSettings, 'reset_password.options', {});\n const emailBody = await getService('users-permissions').template(\n resetPasswordSettings.message,\n {\n URL: advancedSettings.email_reset_password,\n SERVER_URL: strapi.config.get('server.absoluteUrl'),\n ADMIN_URL: strapi.config.get('admin.absoluteUrl'),\n USER: userInfo,\n TOKEN: resetPasswordToken,\n }\n );\n\n const emailObject = await getService('users-permissions').template(\n resetPasswordSettings.object,\n {\n USER: userInfo,\n }\n );\n\n const emailToSend = {\n to: user.email,\n from:\n resetPasswordSettings.from.email || resetPasswordSettings.from.name\n ? `${resetPasswordSettings.from.name} <${resetPasswordSettings.from.email}>`\n : undefined,\n replyTo: resetPasswordSettings.response_email,\n subject: emailObject,\n text: emailBody,\n html: emailBody,\n };\n\n // NOTE: Update the user before sending the email so an Admin can generate the link if the email fails\n await getService('user').edit(user.id, { resetPasswordToken });\n\n // Send an email to the user.\n await strapi.plugin('email').service('email').send(emailToSend);\n\n ctx.send({ ok: true });\n },\n\n async register(ctx) {\n const pluginStore = await strapi.store({ type: 'plugin', name: 'users-permissions' });\n\n const settings = await pluginStore.get({ key: 'advanced' });\n\n if (!settings.allow_register) {\n throw new ApplicationError('Register action is currently disabled');\n }\n\n const { register } = strapi.config.get('plugin::users-permissions');\n const alwaysAllowedKeys = ['username', 'password', 'email'];\n\n // Note that we intentionally do not filter allowedFields to allow a project to explicitly accept private or other Strapi field on registration\n const allowedKeys = compact(\n concat(alwaysAllowedKeys, isArray(register?.allowedFields) ? register.allowedFields : [])\n );\n\n // Check if there are any keys in requestBody that are not in allowedKeys\n const invalidKeys = Object.keys(ctx.request.body).filter((key) => !allowedKeys.includes(key));\n\n if (invalidKeys.length > 0) {\n // If there are invalid keys, throw an error\n throw new ValidationError(`Invalid parameters: ${invalidKeys.join(', ')}`);\n }\n\n const params = {\n ..._.pick(ctx.request.body, allowedKeys),\n provider: 'local',\n };\n\n const validations = strapi.config.get('plugin::users-permissions.validationRules');\n\n await validateRegisterBody(params, validations);\n\n const role = await strapi.db\n .query('plugin::users-permissions.role')\n .findOne({ where: { type: settings.default_role } });\n\n if (!role) {\n throw new ApplicationError('Impossible to find the default role');\n }\n\n const { email, username, provider } = params;\n\n const identifierFilter = {\n $or: [\n { email: email.toLowerCase() },\n { username: email.toLowerCase() },\n { username },\n { email: username },\n ],\n };\n\n const conflictingUserCount = await strapi.db.query('plugin::users-permissions.user').count({\n where: { ...identifierFilter, provider },\n });\n\n if (conflictingUserCount > 0) {\n throw new ApplicationError('Email or Username are already taken');\n }\n\n if (settings.unique_email) {\n const conflictingUserCount = await strapi.db.query('plugin::users-permissions.user').count({\n where: { ...identifierFilter },\n });\n\n if (conflictingUserCount > 0) {\n throw new ApplicationError('Email or Username are already taken');\n }\n }\n\n const newUser = {\n ...params,\n role: role.id,\n email: email.toLowerCase(),\n username,\n confirmed: !settings.email_confirmation,\n };\n\n const user = await getService('user').add(newUser);\n\n const sanitizedUser = await sanitizeUser(user, ctx);\n\n if (settings.email_confirmation) {\n try {\n await getService('user').sendConfirmationEmail(sanitizedUser);\n } catch (err) {\n strapi.log.error(err);\n throw new ApplicationError('Error sending confirmation email');\n }\n\n return ctx.send({ user: sanitizedUser });\n }\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n const deviceId = extractDeviceId(ctx.request.body) || crypto.randomUUID();\n\n const refresh = await strapi\n .sessionManager('users-permissions')\n .generateRefreshToken(String(user.id), deviceId, {\n type: 'refresh',\n metadata: buildSessionMetadataFromContext(ctx),\n });\n\n const access = await strapi\n .sessionManager('users-permissions')\n .generateAccessToken(refresh.token);\n if ('error' in access) {\n throw new ApplicationError('Invalid credentials');\n }\n\n return ctx.send({ jwt: access.token, refreshToken: refresh.token, user: sanitizedUser });\n }\n\n const jwt = getService('jwt').issue(_.pick(user, ['id']));\n return ctx.send({ jwt, user: sanitizedUser });\n },\n\n async emailConfirmation(ctx, next, returnUser) {\n const { confirmation: confirmationToken } = await validateEmailConfirmationBody(ctx.query);\n\n const userService = getService('user');\n const jwtService = getService('jwt');\n\n const [user] = await userService.fetchAll({ filters: { confirmationToken } });\n\n if (!user) {\n throw new ValidationError('Invalid token');\n }\n\n await userService.edit(user.id, { confirmed: true, confirmationToken: null });\n\n if (returnUser) {\n ctx.send({\n jwt: jwtService.issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n } else {\n const settings = await strapi\n .store({ type: 'plugin', name: 'users-permissions', key: 'advanced' })\n .get();\n\n ctx.redirect(settings.email_confirmation_redirection || '/');\n }\n },\n\n async sendEmailConfirmation(ctx) {\n const { email } = await validateSendEmailConfirmationBody(ctx.request.body);\n\n const user = await strapi.db.query('plugin::users-permissions.user').findOne({\n where: { email: email.toLowerCase() },\n });\n\n if (!user) {\n return ctx.send({ email, sent: true });\n }\n\n if (user.confirmed) {\n throw new ApplicationError('Already confirmed');\n }\n\n if (user.blocked) {\n throw new ApplicationError('User blocked');\n }\n\n await getService('user').sendConfirmationEmail(user);\n\n ctx.send({\n email: user.email,\n sent: true,\n });\n },\n});\n"],"names":["crypto","require$$0","_","require$$1","concat","compact","isArray","require$$2","utils","require$$3","getService","require$$4","buildRefreshCookieOptions","require$$5","validateCallbackBody","validateRegisterBody","validateSendEmailConfirmationBody","validateForgotPasswordBody","validateResetPasswordBody","validateEmailConfirmationBody","validateChangePasswordBody","require$$6","ApplicationError","ValidationError","ForbiddenError","errors","buildSessionMetadata","sanitizeSessionEntry","sortSessionsForDisplay","sanitizeUser","user","ctx","auth","state","userSchema","strapi","getModel","contentAPI","sanitize","output","extractDeviceId","requestBody","deviceId","length","undefined","buildSessionMetadataFromContext","userAgent","request","headers","sendRefreshAuthResponse","metadata","body","tokenOptions","type","refresh","sessionManager","generateRefreshToken","String","id","access","generateAccessToken","token","upSessions","config","get","requestHttpOnly","header","httpOnly","cookieName","cookie","name","isProduction","process","env","NODE_ENV","cookies","set","send","jwt","refreshToken","reissueTokensAfterPasswordChange","invalidateRefreshToken","newDeviceId","randomUUID","revokeLogoutSessions","userId","scope","currentSessionId","session","validation","validateRefreshToken","isValid","sessionId","revokeSessionById","callback","provider","params","store","grantSettings","key","grantProvider","identifier","db","query","findOne","where","$or","email","toLowerCase","username","password","validPassword","validatePassword","advancedSettings","requiresConfirmation","confirmed","blocked","mode","issue","connect","error","message","changePassword","validations","currentPassword","edit","resetPassword","passwordConfirmation","code","resetPasswordToken","notFound","badRequest","rotation","rotateRefreshToken","unauthorized","result","logout","err","log","expires","Date","ok","getSessions","sessions","listSessions","data","map","revokeSession","revoked","next","providers","requestPath","url","split","server","startsWith","warn","queryCustomCallback","dynamicSessionCallback","customCallback","validate","validateCallback","plugin","grant","dynamic","oauthConnect","createOAuthConnectMiddleware","require$$7","forgotPassword","pluginStore","emailSettings","userInfo","randomBytes","toString","resetPasswordSettings","emailBody","template","URL","email_reset_password","SERVER_URL","ADMIN_URL","USER","TOKEN","emailObject","object","emailToSend","to","from","replyTo","response_email","subject","text","html","service","register","settings","allow_register","alwaysAllowedKeys","allowedKeys","allowedFields","invalidKeys","Object","keys","filter","includes","join","pick","role","default_role","identifierFilter","conflictingUserCount","count","unique_email","newUser","email_confirmation","add","sanitizedUser","sendConfirmationEmail","emailConfirmation","returnUser","confirmation","confirmationToken","userService","jwtService","fetchAll","filters","redirect","email_confirmation_redirection","sendEmailConfirmation","sent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth.mjs","sources":["../../../server/src/controllers/auth.js"],"sourcesContent":["'use strict';\n\n/**\n * Auth.js controller\n *\n * @description: A set of functions called \"actions\" for managing `Auth`.\n */\n\n/* eslint-disable no-useless-escape */\nconst crypto = require('crypto');\nconst _ = require('lodash');\nconst { concat, compact, isArray } = require('lodash/fp');\nconst utils = require('@strapi/utils');\nconst { getService } = require('../utils');\nconst { buildRefreshCookieOptions } = require('../utils/refresh-cookie-options');\nconst {\n validateCallbackBody,\n validateRegisterBody,\n validateSendEmailConfirmationBody,\n validateForgotPasswordBody,\n validateResetPasswordBody,\n validateEmailConfirmationBody,\n validateChangePasswordBody,\n} = require('./validation/auth');\n\nconst { ApplicationError, ValidationError, ForbiddenError } = utils.errors;\nconst { buildSessionMetadata, sanitizeSessionEntry, sortSessionsForDisplay } = utils;\n\nconst sanitizeUser = (user, ctx) => {\n const { auth } = ctx.state;\n const userSchema = strapi.getModel('plugin::users-permissions.user');\n\n return strapi.contentAPI.sanitize.output(user, userSchema, { auth });\n};\n\nconst extractDeviceId = (requestBody) => {\n const { deviceId } = requestBody || {};\n\n return typeof deviceId === 'string' && deviceId.length > 0 ? deviceId : undefined;\n};\n\nconst buildSessionMetadataFromContext = (ctx) =>\n buildSessionMetadata({\n userAgent: ctx.request.headers['user-agent'],\n });\n\nconst sendRefreshAuthResponse = async (strapi, ctx, user, { metadata } = {}) => {\n const deviceId = extractDeviceId(ctx.request.body);\n const tokenOptions = { type: 'refresh', ...(metadata ? { metadata } : {}) };\n\n const refresh = await strapi\n .sessionManager('users-permissions')\n .generateRefreshToken(String(user.id), deviceId, tokenOptions);\n\n const access = await strapi\n .sessionManager('users-permissions')\n .generateAccessToken(refresh.token);\n if ('error' in access) {\n throw new ApplicationError('Invalid credentials');\n }\n\n const upSessions = strapi.config.get('plugin::users-permissions.sessions');\n const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';\n\n if (upSessions?.httpOnly || requestHttpOnly) {\n const cookieName = upSessions.cookie?.name || 'strapi_up_refresh';\n const isProduction = process.env.NODE_ENV === 'production';\n ctx.cookies.set(cookieName, refresh.token, buildRefreshCookieOptions(upSessions, isProduction));\n return ctx.send({ jwt: access.token, user: await sanitizeUser(user, ctx) });\n }\n\n return ctx.send({\n jwt: access.token,\n refreshToken: refresh.token,\n user: await sanitizeUser(user, ctx),\n });\n};\n\nconst reissueTokensAfterPasswordChange = async (strapi, ctx, user) => {\n const deviceId = extractDeviceId(ctx.request.body);\n\n await strapi.sessionManager('users-permissions').invalidateRefreshToken(String(user.id));\n\n const newDeviceId = deviceId || crypto.randomUUID();\n const refresh = await strapi\n .sessionManager('users-permissions')\n .generateRefreshToken(String(user.id), newDeviceId, { type: 'refresh' });\n\n const access = await strapi\n .sessionManager('users-permissions')\n .generateAccessToken(refresh.token);\n if ('error' in access) {\n throw new ApplicationError('Invalid credentials');\n }\n\n return ctx.send({\n jwt: access.token,\n refreshToken: refresh.token,\n user: await sanitizeUser(user, ctx),\n });\n};\n\nconst revokeLogoutSessions = async (strapi, ctx, userId, { scope, deviceId, body }) => {\n const sessionManager = strapi.sessionManager('users-permissions');\n const upSessions = strapi.config.get('plugin::users-permissions.sessions');\n\n if (scope === 'all') {\n await sessionManager.invalidateRefreshToken(userId);\n return;\n }\n\n if (deviceId) {\n await sessionManager.invalidateRefreshToken(userId, deviceId);\n return;\n }\n\n let currentSessionId = ctx.state.session?.id;\n const cookieName = upSessions?.cookie?.name || 'strapi_up_refresh';\n const refreshToken =\n ctx.cookies.get(cookieName) ||\n (typeof body.refreshToken === 'string' ? body.refreshToken : undefined);\n\n if (refreshToken) {\n const validation = await sessionManager.validateRefreshToken(refreshToken);\n if (validation.isValid) {\n currentSessionId = validation.sessionId;\n }\n }\n\n if (currentSessionId) {\n await sessionManager.revokeSessionById(userId, currentSessionId);\n return;\n }\n\n await sessionManager.invalidateRefreshToken(userId);\n};\n\nmodule.exports = ({ strapi }) => ({\n async callback(ctx) {\n const provider = ctx.params.provider || 'local';\n const params = ctx.request.body;\n\n const store = strapi.store({ type: 'plugin', name: 'users-permissions' });\n const grantSettings = await store.get({ key: 'grant' });\n\n const grantProvider = provider === 'local' ? 'email' : provider;\n\n if (!_.get(grantSettings, [grantProvider, 'enabled'])) {\n throw new ApplicationError('This provider is disabled');\n }\n\n if (provider === 'local') {\n await validateCallbackBody(params);\n\n const { identifier } = params;\n\n // Check if the user exists.\n const user = await strapi.db.query('plugin::users-permissions.user').findOne({\n where: {\n provider,\n $or: [{ email: identifier.toLowerCase() }, { username: identifier }],\n },\n });\n\n if (!user) {\n throw new ValidationError('Invalid identifier or password');\n }\n\n if (!user.password) {\n throw new ValidationError('Invalid identifier or password');\n }\n\n const validPassword = await getService('user').validatePassword(\n params.password,\n user.password\n );\n\n if (!validPassword) {\n throw new ValidationError('Invalid identifier or password');\n }\n\n const advancedSettings = await store.get({ key: 'advanced' });\n const requiresConfirmation = _.get(advancedSettings, 'email_confirmation');\n\n if (requiresConfirmation && user.confirmed !== true) {\n throw new ApplicationError('Your account email is not confirmed');\n }\n\n if (user.blocked === true) {\n throw new ApplicationError('Your account has been blocked by an administrator');\n }\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n return sendRefreshAuthResponse(strapi, ctx, user, {\n metadata: buildSessionMetadataFromContext(ctx),\n });\n }\n\n return ctx.send({\n jwt: getService('jwt').issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n }\n\n // Connect the user with the third-party provider.\n try {\n const user = await getService('providers').connect(provider, ctx.query);\n\n if (user.blocked) {\n throw new ForbiddenError('Your account has been blocked by an administrator');\n }\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n return sendRefreshAuthResponse(strapi, ctx, user, {\n metadata: buildSessionMetadataFromContext(ctx),\n });\n }\n\n return ctx.send({\n jwt: getService('jwt').issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n } catch (error) {\n throw new ApplicationError(error.message);\n }\n },\n\n async changePassword(ctx) {\n if (!ctx.state.user) {\n throw new ApplicationError('You must be authenticated to reset your password');\n }\n\n const validations = strapi.config.get('plugin::users-permissions.validationRules');\n\n const { currentPassword, password } = await validateChangePasswordBody(\n ctx.request.body,\n validations\n );\n\n const user = await strapi.db\n .query('plugin::users-permissions.user')\n .findOne({ where: { id: ctx.state.user.id } });\n\n const validPassword = await getService('user').validatePassword(currentPassword, user.password);\n\n if (!validPassword) {\n throw new ValidationError('The provided current password is invalid');\n }\n\n if (currentPassword === password) {\n throw new ValidationError('Your new password must be different than your current password');\n }\n\n await getService('user').edit(user.id, { password });\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n return reissueTokensAfterPasswordChange(strapi, ctx, user);\n }\n\n return ctx.send({\n jwt: getService('jwt').issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n },\n\n async resetPassword(ctx) {\n const validations = strapi.config.get('plugin::users-permissions.validationRules');\n\n const { password, passwordConfirmation, code } = await validateResetPasswordBody(\n ctx.request.body,\n validations\n );\n\n if (password !== passwordConfirmation) {\n throw new ValidationError('Passwords do not match');\n }\n\n const user = await strapi.db\n .query('plugin::users-permissions.user')\n .findOne({ where: { resetPasswordToken: code } });\n\n if (!user) {\n throw new ValidationError('Incorrect code provided');\n }\n\n await getService('user').edit(user.id, {\n resetPasswordToken: null,\n password,\n });\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n return reissueTokensAfterPasswordChange(strapi, ctx, user);\n }\n\n return ctx.send({\n jwt: getService('jwt').issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n },\n async refresh(ctx) {\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode !== 'refresh') {\n return ctx.notFound();\n }\n\n const upSessions = strapi.config.get('plugin::users-permissions.sessions');\n const cookieName = upSessions?.cookie?.name || 'strapi_up_refresh';\n\n // Check for refresh token in cookie first (if httpOnly is configured), then in body\n let refreshToken = ctx.cookies.get(cookieName);\n if (!refreshToken) {\n refreshToken = ctx.request.body?.refreshToken;\n }\n\n if (!refreshToken || typeof refreshToken !== 'string') {\n return ctx.badRequest('Missing refresh token');\n }\n\n const rotation = await strapi\n .sessionManager('users-permissions')\n .rotateRefreshToken(refreshToken);\n if ('error' in rotation) {\n return ctx.unauthorized('Invalid refresh token');\n }\n\n const result = await strapi\n .sessionManager('users-permissions')\n .generateAccessToken(rotation.token);\n if ('error' in result) {\n return ctx.unauthorized('Invalid refresh token');\n }\n\n const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';\n if (upSessions?.httpOnly || requestHttpOnly) {\n const isProduction = process.env.NODE_ENV === 'production';\n ctx.cookies.set(\n cookieName,\n rotation.token,\n buildRefreshCookieOptions(upSessions, isProduction)\n );\n return ctx.send({ jwt: result.token });\n }\n return ctx.send({ jwt: result.token, refreshToken: rotation.token });\n },\n async logout(ctx) {\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode !== 'refresh') {\n return ctx.notFound();\n }\n\n if (!ctx.state.user) {\n return ctx.unauthorized('Missing authentication');\n }\n\n const userId = String(ctx.state.user.id);\n const upSessions = strapi.config.get('plugin::users-permissions.sessions');\n const body = ctx.request.body || {};\n const scope = typeof body.scope === 'string' ? body.scope : undefined;\n const deviceId = extractDeviceId(body);\n\n try {\n await revokeLogoutSessions(strapi, ctx, userId, { scope, deviceId, body });\n } catch (err) {\n strapi.log.error('UP logout failed', err);\n }\n\n const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';\n if (upSessions?.httpOnly || requestHttpOnly) {\n const cookieName = upSessions.cookie?.name || 'strapi_up_refresh';\n const isProduction = process.env.NODE_ENV === 'production';\n\n const { maxAge, ...cookieOptions } = buildRefreshCookieOptions(upSessions, isProduction);\n\n ctx.cookies.set(cookieName, '', { ...cookieOptions, expires: new Date(0) });\n }\n return ctx.send({ ok: true });\n },\n async getSessions(ctx) {\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode !== 'refresh') {\n return ctx.notFound();\n }\n\n if (!ctx.state.user) {\n return ctx.unauthorized('Missing authentication');\n }\n\n const currentSessionId = ctx.state.session?.id;\n const sessions = await strapi\n .sessionManager('users-permissions')\n .listSessions(String(ctx.state.user.id));\n\n const data = sortSessionsForDisplay(\n sessions.map((session) => sanitizeSessionEntry(session, currentSessionId))\n );\n\n return ctx.send({ data });\n },\n async revokeSession(ctx) {\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode !== 'refresh') {\n return ctx.notFound();\n }\n\n if (!ctx.state.user) {\n return ctx.unauthorized('Missing authentication');\n }\n\n const { sessionId } = ctx.params;\n const revoked = await strapi\n .sessionManager('users-permissions')\n .revokeSessionById(String(ctx.state.user.id), sessionId);\n\n if (!revoked) {\n return ctx.notFound('Session not found');\n }\n\n return ctx.send({ data: {} });\n },\n async connect(ctx, next) {\n const providers = await strapi\n .store({ type: 'plugin', name: 'users-permissions', key: 'grant' })\n .get();\n\n const [requestPath] = ctx.request.url.split('?');\n const provider = requestPath.split('/connect/')[1].split('/')[0];\n\n if (!_.get(providers, [provider, 'enabled'])) {\n throw new ApplicationError('This provider is disabled');\n }\n\n if (!strapi.config.server.url.startsWith('http')) {\n strapi.log.warn(\n 'You are using a third party provider for login. Make sure to set an absolute url in config/server.js. More info here: https://docs.strapi.io/developer-docs/latest/plugins/users-permissions.html#setting-up-the-server-url'\n );\n }\n\n const queryCustomCallback = _.get(ctx, 'query.callback');\n const dynamicSessionCallback = _.get(ctx, 'session.grant.dynamic.callback');\n const customCallback = queryCustomCallback ?? dynamicSessionCallback;\n\n if (customCallback !== undefined) {\n try {\n const { validate: validateCallback } = strapi\n .plugin('users-permissions')\n .config('callback');\n\n await validateCallback(customCallback, providers[provider]);\n\n // Persist across the provider redirect round-trip (request state alone is lost).\n ctx.session = ctx.session || {};\n ctx.session.grant = ctx.session.grant || {};\n ctx.session.grant.dynamic = {\n ...ctx.session.grant.dynamic,\n callback: customCallback,\n };\n ctx.state.oauthConnect = { callback: customCallback };\n } catch {\n throw new ValidationError('Invalid callback URL provided', { callback: customCallback });\n }\n }\n\n const { createOAuthConnectMiddleware } = require('../utils/oauth-connect');\n const oauthConnect = createOAuthConnectMiddleware();\n\n return oauthConnect(ctx, next);\n },\n\n async forgotPassword(ctx) {\n const { email } = await validateForgotPasswordBody(ctx.request.body);\n\n const pluginStore = await strapi.store({ type: 'plugin', name: 'users-permissions' });\n\n const emailSettings = await pluginStore.get({ key: 'email' });\n const advancedSettings = await pluginStore.get({ key: 'advanced' });\n\n // Find the user by email.\n const user = await strapi.db\n .query('plugin::users-permissions.user')\n .findOne({ where: { email: email.toLowerCase() } });\n\n if (!user || user.blocked) {\n return ctx.send({ ok: true });\n }\n\n // Generate random token.\n const userInfo = await sanitizeUser(user, ctx);\n\n const resetPasswordToken = crypto.randomBytes(64).toString('hex');\n\n const resetPasswordSettings = _.get(emailSettings, 'reset_password.options', {});\n const emailBody = await getService('users-permissions').template(\n resetPasswordSettings.message,\n {\n URL: advancedSettings.email_reset_password,\n SERVER_URL: strapi.config.get('server.absoluteUrl'),\n ADMIN_URL: strapi.config.get('admin.absoluteUrl'),\n USER: userInfo,\n TOKEN: resetPasswordToken,\n }\n );\n\n const emailObject = await getService('users-permissions').template(\n resetPasswordSettings.object,\n {\n USER: userInfo,\n }\n );\n\n const emailToSend = {\n to: user.email,\n from:\n resetPasswordSettings.from.email || resetPasswordSettings.from.name\n ? `${resetPasswordSettings.from.name} <${resetPasswordSettings.from.email}>`\n : undefined,\n replyTo: resetPasswordSettings.response_email,\n subject: emailObject,\n text: emailBody,\n html: emailBody,\n };\n\n // NOTE: Update the user before sending the email so an Admin can generate the link if the email fails\n await getService('user').edit(user.id, { resetPasswordToken });\n\n // Send an email to the user.\n await strapi.plugin('email').service('email').send(emailToSend);\n\n ctx.send({ ok: true });\n },\n\n async register(ctx) {\n const pluginStore = await strapi.store({ type: 'plugin', name: 'users-permissions' });\n\n const settings = await pluginStore.get({ key: 'advanced' });\n\n if (!settings.allow_register) {\n throw new ApplicationError('Register action is currently disabled');\n }\n\n const { register } = strapi.config.get('plugin::users-permissions');\n const alwaysAllowedKeys = ['username', 'password', 'email'];\n\n // Note that we intentionally do not filter allowedFields to allow a project to explicitly accept private or other Strapi field on registration\n const allowedKeys = compact(\n concat(alwaysAllowedKeys, isArray(register?.allowedFields) ? register.allowedFields : [])\n );\n\n // Check if there are any keys in requestBody that are not in allowedKeys\n const invalidKeys = Object.keys(ctx.request.body).filter((key) => !allowedKeys.includes(key));\n\n if (invalidKeys.length > 0) {\n // If there are invalid keys, throw an error\n throw new ValidationError(`Invalid parameters: ${invalidKeys.join(', ')}`);\n }\n\n const params = {\n ..._.pick(ctx.request.body, allowedKeys),\n provider: 'local',\n };\n\n const validations = strapi.config.get('plugin::users-permissions.validationRules');\n\n await validateRegisterBody(params, validations);\n\n const role = await strapi.db\n .query('plugin::users-permissions.role')\n .findOne({ where: { type: settings.default_role } });\n\n if (!role) {\n throw new ApplicationError('Impossible to find the default role');\n }\n\n const { email, username, provider } = params;\n\n const identifierFilter = {\n $or: [\n { email: email.toLowerCase() },\n { username: email.toLowerCase() },\n { username },\n { email: username },\n ],\n };\n\n const conflictingUserCount = await strapi.db.query('plugin::users-permissions.user').count({\n where: { ...identifierFilter, provider },\n });\n\n if (conflictingUserCount > 0) {\n throw new ApplicationError('Email or Username are already taken');\n }\n\n if (settings.unique_email) {\n const conflictingUserCount = await strapi.db.query('plugin::users-permissions.user').count({\n where: { ...identifierFilter },\n });\n\n if (conflictingUserCount > 0) {\n throw new ApplicationError('Email or Username are already taken');\n }\n }\n\n const newUser = {\n ...params,\n role: role.id,\n email: email.toLowerCase(),\n username,\n confirmed: !settings.email_confirmation,\n };\n\n const user = await getService('user').add(newUser);\n\n const sanitizedUser = await sanitizeUser(user, ctx);\n\n if (settings.email_confirmation) {\n try {\n await getService('user').sendConfirmationEmail(sanitizedUser);\n } catch (err) {\n strapi.log.error(err);\n throw new ApplicationError('Error sending confirmation email');\n }\n\n return ctx.send({ user: sanitizedUser });\n }\n\n const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');\n if (mode === 'refresh') {\n const deviceId = extractDeviceId(ctx.request.body) || crypto.randomUUID();\n\n const refresh = await strapi\n .sessionManager('users-permissions')\n .generateRefreshToken(String(user.id), deviceId, {\n type: 'refresh',\n metadata: buildSessionMetadataFromContext(ctx),\n });\n\n const access = await strapi\n .sessionManager('users-permissions')\n .generateAccessToken(refresh.token);\n if ('error' in access) {\n throw new ApplicationError('Invalid credentials');\n }\n\n return ctx.send({ jwt: access.token, refreshToken: refresh.token, user: sanitizedUser });\n }\n\n const jwt = getService('jwt').issue(_.pick(user, ['id']));\n return ctx.send({ jwt, user: sanitizedUser });\n },\n\n async emailConfirmation(ctx, next, returnUser) {\n const { confirmation: confirmationToken } = await validateEmailConfirmationBody(ctx.query);\n\n const userService = getService('user');\n const jwtService = getService('jwt');\n\n const [user] = await userService.fetchAll({ filters: { confirmationToken } });\n\n if (!user) {\n throw new ValidationError('Invalid token');\n }\n\n await userService.edit(user.id, { confirmed: true, confirmationToken: null });\n\n if (returnUser) {\n ctx.send({\n jwt: jwtService.issue({ id: user.id }),\n user: await sanitizeUser(user, ctx),\n });\n } else {\n const settings = await strapi\n .store({ type: 'plugin', name: 'users-permissions', key: 'advanced' })\n .get();\n\n ctx.redirect(settings.email_confirmation_redirection || '/');\n }\n },\n\n async sendEmailConfirmation(ctx) {\n const { email } = await validateSendEmailConfirmationBody(ctx.request.body);\n\n const user = await strapi.db.query('plugin::users-permissions.user').findOne({\n where: { email: email.toLowerCase() },\n });\n\n if (!user) {\n return ctx.send({ email, sent: true });\n }\n\n if (user.confirmed) {\n throw new ApplicationError('Already confirmed');\n }\n\n if (user.blocked) {\n throw new ApplicationError('User blocked');\n }\n\n await getService('user').sendConfirmationEmail(user);\n\n ctx.send({\n email: user.email,\n sent: true,\n });\n },\n});\n"],"names":["crypto","require$$0","_","require$$1","concat","compact","isArray","require$$2","utils","require$$3","getService","require$$4","buildRefreshCookieOptions","require$$5","validateCallbackBody","validateRegisterBody","validateSendEmailConfirmationBody","validateForgotPasswordBody","validateResetPasswordBody","validateEmailConfirmationBody","validateChangePasswordBody","require$$6","ApplicationError","ValidationError","ForbiddenError","errors","buildSessionMetadata","sanitizeSessionEntry","sortSessionsForDisplay","sanitizeUser","user","ctx","auth","state","userSchema","strapi","getModel","contentAPI","sanitize","output","extractDeviceId","requestBody","deviceId","length","undefined","buildSessionMetadataFromContext","userAgent","request","headers","sendRefreshAuthResponse","metadata","body","tokenOptions","type","refresh","sessionManager","generateRefreshToken","String","id","access","generateAccessToken","token","upSessions","config","get","requestHttpOnly","header","httpOnly","cookieName","cookie","name","isProduction","process","env","NODE_ENV","cookies","set","send","jwt","refreshToken","reissueTokensAfterPasswordChange","invalidateRefreshToken","newDeviceId","randomUUID","revokeLogoutSessions","userId","scope","currentSessionId","session","validation","validateRefreshToken","isValid","sessionId","revokeSessionById","callback","provider","params","store","grantSettings","key","grantProvider","identifier","db","query","findOne","where","$or","email","toLowerCase","username","password","validPassword","validatePassword","advancedSettings","requiresConfirmation","confirmed","blocked","mode","issue","connect","error","message","changePassword","validations","currentPassword","edit","resetPassword","passwordConfirmation","code","resetPasswordToken","notFound","badRequest","rotation","rotateRefreshToken","unauthorized","result","logout","err","log","maxAge","cookieOptions","expires","Date","ok","getSessions","sessions","listSessions","data","map","revokeSession","revoked","next","providers","requestPath","url","split","server","startsWith","warn","queryCustomCallback","dynamicSessionCallback","customCallback","validate","validateCallback","plugin","grant","dynamic","oauthConnect","createOAuthConnectMiddleware","require$$7","forgotPassword","pluginStore","emailSettings","userInfo","randomBytes","toString","resetPasswordSettings","emailBody","template","URL","email_reset_password","SERVER_URL","ADMIN_URL","USER","TOKEN","emailObject","object","emailToSend","to","from","replyTo","response_email","subject","text","html","service","register","settings","allow_register","alwaysAllowedKeys","allowedKeys","allowedFields","invalidKeys","Object","keys","filter","includes","join","pick","role","default_role","identifierFilter","conflictingUserCount","count","unique_email","newUser","email_confirmation","add","sanitizedUser","sendConfirmationEmail","emailConfirmation","returnUser","confirmation","confirmationToken","userService","jwtService","fetchAll","filters","redirect","email_confirmation_redirection","sendEmailConfirmation","sent"],"mappings":"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"}
|
|
@@ -94,7 +94,7 @@ function requireUsersPermissions() {
|
|
|
94
94
|
}
|
|
95
95
|
return action[Symbol.for('__type__')].includes('content-api');
|
|
96
96
|
};
|
|
97
|
-
|
|
97
|
+
for (const [apiName, api] of Object.entries(strapi.apis)){
|
|
98
98
|
const controllers = _.reduce(api.controllers, (acc, controller, controllerName)=>{
|
|
99
99
|
const contentApiActions = _.pickBy(controller, isContentApi);
|
|
100
100
|
if (_.isEmpty(contentApiActions)) {
|
|
@@ -113,8 +113,8 @@ function requireUsersPermissions() {
|
|
|
113
113
|
controllers
|
|
114
114
|
};
|
|
115
115
|
}
|
|
116
|
-
}
|
|
117
|
-
|
|
116
|
+
}
|
|
117
|
+
for (const [pluginName, plugin] of Object.entries(strapi.plugins)){
|
|
118
118
|
const controllers = _.reduce(plugin.controllers, (acc, controller, controllerName)=>{
|
|
119
119
|
const contentApiActions = _.pickBy(controller, isContentApi);
|
|
120
120
|
if (_.isEmpty(contentApiActions)) {
|
|
@@ -133,13 +133,13 @@ function requireUsersPermissions() {
|
|
|
133
133
|
controllers
|
|
134
134
|
};
|
|
135
135
|
}
|
|
136
|
-
}
|
|
136
|
+
}
|
|
137
137
|
// Return a deeply cloned version to avoid circular references
|
|
138
138
|
return _.cloneDeep(actionMap);
|
|
139
139
|
},
|
|
140
140
|
async getRoutes () {
|
|
141
141
|
const routesMap = {};
|
|
142
|
-
|
|
142
|
+
for (const [apiName, api] of Object.entries(strapi.apis)){
|
|
143
143
|
const routes = _.flatMap(api.routes, (route)=>{
|
|
144
144
|
if (_.has(route, 'routes')) {
|
|
145
145
|
return route.routes;
|
|
@@ -147,15 +147,15 @@ function requireUsersPermissions() {
|
|
|
147
147
|
return route;
|
|
148
148
|
}).filter((route)=>route.info.type === 'content-api');
|
|
149
149
|
if (routes.length === 0) {
|
|
150
|
-
|
|
150
|
+
continue;
|
|
151
151
|
}
|
|
152
152
|
const apiPrefix = strapi.config.get('api.rest.prefix');
|
|
153
153
|
routesMap[`api::${apiName}`] = routes.map((route)=>({
|
|
154
154
|
...route,
|
|
155
155
|
path: urlJoin(apiPrefix, route.path)
|
|
156
156
|
}));
|
|
157
|
-
}
|
|
158
|
-
|
|
157
|
+
}
|
|
158
|
+
for (const [pluginName, plugin] of Object.entries(strapi.plugins)){
|
|
159
159
|
const transformPrefix = transformRoutePrefixFor(pluginName);
|
|
160
160
|
const routes = _.flatMap(plugin.routes, (route)=>{
|
|
161
161
|
if (_.has(route, 'routes')) {
|
|
@@ -164,14 +164,14 @@ function requireUsersPermissions() {
|
|
|
164
164
|
return transformPrefix(route);
|
|
165
165
|
}).filter((route)=>route.info.type === 'content-api');
|
|
166
166
|
if (routes.length === 0) {
|
|
167
|
-
|
|
167
|
+
continue;
|
|
168
168
|
}
|
|
169
169
|
const apiPrefix = strapi.config.get('api.rest.prefix');
|
|
170
170
|
routesMap[`plugin::${pluginName}`] = routes.map((route)=>({
|
|
171
171
|
...route,
|
|
172
172
|
path: urlJoin(apiPrefix, route.path)
|
|
173
173
|
}));
|
|
174
|
-
}
|
|
174
|
+
}
|
|
175
175
|
return sanitizeRoutesMapForSerialization(routesMap);
|
|
176
176
|
},
|
|
177
177
|
async syncPermissions () {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users-permissions.js","sources":["../../../server/src/services/users-permissions.js"],"sourcesContent":["'use strict';\n\nconst _ = require('lodash');\nconst { filter, map, pipe, prop } = require('lodash/fp');\nconst urlJoin = require('url-join');\nconst {\n template: { createStrictInterpolationRegExp },\n errors,\n objects,\n sanitizeRoutesMapForSerialization,\n} = require('@strapi/utils');\n\nconst { getService } = require('../utils');\n\nconst DEFAULT_PERMISSIONS = [\n { action: 'plugin::users-permissions.auth.callback', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.connect', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.forgotPassword', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.resetPassword', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.register', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.emailConfirmation', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.sendEmailConfirmation', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.refresh', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.logout', roleType: 'authenticated' },\n { action: 'plugin::users-permissions.auth.getSessions', roleType: 'authenticated' },\n { action: 'plugin::users-permissions.auth.revokeSession', roleType: 'authenticated' },\n { action: 'plugin::users-permissions.user.me', roleType: 'authenticated' },\n { action: 'plugin::users-permissions.auth.changePassword', roleType: 'authenticated' },\n];\n\nconst transformRoutePrefixFor = (pluginName) => (route) => {\n const prefix = route.config && route.config.prefix;\n const path = prefix !== undefined ? `${prefix}${route.path}` : `/${pluginName}${route.path}`;\n\n return {\n ...route,\n path,\n };\n};\n\nmodule.exports = ({ strapi }) => ({\n getActions({ defaultEnable = false } = {}) {\n const actionMap = {};\n\n const isContentApi = (action) => {\n if (!_.has(action, Symbol.for('__type__'))) {\n return false;\n }\n\n return action[Symbol.for('__type__')].includes('content-api');\n };\n\n _.forEach(strapi.apis, (api, apiName) => {\n const controllers = _.reduce(\n api.controllers,\n (acc, controller, controllerName) => {\n const contentApiActions = _.pickBy(controller, isContentApi);\n\n if (_.isEmpty(contentApiActions)) {\n return acc;\n }\n\n acc[controllerName] = _.mapValues(contentApiActions, () => {\n return {\n enabled: defaultEnable,\n policy: '',\n };\n });\n\n return acc;\n },\n {}\n );\n\n if (!_.isEmpty(controllers)) {\n actionMap[`api::${apiName}`] = { controllers };\n }\n });\n\n _.forEach(strapi.plugins, (plugin, pluginName) => {\n const controllers = _.reduce(\n plugin.controllers,\n (acc, controller, controllerName) => {\n const contentApiActions = _.pickBy(controller, isContentApi);\n\n if (_.isEmpty(contentApiActions)) {\n return acc;\n }\n\n acc[controllerName] = _.mapValues(contentApiActions, () => {\n return {\n enabled: defaultEnable,\n policy: '',\n };\n });\n\n return acc;\n },\n {}\n );\n\n if (!_.isEmpty(controllers)) {\n actionMap[`plugin::${pluginName}`] = { controllers };\n }\n });\n\n // Return a deeply cloned version to avoid circular references\n return _.cloneDeep(actionMap);\n },\n\n async getRoutes() {\n const routesMap = {};\n\n _.forEach(strapi.apis, (api, apiName) => {\n const routes = _.flatMap(api.routes, (route) => {\n if (_.has(route, 'routes')) {\n return route.routes;\n }\n\n return route;\n }).filter((route) => route.info.type === 'content-api');\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`api::${apiName}`] = routes.map((route) => ({\n ...route,\n path: urlJoin(apiPrefix, route.path),\n }));\n });\n\n _.forEach(strapi.plugins, (plugin, pluginName) => {\n const transformPrefix = transformRoutePrefixFor(pluginName);\n\n const routes = _.flatMap(plugin.routes, (route) => {\n if (_.has(route, 'routes')) {\n return route.routes.map(transformPrefix);\n }\n\n return transformPrefix(route);\n }).filter((route) => route.info.type === 'content-api');\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`plugin::${pluginName}`] = routes.map((route) => ({\n ...route,\n path: urlJoin(apiPrefix, route.path),\n }));\n });\n\n return sanitizeRoutesMapForSerialization(routesMap);\n },\n\n async syncPermissions() {\n const roles = await strapi.db.query('plugin::users-permissions.role').findMany();\n const dbPermissions = await strapi.db.query('plugin::users-permissions.permission').findMany();\n\n const permissionsFoundInDB = _.uniq(_.map(dbPermissions, 'action'));\n\n const appActions = _.flatMap(strapi.apis, (api, apiName) => {\n return _.flatMap(api.controllers, (controller, controllerName) => {\n return _.keys(controller).map((actionName) => {\n return `api::${apiName}.${controllerName}.${actionName}`;\n });\n });\n });\n\n const pluginsActions = _.flatMap(strapi.plugins, (plugin, pluginName) => {\n return _.flatMap(plugin.controllers, (controller, controllerName) => {\n return _.keys(controller).map((actionName) => {\n return `plugin::${pluginName}.${controllerName}.${actionName}`;\n });\n });\n });\n\n const allActions = [...appActions, ...pluginsActions];\n\n const toDelete = _.difference(permissionsFoundInDB, allActions);\n\n await Promise.all(\n toDelete.map((action) => {\n return strapi.db\n .query('plugin::users-permissions.permission')\n .delete({ where: { action } });\n })\n );\n\n if (permissionsFoundInDB.length === 0) {\n // create default permissions\n for (const role of roles) {\n const toCreate = pipe(\n filter(({ roleType }) => roleType === role.type || roleType === null),\n map(prop('action'))\n )(DEFAULT_PERMISSIONS);\n\n await Promise.all(\n toCreate.map((action) => {\n return strapi.db.query('plugin::users-permissions.permission').create({\n data: {\n action,\n role: role.id,\n },\n });\n })\n );\n }\n }\n },\n\n async initialize() {\n const roleCount = await strapi.db.query('plugin::users-permissions.role').count();\n\n if (roleCount === 0) {\n await strapi.db.query('plugin::users-permissions.role').create({\n data: {\n name: 'Authenticated',\n description: 'Default role given to authenticated user.',\n type: 'authenticated',\n },\n });\n\n await strapi.db.query('plugin::users-permissions.role').create({\n data: {\n name: 'Public',\n description: 'Default role given to unauthenticated user.',\n type: 'public',\n },\n });\n }\n\n return getService('users-permissions').syncPermissions();\n },\n\n async updateUserRole(user, role) {\n return strapi.db\n .query('plugin::users-permissions.user')\n .update({ where: { id: user.id }, data: { role } });\n },\n\n template(layout, data) {\n const allowedTemplateVariables = objects.keysDeep(data);\n\n // Create a strict interpolation RegExp based on possible variable names\n const interpolate = createStrictInterpolationRegExp(allowedTemplateVariables, 'g');\n\n try {\n return _.template(layout, { interpolate, evaluate: false, escape: false })(data);\n } catch {\n throw new errors.ApplicationError('Invalid email template');\n }\n },\n});\n"],"names":["_","require$$0","filter","map","pipe","prop","require$$1","urlJoin","require$$2","template","createStrictInterpolationRegExp","errors","objects","sanitizeRoutesMapForSerialization","require$$3","getService","require$$4","DEFAULT_PERMISSIONS","action","roleType","transformRoutePrefixFor","pluginName","route","prefix","config","path","undefined","usersPermissions","strapi","getActions","defaultEnable","actionMap","isContentApi","has","Symbol","for","includes","forEach","apis","api","apiName","controllers","reduce","acc","controller","controllerName","contentApiActions","pickBy","isEmpty","mapValues","enabled","policy","plugins","plugin","cloneDeep","getRoutes","routesMap","routes","flatMap","info","type","length","apiPrefix","get","transformPrefix","syncPermissions","roles","db","query","findMany","dbPermissions","permissionsFoundInDB","uniq","appActions","keys","actionName","pluginsActions","allActions","toDelete","difference","Promise","all","delete","where","role","toCreate","create","data","id","initialize","roleCount","count","name","description","updateUserRole","user","update","layout","allowedTemplateVariables","keysDeep","interpolate","evaluate","escape","ApplicationError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"users-permissions.js","sources":["../../../server/src/services/users-permissions.js"],"sourcesContent":["'use strict';\n\nconst _ = require('lodash');\nconst { filter, map, pipe, prop } = require('lodash/fp');\nconst urlJoin = require('url-join');\nconst {\n template: { createStrictInterpolationRegExp },\n errors,\n objects,\n sanitizeRoutesMapForSerialization,\n} = require('@strapi/utils');\n\nconst { getService } = require('../utils');\n\nconst DEFAULT_PERMISSIONS = [\n { action: 'plugin::users-permissions.auth.callback', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.connect', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.forgotPassword', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.resetPassword', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.register', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.emailConfirmation', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.sendEmailConfirmation', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.refresh', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.logout', roleType: 'authenticated' },\n { action: 'plugin::users-permissions.auth.getSessions', roleType: 'authenticated' },\n { action: 'plugin::users-permissions.auth.revokeSession', roleType: 'authenticated' },\n { action: 'plugin::users-permissions.user.me', roleType: 'authenticated' },\n { action: 'plugin::users-permissions.auth.changePassword', roleType: 'authenticated' },\n];\n\nconst transformRoutePrefixFor = (pluginName) => (route) => {\n const prefix = route.config && route.config.prefix;\n const path = prefix !== undefined ? `${prefix}${route.path}` : `/${pluginName}${route.path}`;\n\n return {\n ...route,\n path,\n };\n};\n\nmodule.exports = ({ strapi }) => ({\n getActions({ defaultEnable = false } = {}) {\n const actionMap = {};\n\n const isContentApi = (action) => {\n if (!_.has(action, Symbol.for('__type__'))) {\n return false;\n }\n\n return action[Symbol.for('__type__')].includes('content-api');\n };\n\n for (const [apiName, api] of Object.entries(strapi.apis)) {\n const controllers = _.reduce(\n api.controllers,\n (acc, controller, controllerName) => {\n const contentApiActions = _.pickBy(controller, isContentApi);\n\n if (_.isEmpty(contentApiActions)) {\n return acc;\n }\n\n acc[controllerName] = _.mapValues(contentApiActions, () => {\n return {\n enabled: defaultEnable,\n policy: '',\n };\n });\n\n return acc;\n },\n {}\n );\n\n if (!_.isEmpty(controllers)) {\n actionMap[`api::${apiName}`] = { controllers };\n }\n }\n\n for (const [pluginName, plugin] of Object.entries(strapi.plugins)) {\n const controllers = _.reduce(\n plugin.controllers,\n (acc, controller, controllerName) => {\n const contentApiActions = _.pickBy(controller, isContentApi);\n\n if (_.isEmpty(contentApiActions)) {\n return acc;\n }\n\n acc[controllerName] = _.mapValues(contentApiActions, () => {\n return {\n enabled: defaultEnable,\n policy: '',\n };\n });\n\n return acc;\n },\n {}\n );\n\n if (!_.isEmpty(controllers)) {\n actionMap[`plugin::${pluginName}`] = { controllers };\n }\n }\n\n // Return a deeply cloned version to avoid circular references\n return _.cloneDeep(actionMap);\n },\n\n async getRoutes() {\n const routesMap = {};\n\n for (const [apiName, api] of Object.entries(strapi.apis)) {\n const routes = _.flatMap(api.routes, (route) => {\n if (_.has(route, 'routes')) {\n return route.routes;\n }\n\n return route;\n }).filter((route) => route.info.type === 'content-api');\n\n if (routes.length === 0) {\n continue;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`api::${apiName}`] = routes.map((route) => ({\n ...route,\n path: urlJoin(apiPrefix, route.path),\n }));\n }\n\n for (const [pluginName, plugin] of Object.entries(strapi.plugins)) {\n const transformPrefix = transformRoutePrefixFor(pluginName);\n\n const routes = _.flatMap(plugin.routes, (route) => {\n if (_.has(route, 'routes')) {\n return route.routes.map(transformPrefix);\n }\n\n return transformPrefix(route);\n }).filter((route) => route.info.type === 'content-api');\n\n if (routes.length === 0) {\n continue;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`plugin::${pluginName}`] = routes.map((route) => ({\n ...route,\n path: urlJoin(apiPrefix, route.path),\n }));\n }\n\n return sanitizeRoutesMapForSerialization(routesMap);\n },\n\n async syncPermissions() {\n const roles = await strapi.db.query('plugin::users-permissions.role').findMany();\n const dbPermissions = await strapi.db.query('plugin::users-permissions.permission').findMany();\n\n const permissionsFoundInDB = _.uniq(_.map(dbPermissions, 'action'));\n\n const appActions = _.flatMap(strapi.apis, (api, apiName) => {\n return _.flatMap(api.controllers, (controller, controllerName) => {\n return _.keys(controller).map((actionName) => {\n return `api::${apiName}.${controllerName}.${actionName}`;\n });\n });\n });\n\n const pluginsActions = _.flatMap(strapi.plugins, (plugin, pluginName) => {\n return _.flatMap(plugin.controllers, (controller, controllerName) => {\n return _.keys(controller).map((actionName) => {\n return `plugin::${pluginName}.${controllerName}.${actionName}`;\n });\n });\n });\n\n const allActions = [...appActions, ...pluginsActions];\n\n const toDelete = _.difference(permissionsFoundInDB, allActions);\n\n await Promise.all(\n toDelete.map((action) => {\n return strapi.db\n .query('plugin::users-permissions.permission')\n .delete({ where: { action } });\n })\n );\n\n if (permissionsFoundInDB.length === 0) {\n // create default permissions\n for (const role of roles) {\n const toCreate = pipe(\n filter(({ roleType }) => roleType === role.type || roleType === null),\n map(prop('action'))\n )(DEFAULT_PERMISSIONS);\n\n await Promise.all(\n toCreate.map((action) => {\n return strapi.db.query('plugin::users-permissions.permission').create({\n data: {\n action,\n role: role.id,\n },\n });\n })\n );\n }\n }\n },\n\n async initialize() {\n const roleCount = await strapi.db.query('plugin::users-permissions.role').count();\n\n if (roleCount === 0) {\n await strapi.db.query('plugin::users-permissions.role').create({\n data: {\n name: 'Authenticated',\n description: 'Default role given to authenticated user.',\n type: 'authenticated',\n },\n });\n\n await strapi.db.query('plugin::users-permissions.role').create({\n data: {\n name: 'Public',\n description: 'Default role given to unauthenticated user.',\n type: 'public',\n },\n });\n }\n\n return getService('users-permissions').syncPermissions();\n },\n\n async updateUserRole(user, role) {\n return strapi.db\n .query('plugin::users-permissions.user')\n .update({ where: { id: user.id }, data: { role } });\n },\n\n template(layout, data) {\n const allowedTemplateVariables = objects.keysDeep(data);\n\n // Create a strict interpolation RegExp based on possible variable names\n const interpolate = createStrictInterpolationRegExp(allowedTemplateVariables, 'g');\n\n try {\n return _.template(layout, { interpolate, evaluate: false, escape: false })(data);\n } catch {\n throw new errors.ApplicationError('Invalid email template');\n }\n },\n});\n"],"names":["_","require$$0","filter","map","pipe","prop","require$$1","urlJoin","require$$2","template","createStrictInterpolationRegExp","errors","objects","sanitizeRoutesMapForSerialization","require$$3","getService","require$$4","DEFAULT_PERMISSIONS","action","roleType","transformRoutePrefixFor","pluginName","route","prefix","config","path","undefined","usersPermissions","strapi","getActions","defaultEnable","actionMap","isContentApi","has","Symbol","for","includes","apiName","api","Object","entries","apis","controllers","reduce","acc","controller","controllerName","contentApiActions","pickBy","isEmpty","mapValues","enabled","policy","plugin","plugins","cloneDeep","getRoutes","routesMap","routes","flatMap","info","type","length","apiPrefix","get","transformPrefix","syncPermissions","roles","db","query","findMany","dbPermissions","permissionsFoundInDB","uniq","appActions","keys","actionName","pluginsActions","allActions","toDelete","difference","Promise","all","delete","where","role","toCreate","create","data","id","initialize","roleCount","count","name","description","updateUserRole","user","update","layout","allowedTemplateVariables","keysDeep","interpolate","evaluate","escape","ApplicationError"],"mappings":";;;;;;;;;;;;;;;;;;;;AAEA,IAAA,MAAMA,CAAAA,GAAIC,6BAAAA;IACV,MAAM,EAAEC,MAAM,EAAEC,GAAG,EAAEC,IAAI,EAAEC,IAAI,EAAE,GAAGC,2BAAAA;AACpC,IAAA,MAAMC,OAAAA,GAAUC,2BAAAA;AAChB,IAAA,MAAM,EACJC,QAAAA,EAAU,EAAEC,+BAA+B,EAAE,EAC7CC,MAAM,EACNC,OAAO,EACPC,iCAAiC,EAClC,GAAGC,2BAAAA;IAEJ,MAAM,EAAEC,UAAU,EAAE,GAAGC,eAAAA,EAAAA;AAEvB,IAAA,MAAMC,mBAAAA,GAAsB;AAC1B,QAAA;YAAEC,MAAAA,EAAQ,yCAAA;YAA2CC,QAAAA,EAAU;AAAQ,SAAA;AACvE,QAAA;YAAED,MAAAA,EAAQ,wCAAA;YAA0CC,QAAAA,EAAU;AAAQ,SAAA;AACtE,QAAA;YAAED,MAAAA,EAAQ,+CAAA;YAAiDC,QAAAA,EAAU;AAAQ,SAAA;AAC7E,QAAA;YAAED,MAAAA,EAAQ,8CAAA;YAAgDC,QAAAA,EAAU;AAAQ,SAAA;AAC5E,QAAA;YAAED,MAAAA,EAAQ,yCAAA;YAA2CC,QAAAA,EAAU;AAAQ,SAAA;AACvE,QAAA;YAAED,MAAAA,EAAQ,kDAAA;YAAoDC,QAAAA,EAAU;AAAQ,SAAA;AAChF,QAAA;YAAED,MAAAA,EAAQ,sDAAA;YAAwDC,QAAAA,EAAU;AAAQ,SAAA;AACpF,QAAA;YAAED,MAAAA,EAAQ,wCAAA;YAA0CC,QAAAA,EAAU;AAAQ,SAAA;AACtE,QAAA;YAAED,MAAAA,EAAQ,uCAAA;YAAyCC,QAAAA,EAAU;AAAe,SAAA;AAC5E,QAAA;YAAED,MAAAA,EAAQ,4CAAA;YAA8CC,QAAAA,EAAU;AAAe,SAAA;AACjF,QAAA;YAAED,MAAAA,EAAQ,8CAAA;YAAgDC,QAAAA,EAAU;AAAe,SAAA;AACnF,QAAA;YAAED,MAAAA,EAAQ,mCAAA;YAAqCC,QAAAA,EAAU;AAAe,SAAA;AACxE,QAAA;YAAED,MAAAA,EAAQ,+CAAA;YAAiDC,QAAAA,EAAU;AAAe;AACrF,KAAA;IAED,MAAMC,uBAAAA,GAA0B,CAACC,UAAAA,GAAe,CAACC,KAAAA,GAAAA;AAC/C,YAAA,MAAMC,SAASD,KAAAA,CAAME,MAAM,IAAIF,KAAAA,CAAME,MAAM,CAACD,MAAM;AAClD,YAAA,MAAME,IAAAA,GAAOF,MAAAA,KAAWG,SAAAA,GAAY,CAAA,EAAGH,SAASD,KAAAA,CAAMG,IAAI,CAAA,CAAE,GAAG,CAAC,CAAC,EAAEJ,UAAAA,CAAAA,EAAaC,KAAAA,CAAMG,IAAI,CAAA,CAAE;YAE5F,OAAO;AACL,gBAAA,GAAGH,KAAK;AACRG,gBAAAA;AACJ,aAAA;AACA,QAAA,CAAA;AAEAE,IAAAA,gBAAAA,GAAiB,CAAC,EAAEC,MAAM,EAAE,IAAM;AAChCC,YAAAA,UAAAA,CAAAA,CAAW,EAAEC,aAAAA,GAAgB,KAAK,EAAE,GAAG,EAAE,EAAA;AACvC,gBAAA,MAAMC,YAAY,EAAA;AAElB,gBAAA,MAAMC,eAAe,CAACd,MAAAA,GAAAA;oBACpB,IAAI,CAAClB,EAAEiC,GAAG,CAACf,QAAQgB,MAAAA,CAAOC,GAAG,CAAC,UAAA,CAAA,CAAA,EAAc;wBAC1C,OAAO,KAAA;AACf,oBAAA;oBAEM,OAAOjB,MAAM,CAACgB,MAAAA,CAAOC,GAAG,CAAC,UAAA,CAAA,CAAY,CAACC,QAAQ,CAAC,aAAA,CAAA;AACrD,gBAAA,CAAA;gBAEI,KAAK,MAAM,CAACC,OAAAA,EAASC,GAAAA,CAAI,IAAIC,OAAOC,OAAO,CAACZ,MAAAA,CAAOa,IAAI,CAAA,CAAG;oBACxD,MAAMC,WAAAA,GAAc1C,EAAE2C,MAAM,CAC1BL,IAAII,WAAW,EACf,CAACE,GAAAA,EAAKC,UAAAA,EAAYC,cAAAA,GAAAA;AAChB,wBAAA,MAAMC,iBAAAA,GAAoB/C,CAAAA,CAAEgD,MAAM,CAACH,UAAAA,EAAYb,YAAAA,CAAAA;wBAE/C,IAAIhC,CAAAA,CAAEiD,OAAO,CAACF,iBAAAA,CAAAA,EAAoB;4BAChC,OAAOH,GAAAA;AACnB,wBAAA;AAEUA,wBAAAA,GAAG,CAACE,cAAAA,CAAe,GAAG9C,CAAAA,CAAEkD,SAAS,CAACH,iBAAAA,EAAmB,IAAA;4BACnD,OAAO;gCACLI,OAAAA,EAASrB,aAAAA;gCACTsB,MAAAA,EAAQ;AACtB,6BAAA;AACA,wBAAA,CAAA,CAAA;wBAEU,OAAOR,GAAAA;AACjB,oBAAA,CAAA,EACQ,EAAA,CAAA;AAGF,oBAAA,IAAI,CAAC5C,CAAAA,CAAEiD,OAAO,CAACP,WAAAA,CAAAA,EAAc;AAC3BX,wBAAAA,SAAS,CAAC,CAAC,KAAK,EAAEM,OAAAA,CAAAA,CAAS,CAAC,GAAG;AAAEK,4BAAAA;AAAW,yBAAA;AACpD,oBAAA;AACA,gBAAA;gBAEI,KAAK,MAAM,CAACrB,UAAAA,EAAYgC,MAAAA,CAAO,IAAId,OAAOC,OAAO,CAACZ,MAAAA,CAAO0B,OAAO,CAAA,CAAG;oBACjE,MAAMZ,WAAAA,GAAc1C,EAAE2C,MAAM,CAC1BU,OAAOX,WAAW,EAClB,CAACE,GAAAA,EAAKC,UAAAA,EAAYC,cAAAA,GAAAA;AAChB,wBAAA,MAAMC,iBAAAA,GAAoB/C,CAAAA,CAAEgD,MAAM,CAACH,UAAAA,EAAYb,YAAAA,CAAAA;wBAE/C,IAAIhC,CAAAA,CAAEiD,OAAO,CAACF,iBAAAA,CAAAA,EAAoB;4BAChC,OAAOH,GAAAA;AACnB,wBAAA;AAEUA,wBAAAA,GAAG,CAACE,cAAAA,CAAe,GAAG9C,CAAAA,CAAEkD,SAAS,CAACH,iBAAAA,EAAmB,IAAA;4BACnD,OAAO;gCACLI,OAAAA,EAASrB,aAAAA;gCACTsB,MAAAA,EAAQ;AACtB,6BAAA;AACA,wBAAA,CAAA,CAAA;wBAEU,OAAOR,GAAAA;AACjB,oBAAA,CAAA,EACQ,EAAA,CAAA;AAGF,oBAAA,IAAI,CAAC5C,CAAAA,CAAEiD,OAAO,CAACP,WAAAA,CAAAA,EAAc;AAC3BX,wBAAAA,SAAS,CAAC,CAAC,QAAQ,EAAEV,UAAAA,CAAAA,CAAY,CAAC,GAAG;AAAEqB,4BAAAA;AAAW,yBAAA;AAC1D,oBAAA;AACA,gBAAA;;gBAGI,OAAO1C,CAAAA,CAAEuD,SAAS,CAACxB,SAAAA,CAAAA;AACvB,YAAA,CAAA;YAEE,MAAMyB,SAAAA,CAAAA,GAAAA;AACJ,gBAAA,MAAMC,YAAY,EAAA;gBAElB,KAAK,MAAM,CAACpB,OAAAA,EAASC,GAAAA,CAAI,IAAIC,OAAOC,OAAO,CAACZ,MAAAA,CAAOa,IAAI,CAAA,CAAG;AACxD,oBAAA,MAAMiB,SAAS1D,CAAAA,CAAE2D,OAAO,CAACrB,GAAAA,CAAIoB,MAAM,EAAE,CAACpC,KAAAA,GAAAA;AACpC,wBAAA,IAAItB,CAAAA,CAAEiC,GAAG,CAACX,KAAAA,EAAO,QAAA,CAAA,EAAW;AAC1B,4BAAA,OAAOA,MAAMoC,MAAM;AAC7B,wBAAA;wBAEQ,OAAOpC,KAAAA;oBACf,CAAA,CAAA,CAASpB,MAAM,CAAC,CAACoB,KAAAA,GAAUA,MAAMsC,IAAI,CAACC,IAAI,KAAK,aAAA,CAAA;oBAEzC,IAAIH,MAAAA,CAAOI,MAAM,KAAK,CAAA,EAAG;AACvB,wBAAA;AACR,oBAAA;AAEM,oBAAA,MAAMC,SAAAA,GAAYnC,MAAAA,CAAOJ,MAAM,CAACwC,GAAG,CAAC,iBAAA,CAAA;AACpCP,oBAAAA,SAAS,CAAC,CAAC,KAAK,EAAEpB,OAAAA,CAAAA,CAAS,CAAC,GAAGqB,MAAAA,CAAOvD,GAAG,CAAC,CAACmB,KAAAA,IAAW;AACpD,4BAAA,GAAGA,KAAK;4BACRG,IAAAA,EAAMlB,OAAAA,CAAQwD,SAAAA,EAAWzC,KAAAA,CAAMG,IAAI;yBAC3C,CAAA,CAAA;AACA,gBAAA;gBAEI,KAAK,MAAM,CAACJ,UAAAA,EAAYgC,MAAAA,CAAO,IAAId,OAAOC,OAAO,CAACZ,MAAAA,CAAO0B,OAAO,CAAA,CAAG;AACjE,oBAAA,MAAMW,kBAAkB7C,uBAAAA,CAAwBC,UAAAA,CAAAA;AAEhD,oBAAA,MAAMqC,SAAS1D,CAAAA,CAAE2D,OAAO,CAACN,MAAAA,CAAOK,MAAM,EAAE,CAACpC,KAAAA,GAAAA;AACvC,wBAAA,IAAItB,CAAAA,CAAEiC,GAAG,CAACX,KAAAA,EAAO,QAAA,CAAA,EAAW;AAC1B,4BAAA,OAAOA,KAAAA,CAAMoC,MAAM,CAACvD,GAAG,CAAC8D,eAAAA,CAAAA;AAClC,wBAAA;AAEQ,wBAAA,OAAOA,eAAAA,CAAgB3C,KAAAA,CAAAA;oBAC/B,CAAA,CAAA,CAASpB,MAAM,CAAC,CAACoB,KAAAA,GAAUA,MAAMsC,IAAI,CAACC,IAAI,KAAK,aAAA,CAAA;oBAEzC,IAAIH,MAAAA,CAAOI,MAAM,KAAK,CAAA,EAAG;AACvB,wBAAA;AACR,oBAAA;AAEM,oBAAA,MAAMC,SAAAA,GAAYnC,MAAAA,CAAOJ,MAAM,CAACwC,GAAG,CAAC,iBAAA,CAAA;AACpCP,oBAAAA,SAAS,CAAC,CAAC,QAAQ,EAAEpC,UAAAA,CAAAA,CAAY,CAAC,GAAGqC,MAAAA,CAAOvD,GAAG,CAAC,CAACmB,KAAAA,IAAW;AAC1D,4BAAA,GAAGA,KAAK;4BACRG,IAAAA,EAAMlB,OAAAA,CAAQwD,SAAAA,EAAWzC,KAAAA,CAAMG,IAAI;yBAC3C,CAAA,CAAA;AACA,gBAAA;AAEI,gBAAA,OAAOZ,iCAAAA,CAAkC4C,SAAAA,CAAAA;AAC7C,YAAA,CAAA;YAEE,MAAMS,eAAAA,CAAAA,GAAAA;gBACJ,MAAMC,KAAAA,GAAQ,MAAMvC,MAAAA,CAAOwC,EAAE,CAACC,KAAK,CAAC,kCAAkCC,QAAQ,EAAA;gBAC9E,MAAMC,aAAAA,GAAgB,MAAM3C,MAAAA,CAAOwC,EAAE,CAACC,KAAK,CAAC,wCAAwCC,QAAQ,EAAA;AAE5F,gBAAA,MAAME,uBAAuBxE,CAAAA,CAAEyE,IAAI,CAACzE,CAAAA,CAAEG,GAAG,CAACoE,aAAAA,EAAe,QAAA,CAAA,CAAA;gBAEzD,MAAMG,UAAAA,GAAa1E,EAAE2D,OAAO,CAAC/B,OAAOa,IAAI,EAAE,CAACH,GAAAA,EAAKD,OAAAA,GAAAA;AAC9C,oBAAA,OAAOrC,EAAE2D,OAAO,CAACrB,IAAII,WAAW,EAAE,CAACG,UAAAA,EAAYC,cAAAA,GAAAA;AAC7C,wBAAA,OAAO9C,EAAE2E,IAAI,CAAC9B,UAAAA,CAAAA,CAAY1C,GAAG,CAAC,CAACyE,UAAAA,GAAAA;4BAC7B,OAAO,CAAC,KAAK,EAAEvC,OAAAA,CAAQ,CAAC,EAAES,cAAAA,CAAe,CAAC,EAAE8B,UAAAA,CAAAA,CAAY;AAClE,wBAAA,CAAA,CAAA;AACA,oBAAA,CAAA,CAAA;AACA,gBAAA,CAAA,CAAA;gBAEI,MAAMC,cAAAA,GAAiB7E,EAAE2D,OAAO,CAAC/B,OAAO0B,OAAO,EAAE,CAACD,MAAAA,EAAQhC,UAAAA,GAAAA;AACxD,oBAAA,OAAOrB,EAAE2D,OAAO,CAACN,OAAOX,WAAW,EAAE,CAACG,UAAAA,EAAYC,cAAAA,GAAAA;AAChD,wBAAA,OAAO9C,EAAE2E,IAAI,CAAC9B,UAAAA,CAAAA,CAAY1C,GAAG,CAAC,CAACyE,UAAAA,GAAAA;4BAC7B,OAAO,CAAC,QAAQ,EAAEvD,UAAAA,CAAW,CAAC,EAAEyB,cAAAA,CAAe,CAAC,EAAE8B,UAAAA,CAAAA,CAAY;AACxE,wBAAA,CAAA,CAAA;AACA,oBAAA,CAAA,CAAA;AACA,gBAAA,CAAA,CAAA;AAEI,gBAAA,MAAME,UAAAA,GAAa;AAAIJ,oBAAAA,GAAAA,UAAAA;AAAeG,oBAAAA,GAAAA;AAAe,iBAAA;AAErD,gBAAA,MAAME,QAAAA,GAAW/E,CAAAA,CAAEgF,UAAU,CAACR,oBAAAA,EAAsBM,UAAAA,CAAAA;AAEpD,gBAAA,MAAMG,QAAQC,GAAG,CACfH,QAAAA,CAAS5E,GAAG,CAAC,CAACe,MAAAA,GAAAA;AACZ,oBAAA,OAAOU,OAAOwC,EAAA,CACXC,KAAK,CAAC,sCAAA,CAAA,CACNc,MAAM,CAAC;wBAAEC,KAAAA,EAAO;AAAElE,4BAAAA;AAAM;AAAE,qBAAA,CAAA;AACrC,gBAAA,CAAA,CAAA,CAAA;gBAGI,IAAIsD,oBAAAA,CAAqBV,MAAM,KAAK,CAAA,EAAG;;oBAErC,KAAK,MAAMuB,QAAQlB,KAAAA,CAAO;AACxB,wBAAA,MAAMmB,WAAWlF,IAAAA,CACfF,MAAAA,CAAO,CAAC,EAAEiB,QAAQ,EAAE,GAAKA,QAAAA,KAAakE,IAAAA,CAAKxB,IAAI,IAAI1C,QAAAA,KAAa,IAAA,CAAA,EAChEhB,GAAAA,CAAIE,KAAK,QAAA,CAAA,CAAA,CAAA,CACTY,mBAAAA,CAAAA;AAEF,wBAAA,MAAMgE,QAAQC,GAAG,CACfI,QAAAA,CAASnF,GAAG,CAAC,CAACe,MAAAA,GAAAA;AACZ,4BAAA,OAAOU,OAAOwC,EAAE,CAACC,KAAK,CAAC,sCAAA,CAAA,CAAwCkB,MAAM,CAAC;gCACpEC,IAAAA,EAAM;AACJtE,oCAAAA,MAAAA;AACAmE,oCAAAA,IAAAA,EAAMA,KAAKI;AAC3B;AACA,6BAAA,CAAA;AACA,wBAAA,CAAA,CAAA,CAAA;AAEA,oBAAA;AACA,gBAAA;AACA,YAAA,CAAA;YAEE,MAAMC,UAAAA,CAAAA,GAAAA;gBACJ,MAAMC,SAAAA,GAAY,MAAM/D,MAAAA,CAAOwC,EAAE,CAACC,KAAK,CAAC,kCAAkCuB,KAAK,EAAA;AAE/E,gBAAA,IAAID,cAAc,CAAA,EAAG;AACnB,oBAAA,MAAM/D,OAAOwC,EAAE,CAACC,KAAK,CAAC,gCAAA,CAAA,CAAkCkB,MAAM,CAAC;wBAC7DC,IAAAA,EAAM;4BACJK,IAAAA,EAAM,eAAA;4BACNC,WAAAA,EAAa,2CAAA;4BACbjC,IAAAA,EAAM;AAChB;AACA,qBAAA,CAAA;AAEM,oBAAA,MAAMjC,OAAOwC,EAAE,CAACC,KAAK,CAAC,gCAAA,CAAA,CAAkCkB,MAAM,CAAC;wBAC7DC,IAAAA,EAAM;4BACJK,IAAAA,EAAM,QAAA;4BACNC,WAAAA,EAAa,6CAAA;4BACbjC,IAAAA,EAAM;AAChB;AACA,qBAAA,CAAA;AACA,gBAAA;gBAEI,OAAO9C,UAAAA,CAAW,qBAAqBmD,eAAe,EAAA;AAC1D,YAAA,CAAA;YAEE,MAAM6B,cAAAA,CAAAA,CAAeC,IAAI,EAAEX,IAAI,EAAA;AAC7B,gBAAA,OAAOzD,OAAOwC,EAAA,CACXC,KAAK,CAAC,gCAAA,CAAA,CACN4B,MAAM,CAAC;oBAAEb,KAAAA,EAAO;AAAEK,wBAAAA,EAAAA,EAAIO,KAAKP;AAAE,qBAAA;oBAAID,IAAAA,EAAM;AAAEH,wBAAAA;AAAI;;AACpD,YAAA,CAAA;YAEE5E,QAAAA,CAAAA,CAASyF,MAAM,EAAEV,IAAI,EAAA;gBACnB,MAAMW,wBAAAA,GAA2BvF,OAAAA,CAAQwF,QAAQ,CAACZ,IAAAA,CAAAA;;gBAGlD,MAAMa,WAAAA,GAAc3F,gCAAgCyF,wBAAAA,EAA0B,GAAA,CAAA;gBAE9E,IAAI;oBACF,OAAOnG,CAAAA,CAAES,QAAQ,CAACyF,MAAAA,EAAQ;AAAEG,wBAAAA,WAAAA;wBAAaC,QAAAA,EAAU,KAAA;wBAAOC,MAAAA,EAAQ;qBAAK,CAAA,CAAIf,IAAAA,CAAAA;AACjF,gBAAA,CAAA,CAAM,OAAM;oBACN,MAAM,IAAI7E,MAAAA,CAAO6F,gBAAgB,CAAC,wBAAA,CAAA;AACxC,gBAAA;AACA,YAAA;SACA,CAAA;;;;;;"}
|
|
@@ -85,7 +85,7 @@ function requireUsersPermissions() {
|
|
|
85
85
|
}
|
|
86
86
|
return action[Symbol.for('__type__')].includes('content-api');
|
|
87
87
|
};
|
|
88
|
-
|
|
88
|
+
for (const [apiName, api] of Object.entries(strapi.apis)){
|
|
89
89
|
const controllers = _.reduce(api.controllers, (acc, controller, controllerName)=>{
|
|
90
90
|
const contentApiActions = _.pickBy(controller, isContentApi);
|
|
91
91
|
if (_.isEmpty(contentApiActions)) {
|
|
@@ -104,8 +104,8 @@ function requireUsersPermissions() {
|
|
|
104
104
|
controllers
|
|
105
105
|
};
|
|
106
106
|
}
|
|
107
|
-
}
|
|
108
|
-
|
|
107
|
+
}
|
|
108
|
+
for (const [pluginName, plugin] of Object.entries(strapi.plugins)){
|
|
109
109
|
const controllers = _.reduce(plugin.controllers, (acc, controller, controllerName)=>{
|
|
110
110
|
const contentApiActions = _.pickBy(controller, isContentApi);
|
|
111
111
|
if (_.isEmpty(contentApiActions)) {
|
|
@@ -124,13 +124,13 @@ function requireUsersPermissions() {
|
|
|
124
124
|
controllers
|
|
125
125
|
};
|
|
126
126
|
}
|
|
127
|
-
}
|
|
127
|
+
}
|
|
128
128
|
// Return a deeply cloned version to avoid circular references
|
|
129
129
|
return _.cloneDeep(actionMap);
|
|
130
130
|
},
|
|
131
131
|
async getRoutes () {
|
|
132
132
|
const routesMap = {};
|
|
133
|
-
|
|
133
|
+
for (const [apiName, api] of Object.entries(strapi.apis)){
|
|
134
134
|
const routes = _.flatMap(api.routes, (route)=>{
|
|
135
135
|
if (_.has(route, 'routes')) {
|
|
136
136
|
return route.routes;
|
|
@@ -138,15 +138,15 @@ function requireUsersPermissions() {
|
|
|
138
138
|
return route;
|
|
139
139
|
}).filter((route)=>route.info.type === 'content-api');
|
|
140
140
|
if (routes.length === 0) {
|
|
141
|
-
|
|
141
|
+
continue;
|
|
142
142
|
}
|
|
143
143
|
const apiPrefix = strapi.config.get('api.rest.prefix');
|
|
144
144
|
routesMap[`api::${apiName}`] = routes.map((route)=>({
|
|
145
145
|
...route,
|
|
146
146
|
path: urlJoin(apiPrefix, route.path)
|
|
147
147
|
}));
|
|
148
|
-
}
|
|
149
|
-
|
|
148
|
+
}
|
|
149
|
+
for (const [pluginName, plugin] of Object.entries(strapi.plugins)){
|
|
150
150
|
const transformPrefix = transformRoutePrefixFor(pluginName);
|
|
151
151
|
const routes = _.flatMap(plugin.routes, (route)=>{
|
|
152
152
|
if (_.has(route, 'routes')) {
|
|
@@ -155,14 +155,14 @@ function requireUsersPermissions() {
|
|
|
155
155
|
return transformPrefix(route);
|
|
156
156
|
}).filter((route)=>route.info.type === 'content-api');
|
|
157
157
|
if (routes.length === 0) {
|
|
158
|
-
|
|
158
|
+
continue;
|
|
159
159
|
}
|
|
160
160
|
const apiPrefix = strapi.config.get('api.rest.prefix');
|
|
161
161
|
routesMap[`plugin::${pluginName}`] = routes.map((route)=>({
|
|
162
162
|
...route,
|
|
163
163
|
path: urlJoin(apiPrefix, route.path)
|
|
164
164
|
}));
|
|
165
|
-
}
|
|
165
|
+
}
|
|
166
166
|
return sanitizeRoutesMapForSerialization(routesMap);
|
|
167
167
|
},
|
|
168
168
|
async syncPermissions () {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users-permissions.mjs","sources":["../../../server/src/services/users-permissions.js"],"sourcesContent":["'use strict';\n\nconst _ = require('lodash');\nconst { filter, map, pipe, prop } = require('lodash/fp');\nconst urlJoin = require('url-join');\nconst {\n template: { createStrictInterpolationRegExp },\n errors,\n objects,\n sanitizeRoutesMapForSerialization,\n} = require('@strapi/utils');\n\nconst { getService } = require('../utils');\n\nconst DEFAULT_PERMISSIONS = [\n { action: 'plugin::users-permissions.auth.callback', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.connect', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.forgotPassword', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.resetPassword', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.register', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.emailConfirmation', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.sendEmailConfirmation', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.refresh', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.logout', roleType: 'authenticated' },\n { action: 'plugin::users-permissions.auth.getSessions', roleType: 'authenticated' },\n { action: 'plugin::users-permissions.auth.revokeSession', roleType: 'authenticated' },\n { action: 'plugin::users-permissions.user.me', roleType: 'authenticated' },\n { action: 'plugin::users-permissions.auth.changePassword', roleType: 'authenticated' },\n];\n\nconst transformRoutePrefixFor = (pluginName) => (route) => {\n const prefix = route.config && route.config.prefix;\n const path = prefix !== undefined ? `${prefix}${route.path}` : `/${pluginName}${route.path}`;\n\n return {\n ...route,\n path,\n };\n};\n\nmodule.exports = ({ strapi }) => ({\n getActions({ defaultEnable = false } = {}) {\n const actionMap = {};\n\n const isContentApi = (action) => {\n if (!_.has(action, Symbol.for('__type__'))) {\n return false;\n }\n\n return action[Symbol.for('__type__')].includes('content-api');\n };\n\n _.forEach(strapi.apis, (api, apiName) => {\n const controllers = _.reduce(\n api.controllers,\n (acc, controller, controllerName) => {\n const contentApiActions = _.pickBy(controller, isContentApi);\n\n if (_.isEmpty(contentApiActions)) {\n return acc;\n }\n\n acc[controllerName] = _.mapValues(contentApiActions, () => {\n return {\n enabled: defaultEnable,\n policy: '',\n };\n });\n\n return acc;\n },\n {}\n );\n\n if (!_.isEmpty(controllers)) {\n actionMap[`api::${apiName}`] = { controllers };\n }\n });\n\n _.forEach(strapi.plugins, (plugin, pluginName) => {\n const controllers = _.reduce(\n plugin.controllers,\n (acc, controller, controllerName) => {\n const contentApiActions = _.pickBy(controller, isContentApi);\n\n if (_.isEmpty(contentApiActions)) {\n return acc;\n }\n\n acc[controllerName] = _.mapValues(contentApiActions, () => {\n return {\n enabled: defaultEnable,\n policy: '',\n };\n });\n\n return acc;\n },\n {}\n );\n\n if (!_.isEmpty(controllers)) {\n actionMap[`plugin::${pluginName}`] = { controllers };\n }\n });\n\n // Return a deeply cloned version to avoid circular references\n return _.cloneDeep(actionMap);\n },\n\n async getRoutes() {\n const routesMap = {};\n\n _.forEach(strapi.apis, (api, apiName) => {\n const routes = _.flatMap(api.routes, (route) => {\n if (_.has(route, 'routes')) {\n return route.routes;\n }\n\n return route;\n }).filter((route) => route.info.type === 'content-api');\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`api::${apiName}`] = routes.map((route) => ({\n ...route,\n path: urlJoin(apiPrefix, route.path),\n }));\n });\n\n _.forEach(strapi.plugins, (plugin, pluginName) => {\n const transformPrefix = transformRoutePrefixFor(pluginName);\n\n const routes = _.flatMap(plugin.routes, (route) => {\n if (_.has(route, 'routes')) {\n return route.routes.map(transformPrefix);\n }\n\n return transformPrefix(route);\n }).filter((route) => route.info.type === 'content-api');\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`plugin::${pluginName}`] = routes.map((route) => ({\n ...route,\n path: urlJoin(apiPrefix, route.path),\n }));\n });\n\n return sanitizeRoutesMapForSerialization(routesMap);\n },\n\n async syncPermissions() {\n const roles = await strapi.db.query('plugin::users-permissions.role').findMany();\n const dbPermissions = await strapi.db.query('plugin::users-permissions.permission').findMany();\n\n const permissionsFoundInDB = _.uniq(_.map(dbPermissions, 'action'));\n\n const appActions = _.flatMap(strapi.apis, (api, apiName) => {\n return _.flatMap(api.controllers, (controller, controllerName) => {\n return _.keys(controller).map((actionName) => {\n return `api::${apiName}.${controllerName}.${actionName}`;\n });\n });\n });\n\n const pluginsActions = _.flatMap(strapi.plugins, (plugin, pluginName) => {\n return _.flatMap(plugin.controllers, (controller, controllerName) => {\n return _.keys(controller).map((actionName) => {\n return `plugin::${pluginName}.${controllerName}.${actionName}`;\n });\n });\n });\n\n const allActions = [...appActions, ...pluginsActions];\n\n const toDelete = _.difference(permissionsFoundInDB, allActions);\n\n await Promise.all(\n toDelete.map((action) => {\n return strapi.db\n .query('plugin::users-permissions.permission')\n .delete({ where: { action } });\n })\n );\n\n if (permissionsFoundInDB.length === 0) {\n // create default permissions\n for (const role of roles) {\n const toCreate = pipe(\n filter(({ roleType }) => roleType === role.type || roleType === null),\n map(prop('action'))\n )(DEFAULT_PERMISSIONS);\n\n await Promise.all(\n toCreate.map((action) => {\n return strapi.db.query('plugin::users-permissions.permission').create({\n data: {\n action,\n role: role.id,\n },\n });\n })\n );\n }\n }\n },\n\n async initialize() {\n const roleCount = await strapi.db.query('plugin::users-permissions.role').count();\n\n if (roleCount === 0) {\n await strapi.db.query('plugin::users-permissions.role').create({\n data: {\n name: 'Authenticated',\n description: 'Default role given to authenticated user.',\n type: 'authenticated',\n },\n });\n\n await strapi.db.query('plugin::users-permissions.role').create({\n data: {\n name: 'Public',\n description: 'Default role given to unauthenticated user.',\n type: 'public',\n },\n });\n }\n\n return getService('users-permissions').syncPermissions();\n },\n\n async updateUserRole(user, role) {\n return strapi.db\n .query('plugin::users-permissions.user')\n .update({ where: { id: user.id }, data: { role } });\n },\n\n template(layout, data) {\n const allowedTemplateVariables = objects.keysDeep(data);\n\n // Create a strict interpolation RegExp based on possible variable names\n const interpolate = createStrictInterpolationRegExp(allowedTemplateVariables, 'g');\n\n try {\n return _.template(layout, { interpolate, evaluate: false, escape: false })(data);\n } catch {\n throw new errors.ApplicationError('Invalid email template');\n }\n },\n});\n"],"names":["_","require$$0","filter","map","pipe","prop","require$$1","urlJoin","require$$2","template","createStrictInterpolationRegExp","errors","objects","sanitizeRoutesMapForSerialization","require$$3","getService","require$$4","DEFAULT_PERMISSIONS","action","roleType","transformRoutePrefixFor","pluginName","route","prefix","config","path","undefined","usersPermissions","strapi","getActions","defaultEnable","actionMap","isContentApi","has","Symbol","for","includes","forEach","apis","api","apiName","controllers","reduce","acc","controller","controllerName","contentApiActions","pickBy","isEmpty","mapValues","enabled","policy","plugins","plugin","cloneDeep","getRoutes","routesMap","routes","flatMap","info","type","length","apiPrefix","get","transformPrefix","syncPermissions","roles","db","query","findMany","dbPermissions","permissionsFoundInDB","uniq","appActions","keys","actionName","pluginsActions","allActions","toDelete","difference","Promise","all","delete","where","role","toCreate","create","data","id","initialize","roleCount","count","name","description","updateUserRole","user","update","layout","allowedTemplateVariables","keysDeep","interpolate","evaluate","escape","ApplicationError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"users-permissions.mjs","sources":["../../../server/src/services/users-permissions.js"],"sourcesContent":["'use strict';\n\nconst _ = require('lodash');\nconst { filter, map, pipe, prop } = require('lodash/fp');\nconst urlJoin = require('url-join');\nconst {\n template: { createStrictInterpolationRegExp },\n errors,\n objects,\n sanitizeRoutesMapForSerialization,\n} = require('@strapi/utils');\n\nconst { getService } = require('../utils');\n\nconst DEFAULT_PERMISSIONS = [\n { action: 'plugin::users-permissions.auth.callback', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.connect', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.forgotPassword', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.resetPassword', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.register', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.emailConfirmation', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.sendEmailConfirmation', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.refresh', roleType: 'public' },\n { action: 'plugin::users-permissions.auth.logout', roleType: 'authenticated' },\n { action: 'plugin::users-permissions.auth.getSessions', roleType: 'authenticated' },\n { action: 'plugin::users-permissions.auth.revokeSession', roleType: 'authenticated' },\n { action: 'plugin::users-permissions.user.me', roleType: 'authenticated' },\n { action: 'plugin::users-permissions.auth.changePassword', roleType: 'authenticated' },\n];\n\nconst transformRoutePrefixFor = (pluginName) => (route) => {\n const prefix = route.config && route.config.prefix;\n const path = prefix !== undefined ? `${prefix}${route.path}` : `/${pluginName}${route.path}`;\n\n return {\n ...route,\n path,\n };\n};\n\nmodule.exports = ({ strapi }) => ({\n getActions({ defaultEnable = false } = {}) {\n const actionMap = {};\n\n const isContentApi = (action) => {\n if (!_.has(action, Symbol.for('__type__'))) {\n return false;\n }\n\n return action[Symbol.for('__type__')].includes('content-api');\n };\n\n for (const [apiName, api] of Object.entries(strapi.apis)) {\n const controllers = _.reduce(\n api.controllers,\n (acc, controller, controllerName) => {\n const contentApiActions = _.pickBy(controller, isContentApi);\n\n if (_.isEmpty(contentApiActions)) {\n return acc;\n }\n\n acc[controllerName] = _.mapValues(contentApiActions, () => {\n return {\n enabled: defaultEnable,\n policy: '',\n };\n });\n\n return acc;\n },\n {}\n );\n\n if (!_.isEmpty(controllers)) {\n actionMap[`api::${apiName}`] = { controllers };\n }\n }\n\n for (const [pluginName, plugin] of Object.entries(strapi.plugins)) {\n const controllers = _.reduce(\n plugin.controllers,\n (acc, controller, controllerName) => {\n const contentApiActions = _.pickBy(controller, isContentApi);\n\n if (_.isEmpty(contentApiActions)) {\n return acc;\n }\n\n acc[controllerName] = _.mapValues(contentApiActions, () => {\n return {\n enabled: defaultEnable,\n policy: '',\n };\n });\n\n return acc;\n },\n {}\n );\n\n if (!_.isEmpty(controllers)) {\n actionMap[`plugin::${pluginName}`] = { controllers };\n }\n }\n\n // Return a deeply cloned version to avoid circular references\n return _.cloneDeep(actionMap);\n },\n\n async getRoutes() {\n const routesMap = {};\n\n for (const [apiName, api] of Object.entries(strapi.apis)) {\n const routes = _.flatMap(api.routes, (route) => {\n if (_.has(route, 'routes')) {\n return route.routes;\n }\n\n return route;\n }).filter((route) => route.info.type === 'content-api');\n\n if (routes.length === 0) {\n continue;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`api::${apiName}`] = routes.map((route) => ({\n ...route,\n path: urlJoin(apiPrefix, route.path),\n }));\n }\n\n for (const [pluginName, plugin] of Object.entries(strapi.plugins)) {\n const transformPrefix = transformRoutePrefixFor(pluginName);\n\n const routes = _.flatMap(plugin.routes, (route) => {\n if (_.has(route, 'routes')) {\n return route.routes.map(transformPrefix);\n }\n\n return transformPrefix(route);\n }).filter((route) => route.info.type === 'content-api');\n\n if (routes.length === 0) {\n continue;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`plugin::${pluginName}`] = routes.map((route) => ({\n ...route,\n path: urlJoin(apiPrefix, route.path),\n }));\n }\n\n return sanitizeRoutesMapForSerialization(routesMap);\n },\n\n async syncPermissions() {\n const roles = await strapi.db.query('plugin::users-permissions.role').findMany();\n const dbPermissions = await strapi.db.query('plugin::users-permissions.permission').findMany();\n\n const permissionsFoundInDB = _.uniq(_.map(dbPermissions, 'action'));\n\n const appActions = _.flatMap(strapi.apis, (api, apiName) => {\n return _.flatMap(api.controllers, (controller, controllerName) => {\n return _.keys(controller).map((actionName) => {\n return `api::${apiName}.${controllerName}.${actionName}`;\n });\n });\n });\n\n const pluginsActions = _.flatMap(strapi.plugins, (plugin, pluginName) => {\n return _.flatMap(plugin.controllers, (controller, controllerName) => {\n return _.keys(controller).map((actionName) => {\n return `plugin::${pluginName}.${controllerName}.${actionName}`;\n });\n });\n });\n\n const allActions = [...appActions, ...pluginsActions];\n\n const toDelete = _.difference(permissionsFoundInDB, allActions);\n\n await Promise.all(\n toDelete.map((action) => {\n return strapi.db\n .query('plugin::users-permissions.permission')\n .delete({ where: { action } });\n })\n );\n\n if (permissionsFoundInDB.length === 0) {\n // create default permissions\n for (const role of roles) {\n const toCreate = pipe(\n filter(({ roleType }) => roleType === role.type || roleType === null),\n map(prop('action'))\n )(DEFAULT_PERMISSIONS);\n\n await Promise.all(\n toCreate.map((action) => {\n return strapi.db.query('plugin::users-permissions.permission').create({\n data: {\n action,\n role: role.id,\n },\n });\n })\n );\n }\n }\n },\n\n async initialize() {\n const roleCount = await strapi.db.query('plugin::users-permissions.role').count();\n\n if (roleCount === 0) {\n await strapi.db.query('plugin::users-permissions.role').create({\n data: {\n name: 'Authenticated',\n description: 'Default role given to authenticated user.',\n type: 'authenticated',\n },\n });\n\n await strapi.db.query('plugin::users-permissions.role').create({\n data: {\n name: 'Public',\n description: 'Default role given to unauthenticated user.',\n type: 'public',\n },\n });\n }\n\n return getService('users-permissions').syncPermissions();\n },\n\n async updateUserRole(user, role) {\n return strapi.db\n .query('plugin::users-permissions.user')\n .update({ where: { id: user.id }, data: { role } });\n },\n\n template(layout, data) {\n const allowedTemplateVariables = objects.keysDeep(data);\n\n // Create a strict interpolation RegExp based on possible variable names\n const interpolate = createStrictInterpolationRegExp(allowedTemplateVariables, 'g');\n\n try {\n return _.template(layout, { interpolate, evaluate: false, escape: false })(data);\n } catch {\n throw new errors.ApplicationError('Invalid email template');\n }\n },\n});\n"],"names":["_","require$$0","filter","map","pipe","prop","require$$1","urlJoin","require$$2","template","createStrictInterpolationRegExp","errors","objects","sanitizeRoutesMapForSerialization","require$$3","getService","require$$4","DEFAULT_PERMISSIONS","action","roleType","transformRoutePrefixFor","pluginName","route","prefix","config","path","undefined","usersPermissions","strapi","getActions","defaultEnable","actionMap","isContentApi","has","Symbol","for","includes","apiName","api","Object","entries","apis","controllers","reduce","acc","controller","controllerName","contentApiActions","pickBy","isEmpty","mapValues","enabled","policy","plugin","plugins","cloneDeep","getRoutes","routesMap","routes","flatMap","info","type","length","apiPrefix","get","transformPrefix","syncPermissions","roles","db","query","findMany","dbPermissions","permissionsFoundInDB","uniq","appActions","keys","actionName","pluginsActions","allActions","toDelete","difference","Promise","all","delete","where","role","toCreate","create","data","id","initialize","roleCount","count","name","description","updateUserRole","user","update","layout","allowedTemplateVariables","keysDeep","interpolate","evaluate","escape","ApplicationError"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/plugin-users-permissions",
|
|
3
|
-
"version": "5.52.
|
|
3
|
+
"version": "5.52.2",
|
|
4
4
|
"description": "Protect your API with a full-authentication process based on JWT",
|
|
5
5
|
"homepage": "https://strapi.io",
|
|
6
6
|
"bugs": {
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"dependencies": {
|
|
56
56
|
"@strapi/design-system": "2.2.4",
|
|
57
57
|
"@strapi/icons": "2.2.4",
|
|
58
|
-
"@strapi/utils": "5.52.
|
|
58
|
+
"@strapi/utils": "5.52.2",
|
|
59
59
|
"bcryptjs": "2.4.3",
|
|
60
60
|
"formik": "2.4.9",
|
|
61
61
|
"immer": "9.0.21",
|
|
@@ -69,10 +69,11 @@
|
|
|
69
69
|
"react-redux": "8.1.3",
|
|
70
70
|
"url-join": "4.0.1",
|
|
71
71
|
"yup": "0.32.9",
|
|
72
|
-
"zod": "
|
|
72
|
+
"zod": "4.4.3"
|
|
73
73
|
},
|
|
74
74
|
"devDependencies": {
|
|
75
|
-
"@strapi/
|
|
75
|
+
"@strapi/admin": "5.52.2",
|
|
76
|
+
"@strapi/strapi": "5.52.2",
|
|
76
77
|
"@testing-library/dom": "10.4.1",
|
|
77
78
|
"@testing-library/jest-dom": "6.9.1",
|
|
78
79
|
"@testing-library/react": "16.3.2",
|
|
@@ -86,6 +87,7 @@
|
|
|
86
87
|
"styled-components": "6.4.1"
|
|
87
88
|
},
|
|
88
89
|
"peerDependencies": {
|
|
90
|
+
"@strapi/admin": "^5.0.0",
|
|
89
91
|
"@strapi/strapi": "^5.0.0",
|
|
90
92
|
"react": "^17.0.0 || ^18.0.0",
|
|
91
93
|
"react-dom": "^17.0.0 || ^18.0.0",
|
|
@@ -371,7 +371,11 @@ module.exports = ({ strapi }) => ({
|
|
|
371
371
|
const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';
|
|
372
372
|
if (upSessions?.httpOnly || requestHttpOnly) {
|
|
373
373
|
const cookieName = upSessions.cookie?.name || 'strapi_up_refresh';
|
|
374
|
-
|
|
374
|
+
const isProduction = process.env.NODE_ENV === 'production';
|
|
375
|
+
|
|
376
|
+
const { maxAge, ...cookieOptions } = buildRefreshCookieOptions(upSessions, isProduction);
|
|
377
|
+
|
|
378
|
+
ctx.cookies.set(cookieName, '', { ...cookieOptions, expires: new Date(0) });
|
|
375
379
|
}
|
|
376
380
|
return ctx.send({ ok: true });
|
|
377
381
|
},
|
|
@@ -50,7 +50,7 @@ module.exports = ({ strapi }) => ({
|
|
|
50
50
|
return action[Symbol.for('__type__')].includes('content-api');
|
|
51
51
|
};
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
for (const [apiName, api] of Object.entries(strapi.apis)) {
|
|
54
54
|
const controllers = _.reduce(
|
|
55
55
|
api.controllers,
|
|
56
56
|
(acc, controller, controllerName) => {
|
|
@@ -75,9 +75,9 @@ module.exports = ({ strapi }) => ({
|
|
|
75
75
|
if (!_.isEmpty(controllers)) {
|
|
76
76
|
actionMap[`api::${apiName}`] = { controllers };
|
|
77
77
|
}
|
|
78
|
-
}
|
|
78
|
+
}
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
for (const [pluginName, plugin] of Object.entries(strapi.plugins)) {
|
|
81
81
|
const controllers = _.reduce(
|
|
82
82
|
plugin.controllers,
|
|
83
83
|
(acc, controller, controllerName) => {
|
|
@@ -102,7 +102,7 @@ module.exports = ({ strapi }) => ({
|
|
|
102
102
|
if (!_.isEmpty(controllers)) {
|
|
103
103
|
actionMap[`plugin::${pluginName}`] = { controllers };
|
|
104
104
|
}
|
|
105
|
-
}
|
|
105
|
+
}
|
|
106
106
|
|
|
107
107
|
// Return a deeply cloned version to avoid circular references
|
|
108
108
|
return _.cloneDeep(actionMap);
|
|
@@ -111,7 +111,7 @@ module.exports = ({ strapi }) => ({
|
|
|
111
111
|
async getRoutes() {
|
|
112
112
|
const routesMap = {};
|
|
113
113
|
|
|
114
|
-
|
|
114
|
+
for (const [apiName, api] of Object.entries(strapi.apis)) {
|
|
115
115
|
const routes = _.flatMap(api.routes, (route) => {
|
|
116
116
|
if (_.has(route, 'routes')) {
|
|
117
117
|
return route.routes;
|
|
@@ -121,7 +121,7 @@ module.exports = ({ strapi }) => ({
|
|
|
121
121
|
}).filter((route) => route.info.type === 'content-api');
|
|
122
122
|
|
|
123
123
|
if (routes.length === 0) {
|
|
124
|
-
|
|
124
|
+
continue;
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
const apiPrefix = strapi.config.get('api.rest.prefix');
|
|
@@ -129,9 +129,9 @@ module.exports = ({ strapi }) => ({
|
|
|
129
129
|
...route,
|
|
130
130
|
path: urlJoin(apiPrefix, route.path),
|
|
131
131
|
}));
|
|
132
|
-
}
|
|
132
|
+
}
|
|
133
133
|
|
|
134
|
-
|
|
134
|
+
for (const [pluginName, plugin] of Object.entries(strapi.plugins)) {
|
|
135
135
|
const transformPrefix = transformRoutePrefixFor(pluginName);
|
|
136
136
|
|
|
137
137
|
const routes = _.flatMap(plugin.routes, (route) => {
|
|
@@ -143,7 +143,7 @@ module.exports = ({ strapi }) => ({
|
|
|
143
143
|
}).filter((route) => route.info.type === 'content-api');
|
|
144
144
|
|
|
145
145
|
if (routes.length === 0) {
|
|
146
|
-
|
|
146
|
+
continue;
|
|
147
147
|
}
|
|
148
148
|
|
|
149
149
|
const apiPrefix = strapi.config.get('api.rest.prefix');
|
|
@@ -151,7 +151,7 @@ module.exports = ({ strapi }) => ({
|
|
|
151
151
|
...route,
|
|
152
152
|
path: urlJoin(apiPrefix, route.path),
|
|
153
153
|
}));
|
|
154
|
-
}
|
|
154
|
+
}
|
|
155
155
|
|
|
156
156
|
return sanitizeRoutesMapForSerialization(routesMap);
|
|
157
157
|
},
|