diff --git a/backend/src/ee/services/ldap-config/ldap-config-service.ts b/backend/src/ee/services/ldap-config/ldap-config-service.ts index eee9487a7..b1dfdec70 100644 --- a/backend/src/ee/services/ldap-config/ldap-config-service.ts +++ b/backend/src/ee/services/ldap-config/ldap-config-service.ts @@ -329,7 +329,7 @@ export const ldapConfigServiceFactory = ({ if (user) { await userDAL.transaction(async (tx) => { - const [orgMembership] = await orgDAL.findMembership({ userId: user.id, orgId }, { tx }); + const [orgMembership] = await orgDAL.findMembership({ userId: user.id }, { tx }); if (!orgMembership) { await orgDAL.createMembership( { @@ -366,7 +366,7 @@ export const ldapConfigServiceFactory = ({ await orgDAL.createMembership({ orgId, role: OrgMembershipRole.Member, - status: OrgMembershipStatus.Invited // should this be invited? + status: OrgMembershipStatus.Invited }); return newUser; }); @@ -378,6 +378,7 @@ export const ldapConfigServiceFactory = ({ { authTokenType: AuthTokenType.PROVIDER_TOKEN, userId: user.id, + username: user.username, firstName, lastName, organizationName: organization.name, diff --git a/backend/src/ee/services/saml-config/saml-config-service.ts b/backend/src/ee/services/saml-config/saml-config-service.ts index a293679d9..7b0e52be2 100644 --- a/backend/src/ee/services/saml-config/saml-config-service.ts +++ b/backend/src/ee/services/saml-config/saml-config-service.ts @@ -357,7 +357,7 @@ export const samlConfigServiceFactory = ({ { authTokenType: AuthTokenType.PROVIDER_TOKEN, userId: user.id, - email: user.email, + username: user.username, firstName, lastName, organizationName: organization.name, diff --git a/backend/src/server/routes/v3/login-router.ts b/backend/src/server/routes/v3/login-router.ts index 0cda8e5ff..240aa21b1 100644 --- a/backend/src/server/routes/v3/login-router.ts +++ b/backend/src/server/routes/v3/login-router.ts @@ -12,7 +12,7 @@ export const registerLoginRouter = async (server: FastifyZodProvider) => { }, schema: { body: z.object({ - email: z.string().email().trim(), + email: z.string().trim(), providerAuthToken: z.string().trim().optional(), clientPublicKey: z.string().trim() }), @@ -42,7 +42,7 @@ export const registerLoginRouter = async (server: FastifyZodProvider) => { }, schema: { body: z.object({ - email: z.string().email().trim(), + email: z.string().trim(), providerAuthToken: z.string().trim().optional(), clientProof: z.string().trim() }), diff --git a/backend/src/server/routes/v3/signup-router.ts b/backend/src/server/routes/v3/signup-router.ts index 5892f0f7e..220eb6233 100644 --- a/backend/src/server/routes/v3/signup-router.ts +++ b/backend/src/server/routes/v3/signup-router.ts @@ -88,7 +88,7 @@ export const registerSignupRouter = async (server: FastifyZodProvider) => { }, schema: { body: z.object({ - email: z.string().email().trim(), + email: z.string().trim(), firstName: z.string().trim(), lastName: z.string().trim().optional(), protectedKey: z.string().trim(), diff --git a/backend/src/services/auth/auth-fns.ts b/backend/src/services/auth/auth-fns.ts index 31675a599..0b78ab438 100644 --- a/backend/src/services/auth/auth-fns.ts +++ b/backend/src/services/auth/auth-fns.ts @@ -5,13 +5,14 @@ import { BadRequestError, UnauthorizedError } from "@app/lib/errors"; import { AuthModeProviderJwtTokenPayload, AuthModeProviderSignUpTokenPayload, AuthTokenType } from "./auth-type"; -export const validateProviderAuthToken = (providerToken: string, email?: string) => { +export const validateProviderAuthToken = (providerToken: string, username?: string) => { if (!providerToken) throw new UnauthorizedError(); const appCfg = getConfig(); const decodedToken = jwt.verify(providerToken, appCfg.AUTH_SECRET) as AuthModeProviderJwtTokenPayload; if (decodedToken.authTokenType !== AuthTokenType.PROVIDER_TOKEN) throw new UnauthorizedError(); - if (decodedToken.email !== email) throw new Error("Invalid auth credentials"); + + if (decodedToken.username !== username) throw new Error("Invalid auth credentials"); if (decodedToken.organizationId) { return { orgId: decodedToken.organizationId }; diff --git a/backend/src/services/auth/auth-login-service.ts b/backend/src/services/auth/auth-login-service.ts index 50b99677e..bf306415c 100644 --- a/backend/src/services/auth/auth-login-service.ts +++ b/backend/src/services/auth/auth-login-service.ts @@ -133,7 +133,7 @@ export const authLoginServiceFactory = ({ userDAL, tokenService, smtpService }: providerAuthToken, clientPublicKey }: TLoginGenServerPublicKeyDTO) => { - const userEnc = await userDAL.findUserEncKeyByEmail(email); + const userEnc = await userDAL.findUserEncKeyByUsername(email); if (!userEnc || (userEnc && !userEnc.isAccepted)) { throw new Error("Failed to find user"); } @@ -160,7 +160,7 @@ export const authLoginServiceFactory = ({ userDAL, tokenService, smtpService }: ip, userAgent }: TLoginClientProofDTO) => { - const userEnc = await userDAL.findUserEncKeyByEmail(email); + const userEnc = await userDAL.findUserEncKeyByUsername(email); if (!userEnc) throw new Error("Failed to find user"); const cfg = getConfig(); @@ -301,7 +301,8 @@ export const authLoginServiceFactory = ({ userDAL, tokenService, smtpService }: { authTokenType: AuthTokenType.PROVIDER_TOKEN, userId: user.id, - email: user.email, + // email: user.email, + username: user.username, firstName: user.firstName, lastName: user.lastName, authMethod, diff --git a/backend/src/services/auth/auth-signup-service.ts b/backend/src/services/auth/auth-signup-service.ts index 4a5384d4e..532626d88 100644 --- a/backend/src/services/auth/auth-signup-service.ts +++ b/backend/src/services/auth/auth-signup-service.ts @@ -115,14 +115,14 @@ export const authSignupServiceFactory = ({ userAgent, authorization }: TCompleteAccountSignupDTO) => { - const user = await userDAL.findUserByEmail(email); + const user = await userDAL.findOne({ username: email }); if (!user || (user && user.isAccepted)) { throw new Error("Failed to complete account for complete user"); } let organizationId; if (providerAuthToken) { - const { orgId } = validateProviderAuthToken(providerAuthToken, user.email as string); + const { orgId } = validateProviderAuthToken(providerAuthToken, user.username); organizationId = orgId; } else { validateSignUpAuthorization(authorization, user.id); @@ -152,7 +152,7 @@ export const authSignupServiceFactory = ({ if (!organizationId) { await orgService.createOrganization({ userId: user.id, - userEmail: user.email, + userEmail: user.email ?? user.username ?? "", // TODO: look into orgName: organizationName }); } diff --git a/backend/src/services/auth/auth-type.ts b/backend/src/services/auth/auth-type.ts index 56097e6ac..57c86158f 100644 --- a/backend/src/services/auth/auth-type.ts +++ b/backend/src/services/auth/auth-type.ts @@ -62,7 +62,7 @@ export type AuthModeRefreshJwtTokenPayload = { export type AuthModeProviderJwtTokenPayload = { authTokenType: AuthTokenType.PROVIDER_TOKEN; - email: string; + username: string; organizationId?: string; }; diff --git a/backend/src/services/user/user-dal.ts b/backend/src/services/user/user-dal.ts index 2c89b9c4d..c5a766986 100644 --- a/backend/src/services/user/user-dal.ts +++ b/backend/src/services/user/user-dal.ts @@ -20,10 +20,10 @@ export const userDALFactory = (db: TDbClient) => { // USER ENCRYPTION FUNCTIONS // ------------------------- - const findUserEncKeyByEmail = async (email: string) => { + const findUserEncKeyByUsername = async (username: string) => { try { return await db(TableName.Users) - .where({ email, isGhost: false }) + .where({ username, isGhost: false }) .join(TableName.UserEncryptionKey, `${TableName.Users}.id`, `${TableName.UserEncryptionKey}.userId`) .first(); } catch (error) { @@ -119,7 +119,7 @@ export const userDALFactory = (db: TDbClient) => { return { ...userOrm, findUserByEmail, - findUserEncKeyByEmail, + findUserEncKeyByUsername, findUserEncKeyByUserId, updateUserEncryptionByUserId, findUserByProjectMembershipId, diff --git a/frontend/src/views/Login/LoginSSO.tsx b/frontend/src/views/Login/LoginSSO.tsx index 8140b872f..ea26ca7d6 100644 --- a/frontend/src/views/Login/LoginSSO.tsx +++ b/frontend/src/views/Login/LoginSSO.tsx @@ -15,7 +15,7 @@ export const LoginSSO = ({ providerAuthToken }: Props) => { const [password, setPassword] = useState(""); const { - email, + username, isUserCompleted } = jwt_decode(providerAuthToken) as any; @@ -35,7 +35,7 @@ export const LoginSSO = ({ providerAuthToken }: Props) => { return ( { return ( ); diff --git a/frontend/src/views/Org/MembersPage/components/OrgMembersTab/components/OrgMembersSection/OrgMembersSection.tsx b/frontend/src/views/Org/MembersPage/components/OrgMembersTab/components/OrgMembersSection/OrgMembersSection.tsx index c73376aba..65346533e 100644 --- a/frontend/src/views/Org/MembersPage/components/OrgMembersTab/components/OrgMembersSection/OrgMembersSection.tsx +++ b/frontend/src/views/Org/MembersPage/components/OrgMembersTab/components/OrgMembersSection/OrgMembersSection.tsx @@ -113,8 +113,8 @@ export const OrgMembersSection = () => { /> handlePopUpToggle("removeMember", isOpen)} deleteKey="confirm" diff --git a/frontend/src/views/Org/MembersPage/components/OrgMembersTab/components/OrgMembersSection/OrgMembersTable.tsx b/frontend/src/views/Org/MembersPage/components/OrgMembersTab/components/OrgMembersSection/OrgMembersTable.tsx index b0246768c..011f67de7 100644 --- a/frontend/src/views/Org/MembersPage/components/OrgMembersTab/components/OrgMembersSection/OrgMembersTable.tsx +++ b/frontend/src/views/Org/MembersPage/components/OrgMembersTab/components/OrgMembersSection/OrgMembersTable.tsx @@ -41,7 +41,7 @@ type Props = { popUpName: keyof UsePopUpState<["removeMember", "upgradePlan"]>, data?: { orgMembershipId?: string; - email?: string; + username?: string; description?: string; } ) => void; @@ -174,6 +174,7 @@ export const OrgMembersTable = ({ handlePopUpOpen, setCompleteInviteLink }: Prop filterdUser?.map( ({ user: u, inviteEmail, role, roleId, id: orgMembershipId, status }) => { const name = u && u.firstName ? `${u.firstName} ${u.lastName}` : "-"; + const email = u?.email || inviteEmail; const username = u?.username ?? inviteEmail ?? "-"; return ( @@ -207,7 +208,7 @@ export const OrgMembersTable = ({ handlePopUpOpen, setCompleteInviteLink }: Prop ))} )} - {(status === "invited" || status === "verified") && + {(status === "invited" || status === "verified") && email && serverDetails?.emailConfigured && (