From 759926d3cf6da3713b326c9653701a6f40496401 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Wed, 9 Jan 2019 18:15:18 +0100 Subject: [PATCH] SONARCLOUD-332 Use EXTERNAL_LOGIN to authenticate users --- .../org/sonar/db/version/schema-h2.ddl | 1 + .../main/java/org/sonar/db/user/UserDao.java | 5 ++ .../java/org/sonar/db/user/UserMapper.java | 4 +- .../org/sonar/db/user/UserMapper.xml | 11 +++- .../java/org/sonar/db/user/UserDaoTest.java | 10 ++++ ...niqueIndexOnExternalLoginInUsersTable.java | 57 +++++++++++++++++++ .../db/migration/version/v76/DbVersion76.java | 1 + ...eIndexOnExternalLoginInUsersTableTest.java | 54 ++++++++++++++++++ .../version/v76/DbVersion76Test.java | 2 +- .../users.sql | 27 +++++++++ .../authentication/UserRegistrarImpl.java | 24 +++++--- .../authentication/UserRegistrarImplTest.java | 25 ++++++++ 12 files changed, 209 insertions(+), 12 deletions(-) create mode 100644 server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v76/AddUniqueIndexOnExternalLoginInUsersTable.java create mode 100644 server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v76/AddUniqueIndexOnExternalLoginInUsersTableTest.java create mode 100644 server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v76/AddUniqueIndexOnExternalLoginInUsersTableTest/users.sql diff --git a/server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl b/server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl index 6790a438c54..f5907822075 100644 --- a/server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl +++ b/server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl @@ -529,6 +529,7 @@ CREATE TABLE "USERS" ( CREATE UNIQUE INDEX "USERS_UUID" ON "USERS" ("UUID"); CREATE UNIQUE INDEX "USERS_LOGIN" ON "USERS" ("LOGIN"); CREATE UNIQUE INDEX "UNIQ_EXTERNAL_ID" ON "USERS" ("EXTERNAL_IDENTITY_PROVIDER", "EXTERNAL_ID"); +CREATE UNIQUE INDEX "UNIQ_EXTERNAL_LOGIN" ON "USERS" ("EXTERNAL_IDENTITY_PROVIDER", "EXTERNAL_LOGIN"); CREATE INDEX "USERS_UPDATED_AT" ON "USERS" ("UPDATED_AT"); 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 ea1d8fe7305..62a050f2610 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 @@ -173,6 +173,11 @@ public class UserDao implements Dao { return mapper(dbSession).selectByExternalIdAndIdentityProvider(externalId, externalIdentityProvider); } + @CheckForNull + public UserDto selectByExternalLoginAndIdentityProvider(DbSession dbSession, String externalLogin, String externalIdentityProvider) { + return mapper(dbSession).selectByExternalLoginAndIdentityProvider(externalLogin, externalIdentityProvider); + } + public List selectByExternalIdentityProvider(DbSession dbSession, String externalIdentityProvider) { return mapper(dbSession).selectByExternalIdentityProvider(externalIdentityProvider); } 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 23e68c690d8..4801a1bb2c3 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 @@ -62,6 +62,8 @@ public interface UserMapper { @CheckForNull UserDto selectByExternalIdAndIdentityProvider(@Param("externalId") String externalId, @Param("externalIdentityProvider") String externalExternalIdentityProvider); + UserDto selectByExternalLoginAndIdentityProvider(@Param("externalLogin") String externalLogin, @Param("externalIdentityProvider") String externalExternalIdentityProvider); + List selectByExternalIdentityProvider(@Param("externalIdentityProvider") String externalExternalIdentityProvider); void scrollAll(ResultHandler handler); @@ -71,8 +73,6 @@ public interface UserMapper { */ long countRootUsersButLogin(@Param("login") String login); - - void insert(@Param("user") UserDto userDto); void update(@Param("user") UserDto userDto); 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 c4c4ff04812..a9f6ca1dc78 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 @@ -140,14 +140,21 @@ SELECT FROM users u - WHERE u.external_id=#{externalId} AND u.external_identity_provider=#{externalIdentityProvider} + WHERE u.external_id=#{externalId} AND u.external_identity_provider=#{externalIdentityProvider, jdbcType=VARCHAR} + + +