/**
* Copyright 2005-2014 Restlet
*
* The contents of this file are subject to the terms of one of the following
* open source licenses: Apache 2.0 or or EPL 1.0 (the "Licenses"). You can
* select the license that you prefer but you may not use this file except in
* compliance with one of these Licenses.
*
* You can obtain a copy of the Apache 2.0 license at
* http://www.opensource.org/licenses/apache-2.0
*
* You can obtain a copy of the EPL 1.0 license at
* http://www.opensource.org/licenses/eclipse-1.0
*
* See the Licenses for the specific language governing permissions and
* limitations under the Licenses.
*
* Alternatively, you can obtain a royalty free commercial license with less
* limitations, transferable or non-transferable, directly at
* http://restlet.com/products/restlet-framework
*
* Restlet is a registered trademark of Restlet S.A.S.
*/
package org.restlet.ext.openid.internal;
import org.restlet.Response;
import org.restlet.data.Header;
import org.restlet.data.MediaType;
import org.restlet.engine.header.HeaderConstants;
import org.restlet.ext.xml.DomRepresentation;
import org.restlet.util.Series;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* Describes an eXtensible Resource Descriptor Sequence (XRDS).
*
* @author Martin Svensson
*/
public class XRDS {
private static final String Type = "Type";
public static final String TYPE_RETURN_TO = "http://specs.openid.net/auth/2.0/return_to";
public static final String TYPE_SERVER = "http://specs.openid.net/auth/2.0/server";
public static final String TYPE_SIGNON = "http://specs.openid.net/auth/2.0/signon";
private static final String URI = "URI";
private static final String XRD = "XRD";
public static final MediaType XRDS = new MediaType("application/xrds+xml",
"XRDS Document");
private static Element createRootAndXrd(DomRepresentation dr)
throws Exception {
dr.setIndenting(true);
Document d = dr.getDocument();
Element root = d.createElement("xrds:XRDS");
root.setAttribute("xmlns:xrds", "xri://$xrds");
root.setAttribute("xmlns:openid", "http://openid.net/xmlns/1.0");
root.setAttribute("xmlns", "xri://$xrd*($v*2.0)");
d.appendChild(root);
Element xrd = d.createElement(XRD);
root.appendChild(xrd);
return xrd;
}
private static Element createService(Document d, Element parent,
int priority) {
Element service = d.createElement("Service");
service.setAttribute("priority", "" + priority);
parent.appendChild(service);
return service;
}
private static void insert(Document d, Element parent, String node,
String text) {
Element elem = d.createElement(node);
if (text != null)
elem.appendChild(d.createTextNode(text));
parent.appendChild(elem);
}
public static DomRepresentation returnToXrds(String returnTo)
throws Exception {
DomRepresentation dr = new DomRepresentation(XRDS);
Element xrd = createRootAndXrd(dr);
Element service = createService(dr.getDocument(), xrd, 0);
insert(dr.getDocument(), service, Type, TYPE_RETURN_TO);
insert(dr.getDocument(), service, URI, returnTo);
return dr;
}
public static DomRepresentation serverSignon(String serverURI)
throws Exception {
DomRepresentation dr = new DomRepresentation(XRDS);
Element xrd = createRootAndXrd(dr);
Element service = createService(dr.getDocument(), xrd, 0);
insert(dr.getDocument(), service, Type, TYPE_SIGNON);
insert(dr.getDocument(), service, URI, serverURI);
return dr;
}
public static DomRepresentation serverXrds(String serverURI, boolean ax)
throws Exception {
DomRepresentation dr = new DomRepresentation(XRDS);
Element xrd = createRootAndXrd(dr);
Element service = createService(dr.getDocument(), xrd, 0);
insert(dr.getDocument(), service, Type, TYPE_SERVER);
if (ax)
insert(dr.getDocument(), service, Type,
"http://openid.net/srv/ax/1.0");
insert(dr.getDocument(), service, URI, serverURI);
return dr;
}
public static void setXRDSHeader(Response resp, String xrdsLocation) {
@SuppressWarnings("unchecked")
Series<Header> headers = (Series<Header>) resp.getAttributes().get(
HeaderConstants.ATTRIBUTE_HEADERS);
if (headers == null) {
headers = new Series<Header>(Header.class);
resp.getAttributes()
.put(HeaderConstants.ATTRIBUTE_HEADERS, headers);
}
headers.add(new Header("X-XRDS-Location", xrdsLocation));
}
}