From cafc905a1e49f596b951ef3d94a7f05214b9e15d Mon Sep 17 00:00:00 2001
From: Jon Koops
- * Usage example:
- * {@code
- * new FluentTestsHelper()
- * .init()
- * .createDirectGrantClient("direct-grant-client")
- * .deleteClient("direct-grant-client")
- * .createTestUser("seb", "seb")
- * .assignRoleWithUser("seb", "user")
- * .deleteTestUser("seb")
- * .deleteRole("user");
- * }
- *
this
- */
- public FluentTestsHelper init() {
- keycloak = createKeycloakInstance(keycloakBaseUrl, adminRealm, adminUserName, adminPassword, adminClient);
- accessToken = generateInitialAccessToken();
- isInitialized = true;
- return this;
- }
-
- /**
- * @return Returns true
if this helper has been initialized.
- */
- public boolean isInitialized() {
- return isInitialized;
- }
-
- protected Keycloak createKeycloakInstance(String keycloakBaseUrl, String realm, String username, String password, String clientId) {
- return Keycloak.getInstance(keycloakBaseUrl, realm, username, password, clientId);
- }
-
- /**
- * For more complex test scenarios
- *
- * @return Keycloak Client instance
- */
- public Keycloak getKeycloakInstance() {
- assert isInitialized;
- return keycloak;
- }
-
- protected String generateInitialAccessToken() {
- ClientInitialAccessCreatePresentation rep = new ClientInitialAccessCreatePresentation();
- rep.setCount(2);
- rep.setExpiration(180);
- ClientInitialAccessPresentation initialAccess = keycloak.realms().realm(testRealm).clientInitialAccess().create(rep);
- return initialAccess.getToken();
- }
-
- /**
- * Creates a new client based on its representation.
- *
- * @param clientRepresentation Client data.
- * @return this
- */
- public FluentTestsHelper createClient(ClientRepresentation clientRepresentation) throws ClientRegistrationException, JsonProcessingException {
- assert isInitialized;
- ClientRegistration reg = ClientRegistration.create()
- .url(keycloakBaseUrl, testRealm)
- .build();
- reg.auth(Auth.token(accessToken));
- clientRepresentation = reg.create(clientRepresentation);
- String registrationAccessCode = clientRepresentation.getRegistrationAccessToken();
- reg.auth(Auth.token(registrationAccessCode));
- createdClients.put(clientRepresentation.getClientId(), new ClientData(clientRepresentation, registrationAccessCode));
- return this;
- }
-
- /**
- * Creates a direct grant client.
- *
- * @see {@link #createClient(ClientRepresentation)}
- */
- public FluentTestsHelper createDirectGrantClient(String clientId) throws ClientRegistrationException, JsonProcessingException {
- assert isInitialized;
- createClient(ClientBuilder.create(clientId).accessType(PUBLIC));
- return this;
- }
-
- /**
- * Deletes a client previously created by this helper. This will throw an error if you try to delete an
- * arbitrary client.
- *
- * @param clientId Client id to be deleted.
- * @return this
- * @throws ClientRegistrationException Thrown when client registration error occurs.
- */
- public FluentTestsHelper deleteClient(String clientId) throws ClientRegistrationException {
- assert isInitialized;
- ClientData clientData = createdClients.get(clientId);
- if (clientData == null) {
- throw new ClientRegistrationException("This client wasn't created by this helper!");
- }
- ClientRegistration reg = ClientRegistration.create()
- .url(keycloakBaseUrl, testRealm)
- .build();
- reg.auth(Auth.token(clientData.getRegistrationCode()));
- reg.delete(clientId);
- return this;
- }
-
- /**
- * @see #importTestRealm(InputStream)
- */
- public FluentTestsHelper importTestRealm(String realmJsonPath) throws IOException {
- try (InputStream fis = FluentTestsHelper.class.getResourceAsStream(realmJsonPath)) {
- return importTestRealm(fis);
- }
- }
-
- /**
- * @see #importTestRealm(InputStream)
- */
- public FluentTestsHelper importTestRealm(File realmJsonPath) throws IOException {
- try (FileInputStream fis = new FileInputStream(realmJsonPath)) {
- return importTestRealm(fis);
- }
- }
-
- /**
- * Import a test realm.
- *
- * @param stream A stream representing a JSON file with an exported realm.
- * @return this
- * @throws IOException Thrown in case of parsing error.
- */
- public FluentTestsHelper importTestRealm(InputStream stream) throws IOException {
- ObjectMapper mapper = new ObjectMapper();
- RealmRepresentation realmRepresentation = mapper.readValue(stream, RealmRepresentation.class);
- return createTestRealm(realmRepresentation);
- }
-
- /**
- * Creates a test realm.
- *
- * @param realmRepresentation A test realm representation.
- * @return this
- */
- public FluentTestsHelper createTestRealm(RealmRepresentation realmRepresentation) {
- assert isInitialized;
- keycloak.realms().create(realmRepresentation);
- testRealm = realmRepresentation.getRealm();
- accessToken = generateInitialAccessToken();
- return this;
- }
-
- /**
- * Deletes a realm.
- *
- * @param realmName Realm to be deleted.
- * @return this
- */
- public FluentTestsHelper deleteRealm(String realmName) {
- assert isInitialized;
- keycloak.realms().realm(realmName).remove();
- return this;
- }
-
- /**
- * Deletes the test realm. Meant to be called after testing has finished.
- *
- * @return this
- */
- public FluentTestsHelper deleteTestRealm() {
- deleteRealm(testRealm);
- return this;
- }
-
- /**
- * Creates a test user.
- *
- * @param username A username to be created.
- * @param password A password for a user.
- * @return this
- */
- public FluentTestsHelper createTestUser(String username, String password) {
- assert isInitialized;
- UserRepresentation userRepresentation = new UserRepresentation();
- userRepresentation.setUsername(username);
- userRepresentation.setEnabled(true);
- Response response = keycloak.realms().realm(testRealm).users().create(userRepresentation);
- String userId = getCreatedId(response);
- response.close();
- CredentialRepresentation rep = new CredentialRepresentation();
- rep.setType(CredentialRepresentation.PASSWORD);
- rep.setValue(password);
- rep.setTemporary(false);
- keycloak.realms().realm(testRealm).users().get(userId).resetPassword(rep);
- return this;
- }
-
- /**
- * Associates a user with a role. This method also creates a role if that is missing.
- *
- * @param userName A username to be associated with a role.
- * @param roleName A role to be associated with a user name.
- * @return this
- */
- public FluentTestsHelper assignRoleWithUser(String userName, String roleName) {
- assert isInitialized;
- if (keycloak.realms().realm(testRealm).roles().get(roleName) == null) {
- RoleRepresentation representation = new RoleRepresentation();
- representation.setName(roleName);
- keycloak.realms().realm(testRealm).roles().create(representation);
- }
- UserRepresentation userRepresentation = keycloak.realms().realm(testRealm).users().search(userName).get(0);
- RoleRepresentation realmRole = keycloak.realms().realm(testRealm).roles().get(roleName).toRepresentation();
- keycloak.realms().realm(testRealm).users().get(userRepresentation.getId()).roles().realmLevel().add(Arrays.asList(realmRole));
- return this;
- }
-
- /**
- * Deletes a role.
- *
- * @param roleName A Role name to be deleted.
- * @return this
- */
- public FluentTestsHelper deleteRole(String roleName) {
- assert isInitialized;
- RoleResource role = keycloak.realms().realm(testRealm).roles().get(roleName);
- if (role != null) {
- keycloak.realms().realm(testRealm).roles().deleteRole(roleName);
- }
- return this;
- }
-
- /**
- * Deletes a user.
- *
- * @param userName A Username to be deleted.
- * @return this
- */
- public FluentTestsHelper deleteTestUser(String userName) {
- assert isInitialized;
- UserRepresentation userInKeycloak = keycloak.realms().realm(testRealm).users().search(userName).get(0);
- if (userInKeycloak != null) {
- keycloak.realms().realm(testRealm).users().delete(userInKeycloak.getId());
- }
- return this;
- }
-
- /**
- * @param response
- * @return ID of the created record
- */
- public String getCreatedId(Response response) {
- URI location = response.getLocation();
- if (!response.getStatusInfo().equals(Response.Status.CREATED)) {
- Response.StatusType statusInfo = response.getStatusInfo();
- throw new WebApplicationException("Create method returned status "
- + statusInfo.getReasonPhrase() + " (Code: " + statusInfo.getStatusCode() + "); expected status: Created (201)", response);
- }
- if (location == null) {
- return null;
- }
- String path = location.getPath();
- return path.substring(path.lastIndexOf('/') + 1);
- }
-
- /**
- * Checks if given endpoint returns successfully with supplied token.
- *
- * @param endpoint Endpoint to be evaluated,
- * @param token Token that will be passed into the Authorization
header.
- * @return true
if the endpoint returns forbidden.
- * @throws IOException Thrown by the underlying HTTP Client implementation
- */
- public boolean testGetWithAuth(String endpoint, String token) throws IOException {
- CloseableHttpClient client = HttpClientBuilder.create().build();
-
- try {
- HttpGet get = new HttpGet(keycloakBaseUrl + endpoint);
- get.addHeader("Authorization", "Bearer " + token);
-
- HttpResponse response = client.execute(get);
- if (response.getStatusLine().getStatusCode() != 200) {
- return false;
- }
- HttpEntity entity = response.getEntity();
- InputStream is = entity.getContent();
- try {
- return true;
- } finally {
- is.close();
- }
-
- } finally {
- client.close();
- }
- }
-
- /**
- * Checks if a given endpoint returns Forbidden HTTP Code.
- *
- * @param endpoint Endpoint to be evaluated,
- * @return true
if the endpoint returns forbidden.
- * @throws IOException Thrown by the underlying HTTP Client implementation
- */
- public boolean returnsForbidden(String endpoint) throws IOException {
- CloseableHttpClient client = HttpClientBuilder.create().build();
- try {
- HttpGet get = new HttpGet(keycloakBaseUrl + endpoint);
- HttpResponse response = client.execute(get);
- if (response.getStatusLine().getStatusCode() == 403 || response.getStatusLine().getStatusCode() == 401) {
- return true;
- } else {
- return false;
- }
-
- } finally {
- client.close();
- }
- }
-
- /**
- * @return Returns an Access Token.
- */
- public String getToken() {
- assert isInitialized;
- return keycloak.tokenManager().getAccessTokenString();
- }
-
- public String getKeycloakBaseUrl() {
- return keycloakBaseUrl;
- }
-
- public String getAdminUserName() {
- return adminUserName;
- }
-
- public String getAdminPassword() {
- return adminPassword;
- }
-
- public String getAdminClientId() {
- return adminClient;
- }
-
- public String getAdminRealmName() {
- return adminRealm;
- }
-
- public String getTestRealmName() {
- return testRealm;
- }
-
- public RealmResource getTestRealmResource() {
- assert isInitialized;
- return keycloak.realm(testRealm);
- }
-
- @Override
- public void close() {
- if (keycloak != null && !keycloak.isClosed()) {
- keycloak.close();
- }
- isInitialized = false;
- }
-}
diff --git a/misc/keycloak-test-helper/src/main/java/org/keycloak/test/TestsHelper.java b/misc/keycloak-test-helper/src/main/java/org/keycloak/test/TestsHelper.java
deleted file mode 100644
index 2f55e80d2c..0000000000
--- a/misc/keycloak-test-helper/src/main/java/org/keycloak/test/TestsHelper.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2017, Red Hat, Inc. and/or its affiliates, and individual
- * contributors by the @authors tag. See the copyright.txt in the
- * distribution for a full listing of individual contributors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.keycloak.test;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.keycloak.admin.client.Keycloak;
-import org.keycloak.client.registration.Auth;
-import org.keycloak.client.registration.ClientRegistration;
-import org.keycloak.client.registration.ClientRegistrationException;
-import org.keycloak.representations.idm.ClientInitialAccessCreatePresentation;
-import org.keycloak.representations.idm.ClientInitialAccessPresentation;
-import org.keycloak.representations.idm.ClientRepresentation;
-import org.keycloak.representations.idm.CredentialRepresentation;
-import org.keycloak.representations.idm.RealmRepresentation;
-import org.keycloak.representations.idm.RoleRepresentation;
-import org.keycloak.representations.idm.UserRepresentation;
-import org.keycloak.test.builders.ClientBuilder;
-
-import jakarta.ws.rs.WebApplicationException;
-import jakarta.ws.rs.core.Response;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.util.Arrays;
-
-import static org.keycloak.test.builders.ClientBuilder.AccessType.PUBLIC;
-
-/**
- * @deprecated This class will be removed in the next major release. Please migrate to {@link FluentTestsHelper}.
- */
-@Deprecated
-public class TestsHelper {
-
- public static String baseUrl;
-
- public static String keycloakBaseUrl = "http://localhost:8180";
-
- public static String testRealm = "test-realm";
-
- public static String initialAccessCode;
-
- public static String appName;
-
- public static int initialAccessTokenCount = 2;
-
- protected static String clientConfiguration;
-
- protected static String registrationAccessCode;
-
- public static String createClient(ClientRepresentation clientRepresentation) {
- ClientRegistration reg = ClientRegistration.create()
- .url(keycloakBaseUrl, testRealm)
- .build();
-
- reg.auth(Auth.token(initialAccessCode));
- try {
- clientRepresentation = reg.create(clientRepresentation);
- registrationAccessCode = clientRepresentation.getRegistrationAccessToken();
- ObjectMapper mapper = new ObjectMapper();
- reg.auth(Auth.token(registrationAccessCode));
- clientConfiguration = mapper.writeValueAsString(reg.getAdapterConfig(clientRepresentation.getClientId()));
- } catch (ClientRegistrationException e) {
- e.printStackTrace();
- } catch (JsonProcessingException e) {
- e.printStackTrace();
- }
-
- return clientConfiguration;
- }
-
- public static String createDirectGrantClient() {
- return createClient(ClientBuilder.create("test-dga").accessType(PUBLIC));
- }
-
- public static void deleteClient(String clientId) {
- ClientRegistration reg = ClientRegistration.create()
- .url(keycloakBaseUrl, testRealm)
- .build();
- try {
- reg.auth(Auth.token(registrationAccessCode));
- reg.delete(clientId);
- } catch (ClientRegistrationException e) {
- e.printStackTrace();
- }
- }
-
- public static boolean testGetWithAuth(String endpoint, String token) throws IOException {
- CloseableHttpClient client = HttpClientBuilder.create().build();
-
- try {
- HttpGet get = new HttpGet(baseUrl + endpoint);
- get.addHeader("Authorization", "Bearer " + token);
-
- HttpResponse response = client.execute(get);
- if (response.getStatusLine().getStatusCode() != 200) {
- return false;
- }
- HttpEntity entity = response.getEntity();
- InputStream is = entity.getContent();
- try {
- return true;
- } finally {
- is.close();
- }
-
- } finally {
- client.close();
- }
- }
-
- public static boolean returnsForbidden(String endpoint) throws IOException {
- CloseableHttpClient client = HttpClientBuilder.create().build();
- try {
- HttpGet get = new HttpGet(baseUrl + endpoint);
- HttpResponse response = client.execute(get);
- if (response.getStatusLine().getStatusCode() == 403 || response.getStatusLine().getStatusCode() == 401) {
- return true;
- } else {
- return false;
- }
-
- } finally {
- client.close();
- }
- }
-
- public static String getToken(String username, String password, String realm) {
- Keycloak keycloak = Keycloak.getInstance(
- keycloakBaseUrl,
- realm,
- username,
- password,
- "test-dga");
- return keycloak.tokenManager().getAccessTokenString();
-
- }
-
- public static boolean importTestRealm(String username, String password, String realmJsonPath) throws IOException {
-
- ObjectMapper mapper = new ObjectMapper();
- try (InputStream stream = TestsHelper.class.getResourceAsStream(realmJsonPath)) {
- RealmRepresentation realmRepresentation = mapper.readValue(stream, RealmRepresentation.class);
-
- Keycloak keycloak = Keycloak.getInstance(
- keycloakBaseUrl,
- "master",
- username,
- password,
- "admin-cli");
- keycloak.realms().create(realmRepresentation);
- testRealm = realmRepresentation.getRealm();
- generateInitialAccessToken(keycloak);
- return true;
- }
-
- }
-
- public static boolean importTestRealm(String username, String password) throws IOException {
- testRealm = appName + "-realm";
- RealmRepresentation realmRepresentation = new RealmRepresentation();
- realmRepresentation.setRealm(testRealm);
- realmRepresentation.setEnabled(true);
- Keycloak keycloak = Keycloak.getInstance(
- keycloakBaseUrl,
- "master",
- username,
- password,
- "admin-cli");
- keycloak.realms().create(realmRepresentation);
- generateInitialAccessToken(keycloak);
- return true;
- }
-
- private static void generateInitialAccessToken(Keycloak keycloak) {
- ClientInitialAccessCreatePresentation rep = new ClientInitialAccessCreatePresentation();
- rep.setCount(initialAccessTokenCount);
- rep.setExpiration(100);
- ClientInitialAccessPresentation initialAccess = keycloak.realms().realm(testRealm).clientInitialAccess().create(rep);
- initialAccessCode = initialAccess.getToken();
- }
-
- public static boolean deleteRealm(String username, String password, String realmName) throws IOException {
-
- Keycloak keycloak = Keycloak.getInstance(
- keycloakBaseUrl,
- "master",
- username,
- password,
- "admin-cli");
- keycloak.realms().realm(realmName).remove();
- return true;
-
- }
-
- public static boolean createTestUser(String username, String password, String realmName) throws IOException {
-
- Keycloak keycloak = Keycloak.getInstance(
- keycloakBaseUrl,
- "master",
- username,
- password,
- "admin-cli");
- UserRepresentation userRepresentation = new UserRepresentation();
- userRepresentation.setUsername(username);
- userRepresentation.setEnabled(Boolean.TRUE);
- Response response = keycloak.realms().realm(realmName).users().create(userRepresentation);
- String userId = getCreatedId(response);
- response.close();
- CredentialRepresentation rep = new CredentialRepresentation();
- rep.setType(CredentialRepresentation.PASSWORD);
- rep.setValue(password);
- rep.setTemporary(false);
- keycloak.realms().realm(realmName).users().get(userId).resetPassword(rep);
- //add roles
- RoleRepresentation representation = new RoleRepresentation();
- representation.setName("user");
-
- keycloak.realms().realm(realmName).roles().create(representation);
- RoleRepresentation realmRole = keycloak.realms().realm(realmName).roles().get("user").toRepresentation();
- keycloak.realms().realm(realmName).users().get(userId).roles().realmLevel().add(Arrays.asList(realmRole));
- return true;
-
- }
-
- public static String getCreatedId(Response response) {
- URI location = response.getLocation();
- if (!response.getStatusInfo().equals(Response.Status.CREATED)) {
- Response.StatusType statusInfo = response.getStatusInfo();
- throw new WebApplicationException("Create method returned status "
- + statusInfo.getReasonPhrase() + " (Code: " + statusInfo.getStatusCode() + "); expected status: Created (201)", response);
- }
- if (location == null) {
- return null;
- }
- String path = location.getPath();
- return path.substring(path.lastIndexOf('/') + 1);
- }
-
-}
diff --git a/misc/keycloak-test-helper/src/main/java/org/keycloak/test/builders/ClientBuilder.java b/misc/keycloak-test-helper/src/main/java/org/keycloak/test/builders/ClientBuilder.java
deleted file mode 100644
index 49a1d6ae58..0000000000
--- a/misc/keycloak-test-helper/src/main/java/org/keycloak/test/builders/ClientBuilder.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright 2016 Red Hat, Inc. and/or its affiliates
- * and other contributors as indicated by the @author tags.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.keycloak.test.builders;
-
-import org.keycloak.protocol.oidc.OIDCAdvancedConfigWrapper;
-import org.keycloak.representations.idm.ClientRepresentation;
-
-import java.util.Collections;
-
-/**
- * @author Bruno Oliveira
- */
-public class ClientBuilder {
-
- private ClientRepresentation rep;
-
- public enum AccessType { BEARER_ONLY, PUBLIC, CONFIDENTIAL };
-
- public static ClientBuilder create(String clientId) {
- ClientRepresentation rep = new ClientRepresentation();
- rep.setEnabled(Boolean.TRUE);
- rep.setClientId(clientId);
- return new ClientBuilder(rep);
- }
-
- private ClientBuilder(ClientRepresentation rep) {
- this.rep = rep;
- }
-
- public ClientRepresentation accessType(AccessType accessType) {
- switch (accessType) {
- case BEARER_ONLY:
- rep.setBearerOnly(true);
- break;
- case PUBLIC:
- rep.setPublicClient(true);
- break;
- case CONFIDENTIAL:
- rep.setPublicClient(false);
- break;
- }
- return defaultSettings();
- }
-
- public ClientBuilder rootUrl(String rootUrl) {
- rep.setRootUrl(rootUrl);
- return this;
- }
-
- public ClientBuilder redirectUri(String redirectUri) {
- rep.setRedirectUris(Collections.singletonList(redirectUri));
- return this;
- }
-
- public ClientBuilder baseUrl(String baseUrl) {
- rep.setBaseUrl(baseUrl);
- return this;
- }
-
- public ClientBuilder adminUrl(String adminUrl) {
- rep.setAdminUrl(adminUrl);
- return this;
- }
-
- public ClientBuilder secret(String secret) {
- rep.setSecret(secret);
- return this;
- }
-
- private ClientRepresentation defaultSettings() {
- rep.setFullScopeAllowed(true);
- rep.setDirectAccessGrantsEnabled(true);
- rep.setAdminUrl(rep.getRootUrl());
-
- if (rep.getRedirectUris() == null && rep.getRootUrl() != null)
- rep.setRedirectUris(Collections.singletonList(rep.getRootUrl().concat("/*")));
- if (OIDCAdvancedConfigWrapper.fromClientRepresentation(rep).getPostLogoutRedirectUris() == null) {
- OIDCAdvancedConfigWrapper.fromClientRepresentation(rep).setPostLogoutRedirectUris(Collections.singletonList("+"));
- }
- return rep;
- }
-
-}
diff --git a/misc/keycloak-test-helper/src/main/java/org/keycloak/test/builders/UserBuilder.java b/misc/keycloak-test-helper/src/main/java/org/keycloak/test/builders/UserBuilder.java
deleted file mode 100644
index e5bdd36e9c..0000000000
--- a/misc/keycloak-test-helper/src/main/java/org/keycloak/test/builders/UserBuilder.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright 2023 Red Hat, Inc. and/or its affiliates
- * and other contributors as indicated by the @author tags.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.keycloak.test.builders;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.LinkedList;
-
-import org.keycloak.models.credential.OTPCredentialModel;
-import org.keycloak.models.utils.HmacOTP;
-import org.keycloak.models.utils.ModelToRepresentation;
-import org.keycloak.representations.idm.CredentialRepresentation;
-import org.keycloak.representations.idm.FederatedIdentityRepresentation;
-import org.keycloak.representations.idm.UserRepresentation;
-
-/**
- * @author Stian Thorgersen
- */
-public class UserBuilder {
-
- private final UserRepresentation rep;
-
- public static UserBuilder create() {
- UserRepresentation rep = new UserRepresentation();
- rep.setEnabled(Boolean.TRUE);
- return new UserBuilder(rep);
- }
-
- public static UserBuilder edit(UserRepresentation rep) {
- return new UserBuilder(rep);
- }
-
- private UserBuilder(UserRepresentation rep) {
- this.rep = rep;
- }
-
- public UserBuilder id(String id) {
- rep.setId(id);
- return this;
- }
-
- public UserBuilder username(String username) {
- rep.setUsername(username);
- return this;
- }
-
- public UserBuilder firstName(String firstName) {
- rep.setFirstName(firstName);
- return this;
- }
-
- public UserBuilder lastName(String lastName) {
- rep.setLastName(lastName);
- return this;
- }
-
- /**
- * This method adds additional passwords to the user.
- */
- public UserBuilder addPassword(String password) {
- if (rep.getCredentials() == null) {
- rep.setCredentials(new LinkedList<>());
- }
-
- CredentialRepresentation credential = new CredentialRepresentation();
- credential.setType(CredentialRepresentation.PASSWORD);
- credential.setValue(password);
-
- rep.getCredentials().add(credential);
- return this;
- }
-
- public UserBuilder addAttribute(String name, String... values) {
- if (rep.getAttributes() == null) {
- rep.setAttributes(new HashMap<>());
- }
-
- rep.getAttributes().put(name, Arrays.asList(values));
- return this;
- }
-
- /**
- * This method makes sure that there is one single password for the user.
- */
- public UserBuilder password(String password) {
- rep.setCredentials(null);
- return addPassword(password);
- }
-
- public UserBuilder email(String email) {
- rep.setEmail(email);
- return this;
- }
-
- public UserBuilder emailVerified(boolean emailVerified) {
- rep.setEmailVerified(emailVerified);
- return this;
- }
-
- public UserBuilder enabled(boolean enabled) {
- rep.setEnabled(enabled);
- return this;
- }
-
- public UserBuilder addRoles(String... roles) {
- if (rep.getRealmRoles() == null) {
- rep.setRealmRoles(new ArrayList<>());
- }
- rep.getRealmRoles().addAll(Arrays.asList(roles));
- return this;
- }
-
- public UserBuilder role(String client, String role) {
- if (rep.getClientRoles() == null) {
- rep.setClientRoles(new HashMap<>());
- }
- if (rep.getClientRoles().get(client) == null) {
- rep.getClientRoles().put(client, new LinkedList<>());
- }
- rep.getClientRoles().get(client).add(role);
- return this;
- }
-
- public UserBuilder requiredAction(String requiredAction) {
- if (rep.getRequiredActions() == null) {
- rep.setRequiredActions(new LinkedList<>());
- }
- rep.getRequiredActions().add(requiredAction);
- return this;
- }
-
- public UserBuilder serviceAccountId(String serviceAccountId) {
- rep.setServiceAccountClientId(serviceAccountId);
- return this;
- }
-
- public UserBuilder secret(CredentialRepresentation credential) {
- if (rep.getCredentials() == null) {
- rep.setCredentials(new LinkedList<>());
- }
-
- rep.getCredentials().add(credential);
- rep.setTotp(true);
- return this;
- }
-
- public UserBuilder totpSecret(String totpSecret) {
- CredentialRepresentation credential = ModelToRepresentation.toRepresentation(
- OTPCredentialModel.createTOTP(totpSecret, 6, 30, HmacOTP.HMAC_SHA1));
- return secret(credential);
- }
-
- public UserBuilder hotpSecret(String hotpSecret) {
- CredentialRepresentation credential = ModelToRepresentation.toRepresentation(
- OTPCredentialModel.createHOTP(hotpSecret, 6, 0, HmacOTP.HMAC_SHA1));
- return secret(credential);
- }
-
- public UserBuilder otpEnabled() {
- rep.setTotp(Boolean.TRUE);
- return this;
- }
-
- public UserBuilder addGroups(String... group) {
- if (rep.getGroups() == null) {
- rep.setGroups(new ArrayList<>());
- }
- rep.getGroups().addAll(Arrays.asList(group));
- return this;
- }
-
- public UserBuilder federatedLink(String identityProvider, String federatedUserId) {
- if (rep.getFederatedIdentities() == null) {
- rep.setFederatedIdentities(new LinkedList<>());
- }
- FederatedIdentityRepresentation federatedIdentity = new FederatedIdentityRepresentation();
- federatedIdentity.setUserId(federatedUserId);
- federatedIdentity.setUserName(rep.getUsername());
- federatedIdentity.setIdentityProvider(identityProvider);
-
- rep.getFederatedIdentities().add(federatedIdentity);
- return this;
- }
-
- public UserRepresentation build() {
- return rep;
- }
-}
\ No newline at end of file
diff --git a/misc/keycloak-test-helper/src/main/java/org/keycloak/test/page/IndexPage.java b/misc/keycloak-test-helper/src/main/java/org/keycloak/test/page/IndexPage.java
deleted file mode 100644
index d51f9a1fdb..0000000000
--- a/misc/keycloak-test-helper/src/main/java/org/keycloak/test/page/IndexPage.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2016 Red Hat, Inc. and/or its affiliates
- * and other contributors as indicated by the @author tags.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.keycloak.test.page;
-
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.support.FindBy;
-
-/**
- * @author Bruno Oliveira
- */
-public class IndexPage {
-
- public static final String UNAUTHORIZED = "401 Unauthorized";
-
- @FindBy(name = "loginBtn")
- private WebElement loginButton;
-
- @FindBy(name = "logoutBtn")
- private WebElement logoutButton;
-
- @FindBy(name = "adminBtn")
- private WebElement adminButton;
-
- @FindBy(name = "publicBtn")
- private WebElement publicButton;
-
- @FindBy(name = "securedBtn")
- private WebElement securedBtn;
-
- public void clickLogin() {
- loginButton.click();
- }
-
- public void clickLogout() {
- logoutButton.click();
- }
-
- public void clickAdmin() {
- adminButton.click();
- }
-
- public void clickPublic() {
- publicButton.click();
- }
-
- public void clickSecured() {
- securedBtn.click();
- }
-}
diff --git a/misc/keycloak-test-helper/src/main/java/org/keycloak/test/page/LoginPage.java b/misc/keycloak-test-helper/src/main/java/org/keycloak/test/page/LoginPage.java
deleted file mode 100644
index 5c2bed0643..0000000000
--- a/misc/keycloak-test-helper/src/main/java/org/keycloak/test/page/LoginPage.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright 2016 Red Hat, Inc. and/or its affiliates
- * and other contributors as indicated by the @author tags.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.keycloak.test.page;
-
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.support.FindBy;
-
-/**
- * @author Stian Thorgersen
- */
-public class LoginPage {
-
- @FindBy(id = "username")
- private WebElement usernameInput;
-
- @FindBy(id = "password")
- private WebElement passwordInput;
-
- @FindBy(id = "totp")
- private WebElement totp;
-
- @FindBy(id = "rememberMe")
- private WebElement rememberMe;
-
- @FindBy(name = "login")
- private WebElement submitButton;
-
- @FindBy(name = "cancel")
- private WebElement cancelButton;
-
- @FindBy(linkText = "Register")
- private WebElement registerLink;
-
- @FindBy(linkText = "Forgot Password?")
- private WebElement resetPasswordLink;
-
- @FindBy(linkText = "Username")
- private WebElement recoverUsernameLink;
-
- @FindBy(className = "alert-error")
- private WebElement loginErrorMessage;
-
- @FindBy(className = "alert-warning")
- private WebElement loginWarningMessage;
-
- @FindBy(className = "alert-success")
- private WebElement loginSuccessMessage;
-
-
- @FindBy(className = "alert-info")
- private WebElement loginInfoMessage;
-
- @FindBy(className = "instruction")
- private WebElement instruction;
-
-
- @FindBy(id = "kc-current-locale-link")
- private WebElement languageText;
-
- @FindBy(id = "kc-locale-dropdown")
- private WebElement localeDropdown;
-
- public void login(String username, String password) {
- usernameInput.clear();
- usernameInput.sendKeys(username);
-
- passwordInput.clear();
- passwordInput.sendKeys(password);
-
- submitButton.click();
- }
-}
diff --git a/misc/keycloak-test-helper/src/main/java/org/keycloak/test/page/ProfilePage.java b/misc/keycloak-test-helper/src/main/java/org/keycloak/test/page/ProfilePage.java
deleted file mode 100644
index 903ee12e7a..0000000000
--- a/misc/keycloak-test-helper/src/main/java/org/keycloak/test/page/ProfilePage.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright 2016 Red Hat, Inc. and/or its affiliates
- * and other contributors as indicated by the @author tags.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.keycloak.test.page;
-
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.support.FindBy;
-
-/**
- * @author Bruno Oliveira
- */
-public class ProfilePage {
-
- @FindBy(name = "profileBtn")
- private WebElement profileButton;
-
- @FindBy(name = "tokenBtn")
- private WebElement tokenButton;
-
- @FindBy(name = "logoutBtn")
- private WebElement logoutButton;
-
- @FindBy(name = "accountBtn")
- private WebElement accountButton;
-
- @FindBy(id = "token-content")
- private WebElement tokenContent;
-
- @FindBy(id = "username")
- private WebElement username;
-
- public String getUsername() {
- return username.getText();
- }
-
- public void clickProfile() {
- profileButton.click();
- }
-
- public void clickToken() {
- tokenButton.click();
- }
-
- public void clickLogout() {
- logoutButton.click();
- }
-
- public void clickAccount() {
- accountButton.click();
- }
-
- public String getTokenContent() throws Exception {
- return tokenContent.getText();
- }
-
-}
-
diff --git a/misc/log/LogTrimmer.java b/misc/log/LogTrimmer.java
index c96ef740b2..de01ab7d80 100644
--- a/misc/log/LogTrimmer.java
+++ b/misc/log/LogTrimmer.java
@@ -5,7 +5,7 @@ import java.util.regex.Pattern;
/**
* A simple utility class for trimming test output (if successful).
*
- * Created to shrink down the output for Travis.
+ * Created to shrink down the output for GitHub Actions.
*
* Created by st on 03/07/17.
*/
diff --git a/misc/logo/README.md b/misc/logo/README.md
deleted file mode 100644
index 9927109460..0000000000
--- a/misc/logo/README.md
+++ /dev/null
@@ -1 +0,0 @@
-Move to https://github.com/keycloak/keycloak-misc
diff --git a/misc/pom.xml b/misc/pom.xml
deleted file mode 100644
index 38b811c4cf..0000000000
--- a/misc/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-