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; 31a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport android.net.LinkAddress; 32a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport android.net.LinkProperties; 33aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwaltimport android.net.RouteInfo; 34ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport android.util.Log; 35a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang 36ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport java.io.InputStream; 37a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport java.net.InetAddress; 38a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport java.net.UnknownHostException; 39ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport java.util.ArrayList; 40a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wangimport java.util.HashMap; 41ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangimport java.util.List; 42ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 43ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 44ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang/** 45ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * Help class to process configurations of access points saved in an XML file. 46ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * The configurations of an access point is included in tag 47ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <accesspoint></accesspoint>. The supported configuration includes: ssid, 48ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * security, eap, phase2, identity, password, anonymousidentity, cacert, usercert, 49a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang * in which each is included in the corresponding tags. Static IP setting is also supported. 50b979f79158f9c470fa09ff3b96d72db274262201Robert Greenwalt * Tags that can be used include: ip, gateway, networkprefixlength, dns1, dns2. All access points 51b979f79158f9c470fa09ff3b96d72db274262201Robert Greenwalt * have to be enclosed in tags of <resources></resources>. 52ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * 53ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * The following is a sample configuration file for an access point using EAP-PEAP with MSCHAP2. 54ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <resources> 55ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <accesspoint> 56ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <ssid>testnet</ssid> 57ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <security>EAP</security> 58ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <eap>PEAP</eap> 59ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <phase2>MSCHAP2</phase2> 60ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <identity>donut</identity</identity> 61ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * <password>abcdefgh</password> 62ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * </accesspoint> 63ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang * </resources> 64a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang * 65a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang * Note:ssid and security have to be the first two tags 66b979f79158f9c470fa09ff3b96d72db274262201Robert Greenwalt * for static ip setting, tag "ip" should be listed before other fields: dns, gateway, 67b979f79158f9c470fa09ff3b96d72db274262201Robert Greenwalt * networkprefixlength. 68ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang */ 69ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wangpublic class AccessPointParserHelper { 70ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang private static final String KEYSTORE_SPACE = "keystore://"; 71ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang private static final String TAG = "AccessPointParserHelper"; 72ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang static final int NONE = 0; 73ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang static final int WEP = 1; 74ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang static final int PSK = 2; 75ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang static final int EAP = 3; 76ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 77ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang List<WifiConfiguration> networks = new ArrayList<WifiConfiguration>(); 78ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 79ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang private int getSecurityType (String security) { 80ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (security.equalsIgnoreCase("NONE")) { 81ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return NONE; 82ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else if (security.equalsIgnoreCase("WEP")) { 83ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return WEP; 84ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else if (security.equalsIgnoreCase("PSK")) { 85ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return PSK; 86ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else if (security.equalsIgnoreCase("EAP")) { 87ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return EAP; 88ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else { 89ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return -1; 90ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 91ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 92ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 93ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang private boolean validateEapValue(String value) { 94ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (value.equalsIgnoreCase("PEAP") || 95ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang value.equalsIgnoreCase("TLS") || 96ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang value.equalsIgnoreCase("TTLS")) { 97ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return true; 98ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else { 99ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return false; 100ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 101ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 102ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 103ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang DefaultHandler mHandler = new DefaultHandler() { 104ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 105ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean ssid = false; 106ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean security = false; 107ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean password = false; 108ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean ip = false; 109ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean gateway = false; 110a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang boolean networkprefix = false; 111a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang boolean dns1 = false; 112a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang boolean dns2 = false; 113ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean eap = false; 114ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean phase2 = false; 115ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean identity = false; 116ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean anonymousidentity = false; 117ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean cacert = false; 118ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang boolean usercert = false; 119ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang WifiConfiguration config = null; 120ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang int securityType = NONE; 121a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang LinkProperties mLinkProperties = null; 122a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang InetAddress mInetAddr = null; 123ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 124ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang @Override 125ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public void startElement(String uri, String localName, String tagName, 126ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang Attributes attributes) throws SAXException { 127ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("accesspoint")) { 128ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config = new WifiConfiguration(); 129ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 130ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("ssid")) { 131ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang ssid = true; 132ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 133ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("security")) { 134ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang security = true; 135ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 136ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("password")) { 137ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang password = true; 138ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 139ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("eap")) { 140ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang eap = true; 141ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 142ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("phase2")) { 143ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang phase2 = true; 144ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 145ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("identity")) { 146ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang identity = true; 147ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 148ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("anonymousidentity")) { 149ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang anonymousidentity = true; 150ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 151ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("cacert")) { 152ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang cacert = true; 153ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 154ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("usercert")) { 155ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang usercert = true; 156ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 157a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (tagName.equalsIgnoreCase("ip")) { 158a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang mLinkProperties = new LinkProperties(); 159a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang ip = true; 160a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 161a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (tagName.equalsIgnoreCase("gateway")) { 162a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang gateway = true; 163a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 164a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (tagName.equalsIgnoreCase("networkprefixlength")) { 165a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang networkprefix = true; 166a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 167a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (tagName.equalsIgnoreCase("dns1")) { 168a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang dns1 = true; 169a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 170a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (tagName.equalsIgnoreCase("dns2")) { 171a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang dns2 = true; 172a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 173ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 174ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 175ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang @Override 176ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public void endElement(String uri, String localName, String tagName) throws SAXException { 177ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (tagName.equalsIgnoreCase("accesspoint")) { 178a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (mLinkProperties != null) { 179a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang config.ipAssignment = IpAssignment.STATIC; 180a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang config.linkProperties = mLinkProperties; 181a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } else { 182a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang config.ipAssignment = IpAssignment.DHCP; 183a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 184a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang config.proxySettings = ProxySettings.NONE; 185ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang networks.add(config); 186dddfaa75e77f4d02cc7b4180f5eb0679321cb628Xia Wang mLinkProperties = null; 187ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 188ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 189ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 190ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang @Override 191ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang public void characters(char ch[], int start, int length) throws SAXException { 192ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (ssid) { 193ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.SSID = new String(ch, start, length); 194ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang ssid = false; 195ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 196ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (security) { 197ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String securityStr = (new String(ch, start, length)).toUpperCase(); 198ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang securityType = getSecurityType(securityStr); 199ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang switch (securityType) { 200ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang case NONE: 201ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.allowedKeyManagement.set(KeyMgmt.NONE); 202ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang break; 203ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang case WEP: 204ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.allowedKeyManagement.set(KeyMgmt.NONE); 205ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); 206ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED); 207ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang break; 208ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang case PSK: 209ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.allowedKeyManagement.set(KeyMgmt.WPA_PSK); 210ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang break; 211ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang case EAP: 212ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.allowedKeyManagement.set(KeyMgmt.WPA_EAP); 213ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.allowedKeyManagement.set(KeyMgmt.IEEE8021X); 214a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang // Initialize other fields. 215a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang config.phase2.setValue(""); 216a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang config.ca_cert.setValue(""); 217a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang config.client_cert.setValue(""); 218fb32ab903affabbf1f71ee499381e070feaef987Kenny Root config.engine.setValue(""); 219fb32ab903affabbf1f71ee499381e070feaef987Kenny Root config.engine_id.setValue(""); 220fb32ab903affabbf1f71ee499381e070feaef987Kenny Root config.key_id.setValue(""); 221a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang config.identity.setValue(""); 222a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang config.anonymous_identity.setValue(""); 223ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang break; 224ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang default: 225ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang throw new SAXException(); 226ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 227ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang security = false; 228ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 229ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (password) { 230ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String passwordStr = new String(ch, start, length); 231ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang int len = passwordStr.length(); 232ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (len == 0) { 233ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang throw new SAXException(); 234ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 235ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (securityType == WEP) { 236ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if ((len == 10 || len == 26 || len == 58) && 237ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang passwordStr.matches("[0-9A-Fa-f]*")) { 238ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.wepKeys[0] = passwordStr; 239ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else { 240ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.wepKeys[0] = '"' + passwordStr + '"'; 241ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 242ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else if (securityType == PSK) { 243ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (passwordStr.matches("[0-9A-Fa-f]{64}")) { 244ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.preSharedKey = passwordStr; 245ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else { 246ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.preSharedKey = '"' + passwordStr + '"'; 247ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 248ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else if (securityType == EAP) { 249ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.password.setValue(passwordStr); 250ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } else { 251ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang throw new SAXException(); 252ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 253ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang password = false; 254ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 255ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (eap) { 256ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String eapValue = new String(ch, start, length); 257ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (!validateEapValue(eapValue)) { 258ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang throw new SAXException(); 259ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 260ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.eap.setValue(eapValue); 261ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang eap = false; 262ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 263ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (phase2) { 264ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String phase2Value = new String(ch, start, length); 265ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.phase2.setValue("auth=" + phase2Value); 266ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang phase2 = false; 267ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 268ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (identity) { 269ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String identityValue = new String(ch, start, length); 270ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.identity.setValue(identityValue); 271ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang identity = false; 272ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 273ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (anonymousidentity) { 274ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String anonyId = new String(ch, start, length); 275ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.anonymous_identity.setValue(anonyId); 276ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang anonymousidentity = false; 277ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 278ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (cacert) { 279ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String cacertValue = new String(ch, start, length); 280ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang // need to install the credentail to "keystore://" 281ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.ca_cert.setValue(KEYSTORE_SPACE); 282ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang cacert = false; 283ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 284ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang if (usercert) { 285ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang String usercertValue = new String(ch, start, length); 286ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang config.client_cert.setValue(KEYSTORE_SPACE); 287ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang usercert = false; 288ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 289a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (ip) { 290a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang try { 291a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang String ipAddr = new String(ch, start, length); 292a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (!InetAddress.isNumeric(ipAddr)) { 293a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 294a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 295a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang mInetAddr = InetAddress.getByName(ipAddr); 296a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } catch (UnknownHostException e) { 297a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 298a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 299a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang ip = false; 300a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 301a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (gateway) { 302a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang try { 303a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang String gwAddr = new String(ch, start, length); 304a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (!InetAddress.isNumeric(gwAddr)) { 305a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 306a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 307aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt mLinkProperties.addRoute(new RouteInfo(InetAddress.getByName(gwAddr))); 308a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } catch (UnknownHostException e) { 309a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 310a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 311a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang gateway = false; 312a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 313a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (networkprefix) { 314a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang try { 315a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang int nwPrefixLength = Integer.parseInt(new String(ch, start, length)); 316a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if ((nwPrefixLength < 0) || (nwPrefixLength > 32)) { 317a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 318a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 319a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang mLinkProperties.addLinkAddress(new LinkAddress(mInetAddr, nwPrefixLength)); 320a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } catch (NumberFormatException e) { 321a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 322a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 323a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang networkprefix = false; 324a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 325a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (dns1) { 326a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang try { 327a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang String dnsAddr = new String(ch, start, length); 328a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (!InetAddress.isNumeric(dnsAddr)) { 329a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 330a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 331a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang mLinkProperties.addDns(InetAddress.getByName(dnsAddr)); 332a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } catch (UnknownHostException e) { 333a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 334a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 335a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang dns1 = false; 336a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 337a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (dns2) { 338a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang try { 339a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang String dnsAddr = new String(ch, start, length); 340a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang if (!InetAddress.isNumeric(dnsAddr)) { 341a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 342a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 343a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang mLinkProperties.addDns(InetAddress.getByName(dnsAddr)); 344a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } catch (UnknownHostException e) { 345a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang throw new SAXException(); 346a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 347a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang dns2 = false; 348a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 349ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 350ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang }; 351ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang 352ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang /** 353a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang * Process the InputStream in 354a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang * @param in is the InputStream that can be used for XML parsing 355a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang * @throws Exception 356ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang */ 357a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang public AccessPointParserHelper(InputStream in) throws Exception { 358ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang SAXParserFactory factory = SAXParserFactory.newInstance(); 359ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang SAXParser saxParser = factory.newSAXParser(); 360ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang saxParser.parse(in, mHandler); 361a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang } 362a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang 363a42a1e6b6fb6acc9ca327523ae456e464f8aedc1Xia Wang public List<WifiConfiguration> getNetworkConfigurations() throws Exception { 364ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang return networks; 365ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang } 366ca1f2b1a1e8cb785be5ebbcf7ded7c921cbf80a7Xia Wang} 367