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