From 65ca77c3cbb5b8bece96e16ff4cd5040ad7884a3 Mon Sep 17 00:00:00 2001 From: Adithya Abraham Philip Date: Thu, 11 Jun 2015 01:34:35 +0530 Subject: orbot dialog fragments added --- .../keychain/util/ParcelableProxy.java | 5 + .../keychain/util/Preferences.java | 24 +-- .../keychain/util/orbot/OrbotHelper.java | 155 +++++++++--------- .../keychain/util/orbot/TorServiceUtils.java | 175 +++++++-------------- 4 files changed, 142 insertions(+), 217 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableProxy.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableProxy.java index e5bb1deb4..601547fa9 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableProxy.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableProxy.java @@ -36,6 +36,9 @@ public class ParcelableProxy implements Parcelable { public ParcelableProxy(String hostName, int port, Proxy.Type type) { mProxyHost = hostName; + + if (hostName == null) return; // represents a null proxy + mProxyPort = port; switch (type) { @@ -51,6 +54,8 @@ public class ParcelableProxy implements Parcelable { } public Proxy getProxy() { + if(mProxyHost == null) return null; + Proxy.Type type = null; switch (mProxyType) { case TYPE_HTTP: diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java index 5650a7deb..f54eac867 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java @@ -23,12 +23,10 @@ import android.content.SharedPreferences; import android.content.res.Resources; import android.preference.PreferenceManager; -import info.guardianproject.onionkit.ui.OrbotHelper; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants.Pref; import org.sufficientlysecure.keychain.R; -import java.net.InetSocketAddress; import java.net.Proxy; import java.util.ArrayList; import java.util.Arrays; @@ -65,7 +63,7 @@ public class Preferences { updateSharedPreferences(context); } - public void setPreferenceManagerFileAndMode(PreferenceManager manager) { + public static void setPreferenceManagerFileAndMode(PreferenceManager manager) { manager.setSharedPreferencesName(PREF_FILE_NAME); manager.setSharedPreferencesMode(PREF_FILE_MODE); } @@ -249,32 +247,14 @@ public class Preferences { return mSharedPreferences.getBoolean(Constants.Pref.USE_NORMAL_PROXY, false); } - public void setUseNormalProxy(boolean use) { - SharedPreferences.Editor editor = mSharedPreferences.edit(); - editor.putBoolean(Constants.Pref.USE_NORMAL_PROXY, use); - editor.commit(); - } - public boolean getUseTorProxy() { return mSharedPreferences.getBoolean(Constants.Pref.USE_TOR_PROXY, false); } - public void setUseTorProxy(boolean use) { - SharedPreferences.Editor editor = mSharedPreferences.edit(); - editor.putBoolean(Constants.Pref.USE_TOR_PROXY, use); - editor.commit(); - } - public String getProxyHost() { return mSharedPreferences.getString(Constants.Pref.PROXY_HOST, null); } - public void setProxyHost(String host) { - SharedPreferences.Editor editor = mSharedPreferences.edit(); - editor.putString(Constants.Pref.PROXY_HOST, host); - editor.commit(); - } - /** * we store port as String for easy interfacing with EditTextPreference, but return it as an integer * @@ -338,7 +318,7 @@ public class Preferences { public ProxyPrefs(boolean torEnabled, boolean normalPorxyEnabled, String hostName, int port, Proxy.Type type) { this.torEnabled = torEnabled; this.normalPorxyEnabled = normalPorxyEnabled; - if(!torEnabled && !normalPorxyEnabled) this.parcelableProxy = null; + if(!torEnabled && !normalPorxyEnabled) this.parcelableProxy = new ParcelableProxy(null, -1, null); else this.parcelableProxy = new ParcelableProxy(hostName, port, type); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/orbot/OrbotHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/orbot/OrbotHelper.java index d9566be4a..fb016f9e6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/orbot/OrbotHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/orbot/OrbotHelper.java @@ -1,5 +1,53 @@ +/* This is the license for Orlib, a free software project to + provide anonymity on the Internet from a Google Android smartphone. -package info.guardianproject.onionkit.ui; + For more information about Orlib, see https://guardianproject.info/ + + If you got this file as a part of a larger bundle, there may be other + license terms that you should be aware of. + =============================================================================== + Orlib is distributed under this license (aka the 3-clause BSD license) + + Copyright (c) 2009-2010, Nathan Freitas, The Guardian Project + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + * Neither the names of the copyright owners nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ***** + Orlib contains a binary distribution of the JSocks library: + http://code.google.com/p/jsocks-mirror/ + which is licensed under the GNU Lesser General Public License: + http://www.gnu.org/licenses/lgpl.html + + ***** +*/ + +package org.sufficientlysecure.keychain.util.orbot; import android.app.Activity; import android.app.AlertDialog; @@ -7,42 +55,37 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; -import android.net.Uri; - -import info.guardianproject.onionkit.R; - +import android.os.Messenger; +import android.support.v4.app.DialogFragment; +import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.ui.dialog.InstallDialogFragment; +import org.sufficientlysecure.keychain.ui.dialog.OrbotStartDialogFragment; +import org.sufficientlysecure.keychain.ui.dialog.PreferenceInstallDialogFragment; + +/** + * This class is taken from the NetCipher library: https://github.com/guardianproject/NetCipher/ + */ public class OrbotHelper { - private final static int REQUEST_CODE_STATUS = 100; - public final static String ORBOT_PACKAGE_NAME = "org.torproject.android"; public final static String TOR_BIN_PATH = "/data/data/org.torproject.android/app_bin/tor"; public final static String ACTION_START_TOR = "org.torproject.android.START_TOR"; - public final static String ACTION_REQUEST_HS = "org.torproject.android.REQUEST_HS_PORT"; - public final static int HS_REQUEST_CODE = 9999; - - private Context mContext = null; - - public OrbotHelper(Context context) - { - mContext = context; - } - public boolean isOrbotRunning() + public static boolean isOrbotRunning() { int procId = TorServiceUtils.findProcessId(TOR_BIN_PATH); return (procId != -1); } - public boolean isOrbotInstalled() + public static boolean isOrbotInstalled(Context context) { - return isAppInstalled(ORBOT_PACKAGE_NAME); + return isAppInstalled(ORBOT_PACKAGE_NAME, context); } - private boolean isAppInstalled(String uri) { - PackageManager pm = mContext.getPackageManager(); + private static boolean isAppInstalled(String uri, Context context) { + PackageManager pm = context.getPackageManager(); boolean installed = false; try { pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES); @@ -53,66 +96,32 @@ public class OrbotHelper { return installed; } - public void promptToInstall(Activity activity) + /** + * hack to get around teh fact that PreferenceActivity still supports only android.app.DialogFragment + * + * @return + */ + public static android.app.DialogFragment getPreferenceInstallDialogFragment() { - String uriMarket = activity.getString(R.string.market_orbot); - // show dialog - install from market, f-droid or direct APK - showDownloadDialog(activity, activity.getString(R.string.install_orbot_), - activity.getString(R.string.you_must_have_orbot), - activity.getString(R.string.yes), activity.getString(R.string.no), uriMarket); + return PreferenceInstallDialogFragment.newInstance(R.string.orbot_install_dialog_title, + R.string.orbot_install_dialog_content, ORBOT_PACKAGE_NAME); } - private static AlertDialog showDownloadDialog(final Activity activity, - CharSequence stringTitle, CharSequence stringMessage, CharSequence stringButtonYes, - CharSequence stringButtonNo, final String uriString) { - AlertDialog.Builder downloadDialog = new AlertDialog.Builder(activity); - downloadDialog.setTitle(stringTitle); - downloadDialog.setMessage(stringMessage); - downloadDialog.setPositiveButton(stringButtonYes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - Uri uri = Uri.parse(uriString); - Intent intent = new Intent(Intent.ACTION_VIEW, uri); - activity.startActivity(intent); - } - }); - downloadDialog.setNegativeButton(stringButtonNo, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - } - }); - return downloadDialog.show(); - } - - public void requestOrbotStart(final Activity activity) + public static DialogFragment getInstallDialogFragment() { - - AlertDialog.Builder downloadDialog = new AlertDialog.Builder(activity); - downloadDialog.setTitle(R.string.start_orbot_); - downloadDialog - .setMessage(R.string.orbot_doesn_t_appear_to_be_running_would_you_like_to_start_it_up_and_connect_to_tor_); - downloadDialog.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - activity.startActivityForResult(getOrbotStartIntent(), 1); - } - }); - downloadDialog.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - } - }); - downloadDialog.show(); - + return InstallDialogFragment.newInstance(R.string.orbot_install_dialog_title, + R.string.orbot_install_dialog_content, ORBOT_PACKAGE_NAME); } - public void requestHiddenServiceOnPort(Activity activity, int port) + public static DialogFragment getInstallDialogFragmentWithThirdButton(Messenger messenger, int middleButton) { - Intent intent = new Intent(ACTION_REQUEST_HS); - intent.setPackage(ORBOT_PACKAGE_NAME); - intent.putExtra("hs_port", port); + return InstallDialogFragment.newInstance(messenger, R.string.orbot_install_dialog_title, + R.string.orbot_install_dialog_content, ORBOT_PACKAGE_NAME, middleButton, true); + } - activity.startActivityForResult(intent, HS_REQUEST_CODE); + public static DialogFragment getOrbotStartDialogFragment(Messenger messenger, int middleButton) { + return OrbotStartDialogFragment.newInstance(messenger, R.string.orbot_start_dialog_title, R.string.orbot_start_dialog_content, + middleButton); } public static Intent getOrbotStartIntent() { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/orbot/TorServiceUtils.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/orbot/TorServiceUtils.java index 80a812344..127e9d43f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/orbot/TorServiceUtils.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/orbot/TorServiceUtils.java @@ -1,85 +1,72 @@ -/* Copyright (c) 2009, Nathan Freitas, Orbot / The Guardian Project - http://openideals.com/guardian */ -/* See LICENSE for licensing information */ +/* This is the license for Orlib, a free software project to + provide anonymity on the Internet from a Google Android smartphone. -package info.guardianproject.onionkit.ui; + For more information about Orlib, see https://guardianproject.info/ -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.net.URLEncoder; -import java.util.StringTokenizer; + If you got this file as a part of a larger bundle, there may be other + license terms that you should be aware of. + =============================================================================== + Orlib is distributed under this license (aka the 3-clause BSD license) -import android.util.Log; + Copyright (c) 2009-2010, Nathan Freitas, The Guardian Project -public class TorServiceUtils { + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: - private final static String TAG = "TorUtils"; - // various console cmds - public final static String SHELL_CMD_CHMOD = "chmod"; - public final static String SHELL_CMD_KILL = "kill -9"; - public final static String SHELL_CMD_RM = "rm"; - public final static String SHELL_CMD_PS = "ps"; - public final static String SHELL_CMD_PIDOF = "pidof"; + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. - public final static String CHMOD_EXE_VALUE = "700"; + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. - public static boolean isRootPossible() - { + * Neither the names of the copyright owners nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. - StringBuilder log = new StringBuilder(); + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - try { + ***** + Orlib contains a binary distribution of the JSocks library: + http://code.google.com/p/jsocks-mirror/ + which is licensed under the GNU Lesser General Public License: + http://www.gnu.org/licenses/lgpl.html - // Check if Superuser.apk exists - File fileSU = new File("/system/app/Superuser.apk"); - if (fileSU.exists()) - return true; + ***** +*/ - fileSU = new File("/system/app/superuser.apk"); - if (fileSU.exists()) - return true; +package org.sufficientlysecure.keychain.util.orbot; - fileSU = new File("/system/bin/su"); - if (fileSU.exists()) - { - String[] cmd = { - "su" - }; - int exitCode = TorServiceUtils.doShellCommand(cmd, log, false, true); - if (exitCode != 0) - return false; - else - return true; - } - - // Check for 'su' binary - String[] cmd = { - "which su" - }; - int exitCode = TorServiceUtils.doShellCommand(cmd, log, false, true); - - if (exitCode == 0) { - Log.d(TAG, "root exists, but not sure about permissions"); - return true; - - } +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStreamReader; +import java.net.URLEncoder; +import java.util.StringTokenizer; - } catch (IOException e) { - // this means that there is no root to be had (normally) so we won't - // log anything - Log.e(TAG, "Error checking for root access", e); +import android.util.Log; - } catch (Exception e) { - Log.e(TAG, "Error checking for root access", e); - // this means that there is no root to be had (normally) - } +/** + * This class is taken from the NetCipher library: https://github.com/guardianproject/NetCipher/ + */ - Log.e(TAG, "Could not acquire root permissions"); +public class TorServiceUtils { - return false; - } + private final static String TAG = "TorUtils"; + // various console cmds + public final static String SHELL_CMD_PS = "ps"; + public final static String SHELL_CMD_PIDOF = "pidof"; public static int findProcessId(String command) { @@ -175,60 +162,4 @@ public class TorServiceUtils { return procId; } - - public static int doShellCommand(String[] cmds, StringBuilder log, boolean runAsRoot, - boolean waitFor) throws Exception - { - - Process proc = null; - int exitCode = -1; - - if (runAsRoot) - proc = Runtime.getRuntime().exec("su"); - else - proc = Runtime.getRuntime().exec("sh"); - - OutputStreamWriter out = new OutputStreamWriter(proc.getOutputStream()); - - for (int i = 0; i < cmds.length; i++) - { - // TorService.logMessage("executing shell cmd: " + cmds[i] + - // "; runAsRoot=" + runAsRoot + ";waitFor=" + waitFor); - - out.write(cmds[i]); - out.write("\n"); - } - - out.flush(); - out.write("exit\n"); - out.flush(); - - if (waitFor) - { - - final char buf[] = new char[10]; - - // Consume the "stdout" - InputStreamReader reader = new InputStreamReader(proc.getInputStream()); - int read = 0; - while ((read = reader.read(buf)) != -1) { - if (log != null) - log.append(buf, 0, read); - } - - // Consume the "stderr" - reader = new InputStreamReader(proc.getErrorStream()); - read = 0; - while ((read = reader.read(buf)) != -1) { - if (log != null) - log.append(buf, 0, read); - } - - exitCode = proc.waitFor(); - - } - - return exitCode; - - } } -- cgit v1.2.3