commit 1852cde041851b0529ef50a110a74a029bd97b02
Author: Nathan Freitas <nathan(a)freitas.net>
Date: Wed Feb 4 14:55:57 2015 -0500
enable local DNS listen on 10.0.0.1 for VPN service
also add support for stopping VPNBuilder instance
---
src/org/torproject/android/service/TorService.java | 27 ++++++++--
.../torproject/android/vpn/OrbotVpnService.java | 55 ++++++++++++++------
2 files changed, 62 insertions(+), 20 deletions(-)
diff --git a/src/org/torproject/android/service/TorService.java b/src/org/torproject/android/service/TorService.java
index a20a227..b287975 100644
--- a/src/org/torproject/android/service/TorService.java
+++ b/src/org/torproject/android/service/TorService.java
@@ -141,6 +141,8 @@ public class TorService extends Service implements TorServiceConstants, TorConst
private boolean mTransProxyTethering = false;
private boolean mTransProxyNetworkRefresh = false;
+ private boolean mUseVPN = false;
+
private ExecutorService mExecutor = Executors.newFixedThreadPool(1);
public void debug(String msg)
@@ -368,7 +370,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst
if (action!=null){
if(action.equals(Intent.ACTION_BOOT_COMPLETED)||action.equals(CMD_START)){
- clearVpnProxy();
setTorProfile(STATUS_ON);
}else if (action.equals(CMD_STOP)){
setTorProfile(STATUS_OFF);
@@ -381,7 +382,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst
flushTransparentProxyRules();
}else if (action.equals(CMD_UPDATE)){
processSettings();
- }else if (action.equals(CMD_VPN)){
+ }else if (action.equals(CMD_VPN)){
enableVpnProxy();
}
else if (action.equals(CMD_VPN_CLEAR)){
@@ -1422,6 +1423,10 @@ public class TorService extends Service implements TorServiceConstants, TorConst
public void enableVpnProxy () {
+ debug ("enabling VPN Proxy");
+
+ mUseVPN = true;
+
SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
Editor ePrefs = prefs.edit();
@@ -1434,12 +1439,18 @@ public class TorService extends Service implements TorServiceConstants, TorConst
processSettings();
Intent intent = new Intent(TorService.this, OrbotVpnService.class);
+ intent.setAction("start");
startService(intent);
+
}
public void clearVpnProxy ()
- {
+ {
+ debug ("clearing VPN Proxy");
+
+ mUseVPN = false;
+
SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
Editor ePrefs = prefs.edit();
ePrefs.remove("pref_proxy_type");
@@ -1449,6 +1460,10 @@ public class TorService extends Service implements TorServiceConstants, TorConst
ePrefs.remove("pref_proxy_password");
ePrefs.commit();
processSettings();
+
+ Intent intent = new Intent(TorService.this, OrbotVpnService.class);
+ intent.setAction("stop");
+ startService(intent);
}
@@ -2314,6 +2329,12 @@ public class TorService extends Service implements TorServiceConstants, TorConst
updateConfiguration("HiddenServiceDir","", false);
}
+
+ if (mUseVPN)
+ {
+ updateConfiguration("DNSListenAddress","10.0.0.1:" + TorServiceConstants.TOR_DNS_PORT_DEFAULT,false);
+ }
+
saveConfiguration();
diff --git a/src/org/torproject/android/vpn/OrbotVpnService.java b/src/org/torproject/android/vpn/OrbotVpnService.java
index 315ace8..c53d288 100644
--- a/src/org/torproject/android/vpn/OrbotVpnService.java
+++ b/src/org/torproject/android/vpn/OrbotVpnService.java
@@ -41,7 +41,7 @@ import com.runjva.sourceforge.jsocks.server.ServerAuthenticatorNone;
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public class OrbotVpnService extends VpnService implements Handler.Callback {
- private static final String TAG = "DrobotVpnService";
+ private static final String TAG = "OrbotVpnService";
private PendingIntent mConfigureIntent;
@@ -60,20 +60,32 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
- // The handler is only used to show messages.
- if (mHandler == null) {
- mHandler = new Handler(this);
- }
-
- // Stop the previous session by interrupting the thread.
- if (mThreadVPN == null || (!mThreadVPN.isAlive()))
- {
- enableAppRouting ();
- setupTun2Socks();
- }
+ String action = intent.getAction();
+
+ if (action.equals("start"))
+ {
+ Log.d(TAG,"starting OrbotVPNService service!");
+
+ // The handler is only used to show messages.
+ if (mHandler == null) {
+ mHandler = new Handler(this);
+ }
+
+ // Stop the previous session by interrupting the thread.
+ if (mThreadVPN == null || (!mThreadVPN.isAlive()))
+ {
+ enableAppRouting ();
+ setupTun2Socks();
+ }
+ }
+ else if (action.equals("stop"))
+ {
+ stopVPN();
+ mHandler.postDelayed(new Runnable () { public void run () { stopSelf(); }}, 1000);
+ }
- return START_STICKY;
+ return START_NOT_STICKY;
}
private void enableAppRouting ()
@@ -113,12 +125,21 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
@Override
public void onDestroy() {
+ stopVPN();
+
+ }
+
+ private void stopVPN ()
+ {
if (mProxyServer != null){
mProxyServer.stop();
+ mProxyServer = null;
}
if (mInterface != null){
try {
+ Log.d(TAG,"closing interface, destroying VPN interface");
mInterface.close();
+ mInterface = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
@@ -154,14 +175,14 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
// (i.e., Farsi and Arabic).^M
Locale.setDefault(new Locale("en"));
- String localhost = InetAddress.getLocalHost().getHostAddress();
+ //String localhost = InetAddress.getLocalHost().getHostAddress();
String vpnName = "OrbotVPN";
String virtualGateway = "10.0.0.1";
String virtualIP = "10.0.0.2";
String virtualNetMask = "255.255.255.0";
- String localSocks = localhost + ':' + TorServiceConstants.PORT_SOCKS_DEFAULT;
- String localDNS = localhost + ':' + TorServiceConstants.TOR_DNS_PORT_DEFAULT;
+ String localSocks = "127.0.0.1" + ':' + TorServiceConstants.PORT_SOCKS_DEFAULT;
+ String localDNS = "10.0.0.1" + ':' + TorServiceConstants.TOR_DNS_PORT_DEFAULT;
Builder builder = new Builder();
@@ -170,7 +191,7 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
builder.addAddress(virtualGateway,28);
builder.setSession(vpnName);
builder.addRoute("0.0.0.0",0);
- builder.addDnsServer("8.8.8.8");
+ // builder.addDnsServer("8.8.8.8");
// Create a new interface using the builder and save the parameters.
mInterface = builder.setSession(mSessionName)