From 52fcfd04b4671924baa73987a5b122dbe37b9fe1 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Tue, 9 Feb 2016 14:50:21 +0100 Subject: [PATCH] Move remaining authentication ITs --- .../it/user/BaseIdentityProviderTest.java | 5 +- .../java/it/user/LocalAuthenticationTest.java | 78 ++++++++----- .../src/test/java/util/user/UserRule.java | 68 ++++++------ .../authenticate_user.html | 2 +- .../create-and-delete-user.html | 8 +- .../external-user-details.html | 4 +- .../external-user-details2.html | 4 +- .../system-info.html | 68 ++++++------ .../allow_users_to_sign_up.html | 104 ++++++++++++++++++ .../force-authentication.html | 70 ++++++++++++ .../login_successful.html | 69 ++++++++++++ .../login_wrong_password.html | 45 ++++++++ ...ct_to_original_url_after_direct_login.html | 54 +++++++++ ..._to_original_url_after_indirect_login.html | 63 +++++++++++ .../should_change_password.html | 8 +- .../should_display_issues.html | 4 +- .../should_display_user_details.html | 4 +- 17 files changed, 541 insertions(+), 117 deletions(-) create mode 100644 it/it-tests/src/test/resources/user/LocalAuthenticationTest/allow_users_to_sign_up.html create mode 100644 it/it-tests/src/test/resources/user/LocalAuthenticationTest/force-authentication.html create mode 100644 it/it-tests/src/test/resources/user/LocalAuthenticationTest/login_successful.html create mode 100644 it/it-tests/src/test/resources/user/LocalAuthenticationTest/login_wrong_password.html create mode 100644 it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_original_url_after_direct_login.html create mode 100644 it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_original_url_after_indirect_login.html diff --git a/it/it-tests/src/test/java/it/user/BaseIdentityProviderTest.java b/it/it-tests/src/test/java/it/user/BaseIdentityProviderTest.java index 2636c925edc..6cba8dd2cab 100644 --- a/it/it-tests/src/test/java/it/user/BaseIdentityProviderTest.java +++ b/it/it-tests/src/test/java/it/user/BaseIdentityProviderTest.java @@ -73,10 +73,7 @@ public class BaseIdentityProviderTest { @After public void removeUserAndCleanPluginProperties() throws Exception { - Optional user = userRule.getUserByLogin(USER_LOGIN); - if (user.isPresent()) { - userRule.deactivateUsers(user.get()); - } + userRule.deactivateUsers(USER_LOGIN); setServerProperty(ORCHESTRATOR, "sonar.auth.fake-base-id-provider.enabled", null); setServerProperty(ORCHESTRATOR, "sonar.auth.fake-base-id-provider.user", null); } diff --git a/it/it-tests/src/test/java/it/user/LocalAuthenticationTest.java b/it/it-tests/src/test/java/it/user/LocalAuthenticationTest.java index b8992049fb6..0420e186ca7 100644 --- a/it/it-tests/src/test/java/it/user/LocalAuthenticationTest.java +++ b/it/it-tests/src/test/java/it/user/LocalAuthenticationTest.java @@ -23,7 +23,9 @@ import com.sonar.orchestrator.Orchestrator; import com.sonar.orchestrator.build.BuildResult; import com.sonar.orchestrator.build.SonarRunner; import com.sonar.orchestrator.locator.FileLocation; +import com.sonar.orchestrator.selenium.Selenese; import it.Category4Suite; +import java.io.IOException; import java.util.UUID; import org.junit.After; import org.junit.AfterClass; @@ -35,7 +37,6 @@ import org.sonarqube.ws.WsUserTokens; import org.sonarqube.ws.client.GetRequest; import org.sonarqube.ws.client.HttpConnector; import org.sonarqube.ws.client.HttpWsClient; -import org.sonarqube.ws.client.PostRequest; import org.sonarqube.ws.client.WsClient; import org.sonarqube.ws.client.WsResponse; import org.sonarqube.ws.client.permission.AddGroupWsRequest; @@ -45,6 +46,8 @@ import org.sonarqube.ws.client.usertoken.GenerateWsRequest; import org.sonarqube.ws.client.usertoken.RevokeWsRequest; import org.sonarqube.ws.client.usertoken.SearchWsRequest; import org.sonarqube.ws.client.usertoken.UserTokensService; +import util.selenium.SeleneseTest; +import util.user.UserRule; import static java.lang.String.format; import static org.assertj.core.api.Assertions.assertThat; @@ -53,8 +56,13 @@ import static util.ItUtils.projectDir; import static util.ItUtils.setServerProperty; public class LocalAuthenticationTest { + @ClassRule public static Orchestrator ORCHESTRATOR = Category4Suite.ORCHESTRATOR; + + @ClassRule + public static UserRule userRule = UserRule.from(ORCHESTRATOR); + private static WsClient adminWsClient; private static UserTokensService userTokensWsClient; @@ -72,20 +80,21 @@ public class LocalAuthenticationTest { userTokensWsClient = adminWsClient.userTokens(); removeGroupPermission("anyone", "scan"); - createUser(LOGIN, "123456"); + userRule.createUser(LOGIN, "123456"); addUserPermission(LOGIN, "admin"); addUserPermission(LOGIN, "scan"); } @AfterClass - public static void deleteData() { - deactivateUser(LOGIN); + public static void deleteAndRestoreData() { + userRule.deactivateUsers(LOGIN, "signuplogin"); addGroupPermission("anyone", "scan"); } @After public void resetProperties() throws Exception { setServerProperty(ORCHESTRATOR, "sonar.forceAuthentication", null); + setServerProperty(ORCHESTRATOR, "sonar.allowUsersToSignUp", null); } @Test @@ -94,7 +103,7 @@ public class LocalAuthenticationTest { String login = format("login-%s", userId); String name = format("name-%s", userId); String password = "!ascii-only:-)@"; - createUser(login, name, password); + userRule.createUser(login, name, password); // authenticate WsClient wsClient = new HttpWsClient(new HttpConnector.Builder().url(ORCHESTRATOR.getServer().getUrl()).credentials(login, password).build()); @@ -163,18 +172,49 @@ public class LocalAuthenticationTest { */ @Test public void basic_authentication_does_not_support_utf8_passwords() { - String userId = UUID.randomUUID().toString(); - String login = format("login-%s", userId); + String login = LOGIN; // see http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt String password = "κόσμε"; // create user with a UTF-8 password - createUser(login, format("name-%s", userId), password); + userRule.createUser(login, LOGIN, password); // authenticate assertThat(checkAuthenticationThroughWebService(login, password)).isFalse(); } + @Test + public void allow_users_to_sign_up() throws IOException { + setServerProperty(ORCHESTRATOR, "sonar.allowUsersToSignUp", "true"); + + new SeleneseTest( + Selenese.builder().setHtmlTestsInClasspath("allow_users_to_sign_up", + "/user/LocalAuthenticationTest/allow_users_to_sign_up.html").build()).runOn(ORCHESTRATOR); + + // This check is failing because signup doesn't refresh the users ES index ! + // Will be fixed by SONAR-7308 +// userRule.verifyUserExists("signuplogin", "SignUpName", null); + } + + @Test + public void authentication_through_ui() { + new SeleneseTest(Selenese.builder().setHtmlTestsInClasspath("authentication", + "/user/LocalAuthenticationTest/login_successful.html", + "/user/LocalAuthenticationTest/login_wrong_password.html", + // SONAR-2132 + "/user/LocalAuthenticationTest/redirect_to_original_url_after_direct_login.html", + // SONAR-2009 + "/user/LocalAuthenticationTest/redirect_to_original_url_after_indirect_login.html" + ).build()).runOn(ORCHESTRATOR); + + setServerProperty(ORCHESTRATOR, "sonar.forceAuthentication", "true"); + + new SeleneseTest(Selenese.builder().setHtmlTestsInClasspath("force-authentication", + // SONAR-3473 + "/user/LocalAuthenticationTest/force-authentication.html" + ).build()).runOn(ORCHESTRATOR); + } + @Test public void authentication_with_web_service() { assertThat(checkAuthenticationThroughWebService("admin", "admin")).isTrue(); @@ -195,34 +235,12 @@ public class LocalAuthenticationTest { return result.contains("{\"valid\":true}"); } - private static void createUser(String login, String password) { - adminWsClient.wsConnector().call( - new PostRequest("api/users/create") - .setParam("login", login) - .setParam("name", login) - .setParam("password", password)); - } - - private static void createUser(String login, String name, String password) { - adminWsClient.wsConnector().call( - new PostRequest("api/users/create") - .setParam("login", login) - .setParam("name", name) - .setParam("password", password)); - } - private static void addUserPermission(String login, String permission) { adminWsClient.permissions().addUser(new AddUserWsRequest() .setLogin(login) .setPermission(permission)); } - private static void deactivateUser(String login) { - adminWsClient.wsConnector().call( - new PostRequest("api/users/deactivate") - .setParam("login", login)); - } - private static void removeGroupPermission(String groupName, String permission) { adminWsClient.permissions().removeGroup(new RemoveGroupWsRequest() .setGroupName(groupName) diff --git a/it/it-tests/src/test/java/util/user/UserRule.java b/it/it-tests/src/test/java/util/user/UserRule.java index 87c93a5769b..e8753b247d8 100644 --- a/it/it-tests/src/test/java/util/user/UserRule.java +++ b/it/it-tests/src/test/java/util/user/UserRule.java @@ -23,9 +23,9 @@ import com.google.common.base.Optional; import com.google.common.base.Predicate; import com.google.common.collect.FluentIterable; import com.sonar.orchestrator.Orchestrator; -import java.util.ArrayList; import java.util.List; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import org.assertj.core.api.Assertions; import org.junit.rules.ExternalResource; import org.sonarqube.ws.client.GetRequest; @@ -52,12 +52,14 @@ public class UserRule extends ExternalResource { return new UserRule(requireNonNull(orchestrator, "Orchestrator instance can not be null")); } - @Override - protected void before() throws Throwable { - adminWsClient = newAdminWsClient(orchestrator); + private WsClient adminWsClient(){ + if (adminWsClient == null) { + adminWsClient = newAdminWsClient(orchestrator); + } + return adminWsClient; } - public void verifyUserExists(String login, String name, String email) { + public void verifyUserExists(String login, String name, @Nullable String email) { Optional user = getUserByLogin(login); assertThat(user).as("User with login '%s' hasn't been found", login).isPresent(); Assertions.assertThat(user.get().getLogin()).isEqualTo(login); @@ -69,45 +71,33 @@ public class UserRule extends ExternalResource { assertThat(getUserByLogin(login)).as("Unexpected user with login '%s' has been found", login).isAbsent(); } - public Optional getUserByLogin(String login) { - return FluentIterable.from(getUsers().getUsers()).firstMatch(new MatchUserLogin(login)); + + public void createUser(String login, String name, String password) { + adminWsClient().wsConnector().call( + new PostRequest("api/users/create") + .setParam("login", login) + .setParam("name", name) + .setParam("password", password)); } - public List getUsersByEmails(String... emails) { - List foundUsers = new ArrayList<>(); - for (String email : emails) { - Optional user = FluentIterable.from(getUsers().getUsers()).firstMatch(new MatchUserLogin(email)); - if (user.isPresent()) { - foundUsers.add(user.get()); - } - } - return foundUsers; + public void createUser(String login, String password) { + createUser(login, login, password); + } + + public Optional getUserByLogin(String login) { + return FluentIterable.from(getUsers().getUsers()).firstMatch(new MatchUserLogin(login)); } public Users getUsers() { - WsResponse response = adminWsClient.wsConnector().call( + WsResponse response = adminWsClient().wsConnector().call( new GetRequest("api/users/search")); Assertions.assertThat(response.code()).isEqualTo(200); return Users.parse(response.content()); } - private class MatchUserLogin implements Predicate { - private final String login; - - private MatchUserLogin(String login) { - this.login = login; - } - - @Override - public boolean apply(@Nonnull Users.User user) { - String login = user.getLogin(); - return login != null && login.equals(this.login) && user.isActive(); - } - } - public void deactivateUsers(List users) { for (Users.User user : users) { - adminWsClient.wsConnector().call( + adminWsClient().wsConnector().call( new PostRequest("api/users/deactivate") .setParam("login", user.getLogin())); } @@ -125,4 +115,18 @@ public class UserRule extends ExternalResource { } } } + + private class MatchUserLogin implements Predicate { + private final String login; + + private MatchUserLogin(String login) { + this.login = login; + } + + @Override + public boolean apply(@Nonnull Users.User user) { + String login = user.getLogin(); + return login != null && login.equals(this.login) && user.isActive(); + } + } } diff --git a/it/it-tests/src/test/resources/user/BaseIdentityProviderTest/authenticate_user.html b/it/it-tests/src/test/resources/user/BaseIdentityProviderTest/authenticate_user.html index dbb9a4f06b0..22876407cb3 100644 --- a/it/it-tests/src/test/resources/user/BaseIdentityProviderTest/authenticate_user.html +++ b/it/it-tests/src/test/resources/user/BaseIdentityProviderTest/authenticate_user.html @@ -10,7 +10,7 @@ open - sessions/new + /sessions/new diff --git a/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/create-and-delete-user.html b/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/create-and-delete-user.html index 0e34b32d096..3f09f3e6779 100644 --- a/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/create-and-delete-user.html +++ b/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/create-and-delete-user.html @@ -20,12 +20,12 @@ type - login + id=login admin type - password + id=password admin @@ -115,12 +115,12 @@ type - login + id=login tester type - password + id=password password diff --git a/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/external-user-details.html b/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/external-user-details.html index e28cf00af7a..da2ca5c6c19 100644 --- a/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/external-user-details.html +++ b/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/external-user-details.html @@ -20,12 +20,12 @@ type - login + id=login tester type - password + id=password 123 diff --git a/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/external-user-details2.html b/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/external-user-details2.html index edcad4d3c43..2d3d225e628 100644 --- a/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/external-user-details2.html +++ b/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/external-user-details2.html @@ -20,12 +20,12 @@ type - login + id=login tester type - password + id=password 123 diff --git a/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/system-info.html b/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/system-info.html index f0d230b45d9..73539db0476 100644 --- a/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/system-info.html +++ b/it/it-tests/src/test/resources/user/ExternalAuthenticationTest/system-info.html @@ -2,43 +2,43 @@ - - external_user_details + + external_user_details - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
external_user_details
open/system
typeloginadmin
typepasswordadmin
clickAndWaitcommit
waitForTextid=content*External User Authentication*FakeRealm*
external_user_details
open/system
typeid=loginadmin
typeid=passwordadmin
clickAndWaitcommit
waitForTextid=content*External User Authentication*FakeRealm*
diff --git a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/allow_users_to_sign_up.html b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/allow_users_to_sign_up.html new file mode 100644 index 00000000000..ec56647fc4c --- /dev/null +++ b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/allow_users_to_sign_up.html @@ -0,0 +1,104 @@ + + + + + + allow_users_to_sign_up + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
open/sessions/new
waitForTextcontent*Log In to SonarQube*
assertTextbd*Not a member*
clickAndWaitlink=Sign up
typeid=user_loginsignuplogin
typeid=user_nameSignUpName
typeid=user_passwordpassword
typeid=user_password_confirmationpassword
clickAndWaitname=commit
assertTextinfomsg*Please log in*
open/sessions/new
waitForTextcontent*Log In to SonarQube*
typeid=loginsignuplogin
typeid=passwordpassword
clickAndWaitname=commit
waitForTextcss=.navbar*SignUpName*
clickLink=SignUpName
waitForTextcss=.navbar*Log out*
+ + diff --git a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/force-authentication.html b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/force-authentication.html new file mode 100644 index 00000000000..3b8f6cb4440 --- /dev/null +++ b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/force-authentication.html @@ -0,0 +1,70 @@ + + + + + + force-authentication + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
force-authentication
open/sessions/logout
open/
assertLocation*/sessions/new
waitForTextcontent*Log In to SonarQube*
typeid=loginadmin
typeid=passwordadmin
clickAndWaitname=commit
waitForTextcss=.navbar*Administrator*
open/sessions/logout
assertLocation*/sessions/new
+ + diff --git a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/login_successful.html b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/login_successful.html new file mode 100644 index 00000000000..430e94aa539 --- /dev/null +++ b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/login_successful.html @@ -0,0 +1,69 @@ + + + + + + login_successful + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
login_successful
open/sessions/new
waitForTextcontent*Log In to SonarQube*
typeid=loginadmin
typeid=passwordadmin
clickAndWaitcommit
waitForTextcss=.navbar*Administrator*
clickLink=Administrator
assertTextPresentLog out
clickAndWaitlink=Log out
waitForElementPresentlink=Log inLog in
+ + diff --git a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/login_wrong_password.html b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/login_wrong_password.html new file mode 100644 index 00000000000..077428d0b13 --- /dev/null +++ b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/login_wrong_password.html @@ -0,0 +1,45 @@ + + + + + + login_wrong_password + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
open/sessions/new
waitForTextcontent*Log In to SonarQube*
typeid=loginadmin
typeid=passwordwrong
clickAndWaitcommit
assertTextPresentAuthentication failed
+ + diff --git a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_original_url_after_direct_login.html b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_original_url_after_direct_login.html new file mode 100644 index 00000000000..65fb94f9368 --- /dev/null +++ b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_original_url_after_direct_login.html @@ -0,0 +1,54 @@ + + + + + + redirect-to-original-url-after-direct-login + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
open/sessions/logout
open/settings?category=general
waitForTextcontent*Log In to SonarQube*
typeid=loginadmin
typeid=passwordadmin
clickAndWaitname=commit
waitForTextcss=.navbar*Administrator*
assertLocationglob:*/settings?category=general*
+ + diff --git a/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_original_url_after_indirect_login.html b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_original_url_after_indirect_login.html new file mode 100644 index 00000000000..0200a72cf4b --- /dev/null +++ b/it/it-tests/src/test/resources/user/LocalAuthenticationTest/redirect_to_original_url_after_indirect_login.html @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
open/sessions/logout
open/settings/index
assertLocation*/sessions/new
waitForTextcontent*Log In to SonarQube*
typeid=loginadmin
typeid=passwordadmin
clickAndWaitcommit
waitForTextcss=.navbar*Administrator*
assertLocation*/settings/index
assertElementPresentplugins
+ + diff --git a/it/it-tests/src/test/resources/user/MyAccountPageTest/should_change_password.html b/it/it-tests/src/test/resources/user/MyAccountPageTest/should_change_password.html index 12e4a89af7d..7d224eb3b87 100644 --- a/it/it-tests/src/test/resources/user/MyAccountPageTest/should_change_password.html +++ b/it/it-tests/src/test/resources/user/MyAccountPageTest/should_change_password.html @@ -21,12 +21,12 @@ type - login + id=login account-user type - password + id=password password @@ -81,12 +81,12 @@ type - login + id=login account-user type - password + id=password new_password diff --git a/it/it-tests/src/test/resources/user/MyAccountPageTest/should_display_issues.html b/it/it-tests/src/test/resources/user/MyAccountPageTest/should_display_issues.html index 090cb4fba15..ac6bc7c6240 100644 --- a/it/it-tests/src/test/resources/user/MyAccountPageTest/should_display_issues.html +++ b/it/it-tests/src/test/resources/user/MyAccountPageTest/should_display_issues.html @@ -21,12 +21,12 @@ type - login + id=login account-user type - password + id=password password diff --git a/it/it-tests/src/test/resources/user/MyAccountPageTest/should_display_user_details.html b/it/it-tests/src/test/resources/user/MyAccountPageTest/should_display_user_details.html index d0b30c02def..5618f8d05ec 100644 --- a/it/it-tests/src/test/resources/user/MyAccountPageTest/should_display_user_details.html +++ b/it/it-tests/src/test/resources/user/MyAccountPageTest/should_display_user_details.html @@ -21,12 +21,12 @@ type - login + id=login account-user type - password + id=password password -- 2.39.5