From 7a894686606925522e1a6d8b01c7c2fc092200c9 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Fri, 4 May 2018 16:18:50 +0200 Subject: [PATCH] SONAR-10598 Display warning page when detecting login update during authentication * SONAR-10598 Refactor UserIdentityAuthenticator#authenticate to use a ParameterObject * SONAR-10598 Redirect user when login is updated and update personal org * SONAR-10598 Improve update of personal organization key * SONAR-10598 Improve IT stability related to generation of provider ID * SONAR-10598 Add USERS#ORGANIZATION_UUID * SONAR-10598 Replace usage of Organizaions#UserId by Users#OrganizationUuid --- .../org/sonar/db/version/schema-h2.ddl | 8 +- .../db/organization/OrganizationDto.java | 10 - .../main/java/org/sonar/db/user/UserDto.java | 51 ++- .../db/organization/OrganizationMapper.xml | 4 +- .../org/sonar/db/user/UserMapper.xml | 26 +- .../db/organization/OrganizationDaoTest.java | 180 ++++----- .../java/org/sonar/db/user/UserDaoTest.java | 15 +- .../java/org/sonar/db/user/UserTesting.java | 2 + .../v72/AddOrganizationUuidToUsers.java | 47 +++ .../db/migration/version/v72/DbVersion72.java | 4 +- .../v72/DropUserIdFromOrganizations.java | 37 ++ .../v72/PopulateOrganizationUuidOnUsers.java | 55 +++ .../version/v72/AddExternalIdToUsersTest.java | 2 +- .../v72/AddOrganizationUuidToUsersTest.java | 55 +++ .../version/v72/DbVersion72Test.java | 2 +- .../v72/DropUserIdFromOrganizationsTest.java | 55 +++ .../PopulateOrganizationUuidOnUsersTest.java | 131 ++++++ .../AddOrganizationUuidToUsersTest/users.sql | 26 ++ .../organizations.sql | 19 + .../schema.sql | 47 +++ .../org/sonarqube/qa/util/UserTester.java | 17 +- .../qa/util/pageobjects/Navigation.java | 4 + .../qa/util/pageobjects/UpdateLoginPage.java | 58 +++ .../authentication/AuthenticationModule.java | 2 +- .../AuthenticationRedirection.java | 6 +- .../authentication/BaseContextFactory.java | 13 +- .../server/authentication/InitFilter.java | 3 +- .../OAuth2AuthenticationParameters.java | 2 + .../OAuth2AuthenticationParametersImpl.java | 15 + .../authentication/OAuth2CallbackFilter.java | 3 +- .../authentication/OAuth2ContextFactory.java | 14 +- .../authentication/RealmAuthenticator.java | 12 +- .../authentication/SsoAuthenticator.java | 12 +- .../UserIdentityAuthenticator.java | 217 +--------- .../UserIdentityAuthenticatorImpl.java | 267 +++++++++++++ .../UserIdentityAuthenticatorParameters.java | 149 +++++++ ...ailAlreadyExistsRedirectionException.java} | 7 +- .../exception/RedirectionException.java | 26 ++ .../UpdateLoginRedirectionException.java | 59 +++ .../exception/package-info.java | 23 ++ ...Creation.java => OrganizationUpdater.java} | 12 +- ...Impl.java => OrganizationUpdaterImpl.java} | 29 +- .../server/organization/ws/CreateAction.java | 14 +- .../platformlevel/PlatformLevel4.java | 4 +- .../org/sonar/server/user/UserUpdater.java | 12 +- .../BaseContextFactoryTest.java | 26 +- .../server/authentication/InitFilterTest.java | 3 +- ...Auth2AuthenticationParametersImplTest.java | 35 +- .../OAuth2CallbackFilterTest.java | 3 +- .../OAuth2ContextFactoryTest.java | 63 ++- .../RealmAuthenticatorTest.java | 79 ++-- .../authentication/SsoAuthenticatorTest.java | 10 +- .../TestUserIdentityAuthenticator.java | 49 +++ ...=> UserIdentityAuthenticatorImplTest.java} | 376 ++++++++++++++---- ....java => OrganizationUpdaterImplTest.java} | 87 ++-- .../organization/ws/CreateActionTest.java | 8 +- .../server/user/UserUpdaterCreateTest.java | 8 +- .../user/UserUpdaterReactivateTest.java | 6 +- .../server/user/UserUpdaterUpdateTest.java | 6 +- .../user/ws/ChangePasswordActionTest.java | 4 +- .../server/user/ws/CreateActionTest.java | 8 +- .../server/user/ws/UpdateActionTest.java | 4 +- .../apps/sessions/components/UpdateLogin.tsx | 156 ++++++++ .../components/__tests__/UpdateLogin-test.tsx | 58 +++ .../__snapshots__/UpdateLogin-test.tsx.snap | 115 ++++++ .../src/main/js/apps/sessions/routes.ts | 4 + .../resources/org/sonar/l10n/core.properties | 6 +- .../tests/user/BaseIdentityProviderTest.java | 25 +- .../user/OAuth2IdentityProviderTest.java | 14 +- ...OrganizationBaseIdentityProviderTest.java} | 13 +- .../SonarCloudOAuth2IdentityProviderTest.java | 116 ++++++ ...udUpdateLoginDuringAuthenticationTest.java | 163 ++++++++ .../tests/user/SonarCloudUserSuite.java | 13 +- 73 files changed, 2568 insertions(+), 646 deletions(-) create mode 100644 server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v72/AddOrganizationUuidToUsers.java create mode 100644 server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v72/DropUserIdFromOrganizations.java create mode 100644 server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v72/PopulateOrganizationUuidOnUsers.java create mode 100644 server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v72/AddOrganizationUuidToUsersTest.java create mode 100644 server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v72/DropUserIdFromOrganizationsTest.java create mode 100644 server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v72/PopulateOrganizationUuidOnUsersTest.java create mode 100644 server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v72/AddOrganizationUuidToUsersTest/users.sql create mode 100644 server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v72/DropUserIdFromOrganizationsTest/organizations.sql create mode 100644 server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v72/PopulateOrganizationUuidOnUsersTest/schema.sql create mode 100644 server/sonar-qa-util/src/main/java/org/sonarqube/qa/util/pageobjects/UpdateLoginPage.java create mode 100644 server/sonar-server/src/main/java/org/sonar/server/authentication/UserIdentityAuthenticatorImpl.java create mode 100644 server/sonar-server/src/main/java/org/sonar/server/authentication/UserIdentityAuthenticatorParameters.java rename server/sonar-server/src/main/java/org/sonar/server/authentication/{EmailAlreadyExistsException.java => exception/EmailAlreadyExistsRedirectionException.java} (87%) create mode 100644 server/sonar-server/src/main/java/org/sonar/server/authentication/exception/RedirectionException.java create mode 100644 server/sonar-server/src/main/java/org/sonar/server/authentication/exception/UpdateLoginRedirectionException.java create mode 100644 server/sonar-server/src/main/java/org/sonar/server/authentication/exception/package-info.java rename server/sonar-server/src/main/java/org/sonar/server/organization/{OrganizationCreation.java => OrganizationUpdater.java} (93%) rename server/sonar-server/src/main/java/org/sonar/server/organization/{OrganizationCreationImpl.java => OrganizationUpdaterImpl.java} (93%) create mode 100644 server/sonar-server/src/test/java/org/sonar/server/authentication/TestUserIdentityAuthenticator.java rename server/sonar-server/src/test/java/org/sonar/server/authentication/{UserIdentityAuthenticatorTest.java => UserIdentityAuthenticatorImplTest.java} (59%) rename server/sonar-server/src/test/java/org/sonar/server/organization/{OrganizationCreationImplTest.java => OrganizationUpdaterImplTest.java} (89%) create mode 100644 server/sonar-web/src/main/js/apps/sessions/components/UpdateLogin.tsx create mode 100644 server/sonar-web/src/main/js/apps/sessions/components/__tests__/UpdateLogin-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/sessions/components/__tests__/__snapshots__/UpdateLogin-test.tsx.snap rename tests/src/test/java/org/sonarqube/tests/user/{OrganizationIdentityProviderTest.java => OrganizationBaseIdentityProviderTest.java} (90%) create mode 100644 tests/src/test/java/org/sonarqube/tests/user/SonarCloudOAuth2IdentityProviderTest.java create mode 100644 tests/src/test/java/org/sonarqube/tests/user/SonarCloudUpdateLoginDuringAuthenticationTest.java 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 896cadc48bb..4986fd747fa 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 @@ -6,7 +6,6 @@ CREATE TABLE "ORGANIZATIONS" ( "URL" VARCHAR(256), "AVATAR_URL" VARCHAR(256), "GUARDED" BOOLEAN NOT NULL, - "USER_ID" INTEGER, "DEFAULT_PERM_TEMPLATE_PROJECT" VARCHAR(40), "DEFAULT_PERM_TEMPLATE_VIEW" VARCHAR(40), "DEFAULT_GROUP_ID" INTEGER, @@ -469,10 +468,11 @@ CREATE TABLE "USERS" ( "IS_ROOT" BOOLEAN NOT NULL, "USER_LOCAL" BOOLEAN, "ONBOARDED" BOOLEAN NOT NULL, - "CREATED_AT" BIGINT, - "UPDATED_AT" BIGINT, "HOMEPAGE_TYPE" VARCHAR(40), - "HOMEPAGE_PARAMETER" VARCHAR(40) + "HOMEPAGE_PARAMETER" VARCHAR(40), + "ORGANIZATION_UUID" VARCHAR(40), + "CREATED_AT" BIGINT, + "UPDATED_AT" BIGINT ); CREATE UNIQUE INDEX "USERS_UUID" ON "USERS" ("UUID"); CREATE UNIQUE INDEX "USERS_LOGIN" ON "USERS" ("LOGIN"); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationDto.java index e8548462f38..b139f04ef4c 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationDto.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationDto.java @@ -111,16 +111,6 @@ public class OrganizationDto { return this; } - @CheckForNull - public Integer getUserId() { - return userId; - } - - public OrganizationDto setUserId(@Nullable Integer userId) { - this.userId = userId; - return this; - } - @CheckForNull public Integer getDefaultGroupId() { return defaultGroupId; 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 129d636730c..2c172e374f0 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 @@ -50,13 +50,14 @@ public class UserDto { private String salt; // Hash method used to generate cryptedPassword, my be null in case of external authentication private String hashMethod; - private Long createdAt; - private Long updatedAt; private String homepageType; private String homepageParameter; private boolean local = true; private boolean root = false; private boolean onboarded = false; + private String organizationUuid; + private Long createdAt; + private Long updatedAt; public String getUuid() { return uuid; @@ -218,24 +219,6 @@ public class UserDto { return this; } - public Long getCreatedAt() { - return createdAt; - } - - UserDto setCreatedAt(long createdAt) { - this.createdAt = createdAt; - return this; - } - - public Long getUpdatedAt() { - return updatedAt; - } - - UserDto setUpdatedAt(long updatedAt) { - this.updatedAt = updatedAt; - return this; - } - @CheckForNull public String getHomepageType() { return homepageType; @@ -281,6 +264,34 @@ public class UserDto { return this; } + @CheckForNull + public String getOrganizationUuid() { + return organizationUuid; + } + + public UserDto setOrganizationUuid(@Nullable String organizationUuid) { + this.organizationUuid = organizationUuid; + return this; + } + + public Long getCreatedAt() { + return createdAt; + } + + UserDto setCreatedAt(long createdAt) { + this.createdAt = createdAt; + return this; + } + + public Long getUpdatedAt() { + return updatedAt; + } + + UserDto setUpdatedAt(long updatedAt) { + this.updatedAt = updatedAt; + return this; + } + public DefaultUser toUser() { return new DefaultUser() .setLogin(login) diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMapper.xml index d48bcec8cfb..86231226a8f 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMapper.xml @@ -11,7 +11,6 @@ org.url as "url", org.avatar_url as "avatarUrl", org.guarded as "guarded", - org.user_id as "userId", org.created_at as "createdAt", org.updated_at as "updatedAt" @@ -163,7 +162,6 @@ avatar_url, guarded, new_project_private, - user_id, default_quality_gate_uuid, created_at, updated_at @@ -178,7 +176,6 @@ #{organization.avatarUrl, jdbcType=VARCHAR}, #{organization.guarded, jdbcType=BOOLEAN}, #{newProjectPrivate, jdbcType=BOOLEAN}, - #{organization.userId, jdbcType=INTEGER}, #{organization.defaultQualityGateUuid, jdbcType=VARCHAR}, #{organization.createdAt, jdbcType=BIGINT}, #{organization.updatedAt, jdbcType=BIGINT} @@ -188,6 +185,7 @@ update organizations set + kee = #{organization.key, jdbcType=VARCHAR}, name = #{organization.name, jdbcType=VARCHAR}, description = #{organization.description, jdbcType=VARCHAR}, url = #{organization.url, jdbcType=VARCHAR}, 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 f28b9383fdd..6a37689fbf2 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 @@ -20,10 +20,11 @@ u.user_local as "local", u.is_root as "root", u.onboarded as "onboarded", - u.created_at as "createdAt", - u.updated_at as "updatedAt", u.homepage_type as "homepageType", - u.homepage_parameter as "homepageParameter" + u.homepage_parameter as "homepageParameter", + u.organization_uuid as organizationUuid, + u.created_at as "createdAt", + u.updated_at as "updatedAt"