X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fauth%2Foauth-model.ts;h=d9cf328272cf42792e7d3cb9c2102bf5b98100f5;hb=927fa4b11f692174d6296aa096d7a74bacdeea8b;hp=c74869ee25cc8e70a1b67587503ef47bdf7d43c8;hpb=f43db2f46ee50bacb402a6ef42d768694c2bc9a8;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/auth/oauth-model.ts b/server/lib/auth/oauth-model.ts index c74869ee2..d9cf32827 100644 --- a/server/lib/auth/oauth-model.ts +++ b/server/lib/auth/oauth-model.ts @@ -1,17 +1,18 @@ -import { AccessDeniedError } from 'oauth2-server' +import express from 'express' +import { AccessDeniedError } from '@node-oauth/oauth2-server' import { PluginManager } from '@server/lib/plugins/plugin-manager' -import { ActorModel } from '@server/models/activitypub/actor' +import { ActorModel } from '@server/models/actor/actor' import { MOAuthClient } from '@server/types/models' import { MOAuthTokenUser } from '@server/types/models/oauth/oauth-token' import { MUser } from '@server/types/models/user/user' -import { UserAdminFlag } from '@shared/models/users/user-flag.model' +import { pick } from '@shared/core-utils' import { UserRole } from '@shared/models/users/user-role' import { logger } from '../../helpers/logger' import { CONFIG } from '../../initializers/config' -import { UserModel } from '../../models/account/user' import { OAuthClientModel } from '../../models/oauth/oauth-client' import { OAuthTokenModel } from '../../models/oauth/oauth-token' -import { createUserAccountAndChannelAndPlaylist } from '../user' +import { UserModel } from '../../models/user/user' +import { buildUser, createUserAccountAndChannelAndPlaylist } from '../user' import { TokensCache } from './tokens-cache' type TokenInfo = { @@ -97,7 +98,14 @@ async function getUser (usernameOrEmail?: string, password?: string, bypassLogin // Then we just go through a regular login process if (user.pluginAuth !== null) { // This user does not belong to this plugin, skip it - if (user.pluginAuth !== bypassLogin.pluginName) return null + if (user.pluginAuth !== bypassLogin.pluginName) { + logger.info( + 'Cannot bypass oauth login by plugin %s because %s has another plugin auth method (%s).', + bypassLogin.pluginName, bypassLogin.user.email, user.pluginAuth + ) + + return null + } checkUserValidityOrThrow(user) @@ -108,6 +116,7 @@ async function getUser (usernameOrEmail?: string, password?: string, bypassLogin logger.debug('Getting User (username/email: ' + usernameOrEmail + ', password: ******).') const user = await UserModel.loadByUsernameOrEmail(usernameOrEmail) + // If we don't find the user, or if the user belongs to a plugin if (!user || user.pluginAuth !== null || !password) return null @@ -125,15 +134,20 @@ async function getUser (usernameOrEmail?: string, password?: string, bypassLogin async function revokeToken ( tokenInfo: { refreshToken: string }, - explicitLogout?: boolean + options: { + req?: express.Request + explicitLogout?: boolean + } = {} ): Promise<{ success: boolean, redirectUrl?: string }> { + const { req, explicitLogout } = options + const token = await OAuthTokenModel.getByRefreshTokenAndPopulateUser(tokenInfo.refreshToken) if (token) { let redirectUrl: string if (explicitLogout === true && token.User.pluginAuth && token.authName) { - redirectUrl = await PluginManager.Instance.onLogout(token.User.pluginAuth, token.authName, token.User, this.request) + redirectUrl = await PluginManager.Instance.onLogout(token.User.pluginAuth, token.authName, token.User, req) } TokensCache.Instance.clearCacheByToken(token.accessToken) @@ -215,18 +229,13 @@ async function createUserFromExternal (pluginAuth: string, options: { const actor = await ActorModel.loadLocalByName(options.username) if (actor) return null - const userToCreate = new UserModel({ - username: options.username, + const userToCreate = buildUser({ + ...pick(options, [ 'username', 'email', 'role' ]), + + emailVerified: null, password: null, - email: options.email, - nsfwPolicy: CONFIG.INSTANCE.DEFAULT_NSFW_POLICY, - autoPlayVideo: true, - role: options.role, - videoQuota: CONFIG.USER.VIDEO_QUOTA, - videoQuotaDaily: CONFIG.USER.VIDEO_QUOTA_DAILY, - adminFlags: UserAdminFlag.NONE, pluginAuth - }) as MUser + }) const { user } = await createUserAccountAndChannelAndPlaylist({ userToCreate,