1ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang/* 2ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Copyright (C) 2010, The Android Open Source Project 3ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * 4ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * you may not use this file except in compliance with the License. 6ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * You may obtain a copy of the License at 7ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * 8ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * http://www.apache.org/licenses/LICENSE-2.0 9ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * 10ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Unless required by applicable law or agreed to in writing, software 11ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * distributed under the License is distributed on an "AS IS" BASIS, 12ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * See the License for the specific language governing permissions and 14ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * limitations under the License. 15ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang */ 16ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 17ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangpackage com.android.connectivitymanagertest; 18ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 19ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport javax.xml.parsers.SAXParser; 20ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport javax.xml.parsers.SAXParserFactory; 21ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 22ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport org.xml.sax.Attributes; 23ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport org.xml.sax.SAXException; 24ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport org.xml.sax.helpers.DefaultHandler; 25ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 26ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.net.wifi.WifiConfiguration; 27ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.net.wifi.WifiConfiguration.AuthAlgorithm; 28a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport android.net.wifi.WifiConfiguration.IpAssignment; 29ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.net.wifi.WifiConfiguration.KeyMgmt; 30a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport android.net.wifi.WifiConfiguration.ProxySettings; 31f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriffimport android.net.wifi.WifiEnterpriseConfig; 32a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport android.net.LinkAddress; 33a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport android.net.LinkProperties; 34aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwaltimport android.net.RouteInfo; 35a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang 36ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport java.io.InputStream; 37a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport java.net.InetAddress; 38a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport java.net.UnknownHostException; 39ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport java.util.ArrayList; 40ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport java.util.List; 41ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 42ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 43ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang/** 44ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Help class to process configurations of access points saved in an XML file. 45ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * The configurations of an access point is included in tag 46ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <accesspoint></accesspoint>. The supported configuration includes: ssid, 47ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * security, eap, phase2, identity, password, anonymousidentity, cacert, usercert, 48a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang * in which each is included in the corresponding tags. Static IP setting is also supported. 49b979f79158f9c470fa09ff3b96d72db274262201Robert Greenwalt * Tags that can be used include: ip, gateway, networkprefixlength, dns1, dns2. All access points 50b979f79158f9c470fa09ff3b96d72db274262201Robert Greenwalt * have to be enclosed in tags of <resources></resources>. 51ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * 52ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * The following is a sample configuration file for an access point using EAP-PEAP with MSCHAP2. 53ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <resources> 54ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <accesspoint> 55ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <ssid>testnet</ssid> 56ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <security>EAP</security> 57ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <eap>PEAP</eap> 58ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <phase2>MSCHAP2</phase2> 59ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <identity>donut</identity</identity> 60ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <password>abcdefgh</password> 61ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * </accesspoint> 62ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * </resources> 63a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang * 64a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang * Note:ssid and security have to be the first two tags 65b979f79158f9c470fa09ff3b96d72db274262201Robert Greenwalt * for static ip setting, tag "ip" should be listed before other fields: dns, gateway, 66b979f79158f9c470fa09ff3b96d72db274262201Robert Greenwalt * networkprefixlength. 67ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang */ 68ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangpublic class AccessPointParserHelper { 69ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang private static final String TAG = "AccessPointParserHelper"; 70ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang static final int NONE = 0; 71ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang static final int WEP = 1; 72ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang static final int PSK = 2; 73ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang static final int EAP = 3; 74ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 75ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang List<WifiConfiguration> networks = new ArrayList<WifiConfiguration>(); 76ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 77ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang private int getSecurityType (String security) { 78ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (security.equalsIgnoreCase("NONE")) { 79ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return NONE; 80ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else if (security.equalsIgnoreCase("WEP")) { 81ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return WEP; 82ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else if (security.equalsIgnoreCase("PSK")) { 83ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return PSK; 84ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else if (security.equalsIgnoreCase("EAP")) { 85ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return EAP; 86ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else { 87ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return -1; 88ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 89ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 90ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 91ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang private boolean validateEapValue(String value) { 92ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (value.equalsIgnoreCase("PEAP") || 93ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang value.equalsIgnoreCase("TLS") || 94ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang value.equalsIgnoreCase("TTLS")) { 95ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return true; 96ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else { 97ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return false; 98ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 99ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 100ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 101ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang DefaultHandler mHandler = new DefaultHandler() { 102ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 103ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean ssid = false; 104ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean security = false; 105ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean password = false; 106ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean ip = false; 107ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean gateway = false; 108a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang boolean networkprefix = false; 109a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang boolean dns1 = false; 110a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang boolean dns2 = false; 111ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean eap = false; 112ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean phase2 = false; 113ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean identity = false; 114ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean anonymousidentity = false; 115ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean cacert = false; 116ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean usercert = false; 117ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang WifiConfiguration config = null; 118ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang int securityType = NONE; 119a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang LinkProperties mLinkProperties = null; 120a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang InetAddress mInetAddr = null; 121ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 122ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang @Override 123ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public void startElement(String uri, String localName, String tagName, 124ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang Attributes attributes) throws SAXException { 125ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("accesspoint")) { 126ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config = new WifiConfiguration(); 127ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 128ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("ssid")) { 129ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang ssid = true; 130ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 131ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("security")) { 132ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang security = true; 133ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 134ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("password")) { 135ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang password = true; 136ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 137ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("eap")) { 138ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang eap = true; 139ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 140ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("phase2")) { 141ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang phase2 = true; 142ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 143ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("identity")) { 144ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang identity = true; 145ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 146ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("anonymousidentity")) { 147ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang anonymousidentity = true; 148ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 149ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("cacert")) { 150ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang cacert = true; 151ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 152ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("usercert")) { 153ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang usercert = true; 154ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 155a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (tagName.equalsIgnoreCase("ip")) { 156a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang mLinkProperties = new LinkProperties(); 157a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang ip = true; 158a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 159a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (tagName.equalsIgnoreCase("gateway")) { 160a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang gateway = true; 161a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 162a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (tagName.equalsIgnoreCase("networkprefixlength")) { 163a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang networkprefix = true; 164a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 165a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (tagName.equalsIgnoreCase("dns1")) { 166a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang dns1 = true; 167a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 168a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (tagName.equalsIgnoreCase("dns2")) { 169a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang dns2 = true; 170a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 171ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 172ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 173ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang @Override 174ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public void endElement(String uri, String localName, String tagName) throws SAXException { 175ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("accesspoint")) { 176a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (mLinkProperties != null) { 177a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang config.ipAssignment = IpAssignment.STATIC; 178a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang config.linkProperties = mLinkProperties; 179a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } else { 180a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang config.ipAssignment = IpAssignment.DHCP; 181a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 182a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang config.proxySettings = ProxySettings.NONE; 183ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang networks.add(config); 184dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang mLinkProperties = null; 185ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 186ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 187ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 188ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang @Override 189ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public void characters(char ch[], int start, int length) throws SAXException { 190ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (ssid) { 191ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.SSID = new String(ch, start, length); 192ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang ssid = false; 193ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 194ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (security) { 195ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String securityStr = (new String(ch, start, length)).toUpperCase(); 196ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang securityType = getSecurityType(securityStr); 197ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang switch (securityType) { 198ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang case NONE: 199ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.allowedKeyManagement.set(KeyMgmt.NONE); 200ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang break; 201ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang case WEP: 202ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.allowedKeyManagement.set(KeyMgmt.NONE); 203ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 204ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED); 205ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang break; 206ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang case PSK: 207ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.allowedKeyManagement.set(KeyMgmt.WPA_PSK); 208ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang break; 209ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang case EAP: 210ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.allowedKeyManagement.set(KeyMgmt.WPA_EAP); 211ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.allowedKeyManagement.set(KeyMgmt.IEEE8021X); 212a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang // Initialize other fields. 213f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE); 21435185a9ccf016f1d5fbe055e89a6c4c79a247981Wink Saville config.enterpriseConfig.setCaCertificateAlias(""); 21535185a9ccf016f1d5fbe055e89a6c4c79a247981Wink Saville config.enterpriseConfig.setClientCertificateAlias(""); 216f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff config.enterpriseConfig.setIdentity(""); 217f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff config.enterpriseConfig.setAnonymousIdentity(""); 218ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang break; 219ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang default: 220ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang throw new SAXException(); 221ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 222ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang security = false; 223ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 224ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (password) { 225ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String passwordStr = new String(ch, start, length); 226ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang int len = passwordStr.length(); 227ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (len == 0) { 228ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang throw new SAXException(); 229ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 230ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (securityType == WEP) { 231ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if ((len == 10 || len == 26 || len == 58) && 232ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang passwordStr.matches("[0-9A-Fa-f]*")) { 233ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.wepKeys[0] = passwordStr; 234ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else { 235ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.wepKeys[0] = '"' + passwordStr + '"'; 236ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 237ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else if (securityType == PSK) { 238ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (passwordStr.matches("[0-9A-Fa-f]{64}")) { 239ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.preSharedKey = passwordStr; 240ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else { 241ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.preSharedKey = '"' + passwordStr + '"'; 242ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 243ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else if (securityType == EAP) { 244f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff config.enterpriseConfig.setPassword(passwordStr); 245ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else { 246ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang throw new SAXException(); 247ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 248ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang password = false; 249ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 250ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (eap) { 251ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String eapValue = new String(ch, start, length); 252ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (!validateEapValue(eapValue)) { 253ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang throw new SAXException(); 254ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 255f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff if (eapValue.equals("TLS")) { 256f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS); 257f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff } else if (eapValue.equals("TTLS")) { 258f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TTLS); 259f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff } else if (eapValue.equals("PEAP")) { 260f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.PEAP); 261f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff } 262ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang eap = false; 263ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 264ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (phase2) { 265ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String phase2Value = new String(ch, start, length); 266f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff if (phase2Value.equals("PAP")) { 267f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.PAP); 268f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff } else if (phase2Value.equals("MSCHAP")) { 269f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.MSCHAP); 270f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff } else if (phase2Value.equals("MSCHAPV2")) { 271f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.MSCHAPV2); 272f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff } else if (phase2Value.equals("GTC")) { 273f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC); 274f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff } 275ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang phase2 = false; 276ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 277ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (identity) { 278ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String identityValue = new String(ch, start, length); 279f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff config.enterpriseConfig.setIdentity(identityValue); 280ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang identity = false; 281ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 282ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (anonymousidentity) { 283ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String anonyId = new String(ch, start, length); 284f2488b63283dca1d0bb9ca97961d9785ae2c64d8Irfan Sheriff config.enterpriseConfig.setAnonymousIdentity(anonyId); 285ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang anonymousidentity = false; 286ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 287ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (cacert) { 288ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String cacertValue = new String(ch, start, length); 28935185a9ccf016f1d5fbe055e89a6c4c79a247981Wink Saville config.enterpriseConfig.setCaCertificateAlias(cacertValue); 290ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang cacert = false; 291ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 292ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (usercert) { 293ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String usercertValue = new String(ch, start, length); 29435185a9ccf016f1d5fbe055e89a6c4c79a247981Wink Saville config.enterpriseConfig.setClientCertificateAlias(usercertValue); 295ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang usercert = false; 296ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 297a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (ip) { 298a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang try { 299a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang String ipAddr = new String(ch, start, length); 300a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (!InetAddress.isNumeric(ipAddr)) { 301a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 302a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 303a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang mInetAddr = InetAddress.getByName(ipAddr); 304a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } catch (UnknownHostException e) { 305a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 306a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 307a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang ip = false; 308a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 309a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (gateway) { 310a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang try { 311a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang String gwAddr = new String(ch, start, length); 312a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (!InetAddress.isNumeric(gwAddr)) { 313a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 314a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 315aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt mLinkProperties.addRoute(new RouteInfo(InetAddress.getByName(gwAddr))); 316a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } catch (UnknownHostException e) { 317a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 318a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 319a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang gateway = false; 320a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 321a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (networkprefix) { 322a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang try { 323a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang int nwPrefixLength = Integer.parseInt(new String(ch, start, length)); 324a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if ((nwPrefixLength < 0) || (nwPrefixLength > 32)) { 325a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 326a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 327a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang mLinkProperties.addLinkAddress(new LinkAddress(mInetAddr, nwPrefixLength)); 328a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } catch (NumberFormatException e) { 329a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 330a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 331a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang networkprefix = false; 332a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 333a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (dns1) { 334a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang try { 335a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang String dnsAddr = new String(ch, start, length); 336a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (!InetAddress.isNumeric(dnsAddr)) { 337a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 338a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 339a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang mLinkProperties.addDns(InetAddress.getByName(dnsAddr)); 340a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } catch (UnknownHostException e) { 341a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 342a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 343a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang dns1 = false; 344a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 345a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (dns2) { 346a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang try { 347a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang String dnsAddr = new String(ch, start, length); 348a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (!InetAddress.isNumeric(dnsAddr)) { 349a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 350a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 351a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang mLinkProperties.addDns(InetAddress.getByName(dnsAddr)); 352a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } catch (UnknownHostException e) { 353a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 354a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 355a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang dns2 = false; 356a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 357ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 358ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang }; 359ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 360ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang /** 361a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang * Process the InputStream in 362a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang * @param in is the InputStream that can be used for XML parsing 363a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang * @throws Exception 364ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang */ 365a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang public AccessPointParserHelper(InputStream in) throws Exception { 366ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang SAXParserFactory factory = SAXParserFactory.newInstance(); 367ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang SAXParser saxParser = factory.newSAXParser(); 368ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang saxParser.parse(in, mHandler); 369a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 370a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang 371a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang public List<WifiConfiguration> getNetworkConfigurations() throws Exception { 372ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return networks; 373ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 374ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang} 375