/* * 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 static org.xdi.oxauth.model.discovery.WebFingerParam.REL; import static org.xdi.oxauth.model.discovery.WebFingerParam.REL_VALUE; import static org.xdi.oxauth.model.discovery.WebFingerParam.RESOURCE; import static org.xdi.oxauth.model.util.StringUtils.addQueryStringParam; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; import org.apache.commons.lang.StringUtils; /** * @author Javier Rojas Blum Date: 01.28.2013 */ public class OpenIdConnectDiscoveryRequest extends BaseRequest { private String resource; private String host; private String path; public OpenIdConnectDiscoveryRequest(String resource) throws URISyntaxException { this.resource = resource; if (StringUtils.isBlank(resource)) { throw new IllegalArgumentException("Resource cannot be null"); } if (resource.startsWith("=") || resource.startsWith("@") || resource.startsWith("!")) { // XRI throw new UnsupportedOperationException("XRI is not supported"); // TODO: Add support for XRI } else if (resource.contains("@")) { // email this.host = resource.substring(resource.indexOf("@") + 1); } else { if (!resource.contains("://")) { // If the user input Identifier does not have an RFC 3986 "scheme" portion, // the string is interpreted as authority path-abempty [ "?" query ] [ "#" fragment ] of RFC 3986. // In this case, the https scheme is assumed, and the normalized URL will be formed by prefixing // https:// to the string. resource = "https://" + resource; } URI uri = new URI(resource); this.host = uri.getHost(); if (uri.getPort() != -1) { this.host += ":" + uri.getPort(); } if (StringUtils.isNotBlank(uri.getPath()) && !uri.getPath().equals(uri.getHost()) && !uri.getPath().equals("/")) { this.path = uri.getPath(); } } } /** * Returns the Identifier of the target End-User that is the subject of the discovery request. * * @return The Identifier of the target End-User that is the subject of the discovery request. */ public String getResource() { return resource; } /** * Sets the Identifier of the target End-User that is the subject of the discovery request. * * @param resource The Identifier of the target End-User that is the subject of the discovery request. */ public void setResource(String resource) { this.resource = resource; } /** * Returns the Server where a WebFinger service is hosted. * * @return The Server where a WebFinger service is hosted. */ public String getHost() { return host; } /** * Sets the Server where a WebFinger service is hosted. * * @param host The Server where a WebFinger service is hosted. */ public void setHost(String host) { this.host = host; } /** * If the Issuer value contains a path component, any terminating / must be removed before * appending /.well-known/openid-configuration. Then the Client may make a new request using the path. * * @return The path component. */ public String getPath() { return path; } /** * Sets the path component. * * @param path The path component. */ public void setPath(String path) { this.path = path; } /** * Returns a query string with the parameters of the OpenID Connect Discovery request. * Any <code>null</code> or empty parameter will be omitted. * * @return A query string of parameters. */ @Override public String getQueryString() { StringBuilder queryStringBuilder = new StringBuilder(); try { addQueryStringParam(queryStringBuilder, RESOURCE, resource); addQueryStringParam(queryStringBuilder, REL, REL_VALUE); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return queryStringBuilder.toString(); } }