1310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh/*
2310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * Copyright (C) 2011 The Android Open Source Project
3310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh *
4310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * Licensed under the Apache License, Version 2.0 (the "License");
5310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * you may not use this file except in compliance with the License.
6310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * You may obtain a copy of the License at
7310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh *
8310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh *      http://www.apache.org/licenses/LICENSE-2.0
9310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh *
10310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * Unless required by applicable law or agreed to in writing, software
11310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * distributed under the License is distributed on an "AS IS" BASIS,
12310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * See the License for the specific language governing permissions and
14310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * limitations under the License.
15310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh */
16310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
17310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehpackage com.android.settings.vpn2;
18310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
19310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehimport java.nio.charset.Charsets;
20310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
21310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh/**
22310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * Parcel-like entity class for VPN profiles. To keep things simple, all
23310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * fields are package private. Methods are provided for serialization, so
24310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * storage can be implemented easily. Two rules are set for this class.
25310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * First, all fields must be kept non-null. Second, always make a copy
26310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh * using clone() before modifying.
27310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh */
28310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yehclass VpnProfile implements Cloneable {
29310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    // Match these constants with R.array.vpn_types.
30310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    static final int TYPE_PPTP = 0;
31310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    static final int TYPE_L2TP_IPSEC_PSK = 1;
32310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    static final int TYPE_L2TP_IPSEC_RSA = 2;
33310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    static final int TYPE_IPSEC_XAUTH_PSK = 3;
34310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    static final int TYPE_IPSEC_XAUTH_RSA = 4;
35310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    static final int TYPE_IPSEC_HYBRID_RSA = 5;
36310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    static final int TYPE_MAX = 5;
37310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
38310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    // Entity fields.
39310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    final String key;           // -1
40310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    String name = "";           // 0
41310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    int type = TYPE_PPTP;       // 1
42310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    String server = "";         // 2
43310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    String username = "";       // 3
44310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    String password = "";       // 4
452fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh    String dnsServers = "";     // 5
462fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh    String searchDomains = "";  // 6
472fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh    String routes = "";         // 7
480fe97ebcd86905829f6527d7198536d0423e1417Chia-chi Yeh    boolean mppe = true;        // 8
492fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh    String l2tpSecret = "";     // 9
502fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh    String ipsecIdentifier = "";// 10
512fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh    String ipsecSecret = "";    // 11
522fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh    String ipsecUserCert = "";  // 12
532fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh    String ipsecCaCert = "";    // 13
54f5317a151bef8d93f7a640fe46c6dcde6baa258dChia-chi Yeh    String ipsecServerCert = "";// 14
55310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
56310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    // Helper fields.
57310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    boolean saveLogin = false;
58310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
59310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    VpnProfile(String key) {
60310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        this.key = key;
61310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    }
62310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
63310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    static VpnProfile decode(String key, byte[] value) {
64310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        try {
65310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            if (key == null) {
66310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                return null;
67310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            }
68310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
69310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            String[] values = new String(value, Charsets.UTF_8).split("\0", -1);
70f5317a151bef8d93f7a640fe46c6dcde6baa258dChia-chi Yeh            // There can be 14 or 15 values in ICS MR1.
71f5317a151bef8d93f7a640fe46c6dcde6baa258dChia-chi Yeh            if (values.length < 14 || values.length > 15) {
72310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                return null;
73310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            }
74310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
75310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            VpnProfile profile = new VpnProfile(key);
76310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            profile.name = values[0];
77310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            profile.type = Integer.valueOf(values[1]);
78310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            if (profile.type < 0 || profile.type > TYPE_MAX) {
79310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh                return null;
80310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            }
81310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            profile.server = values[2];
82310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            profile.username = values[3];
83310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            profile.password = values[4];
842fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh            profile.dnsServers = values[5];
852fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh            profile.searchDomains = values[6];
862fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh            profile.routes = values[7];
872fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh            profile.mppe = Boolean.valueOf(values[8]);
882fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh            profile.l2tpSecret = values[9];
892fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh            profile.ipsecIdentifier = values[10];
902fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh            profile.ipsecSecret = values[11];
912fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh            profile.ipsecUserCert = values[12];
922fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh            profile.ipsecCaCert = values[13];
93f5317a151bef8d93f7a640fe46c6dcde6baa258dChia-chi Yeh            profile.ipsecServerCert = (values.length > 14) ? values[14] : "";
94310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
95310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            profile.saveLogin = !profile.username.isEmpty() || !profile.password.isEmpty();
96310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            return profile;
97310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        } catch (Exception e) {
98310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh            // ignore
99310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        }
100310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        return null;
101310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    }
102310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh
103310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    byte[] encode() {
104310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        StringBuilder builder = new StringBuilder(name);
105310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        builder.append('\0').append(type);
106310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        builder.append('\0').append(server);
107310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        builder.append('\0').append(saveLogin ? username : "");
108310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        builder.append('\0').append(saveLogin ? password : "");
1092fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh        builder.append('\0').append(dnsServers);
1102fa9eade41144094ef743cc5a3faf4f1ce7209afChia-chi Yeh        builder.append('\0').append(searchDomains);
111310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        builder.append('\0').append(routes);
112310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        builder.append('\0').append(mppe);
113310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        builder.append('\0').append(l2tpSecret);
114310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        builder.append('\0').append(ipsecIdentifier);
115310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        builder.append('\0').append(ipsecSecret);
116310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        builder.append('\0').append(ipsecUserCert);
117310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        builder.append('\0').append(ipsecCaCert);
118f5317a151bef8d93f7a640fe46c6dcde6baa258dChia-chi Yeh        builder.append('\0').append(ipsecServerCert);
119310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh        return builder.toString().getBytes(Charsets.UTF_8);
120310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh    }
121310d619acba5cd1f7c8a55aa7906ed4f1c011bd8Chia-chi Yeh}
122