diff --git a/.gitmodules b/.gitmodules index 9d4e0f9dd..849508c4b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -22,3 +22,6 @@ path = extern/safeslinger-exchange url = https://github.com/open-keychain/exchange-android ignore = dirty +[submodule "extern/NetCipher"] + path = extern/NetCipher + url = https://github.com/open-keychain/NetCipher.git diff --git a/OpenKeychain/build.gradle b/OpenKeychain/build.gradle index 511183d10..81a18858c 100644 --- a/OpenKeychain/build.gradle +++ b/OpenKeychain/build.gradle @@ -60,6 +60,9 @@ dependencies { compile project(':extern:minidns') compile project(':extern:KeybaseLib:Lib') compile project(':extern:safeslinger-exchange') + compile (project( ':extern:NetCipher:libnetcipher')) { + exclude group: 'com.madgag.spongycastle' + } } // Output of ./gradlew -q calculateChecksums diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java index 22ff051d2..1d0bac1cf 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java @@ -28,6 +28,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; +import info.guardianproject.onionkit.ui.OrbotHelper; import org.spongycastle.bcpg.CompressionAlgorithmTags; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; @@ -35,7 +36,6 @@ import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.ui.widget.IntegerListPreference; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Preferences; -import org.sufficientlysecure.keychain.util.orbot.OrbotHelper; import java.util.List; 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 deleted file mode 100644 index c0aa95201..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/orbot/OrbotHelper.java +++ /dev/null @@ -1,160 +0,0 @@ -/* -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. -*/ -package org.sufficientlysecure.keychain.util.orbot; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.net.Uri; - -import org.sufficientlysecure.keychain.R; - -/** - * This class has been 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() - { - int procId = TorServiceUtils.findProcessId(TOR_BIN_PATH); - - return (procId != -1); - } - - public boolean isOrbotInstalled() - { - return isAppInstalled(ORBOT_PACKAGE_NAME); - } - - private boolean isAppInstalled(String uri) { - PackageManager pm = mContext.getPackageManager(); - boolean installed = false; - try { - pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES); - installed = true; - } catch (PackageManager.NameNotFoundException e) { - installed = false; - } - return installed; - } - - public void promptToInstall(Activity activity) - { - 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.orbot_yes), activity.getString(R.string.orbot_no), uriMarket); - } - - 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) - { - - 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.orbot_yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - activity.startActivityForResult(getOrbotStartIntent(), 1); - } - }); - downloadDialog.setNegativeButton(R.string.orbot_no, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - } - }); - downloadDialog.show(); - - } - - public void requestHiddenServiceOnPort(Activity activity, int port) - { - Intent intent = new Intent(ACTION_REQUEST_HS); - intent.setPackage(ORBOT_PACKAGE_NAME); - intent.putExtra("hs_port", port); - - activity.startActivityForResult(intent, HS_REQUEST_CODE); - } - - public static Intent getOrbotStartIntent() { - Intent intent = new Intent(ACTION_START_TOR); - intent.setPackage(ORBOT_PACKAGE_NAME); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - return intent; - } -} 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 deleted file mode 100644 index 76eff25d7..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/orbot/TorServiceUtils.java +++ /dev/null @@ -1,269 +0,0 @@ -/* -Orlib is distributed under this license (aka the 3-clause BSD license) - - Copyright (c) 2009, Nathan Freitas, Orbot / The Guardian Project - http://openideals.com/guardian - - 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. -*/ - -package org.sufficientlysecure.keychain.util.orbot; - -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; - -import android.util.Log; - -/** - * This class has been taken from the NetCipher library - * https://github.com/guardianproject/NetCipher - */ -public class TorServiceUtils { - - 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"; - - public final static String CHMOD_EXE_VALUE = "700"; - - public static boolean isRootPossible() - { - - StringBuilder log = new StringBuilder(); - - try { - - // 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; - - 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; - - } - - } 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); - - } catch (Exception e) { - Log.e(TAG, "Error checking for root access", e); - // this means that there is no root to be had (normally) - } - - Log.e(TAG, "Could not acquire root permissions"); - - return false; - } - - public static int findProcessId(String command) - { - int procId = -1; - - try - { - procId = findProcessIdWithPidOf(command); - - if (procId == -1) - procId = findProcessIdWithPS(command); - } catch (Exception e) - { - try - { - procId = findProcessIdWithPS(command); - } catch (Exception e2) - { - Log.e(TAG, "Unable to get proc id for command: " + URLEncoder.encode(command), e2); - } - } - - return procId; - } - - // use 'pidof' command - public static int findProcessIdWithPidOf(String command) throws Exception - { - - int procId = -1; - - Runtime r = Runtime.getRuntime(); - - Process procPs = null; - - String baseName = new File(command).getName(); - // fix contributed my mikos on 2010.12.10 - procPs = r.exec(new String[] { - SHELL_CMD_PIDOF, baseName - }); - // procPs = r.exec(SHELL_CMD_PIDOF); - - BufferedReader reader = new BufferedReader(new InputStreamReader(procPs.getInputStream())); - String line = null; - - while ((line = reader.readLine()) != null) - { - - try - { - // this line should just be the process id - procId = Integer.parseInt(line.trim()); - break; - } catch (NumberFormatException e) - { - Log.e("TorServiceUtils", "unable to parse process pid: " + line, e); - } - } - - return procId; - - } - - // use 'ps' command - public static int findProcessIdWithPS(String command) throws Exception - { - - int procId = -1; - - Runtime r = Runtime.getRuntime(); - - Process procPs = null; - - procPs = r.exec(SHELL_CMD_PS); - - BufferedReader reader = new BufferedReader(new InputStreamReader(procPs.getInputStream())); - String line = null; - - while ((line = reader.readLine()) != null) - { - if (line.indexOf(' ' + command) != -1) - { - - StringTokenizer st = new StringTokenizer(line, " "); - st.nextToken(); // proc owner - - procId = Integer.parseInt(st.nextToken().trim()); - - break; - } - } - - 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; - - } -} diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index 67662503c..1ba1c2715 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -197,15 +197,6 @@ "Secret Key:" - - "Install Orbot?" - "market://search?q=pname:org.torproject.android" - "You must have Orbot installed and activated to proxy traffic through it. Would you like to install it from Google Play?" - "Yes" - "No" - "Start Orbot?" - "Orbot doesn\'t appear to be running. Would you like to start it up and connect to Tor?" - "None" "15 secs" diff --git a/settings.gradle b/settings.gradle index baf7e0e64..1b9038344 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,3 +8,4 @@ include ':extern:spongycastle:prov' include ':extern:minidns' include ':extern:KeybaseLib:Lib' include ':extern:safeslinger-exchange' +include ':OpenKeychain-Test'