12591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe/* 22591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Copyright (C) 2010, The Android Open Source Project 32591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * 42591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Licensed under the Apache License, Version 2.0 (the "License"); 52591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * you may not use this file except in compliance with the License. 62591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * You may obtain a copy of the License at 72591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * 82591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * http://www.apache.org/licenses/LICENSE-2.0 92591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * 102591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Unless required by applicable law or agreed to in writing, software 112591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * distributed under the License is distributed on an "AS IS" BASIS, 122591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * See the License for the specific language governing permissions and 142591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * limitations under the License. 152591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe */ 162591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 172591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowepackage com.android.connectivitymanagertest; 182591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 192591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport android.net.IpConfiguration.IpAssignment; 202591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport android.net.IpConfiguration.ProxySettings; 212591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport android.net.LinkAddress; 222591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport android.net.StaticIpConfiguration; 232591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport android.net.wifi.WifiConfiguration; 242591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport android.net.wifi.WifiConfiguration.AuthAlgorithm; 252591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport android.net.wifi.WifiConfiguration.KeyMgmt; 262591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport android.net.wifi.WifiEnterpriseConfig; 272591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 282591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport org.json.JSONArray; 292591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport org.json.JSONException; 302591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport org.json.JSONObject; 312591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 322591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport java.net.InetAddress; 332591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport java.net.UnknownHostException; 342591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport java.util.ArrayList; 352591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Roweimport java.util.List; 362591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 372591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe/** 382591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Helper for dealing with creating {@link WifiConfiguration} objects. 392591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe */ 402591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowepublic class WifiConfigurationHelper { 412591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe private static final int NONE = 0; 422591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe private static final int WEP = 1; 432591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe private static final int PSK = 2; 442591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe private static final int EAP = 3; 452591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 462591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe /** 472591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Private constructor since this a static class. 482591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe */ 492591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe private WifiConfigurationHelper() {} 502591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 512591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe /** 522591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Create a {@link WifiConfiguration} for an open network 532591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * 542591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @param ssid The SSID of the wifi network 552591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @return The {@link WifiConfiguration} 562591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe */ 572591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe public static WifiConfiguration createOpenConfig(String ssid) { 582591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe WifiConfiguration config = createGenericConfig(ssid); 592591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 602591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.allowedKeyManagement.set(KeyMgmt.NONE); 612591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return config; 622591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 632591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 642591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe /** 652591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Create a {@link WifiConfiguration} for a WEP secured network 662591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * 672591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @param ssid The SSID of the wifi network 682591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @param password Either a 10, 26, or 58 character hex string or the plain text password 692591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @return The {@link WifiConfiguration} 702591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe */ 712591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe public static WifiConfiguration createWepConfig(String ssid, String password) { 722591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe WifiConfiguration config = createGenericConfig(ssid); 732591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 742591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if (isHex(password, 10) || isHex(password, 26) || isHex(password, 58)) { 752591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.wepKeys[0] = password; 762591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } else { 772591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.wepKeys[0] = quotedString(password); 782591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 792591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 802591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.allowedKeyManagement.set(KeyMgmt.NONE); 812591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 822591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED); 832591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return config; 842591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 852591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 862591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe /** 872591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Create a {@link WifiConfiguration} for a PSK secured network 882591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * 892591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @param ssid The SSID of the wifi network 902591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @param password Either a 64 character hex string or the plain text password 912591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @return The {@link WifiConfiguration} 922591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe */ 932591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe public static WifiConfiguration createPskConfig(String ssid, String password) { 942591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe WifiConfiguration config = createGenericConfig(ssid); 952591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 962591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if (isHex(password, 64)) { 972591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.preSharedKey = password; 982591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } else { 992591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.preSharedKey = quotedString(password); 1002591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 1012591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.allowedKeyManagement.set(KeyMgmt.WPA_PSK); 1022591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return config; 1032591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 1042591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 1052591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe /** 1062591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Create a {@link WifiConfiguration} for an EAP secured network 1072591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * 1082591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @param ssid The SSID of the wifi network 1092591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @param password The password 1102591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @param eapMethod The EAP method 1112591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @param phase2 The phase 2 method or null 1122591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @param identity The identity or null 1132591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @param anonymousIdentity The anonymous identity or null 1142591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @param caCert The CA certificate or null 1152591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @param clientCert The client certificate or null 1162591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @return The {@link WifiConfiguration} 1172591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe */ 1182591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe public static WifiConfiguration createEapConfig(String ssid, String password, int eapMethod, 1192591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe Integer phase2, String identity, String anonymousIdentity, String caCert, 1202591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe String clientCert) { 1212591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe WifiConfiguration config = new WifiConfiguration(); 1222591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.SSID = quotedString(ssid); 1232591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 1242591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.allowedKeyManagement.set(KeyMgmt.WPA_EAP); 1252591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.allowedKeyManagement.set(KeyMgmt.IEEE8021X); 1262591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 1272591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe // Set defaults 1282591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if (phase2 == null) phase2 = WifiEnterpriseConfig.Phase2.NONE; 1292591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if (identity == null) identity = ""; 1302591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if (anonymousIdentity == null) anonymousIdentity = ""; 1312591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if (caCert == null) caCert = ""; 1322591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if (clientCert == null) clientCert = ""; 1332591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 1342591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.enterpriseConfig.setPassword(password); 1352591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.enterpriseConfig.setEapMethod(eapMethod); 1362591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.enterpriseConfig.setPhase2Method(phase2); 1372591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.enterpriseConfig.setIdentity(identity); 1382591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.enterpriseConfig.setAnonymousIdentity(anonymousIdentity); 1392591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.enterpriseConfig.setCaCertificateAlias(caCert); 1402591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.enterpriseConfig.setClientCertificateAlias(clientCert); 1412591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return config; 1422591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 1432591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 1442591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe /** 1452591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Create a generic {@link WifiConfiguration} used by the other create methods. 1462591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe */ 1472591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe private static WifiConfiguration createGenericConfig(String ssid) { 1482591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe WifiConfiguration config = new WifiConfiguration(); 1492591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.SSID = quotedString(ssid); 1502591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.setIpAssignment(IpAssignment.DHCP); 1512591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.setProxySettings(ProxySettings.NONE); 1522591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return config; 1532591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 1542591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 1552591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe /** 1562591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Parse a JSON string for WiFi configurations stored as a JSON string. 1572591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * <p> 1582591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * This json string should be a list of dictionaries, with each dictionary containing a single 1592591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * wifi configuration. The wifi configuration requires the fields "ssid" and "security" with 1602591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * security being one of NONE, WEP, PSK, or EAP. If WEP, PSK, or EAP are selected, the field 1612591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * "password" must also be provided. If EAP is selected, then the fiels "eap", "phase2", 1622591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * "identity", "ananymous_identity", "ca_cert", and "client_cert" are also required. Lastly, 1632591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * static IP settings are also supported. If the field "ip" is set, then the fields "gateway", 1642591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * "prefix_length", "dns1", and "dns2" are required. 1652591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * </p> 1662591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @throws IllegalArgumentException if the input string was not valid JSON or if any mandatory 1672591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * fields are missing. 1682591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe */ 1692591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe public static List<WifiConfiguration> parseJson(String in) { 1702591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe try { 1712591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe JSONArray jsonConfigs = new JSONArray(in); 1722591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe List<WifiConfiguration> wifiConfigs = new ArrayList<>(jsonConfigs.length()); 1732591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 1742591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe for (int i = 0; i < jsonConfigs.length(); i++) { 1752591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe JSONObject jsonConfig = jsonConfigs.getJSONObject(i); 1762591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 1772591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe wifiConfigs.add(getWifiConfiguration(jsonConfig)); 1782591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 1792591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return wifiConfigs; 1802591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } catch (JSONException e) { 1812591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe throw new IllegalArgumentException(e); 1822591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 1832591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 1842591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 1852591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe /** 1862591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Parse a {@link JSONObject} and return the wifi configuration. 1872591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * 1882591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @throws IllegalArgumentException if any mandatory fields are missing. 1892591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe */ 1902591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe private static WifiConfiguration getWifiConfiguration(JSONObject jsonConfig) 1912591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe throws JSONException { 1922591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe String ssid = jsonConfig.getString("ssid"); 1932591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe String password = null; 1942591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe WifiConfiguration config; 1952591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 1962591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe int securityType = getSecurityType(jsonConfig.getString("security")); 1972591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe switch (securityType) { 1982591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe case NONE: 1992591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config = createOpenConfig(ssid); 2002591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe break; 2012591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe case WEP: 2022591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe password = jsonConfig.getString("password"); 2032591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config = createWepConfig(ssid, password); 2042591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe break; 2052591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe case PSK: 2062591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe password = jsonConfig.getString("password"); 2072591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config = createPskConfig(ssid, password); 2082591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe break; 2092591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe case EAP: 2102591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe password = jsonConfig.getString("password"); 2112591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe int eapMethod = getEapMethod(jsonConfig.getString("eap")); 2122591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe Integer phase2 = null; 2132591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if (jsonConfig.has("phase2")) { 2142591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe phase2 = getPhase2(jsonConfig.getString("phase2")); 2152591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 2162591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe String identity = null; 2172591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if (jsonConfig.has("identity")) { 2182591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe identity = jsonConfig.getString("identity"); 2192591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 2202591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe String anonymousIdentity = null; 2212591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if (jsonConfig.has("anonymous_identity")) { 2222591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe anonymousIdentity = jsonConfig.getString("anonymous_identity"); 2232591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 2242591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe String caCert = null; 2252591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if (jsonConfig.has("ca_cert")) { 2262591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe caCert = (jsonConfig.getString("ca_cert")); 2272591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 2282591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe String clientCert = null; 2292591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if (jsonConfig.has("client_cert")) { 2302591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe clientCert = jsonConfig.getString("client_cert"); 2312591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 2322591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config = createEapConfig(ssid, password, eapMethod, phase2, identity, 2332591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe anonymousIdentity, caCert, clientCert); 2342591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe break; 2352591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe default: 2362591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe // Should never reach here as getSecurityType will already throw an exception 2372591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe throw new IllegalArgumentException(); 2382591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 2392591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 2402591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if (jsonConfig.has("ip")) { 2412591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe StaticIpConfiguration staticIpConfig = new StaticIpConfiguration(); 2422591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 2432591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe InetAddress ipAddress = getInetAddress(jsonConfig.getString("ip")); 2442591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe int prefixLength = getPrefixLength(jsonConfig.getInt("prefix_length")); 2452591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe staticIpConfig.ipAddress = new LinkAddress(ipAddress, prefixLength); 2462591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe staticIpConfig.gateway = getInetAddress(jsonConfig.getString("gateway")); 2472591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe staticIpConfig.dnsServers.add(getInetAddress(jsonConfig.getString("dns1"))); 2482591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe staticIpConfig.dnsServers.add(getInetAddress(jsonConfig.getString("dns2"))); 2492591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 2502591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.setIpAssignment(IpAssignment.STATIC); 2512591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.setStaticIpConfiguration(staticIpConfig); 2522591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } else { 2532591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.setIpAssignment(IpAssignment.DHCP); 2542591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 2552591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 2562591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe config.setProxySettings(ProxySettings.NONE); 2572591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return config; 2582591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 2592591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 2602591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe private static String quotedString(String s) { 2612591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return String.format("\"%s\"", s); 2622591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 2632591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 2642591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe /** 2652591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Get the security type from a string. 2662591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * 2672591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @throws IllegalArgumentException if the string is not a supported security type. 2682591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe */ 2692591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe private static int getSecurityType(String security) { 2702591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if ("NONE".equalsIgnoreCase(security)) { 2712591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return NONE; 2722591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 2732591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if ("WEP".equalsIgnoreCase(security)) { 2742591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return WEP; 2752591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 2762591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if ("PSK".equalsIgnoreCase(security)) { 2772591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return PSK; 2782591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 2792591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if ("EAP".equalsIgnoreCase(security)) { 2802591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return EAP; 2812591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 2822591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe throw new IllegalArgumentException("Security type must be one of NONE, WEP, PSK, or EAP"); 2832591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 2842591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 2852591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe /** 2862591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Get the EAP method from a string. 2872591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * 2882591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @throws IllegalArgumentException if the string is not a supported EAP method. 2892591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe */ 2902591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe private static int getEapMethod(String eapMethod) { 2912591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if ("TLS".equalsIgnoreCase(eapMethod)) { 2922591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return WifiEnterpriseConfig.Eap.TLS; 2932591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 2942591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if ("TTLS".equalsIgnoreCase(eapMethod)) { 2952591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return WifiEnterpriseConfig.Eap.TTLS; 2962591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 2972591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if ("PEAP".equalsIgnoreCase(eapMethod)) { 2982591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return WifiEnterpriseConfig.Eap.PEAP; 2992591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 3002591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe throw new IllegalArgumentException("EAP method must be one of TLS, TTLS, or PEAP"); 3012591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 3022591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 3032591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe /** 3042591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Get the phase 2 method from a string. 3052591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * 3062591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @throws IllegalArgumentException if the string is not a supported phase 2 method. 3072591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe */ 3082591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe private static int getPhase2(String phase2) { 3092591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if ("PAP".equalsIgnoreCase(phase2)) { 3102591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return WifiEnterpriseConfig.Phase2.PAP; 3112591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 3122591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if ("MSCHAP".equalsIgnoreCase(phase2)) { 3132591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return WifiEnterpriseConfig.Phase2.MSCHAP; 3142591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 3152591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if ("MSCHAPV2".equalsIgnoreCase(phase2)) { 3162591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return WifiEnterpriseConfig.Phase2.MSCHAPV2; 3172591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 3182591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if ("GTC".equalsIgnoreCase(phase2)) { 3192591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return WifiEnterpriseConfig.Phase2.GTC; 3202591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 3212591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe throw new IllegalArgumentException("Phase2 must be one of PAP, MSCHAP, MSCHAPV2, or GTC"); 3222591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 3232591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 3242591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe /** 3252591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Get an {@link InetAddress} from a string 3262591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * 3272591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @throws IllegalArgumentException if the string is not a valid IP address. 3282591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe */ 3292591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe private static InetAddress getInetAddress(String ipAddress) { 3302591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if (!InetAddress.isNumeric(ipAddress)) { 3312591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe throw new IllegalArgumentException( 3322591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe String.format("IP address %s is not numeric", ipAddress)); 3332591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 3342591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 3352591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe try { 3362591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return InetAddress.getByName(ipAddress); 3372591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } catch (UnknownHostException e) { 3382591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe throw new IllegalArgumentException( 3392591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe String.format("IP address %s could not be resolved", ipAddress)); 3402591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 3412591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 3422591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 3432591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe /** 3442591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Get the prefix length from an int. 3452591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * 3462591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * @throws IllegalArgumentException if the prefix length is less than 0 or greater than 32. 3472591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe */ 3482591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe private static int getPrefixLength(int prefixLength) { 3492591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if (prefixLength < 0 || prefixLength > 32) { 3502591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe throw new IllegalArgumentException("Prefix length cannot be less than 0 or more than 32"); 3512591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 3522591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return prefixLength; 3532591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 3542591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe 3552591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe /** 3562591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe * Utility method to check if a given string is a hexadecimal string of given length 3572591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe */ 3582591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe public static boolean isHex(String input, int length) { 3592591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe if (input == null || length < 0) { 3602591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return false; 3612591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 3622591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe return input.matches(String.format("[0-9A-Fa-f]{%d}", length)); 3632591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe } 3642591e00b57b8aedd9e44fecce3f55a2c6a5428c2Eric Rowe} 365