content: /*
   * 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;
      }
  }