From: Julien Lancelot Date: Mon, 23 Apr 2018 14:41:34 +0000 (+0200) Subject: SONAR-10599 Synchronize login during authentication X-Git-Tag: 7.5~1167 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a124513d1f1ec3940f39e326802c4ad0c5cf1ddc;p=sonarqube.git SONAR-10599 Synchronize login during authentication --- diff --git a/server/sonar-db-core/src/main/resources/org/sonar/db/version/rows-h2.sql b/server/sonar-db-core/src/main/resources/org/sonar/db/version/rows-h2.sql index 95b8cf51d7b..48d8e16cc66 100644 --- a/server/sonar-db-core/src/main/resources/org/sonar/db/version/rows-h2.sql +++ b/server/sonar-db-core/src/main/resources/org/sonar/db/version/rows-h2.sql @@ -1,4 +1,4 @@ -INSERT INTO USERS(ID, UUID, LOGIN, NAME, EMAIL, EXTERNAL_IDENTITY, EXTERNAL_IDENTITY_PROVIDER, USER_LOCAL, CRYPTED_PASSWORD, SALT, HASH_METHOD, IS_ROOT, ONBOARDED, CREATED_AT, UPDATED_AT) VALUES (1, 'UuidnciQUUs7Zd3KPvFD', 'admin', 'Administrator', '', 'admin', 'sonarqube', true, '$2a$12$uCkkXmhW5ThVK8mpBvnXOOJRLd64LJeHTeCkSuB3lfaR2N0AYBaSi', null, 'BCRYPT', false, false, '1418215735482', '1418215735482'); +INSERT INTO USERS(ID, UUID, LOGIN, NAME, EMAIL, EXTERNAL_ID, EXTERNAL_LOGIN, EXTERNAL_IDENTITY_PROVIDER, USER_LOCAL, CRYPTED_PASSWORD, SALT, HASH_METHOD, IS_ROOT, ONBOARDED, CREATED_AT, UPDATED_AT) VALUES (1, 'UuidnciQUUs7Zd3KPvFD', 'admin', 'Administrator', '', 'admin', 'admin', 'sonarqube', true, '$2a$12$uCkkXmhW5ThVK8mpBvnXOOJRLd64LJeHTeCkSuB3lfaR2N0AYBaSi', null, 'BCRYPT', false, false, '1418215735482', '1418215735482'); ALTER TABLE USERS ALTER COLUMN ID RESTART WITH 2; INSERT INTO GROUPS(ID, ORGANIZATION_UUID, NAME, DESCRIPTION, CREATED_AT, UPDATED_AT) VALUES (1, 'AVdqnciQUUs7Zd3KPvFD', 'sonar-administrators', 'System administrators', '2011-09-26 22:27:51.0', '2011-09-26 22:27:51.0'); 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 46b8deff215..896cadc48bb 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 @@ -454,8 +454,8 @@ CREATE INDEX "IX_ARP_ON_ACTIVE_RULE_ID" ON "ACTIVE_RULE_PARAMETERS" ("ACTIVE_RUL CREATE TABLE "USERS" ( "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1), - "UUID" VARCHAR(40), - "LOGIN" VARCHAR(255), + "UUID" VARCHAR(40) NOT NULL, + "LOGIN" VARCHAR(255) NOT NULL, "NAME" VARCHAR(200), "EMAIL" VARCHAR(100), "CRYPTED_PASSWORD" VARCHAR(100), @@ -463,8 +463,9 @@ CREATE TABLE "USERS" ( "HASH_METHOD" VARCHAR(10), "ACTIVE" BOOLEAN DEFAULT TRUE, "SCM_ACCOUNTS" VARCHAR(4000), - "EXTERNAL_IDENTITY" VARCHAR(255), - "EXTERNAL_IDENTITY_PROVIDER" VARCHAR(100), + "EXTERNAL_ID" VARCHAR(255) NOT NULL, + "EXTERNAL_LOGIN" VARCHAR(255) NOT NULL, + "EXTERNAL_IDENTITY_PROVIDER" VARCHAR(100) NOT NULL, "IS_ROOT" BOOLEAN NOT NULL, "USER_LOCAL" BOOLEAN, "ONBOARDED" BOOLEAN NOT NULL, @@ -473,7 +474,9 @@ CREATE TABLE "USERS" ( "HOMEPAGE_TYPE" VARCHAR(40), "HOMEPAGE_PARAMETER" VARCHAR(40) ); +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 INDEX "USERS_UPDATED_AT" ON "USERS" ("UPDATED_AT"); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberDao.java index cd7cb05eca5..3762ca7b575 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberDao.java @@ -38,8 +38,8 @@ public class OrganizationMemberDao implements Dao { return Optional.ofNullable(mapper(dbSession).select(organizationUuid, userId)); } - public List selectLoginsByOrganizationUuid(DbSession dbSession, String organizationUuid) { - return mapper(dbSession).selectLogins(organizationUuid); + public List selectUserUuidsByOrganizationUuid(DbSession dbSession, String organizationUuid) { + return mapper(dbSession).selectUserUuids(organizationUuid); } public List selectUserIdsByOrganizationUuid(DbSession dbSession, String organizationUuid) { @@ -67,20 +67,19 @@ public class OrganizationMemberDao implements Dao { } /** - * - * @param loginOrganizationConsumer {@link BiConsumer} (login, organization uuid) + * @param userUuidOrganizationConsumer {@link BiConsumer} (uuid, organization uuid) */ - public void selectForUserIndexing(DbSession dbSession, Collection logins, BiConsumer loginOrganizationConsumer) { - executeLargeInputsWithoutOutput(logins, list -> mapper(dbSession).selectForIndexing(list) - .forEach(row -> loginOrganizationConsumer.accept(row.get("login"), row.get("organizationUuid")))); + public void selectForUserIndexing(DbSession dbSession, Collection uuids, BiConsumer userUuidOrganizationConsumer) { + executeLargeInputsWithoutOutput(uuids, list -> mapper(dbSession).selectForIndexing(list) + .forEach(row -> userUuidOrganizationConsumer.accept(row.get("uuid"), row.get("organizationUuid")))); } /** * - * @param loginOrganizationConsumer {@link BiConsumer} (login, organization uuid) + * @param userUuidOrganizationConsumer {@link BiConsumer} (uuid, organization uuid) */ - public void selectAllForUserIndexing(DbSession dbSession, BiConsumer loginOrganizationConsumer) { + public void selectAllForUserIndexing(DbSession dbSession, BiConsumer userUuidOrganizationConsumer) { mapper(dbSession).selectAllForIndexing() - .forEach(row -> loginOrganizationConsumer.accept(row.get("login"), row.get("organizationUuid"))); + .forEach(row -> userUuidOrganizationConsumer.accept(row.get("uuid"), row.get("organizationUuid"))); } } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberMapper.java index 15ab9922f94..defe8395dd2 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberMapper.java @@ -29,11 +29,11 @@ public interface OrganizationMemberMapper { Set selectOrganizationUuidsByUser(@Param("userId") int userId); - List selectLogins(String organizationUuid); + List selectUserUuids(String organizationUuid); List selectUserIds(String organizationUuid); - List> selectForIndexing(@Param("logins") List logins); + List> selectForIndexing(@Param("uuids") List uuids); List> selectAllForIndexing(); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesDao.java index d50118a5db7..c892dc9c205 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesDao.java @@ -161,6 +161,10 @@ public class PropertiesDao implements Dao { return executeLargeInputs(componentIds, getMapper(session)::selectByComponentIds); } + public List selectByKeyAndMatchingValue(DbSession session, String key, String value) { + return getMapper(session).selectByKeyAndMatchingValue(key, value); + } + /** * Saves the specified property and its value. *

diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesMapper.java index 0e50bac5528..d2d181739e2 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesMapper.java @@ -42,6 +42,8 @@ public interface PropertiesMapper { List selectByQuery(@Param("query") PropertyQuery query); + List selectByKeyAndMatchingValue(@Param("key") String key, @Param("value") String value); + List selectDescendantModuleProperties(@Param("moduleUuid") String moduleUuid, @Param(value = "scope") String scope, @Param(value = "excludeDisabled") boolean excludeDisabled); 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 73c04c6e179..4bd8de97b52 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 @@ -58,6 +58,11 @@ public class UserDao implements Dao { return mapper(session).selectUser(userId); } + @CheckForNull + public UserDto selectByUuid(DbSession session, String uuid) { + return mapper(session).selectByUuid(uuid); + } + /** * Select users by ids, including disabled users. An empty list is returned * if list of ids is empty, without any db round trips. @@ -82,6 +87,14 @@ public class UserDao implements Dao { return executeLargeInputs(logins, mapper(session)::selectByLogins); } + /** + * Select users by uuids, including disabled users. An empty list is returned + * if list of uuids is empty, without any db round trips. + */ + public List selectByUuids(DbSession session, Collection uuids) { + return executeLargeInputs(uuids, mapper(session)::selectByUuids); + } + /** * Gets a list users by their logins. The result does NOT contain {@code null} values for users not found, so * the size of result may be less than the number of keys. @@ -165,12 +178,17 @@ public class UserDao implements Dao { return mapper(dbSession).selectByEmail(email.toLowerCase(Locale.ENGLISH)); } - public void scrollByLogins(DbSession dbSession, Collection logins, Consumer consumer) { + @CheckForNull + public UserDto selectByExternalIdAndIdentityProvider(DbSession dbSession, String externalId, String externalIdentityProvider) { + return mapper(dbSession).selectByExternalIdAndIdentityProvider(externalId, externalIdentityProvider); + } + + public void scrollByUuids(DbSession dbSession, Collection uuids, Consumer consumer) { UserMapper mapper = mapper(dbSession); - executeLargeInputsWithoutOutput(logins, - pageOfLogins -> mapper - .selectByLogins(pageOfLogins) + executeLargeInputsWithoutOutput(uuids, + pageOfUuids -> mapper + .selectByUuids(pageOfUuids) .forEach(consumer)); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDto.java index 5c2cd93a2f3..129d636730c 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDto.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDto.java @@ -41,7 +41,8 @@ public class UserDto { private String email; private boolean active = true; private String scmAccounts; - private String externalIdentity; + private String externalId; + private String externalLogin; private String externalIdentityProvider; // Hashed password that may be null in case of external authentication private String cryptedPassword; @@ -151,12 +152,21 @@ public class UserDto { } } - public String getExternalIdentity() { - return externalIdentity; + public String getExternalId() { + return externalId; } - public UserDto setExternalIdentity(String authorithy) { - this.externalIdentity = authorithy; + public UserDto setExternalId(String externalId) { + this.externalId = externalId; + return this; + } + + public String getExternalLogin() { + return externalLogin; + } + + public UserDto setExternalLogin(String externalLogin) { + this.externalLogin = externalLogin; return this; } 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 e02486dce16..c83c98a739a 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 @@ -27,6 +27,9 @@ import org.sonar.api.user.UserQuery; public interface UserMapper { + @CheckForNull + UserDto selectByUuid(String uuid); + @CheckForNull UserDto selectByLogin(String login); @@ -50,11 +53,16 @@ public interface UserMapper { List selectByLogins(List logins); + List selectByUuids(List uuids); + List selectByIds(@Param("ids") List ids); @CheckForNull UserDto selectByEmail(String email); + @CheckForNull + UserDto selectByExternalIdAndIdentityProvider(@Param("externalId") String externalId, @Param("externalIdentityProvider") String externalExternalIdentityProvider); + void scrollAll(ResultHandler handler); /** diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMemberMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMemberMapper.xml index 49ca6e65af5..68e3767c9e4 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMemberMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMemberMapper.xml @@ -17,8 +17,8 @@ and om.user_id = #{userId, jdbcType=INTEGER} - + select u.uuid from organization_members om inner join users u on om.user_id = u.id where om.organization_uuid=#{organizationUuid,jdbcType=VARCHAR} @@ -37,17 +37,17 @@ diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/property/PropertiesMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/property/PropertiesMapper.xml index eb6f2943942..246bc8090d1 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/property/PropertiesMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/property/PropertiesMapper.xml @@ -179,6 +179,16 @@ and ps.organization_uuid=#{organizationUuid,jdbcType=VARCHAR} + + insert into properties ( 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 5626e1c4c68..f28b9383fdd 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 @@ -14,7 +14,8 @@ u.salt as "salt", u.crypted_password as "cryptedPassword", u.hash_method as "hashMethod", - u.external_identity as "externalIdentity", + u.external_id as "externalId", + u.external_login as "externalLogin", u.external_identity_provider as "externalIdentityProvider", u.user_local as "local", u.is_root as "root", @@ -25,6 +26,13 @@ u.homepage_parameter as "homepageParameter" + + + + + +