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