mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-16 16:30:15 +01:00
Some checks failed
Docker Dev Branch Images Build / build (Dockerfile, lc-dev, node) (push) Has been cancelled
Docker Dev Branch Images Build / build (Dockerfile.multi, lc-dev-api, api-build) (push) Has been cancelled
Docker Dev Images Build / build (Dockerfile, librechat-dev, node) (push) Has been cancelled
Docker Dev Images Build / build (Dockerfile.multi, librechat-dev-api, api-build) (push) Has been cancelled
Sync Locize Translations & Create Translation PR / Sync Translation Keys with Locize (push) Has been cancelled
Sync Locize Translations & Create Translation PR / Create Translation PR on Version Published (push) Has been cancelled
* chore: move domain related functions to `packages/api` * fix: isEmailDomainAllowed for case-insensitive domain matching - Added tests to validate case-insensitive matching for email domains in various scenarios. - Updated isEmailDomainAllowed function to convert email domains to lowercase for consistent comparison. - Improved handling of null/undefined entries in allowedDomains. * ci: Mock isEmailDomainAllowed in samlStrategy tests - Added a mock implementation for isEmailDomainAllowed to return true in samlStrategy tests, ensuring consistent behavior during test execution. * ci: Update import of isEmailDomainAllowed in ldapStrategy tests - Changed the import of isEmailDomainAllowed from the domains service to the api package for consistency and to reflect recent refactoring.
72 lines
2.5 KiB
JavaScript
72 lines
2.5 KiB
JavaScript
const { logger } = require('@librechat/data-schemas');
|
|
const { ErrorTypes } = require('librechat-data-provider');
|
|
const { isEnabled, isEmailDomainAllowed } = require('@librechat/api');
|
|
const { createSocialUser, handleExistingUser } = require('./process');
|
|
const { getAppConfig } = require('~/server/services/Config');
|
|
const { findUser } = require('~/models');
|
|
|
|
const socialLogin =
|
|
(provider, getProfileDetails) => async (accessToken, refreshToken, idToken, profile, cb) => {
|
|
try {
|
|
const { email, id, avatarUrl, username, name, emailVerified } = getProfileDetails({
|
|
idToken,
|
|
profile,
|
|
});
|
|
|
|
const appConfig = await getAppConfig();
|
|
|
|
if (!isEmailDomainAllowed(email, appConfig?.registration?.allowedDomains)) {
|
|
logger.error(
|
|
`[${provider}Login] Authentication blocked - email domain not allowed [Email: ${email}]`,
|
|
);
|
|
const error = new Error(ErrorTypes.AUTH_FAILED);
|
|
error.code = ErrorTypes.AUTH_FAILED;
|
|
error.message = 'Email domain not allowed';
|
|
return cb(error);
|
|
}
|
|
|
|
const existingUser = await findUser({ email: email.trim() });
|
|
|
|
if (existingUser?.provider === provider) {
|
|
await handleExistingUser(existingUser, avatarUrl, appConfig);
|
|
return cb(null, existingUser);
|
|
} else if (existingUser) {
|
|
logger.info(
|
|
`[${provider}Login] User ${email} already exists with provider ${existingUser.provider}`,
|
|
);
|
|
const error = new Error(ErrorTypes.AUTH_FAILED);
|
|
error.code = ErrorTypes.AUTH_FAILED;
|
|
error.provider = existingUser.provider;
|
|
return cb(error);
|
|
}
|
|
|
|
const ALLOW_SOCIAL_REGISTRATION = isEnabled(process.env.ALLOW_SOCIAL_REGISTRATION);
|
|
if (!ALLOW_SOCIAL_REGISTRATION) {
|
|
logger.error(
|
|
`[${provider}Login] Registration blocked - social registration is disabled [Email: ${email}]`,
|
|
);
|
|
const error = new Error(ErrorTypes.AUTH_FAILED);
|
|
error.code = ErrorTypes.AUTH_FAILED;
|
|
error.message = 'Social registration is disabled';
|
|
return cb(error);
|
|
}
|
|
|
|
const newUser = await createSocialUser({
|
|
email,
|
|
avatarUrl,
|
|
provider,
|
|
providerKey: `${provider}Id`,
|
|
providerId: id,
|
|
username,
|
|
name,
|
|
emailVerified,
|
|
appConfig,
|
|
});
|
|
return cb(null, newUser);
|
|
} catch (err) {
|
|
logger.error(`[${provider}Login]`, err);
|
|
return cb(err);
|
|
}
|
|
};
|
|
|
|
module.exports = socialLogin;
|