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