mirror of
https://github.com/keycloak/keycloak.git
synced 2026-01-09 15:02:05 -03:30
Refactor SimpleHttp to make it injectable and usable outside server (#42936)
Closes #42902 Signed-off-by: stianst <stianst@gmail.com>
This commit is contained in:
parent
97ab82e483
commit
dbd516f8e6
@ -318,6 +318,10 @@ If, for whatever reason, an administrator in a common realm needs to access the
|
||||
|
||||
The previous workaround is marked as deprecated and it can be removed in a future version of {project_name}.
|
||||
|
||||
=== Refactoring to `SimpleHttp`
|
||||
|
||||
The `SimpleHttp` util in the `server-spi-private` module was refactored and moved to the `org.keycloak.http.simple` package.
|
||||
|
||||
// ------------------------ Deprecated features ------------------------ //
|
||||
== Deprecated features
|
||||
|
||||
|
||||
@ -25,9 +25,10 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.keycloak.component.ComponentModel;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttpRequest;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp.Response;
|
||||
|
||||
import org.keycloak.ipatuura_user_spi.schemas.SCIMSearchRequest;
|
||||
import org.keycloak.ipatuura_user_spi.schemas.SCIMUser;
|
||||
@ -52,7 +53,7 @@ public class Ipatuura {
|
||||
this.session = session;
|
||||
}
|
||||
|
||||
private void parseSetCookie(Response response) throws IOException {
|
||||
private void parseSetCookie(SimpleHttpResponse response) throws IOException {
|
||||
List<String> setCookieHeaders = response.getHeader("Set-Cookie");
|
||||
|
||||
for (String h : setCookieHeaders) {
|
||||
@ -73,7 +74,7 @@ public class Ipatuura {
|
||||
|
||||
public Integer csrfAuthLogin() {
|
||||
|
||||
Response response;
|
||||
SimpleHttpResponse response;
|
||||
|
||||
/* Get inputs */
|
||||
String server = model.getConfig().getFirst("scimurl");
|
||||
@ -84,7 +85,7 @@ public class Ipatuura {
|
||||
String url = String.format("https://%s%s", server, "/admin/login/");
|
||||
|
||||
try {
|
||||
response = SimpleHttp.doGet(url, session).asResponse();
|
||||
response = SimpleHttp.create(session).doGet(url).asResponse();
|
||||
parseSetCookie(response);
|
||||
response.close();
|
||||
} catch (Exception e) {
|
||||
@ -95,7 +96,7 @@ public class Ipatuura {
|
||||
/* Perform login POST */
|
||||
try {
|
||||
/* Here we retrieve the Response sessionid and csrftoken cookie */
|
||||
response = SimpleHttp.doPost(url, session).header("X-CSRFToken", csrf_value).header("Cookie", csrf_cookie)
|
||||
response = SimpleHttp.create(session).doPost(url).header("X-CSRFToken", csrf_value).header("Cookie", csrf_cookie)
|
||||
.header("referer", url).param("username", username).param("password", password).asResponse();
|
||||
|
||||
parseSetCookie(response);
|
||||
@ -120,10 +121,10 @@ public class Ipatuura {
|
||||
String endpointurl = String.format("https://%s/creds/simple_pwd", server);
|
||||
|
||||
logger.debugv("Sending POST request to {0}", endpointurl);
|
||||
SimpleHttp simpleHttp = SimpleHttp.doPost(endpointurl, session).header("X-CSRFToken", this.csrf_value)
|
||||
SimpleHttpRequest simpleHttp = SimpleHttp.create(session).doPost(endpointurl).header("X-CSRFToken", this.csrf_value)
|
||||
.header("Cookie", this.csrf_cookie).header("SessionId", sessionid_cookie).header("referer", endpointurl)
|
||||
.param("username", username).param("password", password);
|
||||
try (Response response = simpleHttp.asResponse()){
|
||||
try (SimpleHttpResponse response = simpleHttp.asResponse()){
|
||||
JsonNode result = response.asJson();
|
||||
return (result.get("result").get("validated").asBoolean());
|
||||
} catch (Exception e) {
|
||||
@ -139,9 +140,9 @@ public class Ipatuura {
|
||||
String endpointurl = String.format("https://%s/bridge/login_kerberos/", server);
|
||||
|
||||
logger.debugv("Sending POST request to {0}", endpointurl);
|
||||
SimpleHttp simpleHttp = SimpleHttp.doPost(endpointurl, session).header("Authorization", "Negotiate " + spnegoToken)
|
||||
SimpleHttpRequest simpleHttp = SimpleHttp.create(session).doPost(endpointurl).header("Authorization", "Negotiate " + spnegoToken)
|
||||
.param("username", "");
|
||||
try (Response response = simpleHttp.asResponse()) {
|
||||
try (SimpleHttpResponse response = simpleHttp.asResponse()) {
|
||||
logger.debugv("Response status is {0}", response.getStatus());
|
||||
return response.getFirstHeader("Remote-User");
|
||||
} catch (Exception e) {
|
||||
@ -150,8 +151,8 @@ public class Ipatuura {
|
||||
}
|
||||
}
|
||||
|
||||
public <T> Response clientRequest(String endpoint, String method, T entity) throws Exception {
|
||||
Response response = null;
|
||||
public <T> SimpleHttpResponse clientRequest(String endpoint, String method, T entity) throws Exception {
|
||||
SimpleHttpResponse response = null;
|
||||
|
||||
if (!this.logged_in) {
|
||||
this.csrfAuthLogin();
|
||||
@ -171,22 +172,22 @@ public class Ipatuura {
|
||||
try {
|
||||
switch (method) {
|
||||
case "GET":
|
||||
response = SimpleHttp.doGet(endpointurl, session).header("X-CSRFToken", csrf_value)
|
||||
response = SimpleHttp.create(session).doGet(endpointurl).header("X-CSRFToken", csrf_value)
|
||||
.header("Cookie", csrf_cookie).header("SessionId", sessionid_cookie).asResponse();
|
||||
break;
|
||||
case "DELETE":
|
||||
response = SimpleHttp.doDelete(endpointurl, session).header("X-CSRFToken", csrf_value)
|
||||
response = SimpleHttp.create(session).doDelete(endpointurl).header("X-CSRFToken", csrf_value)
|
||||
.header("Cookie", csrf_cookie).header("SessionId", sessionid_cookie).header("referer", endpointurl)
|
||||
.asResponse();
|
||||
break;
|
||||
case "POST":
|
||||
/* Header is needed for domains endpoint only, but use it here anyway */
|
||||
response = SimpleHttp.doPost(endpointurl, session).header("X-CSRFToken", this.csrf_value)
|
||||
response = SimpleHttp.create(session).doPost(endpointurl).header("X-CSRFToken", this.csrf_value)
|
||||
.header("Cookie", this.csrf_cookie).header("SessionId", sessionid_cookie)
|
||||
.header("referer", endpointurl).json(entity).asResponse();
|
||||
break;
|
||||
case "PUT":
|
||||
response = SimpleHttp.doPut(endpointurl, session).header("X-CSRFToken", this.csrf_value)
|
||||
response = SimpleHttp.create(session).doPut(endpointurl).header("X-CSRFToken", this.csrf_value)
|
||||
.header("SessionId", sessionid_cookie).header("Cookie", this.csrf_cookie).json(entity).asResponse();
|
||||
break;
|
||||
default:
|
||||
@ -223,7 +224,7 @@ public class Ipatuura {
|
||||
String usersSearchUrl = "Users/.search";
|
||||
SCIMUser user = null;
|
||||
|
||||
Response response;
|
||||
SimpleHttpResponse response;
|
||||
try {
|
||||
response = clientRequest(usersSearchUrl, "POST", newSearch);
|
||||
user = response.asJson(SCIMUser.class);
|
||||
@ -256,13 +257,13 @@ public class Ipatuura {
|
||||
return getUserByAttr(username, attribute);
|
||||
}
|
||||
|
||||
public Response deleteUser(String username) {
|
||||
public SimpleHttpResponse deleteUser(String username) {
|
||||
SCIMUser userobj = getUserByUsername(username);
|
||||
SCIMUser.Resource user = userobj.getResources().get(0);
|
||||
|
||||
String userIdUrl = String.format("Users/%s", user.getId());
|
||||
|
||||
Response response;
|
||||
SimpleHttpResponse response;
|
||||
try {
|
||||
response = clientRequest(userIdUrl, "DELETE", null);
|
||||
} catch (Exception e) {
|
||||
@ -305,12 +306,12 @@ public class Ipatuura {
|
||||
return user;
|
||||
}
|
||||
|
||||
public Response createUser(String username) {
|
||||
public SimpleHttpResponse createUser(String username) {
|
||||
String usersUrl = "Users";
|
||||
|
||||
SCIMUser.Resource newUser = setupUser(username);
|
||||
|
||||
Response response;
|
||||
SimpleHttpResponse response;
|
||||
try {
|
||||
response = clientRequest(usersUrl, "POST", newUser);
|
||||
} catch (Exception e) {
|
||||
@ -349,7 +350,7 @@ public class Ipatuura {
|
||||
}
|
||||
}
|
||||
|
||||
public Response updateUser(Ipatuura ipatuura, String username, String attr, List<String> values) {
|
||||
public SimpleHttpResponse updateUser(Ipatuura ipatuura, String username, String attr, List<String> values) {
|
||||
logger.debug(String.format("Updating %s attribute for %s", attr, username));
|
||||
/* Get existing user */
|
||||
if (ipatuura.csrfAuthLogin() == null) {
|
||||
@ -365,7 +366,7 @@ public class Ipatuura {
|
||||
/* Update user in SCIM */
|
||||
String modifyUrl = String.format("Users/%s", user.getId());
|
||||
|
||||
Response response;
|
||||
SimpleHttpResponse response;
|
||||
try {
|
||||
response = clientRequest(modifyUrl, "PUT", user);
|
||||
} catch (Exception e) {
|
||||
|
||||
@ -17,17 +17,16 @@
|
||||
|
||||
package org.keycloak.ipatuura_user_spi;
|
||||
|
||||
import org.apache.http.HttpStatus;
|
||||
import org.jboss.logging.Logger;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.component.ComponentModel;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.UserModel;
|
||||
import org.keycloak.models.utils.UserModelDelegate;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.http.HttpStatus;
|
||||
|
||||
public class IpatuuraUserModelDelegate extends UserModelDelegate {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(IpatuuraUserModelDelegate.class);
|
||||
@ -44,7 +43,7 @@ public class IpatuuraUserModelDelegate extends UserModelDelegate {
|
||||
|
||||
@Override
|
||||
public void setAttribute(String attr, List<String> values) {
|
||||
SimpleHttp.Response resp = this.ipatuura.updateUser(ipatuura, this.getUsername(), attr, values);
|
||||
SimpleHttpResponse resp = this.ipatuura.updateUser(ipatuura, this.getUsername(), attr, values);
|
||||
try {
|
||||
if (resp.getStatus() != HttpStatus.SC_OK && resp.getStatus() != HttpStatus.SC_NO_CONTENT) {
|
||||
logger.warn("Unexpected PUT status code returned");
|
||||
|
||||
@ -24,6 +24,7 @@ import org.keycloak.credential.CredentialAuthentication;
|
||||
import org.keycloak.credential.CredentialInput;
|
||||
import org.keycloak.credential.CredentialInputValidator;
|
||||
import org.keycloak.credential.UserCredentialManager;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.CredentialValidationOutput;
|
||||
import org.keycloak.models.GroupModel;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
@ -37,7 +38,6 @@ import org.keycloak.storage.UserStoragePrivateUtil;
|
||||
import org.keycloak.storage.user.ImportedUserValidation;
|
||||
import org.keycloak.storage.user.UserLookupProvider;
|
||||
import org.keycloak.storage.user.UserRegistrationProvider;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
|
||||
import org.keycloak.ipatuura_user_spi.authenticator.IpatuuraAuthenticator;
|
||||
import org.keycloak.ipatuura_user_spi.schemas.SCIMError;
|
||||
@ -201,7 +201,7 @@ public class IpatuuraUserStorageProvider implements UserStorageProvider, UserLoo
|
||||
public UserModel addUser(RealmModel realm, String username) {
|
||||
Ipatuura ipatuura = this.ipatuura;
|
||||
|
||||
SimpleHttp.Response resp = ipatuura.createUser(username);
|
||||
SimpleHttpResponse resp = ipatuura.createUser(username);
|
||||
|
||||
try {
|
||||
if (resp.getStatus() != HttpStatus.SC_CREATED) {
|
||||
@ -225,7 +225,7 @@ public class IpatuuraUserStorageProvider implements UserStorageProvider, UserLoo
|
||||
logger.debugv("Removing user: {0}", user.getUsername());
|
||||
Ipatuura ipatuura = this.ipatuura;
|
||||
|
||||
SimpleHttp.Response resp = ipatuura.deleteUser(user.getUsername());
|
||||
SimpleHttpResponse resp = ipatuura.deleteUser(user.getUsername());
|
||||
Boolean status = false;
|
||||
try {
|
||||
status = resp.getStatus() == HttpStatus.SC_NO_CONTENT;
|
||||
@ -267,7 +267,7 @@ public class IpatuuraUserStorageProvider implements UserStorageProvider, UserLoo
|
||||
Ipatuura ipatuura = this.ipatuura;
|
||||
|
||||
SCIMUser user = null;
|
||||
SimpleHttp.Response response;
|
||||
SimpleHttpResponse response;
|
||||
try {
|
||||
response = ipatuura.clientRequest("/Users", "GET", null);
|
||||
user = response.asJson(SCIMUser.class);
|
||||
|
||||
@ -19,9 +19,9 @@ package org.keycloak.ipatuura_user_spi;
|
||||
|
||||
import org.jboss.logging.Logger;
|
||||
import org.keycloak.Config;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.common.Profile;
|
||||
import org.keycloak.component.ComponentModel;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.models.RealmModel;
|
||||
import org.keycloak.component.ComponentValidationException;
|
||||
@ -75,7 +75,7 @@ public class IpatuuraUserStorageProviderFactory implements UserStorageProviderFa
|
||||
throws ComponentValidationException {
|
||||
Ipatuura ipatuura = new Ipatuura(session, config);
|
||||
|
||||
SimpleHttp.Response response;
|
||||
SimpleHttpResponse response;
|
||||
|
||||
try {
|
||||
response = ipatuura.clientRequest("", "GET", null);
|
||||
|
||||
@ -68,7 +68,11 @@ import java.util.zip.GZIPInputStream;
|
||||
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
|
||||
* @author Vlastimil Elias (velias at redhat dot com)
|
||||
* @author David Klassen (daviddd.kl@gmail.com)
|
||||
*
|
||||
* @deprecated An updated version of SimpleHttp is available in {@link org.keycloak.http.simple.SimpleHttp}. This
|
||||
* version will be deleted in Keycloak 27.0
|
||||
*/
|
||||
@Deprecated
|
||||
public class SimpleHttp {
|
||||
|
||||
private static final ObjectMapper mapper = new ObjectMapper();
|
||||
|
||||
@ -0,0 +1,69 @@
|
||||
package org.keycloak.http.simple;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.apache.http.client.HttpClient;
|
||||
import org.apache.http.client.config.RequestConfig;
|
||||
import org.keycloak.connections.httpclient.HttpClientProvider;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
|
||||
public class SimpleHttp {
|
||||
|
||||
private static final ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
private final HttpClient client;
|
||||
private long maxConsumedResponseSize;
|
||||
private RequestConfig requestConfig;
|
||||
|
||||
private SimpleHttp(HttpClient client, long maxConsumedResponseSize) {
|
||||
this.client = client;
|
||||
this.maxConsumedResponseSize = maxConsumedResponseSize;
|
||||
}
|
||||
|
||||
public static SimpleHttp create(KeycloakSession session) {
|
||||
HttpClientProvider provider = session.getProvider(HttpClientProvider.class);
|
||||
return new SimpleHttp(provider.getHttpClient(), provider.getMaxConsumedResponseSize());
|
||||
}
|
||||
|
||||
public static SimpleHttp create(HttpClient httpClient) {
|
||||
return new SimpleHttp(httpClient, HttpClientProvider.DEFAULT_MAX_CONSUMED_RESPONSE_SIZE);
|
||||
}
|
||||
|
||||
public SimpleHttp withRequestConfig(RequestConfig requestConfig) {
|
||||
this.requestConfig = requestConfig;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SimpleHttp withMaxConsumedResponseSize(long maxConsumedResponseSize) {
|
||||
this.maxConsumedResponseSize = maxConsumedResponseSize;
|
||||
return this;
|
||||
}
|
||||
|
||||
private SimpleHttpRequest doRequest(String url, SimpleHttpMethod method) {
|
||||
return new SimpleHttpRequest(url, method, client, requestConfig, maxConsumedResponseSize, objectMapper);
|
||||
}
|
||||
|
||||
public SimpleHttpRequest doGet(String url) {
|
||||
return doRequest(url, SimpleHttpMethod.GET);
|
||||
}
|
||||
|
||||
public SimpleHttpRequest doPost(String url) {
|
||||
return doRequest(url, SimpleHttpMethod.POST);
|
||||
}
|
||||
|
||||
public SimpleHttpRequest doPut(String url) {
|
||||
return doRequest(url, SimpleHttpMethod.PUT);
|
||||
}
|
||||
|
||||
public SimpleHttpRequest doDelete(String url) {
|
||||
return doRequest(url, SimpleHttpMethod.DELETE);
|
||||
}
|
||||
|
||||
public SimpleHttpRequest doHead(String url) {
|
||||
return doRequest(url, SimpleHttpMethod.HEAD);
|
||||
}
|
||||
|
||||
public SimpleHttpRequest doPatch(String url) {
|
||||
return doRequest(url, SimpleHttpMethod.PATCH);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,7 @@
|
||||
package org.keycloak.http.simple;
|
||||
|
||||
enum SimpleHttpMethod {
|
||||
|
||||
GET, DELETE, HEAD, PUT, PATCH, POST
|
||||
|
||||
}
|
||||
277
server-spi-private/src/main/java/org/keycloak/http/simple/SimpleHttpRequest.java
Executable file
277
server-spi-private/src/main/java/org/keycloak/http/simple/SimpleHttpRequest.java
Executable file
@ -0,0 +1,277 @@
|
||||
/*
|
||||
* 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.http.simple;
|
||||
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.HttpHeaders;
|
||||
import org.apache.http.NameValuePair;
|
||||
import org.apache.http.client.HttpClient;
|
||||
import org.apache.http.client.config.RequestConfig;
|
||||
import org.apache.http.client.entity.UrlEncodedFormEntity;
|
||||
import org.apache.http.client.methods.HttpDelete;
|
||||
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.client.methods.HttpHead;
|
||||
import org.apache.http.client.methods.HttpPatch;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
import org.apache.http.client.methods.HttpPut;
|
||||
import org.apache.http.client.methods.HttpRequestBase;
|
||||
import org.apache.http.client.utils.URIBuilder;
|
||||
import org.apache.http.entity.ContentType;
|
||||
import org.apache.http.entity.StringEntity;
|
||||
import org.apache.http.message.BasicNameValuePair;
|
||||
import org.keycloak.common.util.Base64;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
|
||||
* @author Vlastimil Elias (velias at redhat dot com)
|
||||
* @author David Klassen (daviddd.kl@gmail.com)
|
||||
*/
|
||||
public class SimpleHttpRequest {
|
||||
|
||||
private final HttpClient client;
|
||||
private final RequestConfig requestConfig;
|
||||
|
||||
private final ObjectMapper objectMapper;
|
||||
|
||||
private final String url;
|
||||
private final SimpleHttpMethod method;
|
||||
private Map<String, String> headers;
|
||||
private Map<String, String> params;
|
||||
private Object entity;
|
||||
|
||||
private final long maxConsumedResponseSize;
|
||||
|
||||
SimpleHttpRequest(String url, SimpleHttpMethod method, HttpClient client, RequestConfig requestConfig, long maxConsumedResponseSize, ObjectMapper objectMapper) {
|
||||
this.client = client;
|
||||
this.requestConfig = requestConfig;
|
||||
this.url = url;
|
||||
this.method = method;
|
||||
this.maxConsumedResponseSize = maxConsumedResponseSize;
|
||||
this.objectMapper = objectMapper;
|
||||
}
|
||||
|
||||
public SimpleHttpRequest header(String name, String value) {
|
||||
if (headers == null) {
|
||||
headers = new HashMap<>();
|
||||
}
|
||||
headers.put(name, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getHeader(String name) {
|
||||
if (headers != null) {
|
||||
return headers.get(name);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Map<String, String> getHeaders() {
|
||||
if (headers == null) {
|
||||
return null;
|
||||
}
|
||||
return Collections.unmodifiableMap(headers);
|
||||
}
|
||||
|
||||
public String getParam(String name) {
|
||||
if (params == null) {
|
||||
return null;
|
||||
}
|
||||
return params.get(name);
|
||||
}
|
||||
|
||||
public Map<String, String> getParams() {
|
||||
if (params == null) {
|
||||
return null;
|
||||
}
|
||||
return Collections.unmodifiableMap(params);
|
||||
}
|
||||
|
||||
public Object getEntity() {
|
||||
return entity;
|
||||
}
|
||||
|
||||
public SimpleHttpRequest json(Object entity) {
|
||||
this.entity = entity;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SimpleHttpRequest entity(HttpEntity entity) {
|
||||
this.entity = entity;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SimpleHttpRequest params(Map<String, String> params) {
|
||||
this.params = params;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SimpleHttpRequest param(String name, String value) {
|
||||
if (params == null) {
|
||||
params = new HashMap<>();
|
||||
}
|
||||
params.put(name, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public SimpleHttpRequest auth(String token) {
|
||||
header("Authorization", "Bearer " + token);
|
||||
return this;
|
||||
}
|
||||
|
||||
public SimpleHttpRequest authBasic(final String username, final String password) {
|
||||
final String basicCredentials = String.format("%s:%s", username, password);
|
||||
header("Authorization", "Basic " + Base64.encodeBytes(basicCredentials.getBytes()));
|
||||
return this;
|
||||
}
|
||||
|
||||
public SimpleHttpRequest acceptJson() {
|
||||
if (headers == null || !headers.containsKey("Accept")) {
|
||||
header("Accept", "application/json");
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public JsonNode asJson() throws IOException {
|
||||
if (headers == null || !headers.containsKey("Accept")) {
|
||||
header("Accept", "application/json");
|
||||
}
|
||||
return objectMapper.readTree(asString());
|
||||
}
|
||||
|
||||
public <T> T asJson(Class<T> type) throws IOException {
|
||||
if (headers == null || !headers.containsKey("Accept")) {
|
||||
header("Accept", "application/json");
|
||||
}
|
||||
return objectMapper.readValue(asString(), type);
|
||||
}
|
||||
|
||||
public <T> T asJson(TypeReference<T> type) throws IOException {
|
||||
if (headers == null || !headers.containsKey("Accept")) {
|
||||
header("Accept", "application/json");
|
||||
}
|
||||
return objectMapper.readValue(asString(), type);
|
||||
}
|
||||
|
||||
public String asString() throws IOException {
|
||||
return asResponse().asString();
|
||||
}
|
||||
|
||||
public int asStatus() throws IOException {
|
||||
return asResponse().getStatus();
|
||||
}
|
||||
|
||||
public SimpleHttpResponse asResponse() throws IOException {
|
||||
return makeRequest();
|
||||
}
|
||||
|
||||
private HttpRequestBase createHttpRequest() {
|
||||
return switch (method) {
|
||||
case GET -> new HttpGet(appendParameterToUrl(url));
|
||||
case DELETE -> new HttpDelete(appendParameterToUrl(url));
|
||||
case HEAD -> new HttpHead(appendParameterToUrl(url));
|
||||
case PUT -> new HttpPut(appendParameterToUrl(url));
|
||||
case PATCH -> new HttpPatch(appendParameterToUrl(url));
|
||||
case POST -> new HttpPost(url);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the URL without params
|
||||
*/
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
private SimpleHttpResponse makeRequest() throws IOException {
|
||||
HttpRequestBase httpRequest = createHttpRequest();
|
||||
|
||||
if (httpRequest instanceof HttpPost || httpRequest instanceof HttpPut || httpRequest instanceof HttpPatch) {
|
||||
if (params != null) {
|
||||
((HttpEntityEnclosingRequestBase) httpRequest).setEntity(getFormEntityFromParameter());
|
||||
} else if (entity instanceof HttpEntity) {
|
||||
((HttpEntityEnclosingRequestBase) httpRequest).setEntity((HttpEntity) entity);
|
||||
} else if (entity != null) {
|
||||
if (headers == null || !headers.containsKey(HttpHeaders.CONTENT_TYPE)) {
|
||||
header(HttpHeaders.CONTENT_TYPE, "application/json");
|
||||
}
|
||||
((HttpEntityEnclosingRequestBase) httpRequest).setEntity(getJsonEntity());
|
||||
} else {
|
||||
throw new IllegalStateException("No content set");
|
||||
}
|
||||
}
|
||||
|
||||
if (headers != null) {
|
||||
for (Map.Entry<String, String> h : headers.entrySet()) {
|
||||
httpRequest.setHeader(h.getKey(), h.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
if (requestConfig != null) {
|
||||
httpRequest.setConfig(requestConfig);
|
||||
}
|
||||
|
||||
return new SimpleHttpResponse(client.execute(httpRequest), maxConsumedResponseSize, objectMapper);
|
||||
}
|
||||
|
||||
private URI appendParameterToUrl(String url) {
|
||||
try {
|
||||
URIBuilder uriBuilder = new URIBuilder(url);
|
||||
|
||||
if (params != null) {
|
||||
for (Map.Entry<String, String> p : params.entrySet()) {
|
||||
uriBuilder.setParameter(p.getKey(), p.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
return uriBuilder.build();
|
||||
} catch (URISyntaxException ignored) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private StringEntity getJsonEntity() throws IOException {
|
||||
return new StringEntity(objectMapper.writeValueAsString(entity), ContentType.getByMimeType(headers.get(HttpHeaders.CONTENT_TYPE)));
|
||||
}
|
||||
|
||||
private UrlEncodedFormEntity getFormEntityFromParameter() {
|
||||
List<NameValuePair> urlParameters = new ArrayList<>();
|
||||
|
||||
if (params != null) {
|
||||
for (Map.Entry<String, String> p : params.entrySet()) {
|
||||
urlParameters. add(new BasicNameValuePair(p.getKey(), p.getValue()));
|
||||
}
|
||||
}
|
||||
|
||||
return new UrlEncodedFormEntity(urlParameters, StandardCharsets.UTF_8);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,149 @@
|
||||
package org.keycloak.http.simple;
|
||||
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.apache.http.Header;
|
||||
import org.apache.http.HeaderIterator;
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.HttpResponse;
|
||||
import org.apache.http.entity.ContentType;
|
||||
import org.keycloak.connections.httpclient.SafeInputStream;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.StringWriter;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
public class SimpleHttpResponse implements AutoCloseable {
|
||||
|
||||
private final HttpResponse response;
|
||||
private final long maxConsumedResponseSize;
|
||||
private final ObjectMapper objectMapper;
|
||||
private int statusCode = -1;
|
||||
private String responseString;
|
||||
private ContentType contentType;
|
||||
|
||||
public SimpleHttpResponse(HttpResponse response, long maxConsumedResponseSize, ObjectMapper objectMapper) {
|
||||
this.response = response;
|
||||
this.maxConsumedResponseSize = maxConsumedResponseSize;
|
||||
this.objectMapper = objectMapper;
|
||||
}
|
||||
|
||||
private void readResponse() throws IOException {
|
||||
if (statusCode == -1) {
|
||||
statusCode = response.getStatusLine().getStatusCode();
|
||||
|
||||
InputStream is;
|
||||
HttpEntity entity = response.getEntity();
|
||||
if (entity != null) {
|
||||
is = entity.getContent();
|
||||
contentType = ContentType.getOrDefault(entity);
|
||||
Charset charset = contentType.getCharset();
|
||||
try {
|
||||
HeaderIterator it = response.headerIterator();
|
||||
while (it.hasNext()) {
|
||||
Header header = it.nextHeader();
|
||||
if (header.getName().equals("Content-Encoding") && header.getValue().equals("gzip")) {
|
||||
is = new GZIPInputStream(is);
|
||||
}
|
||||
}
|
||||
|
||||
is = new SafeInputStream(is, maxConsumedResponseSize);
|
||||
|
||||
try (InputStreamReader reader = charset == null ? new InputStreamReader(is, StandardCharsets.UTF_8) :
|
||||
new InputStreamReader(is, charset)) {
|
||||
|
||||
StringWriter writer = new StringWriter();
|
||||
|
||||
char[] buffer = new char[1024 * 4];
|
||||
for (int n = reader.read(buffer); n != -1; n = reader.read(buffer)) {
|
||||
writer.write(buffer, 0, n);
|
||||
}
|
||||
|
||||
responseString = writer.toString();
|
||||
}
|
||||
} finally {
|
||||
if (is != null) {
|
||||
is.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int getStatus() throws IOException {
|
||||
readResponse();
|
||||
return response.getStatusLine().getStatusCode();
|
||||
}
|
||||
|
||||
public JsonNode asJson() throws IOException {
|
||||
return objectMapper.readTree(asString());
|
||||
}
|
||||
|
||||
public <T> T asJson(Class<T> type) throws IOException {
|
||||
return objectMapper.readValue(asString(), type);
|
||||
}
|
||||
|
||||
public <T> T asJson(TypeReference<T> type) throws IOException {
|
||||
return objectMapper.readValue(asString(), type);
|
||||
}
|
||||
|
||||
public String asString() throws IOException {
|
||||
readResponse();
|
||||
return responseString;
|
||||
}
|
||||
|
||||
public String getFirstHeader(String name) throws IOException {
|
||||
readResponse();
|
||||
Header[] headers = response.getHeaders(name);
|
||||
|
||||
if (headers != null && headers.length > 0) {
|
||||
return headers[0].getValue();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public List<String> getHeader(String name) throws IOException {
|
||||
readResponse();
|
||||
Header[] headers = response.getHeaders(name);
|
||||
|
||||
if (headers != null && headers.length > 0) {
|
||||
return Stream.of(headers).map(Header::getValue).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public Header[] getAllHeaders() throws IOException {
|
||||
readResponse();
|
||||
return response.getAllHeaders();
|
||||
}
|
||||
|
||||
public ContentType getContentType() throws IOException {
|
||||
readResponse();
|
||||
return contentType;
|
||||
}
|
||||
|
||||
public Charset getContentTypeCharset() throws IOException {
|
||||
readResponse();
|
||||
if (contentType != null) {
|
||||
Charset charset = contentType.getCharset();
|
||||
if (charset != null) {
|
||||
return charset;
|
||||
}
|
||||
}
|
||||
return StandardCharsets.UTF_8;
|
||||
}
|
||||
|
||||
public void close() throws IOException {
|
||||
readResponse();
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,6 @@
|
||||
package org.keycloak.broker.provider.util;
|
||||
package org.keycloak.http.simple;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.HttpHost;
|
||||
import org.apache.http.HttpRequest;
|
||||
@ -70,7 +71,7 @@ public final class SimpleHttpTest {
|
||||
@Test
|
||||
public void withCharset() throws IOException {
|
||||
HttpResponse httpResponse = createBasicResponse(entity);
|
||||
SimpleHttp.Response response = new SimpleHttp.Response(httpResponse, HttpClientProvider.DEFAULT_MAX_CONSUMED_RESPONSE_SIZE);
|
||||
SimpleHttpResponse response = new SimpleHttpResponse(httpResponse, HttpClientProvider.DEFAULT_MAX_CONSUMED_RESPONSE_SIZE, new ObjectMapper());
|
||||
if (success) {
|
||||
assertEquals(original, response.asString());
|
||||
} else {
|
||||
@ -110,10 +111,10 @@ public final class SimpleHttpTest {
|
||||
String expectedResponse = "{\"value\":\"" + value + "\"}";
|
||||
HttpClientMock client = new HttpClientMock();
|
||||
if (expectedResponse.getBytes(StandardCharsets.UTF_8).length < 1024) {
|
||||
SimpleHttp.Response response = SimpleHttp.doPost("", client, 1024).json(new DummyEntity(value)).asResponse();
|
||||
SimpleHttpResponse response = SimpleHttp.create(client).withMaxConsumedResponseSize(1024).doPost("").json(new DummyEntity(value)).asResponse();
|
||||
assertEquals(expectedResponse, response.asString());
|
||||
} else {
|
||||
IOException e = assertThrows(IOException.class, () -> SimpleHttp.doPost("", client, 1024).json(new DummyEntity(value)).asResponse().asString());
|
||||
IOException e = assertThrows(IOException.class, () -> SimpleHttp.create(client).withMaxConsumedResponseSize(1024).doPost("").json(new DummyEntity(value)).asResponse().asString());
|
||||
assertThat(e.getMessage(), startsWith("Response is at least"));
|
||||
}
|
||||
}
|
||||
@ -123,10 +124,10 @@ public final class SimpleHttpTest {
|
||||
String expectedResponse = "dummy=" + URLEncoder.encode(value, StandardCharsets.UTF_8);
|
||||
HttpClientMock client = new HttpClientMock();
|
||||
if (expectedResponse.getBytes(StandardCharsets.UTF_8).length < 1024) {
|
||||
SimpleHttp.Response response = SimpleHttp.doPost("", client, 1024).param("dummy", value).asResponse();
|
||||
SimpleHttpResponse response = SimpleHttp.create(client).withMaxConsumedResponseSize(1024).doPost("").param("dummy", value).asResponse();
|
||||
assertEquals(expectedResponse, response.asString());
|
||||
} else {
|
||||
IOException e = assertThrows(IOException.class, () -> SimpleHttp.doPost("", client, 1024).json(new DummyEntity(value)).asResponse().asString());
|
||||
IOException e = assertThrows(IOException.class, () -> SimpleHttp.create(client).withMaxConsumedResponseSize(1024).doPost("").json(new DummyEntity(value)).asResponse().asString());
|
||||
assertThat(e.getMessage(), startsWith("Response is at least"));
|
||||
}
|
||||
}
|
||||
@ -25,7 +25,9 @@ import org.keycloak.broker.oidc.OAuth2IdentityProviderConfig;
|
||||
import org.keycloak.broker.oidc.mappers.AbstractJsonUserAttributeMapper;
|
||||
import org.keycloak.broker.provider.BrokeredIdentityContext;
|
||||
import org.keycloak.broker.provider.IdentityBrokerException;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttpRequest;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.protocol.oidc.TokenExchangeContext;
|
||||
|
||||
@ -103,7 +105,7 @@ public class OAuth2IdentityProvider extends AbstractOAuth2IdentityProvider<OAuth
|
||||
private JsonNode fetchUserProfile(String accessToken) {
|
||||
String userInfoUrl = getConfig().getUserInfoUrl();
|
||||
|
||||
try (SimpleHttp.Response response = executeRequest(userInfoUrl, SimpleHttp.doGet(userInfoUrl, session)
|
||||
try (SimpleHttpResponse response = executeRequest(userInfoUrl, SimpleHttp.create(session).doGet(userInfoUrl)
|
||||
.header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)
|
||||
.header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON))) {
|
||||
String contentType = response.getFirstHeader(HttpHeaders.CONTENT_TYPE);
|
||||
@ -129,8 +131,8 @@ public class OAuth2IdentityProvider extends AbstractOAuth2IdentityProvider<OAuth
|
||||
}
|
||||
}
|
||||
|
||||
private SimpleHttp.Response executeRequest(String url, SimpleHttp request) throws IOException {
|
||||
SimpleHttp.Response response = request.asResponse();
|
||||
private SimpleHttpResponse executeRequest(String url, SimpleHttpRequest request) throws IOException {
|
||||
SimpleHttpResponse response = request.asResponse();
|
||||
int status = response.getStatus();
|
||||
|
||||
if (Response.Status.fromStatusCode(status).getFamily() != Response.Status.Family.SUCCESSFUL) {
|
||||
|
||||
@ -21,11 +21,16 @@ import com.fasterxml.jackson.annotation.JsonAnySetter;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.QueryParam;
|
||||
import jakarta.ws.rs.WebApplicationException;
|
||||
import jakarta.ws.rs.core.HttpHeaders;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import jakarta.ws.rs.core.MultivaluedMap;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
import jakarta.ws.rs.core.UriBuilder;
|
||||
import jakarta.ws.rs.core.UriInfo;
|
||||
import org.jboss.logging.Logger;
|
||||
import org.keycloak.common.util.SecretGenerator;
|
||||
import org.keycloak.crypto.KeyType;
|
||||
import org.keycloak.crypto.KeyUse;
|
||||
import org.keycloak.http.HttpRequest;
|
||||
import org.keycloak.OAuth2Constants;
|
||||
import org.keycloak.OAuthErrorException;
|
||||
import org.keycloak.broker.provider.AbstractIdentityProvider;
|
||||
@ -36,10 +41,12 @@ import org.keycloak.broker.provider.ExchangeTokenToIdentityProviderToken;
|
||||
import org.keycloak.broker.provider.IdentityBrokerException;
|
||||
import org.keycloak.broker.provider.IdentityProvider;
|
||||
import org.keycloak.broker.provider.util.IdentityBrokerState;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.common.ClientConnection;
|
||||
import org.keycloak.common.util.SecretGenerator;
|
||||
import org.keycloak.common.util.Time;
|
||||
import org.keycloak.crypto.Algorithm;
|
||||
import org.keycloak.crypto.KeyType;
|
||||
import org.keycloak.crypto.KeyUse;
|
||||
import org.keycloak.crypto.KeyWrapper;
|
||||
import org.keycloak.crypto.MacSignatureSignerContext;
|
||||
import org.keycloak.crypto.SignatureProvider;
|
||||
@ -48,6 +55,10 @@ import org.keycloak.events.Details;
|
||||
import org.keycloak.events.Errors;
|
||||
import org.keycloak.events.EventBuilder;
|
||||
import org.keycloak.events.EventType;
|
||||
import org.keycloak.http.HttpRequest;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttpRequest;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.jose.jwk.JWKBuilder;
|
||||
import org.keycloak.jose.jwk.RSAPublicJWK;
|
||||
import org.keycloak.jose.jws.JWSBuilder;
|
||||
@ -69,8 +80,8 @@ import org.keycloak.protocol.oidc.endpoints.TokenIntrospectionEndpoint;
|
||||
import org.keycloak.protocol.oidc.utils.PkceUtils;
|
||||
import org.keycloak.representations.AccessTokenResponse;
|
||||
import org.keycloak.representations.JsonWebToken;
|
||||
import org.keycloak.representations.oidc.TokenMetadataRepresentation;
|
||||
import org.keycloak.representations.idm.ErrorRepresentation;
|
||||
import org.keycloak.representations.oidc.TokenMetadataRepresentation;
|
||||
import org.keycloak.services.ErrorPage;
|
||||
import org.keycloak.services.ErrorResponseException;
|
||||
import org.keycloak.services.Urls;
|
||||
@ -78,22 +89,13 @@ import org.keycloak.services.managers.ClientSessionCode;
|
||||
import org.keycloak.services.messages.Messages;
|
||||
import org.keycloak.services.resources.RealmsResource;
|
||||
import org.keycloak.sessions.AuthenticationSessionModel;
|
||||
import org.keycloak.util.JsonSerialization;
|
||||
import org.keycloak.urls.UrlType;
|
||||
import org.keycloak.util.JsonSerialization;
|
||||
import org.keycloak.utils.StringUtil;
|
||||
import org.keycloak.vault.VaultStringSecret;
|
||||
|
||||
import javax.crypto.SecretKey;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.QueryParam;
|
||||
import jakarta.ws.rs.WebApplicationException;
|
||||
import jakarta.ws.rs.core.HttpHeaders;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import jakarta.ws.rs.core.MultivaluedMap;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
import jakarta.ws.rs.core.UriBuilder;
|
||||
import jakarta.ws.rs.core.UriInfo;
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.net.URLEncoder;
|
||||
@ -274,8 +276,8 @@ public abstract class AbstractOAuth2IdentityProvider<C extends OAuth2IdentityPro
|
||||
return exp != null && exp != 0 && exp < Time.currentTime() + getConfig().getMinValidityToken();
|
||||
}
|
||||
|
||||
protected SimpleHttp getRefreshTokenRequest(KeycloakSession session, String refreshToken, String clientId, String clientSecret) {
|
||||
SimpleHttp refreshTokenRequest = SimpleHttp.doPost(getConfig().getTokenUrl(), session)
|
||||
protected SimpleHttpRequest getRefreshTokenRequest(KeycloakSession session, String refreshToken, String clientId, String clientSecret) {
|
||||
SimpleHttpRequest refreshTokenRequest = SimpleHttp.create(session).doPost(getConfig().getTokenUrl())
|
||||
.param(OAUTH2_GRANT_TYPE_REFRESH_TOKEN, refreshToken)
|
||||
.param(OAUTH2_PARAMETER_GRANT_TYPE, OAUTH2_GRANT_TYPE_REFRESH_TOKEN);
|
||||
return authenticateTokenRequest(refreshTokenRequest);
|
||||
@ -283,8 +285,8 @@ public abstract class AbstractOAuth2IdentityProvider<C extends OAuth2IdentityPro
|
||||
|
||||
private OAuthResponse refreshToken(OAuthResponse previousResponse, KeycloakSession session) throws IOException {
|
||||
try (VaultStringSecret vaultStringSecret = session.vault().getStringSecret(getConfig().getClientSecret())) {
|
||||
SimpleHttp refreshTokenRequest = getRefreshTokenRequest(session, previousResponse.getRefreshToken(), getConfig().getClientId(), vaultStringSecret.get().orElse(getConfig().getClientSecret()));
|
||||
try (SimpleHttp.Response refreshTokenResponse = refreshTokenRequest.asResponse()) {
|
||||
SimpleHttpRequest refreshTokenRequest = getRefreshTokenRequest(session, previousResponse.getRefreshToken(), getConfig().getClientId(), vaultStringSecret.get().orElse(getConfig().getClientSecret()));
|
||||
try (SimpleHttpResponse refreshTokenResponse = refreshTokenRequest.asResponse()) {
|
||||
String response = refreshTokenResponse.asString();
|
||||
if (response.contains("error")) {
|
||||
ErrorRepresentation error = new ErrorRepresentation();
|
||||
@ -592,7 +594,7 @@ public abstract class AbstractOAuth2IdentityProvider<C extends OAuth2IdentityPro
|
||||
if (token != null) authSession.setUserSessionNote(FEDERATED_ACCESS_TOKEN, token);
|
||||
}
|
||||
|
||||
public SimpleHttp authenticateTokenRequest(final SimpleHttp tokenRequest) {
|
||||
public SimpleHttpRequest authenticateTokenRequest(final SimpleHttpRequest tokenRequest) {
|
||||
|
||||
if (getConfig().isJWTAuthentication()) {
|
||||
String sha1x509Thumbprint = null;
|
||||
@ -722,9 +724,9 @@ public abstract class AbstractOAuth2IdentityProvider<C extends OAuth2IdentityPro
|
||||
return errorIdentityProviderLogin(Messages.IDENTITY_PROVIDER_MISSING_CODE_OR_ERROR_ERROR);
|
||||
}
|
||||
|
||||
SimpleHttp simpleHttp = generateTokenRequest(authorizationCode);
|
||||
SimpleHttpRequest simpleHttp = generateTokenRequest(authorizationCode);
|
||||
String response;
|
||||
try (SimpleHttp.Response simpleResponse = simpleHttp.asResponse()) {
|
||||
try (SimpleHttpResponse simpleResponse = simpleHttp.asResponse()) {
|
||||
int status = simpleResponse.getStatus();
|
||||
boolean success = status >= 200 && status < 400;
|
||||
response = simpleResponse.asString();
|
||||
@ -775,10 +777,10 @@ public abstract class AbstractOAuth2IdentityProvider<C extends OAuth2IdentityPro
|
||||
return ErrorPage.error(session, null, Response.Status.BAD_GATEWAY, message);
|
||||
}
|
||||
|
||||
public SimpleHttp generateTokenRequest(String authorizationCode) {
|
||||
public SimpleHttpRequest generateTokenRequest(String authorizationCode) {
|
||||
KeycloakContext context = session.getContext();
|
||||
OAuth2IdentityProviderConfig providerConfig = provider.getConfig();
|
||||
SimpleHttp tokenRequest = SimpleHttp.doPost(providerConfig.getTokenUrl(), session)
|
||||
SimpleHttpRequest tokenRequest = SimpleHttp.create(session).doPost(providerConfig.getTokenUrl())
|
||||
.param(OAUTH2_PARAMETER_CODE, authorizationCode)
|
||||
.param(OAUTH2_PARAMETER_REDIRECT_URI, Urls.identityProviderAuthnResponse(context.getUri().getBaseUri(),
|
||||
providerConfig.getAlias(), context.getRealm().getName()).toString())
|
||||
@ -838,7 +840,7 @@ public abstract class AbstractOAuth2IdentityProvider<C extends OAuth2IdentityPro
|
||||
protected BrokeredIdentityContext validateExternalTokenThroughUserInfo(EventBuilder event, String subjectToken, String subjectTokenType) {
|
||||
event.detail("validation_method", "user info");
|
||||
|
||||
SimpleHttp.Response response = null;
|
||||
SimpleHttpResponse response = null;
|
||||
int status = 0;
|
||||
try {
|
||||
String userInfoUrl = getProfileEndpointForValidation(event);
|
||||
@ -870,8 +872,8 @@ public abstract class AbstractOAuth2IdentityProvider<C extends OAuth2IdentityPro
|
||||
return context;
|
||||
}
|
||||
|
||||
protected SimpleHttp buildUserInfoRequest(String subjectToken, String userInfoUrl) {
|
||||
return SimpleHttp.doGet(userInfoUrl, session)
|
||||
protected SimpleHttpRequest buildUserInfoRequest(String subjectToken, String userInfoUrl) {
|
||||
return SimpleHttp.create(session).doGet(userInfoUrl)
|
||||
.header("Authorization", "Bearer " + subjectToken);
|
||||
}
|
||||
|
||||
@ -997,12 +999,12 @@ public abstract class AbstractOAuth2IdentityProvider<C extends OAuth2IdentityPro
|
||||
try {
|
||||
|
||||
// Supporting only access-tokens for now
|
||||
SimpleHttp introspectionRequest = SimpleHttp.doPost(introspectionEndointUrl, session)
|
||||
SimpleHttpRequest introspectionRequest = SimpleHttp.create(session).doPost(introspectionEndointUrl)
|
||||
.param(TokenIntrospectionEndpoint.PARAM_TOKEN, idpAccessToken)
|
||||
.param(TokenIntrospectionEndpoint.PARAM_TOKEN_TYPE_HINT, AccessTokenIntrospectionProviderFactory.ACCESS_TOKEN_TYPE);
|
||||
introspectionRequest = authenticateTokenRequest(introspectionRequest);
|
||||
|
||||
try (SimpleHttp.Response introspectionResponse = introspectionRequest.asResponse()) {
|
||||
try (SimpleHttpResponse introspectionResponse = introspectionRequest.asResponse()) {
|
||||
int status = introspectionResponse.getStatus();
|
||||
|
||||
if (status != 200) {
|
||||
|
||||
@ -20,12 +20,12 @@ package org.keycloak.broker.oidc;
|
||||
import org.keycloak.OAuth2Constants;
|
||||
import org.keycloak.OAuthErrorException;
|
||||
import org.keycloak.broker.provider.BrokeredIdentityContext;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.constants.AdapterConstants;
|
||||
import org.keycloak.events.Details;
|
||||
import org.keycloak.events.Errors;
|
||||
import org.keycloak.events.EventBuilder;
|
||||
import org.keycloak.headers.SecurityHeadersProvider;
|
||||
import org.keycloak.http.simple.SimpleHttpRequest;
|
||||
import org.keycloak.jose.jws.JWSInput;
|
||||
import org.keycloak.jose.jws.JWSInputException;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
@ -129,7 +129,7 @@ public class KeycloakOIDCIdentityProvider extends OIDCIdentityProvider {
|
||||
}
|
||||
|
||||
@Override
|
||||
public SimpleHttp generateTokenRequest(String authorizationCode) {
|
||||
public SimpleHttpRequest generateTokenRequest(String authorizationCode) {
|
||||
return super.generateTokenRequest(authorizationCode)
|
||||
.param(AdapterConstants.CLIENT_SESSION_STATE, "n/a"); // hack to get backchannel logout to work
|
||||
|
||||
|
||||
@ -37,7 +37,6 @@ import org.keycloak.broker.provider.BrokeredIdentityContext;
|
||||
import org.keycloak.broker.provider.ClientAssertionIdentityProvider;
|
||||
import org.keycloak.broker.provider.ExchangeExternalToken;
|
||||
import org.keycloak.broker.provider.IdentityBrokerException;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.common.Profile;
|
||||
import org.keycloak.common.util.Base64Url;
|
||||
import org.keycloak.common.util.SecretGenerator;
|
||||
@ -49,6 +48,9 @@ import org.keycloak.events.Details;
|
||||
import org.keycloak.events.Errors;
|
||||
import org.keycloak.events.EventBuilder;
|
||||
import org.keycloak.events.EventType;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttpRequest;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.jose.JOSE;
|
||||
import org.keycloak.jose.JOSEParser;
|
||||
import org.keycloak.jose.jwe.JWE;
|
||||
@ -157,7 +159,7 @@ public class OIDCIdentityProvider extends AbstractOAuth2IdentityProvider<OIDCIde
|
||||
}
|
||||
String url = logoutUri.build().toString();
|
||||
try {
|
||||
int status = SimpleHttp.doGet(url, session).asStatus();
|
||||
int status = SimpleHttp.create(session).doGet(url).asStatus();
|
||||
boolean success = status >= 200 && status < 400;
|
||||
if (!success) {
|
||||
logger.warn("Failed backchannel broker logout to: " + url);
|
||||
@ -359,8 +361,8 @@ public class OIDCIdentityProvider extends AbstractOAuth2IdentityProvider<OIDCIde
|
||||
}
|
||||
|
||||
@Override
|
||||
public SimpleHttp generateTokenRequest(String authorizationCode) {
|
||||
SimpleHttp simpleHttp = super.generateTokenRequest(authorizationCode);
|
||||
public SimpleHttpRequest generateTokenRequest(String authorizationCode) {
|
||||
SimpleHttpRequest simpleHttp = super.generateTokenRequest(authorizationCode);
|
||||
return simpleHttp;
|
||||
}
|
||||
|
||||
@ -512,7 +514,7 @@ public class OIDCIdentityProvider extends AbstractOAuth2IdentityProvider<OIDCIde
|
||||
if (userInfoUrl != null && !userInfoUrl.isEmpty()) {
|
||||
|
||||
if (accessToken != null) {
|
||||
SimpleHttp.Response response = executeRequest(userInfoUrl, SimpleHttp.doGet(userInfoUrl, session).header("Authorization", "Bearer " + accessToken));
|
||||
SimpleHttpResponse response = executeRequest(userInfoUrl, SimpleHttp.create(session).doGet(userInfoUrl).header("Authorization", "Bearer " + accessToken));
|
||||
String contentType = response.getFirstHeader(HttpHeaders.CONTENT_TYPE);
|
||||
MediaType contentMediaType;
|
||||
try {
|
||||
@ -589,8 +591,8 @@ public class OIDCIdentityProvider extends AbstractOAuth2IdentityProvider<OIDCIde
|
||||
return getConfig().getUserInfoUrl();
|
||||
}
|
||||
|
||||
private SimpleHttp.Response executeRequest(String url, SimpleHttp request) throws IOException {
|
||||
SimpleHttp.Response response = request.asResponse();
|
||||
private SimpleHttpResponse executeRequest(String url, SimpleHttpRequest request) throws IOException {
|
||||
SimpleHttpResponse response = request.asResponse();
|
||||
if (response.getStatus() != 200) {
|
||||
String msg = "failed to invoke url [" + url + "]";
|
||||
try {
|
||||
|
||||
@ -25,7 +25,6 @@ import org.keycloak.broker.provider.BrokeredIdentityContext;
|
||||
import org.keycloak.broker.provider.IdentityBrokerException;
|
||||
import org.keycloak.broker.provider.IdentityProviderDataMarshaller;
|
||||
import org.keycloak.broker.provider.IdentityProviderMapper;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.common.util.PemUtils;
|
||||
import org.keycloak.crypto.Algorithm;
|
||||
import org.keycloak.crypto.KeyUse;
|
||||
@ -45,6 +44,7 @@ import org.keycloak.dom.saml.v2.protocol.AuthnRequestType;
|
||||
import org.keycloak.dom.saml.v2.protocol.LogoutRequestType;
|
||||
import org.keycloak.dom.saml.v2.protocol.ResponseType;
|
||||
import org.keycloak.events.EventBuilder;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.keys.PublicKeyStorageProvider;
|
||||
import org.keycloak.keys.PublicKeyStorageUtils;
|
||||
import org.keycloak.models.FederatedIdentityModel;
|
||||
@ -285,7 +285,7 @@ public class SAMLIdentityProvider extends AbstractIdentityProvider<SAMLIdentityP
|
||||
if (logoutRequest.getDestination() != null) {
|
||||
singleLogoutServiceUrl = logoutRequest.getDestination().toString();
|
||||
}
|
||||
int status = SimpleHttp.doPost(singleLogoutServiceUrl, session)
|
||||
int status = SimpleHttp.create(session).doPost(singleLogoutServiceUrl)
|
||||
.param(GeneralConstants.SAML_REQUEST_KEY, binding.postBinding(SAML2Request.convert(logoutRequest)).encoded())
|
||||
.param(GeneralConstants.RELAY_STATE, userSession.getId()).asStatus();
|
||||
boolean success = status >=200 && status < 400;
|
||||
|
||||
@ -5,7 +5,7 @@ import jakarta.mail.AuthenticationFailedException;
|
||||
import jakarta.mail.MessagingException;
|
||||
import jakarta.mail.Transport;
|
||||
import org.jboss.logging.Logger;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.utils.KeycloakSessionUtil;
|
||||
import org.keycloak.vault.VaultStringSecret;
|
||||
@ -122,7 +122,7 @@ public class TokenAuthEmailAuthenticator implements EmailAuthenticator {
|
||||
}
|
||||
|
||||
private JsonNode fetchTokenViaHTTP(KeycloakSession session, String authTokenUrl, String authTokenScope, String authTokenClientId, String authTokenClientSecret) throws IOException {
|
||||
return SimpleHttp.doPost(authTokenUrl, session)
|
||||
return SimpleHttp.create(session).doPost(authTokenUrl)
|
||||
.param("client_id", authTokenClientId)
|
||||
.param("client_secret", authTokenClientSecret)
|
||||
.param("scope", authTokenScope)
|
||||
|
||||
@ -24,7 +24,8 @@ import jakarta.ws.rs.core.MediaType;
|
||||
import jakarta.ws.rs.core.MultivaluedMap;
|
||||
import jakarta.ws.rs.core.Response.Status;
|
||||
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttpRequest;
|
||||
import org.keycloak.models.ClientModel;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.models.RealmModel;
|
||||
@ -78,7 +79,7 @@ public class HttpAuthenticationChannelProvider implements AuthenticationChannelP
|
||||
channelRequest.setAcrValues(request.getAcrValues());
|
||||
channelRequest.setAdditionalParameters(request.getOtherClaims());
|
||||
|
||||
SimpleHttp simpleHttp = SimpleHttp.doPost(httpAuthenticationChannelUri, session)
|
||||
SimpleHttpRequest simpleHttp = SimpleHttp.create(session).doPost(httpAuthenticationChannelUri)
|
||||
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
|
||||
.json(channelRequest)
|
||||
.auth(createBearerToken(request, client));
|
||||
@ -122,7 +123,7 @@ public class HttpAuthenticationChannelProvider implements AuthenticationChannelP
|
||||
/**
|
||||
* Extension point to allow subclass to override this method in order to add data to post to decoupled server.
|
||||
*/
|
||||
protected SimpleHttp completeDecoupledAuthnRequest(SimpleHttp simpleHttp, AuthenticationChannelRequest channelRequest) {
|
||||
protected SimpleHttpRequest completeDecoupledAuthnRequest(SimpleHttpRequest simpleHttp, AuthenticationChannelRequest channelRequest) {
|
||||
return simpleHttp;
|
||||
}
|
||||
|
||||
|
||||
@ -21,10 +21,11 @@ import org.jboss.resteasy.reactive.NoCache;
|
||||
import org.keycloak.http.HttpRequest;
|
||||
import org.keycloak.OAuthErrorException;
|
||||
import org.keycloak.TokenVerifier;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.events.Errors;
|
||||
import org.keycloak.events.EventBuilder;
|
||||
import org.keycloak.events.EventType;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttpRequest;
|
||||
import org.keycloak.models.CibaConfig;
|
||||
import org.keycloak.models.ClientModel;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
@ -221,7 +222,7 @@ public class BackchannelAuthenticationCallbackEndpoint extends AbstractCibaEndpo
|
||||
ClientNotificationEndpointRequest clientNotificationRequest = new ClientNotificationEndpointRequest();
|
||||
clientNotificationRequest.setAuthReqId(deviceModel.getAuthReqId());
|
||||
|
||||
SimpleHttp simpleHttp = SimpleHttp.doPost(clientNotificationEndpoint, session)
|
||||
SimpleHttpRequest simpleHttp = SimpleHttp.create(session).doPost(clientNotificationEndpoint)
|
||||
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
|
||||
.json(clientNotificationRequest)
|
||||
.auth(deviceModel.getClientNotificationToken());
|
||||
|
||||
@ -22,7 +22,9 @@ import org.apache.http.HttpStatus;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
import org.apache.http.entity.ByteArrayEntity;
|
||||
import org.apache.http.entity.ContentType;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttpRequest;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.saml.processing.core.saml.v2.util.DocumentUtil;
|
||||
import org.keycloak.saml.processing.web.util.PostBindingUtil;
|
||||
@ -262,7 +264,7 @@ public final class Soap {
|
||||
message.saveChanges();
|
||||
}
|
||||
// use SimpleHttp from the session
|
||||
SimpleHttp simpleHttp = SimpleHttp.doPost(url, session);
|
||||
SimpleHttpRequest simpleHttp = SimpleHttp.create(session).doPost(url);
|
||||
// add all the headers as HTTP headers except the ones needed for the HttpEntity
|
||||
Iterator<MimeHeader> reqHeaders = message.getMimeHeaders().getAllHeaders();
|
||||
ContentType contentType = null;
|
||||
@ -291,7 +293,7 @@ public final class Soap {
|
||||
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
|
||||
message.writeTo(out);
|
||||
simpleHttp.entity(new ByteArrayEntity(out.toByteArray(), 0, length, contentType));
|
||||
try (SimpleHttp.Response res = simpleHttp.asResponse()) {
|
||||
try (SimpleHttpResponse res = simpleHttp.asResponse()) {
|
||||
// HTTP_INTERNAL_ERROR (500) and HTTP_BAD_REQUEST (400) should be processed as SOAP faults
|
||||
if (res.getStatus() == HttpStatus.SC_INTERNAL_SERVER_ERROR
|
||||
|| res.getStatus() == HttpStatus.SC_BAD_REQUEST
|
||||
|
||||
@ -26,7 +26,8 @@ import jakarta.ws.rs.core.MediaType;
|
||||
|
||||
import org.jboss.logging.Logger;
|
||||
import org.keycloak.OAuthErrorException;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttpRequest;
|
||||
import org.keycloak.models.ClientModel;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.protocol.oidc.endpoints.request.AuthorizationEndpointRequest;
|
||||
@ -119,7 +120,7 @@ public class IntentClientBindCheckExecutor implements ClientPolicyExecutorProvid
|
||||
IntentBindCheckRequest request = new IntentBindCheckRequest();
|
||||
request.setClientId(clientId);
|
||||
request.setIntentId(intentId);
|
||||
SimpleHttp simpleHttp = SimpleHttp.doPost(configuration.getIntentClientBindCheckEndpoint(), session)
|
||||
SimpleHttpRequest simpleHttp = SimpleHttp.create(session).doPost(configuration.getIntentClientBindCheckEndpoint())
|
||||
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
|
||||
.json(request);
|
||||
IntentBindCheckResponse response = null;
|
||||
|
||||
@ -24,11 +24,12 @@ import org.keycloak.broker.oidc.OAuth2IdentityProviderConfig;
|
||||
import org.keycloak.broker.oidc.mappers.AbstractJsonUserAttributeMapper;
|
||||
import org.keycloak.broker.provider.BrokeredIdentityContext;
|
||||
import org.keycloak.broker.provider.IdentityBrokerException;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.broker.social.SocialIdentityProvider;
|
||||
import org.keycloak.events.Details;
|
||||
import org.keycloak.events.Errors;
|
||||
import org.keycloak.events.EventBuilder;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.services.ErrorResponseException;
|
||||
|
||||
@ -72,7 +73,7 @@ public class BitbucketIdentityProvider extends AbstractOAuth2IdentityProvider im
|
||||
@Override
|
||||
protected BrokeredIdentityContext validateExternalTokenThroughUserInfo(EventBuilder event, String subjectToken, String subjectTokenType) {
|
||||
event.detail("validation_method", "user info");
|
||||
SimpleHttp.Response response = null;
|
||||
SimpleHttpResponse response = null;
|
||||
int status = 0;
|
||||
try {
|
||||
String userInfoUrl = getProfileEndpointForValidation(event);
|
||||
@ -141,7 +142,7 @@ public class BitbucketIdentityProvider extends AbstractOAuth2IdentityProvider im
|
||||
AbstractJsonUserAttributeMapper.storeUserProfileForMapper(user, profile, getConfig().getAlias());
|
||||
|
||||
try {
|
||||
JsonNode emails = SimpleHttp.doGet(USER_EMAIL_URL, session).header("Authorization", "Bearer " + subjectToken).asJson();
|
||||
JsonNode emails = SimpleHttp.create(session).doGet(USER_EMAIL_URL).header("Authorization", "Bearer " + subjectToken).asJson();
|
||||
|
||||
// {"pagelen":10,"values":[{"is_primary":true,"is_confirmed":true,"type":"email","email":"bburke@redhat.com","links":{"self":{"href":"https://api.bitbucket.org/2.0/user/emails/bburke@redhat.com"}}}],"page":1,"size":1}
|
||||
JsonNode emailJson = emails.get("values");
|
||||
@ -164,7 +165,7 @@ public class BitbucketIdentityProvider extends AbstractOAuth2IdentityProvider im
|
||||
@Override
|
||||
protected BrokeredIdentityContext doGetFederatedIdentity(String accessToken) {
|
||||
try {
|
||||
JsonNode profile = SimpleHttp.doGet(USER_URL, session).header("Authorization", "Bearer " + accessToken).asJson();
|
||||
JsonNode profile = SimpleHttp.create(session).doGet(USER_URL).header("Authorization", "Bearer " + accessToken).asJson();
|
||||
|
||||
String type = getJsonProperty(profile, "type");
|
||||
if (type == null) {
|
||||
|
||||
@ -27,9 +27,9 @@ import org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider;
|
||||
import org.keycloak.broker.oidc.mappers.AbstractJsonUserAttributeMapper;
|
||||
import org.keycloak.broker.provider.BrokeredIdentityContext;
|
||||
import org.keycloak.broker.provider.IdentityBrokerException;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.broker.social.SocialIdentityProvider;
|
||||
import org.keycloak.events.EventBuilder;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.protocol.oidc.TokenExchangeContext;
|
||||
import org.keycloak.saml.common.util.StringUtil;
|
||||
@ -62,7 +62,7 @@ public class FacebookIdentityProvider extends AbstractOAuth2IdentityProvider<Fac
|
||||
final String url = StringUtil.isNotNull(fetchedFields)
|
||||
? String.join(PROFILE_URL_FIELDS_SEPARATOR, PROFILE_URL, fetchedFields)
|
||||
: PROFILE_URL;
|
||||
JsonNode profile = SimpleHttp.doGet(url, session).header("Authorization", "Bearer " + accessToken).asJson();
|
||||
JsonNode profile = SimpleHttp.create(session).doGet(url).header("Authorization", "Bearer " + accessToken).asJson();
|
||||
return extractIdentityFromProfile(null, profile);
|
||||
} catch (Exception e) {
|
||||
throw new IdentityBrokerException("Could not obtain user profile from facebook.", e);
|
||||
@ -70,7 +70,7 @@ public class FacebookIdentityProvider extends AbstractOAuth2IdentityProvider<Fac
|
||||
}
|
||||
|
||||
private void verifyToken(String accessToken) throws IOException {
|
||||
JsonNode response = SimpleHttp.doGet(DEBUG_TOKEN_URL, session)
|
||||
JsonNode response = SimpleHttp.create(session).doGet(DEBUG_TOKEN_URL)
|
||||
.header(HttpHeaders.AUTHORIZATION, "Bearer " + getConfig().getClientId() + "|" + getConfig().getClientSecret())
|
||||
.param("input_token", accessToken)
|
||||
.asJson();
|
||||
|
||||
@ -31,9 +31,11 @@ import org.keycloak.broker.oidc.OAuth2IdentityProviderConfig;
|
||||
import org.keycloak.broker.oidc.mappers.AbstractJsonUserAttributeMapper;
|
||||
import org.keycloak.broker.provider.BrokeredIdentityContext;
|
||||
import org.keycloak.broker.provider.IdentityBrokerException;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.broker.social.SocialIdentityProvider;
|
||||
import org.keycloak.events.EventBuilder;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttpRequest;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.protocol.oidc.TokenExchangeContext;
|
||||
import org.keycloak.services.ErrorResponseException;
|
||||
@ -135,8 +137,8 @@ public class GitHubIdentityProvider extends AbstractOAuth2IdentityProvider imple
|
||||
}
|
||||
|
||||
@Override
|
||||
public SimpleHttp authenticateTokenRequest(SimpleHttp tokenRequest) {
|
||||
SimpleHttp simpleHttp = super.authenticateTokenRequest(tokenRequest);
|
||||
public SimpleHttpRequest authenticateTokenRequest(SimpleHttpRequest tokenRequest) {
|
||||
SimpleHttpRequest simpleHttp = super.authenticateTokenRequest(tokenRequest);
|
||||
if (githubJsonFormat) {
|
||||
simpleHttp.acceptJson();
|
||||
}
|
||||
@ -160,7 +162,7 @@ public class GitHubIdentityProvider extends AbstractOAuth2IdentityProvider imple
|
||||
|
||||
@Override
|
||||
protected BrokeredIdentityContext doGetFederatedIdentity(String accessToken) {
|
||||
try (SimpleHttp.Response response = SimpleHttp.doGet(profileUrl, session)
|
||||
try (SimpleHttpResponse response = SimpleHttp.create(session).doGet(profileUrl)
|
||||
.header("Authorization", "Bearer " + accessToken)
|
||||
.header("Accept", "application/json")
|
||||
.asResponse()) {
|
||||
@ -184,7 +186,7 @@ public class GitHubIdentityProvider extends AbstractOAuth2IdentityProvider imple
|
||||
}
|
||||
|
||||
private String searchEmail(String accessToken) {
|
||||
try (SimpleHttp.Response response = SimpleHttp.doGet(emailUrl, session)
|
||||
try (SimpleHttpResponse response = SimpleHttp.create(session).doGet(emailUrl)
|
||||
.header("Authorization", "Bearer " + accessToken)
|
||||
.header("Accept", "application/json")
|
||||
.asResponse()) {
|
||||
@ -215,7 +217,7 @@ public class GitHubIdentityProvider extends AbstractOAuth2IdentityProvider imple
|
||||
|
||||
private void verifyToken(String accessToken) throws IOException {
|
||||
String tokenUrl = DEFAULT_APPLICATIONS_URL + "/" + getConfig().getClientId() + "/token";
|
||||
SimpleHttp.Response response = SimpleHttp.doPost(tokenUrl, session)
|
||||
SimpleHttpResponse response = SimpleHttp.create(session).doPost(tokenUrl)
|
||||
.header("Authorization", BasicAuthHelper.createHeader(getConfig().getClientId(), getConfig().getClientSecret()))
|
||||
.json(Map.of("access_token", accessToken)).asResponse();
|
||||
|
||||
|
||||
@ -25,11 +25,12 @@ import org.keycloak.broker.oidc.OIDCIdentityProviderConfig;
|
||||
import org.keycloak.broker.oidc.mappers.AbstractJsonUserAttributeMapper;
|
||||
import org.keycloak.broker.provider.BrokeredIdentityContext;
|
||||
import org.keycloak.broker.provider.IdentityBrokerException;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.broker.social.SocialIdentityProvider;
|
||||
import org.keycloak.events.Details;
|
||||
import org.keycloak.events.Errors;
|
||||
import org.keycloak.events.EventBuilder;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.representations.AccessTokenResponse;
|
||||
import org.keycloak.representations.IDToken;
|
||||
@ -134,14 +135,13 @@ public class GitLabIdentityProvider extends OIDCIdentityProvider implements Soc
|
||||
|
||||
|
||||
protected BrokeredIdentityContext extractIdentity(AccessTokenResponse tokenResponse, String accessToken, JsonWebToken idToken) throws IOException {
|
||||
|
||||
SimpleHttp.Response response = null;
|
||||
SimpleHttpResponse response = null;
|
||||
int status = 0;
|
||||
|
||||
for (int i = 0; i < 10; i++) {
|
||||
try {
|
||||
String userInfoUrl = getUserInfoUrl();
|
||||
response = SimpleHttp.doGet(userInfoUrl, session)
|
||||
response = SimpleHttp.create(session).doGet(userInfoUrl)
|
||||
.header("Authorization", "Bearer " + accessToken).asResponse();
|
||||
status = response.getStatus();
|
||||
} catch (IOException e) {
|
||||
|
||||
@ -17,7 +17,9 @@
|
||||
package org.keycloak.social.google;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import jakarta.ws.rs.core.MultivaluedMap;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
import jakarta.ws.rs.core.UriBuilder;
|
||||
import org.keycloak.OAuth2Constants;
|
||||
import org.keycloak.OAuthErrorException;
|
||||
import org.keycloak.broker.oidc.OIDCIdentityProvider;
|
||||
@ -25,19 +27,16 @@ import org.keycloak.broker.oidc.OIDCIdentityProviderConfig;
|
||||
import org.keycloak.broker.provider.AuthenticationRequest;
|
||||
import org.keycloak.broker.provider.BrokeredIdentityContext;
|
||||
import org.keycloak.broker.provider.IdentityBrokerException;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.broker.social.SocialIdentityProvider;
|
||||
import org.keycloak.common.ClientConnection;
|
||||
import org.keycloak.common.util.KeycloakUriBuilder;
|
||||
import org.keycloak.events.Details;
|
||||
import org.keycloak.events.Errors;
|
||||
import org.keycloak.events.EventBuilder;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.protocol.oidc.TokenExchangeContext;
|
||||
import org.keycloak.representations.JsonWebToken;
|
||||
|
||||
import jakarta.ws.rs.core.MultivaluedMap;
|
||||
import jakarta.ws.rs.core.UriBuilder;
|
||||
import org.keycloak.services.ErrorResponseException;
|
||||
|
||||
import java.util.List;
|
||||
@ -104,7 +103,7 @@ public class GoogleIdentityProvider extends OIDCIdentityProvider implements Soci
|
||||
@Override
|
||||
protected BrokeredIdentityContext exchangeExternalTokenV2Impl(TokenExchangeContext tokenExchangeContext) {
|
||||
try {
|
||||
JsonNode tokenInfo = SimpleHttp.doGet(TOKEN_INFO_URL, session)
|
||||
JsonNode tokenInfo = SimpleHttp.create(session).doGet(TOKEN_INFO_URL)
|
||||
.header("Authorization", "Bearer " + tokenExchangeContext.getParams().getSubjectToken())
|
||||
.asJson();
|
||||
if (tokenInfo == null || !tokenInfo.has(JsonWebToken.AUD) || !tokenInfo.get(JsonWebToken.AUD).asText().equals(getConfig().getClientId())) {
|
||||
|
||||
@ -21,10 +21,10 @@ import com.fasterxml.jackson.databind.JsonNode;
|
||||
import org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider;
|
||||
import org.keycloak.broker.oidc.OAuth2IdentityProviderConfig;
|
||||
import org.keycloak.broker.oidc.mappers.AbstractJsonUserAttributeMapper;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.broker.provider.BrokeredIdentityContext;
|
||||
import org.keycloak.broker.provider.IdentityBrokerException;
|
||||
import org.keycloak.broker.social.SocialIdentityProvider;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
|
||||
import java.io.IOException;
|
||||
@ -87,7 +87,7 @@ public class InstagramIdentityProvider extends AbstractOAuth2IdentityProvider im
|
||||
fields += "," + LEGACY_ID_FIELD;
|
||||
}
|
||||
|
||||
return SimpleHttp.doGet(PROFILE_URL,session)
|
||||
return SimpleHttp.create(session).doGet(PROFILE_URL)
|
||||
.param("access_token", accessToken)
|
||||
.param("fields", fields)
|
||||
.asJson();
|
||||
|
||||
@ -23,8 +23,9 @@ import java.io.IOException;
|
||||
import java.util.List;
|
||||
import org.keycloak.broker.oidc.OIDCIdentityProviderConfig;
|
||||
import org.keycloak.broker.provider.AbstractIdentityProviderFactory;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.broker.social.SocialIdentityProviderFactory;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.IdentityProviderModel;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.protocol.oidc.representations.OIDCConfigurationRepresentation;
|
||||
@ -93,7 +94,7 @@ public class LinkedInOIDCIdentityProviderFactory extends AbstractIdentityProvide
|
||||
}
|
||||
|
||||
private static OIDCConfigurationRepresentation getWellKnownMetadata(KeycloakSession session) {
|
||||
try (SimpleHttp.Response response = SimpleHttp.doGet(WELL_KNOWN_URL, session)
|
||||
try (SimpleHttpResponse response = SimpleHttp.create(session).doGet(WELL_KNOWN_URL)
|
||||
.header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON)
|
||||
.asResponse()) {
|
||||
if (Response.Status.fromStatusCode(response.getStatus()).getFamily() != Response.Status.Family.SUCCESSFUL) {
|
||||
|
||||
@ -23,12 +23,10 @@ import org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider;
|
||||
import org.keycloak.broker.oidc.mappers.AbstractJsonUserAttributeMapper;
|
||||
import org.keycloak.broker.provider.BrokeredIdentityContext;
|
||||
import org.keycloak.broker.provider.IdentityBrokerException;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.broker.social.SocialIdentityProvider;
|
||||
|
||||
import org.keycloak.events.EventBuilder;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
|
||||
import org.keycloak.services.validation.Validation;
|
||||
|
||||
import java.util.Optional;
|
||||
@ -73,7 +71,7 @@ public class MicrosoftIdentityProvider extends AbstractOAuth2IdentityProvider im
|
||||
@Override
|
||||
protected BrokeredIdentityContext doGetFederatedIdentity(String accessToken) {
|
||||
try {
|
||||
JsonNode profile = SimpleHttp.doGet(PROFILE_URL, session).auth(accessToken).asJson();
|
||||
JsonNode profile = SimpleHttp.create(session).doGet(PROFILE_URL).auth(accessToken).asJson();
|
||||
if (profile.has("error") && !profile.get("error").isNull()) {
|
||||
throw new IdentityBrokerException("Error in Microsoft Graph API response. Payload: " + profile.toString());
|
||||
}
|
||||
|
||||
@ -9,10 +9,10 @@ import org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider;
|
||||
import org.keycloak.broker.oidc.mappers.AbstractJsonUserAttributeMapper;
|
||||
import org.keycloak.broker.provider.BrokeredIdentityContext;
|
||||
import org.keycloak.broker.provider.IdentityBrokerException;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.broker.social.SocialIdentityProvider;
|
||||
import org.keycloak.connections.httpclient.HttpClientProvider;
|
||||
import org.keycloak.events.EventBuilder;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
|
||||
import java.io.IOException;
|
||||
@ -110,7 +110,7 @@ public class OpenshiftV4IdentityProvider extends AbstractOAuth2IdentityProvider<
|
||||
}
|
||||
|
||||
private JsonNode fetchProfile(String accessToken) throws IOException {
|
||||
return SimpleHttp.doGet(getConfig().getUserInfoUrl(), this.session)
|
||||
return SimpleHttp.create(session).doGet(getConfig().getUserInfoUrl())
|
||||
.header("Authorization", "Bearer " + accessToken)
|
||||
.asJson();
|
||||
}
|
||||
|
||||
@ -19,13 +19,12 @@ package org.keycloak.social.paypal;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider;
|
||||
import org.keycloak.broker.oidc.OAuth2IdentityProviderConfig;
|
||||
import org.keycloak.broker.oidc.mappers.AbstractJsonUserAttributeMapper;
|
||||
import org.keycloak.broker.provider.BrokeredIdentityContext;
|
||||
import org.keycloak.broker.provider.IdentityBrokerException;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.broker.social.SocialIdentityProvider;
|
||||
import org.keycloak.events.EventBuilder;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
|
||||
/**
|
||||
@ -73,7 +72,7 @@ public class PayPalIdentityProvider extends AbstractOAuth2IdentityProvider<PayPa
|
||||
@Override
|
||||
protected BrokeredIdentityContext doGetFederatedIdentity(String accessToken) {
|
||||
try {
|
||||
JsonNode profile = SimpleHttp.doGet(getConfig().getUserInfoUrl(), session).header("Authorization", "Bearer " + accessToken).asJson();
|
||||
JsonNode profile = SimpleHttp.create(session).doGet(getConfig().getUserInfoUrl()).header("Authorization", "Bearer " + accessToken).asJson();
|
||||
|
||||
return extractIdentityFromProfile(null, profile);
|
||||
} catch (Exception e) {
|
||||
|
||||
@ -22,9 +22,10 @@ import org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider;
|
||||
import org.keycloak.broker.oidc.mappers.AbstractJsonUserAttributeMapper;
|
||||
import org.keycloak.broker.provider.BrokeredIdentityContext;
|
||||
import org.keycloak.broker.provider.IdentityBrokerException;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.broker.social.SocialIdentityProvider;
|
||||
import org.keycloak.events.EventBuilder;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttpRequest;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
|
||||
import java.io.StringWriter;
|
||||
@ -66,9 +67,9 @@ public class StackoverflowIdentityProvider extends AbstractOAuth2IdentityProvide
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SimpleHttp buildUserInfoRequest(String subjectToken, String userInfoUrl) {
|
||||
protected SimpleHttpRequest buildUserInfoRequest(String subjectToken, String userInfoUrl) {
|
||||
String URL = PROFILE_URL + "&access_token=" + subjectToken + "&key=" + getConfig().getKey();
|
||||
return SimpleHttp.doGet(URL, session);
|
||||
return SimpleHttp.create(session).doGet(URL);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -98,7 +99,7 @@ public class StackoverflowIdentityProvider extends AbstractOAuth2IdentityProvide
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("StackOverflow profile request to: " + URL);
|
||||
}
|
||||
return extractIdentityFromProfile(null, SimpleHttp.doGet(URL, session).asJson());
|
||||
return extractIdentityFromProfile(null, SimpleHttp.create(session).doGet(URL).asJson());
|
||||
} catch (Exception e) {
|
||||
throw new IdentityBrokerException("Could not obtain user profile from Stackoverflow: " + e.getMessage(), e);
|
||||
}
|
||||
|
||||
@ -2,6 +2,7 @@ package org.keycloak.testframework;
|
||||
|
||||
import org.keycloak.testframework.admin.AdminClientFactorySupplier;
|
||||
import org.keycloak.testframework.admin.AdminClientSupplier;
|
||||
import org.keycloak.testframework.http.SimpleHttpSupplier;
|
||||
import org.keycloak.testframework.infinispan.InfinispanExternalServerSupplier;
|
||||
import org.keycloak.testframework.database.DevFileDatabaseSupplier;
|
||||
import org.keycloak.testframework.database.DevMemDatabaseSupplier;
|
||||
@ -45,7 +46,8 @@ public class CoreTestFrameworkExtension implements TestFrameworkExtension {
|
||||
new AdminEventsSupplier(),
|
||||
new HttpClientSupplier(),
|
||||
new HttpServerSupplier(),
|
||||
new InfinispanExternalServerSupplier()
|
||||
new InfinispanExternalServerSupplier(),
|
||||
new SimpleHttpSupplier()
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,12 @@
|
||||
package org.keycloak.testframework.annotations;
|
||||
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.FIELD)
|
||||
public @interface InjectSimpleHttp {
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
package org.keycloak.testframework.http;
|
||||
|
||||
import org.apache.http.client.HttpClient;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.testframework.annotations.InjectSimpleHttp;
|
||||
import org.keycloak.testframework.injection.InstanceContext;
|
||||
import org.keycloak.testframework.injection.RequestedInstance;
|
||||
import org.keycloak.testframework.injection.Supplier;
|
||||
|
||||
public class SimpleHttpSupplier implements Supplier<SimpleHttp, InjectSimpleHttp> {
|
||||
|
||||
@Override
|
||||
public SimpleHttp getValue(InstanceContext<SimpleHttp, InjectSimpleHttp> instanceContext) {
|
||||
HttpClient httpClient = instanceContext.getDependency(HttpClient.class);
|
||||
return SimpleHttp.create(httpClient);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean compatible(InstanceContext<SimpleHttp, InjectSimpleHttp> a, RequestedInstance<SimpleHttp, InjectSimpleHttp> b) {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@ -2,7 +2,6 @@ package org.keycloak.tests.client.authentication.external;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
import org.apache.http.client.HttpClient;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.MethodOrderer;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@ -10,12 +9,13 @@ import org.junit.jupiter.api.TestMethodOrder;
|
||||
import org.keycloak.admin.client.resource.IdentityProvidersResource;
|
||||
import org.keycloak.broker.spiffe.SpiffeIdentityProviderConfig;
|
||||
import org.keycloak.broker.spiffe.SpiffeIdentityProviderFactory;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.models.IdentityProviderModel;
|
||||
import org.keycloak.models.IdentityProviderShowInAccountConsole;
|
||||
import org.keycloak.models.IdentityProviderStorageProvider;
|
||||
import org.keycloak.representations.idm.IdentityProviderRepresentation;
|
||||
import org.keycloak.testframework.annotations.InjectHttpClient;
|
||||
import org.keycloak.testframework.annotations.InjectRealm;
|
||||
import org.keycloak.testframework.annotations.InjectSimpleHttp;
|
||||
import org.keycloak.testframework.annotations.InjectUser;
|
||||
import org.keycloak.testframework.annotations.KeycloakIntegrationTest;
|
||||
import org.keycloak.testframework.oauth.OAuthClient;
|
||||
@ -27,7 +27,6 @@ import org.keycloak.testframework.remote.runonserver.RunOnServerClient;
|
||||
import org.keycloak.testframework.ui.annotations.InjectPage;
|
||||
import org.keycloak.testframework.ui.page.LoginPage;
|
||||
import org.keycloak.tests.common.BasicUserConfig;
|
||||
import org.keycloak.tests.utils.SimpleHttp;
|
||||
import org.keycloak.testsuite.util.IdentityProviderBuilder;
|
||||
import org.openqa.selenium.NoSuchElementException;
|
||||
|
||||
@ -46,8 +45,8 @@ public class SpiffeConfigTest {
|
||||
@InjectRunOnServer
|
||||
RunOnServerClient runOnServer;
|
||||
|
||||
@InjectHttpClient
|
||||
HttpClient httpClient;
|
||||
@InjectSimpleHttp
|
||||
SimpleHttp simpleHttp;
|
||||
|
||||
@InjectOAuthClient
|
||||
OAuthClient oAuthClient;
|
||||
@ -90,7 +89,7 @@ public class SpiffeConfigTest {
|
||||
private void checkNoIdpsInAccountConsole() throws IOException {
|
||||
String accessToken = oAuthClient.passwordGrantRequest(user.getUsername(), user.getPassword()).send().getAccessToken();
|
||||
String accountUrl = realm.getBaseUrl() + "/account//linked-accounts";
|
||||
JsonNode json = SimpleHttp.doGet(accountUrl, httpClient).auth(accessToken).asJson();
|
||||
JsonNode json = simpleHttp.doGet(accountUrl).auth(accessToken).asJson();
|
||||
Assertions.assertEquals(0, json.size());
|
||||
}
|
||||
|
||||
|
||||
@ -1,32 +0,0 @@
|
||||
package org.keycloak.tests.utils;
|
||||
|
||||
import org.apache.http.client.HttpClient;
|
||||
import org.keycloak.connections.httpclient.HttpClientProvider;
|
||||
|
||||
public class SimpleHttp extends org.keycloak.broker.provider.util.SimpleHttp {
|
||||
|
||||
protected SimpleHttp(String url, String method, HttpClient client, long maxConsumedResponseSize) {
|
||||
super(url, method, client, maxConsumedResponseSize);
|
||||
}
|
||||
|
||||
public static org.keycloak.broker.provider.util.SimpleHttp doDelete(String url, HttpClient client) {
|
||||
return org.keycloak.broker.provider.util.SimpleHttp.doDelete(url, client, HttpClientProvider.DEFAULT_MAX_CONSUMED_RESPONSE_SIZE);
|
||||
}
|
||||
|
||||
public static org.keycloak.broker.provider.util.SimpleHttp doPost(String url, HttpClient client) {
|
||||
return org.keycloak.broker.provider.util.SimpleHttp.doPost(url, client, HttpClientProvider.DEFAULT_MAX_CONSUMED_RESPONSE_SIZE);
|
||||
}
|
||||
|
||||
public static org.keycloak.broker.provider.util.SimpleHttp doPut(String url, HttpClient client) {
|
||||
return org.keycloak.broker.provider.util.SimpleHttp.doPut(url, client, HttpClientProvider.DEFAULT_MAX_CONSUMED_RESPONSE_SIZE);
|
||||
}
|
||||
|
||||
public static org.keycloak.broker.provider.util.SimpleHttp doGet(String url, HttpClient client) {
|
||||
return org.keycloak.broker.provider.util.SimpleHttp.doGet(url, client, HttpClientProvider.DEFAULT_MAX_CONSUMED_RESPONSE_SIZE);
|
||||
}
|
||||
|
||||
public static org.keycloak.broker.provider.util.SimpleHttp doHead(String url, HttpClient client) {
|
||||
return org.keycloak.broker.provider.util.SimpleHttp.doHead(url, client, HttpClientProvider.DEFAULT_MAX_CONSUMED_RESPONSE_SIZE);
|
||||
}
|
||||
|
||||
}
|
||||
@ -26,7 +26,7 @@ import java.util.function.Supplier;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.HttpClientBuilder;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.representations.account.CredentialMetadataRepresentation;
|
||||
import org.keycloak.representations.idm.CredentialRepresentation;
|
||||
import org.keycloak.services.resources.account.AccountCredentialResource;
|
||||
@ -74,7 +74,7 @@ public class AccountRestClient implements AutoCloseable {
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
public SimpleHttp.Response removeCredential(String credentialId) {
|
||||
public SimpleHttpResponse removeCredential(String credentialId) {
|
||||
try {
|
||||
return SimpleHttpDefault
|
||||
.doDelete(getAccountUrl("credentials/" + credentialId), httpClient)
|
||||
|
||||
@ -18,39 +18,34 @@
|
||||
package org.keycloak.testsuite.broker.util;
|
||||
|
||||
import org.apache.http.client.HttpClient;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.connections.httpclient.HttpClientProvider;
|
||||
import org.keycloak.http.simple.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttpRequest;
|
||||
|
||||
/**
|
||||
* This class provides additional builders used in tests to create instances of SimpleHttpTest with a default length response size set.
|
||||
*
|
||||
* @author Alexander Schwartz
|
||||
*/
|
||||
public abstract class SimpleHttpDefault extends SimpleHttp {
|
||||
public abstract class SimpleHttpDefault {
|
||||
|
||||
protected SimpleHttpDefault(String url, String method, HttpClient client, long maxConsumedResponseSize) {
|
||||
// dummy constructor, only needed to make the compiler happy
|
||||
super(url, method, client, maxConsumedResponseSize);
|
||||
public static SimpleHttpRequest doDelete(String url, HttpClient client) {
|
||||
return SimpleHttp.create(client).doDelete(url);
|
||||
}
|
||||
|
||||
public static SimpleHttp doDelete(String url, HttpClient client) {
|
||||
return SimpleHttp.doDelete(url, client, HttpClientProvider.DEFAULT_MAX_CONSUMED_RESPONSE_SIZE);
|
||||
public static SimpleHttpRequest doPost(String url, HttpClient client) {
|
||||
return SimpleHttp.create(client).doPost(url);
|
||||
}
|
||||
|
||||
public static SimpleHttp doPost(String url, HttpClient client) {
|
||||
return SimpleHttp.doPost(url, client, HttpClientProvider.DEFAULT_MAX_CONSUMED_RESPONSE_SIZE);
|
||||
public static SimpleHttpRequest doPut(String url, HttpClient client) {
|
||||
return SimpleHttp.create(client).doPut(url);
|
||||
}
|
||||
|
||||
public static SimpleHttp doPut(String url, HttpClient client) {
|
||||
return SimpleHttp.doPut(url, client, HttpClientProvider.DEFAULT_MAX_CONSUMED_RESPONSE_SIZE);
|
||||
public static SimpleHttpRequest doGet(String url, HttpClient client) {
|
||||
return SimpleHttp.create(client).doGet(url);
|
||||
}
|
||||
|
||||
public static SimpleHttp doGet(String url, HttpClient client) {
|
||||
return SimpleHttp.doGet(url, client, HttpClientProvider.DEFAULT_MAX_CONSUMED_RESPONSE_SIZE);
|
||||
}
|
||||
|
||||
public static SimpleHttp doHead(String url, HttpClient client) {
|
||||
return SimpleHttp.doHead(url, client, HttpClientProvider.DEFAULT_MAX_CONSUMED_RESPONSE_SIZE);
|
||||
public static SimpleHttpRequest doHead(String url, HttpClient client) {
|
||||
return SimpleHttp.create(client).doHead(url);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -32,7 +32,7 @@ import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.keycloak.admin.client.resource.UserProfileResource;
|
||||
import org.keycloak.admin.client.resource.UserResource;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.representations.account.UserRepresentation;
|
||||
import org.keycloak.representations.idm.ErrorRepresentation;
|
||||
import org.keycloak.representations.userprofile.config.UPAttribute;
|
||||
@ -265,7 +265,7 @@ public class AccountRestServiceReadOnlyAttributesTest extends AbstractRestServic
|
||||
|
||||
|
||||
private void updateError(UserRepresentation user, int expectedStatus, String expectedMessage) throws IOException {
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
assertEquals(expectedStatus, response.getStatus());
|
||||
assertEquals(expectedMessage, response.asJson(ErrorRepresentation.class).getErrorMessage());
|
||||
}
|
||||
|
||||
@ -17,8 +17,10 @@
|
||||
package org.keycloak.testsuite.account;
|
||||
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import jakarta.ws.rs.ClientErrorException;
|
||||
import jakarta.ws.rs.core.HttpHeaders;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
import org.apache.http.Header;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.hamcrest.Matchers;
|
||||
@ -34,12 +36,13 @@ import org.keycloak.authentication.authenticators.browser.WebAuthnPasswordlessAu
|
||||
import org.keycloak.authentication.requiredactions.DeleteCredentialAction;
|
||||
import org.keycloak.authentication.requiredactions.WebAuthnPasswordlessRegisterFactory;
|
||||
import org.keycloak.authentication.requiredactions.WebAuthnRegisterFactory;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.common.enums.AccountRestApiVersion;
|
||||
import org.keycloak.common.util.ObjectUtil;
|
||||
import org.keycloak.credential.CredentialTypeMetadata;
|
||||
import org.keycloak.events.Details;
|
||||
import org.keycloak.events.EventType;
|
||||
import org.keycloak.http.simple.SimpleHttpRequest;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.AuthenticationExecutionModel;
|
||||
import org.keycloak.models.ClientScopeModel;
|
||||
import org.keycloak.models.UserModel;
|
||||
@ -53,7 +56,6 @@ import org.keycloak.representations.account.ClientRepresentation;
|
||||
import org.keycloak.representations.account.ConsentRepresentation;
|
||||
import org.keycloak.representations.account.ConsentScopeRepresentation;
|
||||
import org.keycloak.representations.account.SessionRepresentation;
|
||||
import org.keycloak.representations.idm.UserProfileAttributeMetadata;
|
||||
import org.keycloak.representations.account.UserRepresentation;
|
||||
import org.keycloak.representations.idm.AuthenticationExecutionInfoRepresentation;
|
||||
import org.keycloak.representations.idm.AuthenticationExecutionRepresentation;
|
||||
@ -66,22 +68,21 @@ import org.keycloak.representations.idm.ProtocolMapperRepresentation;
|
||||
import org.keycloak.representations.idm.RealmRepresentation;
|
||||
import org.keycloak.representations.idm.RequiredActionProviderRepresentation;
|
||||
import org.keycloak.representations.idm.RequiredActionProviderSimpleRepresentation;
|
||||
import org.keycloak.representations.idm.UserProfileAttributeMetadata;
|
||||
import org.keycloak.services.cors.Cors;
|
||||
import org.keycloak.services.messages.Messages;
|
||||
import org.keycloak.services.resources.account.AccountCredentialResource;
|
||||
import org.keycloak.services.util.ResolveRelative;
|
||||
import org.keycloak.testsuite.AbstractAuthenticationTest;
|
||||
import org.keycloak.testsuite.AssertEvents;
|
||||
import org.keycloak.testsuite.admin.ApiUtil;
|
||||
import org.keycloak.testsuite.AbstractAuthenticationTest;
|
||||
import org.keycloak.testsuite.broker.util.SimpleHttpDefault;
|
||||
import org.keycloak.testsuite.util.oauth.AccessTokenResponse;
|
||||
import org.keycloak.testsuite.util.TokenUtil;
|
||||
import org.keycloak.testsuite.util.UserBuilder;
|
||||
import org.keycloak.testsuite.util.oauth.AccessTokenResponse;
|
||||
import org.keycloak.testsuite.util.userprofile.UserProfileUtil;
|
||||
import org.keycloak.userprofile.UserProfileContext;
|
||||
|
||||
import jakarta.ws.rs.ClientErrorException;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
@ -305,7 +306,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
user.setFirstName(originalFirstName);
|
||||
user.setLastName(originalLastName);
|
||||
user.setEmail(originalEmail);
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
System.out.println(response.asString());
|
||||
assertEquals(204, response.getStatus());
|
||||
}
|
||||
@ -353,7 +354,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
adminClient.realm("test").update(realmRep);
|
||||
|
||||
user.setEmail(originalEmail);
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
System.out.println(response.asString());
|
||||
assertEquals(204, response.getStatus());
|
||||
}
|
||||
@ -413,7 +414,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
user.setFirstName(originalFirstName);
|
||||
user.setLastName(originalLastName);
|
||||
user.setEmail(originalEmail);
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
System.out.println(response.asString());
|
||||
assertEquals(204, response.getStatus());
|
||||
}
|
||||
@ -520,7 +521,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
user.setFirstName(originalFirstName);
|
||||
user.setLastName(originalLastName);
|
||||
user.setEmail(originalEmail);
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
System.out.println(response.asString());
|
||||
assertEquals(204, response.getStatus());
|
||||
}
|
||||
@ -570,7 +571,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
|
||||
user.setUsername(originalUsername);
|
||||
user.setAttributes(originalAttributes);
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
System.out.println(response.asString());
|
||||
assertEquals(204, response.getStatus());
|
||||
}
|
||||
@ -602,11 +603,11 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
@Test
|
||||
public void testCors() throws IOException {
|
||||
String accountUrl = getAccountUrl(null);
|
||||
SimpleHttp a = SimpleHttpDefault.doGet(accountUrl + "/linked-accounts", httpClient).auth(tokenUtil.getToken())
|
||||
SimpleHttpRequest a = SimpleHttpDefault.doGet(accountUrl + "/linked-accounts", httpClient).auth(tokenUtil.getToken())
|
||||
.header("Origin", "http://localtest.me:8180")
|
||||
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
|
||||
|
||||
try (SimpleHttp.Response response = a.asResponse()) {
|
||||
try (SimpleHttpResponse response = a.asResponse()) {
|
||||
Set<String> expected = new HashSet<>();
|
||||
Header[] actual = response.getAllHeaders();
|
||||
|
||||
@ -629,7 +630,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
}
|
||||
|
||||
protected static UserRepresentation getUser(String accountUrl, CloseableHttpClient httpClient, TokenUtil tokenUtil) throws IOException {
|
||||
SimpleHttp a = SimpleHttpDefault.doGet(accountUrl, httpClient).auth(tokenUtil.getToken());
|
||||
SimpleHttpRequest a = SimpleHttpDefault.doGet(accountUrl, httpClient).auth(tokenUtil.getToken());
|
||||
|
||||
try {
|
||||
return a.asJson(UserRepresentation.class);
|
||||
@ -640,7 +641,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
}
|
||||
|
||||
protected UserRepresentation updateAndGet(UserRepresentation user) throws IOException {
|
||||
SimpleHttp a = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user);
|
||||
SimpleHttpRequest a = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user);
|
||||
try {
|
||||
assertEquals(204, a.asStatus());
|
||||
} catch (AssertionError e) {
|
||||
@ -652,7 +653,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
|
||||
|
||||
protected void updateError(UserRepresentation user, int expectedStatus, String expectedMessage) throws IOException {
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
assertEquals(expectedStatus, response.getStatus());
|
||||
ErrorRepresentation errorRep = response.asJson(ErrorRepresentation.class);
|
||||
List<ErrorRepresentation> errors = errorRep.getErrors();
|
||||
@ -795,7 +796,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
.get();
|
||||
|
||||
// Test that current user can't update the credential, which belongs to the different user
|
||||
SimpleHttp.Response response = SimpleHttpDefault
|
||||
SimpleHttpResponse response = SimpleHttpDefault
|
||||
.doPut(getAccountUrl("credentials/" + otpCredential.getId() + "/label"), httpClient)
|
||||
.auth(tokenUtil.getToken())
|
||||
.json("new-label")
|
||||
@ -874,7 +875,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
.filter(credentialRep -> OTPCredentialModel.TYPE.equals(credentialRep.getType()))
|
||||
.findFirst()
|
||||
.get();
|
||||
SimpleHttp.Response response = SimpleHttpDefault
|
||||
SimpleHttpResponse response = SimpleHttpDefault
|
||||
.doDelete(getAccountUrl("credentials/" + otpCredential.getId()), httpClient)
|
||||
.acceptJson()
|
||||
.auth(tokenUtil.getToken())
|
||||
@ -980,7 +981,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
String otpCredentialId = otpCredential.getUserCredentialMetadatas().get(0).getCredential().getId();
|
||||
|
||||
// remove credential using account console as otp is removable
|
||||
try (SimpleHttp.Response response = SimpleHttpDefault
|
||||
try (SimpleHttpResponse response = SimpleHttpDefault
|
||||
.doDelete(getAccountUrl("credentials/" + otpCredentialId), httpClient)
|
||||
.acceptJson()
|
||||
.auth(tokenUtil.getToken())
|
||||
@ -1041,7 +1042,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
assertCredentialContainerExpected(password, PasswordCredentialModel.TYPE, CredentialTypeMetadata.Category.BASIC_AUTHENTICATION.toString(),
|
||||
"password-display-name", "password-help-text", "kcAuthenticatorPasswordClass",
|
||||
null, UserModel.RequiredAction.UPDATE_PASSWORD.toString(), false, 1);
|
||||
try (SimpleHttp.Response response = SimpleHttpDefault
|
||||
try (SimpleHttpResponse response = SimpleHttpDefault
|
||||
.doDelete(getAccountUrl("credentials/" + password.getUserCredentialMetadatas().get(0).getCredential().getId()), httpClient)
|
||||
.acceptJson()
|
||||
.auth(tokenUtil.getToken())
|
||||
@ -1305,7 +1306,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
@Test
|
||||
public void listApplicationsWithoutPermission() throws IOException {
|
||||
TokenUtil token = new TokenUtil("no-account-access", "password");
|
||||
SimpleHttp.Response response = SimpleHttpDefault
|
||||
SimpleHttpResponse response = SimpleHttpDefault
|
||||
.doGet(getAccountUrl("applications"), httpClient)
|
||||
.header("Accept", "application/json")
|
||||
.auth(token.getToken())
|
||||
@ -1317,7 +1318,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
public void getNotExistingApplication() throws IOException {
|
||||
TokenUtil token = new TokenUtil("view-applications-access", "password");
|
||||
String appId = "not-existing";
|
||||
SimpleHttp.Response response = SimpleHttpDefault
|
||||
SimpleHttpResponse response = SimpleHttpDefault
|
||||
.doGet(getAccountUrl("applications/" + appId), httpClient)
|
||||
.header("Accept", "application/json")
|
||||
.auth(token.getToken())
|
||||
@ -1427,7 +1428,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
List<ClientScopeRepresentation> requestedScopes = testRealm().clientScopes().findAll().subList(0,1);
|
||||
ConsentRepresentation requestedConsent = createRequestedConsent(requestedScopes);
|
||||
|
||||
SimpleHttp.Response response = SimpleHttpDefault
|
||||
SimpleHttpResponse response = SimpleHttpDefault
|
||||
.doPost(getAccountUrl("applications/" + appId + "/consent"), httpClient)
|
||||
.header("Accept", "application/json")
|
||||
.json(requestedConsent)
|
||||
@ -1445,7 +1446,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
List<ClientScopeRepresentation> requestedScopes = testRealm().clientScopes().findAll().subList(0,1);
|
||||
ConsentRepresentation requestedConsent = createRequestedConsent(requestedScopes);
|
||||
|
||||
SimpleHttp.Response response = SimpleHttpDefault
|
||||
SimpleHttpResponse response = SimpleHttpDefault
|
||||
.doPost(getAccountUrl("applications/" + appId + "/consent"), httpClient)
|
||||
.header("Accept", "application/json")
|
||||
.json(requestedConsent)
|
||||
@ -1548,7 +1549,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
List<ClientScopeRepresentation> requestedScopes = testRealm().clientScopes().findAll().subList(0,1);
|
||||
ConsentRepresentation requestedConsent = createRequestedConsent(requestedScopes);
|
||||
|
||||
SimpleHttp.Response response = SimpleHttpDefault
|
||||
SimpleHttpResponse response = SimpleHttpDefault
|
||||
.doPut(getAccountUrl("applications/" + appId + "/consent"), httpClient)
|
||||
.header("Accept", "application/json")
|
||||
.json(requestedConsent)
|
||||
@ -1566,7 +1567,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
List<ClientScopeRepresentation> requestedScopes = testRealm().clientScopes().findAll().subList(0,1);
|
||||
ConsentRepresentation requestedConsent = createRequestedConsent(requestedScopes);
|
||||
|
||||
SimpleHttp.Response response = SimpleHttpDefault
|
||||
SimpleHttpResponse response = SimpleHttpDefault
|
||||
.doPut(getAccountUrl("applications/" + appId + "/consent"), httpClient)
|
||||
.header("Accept", "application/json")
|
||||
.json(requestedConsent)
|
||||
@ -1609,7 +1610,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
public void getConsentForNotExistingClient() throws IOException {
|
||||
tokenUtil = new TokenUtil("view-consent-access", "password");
|
||||
String appId = "not-existing";
|
||||
SimpleHttp.Response response = SimpleHttpDefault
|
||||
SimpleHttpResponse response = SimpleHttpDefault
|
||||
.doGet(getAccountUrl("applications/" + appId + "/consent"), httpClient)
|
||||
.header("Accept", "application/json")
|
||||
.auth(tokenUtil.getToken())
|
||||
@ -1621,7 +1622,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
public void getNotExistingConsentForClient() throws IOException {
|
||||
tokenUtil = new TokenUtil("view-consent-access", "password");
|
||||
String appId = "security-admin-console";
|
||||
SimpleHttp.Response response = SimpleHttpDefault
|
||||
SimpleHttpResponse response = SimpleHttpDefault
|
||||
.doGet(getAccountUrl("applications/" + appId + "/consent"), httpClient)
|
||||
.header("Accept", "application/json")
|
||||
.auth(tokenUtil.getToken())
|
||||
@ -1633,7 +1634,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
public void getConsentWithoutPermission() throws IOException {
|
||||
tokenUtil = new TokenUtil("no-account-access", "password");
|
||||
String appId = "security-admin-console";
|
||||
SimpleHttp.Response response = SimpleHttpDefault
|
||||
SimpleHttpResponse response = SimpleHttpDefault
|
||||
.doGet(getAccountUrl("applications/" + appId + "/consent"), httpClient)
|
||||
.header("Accept", "application/json")
|
||||
.auth(tokenUtil.getToken())
|
||||
@ -1660,7 +1661,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
assertEquals(1, consentRepresentation.getGrantedScopes().size());
|
||||
assertEquals(requestedScopes.get(0).getId(), consentRepresentation.getGrantedScopes().get(0).getId());
|
||||
|
||||
SimpleHttp.Response response = SimpleHttpDefault
|
||||
SimpleHttpResponse response = SimpleHttpDefault
|
||||
.doDelete(getAccountUrl("applications/" + appId + "/consent"), httpClient)
|
||||
.header("Accept", "application/json")
|
||||
.auth(tokenUtil.getToken())
|
||||
@ -1687,7 +1688,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
public void deleteConsentForNotExistingClient() throws IOException {
|
||||
tokenUtil = new TokenUtil("manage-consent-access", "password");
|
||||
String appId = "not-existing";
|
||||
SimpleHttp.Response response = SimpleHttpDefault
|
||||
SimpleHttpResponse response = SimpleHttpDefault
|
||||
.doDelete(getAccountUrl("applications/" + appId + "/consent"), httpClient)
|
||||
.header("Accept", "application/json")
|
||||
.auth(tokenUtil.getToken())
|
||||
@ -1699,7 +1700,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
public void deleteConsentWithoutPermission() throws IOException {
|
||||
tokenUtil = new TokenUtil("view-consent-access", "password");
|
||||
String appId = "security-admin-console";
|
||||
SimpleHttp.Response response = SimpleHttpDefault
|
||||
SimpleHttpResponse response = SimpleHttpDefault
|
||||
.doDelete(getAccountUrl("applications/" + appId + "/consent"), httpClient)
|
||||
.header("Accept", "application/json")
|
||||
.auth(tokenUtil.getToken())
|
||||
@ -1717,7 +1718,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
|
||||
tokenUtil = new TokenUtil("view-applications-access", "password");
|
||||
|
||||
SimpleHttp.Response response = SimpleHttpDefault
|
||||
SimpleHttpResponse response = SimpleHttpDefault
|
||||
.doDelete(getAccountUrl("applications/offline-client/consent"), httpClient)
|
||||
.header("Accept", "application/json")
|
||||
.auth(tokenUtil.getToken())
|
||||
@ -1751,7 +1752,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
public void testInvalidApiVersion() throws IOException {
|
||||
apiVersion = "v2-foo";
|
||||
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doGet(getAccountUrl("credentials"), httpClient).auth(tokenUtil.getToken()).asResponse();
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doGet(getAccountUrl("credentials"), httpClient).auth(tokenUtil.getToken()).asResponse();
|
||||
assertEquals("API version not found", response.asJson().get("error").textValue());
|
||||
assertEquals(404, response.getStatus());
|
||||
}
|
||||
@ -1762,7 +1763,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
AccessTokenResponse tokenResponse = oauth.doPasswordGrantRequest("test-user@localhost", "password");
|
||||
assertNull(tokenResponse.getErrorDescription());
|
||||
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doGet(getAccountUrl(null), httpClient)
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doGet(getAccountUrl(null), httpClient)
|
||||
.auth(tokenResponse.getAccessToken())
|
||||
.header("Accept", "application/json")
|
||||
.asResponse();
|
||||
@ -1808,7 +1809,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
realmRep.setAccountTheme("custom-account-provider");
|
||||
adminClient.realm("test").update(realmRep);
|
||||
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doGet(getAccountUrl(null), httpClient)
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doGet(getAccountUrl(null), httpClient)
|
||||
.header("Accept", "text/html")
|
||||
.asResponse();
|
||||
assertEquals(200, response.getStatus());
|
||||
@ -1826,7 +1827,7 @@ public class AccountRestServiceTest extends AbstractRestServiceTest {
|
||||
public void testUpdateProfileUnrecognizedPropertyInRepresentation() throws IOException {
|
||||
final UserRepresentation user = getUser();
|
||||
final Map<String,String> invalidRep = Map.of("id", user.getId(), "username", user.getUsername(), "invalid", "something");
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient)
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient)
|
||||
.auth(tokenUtil.getToken())
|
||||
.json(invalidRep)
|
||||
.asResponse();
|
||||
|
||||
@ -42,9 +42,10 @@ import java.util.Set;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.keycloak.admin.client.resource.RealmResource;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.events.Details;
|
||||
import org.keycloak.events.EventType;
|
||||
import org.keycloak.http.simple.SimpleHttpRequest;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.UserModel;
|
||||
import org.keycloak.models.UserModel.RequiredAction;
|
||||
import org.keycloak.representations.idm.UserProfileAttributeMetadata;
|
||||
@ -366,7 +367,7 @@ public class AccountRestServiceWithUserProfileTest extends AbstractRestServiceTe
|
||||
user.setLastName(originalLastName);
|
||||
user.setEmail(originalEmail);
|
||||
user.setAttributes(originalAttributes);
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
System.out.println(response.asString());
|
||||
assertEquals(204, response.getStatus());
|
||||
}
|
||||
@ -425,7 +426,7 @@ public class AccountRestServiceWithUserProfileTest extends AbstractRestServiceTe
|
||||
}
|
||||
|
||||
protected UserRepresentation updateAndGet(UserRepresentation user) throws IOException {
|
||||
SimpleHttp a = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user);
|
||||
SimpleHttpRequest a = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user);
|
||||
try {
|
||||
assertEquals(204, a.asStatus());
|
||||
} catch (AssertionError e) {
|
||||
|
||||
@ -24,9 +24,10 @@ import org.keycloak.admin.client.resource.ClientResource;
|
||||
import org.keycloak.admin.client.resource.ClientsResource;
|
||||
import org.keycloak.authorization.client.AuthzClient;
|
||||
import org.keycloak.authorization.client.Configuration;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.common.Profile;
|
||||
import org.keycloak.common.util.KeycloakUriBuilder;
|
||||
import org.keycloak.http.simple.SimpleHttpRequest;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.jose.jws.JWSInput;
|
||||
import org.keycloak.models.AccountRoles;
|
||||
import org.keycloak.representations.AccessToken;
|
||||
@ -387,7 +388,7 @@ public class ResourcesRestServiceTest extends AbstractRestServiceTest {
|
||||
permissions.add(new Permission(users.get(users.size() - 1), "Scope A", "Scope B", "Scope C", "Scope D"));
|
||||
|
||||
String resourceId = sharedResource.getId();
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doPut(getAccountUrl("resources/" + encodePathAsIs(resourceId) + "/permissions"), httpClient)
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doPut(getAccountUrl("resources/" + encodePathAsIs(resourceId) + "/permissions"), httpClient)
|
||||
.auth(tokenUtil.getToken())
|
||||
.json(permissions).asResponse();
|
||||
|
||||
@ -411,7 +412,7 @@ public class ResourcesRestServiceTest extends AbstractRestServiceTest {
|
||||
public void failShareResourceInvalidPermissions() throws Exception {
|
||||
List<Permission> permissions = new ArrayList<>();
|
||||
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doPut(getAccountUrl("resources/" + encodePathAsIs(getMyResources().get(0).getId()) + "/permissions"), httpClient)
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doPut(getAccountUrl("resources/" + encodePathAsIs(getMyResources().get(0).getId()) + "/permissions"), httpClient)
|
||||
.auth(tokenUtil.getToken())
|
||||
.json(permissions).asResponse();
|
||||
|
||||
@ -476,7 +477,7 @@ public class ResourcesRestServiceTest extends AbstractRestServiceTest {
|
||||
permissions.add(new Permission(users.get(users.size() - 1), "Scope B", "Scope D"));
|
||||
|
||||
String resourceId = sharedResource.getId();
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doPut(getAccountUrl("resources/" + encodePathAsIs(resourceId) + "/permissions"), httpClient)
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doPut(getAccountUrl("resources/" + encodePathAsIs(resourceId) + "/permissions"), httpClient)
|
||||
.auth(tokenUtil.getToken())
|
||||
.json(permissions).asResponse();
|
||||
|
||||
@ -643,7 +644,7 @@ public class ResourcesRestServiceTest extends AbstractRestServiceTest {
|
||||
return getSharedWithMe(userName, null, -1, -1, null);
|
||||
}
|
||||
|
||||
private List<AbstractResourceService.ResourcePermission> getSharedWithMe(String userName, String name, int first, int max, Consumer<SimpleHttp.Response> responseHandler) {
|
||||
private List<AbstractResourceService.ResourcePermission> getSharedWithMe(String userName, String name, int first, int max, Consumer<SimpleHttpResponse> responseHandler) {
|
||||
KeycloakUriBuilder uri = KeycloakUriBuilder.fromUri("/shared-with-me");
|
||||
|
||||
if (name != null) {
|
||||
@ -663,7 +664,7 @@ public class ResourcesRestServiceTest extends AbstractRestServiceTest {
|
||||
return doGet(resource, tokenUtil.getToken(), typeReference);
|
||||
}
|
||||
|
||||
private <R> R doGet(String resource, TypeReference<R> typeReference, Consumer<SimpleHttp.Response> response) {
|
||||
private <R> R doGet(String resource, TypeReference<R> typeReference, Consumer<SimpleHttpResponse> response) {
|
||||
return doGet(resource, tokenUtil.getToken(), typeReference, response);
|
||||
}
|
||||
|
||||
@ -679,12 +680,12 @@ public class ResourcesRestServiceTest extends AbstractRestServiceTest {
|
||||
}
|
||||
}
|
||||
|
||||
private <R> R doGet(String resource, String token, TypeReference<R> typeReference, Consumer<SimpleHttp.Response> responseHandler) {
|
||||
private <R> R doGet(String resource, String token, TypeReference<R> typeReference, Consumer<SimpleHttpResponse> responseHandler) {
|
||||
try {
|
||||
SimpleHttp http = get(resource, token);
|
||||
SimpleHttpRequest http = get(resource, token);
|
||||
|
||||
http.header("Accept", "application/json");
|
||||
SimpleHttp.Response response = http.asResponse();
|
||||
SimpleHttpResponse response = http.asResponse();
|
||||
|
||||
if (responseHandler != null) {
|
||||
responseHandler.accept(response);
|
||||
@ -706,7 +707,7 @@ public class ResourcesRestServiceTest extends AbstractRestServiceTest {
|
||||
}
|
||||
}
|
||||
|
||||
private SimpleHttp get(String resource, String token) {
|
||||
private SimpleHttpRequest get(String resource, String token) {
|
||||
return SimpleHttpDefault.doGet(getAccountUrl("resources" + resource), httpClient).auth(token);
|
||||
}
|
||||
|
||||
@ -757,7 +758,7 @@ public class ResourcesRestServiceTest extends AbstractRestServiceTest {
|
||||
return doGet(uri.build().toString(), new TypeReference<List<Resource>>() {});
|
||||
}
|
||||
|
||||
private List<Resource> getMyResources(int first, int max, Consumer<SimpleHttp.Response> response) {
|
||||
private List<Resource> getMyResources(int first, int max, Consumer<SimpleHttpResponse> response) {
|
||||
String query = "";
|
||||
if (first > -1 && max > -1) {
|
||||
query = "?first=" + first + "&max=" + max;
|
||||
@ -815,7 +816,7 @@ public class ResourcesRestServiceTest extends AbstractRestServiceTest {
|
||||
}
|
||||
}
|
||||
|
||||
private void assertNextPageLink(SimpleHttp.Response response, String uri, int nextPage, int previousPage, int max) {
|
||||
private void assertNextPageLink(SimpleHttpResponse response, String uri, int nextPage, int previousPage, int max) {
|
||||
try {
|
||||
List<String> links = response.getHeader("Link");
|
||||
|
||||
@ -839,4 +840,4 @@ public class ResourcesRestServiceTest extends AbstractRestServiceTest {
|
||||
fail("Fail to get link header");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -16,21 +16,10 @@
|
||||
*/
|
||||
package org.keycloak.testsuite.actions;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
import static org.keycloak.testsuite.util.ServerURLs.getAuthServerContextRoot;
|
||||
|
||||
import jakarta.mail.Address;
|
||||
import jakarta.mail.Message;
|
||||
import jakarta.mail.MessagingException;
|
||||
import jakarta.mail.internet.MimeMessage;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import jakarta.ws.rs.core.Response.Status;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.HttpClientBuilder;
|
||||
@ -42,9 +31,9 @@ import org.keycloak.admin.client.resource.AuthenticationManagementResource;
|
||||
import org.keycloak.admin.client.resource.UserResource;
|
||||
import org.keycloak.authentication.actiontoken.updateemail.UpdateEmailActionToken;
|
||||
import org.keycloak.authentication.requiredactions.UpdateEmail;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp.Response;
|
||||
import org.keycloak.events.Details;
|
||||
import org.keycloak.events.EventType;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.UserModel;
|
||||
import org.keycloak.models.UserModel.RequiredAction;
|
||||
import org.keycloak.representations.idm.EventRepresentation;
|
||||
@ -60,8 +49,19 @@ import org.keycloak.testsuite.pages.InfoPage;
|
||||
import org.keycloak.testsuite.util.GreenMailRule;
|
||||
import org.keycloak.testsuite.util.MailUtils;
|
||||
import org.keycloak.testsuite.util.UserBuilder;
|
||||
import org.keycloak.testsuite.util.oauth.OAuthClient;
|
||||
import org.keycloak.testsuite.util.WaitUtils;
|
||||
import org.keycloak.testsuite.util.oauth.OAuthClient;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
import static org.keycloak.testsuite.util.ServerURLs.getAuthServerContextRoot;
|
||||
|
||||
public class RequiredActionUpdateEmailTestWithVerificationTest extends AbstractRequiredActionUpdateEmailTest {
|
||||
|
||||
@ -193,7 +193,7 @@ public class RequiredActionUpdateEmailTestWithVerificationTest extends AbstractR
|
||||
String confirmationLink = fetchEmailConfirmationLink("new@localhost");
|
||||
|
||||
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
|
||||
try (Response response = SimpleHttpDefault.doHead(confirmationLink, httpClient).asResponse()) {
|
||||
try (SimpleHttpResponse response = SimpleHttpDefault.doHead(confirmationLink, httpClient).asResponse()) {
|
||||
assertEquals(Status.OK.getStatusCode(), response.getStatus());
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,14 +3,15 @@ package org.keycloak.testsuite.broker;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Lists;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.HttpClientBuilder;
|
||||
import org.hamcrest.Matchers;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.keycloak.admin.client.resource.ClientResource;
|
||||
import org.keycloak.admin.client.resource.ClientsResource;
|
||||
import org.keycloak.admin.client.resource.ClientScopeResource;
|
||||
import org.keycloak.admin.client.resource.ClientsResource;
|
||||
import org.keycloak.admin.client.resource.IdentityProviderResource;
|
||||
import org.keycloak.admin.client.resource.RealmResource;
|
||||
import org.keycloak.admin.client.resource.UserResource;
|
||||
@ -18,8 +19,8 @@ import org.keycloak.admin.client.resource.UsersResource;
|
||||
import org.keycloak.broker.oidc.OIDCIdentityProviderConfig;
|
||||
import org.keycloak.broker.oidc.mappers.ExternalKeycloakRoleToRoleMapper;
|
||||
import org.keycloak.broker.oidc.mappers.UserAttributeMapper;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.crypto.Algorithm;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.ClientModel;
|
||||
import org.keycloak.models.IdentityProviderMapperModel;
|
||||
import org.keycloak.models.IdentityProviderMapperSyncMode;
|
||||
@ -48,10 +49,8 @@ import org.keycloak.testsuite.Assert;
|
||||
import org.keycloak.testsuite.admin.ApiUtil;
|
||||
import org.keycloak.testsuite.broker.util.SimpleHttpDefault;
|
||||
import org.keycloak.testsuite.util.AccountHelper;
|
||||
import org.keycloak.testsuite.util.oauth.OAuthClient;
|
||||
import org.keycloak.testsuite.util.WaitUtils;
|
||||
|
||||
import jakarta.ws.rs.core.Response;
|
||||
import org.keycloak.testsuite.util.oauth.OAuthClient;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
@ -70,10 +69,10 @@ import static org.hamcrest.Matchers.notNullValue;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.keycloak.testsuite.broker.BrokerTestConstants.IDP_OIDC_ALIAS;
|
||||
import static org.keycloak.testsuite.broker.BrokerTestConstants.REALM_PROV_NAME;
|
||||
import static org.keycloak.testsuite.broker.BrokerTestTools.waitForPage;
|
||||
import static org.keycloak.testsuite.util.ProtocolMapperUtil.createHardcodedClaim;
|
||||
import static org.keycloak.testsuite.broker.BrokerTestTools.getConsumerRoot;
|
||||
import static org.keycloak.testsuite.broker.BrokerTestTools.getProviderRoot;
|
||||
import static org.keycloak.testsuite.broker.BrokerTestTools.waitForPage;
|
||||
import static org.keycloak.testsuite.util.ProtocolMapperUtil.createHardcodedClaim;
|
||||
|
||||
/**
|
||||
* Final class as it's not intended to be overriden. Feel free to remove "final" if you really know what you are doing.
|
||||
@ -377,7 +376,7 @@ public final class KcOidcBrokerTest extends AbstractAdvancedBrokerTest {
|
||||
assertThat(errorPage.getError(), is("Page not found"));
|
||||
|
||||
try (CloseableHttpClient client = HttpClientBuilder.create().build()) {
|
||||
SimpleHttp.Response simple = SimpleHttpDefault.doGet(LINK, client).asResponse();
|
||||
SimpleHttpResponse simple = SimpleHttpDefault.doGet(LINK, client).asResponse();
|
||||
assertThat(simple, notNullValue());
|
||||
assertThat(simple.getStatus(), is(Response.Status.NOT_FOUND.getStatusCode()));
|
||||
|
||||
|
||||
@ -20,12 +20,12 @@ import org.keycloak.broker.oidc.mappers.ExternalKeycloakRoleToRoleMapper;
|
||||
import org.keycloak.broker.oidc.mappers.UserAttributeMapper;
|
||||
import org.keycloak.broker.provider.ConfigConstants;
|
||||
import org.keycloak.broker.provider.HardcodedRoleMapper;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.common.Profile;
|
||||
import org.keycloak.crypto.Algorithm;
|
||||
import org.keycloak.events.Details;
|
||||
import org.keycloak.events.Errors;
|
||||
import org.keycloak.events.EventType;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.Constants;
|
||||
import org.keycloak.models.IdentityProviderMapperModel;
|
||||
import org.keycloak.models.IdentityProviderMapperSyncMode;
|
||||
@ -370,7 +370,7 @@ public final class KcOidcBrokerTransientSessionsTest extends AbstractAdvancedBro
|
||||
assertThat(errorPage.getError(), is("Page not found"));
|
||||
|
||||
try (CloseableHttpClient client = HttpClientBuilder.create().build()) {
|
||||
SimpleHttp.Response simple = SimpleHttpDefault.doGet(LINK, client).asResponse();
|
||||
SimpleHttpResponse simple = SimpleHttpDefault.doGet(LINK, client).asResponse();
|
||||
assertThat(simple, notNullValue());
|
||||
assertThat(simple.getStatus(), is(Response.Status.NOT_FOUND.getStatusCode()));
|
||||
|
||||
|
||||
@ -14,8 +14,8 @@ import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import org.keycloak.OAuthErrorException;
|
||||
import org.keycloak.admin.client.resource.RealmResource;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.common.util.StreamUtil;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.BrowserSecurityHeaders;
|
||||
import org.keycloak.representations.idm.OAuth2ErrorRepresentation;
|
||||
import org.keycloak.representations.idm.RealmRepresentation;
|
||||
@ -169,7 +169,7 @@ public class UncaughtErrorPageTest extends AbstractKeycloakTest {
|
||||
URI uri = suiteContext.getAuthServerInfo().getUriBuilder().path("/auth/realms/master/testing/uncaught-error").build();
|
||||
|
||||
try (CloseableHttpClient client = HttpClientBuilder.create().build()) {
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doGet(uri.toString(), client).header("Accept", MediaType.TEXT_HTML_UTF_8).asResponse();
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doGet(uri.toString(), client).header("Accept", MediaType.TEXT_HTML_UTF_8).asResponse();
|
||||
|
||||
for (BrowserSecurityHeaders header : BrowserSecurityHeaders.values()) {
|
||||
String expectedValue = header.getDefaultValue();
|
||||
|
||||
@ -33,9 +33,9 @@ import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runners.MethodSorters;
|
||||
import org.keycloak.admin.client.resource.UserProfileResource;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.common.util.MultivaluedHashMap;
|
||||
import org.keycloak.federation.kerberos.KerberosFederationProvider;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.LDAPConstants;
|
||||
import org.keycloak.models.RealmModel;
|
||||
import org.keycloak.models.credential.PasswordCredentialModel;
|
||||
@ -343,7 +343,7 @@ public class LDAPAccountRestApiTest extends AbstractLDAPTest {
|
||||
}
|
||||
|
||||
private void updateProfileExpectError(UserRepresentation user, int expectedStatus, String expectedMessage) throws IOException {
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doPost(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).json(user).asResponse();
|
||||
assertEquals(expectedStatus, response.getStatus());
|
||||
assertEquals(expectedMessage, response.asJson(ErrorRepresentation.class).getErrorMessage());
|
||||
}
|
||||
|
||||
@ -41,11 +41,11 @@ import org.keycloak.authentication.authenticators.browser.RecoveryAuthnCodesForm
|
||||
import org.keycloak.authentication.authenticators.browser.UsernamePasswordFormFactory;
|
||||
import org.keycloak.authentication.authenticators.conditional.ConditionalLoaAuthenticator;
|
||||
import org.keycloak.authentication.authenticators.conditional.ConditionalLoaAuthenticatorFactory;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.common.Profile;
|
||||
import org.keycloak.cookie.CookieType;
|
||||
import org.keycloak.events.Details;
|
||||
import org.keycloak.events.EventType;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.AuthenticationExecutionModel.Requirement;
|
||||
import org.keycloak.models.AuthenticationFlowBindings;
|
||||
import org.keycloak.models.Constants;
|
||||
@ -821,7 +821,7 @@ public class LevelOfAssuranceFlowTest extends AbstractChangeImportedUserPassword
|
||||
.accessToken(token1.accessToken)
|
||||
.build()) {
|
||||
otpCredentialId = accountRestClient.getCredentialByUserLabel("totp2-label").getId();
|
||||
try (SimpleHttp.Response response = accountRestClient.removeCredential(otpCredentialId)) {
|
||||
try (SimpleHttpResponse response = accountRestClient.removeCredential(otpCredentialId)) {
|
||||
Assert.assertEquals(403, response.getStatus());
|
||||
}
|
||||
}
|
||||
@ -832,7 +832,7 @@ public class LevelOfAssuranceFlowTest extends AbstractChangeImportedUserPassword
|
||||
.accessToken(token2.accessToken)
|
||||
.build()) {
|
||||
otpCredentialId = accountRestClient.getCredentialByUserLabel("totp2-label").getId();
|
||||
try (SimpleHttp.Response response = accountRestClient.removeCredential(otpCredentialId)) {
|
||||
try (SimpleHttpResponse response = accountRestClient.removeCredential(otpCredentialId)) {
|
||||
Assert.assertEquals(204, response.getStatus());
|
||||
}
|
||||
Assert.assertNull(accountRestClient.getCredentialByUserLabel("totp2-label"));
|
||||
|
||||
@ -47,7 +47,7 @@ import org.junit.Assert;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.keycloak.admin.client.resource.UserResource;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.UserModel;
|
||||
import org.keycloak.representations.idm.UserRepresentation;
|
||||
import org.keycloak.testsuite.admin.ApiUtil;
|
||||
@ -153,7 +153,7 @@ public class EmailTest extends AbstractI18NTest {
|
||||
try {
|
||||
UserResource testUser = ApiUtil.findUserByUsernameId(testRealm(), "login-test");
|
||||
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
|
||||
SimpleHttp.Response responseGet = SimpleHttpDefault.doPut(getAuthServerRoot() + "admin/realms/test/users/" + testUser.toRepresentation().getId() + "/execute-actions-email", httpClient)
|
||||
SimpleHttpResponse responseGet = SimpleHttpDefault.doPut(getAuthServerRoot() + "admin/realms/test/users/" + testUser.toRepresentation().getId() + "/execute-actions-email", httpClient)
|
||||
.auth(adminClient.tokenManager().getAccessTokenString())
|
||||
.header("Accept-Language", "de")
|
||||
.json(Arrays.asList(UserModel.RequiredAction.UPDATE_PASSWORD.toString()))
|
||||
|
||||
@ -32,9 +32,9 @@ import org.junit.Assert;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.keycloak.OAuth2Constants;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.common.util.Encode;
|
||||
import org.keycloak.common.util.KeycloakUriBuilder;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.models.Constants;
|
||||
import org.keycloak.representations.idm.RealmRepresentation;
|
||||
import org.keycloak.testsuite.AbstractKeycloakTest;
|
||||
@ -44,10 +44,10 @@ import org.keycloak.testsuite.pages.ErrorPage;
|
||||
import org.keycloak.testsuite.pages.LoginPage;
|
||||
import org.keycloak.testsuite.util.ClientBuilder;
|
||||
import org.keycloak.testsuite.util.ClientManager;
|
||||
import org.keycloak.testsuite.util.RealmBuilder;
|
||||
import org.keycloak.testsuite.util.oauth.AccessTokenResponse;
|
||||
import org.keycloak.testsuite.util.oauth.AuthorizationEndpointResponse;
|
||||
import org.keycloak.testsuite.util.oauth.OAuthClient;
|
||||
import org.keycloak.testsuite.util.RealmBuilder;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
@ -55,8 +55,8 @@ import java.net.InetSocketAddress;
|
||||
import java.net.URL;
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.keycloak.testsuite.AbstractAdminTest.loadJson;
|
||||
import static org.keycloak.testsuite.util.oauth.OAuthClient.APP_ROOT;
|
||||
|
||||
@ -307,7 +307,7 @@ public class OAuthRedirectUriTest extends AbstractKeycloakTest {
|
||||
String loginPage = SimpleHttpDefault.doGet(loginUrl, client).asString();
|
||||
|
||||
String formAction = loginPage.split("action=\"")[1].split("\"")[0].replaceAll("&", "&");
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doPost(formAction, client).param("username", "test-user@localhost").param("password", "password").asResponse();
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doPost(formAction, client).param("username", "test-user@localhost").param("password", "password").asResponse();
|
||||
|
||||
response.getStatus();
|
||||
assertThat(response.getFirstHeader("Location"), Matchers.startsWith("android-app://org.keycloak.examples.cordova/https/keycloak-cordova-example.github.io/login"));
|
||||
|
||||
@ -53,9 +53,9 @@ import org.keycloak.OAuthErrorException;
|
||||
import org.keycloak.admin.client.Keycloak;
|
||||
import org.keycloak.admin.client.resource.RealmResource;
|
||||
import org.keycloak.admin.client.resource.UserResource;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.events.Details;
|
||||
import org.keycloak.events.EventType;
|
||||
import org.keycloak.http.simple.SimpleHttpRequest;
|
||||
import org.keycloak.representations.idm.OAuth2ErrorRepresentation;
|
||||
import org.keycloak.representations.idm.RealmRepresentation;
|
||||
import org.keycloak.representations.idm.UserSessionRepresentation;
|
||||
@ -367,7 +367,7 @@ public class TokenRevocationTest extends AbstractKeycloakTest {
|
||||
|
||||
// Test account REST not possible
|
||||
String accountUrl = OAuthClient.AUTH_SERVER_ROOT + "/realms/test/account";
|
||||
SimpleHttp accountRequest = SimpleHttpDefault.doGet(accountUrl, restHttpClient)
|
||||
SimpleHttpRequest accountRequest = SimpleHttpDefault.doGet(accountUrl, restHttpClient)
|
||||
.auth(accessTokenString)
|
||||
.acceptJson();
|
||||
assertEquals(Status.UNAUTHORIZED.getStatusCode(), accountRequest.asStatus());
|
||||
|
||||
@ -31,10 +31,9 @@ import org.junit.Test;
|
||||
import org.junit.runners.MethodSorters;
|
||||
import org.keycloak.OAuth2Constants;
|
||||
import org.keycloak.admin.client.resource.RealmResource;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp;
|
||||
import org.keycloak.common.Profile;
|
||||
import org.keycloak.common.constants.ServiceAccountConstants;
|
||||
import org.keycloak.crypto.Algorithm;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.jose.jwe.JWEConstants;
|
||||
import org.keycloak.jose.jwk.JSONWebKeySet;
|
||||
import org.keycloak.models.Constants;
|
||||
@ -301,11 +300,11 @@ public abstract class AbstractWellKnownProviderTest extends AbstractKeycloakTest
|
||||
OIDCConfigurationRepresentation representation = SimpleHttpDefault.doGet(getAuthServerRoot().toString() + "realms/test/.well-known/openid-configuration", client).asJson(OIDCConfigurationRepresentation.class);
|
||||
String jwksUri = representation.getJwksUri();
|
||||
|
||||
SimpleHttp.Response response = SimpleHttpDefault.doGet(jwksUri, client).header(ACCEPT, APPLICATION_JWKS).asResponse();
|
||||
SimpleHttpResponse response = SimpleHttpDefault.doGet(jwksUri, client).header(ACCEPT, APPLICATION_JWKS).asResponse();
|
||||
assertEquals(APPLICATION_JWKS, response.getFirstHeader(CONTENT_TYPE));
|
||||
|
||||
// Test HEAD method works (Issue 41537)
|
||||
SimpleHttp.Response responseHead = SimpleHttpDefault.doHead(jwksUri, client).header(ACCEPT, APPLICATION_JWKS).asResponse();
|
||||
SimpleHttpResponse responseHead = SimpleHttpDefault.doHead(jwksUri, client).header(ACCEPT, APPLICATION_JWKS).asResponse();
|
||||
assertEquals(Response.Status.OK.getStatusCode(), responseHead.getStatus());
|
||||
assertEquals(APPLICATION_JWKS, responseHead.getFirstHeader(CONTENT_TYPE));
|
||||
}
|
||||
|
||||
@ -17,10 +17,6 @@
|
||||
|
||||
package org.keycloak.testsuite.organization.account;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.SortedSet;
|
||||
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import jakarta.ws.rs.core.Response.Status;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
@ -31,7 +27,7 @@ import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.keycloak.admin.client.resource.OrganizationResource;
|
||||
import org.keycloak.broker.provider.util.SimpleHttp.Response;
|
||||
import org.keycloak.http.simple.SimpleHttpResponse;
|
||||
import org.keycloak.representations.account.LinkedAccountRepresentation;
|
||||
import org.keycloak.representations.account.OrganizationRepresentation;
|
||||
import org.keycloak.representations.idm.ErrorRepresentation;
|
||||
@ -43,6 +39,10 @@ import org.keycloak.testsuite.organization.admin.AbstractOrganizationTest;
|
||||
import org.keycloak.testsuite.util.TokenUtil;
|
||||
import org.keycloak.testsuite.util.UserBuilder;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.SortedSet;
|
||||
|
||||
public class OrganizationAccountTest extends AbstractOrganizationTest {
|
||||
|
||||
@Rule
|
||||
@ -75,7 +75,7 @@ public class OrganizationAccountTest extends AbstractOrganizationTest {
|
||||
|
||||
LinkedAccountRepresentation link = findLinkedAccount(bc.getIDPAlias());
|
||||
Assert.assertNotNull(link);
|
||||
try (Response response = SimpleHttpDefault.doDelete(getAccountUrl("linked-accounts/" + link.getProviderAlias()), client).auth(tokenUtil.getToken()).acceptJson().asResponse()) {
|
||||
try (SimpleHttpResponse response = SimpleHttpDefault.doDelete(getAccountUrl("linked-accounts/" + link.getProviderAlias()), client).auth(tokenUtil.getToken()).acceptJson().asResponse()) {
|
||||
Assert.assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
|
||||
ErrorRepresentation error = response.asJson(ErrorRepresentation.class);
|
||||
Assert.assertEquals("You cannot remove the link to an identity provider associated with an organization.", error.getErrorMessage());
|
||||
@ -83,7 +83,7 @@ public class OrganizationAccountTest extends AbstractOrganizationTest {
|
||||
|
||||
// broker no longer linked to the organization
|
||||
organization.identityProviders().get(bc.getIDPAlias()).delete().close();
|
||||
try (Response response = SimpleHttpDefault.doDelete(getAccountUrl("linked-accounts/" + link.getProviderAlias()), client).auth(tokenUtil.getToken()).acceptJson().asResponse()) {
|
||||
try (SimpleHttpResponse response = SimpleHttpDefault.doDelete(getAccountUrl("linked-accounts/" + link.getProviderAlias()), client).auth(tokenUtil.getToken()).acceptJson().asResponse()) {
|
||||
Assert.assertEquals(Status.NO_CONTENT.getStatusCode(), response.getStatus());
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user