| import { logger } from '@librechat/data-schemas'; |
| import { ErrorTypes } from 'librechat-data-provider'; |
| import type { IUser, UserMethods } from '@librechat/data-schemas'; |
|
|
| |
| |
| |
| |
| export async function findOpenIDUser({ |
| openidId, |
| findUser, |
| email, |
| idOnTheSource, |
| strategyName = 'openid', |
| }: { |
| openidId: string; |
| findUser: UserMethods['findUser']; |
| email?: string; |
| idOnTheSource?: string; |
| strategyName?: string; |
| }): Promise<{ user: IUser | null; error: string | null; migration: boolean }> { |
| const primaryConditions = []; |
|
|
| if (openidId && typeof openidId === 'string') { |
| primaryConditions.push({ openidId }); |
| } |
|
|
| if (idOnTheSource && typeof idOnTheSource === 'string') { |
| primaryConditions.push({ idOnTheSource }); |
| } |
|
|
| let user = null; |
| if (primaryConditions.length > 0) { |
| user = await findUser({ $or: primaryConditions }); |
| } |
| if (!user && email) { |
| user = await findUser({ email }); |
| logger.warn( |
| `[${strategyName}] user ${user ? 'found' : 'not found'} with email: ${email} for openidId: ${openidId}`, |
| ); |
|
|
| |
| if (user && user.provider && user.provider !== 'openid') { |
| logger.warn( |
| `[${strategyName}] Attempted OpenID login by user ${user.email}, was registered with "${user.provider}" provider`, |
| ); |
| return { user: null, error: ErrorTypes.AUTH_FAILED, migration: false }; |
| } |
|
|
| |
| if (user && !user.openidId) { |
| logger.info( |
| `[${strategyName}] Preparing user ${user.email} for migration to OpenID with sub: ${openidId}`, |
| ); |
| user.provider = 'openid'; |
| user.openidId = openidId; |
| return { user, error: null, migration: true }; |
| } |
| } |
|
|
| return { user, error: null, migration: false }; |
| } |
|
|