blob: 01cec0a7df386628fca86c45bdb13d1130d01d57 [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* 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 com.android.server.wifi.hotspot2.soap;
import android.util.SparseArray;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
* Constant definitions for SPP (Subscription Provisioning Protocol).
*/
public class SppConstants {
// Supported SPP Version.
public static final String SUPPORTED_SPP_VERSION = "1.0";
// Supported Management Objects as required by SPP Version 1.0.
public static final List<String> SUPPORTED_MO_LIST = Arrays.asList(
"urn:wfa:mo:hotspot2dot0-perprovidersubscription:1.0", // Hotspot 2.0 PPS MO tree
"urn:wfa:mo-ext:hotspot2dot0-devdetail-ext:1.0", // Hotspot 2.0 DevDetail extension
"urn:oma:mo:oma-dm-devinfo:1.0", // OMA-DM DevInfo
"urn:oma:mo:oma-dm-devdetail:1.0"); // OMA-DM DevDetail
// Method names.
public static final String METHOD_POST_DEV_DATA = "sppPostDevData";
public static final String METHOD_UPDATE_RESPONSE = "sppUpdateResponse";
// SOAP properties.
public static final String PROPERTY_SUPPORTED_SPP_VERSIONS = "supportedSPPVersions";
public static final String PROPERTY_SUPPORTED_MO_LIST = "supportedMOList";
public static final String PROPERTY_MO_CONTAINER = "moContainer";
public static final String PROPERTY_SPP_ERROR = "sppError";
// SOAP attributes.
public static final String ATTRIBUTE_SPP_VERSION = "sppVersion";
public static final String ATTRIBUTE_SPP_STATUS = "sppStatus";
public static final String ATTRIBUTE_REQUEST_REASON = "requestReason";
public static final String ATTRIBUTE_SESSION_ID = "sessionID";
public static final String ATTRIBUTE_REDIRECT_URI = "redirectURI";
public static final String ATTRIBUTE_MO_URN = "moURN";
public static final String ATTRIBUTE_ERROR_CODE = "errorCode";
public static final int INVALID_SPP_CONSTANT = -1;
private static final SparseArray<String> sStatusStrings = new SparseArray<>();
private static final Map<String, Integer> sStatusEnums = new HashMap<>();
static {
sStatusStrings.put(SppStatus.OK, "OK");
sStatusStrings.put(SppStatus.PROV_COMPLETE,
"Provisioning complete, request sppUpdateResponse");
sStatusStrings.put(SppStatus.REMEDIATION_COMPLETE,
"Remediation complete, request sppUpdateResponse");
sStatusStrings.put(SppStatus.UPDATE_COMPLETE, "Update complete, request sppUpdateResponse");
sStatusStrings.put(SppStatus.EXCHANGE_COMPLETE,
"Exchange complete, release TLS connection");
sStatusStrings.put(SppStatus.UNKOWN, "No update available at this time");
sStatusStrings.put(SppStatus.ERROR, "Error occurred");
for (int i = 0; i < sStatusStrings.size(); i++) {
sStatusEnums.put(sStatusStrings.valueAt(i).toLowerCase(), sStatusStrings.keyAt(i));
}
}
private static final SparseArray<String> sErrorStrings = new SparseArray<>();
private static final Map<String, Integer> sErrorEnums = new HashMap<>();
static {
sErrorStrings.put(SppError.VERSION_NOT_SUPPORTED, "SPP version not supported");
sErrorStrings.put(SppError.MOS_NOT_SUPPORTED, "One or more mandatory MOs not supported");
sErrorStrings.put(SppError.CREDENTIALS_FAILURE,
"Credentials cannot be provisioned at this time");
sErrorStrings.put(SppError.REMEDIATION_FAILURE,
"Remediation cannot be completed at this time");
sErrorStrings.put(SppError.PROVISIONING_FAILED,
"Provisioning cannot be completed at this time");
sErrorStrings.put(SppError.EXISITING_CERTIFICATE, "Continue to use existing certificate");
sErrorStrings.put(SppError.COOKIE_INVALID, "Cookie invalid");
sErrorStrings.put(SppError.WEB_SESSION_ID,
"No corresponding web-browser-connection Session ID");
sErrorStrings.put(SppError.PERMISSION_DENITED, "Permission denied");
sErrorStrings.put(SppError.COMMAND_FAILED, "Command failed");
sErrorStrings.put(SppError.MO_ADD_OR_UPDATE_FAILED, "MO addition or update failed");
sErrorStrings.put(SppError.DEVICE_FULL, "Device full");
sErrorStrings.put(SppError.BAD_TREE_URI, "Bad management tree URI");
sErrorStrings.put(SppError.TOO_LARGE, "Requested entity too large");
sErrorStrings.put(SppError.COMMAND_NOT_ALLOWED, "Command not allowed");
sErrorStrings.put(SppError.USER_ABORTED, "Command not executed due to user");
sErrorStrings.put(SppError.NOT_FOUND, "Not found");
sErrorStrings.put(SppError.OTHER, "Other");
for (int i = 0; i < sErrorStrings.size(); i++) {
sErrorEnums.put(sErrorStrings.valueAt(i).toLowerCase(), sErrorStrings.keyAt(i));
}
}
/**
* Convert the {@link SppStatus} to <code>String</code>
*
* @param status value of {@link SppStatus}
* @return string of the status
*/
public static String mapStatusIntToString(int status) {
return sStatusStrings.get(status);
}
/**
* Convert the status string to {@link SppStatus}
*
* @param status string of the status
* @return <code>int</code> value of {@link SppStatus} if found; {@link #INVALID_SPP_CONSTANT}
* otherwise.
*/
public static int mapStatusStringToInt(String status) {
Integer value = sStatusEnums.get(status.toLowerCase(Locale.US));
return (value == null) ? INVALID_SPP_CONSTANT : value;
}
/**
* Convert the {@link SppError} to <code>String</code>
*
* @param error value of {@link SppError}
* @return string of error
*/
public static String mapErrorIntToString(int error) {
return sErrorStrings.get(error);
}
/**
* Convert the error string to {@link SppError}
*
* @param error string of the error
* @return <code>int</code> value of {@link SppError} if found; {@link #INVALID_SPP_CONSTANT}
* otherwise.
*/
public static int mapErrorStringToInt(String error) {
Integer value = sErrorEnums.get(error.toLowerCase());
return (value == null) ? INVALID_SPP_CONSTANT : value;
}
// Request reasons for sppPostDevData requests.
// Refer to Table 13(sppPostDevData Elements and Attributes Descriptions)
// in Hotspot2.0 R2 Technical specification.
public class SppReason {
public static final String SUBSCRIPTION_REGISTRATION =
"Subscription registration";
public static final String SUBSCRIPTION_PROVISIONING =
"Subscription provisioning";
public static final String SUBSCRIPTION_REMEDIATION =
"Subscription remediation";
public static final String USER_INPUT_COMPLETED = "User input completed";
public static final String NO_ACCEPTABLE_CLIENT_CERTIFICATE =
"No acceptable client certificate";
public static final String CERTIFICATE_ENROLLMENT_COMPLETED =
"Certificate enrollment completed";
public static final String CERTIFICATE_ENROLLMENT_FAILED =
"Certificate enrollment failed";
public static final String SUBSCRIPTION_METADATA_UPDATE =
"Subscription metadata update";
public static final String POLICY_UPDATE = "Policy update";
public static final String MO_UPLOAD = "MO upload";
public static final String RETRIEVE_NEXT_COMMAND = "Retrieve next command";
public static final String UNSPECIFIED = "Unspecified";
}
/**
* enumeration values for the status defined by SPP (Subscription Provisioning Protocol).
*
* @see <a href=https://www.wi-fi.org/specifications/hotspot2dot0/v1.0/spp/spp-v1.0.xsd>SPP
* protocol 1.0</a>
*/
public class SppStatus {
public static final int OK = 0;
public static final int PROV_COMPLETE = 1;
public static final int REMEDIATION_COMPLETE = 2;
public static final int UPDATE_COMPLETE = 3;
public static final int EXCHANGE_COMPLETE = 4;
public static final int UNKOWN = 5;
public static final int ERROR = 6;
}
/**
* Enumeration values for the errors defined by SPP (Subscription Provisioning Protocol).
*
* @see <a href=https://www.wi-fi.org/specifications/hotspot2dot0/v1.0/spp/spp-v1.0.xsd>SPP
* protocol 1.0</a>
*/
public class SppError {
public static final int VERSION_NOT_SUPPORTED = 0;
public static final int MOS_NOT_SUPPORTED = 1;
public static final int CREDENTIALS_FAILURE = 2;
public static final int REMEDIATION_FAILURE = 3;
public static final int PROVISIONING_FAILED = 4;
public static final int EXISITING_CERTIFICATE = 5;
public static final int COOKIE_INVALID = 6;
public static final int WEB_SESSION_ID = 7;
public static final int PERMISSION_DENITED = 8;
public static final int COMMAND_FAILED = 9;
public static final int MO_ADD_OR_UPDATE_FAILED = 10;
public static final int DEVICE_FULL = 11;
public static final int BAD_TREE_URI = 12;
public static final int TOO_LARGE = 13;
public static final int COMMAND_NOT_ALLOWED = 14;
public static final int USER_ABORTED = 15;
public static final int NOT_FOUND = 16;
public static final int OTHER = 17;
}
}