From 70a22845448369fe354cb87d268a2685bfd388f5 Mon Sep 17 00:00:00 2001 From: Abdul Qadir Date: Tue, 5 Dec 2023 20:23:48 +0500 Subject: [PATCH 1/2] Link accounts based on common authid(email) --- .../user/repository/UserRepository.java | 2 ++ .../domain/user/service/UserService.java | 6 +++- .../domain/user/service/UserServiceImpl.java | 18 ++++++++++- .../service/AuthenticationApiServiceImpl.java | 30 +++++++++++++++---- 4 files changed, 48 insertions(+), 8 deletions(-) diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/repository/UserRepository.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/repository/UserRepository.java index 757453909..67c4ec130 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/repository/UserRepository.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/repository/UserRepository.java @@ -16,6 +16,8 @@ public interface UserRepository extends ReactiveMongoRepository { Mono findByConnections_SourceAndConnections_RawId(String source, String rawId); + Flux findByConnections_RawId(String rawId); + Flux findByConnections_SourceAndConnections_RawIdIn(String source, Collection rawIds); } diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserService.java index b93e37594..5aa33151b 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserService.java @@ -32,7 +32,9 @@ public interface UserService { Mono bindEmail(User user, String email); - Mono findByAuthUser(AuthUser authUser); + Mono findByAuthUserSourceAndRawId(AuthUser authUser); + + Flux findByAuthUserRawId(AuthUser authUser); Mono createNewUserByAuthUser(AuthUser authUser); @@ -40,6 +42,8 @@ public interface UserService { Mono addNewConnection(String userId, Connection connection); + Mono addNewConnectionAndReturnUser(String userId, Connection connection); + Mono deleteProfilePhoto(User visitor); Mono updatePassword(String userId, String oldPassword, String newPassword); diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java index 1ea542e30..4d069b052 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java @@ -111,6 +111,10 @@ public Mono findBySourceAndId(String source, String sourceUuid) { return repository.findByConnections_SourceAndConnections_RawId(source, sourceUuid); } + public Flux findByRawId(String rawUuid) { + return repository.findByConnections_RawId(rawUuid); + } + @Override public Mono saveProfilePhoto(Part filePart, User user) { String prevAvatar = ObjectUtils.defaultIfNull(user.getAvatar(), ""); @@ -143,10 +147,15 @@ public Mono update(String id, User updatedUser) { } @Override - public Mono findByAuthUser(AuthUser authUser) { + public Mono findByAuthUserSourceAndRawId(AuthUser authUser) { return findBySourceAndId(authUser.getSource(), authUser.getUid()); } + @Override + public Flux findByAuthUserRawId(AuthUser authUser) { + return findByRawId(authUser.getUid()); + } + @Override public Mono createNewUserByAuthUser(AuthUser authUser) { User newUser = new User(); @@ -198,6 +207,13 @@ public Mono addNewConnection(String userId, Connection connection) { .then(Mono.just(true)); } + @Override + public Mono addNewConnectionAndReturnUser(String userId, Connection connection) { + return findById(userId) + .doOnNext(user -> user.getConnections().add(connection)) + .flatMap(repository::save); + } + @Override public Mono deleteProfilePhoto(User visitor) { String userAvatar = visitor.getAvatar(); diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java index 20b833415..145df2904 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java @@ -155,14 +155,26 @@ public Mono loginOrRegister(AuthUser authUser, ServerWebExchange exchange, } private Mono updateOrCreateUser(AuthUser authUser) { - return findByAuthUser(authUser) - .flatMap(findByAuthUser -> { - if (findByAuthUser.userExist()) { - User user = findByAuthUser.user(); + return findByAuthUserSourceAndRawId(authUser).zipWith(findByAuthUserRawId(authUser)) + .flatMap(tuple -> { + + FindByAuthUser findByAuthUserFirst = tuple.getT1(); + FindByAuthUser findByAuthUserSecond = tuple.getT2(); + + // If the user is found for the same auth source and id, just update the connection + if (findByAuthUserFirst.userExist()) { + User user = findByAuthUserFirst.user(); updateConnection(authUser, user); return userService.update(user.getId(), user); } + //If the user connection is not found with login id, but the user is + // found for the same id in some different connection, then just add a new connection to the user + if(findByAuthUserSecond.userExist()) { + User user = findByAuthUserSecond.user(); + return userService.addNewConnectionAndReturnUser(user.getId(), authUser.toAuthConnection()); + } + // if the user is logging/registering via OAuth provider for the first time, // but is not anonymous, then just add a new connection @@ -183,12 +195,18 @@ private Mono updateOrCreateUser(AuthUser authUser) { }); } - protected Mono findByAuthUser(AuthUser authUser) { - return userService.findByAuthUser(authUser) + protected Mono findByAuthUserSourceAndRawId(AuthUser authUser) { + return userService.findByAuthUserSourceAndRawId(authUser) .map(user -> new FindByAuthUser(true, user)) .defaultIfEmpty(new FindByAuthUser(false, null)); } + protected Mono findByAuthUserRawId(AuthUser authUser) { + return userService.findByAuthUserRawId(authUser).collectList() + .map(user -> new FindByAuthUser(true, user.stream().findFirst().get())) + .defaultIfEmpty(new FindByAuthUser(false, null)); + } + /** * Update the connection after re-authenticating */ From afa310432ee0eb79c21c8095c5f672b9e8871ac9 Mon Sep 17 00:00:00 2001 From: Abdul Qadir Date: Wed, 6 Dec 2023 18:23:30 +0500 Subject: [PATCH 2/2] Finalize fixes --- .../lowcoder/domain/user/repository/UserRepository.java | 3 +-- .../org/lowcoder/domain/user/service/UserService.java | 2 +- .../org/lowcoder/domain/user/service/UserServiceImpl.java | 8 ++++---- .../request/oauth2/request/KeycloakRequest.java | 2 +- .../service/AuthenticationApiServiceImpl.java | 4 ++-- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/repository/UserRepository.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/repository/UserRepository.java index 67c4ec130..e3dfd72f9 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/repository/UserRepository.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/repository/UserRepository.java @@ -16,8 +16,7 @@ public interface UserRepository extends ReactiveMongoRepository { Mono findByConnections_SourceAndConnections_RawId(String source, String rawId); - Flux findByConnections_RawId(String rawId); - Flux findByConnections_SourceAndConnections_RawIdIn(String source, Collection rawIds); + Mono findByName(String rawUuid); } diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserService.java index 5aa33151b..aebed82ef 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserService.java @@ -34,7 +34,7 @@ public interface UserService { Mono findByAuthUserSourceAndRawId(AuthUser authUser); - Flux findByAuthUserRawId(AuthUser authUser); + Mono findByAuthUserRawId(AuthUser authUser); Mono createNewUserByAuthUser(AuthUser authUser); diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java index 4d069b052..49fc9f478 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java @@ -111,8 +111,8 @@ public Mono findBySourceAndId(String source, String sourceUuid) { return repository.findByConnections_SourceAndConnections_RawId(source, sourceUuid); } - public Flux findByRawId(String rawUuid) { - return repository.findByConnections_RawId(rawUuid); + public Mono findByName(String rawUuid) { + return repository.findByName(rawUuid); } @Override @@ -152,8 +152,8 @@ public Mono findByAuthUserSourceAndRawId(AuthUser authUser) { } @Override - public Flux findByAuthUserRawId(AuthUser authUser) { - return findByRawId(authUser.getUid()); + public Mono findByAuthUserRawId(AuthUser authUser) { + return findByName(authUser.getUsername()); } @Override diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/request/oauth2/request/KeycloakRequest.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/request/oauth2/request/KeycloakRequest.java index 31dcd650d..7aeecd073 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/request/oauth2/request/KeycloakRequest.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/request/oauth2/request/KeycloakRequest.java @@ -116,7 +116,7 @@ protected Mono getAuthUser(AuthToken authToken) { } AuthUser authUser = AuthUser.builder() .uid(MapUtils.getString(map, "sub")) - .username(MapUtils.getString(map, "name")) + .username(MapUtils.getString(map, "email")) .rawUserInfo(map) .build(); return Mono.just(authUser); diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java index c986379b3..966b86bb7 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java @@ -208,8 +208,8 @@ protected Mono findByAuthUserSourceAndRawId(AuthUser authUser) { } protected Mono findByAuthUserRawId(AuthUser authUser) { - return userService.findByAuthUserRawId(authUser).collectList() - .map(user -> new FindByAuthUser(true, user.stream().findFirst().get())) + return userService.findByAuthUserRawId(authUser) + .map(user -> new FindByAuthUser(true, user)) .defaultIfEmpty(new FindByAuthUser(false, null)); }