104ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh/* 204ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh * Copyright (C) 2011 The Android Open Source Project 304ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh * 404ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh * Licensed under the Apache License, Version 2.0 (the "License"); 504ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh * you may not use this file except in compliance with the License. 604ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh * You may obtain a copy of the License at 704ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh * 804ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh * http://www.apache.org/licenses/LICENSE-2.0 904ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh * 1004ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh * Unless required by applicable law or agreed to in writing, software 1104ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh * distributed under the License is distributed on an "AS IS" BASIS, 1204ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1304ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh * See the License for the specific language governing permissions and 1404ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh * limitations under the License. 1504ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh */ 1604ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh 1704ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yehpackage com.android.internal.net; 1804ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh 197b0b834c3d12564c44ac134879a6dbc70e74be6eChia-chi Yehimport android.app.PendingIntent; 20b0e5bbb657c59584c37a489c93a3a12d13ca56b7Vinod Krishnanimport android.content.ComponentName; 217b0b834c3d12564c44ac134879a6dbc70e74be6eChia-chi Yehimport android.content.Context; 227b0b834c3d12564c44ac134879a6dbc70e74be6eChia-chi Yehimport android.content.Intent; 2305542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidsonimport android.content.pm.PackageManager; 2405542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidsonimport android.content.pm.PackageManager.NameNotFoundException; 2505542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidsonimport android.content.pm.ResolveInfo; 26b0e5bbb657c59584c37a489c93a3a12d13ca56b7Vinod Krishnanimport android.content.res.Resources; 27b2053114562830369a9d060e79f0c9eff4be27e7Lorenzo Colittiimport android.net.IpPrefix; 2805542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidsonimport android.net.LinkAddress; 29c2c0beab79a907f63e109eefe2a5aabcf2e3fd8fSreeram Ramachandranimport android.net.Network; 3005542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidsonimport android.net.RouteInfo; 3104ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yehimport android.os.Parcel; 3204ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yehimport android.os.Parcelable; 3390b1b9f985a91fb54254705515f822b09c68ac26Jeff Davidsonimport android.os.UserHandle; 3404ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh 3542065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandranimport java.net.Inet4Address; 364ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubakerimport java.net.InetAddress; 374ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubakerimport java.util.ArrayList; 3805542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidsonimport java.util.List; 398909b10175303bd5e2ca82b7ba12cd0017050ef3Chia-chi Yeh 4004ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh/** 4104ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh * A simple container used to carry information in VpnBuilder, VpnDialogs, 4204ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh * and com.android.server.connectivity.Vpn. Internal use only. 4304ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh * 4404ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh * @hide 4504ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh */ 4604ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yehpublic class VpnConfig implements Parcelable { 4704ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh 48fcc1b41b663c1a0cb551344c4a16a5ad9ce36d60Chia-chi Yeh public static final String SERVICE_INTERFACE = "android.net.VpnService"; 497b0b834c3d12564c44ac134879a6dbc70e74be6eChia-chi Yeh 50dadc857d9de364fded10d4f69eb82bc9cd35d4b7Chia-chi Yeh public static final String DIALOGS_PACKAGE = "com.android.vpndialogs"; 51dadc857d9de364fded10d4f69eb82bc9cd35d4b7Chia-chi Yeh 52e9107901ae264de4ff5603d3cfc63a03ca4117d4Chia-chi Yeh public static final String LEGACY_VPN = "[Legacy VPN]"; 53e9107901ae264de4ff5603d3cfc63a03ca4117d4Chia-chi Yeh 547b0b834c3d12564c44ac134879a6dbc70e74be6eChia-chi Yeh public static Intent getIntentForConfirmation() { 557b0b834c3d12564c44ac134879a6dbc70e74be6eChia-chi Yeh Intent intent = new Intent(); 56b0e5bbb657c59584c37a489c93a3a12d13ca56b7Vinod Krishnan ComponentName componentName = ComponentName.unflattenFromString( 57b0e5bbb657c59584c37a489c93a3a12d13ca56b7Vinod Krishnan Resources.getSystem().getString( 58b0e5bbb657c59584c37a489c93a3a12d13ca56b7Vinod Krishnan com.android.internal.R.string.config_customVpnConfirmDialogComponent)); 59b0e5bbb657c59584c37a489c93a3a12d13ca56b7Vinod Krishnan intent.setClassName(componentName.getPackageName(), componentName.getClassName()); 607b0b834c3d12564c44ac134879a6dbc70e74be6eChia-chi Yeh return intent; 617b0b834c3d12564c44ac134879a6dbc70e74be6eChia-chi Yeh } 627b0b834c3d12564c44ac134879a6dbc70e74be6eChia-chi Yeh 6390b1b9f985a91fb54254705515f822b09c68ac26Jeff Davidson /** NOTE: This should only be used for legacy VPN. */ 6490b1b9f985a91fb54254705515f822b09c68ac26Jeff Davidson public static PendingIntent getIntentForStatusPanel(Context context) { 6590b1b9f985a91fb54254705515f822b09c68ac26Jeff Davidson Intent intent = new Intent(); 6690b1b9f985a91fb54254705515f822b09c68ac26Jeff Davidson intent.setClassName(DIALOGS_PACKAGE, DIALOGS_PACKAGE + ".ManageDialog"); 6790b1b9f985a91fb54254705515f822b09c68ac26Jeff Davidson intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_HISTORY | 6890b1b9f985a91fb54254705515f822b09c68ac26Jeff Davidson Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 6990b1b9f985a91fb54254705515f822b09c68ac26Jeff Davidson return PendingIntent.getActivityAsUser(context, 0, intent, 0, null, UserHandle.CURRENT); 7090b1b9f985a91fb54254705515f822b09c68ac26Jeff Davidson } 7190b1b9f985a91fb54254705515f822b09c68ac26Jeff Davidson 7205542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson public static CharSequence getVpnLabel(Context context, String packageName) 7305542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson throws NameNotFoundException { 7405542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson PackageManager pm = context.getPackageManager(); 7505542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson Intent intent = new Intent(SERVICE_INTERFACE); 7605542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson intent.setPackage(packageName); 7705542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson List<ResolveInfo> services = pm.queryIntentServices(intent, 0 /* flags */); 7805542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson if (services != null && services.size() == 1) { 7905542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson // This app contains exactly one VPN service. Call loadLabel, which will attempt to 8005542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson // load the service's label, and fall back to the app label if none is present. 8105542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson return services.get(0).loadLabel(pm); 8205542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson } else { 8305542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson return pm.getApplicationInfo(packageName, 0).loadLabel(pm); 8405542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson } 857b0b834c3d12564c44ac134879a6dbc70e74be6eChia-chi Yeh } 867b0b834c3d12564c44ac134879a6dbc70e74be6eChia-chi Yeh 87fcc1b41b663c1a0cb551344c4a16a5ad9ce36d60Chia-chi Yeh public String user; 8834e7813e962de99df9813014678ef5901227c5f1Chia-chi Yeh public String interfaze; 8934e7813e962de99df9813014678ef5901227c5f1Chia-chi Yeh public String session; 9004ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh public int mtu = -1; 914ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker public List<LinkAddress> addresses = new ArrayList<LinkAddress>(); 924ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker public List<RouteInfo> routes = new ArrayList<RouteInfo>(); 938909b10175303bd5e2ca82b7ba12cd0017050ef3Chia-chi Yeh public List<String> dnsServers; 948909b10175303bd5e2ca82b7ba12cd0017050ef3Chia-chi Yeh public List<String> searchDomains; 950784eeab28da094a87437ed454fe3dca01b1f9f2Paul Jensen public List<String> allowedApplications; 960784eeab28da094a87437ed454fe3dca01b1f9f2Paul Jensen public List<String> disallowedApplications; 9734e7813e962de99df9813014678ef5901227c5f1Chia-chi Yeh public PendingIntent configureIntent; 9804ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh public long startTime = -1; 99899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey public boolean legacy; 1006bbf39cf6b81222f32d2b66b8fa85d562e0ad71cJeff Davidson public boolean blocking; 1018cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran public boolean allowBypass; 10242065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran public boolean allowIPv4; 10342065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran public boolean allowIPv6; 104c2c0beab79a907f63e109eefe2a5aabcf2e3fd8fSreeram Ramachandran public Network[] underlyingNetworks; 10542065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran 10642065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran public void updateAllowedFamilies(InetAddress address) { 10742065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran if (address instanceof Inet4Address) { 10842065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran allowIPv4 = true; 10942065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran } else { 11042065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran allowIPv6 = true; 11142065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran } 11242065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran } 11304ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh 1144ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker public void addLegacyRoutes(String routesStr) { 1154ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker if (routesStr.trim().equals("")) { 1164ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker return; 1174ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker } 1184ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker String[] routes = routesStr.trim().split(" "); 1194ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker for (String route : routes) { 1204ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker //each route is ip/prefix 121b2053114562830369a9d060e79f0c9eff4be27e7Lorenzo Colitti RouteInfo info = new RouteInfo(new IpPrefix(route), null); 1224ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker this.routes.add(info); 12342065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran updateAllowedFamilies(info.getDestination().getAddress()); 1244ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker } 1254ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker } 1264ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker 1274ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker public void addLegacyAddresses(String addressesStr) { 1284ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker if (addressesStr.trim().equals("")) { 1294ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker return; 1304ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker } 1314ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker String[] addresses = addressesStr.trim().split(" "); 1324ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker for (String address : addresses) { 1334ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker //each address is ip/prefix 134b2053114562830369a9d060e79f0c9eff4be27e7Lorenzo Colitti LinkAddress addr = new LinkAddress(address); 1354ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker this.addresses.add(addr); 13642065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran updateAllowedFamilies(addr.getAddress()); 1374ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker } 1384ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker } 1394ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker 14004ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh @Override 14104ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh public int describeContents() { 14204ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh return 0; 14304ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh } 14404ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh 14504ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh @Override 14604ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh public void writeToParcel(Parcel out, int flags) { 147fcc1b41b663c1a0cb551344c4a16a5ad9ce36d60Chia-chi Yeh out.writeString(user); 14834e7813e962de99df9813014678ef5901227c5f1Chia-chi Yeh out.writeString(interfaze); 14934e7813e962de99df9813014678ef5901227c5f1Chia-chi Yeh out.writeString(session); 15004ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh out.writeInt(mtu); 1514ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker out.writeTypedList(addresses); 1524ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker out.writeTypedList(routes); 1538909b10175303bd5e2ca82b7ba12cd0017050ef3Chia-chi Yeh out.writeStringList(dnsServers); 1548909b10175303bd5e2ca82b7ba12cd0017050ef3Chia-chi Yeh out.writeStringList(searchDomains); 1550784eeab28da094a87437ed454fe3dca01b1f9f2Paul Jensen out.writeStringList(allowedApplications); 1560784eeab28da094a87437ed454fe3dca01b1f9f2Paul Jensen out.writeStringList(disallowedApplications); 15734e7813e962de99df9813014678ef5901227c5f1Chia-chi Yeh out.writeParcelable(configureIntent, flags); 15804ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh out.writeLong(startTime); 159899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey out.writeInt(legacy ? 1 : 0); 1606bbf39cf6b81222f32d2b66b8fa85d562e0ad71cJeff Davidson out.writeInt(blocking ? 1 : 0); 1618cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran out.writeInt(allowBypass ? 1 : 0); 16242065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran out.writeInt(allowIPv4 ? 1 : 0); 16342065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran out.writeInt(allowIPv6 ? 1 : 0); 164c2c0beab79a907f63e109eefe2a5aabcf2e3fd8fSreeram Ramachandran out.writeTypedArray(underlyingNetworks, flags); 16504ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh } 16604ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh 16704ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh public static final Parcelable.Creator<VpnConfig> CREATOR = 16804ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh new Parcelable.Creator<VpnConfig>() { 16904ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh @Override 17004ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh public VpnConfig createFromParcel(Parcel in) { 17104ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh VpnConfig config = new VpnConfig(); 172fcc1b41b663c1a0cb551344c4a16a5ad9ce36d60Chia-chi Yeh config.user = in.readString(); 17334e7813e962de99df9813014678ef5901227c5f1Chia-chi Yeh config.interfaze = in.readString(); 17434e7813e962de99df9813014678ef5901227c5f1Chia-chi Yeh config.session = in.readString(); 17504ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh config.mtu = in.readInt(); 1764ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker in.readTypedList(config.addresses, LinkAddress.CREATOR); 1774ca19e8377f33e8a80684fb4ee67f5a4bdc9ea76Chad Brubaker in.readTypedList(config.routes, RouteInfo.CREATOR); 1788909b10175303bd5e2ca82b7ba12cd0017050ef3Chia-chi Yeh config.dnsServers = in.createStringArrayList(); 1798909b10175303bd5e2ca82b7ba12cd0017050ef3Chia-chi Yeh config.searchDomains = in.createStringArrayList(); 1800784eeab28da094a87437ed454fe3dca01b1f9f2Paul Jensen config.allowedApplications = in.createStringArrayList(); 1810784eeab28da094a87437ed454fe3dca01b1f9f2Paul Jensen config.disallowedApplications = in.createStringArrayList(); 18234e7813e962de99df9813014678ef5901227c5f1Chia-chi Yeh config.configureIntent = in.readParcelable(null); 18304ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh config.startTime = in.readLong(); 184899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey config.legacy = in.readInt() != 0; 1856bbf39cf6b81222f32d2b66b8fa85d562e0ad71cJeff Davidson config.blocking = in.readInt() != 0; 1868cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran config.allowBypass = in.readInt() != 0; 18742065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran config.allowIPv4 = in.readInt() != 0; 18842065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran config.allowIPv6 = in.readInt() != 0; 189c2c0beab79a907f63e109eefe2a5aabcf2e3fd8fSreeram Ramachandran config.underlyingNetworks = in.createTypedArray(Network.CREATOR); 19004ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh return config; 19104ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh } 19204ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh 19304ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh @Override 19404ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh public VpnConfig[] newArray(int size) { 19504ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh return new VpnConfig[size]; 19604ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh } 19704ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh }; 19804ba25c418bc4538e9dc0f047cfb9608d358f679Chia-chi Yeh} 199