1340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang/* 2340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * Copyright (C) 2013 The Android Open Source Project 3340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * 4340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * you may not use this file except in compliance with the License. 6340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * You may obtain a copy of the License at 7340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * 8340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * http://www.apache.org/licenses/LICENSE-2.0 9340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * 10340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * Unless required by applicable law or agreed to in writing, software 11340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * distributed under the License is distributed on an "AS IS" BASIS, 12340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * See the License for the specific language governing permissions and 14340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * limitations under the License. 15340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang */ 16340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang 17340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangpackage com.android.settings.vpn2; 18340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang 19340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport android.util.Log; 20340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang 21340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport com.android.internal.net.VpnProfile; 22340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang 23340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport org.xml.sax.Attributes; 24340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport org.xml.sax.SAXException; 25340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport org.xml.sax.helpers.DefaultHandler; 26340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang 27340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport java.io.IOException; 28340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport java.io.InputStream; 29340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport java.util.HashMap; 30340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport java.util.Map; 31340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang 32340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport javax.xml.parsers.ParserConfigurationException; 33340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport javax.xml.parsers.SAXParser; 34340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangimport javax.xml.parsers.SAXParserFactory; 35340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang 36340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang/** 37340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang * Parse VPN profiles from an XML file 38340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang */ 39340bda7154194d64a719fb5c86a702a4e5773be0Xia Wangpublic class VpnProfileParser { 40340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang private final static String TAG = "VpnProfileParser"; 41340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang private static Map<Integer, VpnInfo> mVpnPool = new HashMap<Integer, VpnInfo>(); 42340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang 43340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang static DefaultHandler mHandler = new DefaultHandler() { 44340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang boolean name; 45340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang boolean type; 46340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang boolean server; 47340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang boolean username; 48340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang boolean password; 49340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang boolean dnsServers; 50340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang boolean searchDomains; 51340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang boolean routes; 52340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang boolean mppe; 53340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang boolean l2tpSecret; 54340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang boolean ipsecIdentifier; 55340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang boolean ipsecSecret; 56340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang boolean ipsecUserCert; 57340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang boolean ipsecCaCert; 58340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang boolean ipsecServerCert; 59340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang boolean certFile; 60340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang boolean certFilePassword; 61340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang VpnProfile profile = null; 62340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang VpnInfo vpnInfo = null; 63340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang 64340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang 65340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang @Override 66340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang public void startElement(String uri, String localName, String tagName, 67340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang Attributes attributes) throws SAXException { 68340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("vpn")) { 69340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang //create a new VPN profile 70340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang profile = new VpnProfile(Long.toHexString(System.currentTimeMillis())); 71340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang vpnInfo = new VpnInfo(profile); 72340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 73340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("name")) { 74340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang name = true; 75340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 76340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("type")) { 77340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang type = true; 78340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 79340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("server")) { 80340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang server = true; 81340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 82340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("username")) { 83340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang username = true; 84340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 85340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("password")) { 86340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang password = true; 87340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 88340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("dnsServers")) { 89340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang dnsServers = true; 90340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 91340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("searchDomains")) { 92340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang searchDomains = true; 93340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 94340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("mppe")) { 95340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang mppe = true; 96340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 97340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("l2tpSecret")) { 98340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang l2tpSecret = true; 99340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 100340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("ipsecIdentifier")) { 101340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang ipsecIdentifier = true; 102340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 103340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("ipsecSecret")) { 104340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang ipsecSecret = true; 105340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 106340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("ipsecUserCert")) { 107340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang ipsecUserCert = true; 108340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 109340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("ipsecCaCert")) { 110340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang ipsecCaCert = true; 111340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 112340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("ipsecServerCert")) { 113340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang ipsecServerCert = true; 114340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 115340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("routes")) { 116340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang routes = true; 117340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 118340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("cert-file")) { 119340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang certFile = true; 120340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 121340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("cert-file-password")) { 122340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang certFilePassword = true; 123340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 124340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 125340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang 126340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang @Override 127340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang public void endElement(String uri, String localName, String tagName) throws SAXException { 128340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (tagName.equalsIgnoreCase("vpn")) { 129340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang mVpnPool.put(profile.type, vpnInfo); 130340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 131340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 132340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang 133340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang @Override 134340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang public void characters(char ch[], int start, int length) throws SAXException { 135340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang String strValue = new String(ch, start, length); 136340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (name) { 137340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang profile.name = strValue; 138340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang name = false; 139340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 140340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (type) { 141340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang int t = getVpnProfileType(strValue); 142340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (t < 0) { 143340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang throw new SAXException("not a valid VPN type"); 144340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } else { 145340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang profile.type = t; 146340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 147340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang type = false; 148340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 149340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (server) { 150340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang profile.server = strValue; 151340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang server = false; 152340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 153340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (username) { 154340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang profile.username = strValue; 155340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang username = false; 156340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 157340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (password) { 158340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang profile.password = strValue; 159340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang password = false; 160340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 161340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (dnsServers) { 162340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang profile.dnsServers = strValue; 163340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang dnsServers = false; 164340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 165340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (searchDomains) { 166340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang profile.searchDomains = strValue; 167340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang searchDomains = false; 168340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 169340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (mppe) { 170340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang profile.mppe = Boolean.valueOf(strValue); 171340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang mppe = false; 172340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 173340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (l2tpSecret) { 174340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang profile.l2tpSecret = strValue; 175340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang l2tpSecret = false; 176340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 177340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (ipsecIdentifier) { 178340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang profile.ipsecIdentifier = strValue; 179340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang ipsecIdentifier = false; 180340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 181340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (ipsecSecret) { 182340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang profile.ipsecSecret = strValue; 183340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang ipsecSecret = false; 184340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 185340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (ipsecUserCert) { 186340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang profile.ipsecUserCert = strValue; 187340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang ipsecUserCert = false; 188340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 189340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (ipsecCaCert) { 190340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang profile.ipsecCaCert = strValue; 191340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang ipsecCaCert = false; 192340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 193340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (ipsecServerCert) { 194340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang profile.ipsecServerCert = strValue; 195340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang ipsecServerCert = false; 196340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 197340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (routes) { 198340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang profile.routes = strValue; 199340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang routes = false; 200340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 201340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (certFile) { 202340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang vpnInfo.setCertificateFile(strValue); 203340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang certFile = false; 204340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 205340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (certFilePassword) { 206340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang vpnInfo.setPassword(strValue); 207340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang certFilePassword = false; 208340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 209340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 210340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang 211340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang private int getVpnProfileType(String type) { 212340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang if (type.equalsIgnoreCase("TYPE_PPTP")) { 213340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang return VpnProfile.TYPE_PPTP; 214340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } else if (type.equalsIgnoreCase("TYPE_L2TP_IPSEC_PSK")) { 215340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang return VpnProfile.TYPE_L2TP_IPSEC_PSK; 216340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } else if (type.equalsIgnoreCase("TYPE_L2TP_IPSEC_RSA")) { 217340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang return VpnProfile.TYPE_L2TP_IPSEC_RSA; 218340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } else if (type.equalsIgnoreCase("TYPE_IPSEC_XAUTH_PSK")) { 219340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang return VpnProfile.TYPE_IPSEC_XAUTH_PSK; 220340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } else if (type.equalsIgnoreCase("TYPE_IPSEC_XAUTH_RSA")) { 221340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang return VpnProfile.TYPE_IPSEC_XAUTH_RSA; 222340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } else if (type.equalsIgnoreCase("TYPE_IPSEC_HYBRID_RSA")) { 223340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang return VpnProfile.TYPE_IPSEC_HYBRID_RSA; 224340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } else { 225340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang Log.v(TAG, "Invalid VPN type: " + type); 226340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang return -1; 227340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 228340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 229340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang }; 230340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang 231340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang public static Map<Integer, VpnInfo> parse(InputStream in) { 232340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang try { 233340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang SAXParserFactory factory = SAXParserFactory.newInstance(); 234340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang SAXParser saxParser = factory.newSAXParser(); 235340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang saxParser.parse(in, mHandler); 236340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } catch (SAXException e) { 237340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang Log.e(TAG, "Parse vpn profile exception: " + e.toString()); 238340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } catch (IOException e) { 239340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang Log.e(TAG, "Parse vpn profile exception: " + e.toString()); 240340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } catch (ParserConfigurationException e) { 241340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang Log.e(TAG, "Parse vpn profile exception: " + e.toString()); 242340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } finally { 243340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang return mVpnPool; 244340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 245340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang } 246340bda7154194d64a719fb5c86a702a4e5773be0Xia Wang} 247