blob: e2f91ea5eff9237f754324a5a2e03479c1399f4d [file] [log] [blame]
package com.android.hotspot2.osu;
import com.android.hotspot2.omadm.MOTree;
import com.android.hotspot2.omadm.OMAConstants;
import com.android.hotspot2.omadm.XMLNode;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;
public class SOAPBuilder {
private static final String EnvelopeTag = "s12:Envelope";
private static final String BodyTag = "s12:Body";
private static final Map<String, String> sEnvelopeAttributes = new HashMap<>(2);
private static final Map<RequestReason, String> sRequestReasons =
new EnumMap<>(RequestReason.class);
static {
sEnvelopeAttributes.put("xmlns:s12", "http://www.w3.org/2003/05/soap-envelope");
sEnvelopeAttributes.put("xmlns:spp",
"http://www.wi-fi.org/specifications/hotspot2dot0/v1.0/spp");
sRequestReasons.put(RequestReason.SubRegistration, "Subscription registration");
sRequestReasons.put(RequestReason.SubProvisioning, "Subscription provisioning");
sRequestReasons.put(RequestReason.SubRemediation, "Subscription remediation");
sRequestReasons.put(RequestReason.InputComplete, "User input completed");
sRequestReasons.put(RequestReason.NoClientCert, "No acceptable client certificate");
sRequestReasons.put(RequestReason.CertEnrollmentComplete,
"Certificate enrollment completed");
sRequestReasons.put(RequestReason.CertEnrollmentFailed, "Certificate enrollment failed");
sRequestReasons.put(RequestReason.SubMetaDataUpdate, "Subscription metadata update");
sRequestReasons.put(RequestReason.PolicyUpdate, "Policy update");
sRequestReasons.put(RequestReason.NextCommand, "Retrieve next command");
sRequestReasons.put(RequestReason.MOUpload, "MO upload");
sRequestReasons.put(RequestReason.Unspecified, "Unspecified");
}
public static String buildPostDevDataResponse(RequestReason reason, String sessionID,
String redirURI, MOTree... mos) {
XMLNode envelope = buildEnvelope();
buildSppPostDevData(envelope.getChildren().get(0), sessionID, reason, redirURI, mos);
return envelope.toString();
}
public static String buildUpdateResponse(String sessionID, OSUError error) {
XMLNode envelope = buildEnvelope();
buildSppUpdateResponse(envelope.getChildren().get(0), sessionID, error);
return envelope.toString();
}
private static XMLNode buildEnvelope() {
XMLNode envelope = new XMLNode(null, EnvelopeTag, sEnvelopeAttributes);
envelope.addChild(new XMLNode(envelope, BodyTag, (Map<String, String>) null));
return envelope;
}
private static XMLNode buildSppPostDevData(XMLNode parent, String sessionID,
RequestReason reason, String redirURI,
MOTree... mos) {
Map<String, String> pddAttributes = new HashMap<>();
pddAttributes.put(OMAConstants.TAG_Version, OMAConstants.MOVersion);
pddAttributes.put("requestReason", sRequestReasons.get(reason));
if (sessionID != null) {
pddAttributes.put(OMAConstants.TAG_SessionID, sessionID);
}
if (redirURI != null) {
pddAttributes.put("redirectURI", redirURI);
}
XMLNode pddNode = new XMLNode(parent, OMAConstants.TAG_PostDevData, pddAttributes);
XMLNode vNode = new XMLNode(pddNode, OMAConstants.TAG_SupportedVersions,
(HashMap<String, String>) null);
vNode.setText("1.0");
pddNode.addChild(vNode);
XMLNode moNode = new XMLNode(pddNode, OMAConstants.TAG_SupportedMOs,
(HashMap<String, String>) null);
StringBuilder sb = new StringBuilder();
boolean first = true;
for (String urn : OMAConstants.SupportedMO_URNs) {
if (first) {
first = false;
} else {
sb.append(' ');
}
sb.append(urn);
}
moNode.setText(sb.toString());
pddNode.addChild(moNode);
if (mos != null) {
for (MOTree moTree : mos) {
Map<String, String> map = null;
if (moTree.getUrn() != null) {
map = new HashMap<>(1);
map.put(OMAConstants.SppMOAttribute, moTree.getUrn());
}
moNode = new XMLNode(pddNode, OMAConstants.TAG_MOContainer, map);
moNode.setText(moTree.toXml());
pddNode.addChild(moNode);
}
}
parent.addChild(pddNode);
return pddNode;
}
private static XMLNode buildSppUpdateResponse(XMLNode parent, String sessionID,
OSUError error) {
Map<String, String> urAttributes = new HashMap<>();
urAttributes.put(OMAConstants.TAG_Version, OMAConstants.MOVersion);
if (sessionID != null) {
urAttributes.put(OMAConstants.TAG_SessionID, sessionID);
}
if (error == null) {
urAttributes.put(OMAConstants.TAG_Status, OMAConstants.mapStatus(OSUStatus.OK));
} else {
urAttributes.put(OMAConstants.TAG_Status, OMAConstants.mapStatus(OSUStatus.Error));
}
XMLNode urNode = new XMLNode(parent, OMAConstants.TAG_UpdateResponse, urAttributes);
if (error != null) {
Map<String, String> errorAttributes = new HashMap<>();
errorAttributes.put("errorCode", OMAConstants.mapError(error));
XMLNode errorNode = new XMLNode(urNode, OMAConstants.TAG_Error, errorAttributes);
urNode.addChild(errorNode);
}
parent.addChild(urNode);
return urNode;
}
/*
<xsd:element name="sppUpdateResponse">
<xsd:annotation>
<xsd:documentation>SOAP method used by SPP client to confirm installation of MO addition or update.</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="sppError" minOccurs="0"/>
<xsd:any namespace="##other" maxOccurs="unbounded" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute ref="sppVersion" use="required"/>
<xsd:attribute ref="sppStatus" use="required"/>
<xsd:attribute ref="sessionID" use="required"/>
<xsd:anyAttribute namespace="##other"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="sppError">
<xsd:annotation>
<xsd:documentation>Error response.</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:attribute name="errorCode" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="SPP version not supported"/>
<xsd:enumeration value="One or more mandatory MOs not supported"/>
<xsd:enumeration value="Credentials cannot be provisioned at this time"/>
<xsd:enumeration value="Remediation cannot be completed at this time"/>
<xsd:enumeration value="Provisioning cannot be completed at this time"/>
<xsd:enumeration value="Continue to use existing certificate"/>
<xsd:enumeration value="Cookie invalid"/>
<xsd:enumeration value="No corresponding web-browser-connection Session ID"/>
<xsd:enumeration value="Permission denied"/>
<xsd:enumeration value="Command failed"/>
<xsd:enumeration value="MO addition or update failed"/>
<xsd:enumeration value="Device full"/>
<xsd:enumeration value="Bad management tree URI"/>
<xsd:enumeration value="Requested entity too large"/>
<xsd:enumeration value="Command not allowed"/>
<xsd:enumeration value="Command not executed due to user"/>
<xsd:enumeration value="Not found"/>
<xsd:enumeration value="Other"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<xsd:anyAttribute namespace="##other"/>
</xsd:complexType>
</xsd:element>
*/
}