/* * oxAuth is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text. * * Copyright (c) 2014, Gluu */ package org.xdi.oxauth.client; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import org.jboss.resteasy.client.ClientExecutor; import org.jboss.resteasy.client.ClientRequest; import org.xdi.oxauth.model.register.ApplicationType; import javax.ws.rs.HttpMethod; import javax.ws.rs.core.MediaType; import java.util.List; import java.util.Map; import static org.xdi.oxauth.model.register.RegisterRequestParam.*; /** * Encapsulates functionality to make Register request calls to an authorization server via REST Services. * * @author Javier Rojas Blum * @author Yuriy Zabrovarnyy * @author Yuriy Movchan * @version February 5, 2016 */ public class RegisterClient extends BaseClient<RegisterRequest, RegisterResponse> { private static final Logger LOG = Logger.getLogger(RegisterClient.class); /** * Construct a register client by providing an URL where the REST service is located. * * @param url The REST service location. */ public RegisterClient(String url) { super(url); } @Override public String getHttpMethod() { if (getRequest() != null) { if (StringUtils.isNotBlank(getRequest().getHttpMethod())) { return getRequest().getHttpMethod(); } if (getRequest().getRegistrationAccessToken() != null) { return HttpMethod.GET; } } return HttpMethod.POST; } /** * Executes the call to the REST service requesting to register and process the response. * * @param applicationType The application type. * @param clientName The client name. * @param redirectUri A list of space-delimited redirection URIs. * @return The service response. */ public RegisterResponse execRegister(ApplicationType applicationType, String clientName, List<String> redirectUri) { setRequest(new RegisterRequest(applicationType, clientName, redirectUri)); return exec(); } public RegisterResponse exec() { initClientRequest(); return _exec(); } @Deprecated public RegisterResponse exec(ClientExecutor clientExecutor) { this.clientRequest = new ClientRequest(getUrl(), clientExecutor); return _exec(); } private RegisterResponse _exec() { try { // Prepare request parameters clientRequest.setHttpMethod(getHttpMethod()); // POST - Client Register, PUT - update client if (getHttpMethod().equals(HttpMethod.POST) || getHttpMethod().equals(HttpMethod.PUT)) { clientRequest.header("Content-Type", getRequest().getContentType()); clientRequest.accept(getRequest().getMediaType()); JSONObject requestBody = new JSONObject(); if (StringUtils.isNotBlank(getRequest().getRegistrationAccessToken())) { clientRequest.header("Authorization", "Bearer " + getRequest().getRegistrationAccessToken()); } if (getRequest().getRedirectUris() != null && !getRequest().getRedirectUris().isEmpty()) { requestBody.put(REDIRECT_URIS.toString(), new JSONArray(getRequest().getRedirectUris())); } if (getRequest().getResponseTypes() != null && !getRequest().getResponseTypes().isEmpty()) { requestBody.put(RESPONSE_TYPES.toString(), new JSONArray(getRequest().getResponseTypes())); } if (getRequest().getGrantTypes() != null && !getRequest().getGrantTypes().isEmpty()) { requestBody.put(GRANT_TYPES.toString(), new JSONArray(getRequest().getGrantTypes())); } if (getRequest().getApplicationType() != null) { requestBody.put(APPLICATION_TYPE.toString(), getRequest().getApplicationType()); } if (getRequest().getContacts() != null && !getRequest().getContacts().isEmpty()) { requestBody.put(CONTACTS.toString(), new JSONArray(getRequest().getContacts())); } if (StringUtils.isNotBlank(getRequest().getClientName())) { requestBody.put(CLIENT_NAME.toString(), getRequest().getClientName()); } if (StringUtils.isNotBlank(getRequest().getLogoUri())) { requestBody.put(LOGO_URI.toString(), getRequest().getLogoUri()); } if (StringUtils.isNotBlank(getRequest().getClientUri())) { requestBody.put(CLIENT_URI.toString(), getRequest().getClientUri()); } if (StringUtils.isNotBlank(getRequest().getPolicyUri())) { requestBody.put(POLICY_URI.toString(), getRequest().getPolicyUri()); } if (StringUtils.isNotBlank(getRequest().getTosUri())) { requestBody.put(TOS_URI.toString(), getRequest().getTosUri()); } if (StringUtils.isNotBlank(getRequest().getJwksUri())) { requestBody.put(JWKS_URI.toString(), getRequest().getJwksUri()); } if (StringUtils.isNotBlank(getRequest().getJwks())) { requestBody.put(JWKS.toString(), getRequest().getJwks()); } if (StringUtils.isNotBlank(getRequest().getSectorIdentifierUri())) { requestBody.put(SECTOR_IDENTIFIER_URI.toString(), getRequest().getSectorIdentifierUri()); } if (getRequest().getSubjectType() != null) { requestBody.put(SUBJECT_TYPE.toString(), getRequest().getSubjectType()); } if (getRequest().getIdTokenSignedResponseAlg() != null) { requestBody.put(ID_TOKEN_SIGNED_RESPONSE_ALG.toString(), getRequest().getIdTokenSignedResponseAlg().getName()); } if (getRequest().getIdTokenEncryptedResponseAlg() != null) { requestBody.put(ID_TOKEN_ENCRYPTED_RESPONSE_ALG.toString(), getRequest().getIdTokenEncryptedResponseAlg().getName()); } if (getRequest().getIdTokenEncryptedResponseEnc() != null) { requestBody.put(ID_TOKEN_ENCRYPTED_RESPONSE_ENC.toString(), getRequest().getIdTokenEncryptedResponseEnc().getName()); } if (getRequest().getUserInfoSignedResponseAlg() != null) { requestBody.put(USERINFO_SIGNED_RESPONSE_ALG.toString(), getRequest().getUserInfoSignedResponseAlg().getName()); } if (getRequest().getUserInfoEncryptedResponseAlg() != null) { requestBody.put(USERINFO_ENCRYPTED_RESPONSE_ALG.toString(), getRequest().getUserInfoEncryptedResponseAlg().getName()); } if (getRequest().getUserInfoEncryptedResponseEnc() != null) { requestBody.put(USERINFO_ENCRYPTED_RESPONSE_ENC.toString(), getRequest().getUserInfoEncryptedResponseEnc().getName()); } if (getRequest().getRequestObjectSigningAlg() != null) { requestBody.put(REQUEST_OBJECT_SIGNING_ALG.toString(), getRequest().getRequestObjectSigningAlg().getName()); } if (getRequest().getRequestObjectEncryptionAlg() != null) { requestBody.put(REQUEST_OBJECT_ENCRYPTION_ALG.toString(), getRequest().getRequestObjectEncryptionAlg().getName()); } if (getRequest().getRequestObjectEncryptionEnc() != null) { requestBody.put(REQUEST_OBJECT_ENCRYPTION_ENC.toString(), getRequest().getRequestObjectEncryptionEnc().getName()); } if (getRequest().getTokenEndpointAuthMethod() != null) { requestBody.put(TOKEN_ENDPOINT_AUTH_METHOD.toString(), getRequest().getTokenEndpointAuthMethod()); } if (getRequest().getTokenEndpointAuthSigningAlg() != null) { requestBody.put(TOKEN_ENDPOINT_AUTH_SIGNING_ALG.toString(), getRequest().getTokenEndpointAuthSigningAlg()); } if (getRequest().getDefaultMaxAge() != null) { requestBody.put(DEFAULT_MAX_AGE.toString(), getRequest().getDefaultMaxAge()); } if (getRequest().getRequireAuthTime() != null) { requestBody.put(REQUIRE_AUTH_TIME.toString(), getRequest().getRequireAuthTime()); } if (getRequest().getDefaultAcrValues() != null && !getRequest().getDefaultAcrValues().isEmpty()) { requestBody.put(DEFAULT_ACR_VALUES.toString(), getRequest().getDefaultAcrValues()); } if (StringUtils.isNotBlank(getRequest().getInitiateLoginUri())) { requestBody.put(INITIATE_LOGIN_URI.toString(), getRequest().getInitiateLoginUri()); } if (getRequest().getPostLogoutRedirectUris() != null && !getRequest().getPostLogoutRedirectUris().isEmpty()) { requestBody.put(POST_LOGOUT_REDIRECT_URIS.toString(), getRequest().getPostLogoutRedirectUris()); } if (getRequest().getFrontChannelLogoutUris() != null && !getRequest().getFrontChannelLogoutUris().isEmpty()) { requestBody.put(FRONT_CHANNEL_LOGOUT_URI.getName(), getRequest().getFrontChannelLogoutUris()); } if (getRequest().getClientSecretExpiresAt() != null) { requestBody.put(CLIENT_SECRET_EXPIRES_AT_.toString(), getRequest().getClientSecretExpiresAt().getTime()); } if (getRequest().getFrontChannelLogoutSessionRequired() != null) { requestBody.put(FRONT_CHANNEL_LOGOUT_SESSION_REQUIRED.getName(), getRequest().getFrontChannelLogoutSessionRequired()); } if (getRequest().getRequestUris() != null && !getRequest().getRequestUris().isEmpty()) { requestBody.put(REQUEST_URIS.toString(), new JSONArray(getRequest().getRequestUris())); } if (getRequest().getScopes() != null && !getRequest().getScopes().isEmpty()) { requestBody.put(SCOPES.toString(), new JSONArray(getRequest().getScopes())); } // Custom params final Map<String, String> customAttributes = getRequest().getCustomAttributes(); if (customAttributes != null && !customAttributes.isEmpty()) { for (Map.Entry<String, String> entry : customAttributes.entrySet()) { final String name = entry.getKey(); final String value = entry.getValue(); if (StringUtils.isNotBlank(name) && StringUtils.isNotBlank(value)) { requestBody.put(name, value); } } } clientRequest.body(MediaType.APPLICATION_JSON, requestBody.toString(4)); } else { // GET, Client Read clientRequest.accept(MediaType.APPLICATION_JSON); if (StringUtils.isNotBlank(getRequest().getRegistrationAccessToken())) { clientRequest.header("Authorization", "Bearer " + getRequest().getRegistrationAccessToken()); } } // Call REST Service and handle response if (getHttpMethod().equals(HttpMethod.POST)) { clientResponse = clientRequest.post(String.class); } else if (getHttpMethod().equals(HttpMethod.PUT)) { clientResponse = clientRequest.put(String.class); } else { // GET clientResponse = clientRequest.get(String.class); } setResponse(new RegisterResponse(clientResponse)); } catch (JSONException e) { LOG.error(e.getMessage(), e); } catch (Exception e) { LOG.error(e.getMessage(), e); } finally { closeConnection(); } return getResponse(); } }