commit bbf5fcb3fb346e9bba712d12bf4934cf925cb2bd Author: n8fr8 nathan@guardianproject.info Date: Wed Aug 7 13:33:30 2019 -0400
update service for VPN mode and startup fixes --- orbotservice/build.gradle | 4 +- .../java/org/torproject/android/control/.cvsignore | 1 - .../java/org/torproject/android/control/README | 4 - .../android/control/TorControlConnection.java | 12 +- .../torproject/android/control/examples/.cvsignore | 1 - .../control/examples/DebuggingEventHandler.java | 44 ------- .../torproject/android/control/examples/Main.java | 146 --------------------- .../org/torproject/android/service/TorService.java | 16 ++- .../service/util/CustomTorResourceInstaller.java | 4 +- .../android/service/vpn/OrbotVpnManager.java | 28 ++-- .../android/service/vpn/TorVpnService.java | 19 ++- 11 files changed, 50 insertions(+), 229 deletions(-)
diff --git a/orbotservice/build.gradle b/orbotservice/build.gradle index 7e933c7f..f8e96bf5 100644 --- a/orbotservice/build.gradle +++ b/orbotservice/build.gradle @@ -13,8 +13,8 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 28 - versionCode 16060001 - versionName '16.0.6-BETA-1-tor-0.3.5.8-orbotservice' + versionCode 16111000 + versionName '16.1.1-BETA-2-tor-0.4.0.4-rc-orbotservice' archivesBaseName = "OrbotService-$versionName"
} diff --git a/orbotservice/src/main/java/org/torproject/android/control/.cvsignore b/orbotservice/src/main/java/org/torproject/android/control/.cvsignore deleted file mode 100644 index 6b468b62..00000000 --- a/orbotservice/src/main/java/org/torproject/android/control/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -*.class diff --git a/orbotservice/src/main/java/org/torproject/android/control/README b/orbotservice/src/main/java/org/torproject/android/control/README deleted file mode 100644 index b310c7d5..00000000 --- a/orbotservice/src/main/java/org/torproject/android/control/README +++ /dev/null @@ -1,4 +0,0 @@ -We broke the version detection stuff in Tor 0.1.2.16 / 0.2.0.4-alpha. -Somebody should rip out the v0 control protocol stuff from here, and -it should start working again. -RD - diff --git a/orbotservice/src/main/java/org/torproject/android/control/TorControlConnection.java b/orbotservice/src/main/java/org/torproject/android/control/TorControlConnection.java index 05ed8c3c..4f1fe95b 100644 --- a/orbotservice/src/main/java/org/torproject/android/control/TorControlConnection.java +++ b/orbotservice/src/main/java/org/torproject/android/control/TorControlConnection.java @@ -312,12 +312,12 @@ public class TorControlConnection implements TorControlCommands { handleEvent(lst); else { synchronized (waiters) { - if (!waiters.isEmpty()) - { - Waiter w; - w = waiters.removeFirst(); - w.setResponse(lst); - } + if (!waiters.isEmpty()) + { + Waiter w; + w = waiters.removeFirst(); + w.setResponse(lst); + } }
} diff --git a/orbotservice/src/main/java/org/torproject/android/control/examples/.cvsignore b/orbotservice/src/main/java/org/torproject/android/control/examples/.cvsignore deleted file mode 100644 index 6b468b62..00000000 --- a/orbotservice/src/main/java/org/torproject/android/control/examples/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -*.class diff --git a/orbotservice/src/main/java/org/torproject/android/control/examples/DebuggingEventHandler.java b/orbotservice/src/main/java/org/torproject/android/control/examples/DebuggingEventHandler.java deleted file mode 100644 index 48c49a28..00000000 --- a/orbotservice/src/main/java/org/torproject/android/control/examples/DebuggingEventHandler.java +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2005 Nick Mathewson, Roger Dingledine -// See LICENSE file for copying information -package org.torproject.android.control.examples; - -import java.io.PrintWriter; -import java.util.Iterator; -import org.torproject.android.control.EventHandler; - -public class DebuggingEventHandler implements EventHandler { - - private final PrintWriter out; - - public DebuggingEventHandler(PrintWriter p) { - out = p; - } - - public void circuitStatus(String status, String circID, String path) { - out.println("Circuit "+circID+" is now "+status+" (path="+path+")"); - } - public void streamStatus(String status, String streamID, String target) { - out.println("Stream "+streamID+" is now "+status+" (target="+target+")"); - } - public void orConnStatus(String status, String orName) { - out.println("OR connection to "+orName+" is now "+status); - } - public void bandwidthUsed(long read, long written) { - out.println("Bandwidth usage: "+read+" bytes read; "+ - written+" bytes written."); - } - public void newDescriptors(java.util.List<String> orList) { - out.println("New descriptors for routers:"); - for (Iterator<String> i = orList.iterator(); i.hasNext(); ) - out.println(" "+i.next()); - } - public void message(String type, String msg) { - out.println("["+type+"] "+msg.trim()); - } - - public void unrecognized(String type, String msg) { - out.println("unrecognized event ["+type+"] "+msg.trim()); - } - -} - diff --git a/orbotservice/src/main/java/org/torproject/android/control/examples/Main.java b/orbotservice/src/main/java/org/torproject/android/control/examples/Main.java deleted file mode 100644 index b0e0a3c0..00000000 --- a/orbotservice/src/main/java/org/torproject/android/control/examples/Main.java +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2005 Nick Mathewson, Roger Dingledine -// See LICENSE file for copying information -package org.torproject.android.control.examples; - -import org.torproject.android.control.*; -import java.io.EOFException; -import java.io.IOException; -import java.io.PrintWriter; -import java.net.Socket; -import java.util.ArrayList; -import java.util.List; -import java.util.Arrays; -import java.util.Map; -import java.util.Iterator; - -public class Main implements TorControlCommands { - - public static void main(String args[]) { - if (args.length < 1) { - System.err.println("No command given."); - return; - } - try { - if (args[0].equals("set-config")) { - setConfig(args); - } else if (args[0].equals("get-config")) { - getConfig(args); - } else if (args[0].equals("get-info")) { - getInfo(args); - } else if (args[0].equals("listen")) { - listenForEvents(args); - } else if (args[0].equals("signal")) { - signal(args); - } else if (args[0].equals("auth")) { - authDemo(args); - } else { - System.err.println("Unrecognized command: "+args[0]); - } - } catch (EOFException ex) { - System.out.println("Control socket closed by Tor."); - } catch (TorControlError ex) { - System.err.println("Error from Tor process: "+ - ex+" ["+ex.getErrorMsg()+"]"); - } catch (IOException ex) { - System.err.println("IO exception when talking to Tor process: "+ - ex); - ex.printStackTrace(System.err); - } - } - - private static TorControlConnection getConnection(String[] args, - boolean daemon) throws IOException { - Socket s = new Socket("127.0.0.1", 9100); - TorControlConnection conn = new TorControlConnection(s); - conn.launchThread(daemon); - conn.authenticate(new byte[0]); - return conn; - } - - private static TorControlConnection getConnection(String[] args) - throws IOException { - return getConnection(args, true); - } - - public static void setConfig(String[] args) throws IOException { - // Usage: "set-config [-save] key value key value key value" - TorControlConnection conn = getConnection(args); - ArrayList<String> lst = new ArrayList<String>(); - int i = 1; - boolean save = false; - if (args[i].equals("-save")) { - save = true; - ++i; - } - for (; i < args.length; i +=2) { - lst.add(args[i]+" "+args[i+1]); - } - conn.setConf(lst); - if (save) { - conn.saveConf(); - } - } - - public static void getConfig(String[] args) throws IOException { - // Usage: get-config key key key - TorControlConnection conn = getConnection(args); - List<ConfigEntry> lst = conn.getConf(Arrays.asList(args).subList(1,args.length)); - for (Iterator<ConfigEntry> i = lst.iterator(); i.hasNext(); ) { - ConfigEntry e = i.next(); - System.out.println("KEY: "+e.key); - System.out.println("VAL: "+e.value); - } - } - - public static void getInfo(String[] args) throws IOException { - TorControlConnection conn = getConnection(args); - Map<String,String> m = conn.getInfo(Arrays.asList(args).subList(1,args.length)); - for (Iterator<Map.Entry<String, String>> i = m.entrySet().iterator(); i.hasNext(); ) { - Map.Entry<String,String> e = i.next(); - System.out.println("KEY: "+e.getKey()); - System.out.println("VAL: "+e.getValue()); - } - } - - public static void listenForEvents(String[] args) throws IOException { - // Usage: listen [circ|stream|orconn|bw|newdesc|info|notice|warn|error]* - TorControlConnection conn = getConnection(args, false); - ArrayList<String> lst = new ArrayList<String>(); - for (int i = 1; i < args.length; ++i) { - lst.add(args[i]); - } - conn.setEventHandler( - new DebuggingEventHandler(new PrintWriter(System.out, true))); - conn.setEvents(lst); - } - - public static void signal(String[] args) throws IOException { - // Usage signal [reload|shutdown|dump|debug|halt] - TorControlConnection conn = getConnection(args, false); - // distinguish shutdown signal from other signals - if ("SHUTDOWN".equalsIgnoreCase(args[1]) - || "HALT".equalsIgnoreCase(args[1])) { - conn.shutdownTor(args[1].toUpperCase()); - } else { - conn.signal(args[1].toUpperCase()); - } - } - - public static void authDemo(String[] args) throws IOException { - - PasswordDigest pwd = PasswordDigest.generateDigest(); - Socket s = new Socket("127.0.0.1", 9100); - TorControlConnection conn = new TorControlConnection(s); - conn.launchThread(true); - conn.authenticate(new byte[0]); - - conn.setConf("HashedControlPassword", pwd.getHashedPassword()); - - s = new Socket("127.0.0.1", 9100); - conn = new TorControlConnection(s); - conn.launchThread(true); - conn.authenticate(pwd.getSecret()); - } - -} - diff --git a/orbotservice/src/main/java/org/torproject/android/service/TorService.java b/orbotservice/src/main/java/org/torproject/android/service/TorService.java index 65f0d179..fc518024 100644 --- a/orbotservice/src/main/java/org/torproject/android/service/TorService.java +++ b/orbotservice/src/main/java/org/torproject/android/service/TorService.java @@ -723,9 +723,10 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon extraLines.append("VirtualAddrNetwork 10.192.0.0/10").append('\n'); extraLines.append("AutomapHostsOnResolve 1").append('\n');
- extraLines.append("DisableNetwork 0").append('\n'); extraLines.append("DormantClientTimeout 10 minutes").append('\n'); - extraLines.append("DormantOnFirstStartup 1").append('\n'); + extraLines.append("DormantOnFirstStartup 0").append('\n'); + + extraLines.append("DisableNetwork 0").append('\n');
if (Prefs.useDebugLogging()) { @@ -1051,7 +1052,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon torConnSocket.setSoTimeout(CONTROL_SOCKET_TIMEOUT);
conn = new TorControlConnection(torConnSocket); - conn.launchThread(true);//is daemon + conn.launchThread(false);//is daemon
break; } @@ -1197,7 +1198,6 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
conn.setEventHandler(mEventHandler);
- conn.setEvents(Arrays.asList(new String[]{ "ORCONN", "CIRC", "NOTICE", "WARN", "ERR","BW"})); // conn.setEvents(Arrays.asList(new String[]{ @@ -1509,11 +1509,13 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon }
mNetworkType = newNetType; - mConnectivity = newConnectivityState;
- if (mConnectivity) - newIdentity(); + if (newConnectivityState != mConnectivity) { + mConnectivity = newConnectivityState;
+ if (mConnectivity) + newIdentity(); + }
/** if (doNetworKSleep && mCurrentStatus != STATUS_OFF) diff --git a/orbotservice/src/main/java/org/torproject/android/service/util/CustomTorResourceInstaller.java b/orbotservice/src/main/java/org/torproject/android/service/util/CustomTorResourceInstaller.java index a2561238..cb4f5c6a 100644 --- a/orbotservice/src/main/java/org/torproject/android/service/util/CustomTorResourceInstaller.java +++ b/orbotservice/src/main/java/org/torproject/android/service/util/CustomTorResourceInstaller.java @@ -64,6 +64,7 @@ public class CustomTorResourceInstaller implements TorServiceConstants { } }
+ //it exists but we can't execute it, so copy it to a new path if (fileTor.exists()) { InputStream is = new FileInputStream(fileTor); streamToFile(is, fileTor, false, true); @@ -76,7 +77,8 @@ public class CustomTorResourceInstaller implements TorServiceConstants { //let's try another approach fileTor = CustomNativeLoader.loadNativeBinary(context,TOR_ASSET_KEY,new File(installFolder, TOR_ASSET_KEY));
- setExecutable(fileTor); + if (fileTor != null && fileTor.exists()) + setExecutable(fileTor);
if (fileTor != null && fileTor.exists() && fileTor.canExecute()) return fileTor; diff --git a/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java b/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java index 65db4659..0af6dcff 100644 --- a/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java +++ b/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java @@ -95,9 +95,8 @@ public class OrbotVpnManager implements Handler.Callback {
filePdnsd = CustomNativeLoader.loadNativeBinary(service.getApplicationContext(),PDNSD_BIN,new File(service.getFilesDir(),PDNSD_BIN));
- // if that fails, try again using native utils try { - killProcess(filePdnsd, "-1"); // this is -HUP + killProcess(filePdnsd, "-1"); } catch (Exception e) { e.printStackTrace(); } @@ -144,14 +143,17 @@ public class OrbotVpnManager implements Handler.Callback { { Log.d(TAG,"starting OrbotVPNService service!");
- int newTorSocks = intent.getIntExtra(TorService.EXTRA_SOCKS_PROXY_PORT,-1); - int newTorDns = intent.getIntExtra(TorService.EXTRA_DNS_PORT,-1); + int torSocks = intent.getIntExtra(TorService.EXTRA_SOCKS_PROXY_PORT,-1); + int torDns = intent.getIntExtra(TorService.EXTRA_DNS_PORT,-1); + + //if running, we need to restart + if ((torSocks != mTorSocks || torDns != mTorDns)) {
- if ((mTorSocks != newTorSocks || mTorDns != newTorDns)) { - mTorSocks = newTorSocks; - mTorDns = newTorDns; + mTorSocks = torSocks; + mTorDns = torDns;
if (!mIsLollipop) { + stopSocksBypass(); startSocksBypass(); }
@@ -444,12 +446,14 @@ public class OrbotVpnManager implements Handler.Callback {
try { BufferedReader reader = new BufferedReader(new FileReader(filePid)); - pid = reader.readLine().trim(); - - VpnUtils.killProcess(pid,"-9"); - filePid.delete(); - return true; + String line = reader.readLine(); + if (line != null) { + pid = reader.readLine().trim();
+ VpnUtils.killProcess(pid, "-9"); + filePid.delete(); + return true; + } } catch (Exception e) { Log.e(TAG,"error killing DNS Process: " + pid,e); } diff --git a/orbotservice/src/main/java/org/torproject/android/service/vpn/TorVpnService.java b/orbotservice/src/main/java/org/torproject/android/service/vpn/TorVpnService.java index e70753f6..78c405f4 100644 --- a/orbotservice/src/main/java/org/torproject/android/service/vpn/TorVpnService.java +++ b/orbotservice/src/main/java/org/torproject/android/service/vpn/TorVpnService.java @@ -31,9 +31,7 @@ public class TorVpnService extends VpnService { e.printStackTrace(); }
- LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this); - lbm.registerReceiver(mLocalBroadcastReceiver, - new IntentFilter(TorServiceConstants.LOCAL_ACTION_PORTS)); + }
/* (non-Javadoc) @@ -41,6 +39,18 @@ public class TorVpnService extends VpnService { */ public int onStartCommand(Intent intent, int flags, int startId) {
+ if (intent.getAction().equals("start")) + { + LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this); + lbm.registerReceiver(mLocalBroadcastReceiver, + new IntentFilter(TorServiceConstants.LOCAL_ACTION_PORTS)); + } + else if (intent.getAction().equals("stop")) + { + LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this); + lbm.unregisterReceiver(mLocalBroadcastReceiver); + } + mVpnManager.handleIntent(new Builder(), intent);
return Service.START_STICKY; @@ -50,8 +60,7 @@ public class TorVpnService extends VpnService { public void onDestroy() { super.onDestroy();
- LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this); - lbm.unregisterReceiver(mLocalBroadcastReceiver); + }
/**