package com.lechucksoftware.proxy.proxysettings.test; import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.AssetManager; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiEnterpriseConfig; import android.provider.Telephony; import android.text.TextUtils; import com.lechucksoftware.proxy.proxysettings.App; import com.lechucksoftware.proxy.proxysettings.constants.CodeNames; import com.lechucksoftware.proxy.proxysettings.constants.Constants; import com.lechucksoftware.proxy.proxysettings.db.PacEntity; import com.lechucksoftware.proxy.proxysettings.db.ProxyEntity; import com.lechucksoftware.proxy.proxysettings.db.TagEntity; import com.lechucksoftware.proxy.proxysettings.utils.UIUtils; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List; import java.util.Random; import be.shouldit.proxy.lib.APL; import be.shouldit.proxy.lib.ProxyStatusItem; import be.shouldit.proxy.lib.WiFiApConfig; import be.shouldit.proxy.lib.constants.APLReflectionConstants; import be.shouldit.proxy.lib.enums.SecurityType; import be.shouldit.proxy.lib.reflection.android.ProxySetting; import be.shouldit.proxy.lib.utils.ProxyUtils; import timber.log.Timber; /** * Created by marco on 10/10/13. */ public class TestUtils { // "0123456789" + "ABCDE...Z" private static final String ALPHA_NUM = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "; private static final int MIN_LENGHT = 3; private static final int MAX_LENGHT = 15; private static final int MIN_TAGS = 2; private static final int MAX_TAGS = 6; private static final int MAX_EXCLUSION = 10; private static final String TAG = TestUtils.class.getSimpleName(); public static String getRandomExclusionList() { Random r = new Random(); int maxEx = r.nextInt(MAX_EXCLUSION); StringBuilder sb = new StringBuilder(); for (int i = 0; i < maxEx; i++) { if (i != 0) sb.append(","); sb.append(getRandomIP()); } return sb.toString(); } public static String getRandomIP() { Random r = new Random(); return r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256); } public static int getRandomPort() { Random r = new Random(); return r.nextInt(65536); } public static String getRandomTag() { Random r = new Random(); int len = r.nextInt(MAX_LENGHT) + MIN_LENGHT; StringBuilder sb = new StringBuilder(); for (int i = 0; i < len; i++) { int charpos = r.nextInt(ALPHA_NUM.length()); sb.append(ALPHA_NUM.charAt(charpos)); } return sb.toString(); } public static List<ProxyEntity> readProxyExamples(Context ctx) { String line = null; List<ProxyEntity> proxies = new ArrayList<ProxyEntity>(); try { AssetManager am = ctx.getAssets(); if (am != null) { InputStream inputStream = am.open("proxy_examples.csv"); if (inputStream != null) { BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); while ((line = br.readLine()) != null) { if (line.contains(":")) { ProxyEntity p = new ProxyEntity(); String[] host_port = line.split(":"); p.setHost(host_port[0]); p.setPort(Integer.parseInt(host_port[1])); proxies.add(p); } } } } } catch (IOException e) { Timber.e("No proxy examples found"); return null; } catch (Exception e) { Timber.e("Generic exception during read of proxy examples: " + e.toString()); return null; } return proxies; } public static ProxyEntity createRandomHTTPProxy() { ProxyEntity pd = new ProxyEntity(); pd.setHost(getRandomIP()); pd.setPort(getRandomPort()); pd.setExclusion(getRandomExclusionList()); Random r = new Random(); int tagNum = r.nextInt(MAX_TAGS) + MIN_TAGS; for (int i = 0; i < tagNum; i++) { TagEntity tag = App.getDBManager().getRandomTag(); if (tag != null) { pd.addTag(tag); } } return pd; } public static PacEntity createRandomPACProxy() { PacEntity pacEntity = new PacEntity(); pacEntity.setPacUrlFile("http://" + getRandomIP() + "/proxy.pac"); return pacEntity; } public static ProxyEntity getModifiedExistingProxy() { ProxyEntity pd = App.getDBManager().getRandomProxy(); if (pd != null) { Random r = new Random(); int typeOfModification = r.nextInt(5); switch (typeOfModification) { case 0: pd.setHost(getRandomIP()); break; case 1: pd.setPort(getRandomPort()); break; case 2: pd.setExclusion(getRandomExclusionList()); break; case 3: TagEntity tag = App.getDBManager().getRandomTag(); if (tag != null) { pd.addTag(tag); } break; case 4: if (pd.getTags().size() > 0) { TagEntity tagToRemove = pd.getTags().get(0); pd.removeTag(tagToRemove); } break; } } return pd; } public static void addRandomProxy() { ProxyEntity pd = createRandomHTTPProxy(); ProxyEntity savedProxy = App.getDBManager().upsertProxy(pd); PacEntity pac = createRandomPACProxy(); PacEntity savedPac = App.getDBManager().upsertPac(pac); } public static void addProxyExamples(Context ctx) { List<ProxyEntity> proxies = readProxyExamples(ctx); for (ProxyEntity p : proxies) { App.getDBManager().upsertProxy(p); } } public static void updateProxy() { ProxyEntity pd = getModifiedExistingProxy(); if (pd != null) { App.getDBManager().updateProxy(pd.getId(), pd); } } public static void addTags() { TagEntity tag = new TagEntity(); Random r = new Random(); tag.setTag(getRandomTag()); tag.setTagColor(r.nextInt(4) + 1); App.getDBManager().upsertTag(tag); } // public static void assignProxies(WiFiApConfig conf, ProxyEntity proxy) throws Exception // { // ProxySetting originalSettings = conf.getProxySetting(); // ProxyEntity originalData = new ProxyEntity(); // // if (originalSettings == ProxySetting.STATIC) // { // originalData.host = conf.getProxyHost(); // originalData.port = conf.getProxyPort(); // originalData.exclusion = conf.getProxyExclusionList(); // } // // conf.setProxySetting(ProxySetting.STATIC); // conf.setProxyHost(proxy.host); // conf.setProxyPort(proxy.port); // conf.setProxyExclusionString(proxy.exclusion); // // conf.writeConfigurationToDevice(); // // Thread.sleep(5000); // // for (int i = 0; i < 20; i++) // { // Thread.sleep(1000); // // WiFiApConfig updatedConf = App.getWifiNetworksManager().getConfiguration(conf.id); // // if (updatedConf.getProxySetting() == ProxySetting.STATIC && // updatedConf.getProxyHost() == proxy.host && // updatedConf.getProxyPort() == proxy.port && // updatedConf.getProxyExclusionList() == proxy.exclusion) // { // LogWrapper.d(TAG, updatedConf.toShortString()); // } // else // { // throw new Exception("ERROR ASSIGNING PROXY"); // } // } // // conf.setProxySetting(ProxySetting.NONE); // conf.setProxyHost(null); // conf.setProxyPort(null); // conf.setProxyExclusionString(null); // conf.writeConfigurationToDevice(); // // Thread.sleep(5000); // // for (int i = 0; i < 20; i++) // { // Thread.sleep(1000); // // WiFiApConfig updatedConf = App.getWifiNetworksManager().getConfiguration(conf.id); // // if (updatedConf.getProxySetting() == ProxySetting.NONE && // (updatedConf.getProxyHost() == null || updatedConf.getProxyHost() == "") && // (updatedConf.getProxyPort() == null || updatedConf.getProxyPort() == -1) && // (updatedConf.getProxyExclusionList() == null || updatedConf.getProxyExclusionList() == "")) // { // LogWrapper.d(TAG, updatedConf.toShortString()); // } // else // { // throw new Exception("ERROR ASSIGNING PROXY"); // } // } // // conf.setProxySetting(originalSettings); // if (originalSettings == ProxySetting.STATIC) // { // conf.setProxyHost(originalData.host); // conf.setProxyPort(originalData.port); // conf.setProxyExclusionString(originalData.exclusion); // } // conf.writeConfigurationToDevice(); // Thread.sleep(5000); // } public static void resetPreferences(Context ctx) { SharedPreferences preferences = ctx.getSharedPreferences(Constants.PREFERENCES_FILENAME, Context.MODE_MULTI_PROCESS); SharedPreferences.Editor editor = preferences.edit(); editor.clear(); editor.commit(); App.getAppStats().updateInstallationDetails(); } public static void testValidation() { ProxyStatusItem result = ProxyUtils.isProxyValidExclusionAddress("shouldit.it"); result = ProxyUtils.isProxyValidExclusionAddress("localhost"); result = ProxyUtils.isProxyValidExclusionAddress("DEV-*"); result = ProxyUtils.isProxyValidExclusionAddress("*.local"); result = ProxyUtils.isProxyValidExclusionAddress("*.shouldit.it"); } public static void clearProxyForAllAP(Context ctx) { List<WiFiApConfig> configsToSave = new ArrayList<WiFiApConfig>(); for (WiFiApConfig configuration : App.getWifiNetworksManager().getSortedWifiApConfigsList()) { if (configuration.getSecurityType() == SecurityType.SECURITY_EAP) { // skip 802.1x security networks continue; } configuration.setProxySetting(ProxySetting.NONE); configuration.setProxyHost(""); configuration.setProxyPort(0); configuration.setProxyExclusionString(""); configsToSave.add(configuration); } try { App.getWifiNetworksManager().addSavingOperation(configsToSave); } catch (Exception e) { Timber.e(e, "Exception clearing proxy for all Wi-Fi AP"); } } public static void setProxyForAllAP(Context ctx) { ProxyEntity p; if (App.getDBManager().getProxiesCount() > 0) { p = App.getDBManager().getRandomProxy(); } else { p = createRandomHTTPProxy(); } List<WiFiApConfig> configsToSave = new ArrayList<WiFiApConfig>(); for (WiFiApConfig configuration : App.getWifiNetworksManager().getSortedWifiApConfigsList()) { if (configuration.getSecurityType() == SecurityType.SECURITY_EAP) { // skip 802.1x security networks continue; } configuration.setProxySetting(ProxySetting.STATIC); configuration.setProxyHost(p.getHost()); configuration.setProxyPort(p.getPort()); configuration.setProxyExclusionString(p.getExclusion()); configsToSave.add(configuration); } try { App.getWifiNetworksManager().addSavingOperation(configsToSave); } catch (Exception e) { Timber.e(e, "Exception writing configuration to device"); } } @TargetApi(19) public static void testAPN(Context ctx) { try { ctx.startActivity(new Intent(Intent.ACTION_INSERT, Telephony.Carriers.CONTENT_URI)); } catch (Exception e) { Timber.e(e, "Exception testing APN activity"); } } public static void testSerialization() { String s = null; WiFiApConfig conf = App.getWifiNetworksManager().getCachedConfiguration(); ObjectOutputStream out = null; if (conf != null) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); out = new ObjectOutputStream(baos); out.writeObject(conf); out.close(); s = new String(baos.toByteArray()); if (TextUtils.isEmpty(s)) { Timber.e("Not serialized correctly"); } else { Timber.d(s); } } catch (IOException ex) { ex.printStackTrace(); } } } public static String createFakeWifiNetwork(Context ctx) { WifiConfiguration wc = prepareFakeWifiNetwork(); int res = APL.getWifiManager().addNetwork(wc); Timber.d("add Network returned " + res); boolean es = APL.getWifiManager().saveConfiguration(); Timber.d("saveConfiguration returned " + es); return wc.SSID; } public static WifiConfiguration prepareFakeWifiNetwork() { WifiConfiguration wc = new WifiConfiguration(); Random r = new Random(); String ssid = UIUtils.getRandomCodeName().name() + String.valueOf(r.nextInt(10)); String password = "\"aaabbb1234567\""; //This is the WEP Password int securityType = r.nextInt(3); switch (securityType) { case 0: setupNOSECWifiConfig(wc, ssid, password); break; case 1: setupWEPWifiConfig(wc, ssid, password); break; case 2: default: setupWPAWifiConfig(wc, ssid, password); break; // case 3: // setup802xWifiConfig(wc, ssid, password); // break; } return wc; } public static int deleteFakeWifiNetworks(Context ctx) { int removedNetworks = 0; List<WifiConfiguration> configurations = APL.getWifiManager().getConfiguredNetworks(); List<Integer> networksToDelete = new ArrayList<Integer>(); if (configurations != null && configurations.size() > 0) { for (WifiConfiguration conf : configurations) { String SSID = ProxyUtils.cleanUpSSID(conf.SSID); for (CodeNames codename : CodeNames.values()) { if (SSID.contains(codename.toString())) { networksToDelete.add(conf.networkId); } } } } for (int i = 0; i < networksToDelete.size(); i++) { int networkId = networksToDelete.get(i); boolean res = APL.getWifiManager().removeNetwork(networkId); Timber.d("removeNetwork returned " + res); boolean es = APL.getWifiManager().saveConfiguration(); Timber.d("saveConfiguration returned " + es); removedNetworks++; try { Thread.sleep(500); } catch (InterruptedException e) { Timber.e(e, "Exception during sleep"); } } return removedNetworks; } @TargetApi(18) private static void setup802xWifiConfig(WifiConfiguration config, String ssid, String password) { config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X); config.enterpriseConfig = new WifiEnterpriseConfig(); int eapMethod = WifiEnterpriseConfig.Eap.PEAP; int phase2Method = WifiEnterpriseConfig.Phase2.GTC; config.enterpriseConfig.setEapMethod(eapMethod); switch (eapMethod) { case WifiEnterpriseConfig.Eap.PEAP: // PEAP supports limited phase2 values // Map the index from the PHASE2_PEAP_ADAPTER to the one used // by the API which has the full list of PEAP methods. switch (phase2Method) { case APLReflectionConstants.WIFI_PEAP_PHASE2_NONE: config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE); break; case APLReflectionConstants.WIFI_PEAP_PHASE2_MSCHAPV2: config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.MSCHAPV2); break; case APLReflectionConstants.WIFI_PEAP_PHASE2_GTC: config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC); break; default: Timber.e("Unknown phase2 method" + phase2Method); break; } break; default: // The default index from PHASE2_FULL_ADAPTER maps to the API config.enterpriseConfig.setPhase2Method(phase2Method); break; } String caCert = ""; // config.enterpriseConfig.setCaCertificateAlias(caCert); // String clientCert = (String) mEapUserCertSpinner.getSelectedItem(); // if (clientCert.equals(unspecifiedCert)) clientCert = ""; // config.enterpriseConfig.setClientCertificateAlias(clientCert); // config.enterpriseConfig.setIdentity(mEapIdentityView.getText().toString()); // config.enterpriseConfig.setAnonymousIdentity(mEapAnonymousView.getText().toString()); // if (mPasswordView.isShown()) // { // // For security reasons, a previous password is not displayed to user. // // Update only if it has been changed. // if (mPasswordView.length() > 0) // { config.enterpriseConfig.setPassword(password.toString()); // } // } // else // { // // clear password // config.enterpriseConfig.setPassword(mPasswordView.getText().toString()); // } } private static void setupNOSECWifiConfig(WifiConfiguration wc, String ssid, String password) { wc.SSID = String.format("\"%s\"", ssid); wc.BSSID = randomMACAddress(); wc.priority = 40; wc.status = WifiConfiguration.Status.DISABLED; wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); } public static void setupWEPWifiConfig(WifiConfiguration wc, String ssid, String password) { wc.SSID = String.format("\"%s\"", ssid); wc.BSSID = randomMACAddress(); wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); int length = password.length(); // WEP-40, WEP-104, and 256-bit WEP (WEP-232?) if ((length == 10 || length == 26 || length == 58) && password.matches("[0-9A-Fa-f]*")) { wc.wepKeys[0] = password; } else { wc.wepKeys[0] = '"' + password + '"'; } // wc.hiddenSSID = true; wc.status = WifiConfiguration.Status.DISABLED; wc.priority = 40; // wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); // wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); // wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); // wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); // wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); // wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); // wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); // wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); // // wc.wepKeys[0] = password; // wc.wepTxKeyIndex = 0; } public static void setupWPAWifiConfig(WifiConfiguration wc, String ssid, String password) { wc.SSID = String.format("\"%s\"", ssid); wc.BSSID = randomMACAddress(); // wc.hiddenSSID = true; wc.status = WifiConfiguration.Status.DISABLED; wc.priority = 40; wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); if (password.matches("[0-9A-Fa-f]{64}")) { wc.preSharedKey = password; } else { wc.preSharedKey = '"' + password + '"'; } // wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); // // wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); // wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); // wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); // wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); // // wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); // wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); // wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); // wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // wc.preSharedKey = password; // wc.wepTxKeyIndex = 0; } private static String randomMACAddress() { Random rand = new Random(); byte[] macAddr = new byte[6]; rand.nextBytes(macAddr); macAddr[0] = (byte) (macAddr[0] & (byte) 254); //zeroing last 2 bytes to make it unicast and locally adminstrated StringBuilder sb = new StringBuilder(18); for (byte b : macAddr) { if (sb.length() > 0) sb.append(":"); sb.append(String.format("%02x", b)); } return sb.toString(); } }