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