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