From 985116c6f29f87d5c054843c88d58f9749b5ad05 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Tue, 11 Jun 2024 04:04:42 +0200 Subject: [PATCH 1/4] Update user-service.ts --- backend/src/services/user/user-service.ts | 61 ++++++++++++++++++++--- 1 file changed, 53 insertions(+), 8 deletions(-) diff --git a/backend/src/services/user/user-service.ts b/backend/src/services/user/user-service.ts index a82259db6..b2f3910c0 100644 --- a/backend/src/services/user/user-service.ts +++ b/backend/src/services/user/user-service.ts @@ -134,14 +134,59 @@ export const userServiceFactory = ({ ); } } else { - // update current user's username to [email] - await userDAL.updateById( - user.id, - { - username: email - }, - tx - ); + const existingUserWithUsername = await userDAL.findOne({ + username: email + }); + + if (existingUserWithUsername && existingUserWithUsername.id !== user.id) { + // merge users + const mergeUserOrgMembershipSet = new Set( + (await orgMembershipDAL.find({ userId: existingUserWithUsername.id }, { tx })).map((m) => m.orgId) + ); + + const myOrgMemberships = (await orgMembershipDAL.find({ userId: user.id }, { tx })).filter( + (m) => !mergeUserOrgMembershipSet.has(m.orgId) + ); + + const userAliases = await userAliasDAL.find( + { + userId: user.id + }, + { tx } + ); + + // delete current user + await userDAL.deleteById(user.id, tx); + + if (myOrgMemberships.length) { + await orgMembershipDAL.insertMany( + myOrgMemberships.map((orgMembership) => ({ + ...orgMembership, + userId: existingUserWithUsername.id + })), + tx + ); + } + + if (userAliases.length) { + await userAliasDAL.insertMany( + userAliases.map((userAlias) => ({ + ...userAlias, + userId: existingUserWithUsername.id + })), + tx + ); + } + } else { + // update current user's username to [email] + await userDAL.updateById( + user.id, + { + username: email + }, + tx + ); + } } }); }; From 869be3c2739596159e8aa527ee82a35315176a57 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Wed, 12 Jun 2024 00:28:11 +0200 Subject: [PATCH 2/4] Improvements --- backend/src/services/user/user-dal.ts | 9 +++ backend/src/services/user/user-service.ts | 70 ++++------------------- 2 files changed, 19 insertions(+), 60 deletions(-) diff --git a/backend/src/services/user/user-dal.ts b/backend/src/services/user/user-dal.ts index f2da0df0e..d0b03019f 100644 --- a/backend/src/services/user/user-dal.ts +++ b/backend/src/services/user/user-dal.ts @@ -94,6 +94,14 @@ export const userDALFactory = (db: TDbClient) => { } }; + const findMergeableUsers = async (email: string, tx?: Knex) => { + const users = await (tx || db)(TableName.Users).where((builder) => { + void builder.where({ email, isEmailVerified: true }).orWhere({ email, isAccepted: false }); + }); + + return users; + }; + const updateUserEncryptionByUserId = async (userId: string, data: TUserEncryptionKeysUpdate, tx?: Knex) => { try { const [userEnc] = await (tx || db)(TableName.UserEncryptionKey) @@ -154,6 +162,7 @@ export const userDALFactory = (db: TDbClient) => { findUsersByProjectMembershipIds, upsertUserEncryptionKey, createUserEncryption, + findMergeableUsers, findOneUserAction, createUserAction }; diff --git a/backend/src/services/user/user-service.ts b/backend/src/services/user/user-service.ts index b2f3910c0..f04e0b35f 100644 --- a/backend/src/services/user/user-service.ts +++ b/backend/src/services/user/user-service.ts @@ -12,6 +12,7 @@ type TUserServiceFactoryDep = { userDAL: Pick< TUserDALFactory, | "find" + | "findMergeableUsers" | "findOne" | "findById" | "transaction" @@ -86,13 +87,7 @@ export const userServiceFactory = ({ ); // check if there are users with the same email. - const users = await userDAL.find( - { - email, - isEmailVerified: true - }, - { tx } - ); + const users = await userDAL.findMergeableUsers(email, tx); if (users.length > 1) { // merge users @@ -134,59 +129,14 @@ export const userServiceFactory = ({ ); } } else { - const existingUserWithUsername = await userDAL.findOne({ - username: email - }); - - if (existingUserWithUsername && existingUserWithUsername.id !== user.id) { - // merge users - const mergeUserOrgMembershipSet = new Set( - (await orgMembershipDAL.find({ userId: existingUserWithUsername.id }, { tx })).map((m) => m.orgId) - ); - - const myOrgMemberships = (await orgMembershipDAL.find({ userId: user.id }, { tx })).filter( - (m) => !mergeUserOrgMembershipSet.has(m.orgId) - ); - - const userAliases = await userAliasDAL.find( - { - userId: user.id - }, - { tx } - ); - - // delete current user - await userDAL.deleteById(user.id, tx); - - if (myOrgMemberships.length) { - await orgMembershipDAL.insertMany( - myOrgMemberships.map((orgMembership) => ({ - ...orgMembership, - userId: existingUserWithUsername.id - })), - tx - ); - } - - if (userAliases.length) { - await userAliasDAL.insertMany( - userAliases.map((userAlias) => ({ - ...userAlias, - userId: existingUserWithUsername.id - })), - tx - ); - } - } else { - // update current user's username to [email] - await userDAL.updateById( - user.id, - { - username: email - }, - tx - ); - } + // update current user's username to [email] + await userDAL.updateById( + user.id, + { + username: email + }, + tx + ); } }); }; From 7626dbb96eb2b628c15ef66e430d81c9bab4c440 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Wed, 12 Jun 2024 00:55:33 +0200 Subject: [PATCH 3/4] Fix: Permission error page displayed after user sign up if organization enforces SAML auth --- backend/src/services/auth/auth-signup-service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/services/auth/auth-signup-service.ts b/backend/src/services/auth/auth-signup-service.ts index be7f5777d..528cb44fa 100644 --- a/backend/src/services/auth/auth-signup-service.ts +++ b/backend/src/services/auth/auth-signup-service.ts @@ -231,7 +231,7 @@ export const authSignupServiceFactory = ({ const accessToken = jwt.sign( { - authMethod: AuthMethod.EMAIL, + authMethod: authMethod || AuthMethod.EMAIL, authTokenType: AuthTokenType.ACCESS_TOKEN, userId: updateduser.info.id, tokenVersionId: tokenSession.id, @@ -244,7 +244,7 @@ export const authSignupServiceFactory = ({ const refreshToken = jwt.sign( { - authMethod: AuthMethod.EMAIL, + authMethod: authMethod || AuthMethod.EMAIL, authTokenType: AuthTokenType.REFRESH_TOKEN, userId: updateduser.info.id, tokenVersionId: tokenSession.id, From cb9dabe03f0bf6f40dd22e70b278db7cb22b356e Mon Sep 17 00:00:00 2001 From: Tuan Dang Date: Tue, 11 Jun 2024 18:41:35 -0700 Subject: [PATCH 4/4] Delete unaccepted users upon merge user op --- backend/src/services/user/user-dal.ts | 9 --------- backend/src/services/user/user-service.ts | 21 ++++++++++++++++++--- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/backend/src/services/user/user-dal.ts b/backend/src/services/user/user-dal.ts index d0b03019f..f2da0df0e 100644 --- a/backend/src/services/user/user-dal.ts +++ b/backend/src/services/user/user-dal.ts @@ -94,14 +94,6 @@ export const userDALFactory = (db: TDbClient) => { } }; - const findMergeableUsers = async (email: string, tx?: Knex) => { - const users = await (tx || db)(TableName.Users).where((builder) => { - void builder.where({ email, isEmailVerified: true }).orWhere({ email, isAccepted: false }); - }); - - return users; - }; - const updateUserEncryptionByUserId = async (userId: string, data: TUserEncryptionKeysUpdate, tx?: Knex) => { try { const [userEnc] = await (tx || db)(TableName.UserEncryptionKey) @@ -162,7 +154,6 @@ export const userDALFactory = (db: TDbClient) => { findUsersByProjectMembershipIds, upsertUserEncryptionKey, createUserEncryption, - findMergeableUsers, findOneUserAction, createUserAction }; diff --git a/backend/src/services/user/user-service.ts b/backend/src/services/user/user-service.ts index f04e0b35f..693078fbd 100644 --- a/backend/src/services/user/user-service.ts +++ b/backend/src/services/user/user-service.ts @@ -12,7 +12,6 @@ type TUserServiceFactoryDep = { userDAL: Pick< TUserDALFactory, | "find" - | "findMergeableUsers" | "findOne" | "findById" | "transaction" @@ -22,6 +21,7 @@ type TUserServiceFactoryDep = { | "findOneUserAction" | "createUserAction" | "findUserEncKeyByUserId" + | "delete" >; userAliasDAL: Pick; orgMembershipDAL: Pick; @@ -86,8 +86,14 @@ export const userServiceFactory = ({ tx ); - // check if there are users with the same email. - const users = await userDAL.findMergeableUsers(email, tx); + // check if there are verified users with the same email. + const users = await userDAL.find( + { + email, + isEmailVerified: true + }, + { tx } + ); if (users.length > 1) { // merge users @@ -129,6 +135,15 @@ export const userServiceFactory = ({ ); } } else { + await userDAL.delete( + { + email, + isAccepted: false, + isEmailVerified: false + }, + tx + ); + // update current user's username to [email] await userDAL.updateById( user.id,