From 465047d8b497de79ff636e98dab0e34a6edf6257 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Tue, 30 Jan 2018 13:31:10 +0100 Subject: [PATCH] SONAR-10338 Allow authentication of user using an exising email --- .../main/java/org/sonar/db/user/UserDao.java | 7 +- .../java/org/sonar/db/user/UserMapper.java | 5 +- .../org/sonar/db/user/UserMapper.xml | 8 +- .../java/org/sonar/db/user/UserDaoTest.java | 12 +- .../authentication/AuthenticationError.java | 21 +- .../authentication/AuthenticationModule.java | 2 +- .../AuthenticationRedirection.java | 52 +++++ .../authentication/BaseContextFactory.java | 5 +- .../sonar/server/authentication/Cookies.java | 17 ++ .../EmailAlreadyExistsException.java | 58 +++++ .../server/authentication/InitFilter.java | 16 +- .../OAuth2AuthenticationParameters.java | 44 ++++ .../OAuth2AuthenticationParametersImpl.java | 133 ++++++++++++ .../authentication/OAuth2CallbackFilter.java | 14 +- .../authentication/OAuth2ContextFactory.java | 16 +- .../authentication/OAuth2Redirection.java | 78 ------- .../authentication/RealmAuthenticator.java | 3 +- .../authentication/SsoAuthenticator.java | 3 +- .../UserIdentityAuthenticator.java | 101 ++++++--- .../org/sonar/server/user/UserUpdater.java | 11 +- .../BaseContextFactoryTest.java | 23 +- .../server/authentication/InitFilterTest.java | 87 ++++++-- ...Auth2AuthenticationParametersImplTest.java | 167 +++++++++++++++ .../OAuth2CallbackFilterTest.java | 73 ++++--- .../OAuth2ContextFactoryTest.java | 52 +++-- .../authentication/OAuth2RedirectionTest.java | 134 ------------ .../RealmAuthenticatorTest.java | 30 +-- .../UserIdentityAuthenticatorTest.java | 198 ++++++++++++++---- .../server/user/UserUpdaterCreateTest.java | 34 ++- .../server/user/UserUpdaterUpdateTest.java | 17 ++ .../org/sonarqube/tests/Category4Suite.java | 2 + 31 files changed, 983 insertions(+), 440 deletions(-) create mode 100644 server/sonar-server/src/main/java/org/sonar/server/authentication/AuthenticationRedirection.java create mode 100644 server/sonar-server/src/main/java/org/sonar/server/authentication/EmailAlreadyExistsException.java create mode 100644 server/sonar-server/src/main/java/org/sonar/server/authentication/OAuth2AuthenticationParameters.java create mode 100644 server/sonar-server/src/main/java/org/sonar/server/authentication/OAuth2AuthenticationParametersImpl.java delete mode 100644 server/sonar-server/src/main/java/org/sonar/server/authentication/OAuth2Redirection.java create mode 100644 server/sonar-server/src/test/java/org/sonar/server/authentication/OAuth2AuthenticationParametersImplTest.java delete mode 100644 server/sonar-server/src/test/java/org/sonar/server/authentication/OAuth2RedirectionTest.java diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDao.java index 351a9404d6f..c063482fc98 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDao.java @@ -152,12 +152,13 @@ public class UserDao implements Dao { } /** - * Check if an active user with the given email exits in database + * Search for an active user with the given email exits in database * * Please note that email is case insensitive, result for searching 'mail@email.com' or 'Mail@Email.com' will be the same */ - public boolean doesEmailExist(DbSession dbSession, String email) { - return mapper(dbSession).countByEmail(email.toLowerCase(Locale.ENGLISH)) > 0; + @CheckForNull + public UserDto selectByEmail(DbSession dbSession, String email) { + return mapper(dbSession).selectByEmail(email.toLowerCase(Locale.ENGLISH)); } public void scrollByLogins(DbSession dbSession, Collection logins, Consumer consumer) { diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserMapper.java index cd2fc8572dc..5d816dab951 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserMapper.java @@ -52,9 +52,10 @@ public interface UserMapper { List selectByIds(@Param("ids") List ids); - void scrollAll(ResultHandler handler); + @CheckForNull + UserDto selectByEmail(String email); - long countByEmail(String email); + void scrollAll(ResultHandler handler); /** * Count actives users which are root and which login is not the specified one. diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/user/UserMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/user/UserMapper.xml index da99028da2c..d7c568696e5 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/user/UserMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/user/UserMapper.xml @@ -106,10 +106,12 @@ ORDER BY u.name - + SELECT + FROM users u - where lower(u.email)=#{email} AND u.active=${_true} + WHERE lower(u.email)=#{email, jdbcType=VARCHAR} + AND u.active=${_true}