Merge pull request #1865 from vanitasvitae/master
Fixed 'Orbot appears not to be running' (#1792)
This commit is contained in:
@@ -104,6 +104,12 @@
|
||||
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
<!-- broadcast receiver for Orbots status -->
|
||||
<receiver android:name=".util.orbot.OrbotStatusReceiver">
|
||||
<intent-filter>
|
||||
<action android:name="org.torproject.android.intent.action.STATUS"/>
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
<!-- singleTop for NFC dispatch, see SecurityTokenOperationActivity -->
|
||||
<activity
|
||||
android:name=".ui.MainActivity"
|
||||
|
||||
@@ -34,6 +34,7 @@ import org.sufficientlysecure.keychain.Constants.Pref;
|
||||
import org.sufficientlysecure.keychain.KeychainApplication;
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.service.KeyserverSyncAdapterService;
|
||||
import org.sufficientlysecure.keychain.util.orbot.OrbotStatusReceiver;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.net.Proxy;
|
||||
@@ -270,6 +271,8 @@ public class Preferences {
|
||||
boolean useNormalProxy = getUseNormalProxy();
|
||||
|
||||
if (useTor) {
|
||||
//TODO: Replace Constants.Orbot.PROXY_PORT with OrbotStatusReceiver.getProxyPortHttp()
|
||||
//TODO: in order to always have the actual port Orbot is offering?
|
||||
return new ProxyPrefs(true, false, Constants.Orbot.PROXY_HOST, Constants.Orbot.PROXY_PORT,
|
||||
Constants.Orbot.PROXY_TYPE);
|
||||
} else if (useNormalProxy) {
|
||||
|
||||
@@ -150,10 +150,14 @@ public class OrbotHelper {
|
||||
// only static utility methods, do not instantiate
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the OrbotStatusReceiver (if not already happened) and check, whether Orbot is
|
||||
* running or not.
|
||||
* @param context context
|
||||
* @return if Orbot is running
|
||||
*/
|
||||
public static boolean isOrbotRunning(Context context) {
|
||||
int procId = TorServiceUtils.findProcessId(context);
|
||||
|
||||
return (procId != -1);
|
||||
return OrbotStatusReceiver.getInstance().isTorRunning(context);
|
||||
}
|
||||
|
||||
public static boolean isOrbotInstalled(Context context) {
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.sufficientlysecure.keychain.util.orbot;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
|
||||
import org.sufficientlysecure.keychain.Constants;
|
||||
import org.sufficientlysecure.keychain.util.Log;
|
||||
|
||||
/**
|
||||
* BroadcastReceiver that receives Orbots status
|
||||
*/
|
||||
public class OrbotStatusReceiver extends BroadcastReceiver {
|
||||
|
||||
//TODO: These two Strings are missing in older versions of NetCipher.
|
||||
//TODO: Once they are present in OrbotHelper (not ProxyHelper) point to OrbotHelpers Strings instead.
|
||||
public final static String EXTRA_PROXY_PORT_HTTP = "org.torproject.android.intent.extra.HTTP_PROXY_PORT";
|
||||
public final static String EXTRA_PROXY_PORT_SOCKS = "org.torproject.android.intent.extra.SOCKS_PROXY_PORT";
|
||||
|
||||
//Variables representing Orbots status
|
||||
private boolean torRunning;
|
||||
private int proxy_port_http;
|
||||
private int proxy_port_socks;
|
||||
|
||||
private static OrbotStatusReceiver instance;
|
||||
|
||||
public OrbotStatusReceiver() {
|
||||
instance = this;
|
||||
}
|
||||
|
||||
public static OrbotStatusReceiver getInstance() {
|
||||
if(instance == null) {
|
||||
instance = new OrbotStatusReceiver();
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
if (OrbotHelper.ACTION_STATUS.equals(intent.getAction())) {
|
||||
Log.i(Constants.TAG, context.getPackageName() + " received intent : " + intent.getAction() + " " + intent.getPackage());
|
||||
String status = intent.getStringExtra(OrbotHelper.EXTRA_STATUS) + " (" + intent.getStringExtra(OrbotHelper.EXTRA_PACKAGE_NAME) + ")";
|
||||
this.torRunning = (intent.getStringExtra(OrbotHelper.EXTRA_STATUS).equals(OrbotHelper.STATUS_ON));
|
||||
|
||||
Log.d(Constants.TAG, "Orbot status: "+status);
|
||||
if(torRunning){
|
||||
Bundle extras = intent.getExtras();
|
||||
|
||||
if (extras.containsKey(EXTRA_PROXY_PORT_HTTP)) {
|
||||
this.proxy_port_http = extras.getInt(EXTRA_PROXY_PORT_HTTP, -1);
|
||||
Log.i(Constants.TAG, "Http proxy set to "+proxy_port_http);
|
||||
}
|
||||
|
||||
if (extras.containsKey(EXTRA_PROXY_PORT_SOCKS)) {
|
||||
this.proxy_port_socks = extras.getInt(EXTRA_PROXY_PORT_SOCKS, -1);
|
||||
Log.i(Constants.TAG, "Socks proxy set to "+proxy_port_socks);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isTorRunning(Context context) {
|
||||
OrbotHelper.requestStartTor(context);
|
||||
return this.torRunning;
|
||||
}
|
||||
|
||||
public int getProxyPortHttp(Context context) {
|
||||
OrbotHelper.requestStartTor(context);
|
||||
return this.proxy_port_http;
|
||||
}
|
||||
|
||||
public int getProxyPortSocks(Context context) {
|
||||
OrbotHelper.requestStartTor(context);
|
||||
return this.proxy_port_socks;
|
||||
}
|
||||
}
|
||||
@@ -1,156 +0,0 @@
|
||||
/* This is the license for Orlib, a free software project to
|
||||
provide anonymity on the Internet from a Google Android smartphone.
|
||||
|
||||
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.content.Context;
|
||||
|
||||
import org.sufficientlysecure.keychain.util.Log;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
/**
|
||||
* This class is taken from the NetCipher library: https://github.com/guardianproject/NetCipher/
|
||||
*/
|
||||
public class TorServiceUtils {
|
||||
|
||||
private final static String TAG = "TorUtils";
|
||||
|
||||
public final static String SHELL_CMD_PS = "ps";
|
||||
public final static String SHELL_CMD_PIDOF = "pidof";
|
||||
|
||||
public static int findProcessId(Context context) {
|
||||
String dataPath = context.getFilesDir().getParentFile().getParentFile().getAbsolutePath();
|
||||
String command = dataPath + "/" + OrbotHelper.ORBOT_PACKAGE_NAME + "/app_bin/tor";
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
procPs = r.exec(SHELL_CMD_PS);
|
||||
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(procPs.getInputStream()));
|
||||
String line;
|
||||
|
||||
while ((line = reader.readLine()) != null) {
|
||||
if (line.contains(' ' + command)) {
|
||||
|
||||
StringTokenizer st = new StringTokenizer(line, " ");
|
||||
st.nextToken(); // proc owner
|
||||
|
||||
procId = Integer.parseInt(st.nextToken().trim());
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return procId;
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user