@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.
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;AAEA;;;;4CAOA,MAAMA,MAAAA,GAASC,6BAAAA;AACf,IAAA,MAAMC,CAAAA,GAAIC,6BAAAA;AACV,IAAA,MAAM,EAAEC,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAE,GAAGC,2BAAAA;AACrC,IAAA,MAAMC,KAAAA,GAAQC,2BAAAA;IACd,MAAM,EAAEC,UAAU,EAAE,GAAGC,eAAAA,EAAAA;IACvB,MAAM,EAAEC,yBAAyB,EAAE,GAAGC,8BAAAA,EAAAA;AACtC,IAAA,MAAM,EACJC,oBAAoB,EACpBC,oBAAoB,EACpBC,iCAAiC,EACjCC,0BAA0B,EAC1BC,yBAAyB,EACzBC,6BAA6B,EAC7BC,0BAA0B,EAC3B,GAAGC,gBAAAA,EAAAA;IAEJ,MAAM,EAAEC,gBAAgB,EAAEC,eAAe,EAAEC,cAAc,EAAE,GAAGhB,KAAAA,CAAMiB,MAAM;AAC1E,IAAA,MAAM,EAAEC,oBAAoB,EAAEC,oBAAoB,EAAEC,sBAAsB,EAAE,GAAGpB,KAAAA;IAE/E,MAAMqB,YAAAA,GAAe,CAACC,IAAAA,EAAMC,GAAAA,GAAAA;AAC1B,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,IAAIE,KAAK;QAC1B,MAAMC,UAAAA,GAAaC,MAAAA,CAAOC,QAAQ,CAAC,gCAAA,CAAA;QAEnC,OAAOD,MAAAA,CAAOE,UAAU,CAACC,QAAQ,CAACC,MAAM,CAACT,MAAMI,UAAAA,EAAY;AAAEF,YAAAA;;AAC/D,IAAA,CAAA;AAEA,IAAA,MAAMQ,kBAAkB,CAACC,WAAAA,GAAAA;AACvB,QAAA,MAAM,EAAEC,QAAQ,EAAE,GAAGD,eAAe,EAAA;AAEpC,QAAA,OAAO,OAAOC,QAAAA,KAAa,QAAA,IAAYA,SAASC,MAAM,GAAG,IAAID,QAAAA,GAAWE,SAAAA;AAC1E,IAAA,CAAA;IAEA,MAAMC,+BAAAA,GAAkC,CAACd,GAAAA,GACvCL,oBAAAA,CAAqB;AACnBoB,YAAAA,SAAAA,EAAWf,GAAAA,CAAIgB,OAAO,CAACC,OAAO,CAAC,YAAA;AACnC,SAAA,CAAA;IAEA,MAAMC,uBAAAA,GAA0B,OAAOd,OAAAA,EAAQJ,GAAAA,EAAKD,IAAAA,EAAM,EAAEoB,QAAQ,EAAE,GAAG,EAAE,GAAA;AACzE,QAAA,MAAMR,QAAAA,GAAWF,eAAAA,CAAgBT,GAAAA,CAAIgB,OAAO,CAACI,IAAI,CAAA;AACjD,QAAA,MAAMC,YAAAA,GAAe;YAAEC,IAAAA,EAAM,SAAA;AAAW,YAAA,GAAIH,QAAAA,GAAW;AAAEA,gBAAAA;gBAAa;AAAG,SAAA;AAEzE,QAAA,MAAMI,OAAAA,GAAU,MAAMnB,OAAAA,CACnBoB,cAAc,CAAC,mBAAA,CAAA,CACfC,oBAAoB,CAACC,MAAAA,CAAO3B,IAAAA,CAAK4B,EAAE,CAAA,EAAGhB,QAAAA,EAAUU,YAAAA,CAAAA;QAEnD,MAAMO,MAAAA,GAAS,MAAMxB,OAAAA,CAClBoB,cAAc,CAAC,mBAAA,CAAA,CACfK,mBAAmB,CAACN,OAAAA,CAAQO,KAAK,CAAA;AACpC,QAAA,IAAI,WAAWF,MAAAA,EAAQ;AACrB,YAAA,MAAM,IAAIrC,gBAAAA,CAAiB,qBAAA,CAAA;AAC/B,QAAA;AAEE,QAAA,MAAMwC,UAAAA,GAAa3B,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,oCAAA,CAAA;AACrC,QAAA,MAAMC,kBAAkBlC,GAAAA,CAAIgB,OAAO,CAACmB,MAAM,CAAC,0BAA0B,KAAK,UAAA;QAE1E,IAAIJ,UAAAA,EAAYK,YAAYF,eAAAA,EAAiB;AAC3C,YAAA,MAAMG,UAAAA,GAAaN,UAAAA,CAAWO,MAAM,EAAEC,IAAAA,IAAQ,mBAAA;AAC9C,YAAA,MAAMC,YAAAA,GAAeC,OAAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,YAAA;YAC9C3C,GAAAA,CAAI4C,OAAO,CAACC,GAAG,CAACR,YAAYd,OAAAA,CAAQO,KAAK,EAAEjD,yBAAAA,CAA0BkD,UAAAA,EAAYS,YAAAA,CAAAA,CAAAA;YACjF,OAAOxC,GAAAA,CAAI8C,IAAI,CAAC;AAAEC,gBAAAA,GAAAA,EAAKnB,OAAOE,KAAK;gBAAE/B,IAAAA,EAAM,MAAMD,aAAaC,IAAAA,EAAMC,GAAAA;AAAI,aAAA,CAAA;AAC5E,QAAA;QAEE,OAAOA,GAAAA,CAAI8C,IAAI,CAAC;AACdC,YAAAA,GAAAA,EAAKnB,OAAOE,KAAK;AACjBkB,YAAAA,YAAAA,EAAczB,QAAQO,KAAK;YAC3B/B,IAAAA,EAAM,MAAMD,aAAaC,IAAAA,EAAMC,GAAAA;AACnC,SAAA,CAAA;AACA,IAAA,CAAA;IAEA,MAAMiD,gCAAAA,GAAmC,OAAO7C,OAAAA,EAAQJ,GAAAA,EAAKD,IAAAA,GAAAA;AAC3D,QAAA,MAAMY,QAAAA,GAAWF,eAAAA,CAAgBT,GAAAA,CAAIgB,OAAO,CAACI,IAAI,CAAA;QAEjD,MAAMhB,OAAAA,CAAOoB,cAAc,CAAC,mBAAA,CAAA,CAAqB0B,sBAAsB,CAACxB,MAAAA,CAAO3B,KAAK4B,EAAE,CAAA,CAAA;QAEtF,MAAMwB,WAAAA,GAAcxC,QAAAA,IAAY1C,MAAAA,CAAOmF,UAAU,EAAA;AACjD,QAAA,MAAM7B,OAAAA,GAAU,MAAMnB,OAAAA,CACnBoB,cAAc,CAAC,mBAAA,CAAA,CACfC,oBAAoB,CAACC,MAAAA,CAAO3B,IAAAA,CAAK4B,EAAE,CAAA,EAAGwB,WAAAA,EAAa;YAAE7B,IAAAA,EAAM;;QAE9D,MAAMM,MAAAA,GAAS,MAAMxB,OAAAA,CAClBoB,cAAc,CAAC,mBAAA,CAAA,CACfK,mBAAmB,CAACN,OAAAA,CAAQO,KAAK,CAAA;AACpC,QAAA,IAAI,WAAWF,MAAAA,EAAQ;AACrB,YAAA,MAAM,IAAIrC,gBAAAA,CAAiB,qBAAA,CAAA;AAC/B,QAAA;QAEE,OAAOS,GAAAA,CAAI8C,IAAI,CAAC;AACdC,YAAAA,GAAAA,EAAKnB,OAAOE,KAAK;AACjBkB,YAAAA,YAAAA,EAAczB,QAAQO,KAAK;YAC3B/B,IAAAA,EAAM,MAAMD,aAAaC,IAAAA,EAAMC,GAAAA;AACnC,SAAA,CAAA;AACA,IAAA,CAAA;IAEA,MAAMqD,oBAAAA,GAAuB,OAAOjD,OAAAA,EAAQJ,GAAAA,EAAKsD,MAAAA,EAAQ,EAAEC,KAAK,EAAE5C,QAAQ,EAAES,IAAI,EAAE,GAAA;QAChF,MAAMI,cAAAA,GAAiBpB,OAAAA,CAAOoB,cAAc,CAAC,mBAAA,CAAA;AAC7C,QAAA,MAAMO,UAAAA,GAAa3B,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,oCAAA,CAAA;AAErC,QAAA,IAAIsB,UAAU,KAAA,EAAO;YACnB,MAAM/B,cAAAA,CAAe0B,sBAAsB,CAACI,MAAAA,CAAAA;AAC5C,YAAA;AACJ,QAAA;AAEE,QAAA,IAAI3C,QAAAA,EAAU;YACZ,MAAMa,cAAAA,CAAe0B,sBAAsB,CAACI,MAAAA,EAAQ3C,QAAAA,CAAAA;AACpD,YAAA;AACJ,QAAA;AAEE,QAAA,IAAI6C,gBAAAA,GAAmBxD,GAAAA,CAAIE,KAAK,CAACuD,OAAO,EAAE9B,EAAAA;QAC1C,MAAMU,UAAAA,GAAaN,UAAAA,EAAYO,MAAAA,EAAQC,IAAAA,IAAQ,mBAAA;AAC/C,QAAA,MAAMS,eACJhD,GAAAA,CAAI4C,OAAO,CAACX,GAAG,CAACI,UAAAA,CAAAA,KACf,OAAOjB,IAAAA,CAAK4B,YAAY,KAAK,QAAA,GAAW5B,IAAAA,CAAK4B,YAAY,GAAGnC,SAAA,CAAA;AAE/D,QAAA,IAAImC,YAAAA,EAAc;AAChB,YAAA,MAAMU,UAAAA,GAAa,MAAMlC,cAAAA,CAAemC,oBAAoB,CAACX,YAAAA,CAAAA;YAC7D,IAAIU,UAAAA,CAAWE,OAAO,EAAE;AACtBJ,gBAAAA,gBAAAA,GAAmBE,WAAWG,SAAS;AAC7C,YAAA;AACA,QAAA;AAEE,QAAA,IAAIL,gBAAAA,EAAkB;YACpB,MAAMhC,cAAAA,CAAesC,iBAAiB,CAACR,MAAAA,EAAQE,gBAAAA,CAAAA;AAC/C,YAAA;AACJ,QAAA;QAEE,MAAMhC,cAAAA,CAAe0B,sBAAsB,CAACI,MAAAA,CAAAA;AAC9C,IAAA,CAAA;AAEArD,IAAAA,IAAAA,GAAiB,CAAC,EAAEG,MAAAA,EAAAA,OAAM,EAAE,IAAM;AAChC,YAAA,MAAM2D,UAAS/D,GAAG,EAAA;AAChB,gBAAA,MAAMgE,QAAAA,GAAWhE,GAAAA,CAAIiE,MAAM,CAACD,QAAQ,IAAI,OAAA;AACxC,gBAAA,MAAMC,MAAAA,GAASjE,GAAAA,CAAIgB,OAAO,CAACI,IAAI;gBAE/B,MAAM8C,KAAAA,GAAQ9D,OAAAA,CAAO8D,KAAK,CAAC;oBAAE5C,IAAAA,EAAM,QAAA;oBAAUiB,IAAAA,EAAM;;AACnD,gBAAA,MAAM4B,aAAAA,GAAgB,MAAMD,KAAAA,CAAMjC,GAAG,CAAC;oBAAEmC,GAAAA,EAAK;;gBAE7C,MAAMC,aAAAA,GAAgBL,QAAAA,KAAa,OAAA,GAAU,OAAA,GAAUA,QAAAA;AAEvD,gBAAA,IAAI,CAAC7F,CAAAA,CAAE8D,GAAG,CAACkC,aAAAA,EAAe;AAACE,oBAAAA,aAAAA;AAAe,oBAAA;iBAAU,CAAA,EAAG;AACrD,oBAAA,MAAM,IAAI9E,gBAAAA,CAAiB,2BAAA,CAAA;AACjC,gBAAA;AAEI,gBAAA,IAAIyE,aAAa,OAAA,EAAS;AACxB,oBAAA,MAAMjF,oBAAAA,CAAqBkF,MAAAA,CAAAA;oBAE3B,MAAM,EAAEK,UAAU,EAAE,GAAGL,MAAAA;;oBAGvB,MAAMlE,IAAAA,GAAO,MAAMK,OAAAA,CAAOmE,EAAE,CAACC,KAAK,CAAC,gCAAA,CAAA,CAAkCC,OAAO,CAAC;wBAC3EC,KAAAA,EAAO;AACLV,4BAAAA,QAAAA;4BACAW,GAAAA,EAAK;AAAC,gCAAA;AAAEC,oCAAAA,KAAAA,EAAON,WAAWO,WAAW;;AAAM,gCAAA;oCAAEC,QAAAA,EAAUR;;AAAa;AAC9E;AACA,qBAAA,CAAA;AAEM,oBAAA,IAAI,CAACvE,IAAAA,EAAM;AACT,wBAAA,MAAM,IAAIP,eAAAA,CAAgB,gCAAA,CAAA;AAClC,oBAAA;oBAEM,IAAI,CAACO,IAAAA,CAAKgF,QAAQ,EAAE;AAClB,wBAAA,MAAM,IAAIvF,eAAAA,CAAgB,gCAAA,CAAA;AAClC,oBAAA;oBAEM,MAAMwF,aAAAA,GAAgB,MAAMrG,UAAAA,CAAW,MAAA,CAAA,CAAQsG,gBAAgB,CAC7DhB,MAAAA,CAAOc,QAAQ,EACfhF,IAAAA,CAAKgF,QAAA,CAAA;AAGP,oBAAA,IAAI,CAACC,aAAAA,EAAe;AAClB,wBAAA,MAAM,IAAIxF,eAAAA,CAAgB,gCAAA,CAAA;AAClC,oBAAA;AAEM,oBAAA,MAAM0F,gBAAAA,GAAmB,MAAMhB,KAAAA,CAAMjC,GAAG,CAAC;wBAAEmC,GAAAA,EAAK;;AAChD,oBAAA,MAAMe,oBAAAA,GAAuBhH,CAAAA,CAAE8D,GAAG,CAACiD,gBAAAA,EAAkB,oBAAA,CAAA;AAErD,oBAAA,IAAIC,oBAAAA,IAAwBpF,IAAAA,CAAKqF,SAAS,KAAK,IAAA,EAAM;AACnD,wBAAA,MAAM,IAAI7F,gBAAAA,CAAiB,qCAAA,CAAA;AACnC,oBAAA;oBAEM,IAAIQ,IAAAA,CAAKsF,OAAO,KAAK,IAAA,EAAM;AACzB,wBAAA,MAAM,IAAI9F,gBAAAA,CAAiB,mDAAA,CAAA;AACnC,oBAAA;AAEM,oBAAA,MAAM+F,OAAOlF,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,yCAAA,EAA2C,gBAAA,CAAA;AAC1E,oBAAA,IAAIqD,SAAS,SAAA,EAAW;wBACtB,OAAOpE,uBAAAA,CAAwBd,OAAAA,EAAQJ,GAAAA,EAAKD,IAAAA,EAAM;AAChDoB,4BAAAA,QAAAA,EAAUL,+BAAAA,CAAgCd,GAAAA;AACpD,yBAAA,CAAA;AACA,oBAAA;oBAEM,OAAOA,GAAAA,CAAI8C,IAAI,CAAC;wBACdC,GAAAA,EAAKpE,UAAAA,CAAW,KAAA,CAAA,CAAO4G,KAAK,CAAC;AAAE5D,4BAAAA,EAAAA,EAAI5B,KAAK4B;;wBACxC5B,IAAAA,EAAM,MAAMD,aAAaC,IAAAA,EAAMC,GAAAA;AACvC,qBAAA,CAAA;AACA,gBAAA;;gBAGI,IAAI;oBACF,MAAMD,IAAAA,GAAO,MAAMpB,UAAAA,CAAW,WAAA,CAAA,CAAa6G,OAAO,CAACxB,QAAAA,EAAUhE,IAAIwE,KAAK,CAAA;oBAEtE,IAAIzE,IAAAA,CAAKsF,OAAO,EAAE;AAChB,wBAAA,MAAM,IAAI5F,cAAAA,CAAe,mDAAA,CAAA;AACjC,oBAAA;AAEM,oBAAA,MAAM6F,OAAOlF,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,yCAAA,EAA2C,gBAAA,CAAA;AAC1E,oBAAA,IAAIqD,SAAS,SAAA,EAAW;wBACtB,OAAOpE,uBAAAA,CAAwBd,OAAAA,EAAQJ,GAAAA,EAAKD,IAAAA,EAAM;AAChDoB,4BAAAA,QAAAA,EAAUL,+BAAAA,CAAgCd,GAAAA;AACpD,yBAAA,CAAA;AACA,oBAAA;oBAEM,OAAOA,GAAAA,CAAI8C,IAAI,CAAC;wBACdC,GAAAA,EAAKpE,UAAAA,CAAW,KAAA,CAAA,CAAO4G,KAAK,CAAC;AAAE5D,4BAAAA,EAAAA,EAAI5B,KAAK4B;;wBACxC5B,IAAAA,EAAM,MAAMD,aAAaC,IAAAA,EAAMC,GAAAA;AACvC,qBAAA,CAAA;AACA,gBAAA,CAAA,CAAM,OAAOyF,KAAAA,EAAO;oBACd,MAAM,IAAIlG,gBAAAA,CAAiBkG,KAAAA,CAAMC,OAAO,CAAA;AAC9C,gBAAA;AACA,YAAA,CAAA;AAEE,YAAA,MAAMC,gBAAe3F,GAAG,EAAA;AACtB,gBAAA,IAAI,CAACA,GAAAA,CAAIE,KAAK,CAACH,IAAI,EAAE;AACnB,oBAAA,MAAM,IAAIR,gBAAAA,CAAiB,kDAAA,CAAA;AACjC,gBAAA;AAEI,gBAAA,MAAMqG,WAAAA,GAAcxF,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,2CAAA,CAAA;AAEtC,gBAAA,MAAM,EAAE4D,eAAe,EAAEd,QAAQ,EAAE,GAAG,MAAM1F,0BAAAA,CAC1CW,GAAAA,CAAIgB,OAAO,CAACI,IAAI,EAChBwE,WAAAA,CAAAA;gBAGF,MAAM7F,IAAAA,GAAO,MAAMK,OAAAA,CAAOmE,EAAA,CACvBC,KAAK,CAAC,gCAAA,CAAA,CACNC,OAAO,CAAC;oBAAEC,KAAAA,EAAO;AAAE/C,wBAAAA,EAAAA,EAAI3B,GAAAA,CAAIE,KAAK,CAACH,IAAI,CAAC4B;AAAE;;gBAE3C,MAAMqD,aAAAA,GAAgB,MAAMrG,UAAAA,CAAW,MAAA,CAAA,CAAQsG,gBAAgB,CAACY,eAAAA,EAAiB9F,KAAKgF,QAAQ,CAAA;AAE9F,gBAAA,IAAI,CAACC,aAAAA,EAAe;AAClB,oBAAA,MAAM,IAAIxF,eAAAA,CAAgB,0CAAA,CAAA;AAChC,gBAAA;AAEI,gBAAA,IAAIqG,oBAAoBd,QAAAA,EAAU;AAChC,oBAAA,MAAM,IAAIvF,eAAAA,CAAgB,gEAAA,CAAA;AAChC,gBAAA;AAEI,gBAAA,MAAMb,WAAW,MAAA,CAAA,CAAQmH,IAAI,CAAC/F,IAAAA,CAAK4B,EAAE,EAAE;AAAEoD,oBAAAA;;AAEzC,gBAAA,MAAMO,OAAOlF,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,yCAAA,EAA2C,gBAAA,CAAA;AAC1E,gBAAA,IAAIqD,SAAS,SAAA,EAAW;oBACtB,OAAOrC,gCAAAA,CAAiC7C,SAAQJ,GAAAA,EAAKD,IAAAA,CAAAA;AAC3D,gBAAA;gBAEI,OAAOC,GAAAA,CAAI8C,IAAI,CAAC;oBACdC,GAAAA,EAAKpE,UAAAA,CAAW,KAAA,CAAA,CAAO4G,KAAK,CAAC;AAAE5D,wBAAAA,EAAAA,EAAI5B,KAAK4B;;oBACxC5B,IAAAA,EAAM,MAAMD,aAAaC,IAAAA,EAAMC,GAAAA;AACrC,iBAAA,CAAA;AACA,YAAA,CAAA;AAEE,YAAA,MAAM+F,eAAc/F,GAAG,EAAA;AACrB,gBAAA,MAAM4F,WAAAA,GAAcxF,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,2CAAA,CAAA;AAEtC,gBAAA,MAAM,EAAE8C,QAAQ,EAAEiB,oBAAoB,EAAEC,IAAI,EAAE,GAAG,MAAM9G,yBAAAA,CACrDa,GAAAA,CAAIgB,OAAO,CAACI,IAAI,EAChBwE,WAAAA,CAAAA;AAGF,gBAAA,IAAIb,aAAaiB,oBAAAA,EAAsB;AACrC,oBAAA,MAAM,IAAIxG,eAAAA,CAAgB,wBAAA,CAAA;AAChC,gBAAA;gBAEI,MAAMO,IAAAA,GAAO,MAAMK,OAAAA,CAAOmE,EAAA,CACvBC,KAAK,CAAC,gCAAA,CAAA,CACNC,OAAO,CAAC;oBAAEC,KAAAA,EAAO;wBAAEwB,kBAAAA,EAAoBD;AAAI;AAAE,iBAAA,CAAA;AAEhD,gBAAA,IAAI,CAAClG,IAAAA,EAAM;AACT,oBAAA,MAAM,IAAIP,eAAAA,CAAgB,yBAAA,CAAA;AAChC,gBAAA;AAEI,gBAAA,MAAMb,WAAW,MAAA,CAAA,CAAQmH,IAAI,CAAC/F,IAAAA,CAAK4B,EAAE,EAAE;oBACrCuE,kBAAAA,EAAoB,IAAA;AACpBnB,oBAAAA;AACN,iBAAA,CAAA;AAEI,gBAAA,MAAMO,OAAOlF,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,yCAAA,EAA2C,gBAAA,CAAA;AAC1E,gBAAA,IAAIqD,SAAS,SAAA,EAAW;oBACtB,OAAOrC,gCAAAA,CAAiC7C,SAAQJ,GAAAA,EAAKD,IAAAA,CAAAA;AAC3D,gBAAA;gBAEI,OAAOC,GAAAA,CAAI8C,IAAI,CAAC;oBACdC,GAAAA,EAAKpE,UAAAA,CAAW,KAAA,CAAA,CAAO4G,KAAK,CAAC;AAAE5D,wBAAAA,EAAAA,EAAI5B,KAAK4B;;oBACxC5B,IAAAA,EAAM,MAAMD,aAAaC,IAAAA,EAAMC,GAAAA;AACrC,iBAAA,CAAA;AACA,YAAA,CAAA;AACE,YAAA,MAAMuB,SAAQvB,GAAG,EAAA;AACf,gBAAA,MAAMsF,OAAOlF,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,yCAAA,EAA2C,gBAAA,CAAA;AAC1E,gBAAA,IAAIqD,SAAS,SAAA,EAAW;AACtB,oBAAA,OAAOtF,IAAImG,QAAQ,EAAA;AACzB,gBAAA;AAEI,gBAAA,MAAMpE,UAAAA,GAAa3B,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,oCAAA,CAAA;gBACrC,MAAMI,UAAAA,GAAaN,UAAAA,EAAYO,MAAAA,EAAQC,IAAAA,IAAQ,mBAAA;;AAG/C,gBAAA,IAAIS,YAAAA,GAAehD,GAAAA,CAAI4C,OAAO,CAACX,GAAG,CAACI,UAAAA,CAAAA;AACnC,gBAAA,IAAI,CAACW,YAAAA,EAAc;AACjBA,oBAAAA,YAAAA,GAAehD,GAAAA,CAAIgB,OAAO,CAACI,IAAI,EAAE4B,YAAAA;AACvC,gBAAA;AAEI,gBAAA,IAAI,CAACA,YAAAA,IAAgB,OAAOA,YAAAA,KAAiB,QAAA,EAAU;oBACrD,OAAOhD,GAAAA,CAAIoG,UAAU,CAAC,uBAAA,CAAA;AAC5B,gBAAA;AAEI,gBAAA,MAAMC,WAAW,MAAMjG,OAAAA,CACpBoB,cAAc,CAAC,mBAAA,CAAA,CACf8E,kBAAkB,CAACtD,YAAAA,CAAAA;AACtB,gBAAA,IAAI,WAAWqD,QAAAA,EAAU;oBACvB,OAAOrG,GAAAA,CAAIuG,YAAY,CAAC,uBAAA,CAAA;AAC9B,gBAAA;gBAEI,MAAMC,MAAAA,GAAS,MAAMpG,OAAAA,CAClBoB,cAAc,CAAC,mBAAA,CAAA,CACfK,mBAAmB,CAACwE,QAAAA,CAASvE,KAAK,CAAA;AACrC,gBAAA,IAAI,WAAW0E,MAAAA,EAAQ;oBACrB,OAAOxG,GAAAA,CAAIuG,YAAY,CAAC,uBAAA,CAAA;AAC9B,gBAAA;AAEI,gBAAA,MAAMrE,kBAAkBlC,GAAAA,CAAIgB,OAAO,CAACmB,MAAM,CAAC,0BAA0B,KAAK,UAAA;gBAC1E,IAAIJ,UAAAA,EAAYK,YAAYF,eAAAA,EAAiB;AAC3C,oBAAA,MAAMM,YAAAA,GAAeC,OAAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,YAAA;oBAC9C3C,GAAAA,CAAI4C,OAAO,CAACC,GAAG,CACbR,YACAgE,QAAAA,CAASvE,KAAK,EACdjD,yBAAAA,CAA0BkD,UAAAA,EAAYS,YAAAA,CAAAA,CAAAA;oBAExC,OAAOxC,GAAAA,CAAI8C,IAAI,CAAC;AAAEC,wBAAAA,GAAAA,EAAKyD,OAAO1E;AAAK,qBAAA,CAAA;AACzC,gBAAA;gBACI,OAAO9B,GAAAA,CAAI8C,IAAI,CAAC;AAAEC,oBAAAA,GAAAA,EAAKyD,OAAO1E,KAAK;AAAEkB,oBAAAA,YAAAA,EAAcqD,SAASvE;;AAChE,YAAA,CAAA;AACE,YAAA,MAAM2E,QAAOzG,GAAG,EAAA;AACd,gBAAA,MAAMsF,OAAOlF,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,yCAAA,EAA2C,gBAAA,CAAA;AAC1E,gBAAA,IAAIqD,SAAS,SAAA,EAAW;AACtB,oBAAA,OAAOtF,IAAImG,QAAQ,EAAA;AACzB,gBAAA;AAEI,gBAAA,IAAI,CAACnG,GAAAA,CAAIE,KAAK,CAACH,IAAI,EAAE;oBACnB,OAAOC,GAAAA,CAAIuG,YAAY,CAAC,wBAAA,CAAA;AAC9B,gBAAA;AAEI,gBAAA,MAAMjD,SAAS5B,MAAAA,CAAO1B,GAAAA,CAAIE,KAAK,CAACH,IAAI,CAAC4B,EAAE,CAAA;AACvC,gBAAA,MAAMI,UAAAA,GAAa3B,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,oCAAA,CAAA;AACrC,gBAAA,MAAMb,OAAOpB,GAAAA,CAAIgB,OAAO,CAACI,IAAI,IAAI,EAAA;gBACjC,MAAMmC,KAAAA,GAAQ,OAAOnC,IAAAA,CAAKmC,KAAK,KAAK,QAAA,GAAWnC,IAAAA,CAAKmC,KAAK,GAAG1C,SAAAA;AAC5D,gBAAA,MAAMF,WAAWF,eAAAA,CAAgBW,IAAAA,CAAAA;gBAEjC,IAAI;oBACF,MAAMiC,oBAAAA,CAAqBjD,OAAAA,EAAQJ,GAAAA,EAAKsD,MAAAA,EAAQ;AAAEC,wBAAAA,KAAAA;AAAO5C,wBAAAA,QAAAA;AAAUS,wBAAAA;;AACzE,gBAAA,CAAA,CAAM,OAAOsF,GAAAA,EAAK;AACZtG,oBAAAA,OAAAA,CAAOuG,GAAG,CAAClB,KAAK,CAAC,kBAAA,EAAoBiB,GAAAA,CAAAA;AAC3C,gBAAA;AAEI,gBAAA,MAAMxE,kBAAkBlC,GAAAA,CAAIgB,OAAO,CAACmB,MAAM,CAAC,0BAA0B,KAAK,UAAA;gBAC1E,IAAIJ,UAAAA,EAAYK,YAAYF,eAAAA,EAAiB;AAC3C,oBAAA,MAAMG,UAAAA,GAAaN,UAAAA,CAAWO,MAAM,EAAEC,IAAAA,IAAQ,mBAAA;AAC9C,oBAAA,MAAMC,YAAAA,GAAeC,OAAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,YAAA;AAE9C,oBAAA,MAAM,EAAEiE,MAAM,EAAE,GAAGC,aAAAA,EAAe,GAAGhI,0BAA0BkD,UAAAA,EAAYS,YAAAA,CAAAA;AAE3ExC,oBAAAA,GAAAA,CAAI4C,OAAO,CAACC,GAAG,CAACR,YAAY,EAAA,EAAI;AAAE,wBAAA,GAAGwE,aAAa;AAAEC,wBAAAA,OAAAA,EAAS,IAAIC,IAAAA,CAAK,CAAA;AAAE,qBAAA,CAAA;AAC9E,gBAAA;gBACI,OAAO/G,GAAAA,CAAI8C,IAAI,CAAC;oBAAEkE,EAAAA,EAAI;AAAI,iBAAA,CAAA;AAC9B,YAAA,CAAA;AACE,YAAA,MAAMC,aAAYjH,GAAG,EAAA;AACnB,gBAAA,MAAMsF,OAAOlF,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,yCAAA,EAA2C,gBAAA,CAAA;AAC1E,gBAAA,IAAIqD,SAAS,SAAA,EAAW;AACtB,oBAAA,OAAOtF,IAAImG,QAAQ,EAAA;AACzB,gBAAA;AAEI,gBAAA,IAAI,CAACnG,GAAAA,CAAIE,KAAK,CAACH,IAAI,EAAE;oBACnB,OAAOC,GAAAA,CAAIuG,YAAY,CAAC,wBAAA,CAAA;AAC9B,gBAAA;AAEI,gBAAA,MAAM/C,gBAAAA,GAAmBxD,GAAAA,CAAIE,KAAK,CAACuD,OAAO,EAAE9B,EAAAA;AAC5C,gBAAA,MAAMuF,QAAAA,GAAW,MAAM9G,OAAAA,CACpBoB,cAAc,CAAC,mBAAA,CAAA,CACf2F,YAAY,CAACzF,MAAAA,CAAO1B,GAAAA,CAAIE,KAAK,CAACH,IAAI,CAAC4B,EAAE,CAAA,CAAA;gBAExC,MAAMyF,IAAAA,GAAOvH,uBACXqH,QAAAA,CAASG,GAAG,CAAC,CAAC5D,OAAAA,GAAY7D,qBAAqB6D,OAAAA,EAASD,gBAAAA,CAAAA,CAAAA,CAAAA;gBAG1D,OAAOxD,GAAAA,CAAI8C,IAAI,CAAC;AAAEsE,oBAAAA;;AACtB,YAAA,CAAA;AACE,YAAA,MAAME,eAActH,GAAG,EAAA;AACrB,gBAAA,MAAMsF,OAAOlF,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,yCAAA,EAA2C,gBAAA,CAAA;AAC1E,gBAAA,IAAIqD,SAAS,SAAA,EAAW;AACtB,oBAAA,OAAOtF,IAAImG,QAAQ,EAAA;AACzB,gBAAA;AAEI,gBAAA,IAAI,CAACnG,GAAAA,CAAIE,KAAK,CAACH,IAAI,EAAE;oBACnB,OAAOC,GAAAA,CAAIuG,YAAY,CAAC,wBAAA,CAAA;AAC9B,gBAAA;AAEI,gBAAA,MAAM,EAAE1C,SAAS,EAAE,GAAG7D,IAAIiE,MAAM;AAChC,gBAAA,MAAMsD,OAAAA,GAAU,MAAMnH,OAAAA,CACnBoB,cAAc,CAAC,mBAAA,CAAA,CACfsC,iBAAiB,CAACpC,MAAAA,CAAO1B,IAAIE,KAAK,CAACH,IAAI,CAAC4B,EAAE,CAAA,EAAGkC,SAAAA,CAAAA;AAEhD,gBAAA,IAAI,CAAC0D,OAAAA,EAAS;oBACZ,OAAOvH,GAAAA,CAAImG,QAAQ,CAAC,mBAAA,CAAA;AAC1B,gBAAA;gBAEI,OAAOnG,GAAAA,CAAI8C,IAAI,CAAC;AAAEsE,oBAAAA,IAAAA,EAAM;AAAE,iBAAA,CAAA;AAC9B,YAAA,CAAA;YACE,MAAM5B,OAAAA,CAAAA,CAAQxF,GAAG,EAAEwH,IAAI,EAAA;AACrB,gBAAA,MAAMC,SAAAA,GAAY,MAAMrH,OAAAA,CACrB8D,KAAK,CAAC;oBAAE5C,IAAAA,EAAM,QAAA;oBAAUiB,IAAAA,EAAM,mBAAA;oBAAqB6B,GAAAA,EAAK;AAAO,iBAAA,CAAA,CAC/DnC,GAAG,EAAA;gBAEN,MAAM,CAACyF,YAAY,GAAG1H,GAAAA,CAAIgB,OAAO,CAAC2G,GAAG,CAACC,KAAK,CAAC,GAAA,CAAA;AAC5C,gBAAA,MAAM5D,QAAAA,GAAW0D,WAAAA,CAAYE,KAAK,CAAC,WAAA,CAAY,CAAC,CAAA,CAAE,CAACA,KAAK,CAAC,GAAA,CAAI,CAAC,CAAA,CAAE;AAEhE,gBAAA,IAAI,CAACzJ,CAAAA,CAAE8D,GAAG,CAACwF,SAAAA,EAAW;AAACzD,oBAAAA,QAAAA;AAAU,oBAAA;iBAAU,CAAA,EAAG;AAC5C,oBAAA,MAAM,IAAIzE,gBAAAA,CAAiB,2BAAA,CAAA;AACjC,gBAAA;gBAEI,IAAI,CAACa,OAAAA,CAAO4B,MAAM,CAAC6F,MAAM,CAACF,GAAG,CAACG,UAAU,CAAC,MAAA,CAAA,EAAS;oBAChD1H,OAAAA,CAAOuG,GAAG,CAACoB,IAAI,CACb,6NAAA,CAAA;AAER,gBAAA;AAEI,gBAAA,MAAMC,mBAAAA,GAAsB7J,CAAAA,CAAE8D,GAAG,CAACjC,GAAAA,EAAK,gBAAA,CAAA;AACvC,gBAAA,MAAMiI,sBAAAA,GAAyB9J,CAAAA,CAAE8D,GAAG,CAACjC,GAAAA,EAAK,gCAAA,CAAA;AAC1C,gBAAA,MAAMkI,iBAAiBF,mBAAAA,IAAuBC,sBAAAA;AAE9C,gBAAA,IAAIC,mBAAmBrH,SAAAA,EAAW;oBAChC,IAAI;wBACF,MAAM,EAAEsH,QAAAA,EAAUC,gBAAgB,EAAE,GAAGhI,QACpCiI,MAAM,CAAC,mBAAA,CAAA,CACPrG,MAAM,CAAC,UAAA,CAAA;AAEV,wBAAA,MAAMoG,gBAAAA,CAAiBF,cAAAA,EAAgBT,SAAS,CAACzD,QAAAA,CAAS,CAAA;;AAG1DhE,wBAAAA,GAAAA,CAAIyD,OAAO,GAAGzD,GAAAA,CAAIyD,OAAO,IAAI,EAAA;wBAC7BzD,GAAAA,CAAIyD,OAAO,CAAC6E,KAAK,GAAGtI,IAAIyD,OAAO,CAAC6E,KAAK,IAAI,EAAA;AACzCtI,wBAAAA,GAAAA,CAAIyD,OAAO,CAAC6E,KAAK,CAACC,OAAO,GAAG;AAC1B,4BAAA,GAAGvI,GAAAA,CAAIyD,OAAO,CAAC6E,KAAK,CAACC,OAAO;4BAC5BxE,QAAAA,EAAUmE;AACpB,yBAAA;wBACQlI,GAAAA,CAAIE,KAAK,CAACsI,YAAY,GAAG;4BAAEzE,QAAAA,EAAUmE;AAAc,yBAAA;AAC3D,oBAAA,CAAA,CAAQ,OAAM;wBACN,MAAM,IAAI1I,gBAAgB,+BAAA,EAAiC;4BAAEuE,QAAAA,EAAUmE;AAAc,yBAAA,CAAA;AAC7F,oBAAA;AACA,gBAAA;gBAEI,MAAM,EAAEO,4BAA4B,EAAE,GAAGC,iBAAAA,EAAAA;AACzC,gBAAA,MAAMF,YAAAA,GAAeC,4BAAAA,EAAAA;AAErB,gBAAA,OAAOD,aAAaxI,GAAAA,EAAKwH,IAAAA,CAAAA;AAC7B,YAAA,CAAA;AAEE,YAAA,MAAMmB,gBAAe3I,GAAG,EAAA;gBACtB,MAAM,EAAE4E,KAAK,EAAE,GAAG,MAAM1F,0BAAAA,CAA2Bc,GAAAA,CAAIgB,OAAO,CAACI,IAAI,CAAA;AAEnE,gBAAA,MAAMwH,WAAAA,GAAc,MAAMxI,OAAAA,CAAO8D,KAAK,CAAC;oBAAE5C,IAAAA,EAAM,QAAA;oBAAUiB,IAAAA,EAAM;;AAE/D,gBAAA,MAAMsG,aAAAA,GAAgB,MAAMD,WAAAA,CAAY3G,GAAG,CAAC;oBAAEmC,GAAAA,EAAK;;AACnD,gBAAA,MAAMc,gBAAAA,GAAmB,MAAM0D,WAAAA,CAAY3G,GAAG,CAAC;oBAAEmC,GAAAA,EAAK;;;gBAGtD,MAAMrE,IAAAA,GAAO,MAAMK,OAAAA,CAAOmE,EAAA,CACvBC,KAAK,CAAC,gCAAA,CAAA,CACNC,OAAO,CAAC;oBAAEC,KAAAA,EAAO;AAAEE,wBAAAA,KAAAA,EAAOA,MAAMC,WAAW;AAAE;;AAEhD,gBAAA,IAAI,CAAC9E,IAAAA,IAAQA,IAAAA,CAAKsF,OAAO,EAAE;oBACzB,OAAOrF,GAAAA,CAAI8C,IAAI,CAAC;wBAAEkE,EAAAA,EAAI;AAAI,qBAAA,CAAA;AAChC,gBAAA;;gBAGI,MAAM8B,QAAAA,GAAW,MAAMhJ,YAAAA,CAAaC,IAAAA,EAAMC,GAAAA,CAAAA;AAE1C,gBAAA,MAAMkG,qBAAqBjI,MAAAA,CAAO8K,WAAW,CAAC,EAAA,CAAA,CAAIC,QAAQ,CAAC,KAAA,CAAA;AAE3D,gBAAA,MAAMC,wBAAwB9K,CAAAA,CAAE8D,GAAG,CAAC4G,aAAAA,EAAe,0BAA0B,EAAA,CAAA;gBAC7E,MAAMK,SAAAA,GAAY,MAAMvK,UAAAA,CAAW,mBAAA,CAAA,CAAqBwK,QAAQ,CAC9DF,qBAAAA,CAAsBvD,OAAO,EAC7B;AACE0D,oBAAAA,GAAAA,EAAKlE,iBAAiBmE,oBAAoB;AAC1CC,oBAAAA,UAAAA,EAAYlJ,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,oBAAA,CAAA;AAC9BsH,oBAAAA,SAAAA,EAAWnJ,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,mBAAA,CAAA;oBAC7BuH,IAAAA,EAAMV,QAAAA;oBACNW,KAAAA,EAAOvD;AACf,iBAAA,CAAA;gBAGI,MAAMwD,WAAAA,GAAc,MAAM/K,UAAAA,CAAW,mBAAA,CAAA,CAAqBwK,QAAQ,CAChEF,qBAAAA,CAAsBU,MAAM,EAC5B;oBACEH,IAAAA,EAAMV;AACd,iBAAA,CAAA;AAGI,gBAAA,MAAMc,WAAAA,GAAc;AAClBC,oBAAAA,EAAAA,EAAI9J,KAAK6E,KAAK;oBACdkF,IAAAA,EACEb,qBAAAA,CAAsBa,IAAI,CAAClF,KAAK,IAAIqE,sBAAsBa,IAAI,CAACvH,IAAA,GAC3D,CAAA,EAAG0G,qBAAAA,CAAsBa,IAAI,CAACvH,IAAI,CAAC,EAAE,EAAE0G,qBAAAA,CAAsBa,IAAI,CAAClF,KAAK,CAAC,CAAC,CAAA,GACzE/D,SAAAA;AACNkJ,oBAAAA,OAAAA,EAASd,sBAAsBe,cAAc;oBAC7CC,OAAAA,EAASP,WAAAA;oBACTQ,IAAAA,EAAMhB,SAAAA;oBACNiB,IAAAA,EAAMjB;AACZ,iBAAA;;AAGI,gBAAA,MAAMvK,WAAW,MAAA,CAAA,CAAQmH,IAAI,CAAC/F,IAAAA,CAAK4B,EAAE,EAAE;AAAEuE,oBAAAA;;;gBAGzC,MAAM9F,OAAAA,CAAOiI,MAAM,CAAC,OAAA,CAAA,CAAS+B,OAAO,CAAC,OAAA,CAAA,CAAStH,IAAI,CAAC8G,WAAAA,CAAAA;AAEnD5J,gBAAAA,GAAAA,CAAI8C,IAAI,CAAC;oBAAEkE,EAAAA,EAAI;AAAI,iBAAA,CAAA;AACvB,YAAA,CAAA;AAEE,YAAA,MAAMqD,UAASrK,GAAG,EAAA;AAChB,gBAAA,MAAM4I,WAAAA,GAAc,MAAMxI,OAAAA,CAAO8D,KAAK,CAAC;oBAAE5C,IAAAA,EAAM,QAAA;oBAAUiB,IAAAA,EAAM;;AAE/D,gBAAA,MAAM+H,QAAAA,GAAW,MAAM1B,WAAAA,CAAY3G,GAAG,CAAC;oBAAEmC,GAAAA,EAAK;;gBAE9C,IAAI,CAACkG,QAAAA,CAASC,cAAc,EAAE;AAC5B,oBAAA,MAAM,IAAIhL,gBAAAA,CAAiB,uCAAA,CAAA;AACjC,gBAAA;gBAEI,MAAM,EAAE8K,QAAQ,EAAE,GAAGjK,QAAO4B,MAAM,CAACC,GAAG,CAAC,2BAAA,CAAA;AACvC,gBAAA,MAAMuI,iBAAAA,GAAoB;AAAC,oBAAA,UAAA;AAAY,oBAAA,UAAA;AAAY,oBAAA;AAAQ,iBAAA;;gBAG3D,MAAMC,WAAAA,GAAcnM,OAAAA,CAClBD,MAAAA,CAAOmM,iBAAAA,EAAmBjM,OAAAA,CAAQ8L,UAAUK,aAAAA,CAAAA,GAAiBL,QAAAA,CAASK,aAAa,GAAG,EAAE,CAAA,CAAA;;AAI1F,gBAAA,MAAMC,cAAcC,MAAAA,CAAOC,IAAI,CAAC7K,GAAAA,CAAIgB,OAAO,CAACI,IAAI,CAAA,CAAE0J,MAAM,CAAC,CAAC1G,GAAAA,GAAQ,CAACqG,WAAAA,CAAYM,QAAQ,CAAC3G,GAAAA,CAAAA,CAAAA;gBAExF,IAAIuG,WAAAA,CAAY/J,MAAM,GAAG,CAAA,EAAG;;oBAE1B,MAAM,IAAIpB,gBAAgB,CAAC,oBAAoB,EAAEmL,WAAAA,CAAYK,IAAI,CAAC,IAAA,CAAA,CAAA,CAAO,CAAA;AAC/E,gBAAA;AAEI,gBAAA,MAAM/G,MAAAA,GAAS;oBACb,GAAG9F,CAAAA,CAAE8M,IAAI,CAACjL,GAAAA,CAAIgB,OAAO,CAACI,IAAI,EAAEqJ,WAAAA,CAAY;oBACxCzG,QAAAA,EAAU;AAChB,iBAAA;AAEI,gBAAA,MAAM4B,WAAAA,GAAcxF,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,2CAAA,CAAA;AAEtC,gBAAA,MAAMjD,qBAAqBiF,MAAAA,EAAQ2B,WAAAA,CAAAA;gBAEnC,MAAMsF,IAAAA,GAAO,MAAM9K,OAAAA,CAAOmE,EAAA,CACvBC,KAAK,CAAC,gCAAA,CAAA,CACNC,OAAO,CAAC;oBAAEC,KAAAA,EAAO;AAAEpD,wBAAAA,IAAAA,EAAMgJ,SAASa;AAAY;;AAEjD,gBAAA,IAAI,CAACD,IAAAA,EAAM;AACT,oBAAA,MAAM,IAAI3L,gBAAAA,CAAiB,qCAAA,CAAA;AACjC,gBAAA;AAEI,gBAAA,MAAM,EAAEqF,KAAK,EAAEE,QAAQ,EAAEd,QAAQ,EAAE,GAAGC,MAAAA;AAEtC,gBAAA,MAAMmH,gBAAAA,GAAmB;oBACvBzG,GAAAA,EAAK;AACH,wBAAA;AAAEC,4BAAAA,KAAAA,EAAOA,MAAMC,WAAW;AAAE,yBAAA;AAC5B,wBAAA;AAAEC,4BAAAA,QAAAA,EAAUF,MAAMC,WAAW;AAAE,yBAAA;AAC/B,wBAAA;AAAEC,4BAAAA;AAAQ,yBAAA;AACV,wBAAA;4BAAEF,KAAAA,EAAOE;AAAQ;AAClB;AACP,iBAAA;gBAEI,MAAMuG,oBAAAA,GAAuB,MAAMjL,OAAAA,CAAOmE,EAAE,CAACC,KAAK,CAAC,gCAAA,CAAA,CAAkC8G,KAAK,CAAC;oBACzF5G,KAAAA,EAAO;AAAE,wBAAA,GAAG0G,gBAAgB;AAAEpH,wBAAAA;AAAQ;AAC5C,iBAAA,CAAA;AAEI,gBAAA,IAAIqH,uBAAuB,CAAA,EAAG;AAC5B,oBAAA,MAAM,IAAI9L,gBAAAA,CAAiB,qCAAA,CAAA;AACjC,gBAAA;gBAEI,IAAI+K,QAAAA,CAASiB,YAAY,EAAE;oBACzB,MAAMF,oBAAAA,GAAuB,MAAMjL,OAAAA,CAAOmE,EAAE,CAACC,KAAK,CAAC,gCAAA,CAAA,CAAkC8G,KAAK,CAAC;wBACzF5G,KAAAA,EAAO;AAAE,4BAAA,GAAG0G;AAAgB;AACpC,qBAAA,CAAA;AAEM,oBAAA,IAAIC,uBAAuB,CAAA,EAAG;AAC5B,wBAAA,MAAM,IAAI9L,gBAAAA,CAAiB,qCAAA,CAAA;AACnC,oBAAA;AACA,gBAAA;AAEI,gBAAA,MAAMiM,OAAAA,GAAU;AACd,oBAAA,GAAGvH,MAAM;AACTiH,oBAAAA,IAAAA,EAAMA,KAAKvJ,EAAE;AACbiD,oBAAAA,KAAAA,EAAOA,MAAMC,WAAW,EAAA;AACxBC,oBAAAA,QAAAA;oBACAM,SAAAA,EAAW,CAACkF,SAASmB;AAC3B,iBAAA;AAEI,gBAAA,MAAM1L,IAAAA,GAAO,MAAMpB,UAAAA,CAAW,MAAA,CAAA,CAAQ+M,GAAG,CAACF,OAAAA,CAAAA;gBAE1C,MAAMG,aAAAA,GAAgB,MAAM7L,YAAAA,CAAaC,IAAAA,EAAMC,GAAAA,CAAAA;gBAE/C,IAAIsK,QAAAA,CAASmB,kBAAkB,EAAE;oBAC/B,IAAI;wBACF,MAAM9M,UAAAA,CAAW,MAAA,CAAA,CAAQiN,qBAAqB,CAACD,aAAAA,CAAAA;AACvD,oBAAA,CAAA,CAAQ,OAAOjF,GAAAA,EAAK;wBACZtG,OAAAA,CAAOuG,GAAG,CAAClB,KAAK,CAACiB,GAAAA,CAAAA;AACjB,wBAAA,MAAM,IAAInH,gBAAAA,CAAiB,kCAAA,CAAA;AACnC,oBAAA;oBAEM,OAAOS,GAAAA,CAAI8C,IAAI,CAAC;wBAAE/C,IAAAA,EAAM4L;AAAa,qBAAA,CAAA;AAC3C,gBAAA;AAEI,gBAAA,MAAMrG,OAAOlF,OAAAA,CAAO4B,MAAM,CAACC,GAAG,CAAC,yCAAA,EAA2C,gBAAA,CAAA;AAC1E,gBAAA,IAAIqD,SAAS,SAAA,EAAW;oBACtB,MAAM3E,QAAAA,GAAWF,gBAAgBT,GAAAA,CAAIgB,OAAO,CAACI,IAAI,CAAA,IAAKnD,OAAOmF,UAAU,EAAA;AAEvE,oBAAA,MAAM7B,OAAAA,GAAU,MAAMnB,OAAAA,CACnBoB,cAAc,CAAC,mBAAA,CAAA,CACfC,oBAAoB,CAACC,MAAAA,CAAO3B,IAAAA,CAAK4B,EAAE,CAAA,EAAGhB,QAAAA,EAAU;wBAC/CW,IAAAA,EAAM,SAAA;AACNH,wBAAAA,QAAAA,EAAUL,+BAAAA,CAAgCd,GAAAA;AACpD,qBAAA,CAAA;oBAEM,MAAM4B,MAAAA,GAAS,MAAMxB,OAAAA,CAClBoB,cAAc,CAAC,mBAAA,CAAA,CACfK,mBAAmB,CAACN,OAAAA,CAAQO,KAAK,CAAA;AACpC,oBAAA,IAAI,WAAWF,MAAAA,EAAQ;AACrB,wBAAA,MAAM,IAAIrC,gBAAAA,CAAiB,qBAAA,CAAA;AACnC,oBAAA;oBAEM,OAAOS,GAAAA,CAAI8C,IAAI,CAAC;AAAEC,wBAAAA,GAAAA,EAAKnB,OAAOE,KAAK;AAAEkB,wBAAAA,YAAAA,EAAczB,QAAQO,KAAK;wBAAE/B,IAAAA,EAAM4L;AAAa,qBAAA,CAAA;AAC3F,gBAAA;gBAEI,MAAM5I,GAAAA,GAAMpE,WAAW,KAAA,CAAA,CAAO4G,KAAK,CAACpH,CAAAA,CAAE8M,IAAI,CAAClL,IAAAA,EAAM;AAAC,oBAAA;AAAK,iBAAA,CAAA,CAAA;gBACvD,OAAOC,GAAAA,CAAI8C,IAAI,CAAC;AAAEC,oBAAAA,GAAAA;oBAAKhD,IAAAA,EAAM4L;AAAa,iBAAA,CAAA;AAC9C,YAAA,CAAA;AAEE,YAAA,MAAME,iBAAAA,CAAAA,CAAkB7L,GAAG,EAAEwH,IAAI,EAAEsE,UAAU,EAAA;gBAC3C,MAAM,EAAEC,cAAcC,iBAAiB,EAAE,GAAG,MAAM5M,6BAAAA,CAA8BY,IAAIwE,KAAK,CAAA;AAEzF,gBAAA,MAAMyH,cAActN,UAAAA,CAAW,MAAA,CAAA;AAC/B,gBAAA,MAAMuN,aAAavN,UAAAA,CAAW,KAAA,CAAA;AAE9B,gBAAA,MAAM,CAACoB,IAAAA,CAAK,GAAG,MAAMkM,WAAAA,CAAYE,QAAQ,CAAC;oBAAEC,OAAAA,EAAS;AAAEJ,wBAAAA;AAAiB;;AAExE,gBAAA,IAAI,CAACjM,IAAAA,EAAM;AACT,oBAAA,MAAM,IAAIP,eAAAA,CAAgB,eAAA,CAAA;AAChC,gBAAA;AAEI,gBAAA,MAAMyM,WAAAA,CAAYnG,IAAI,CAAC/F,IAAAA,CAAK4B,EAAE,EAAE;oBAAEyD,SAAAA,EAAW,IAAA;oBAAM4G,iBAAAA,EAAmB;;AAEtE,gBAAA,IAAIF,UAAAA,EAAY;AACd9L,oBAAAA,GAAAA,CAAI8C,IAAI,CAAC;wBACPC,GAAAA,EAAKmJ,UAAAA,CAAW3G,KAAK,CAAC;AAAE5D,4BAAAA,EAAAA,EAAI5B,KAAK4B;;wBACjC5B,IAAAA,EAAM,MAAMD,aAAaC,IAAAA,EAAMC,GAAAA;AACvC,qBAAA,CAAA;gBACA,CAAA,MAAW;AACL,oBAAA,MAAMsK,QAAAA,GAAW,MAAMlK,OAAAA,CACpB8D,KAAK,CAAC;wBAAE5C,IAAAA,EAAM,QAAA;wBAAUiB,IAAAA,EAAM,mBAAA;wBAAqB6B,GAAAA,EAAK;AAAU,qBAAA,CAAA,CAClEnC,GAAG,EAAA;AAENjC,oBAAAA,GAAAA,CAAIqM,QAAQ,CAAC/B,QAAAA,CAASgC,8BAA8B,IAAI,GAAA,CAAA;AAC9D,gBAAA;AACA,YAAA,CAAA;AAEE,YAAA,MAAMC,uBAAsBvM,GAAG,EAAA;gBAC7B,MAAM,EAAE4E,KAAK,EAAE,GAAG,MAAM3F,iCAAAA,CAAkCe,GAAAA,CAAIgB,OAAO,CAACI,IAAI,CAAA;gBAE1E,MAAMrB,IAAAA,GAAO,MAAMK,OAAAA,CAAOmE,EAAE,CAACC,KAAK,CAAC,gCAAA,CAAA,CAAkCC,OAAO,CAAC;oBAC3EC,KAAAA,EAAO;AAAEE,wBAAAA,KAAAA,EAAOA,MAAMC,WAAW;AAAE;AACzC,iBAAA,CAAA;AAEI,gBAAA,IAAI,CAAC9E,IAAAA,EAAM;oBACT,OAAOC,GAAAA,CAAI8C,IAAI,CAAC;AAAE8B,wBAAAA,KAAAA;wBAAO4H,IAAAA,EAAM;AAAI,qBAAA,CAAA;AACzC,gBAAA;gBAEI,IAAIzM,IAAAA,CAAKqF,SAAS,EAAE;AAClB,oBAAA,MAAM,IAAI7F,gBAAAA,CAAiB,mBAAA,CAAA;AACjC,gBAAA;gBAEI,IAAIQ,IAAAA,CAAKsF,OAAO,EAAE;AAChB,oBAAA,MAAM,IAAI9F,gBAAAA,CAAiB,cAAA,CAAA;AACjC,gBAAA;gBAEI,MAAMZ,UAAAA,CAAW,MAAA,CAAA,CAAQiN,qBAAqB,CAAC7L,IAAAA,CAAAA;AAE/CC,gBAAAA,GAAAA,CAAI8C,IAAI,CAAC;AACP8B,oBAAAA,KAAAA,EAAO7E,KAAK6E,KAAK;oBACjB4H,IAAAA,EAAM;AACZ,iBAAA,CAAA;AACA,YAAA;SACA,CAAA;;;;;;"}
@@ -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
- _.forEach(strapi.apis, (api, apiName)=>{
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
- _.forEach(strapi.plugins, (plugin, pluginName)=>{
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
- _.forEach(strapi.apis, (api, apiName)=>{
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
- return;
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
- _.forEach(strapi.plugins, (plugin, pluginName)=>{
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
- return;
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":"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"}
@@ -85,7 +85,7 @@ function requireUsersPermissions() {
85
85
  }
86
86
  return action[Symbol.for('__type__')].includes('content-api');
87
87
  };
88
- _.forEach(strapi.apis, (api, apiName)=>{
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
- _.forEach(strapi.plugins, (plugin, pluginName)=>{
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
- _.forEach(strapi.apis, (api, apiName)=>{
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
- return;
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
- _.forEach(strapi.plugins, (plugin, pluginName)=>{
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
- return;
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.0",
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.0",
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": "3.25.76"
72
+ "zod": "4.4.3"
73
73
  },
74
74
  "devDependencies": {
75
- "@strapi/strapi": "5.52.0",
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
- ctx.cookies.set(cookieName, '', { expires: new Date(0) });
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
- _.forEach(strapi.apis, (api, apiName) => {
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
- _.forEach(strapi.plugins, (plugin, pluginName) => {
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
- _.forEach(strapi.apis, (api, apiName) => {
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
- return;
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
- _.forEach(strapi.plugins, (plugin, pluginName) => {
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
- return;
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
  },