diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ccf0692b..ce301009 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -6,12 +6,15 @@
android:installLocation="auto"
>
+
+
@@ -88,7 +91,7 @@
@@ -118,13 +121,13 @@
-
+
diff --git a/external/Makefile b/external/Makefile
index 92e4c0c3..211df769 100644
--- a/external/Makefile
+++ b/external/Makefile
@@ -83,6 +83,8 @@ ifeq ($(APP_ABI),armeabi)
CFLAGS += $(TARGET_thumb_release_CFLAGS)
endif
+
+
.PHONY = clean showsetup \
assets assets-clean \
openssl-static openssl-static-clean \
diff --git a/res/values/pdnsd.xml b/res/values/pdnsd.xml
index 42834d26..522f765a 100644
--- a/res/values/pdnsd.xml
+++ b/res/values/pdnsd.xml
@@ -2,7 +2,7 @@
global {
- perm_cache=1024;
+ perm_cache=0;
cache_dir="/data/data/org.torproject.android/app_bin";
server_port = 8091;
server_ip = 0.0.0.0;
@@ -12,7 +12,7 @@ global {
timeout=10;
daemon=on;
pid_file="/data/data/org.torproject.android/app_bin/pdnsd.pid";
-
+
}
server {
diff --git a/src/org/torproject/android/service/TorService.java b/src/org/torproject/android/service/TorService.java
index 95192c6c..24a90db9 100644
--- a/src/org/torproject/android/service/TorService.java
+++ b/src/org/torproject/android/service/TorService.java
@@ -23,6 +23,7 @@ import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
+import android.net.VpnService;
import android.os.Build;
import android.os.IBinder;
import android.os.RemoteException;
@@ -46,7 +47,7 @@ import org.torproject.android.Prefs;
import org.torproject.android.R;
import org.torproject.android.settings.AppManager;
import org.torproject.android.settings.TorifiedApp;
-import org.torproject.android.vpn.OrbotVpnService;
+import org.torproject.android.vpn.OrbotVpnManager;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
@@ -82,7 +83,7 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeoutException;
-public class TorService extends Service implements TorServiceConstants, OrbotConstants, EventHandler
+public class TorService extends VpnService implements TorServiceConstants, OrbotConstants, EventHandler
{
private String mCurrentStatus = STATUS_OFF;
@@ -121,7 +122,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
private long lastWritten = -1;
private NotificationManager mNotificationManager = null;
- private Builder mNotifyBuilder;
+ private Notification.Builder mNotifyBuilder;
private Notification mNotification;
private boolean mNotificationShowing = false;
@@ -130,6 +131,8 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
private ExecutorService mExecutor = Executors.newFixedThreadPool(1);
private NumberFormat mNumberFormat = null;
+
+ private OrbotVpnManager mVpnManager;
public void debug(String msg)
{
@@ -364,6 +367,15 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
unregisterReceiver(mNetworkStateReceiver);
super.onDestroy();
}
+
+ @Override
+ public void onRevoke ()
+ {
+ if (mVpnManager != null)
+ mVpnManager.onRevoke();
+
+ super.onRevoke();
+ }
private void stopTor() {
Log.i("TorService", "stopTor");
@@ -744,7 +756,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
if (Prefs.bridgesEnabled())
if (Prefs.useVpn() && !mIsLollipop)
{
- customEnv.add("TOR_PT_PROXY=socks5://" + OrbotVpnService.sSocksProxyLocalhost + ":" + OrbotVpnService.sSocksProxyServerPort);
+ customEnv.add("TOR_PT_PROXY=socks5://" + OrbotVpnManager.sSocksProxyLocalhost + ":" + OrbotVpnManager.sSocksProxyServerPort);
}
String baseDirectory = OrbotApp.fileTor.getParent();
@@ -1190,12 +1202,14 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
updateConfiguration("DNSPort",TOR_VPN_DNS_LISTEN_ADDRESS + ":" + TorServiceConstants.TOR_DNS_PORT_DEFAULT,false);
- Intent intent = new Intent(TorService.this, OrbotVpnService.class);
- intent.setAction("start");
+ if (mVpnManager == null)
+ mVpnManager = new OrbotVpnManager (this);
+ Intent intent = new Intent();
+ intent.setAction("start");
intent.putExtra("torSocks", mPortSOCKS);
- startService(intent);
+ mVpnManager.handleIntent(new Builder(),intent);
}
@@ -1205,9 +1219,14 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
Prefs.putUseVpn(false);
processTransparentProxying();
- Intent intent = new Intent(TorService.this, OrbotVpnService.class);
- intent.setAction("stop");
- startService(intent);
+ if (mVpnManager != null)
+ {
+ Intent intent = new Intent();
+ intent.setAction("stop");
+ mVpnManager.handleIntent(new Builder(), intent);
+ mVpnManager = null;
+ }
+
}
@Override
@@ -1851,7 +1870,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
if (!mIsLollipop)
{
String proxyType = "socks5";
- extraLines.append(proxyType + "Proxy" + ' ' + OrbotVpnService.sSocksProxyLocalhost + ':' + OrbotVpnService.sSocksProxyServerPort).append('\n');
+ extraLines.append(proxyType + "Proxy" + ' ' + OrbotVpnManager.sSocksProxyLocalhost + ':' + OrbotVpnManager.sSocksProxyServerPort).append('\n');
};
}
diff --git a/src/org/torproject/android/vpn/OrbotVpnService.java b/src/org/torproject/android/vpn/OrbotVpnManager.java
similarity index 88%
rename from src/org/torproject/android/vpn/OrbotVpnService.java
rename to src/org/torproject/android/vpn/OrbotVpnManager.java
index 2efab1ce..bfb564cb 100644
--- a/src/org/torproject/android/vpn/OrbotVpnService.java
+++ b/src/org/torproject/android/vpn/OrbotVpnManager.java
@@ -31,6 +31,7 @@ import org.sufficientlysecure.rootcommands.Shell;
import org.sufficientlysecure.rootcommands.command.SimpleCommand;
import org.torproject.android.OrbotApp;
import org.torproject.android.R;
+import org.torproject.android.service.TorService;
import org.torproject.android.service.TorServiceConstants;
import org.torproject.android.service.TorServiceUtils;
import org.torproject.android.settings.AppManager;
@@ -38,11 +39,13 @@ import org.torproject.android.settings.TorifiedApp;
import android.annotation.TargetApi;
import android.app.PendingIntent;
+import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.VpnService;
+import android.net.VpnService.Builder;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
@@ -55,12 +58,11 @@ import com.runjva.sourceforge.jsocks.server.ServerAuthenticatorNone;
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
-public class OrbotVpnService extends VpnService implements Handler.Callback {
+public class OrbotVpnManager implements Handler.Callback {
private static final String TAG = "OrbotVpnService";
private PendingIntent mConfigureIntent;
- private Handler mHandler;
private Thread mThreadVPN;
private String mSessionName = "OrbotVPN";
@@ -83,13 +85,20 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
private boolean isRestart = false;
+ private TorService mService;
+
static{
System.loadLibrary("tun2socks");
}
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
+ public OrbotVpnManager (TorService service)
+ {
+ mService = service;
+ }
+
+ //public int onStartCommand(Intent intent, int flags, int startId) {
+ public int handleIntent(Builder builder, Intent intent) {
if (intent != null)
{
@@ -105,18 +114,13 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
mTorSocks = intent.getIntExtra("torSocks", TorServiceConstants.SOCKS_PROXY_PORT_DEFAULT);
- // The handler is only used to show messages.
- if (mHandler == null) {
- mHandler = new Handler(this);
- }
-
if (!mIsLollipop)
{
startSocksBypass();
}
- setupTun2Socks();
+ setupTun2Socks(builder);
}
}
else if (action.equals("stop"))
@@ -124,8 +128,8 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
Log.d(TAG,"stop OrbotVPNService service!");
stopVPN();
- if (mHandler != null)
- mHandler.postDelayed(new Runnable () { public void run () { stopSelf(); }}, 1000);
+ //if (mHandler != null)
+ //mHandler.postDelayed(new Runnable () { public void run () { stopSelf(); }}, 1000);
}
else if (action.equals("refresh"))
{
@@ -135,12 +139,12 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
startSocksBypass();
if (!isRestart)
- setupTun2Socks();
+ setupTun2Socks(builder);
}
}
- return START_STICKY;
+ return Service.START_STICKY;
}
private void startSocksBypass()
@@ -177,7 +181,7 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
try
{
mSocksProxyServer = new ProxyServer(new ServerAuthenticatorNone(null, null));
- ProxyServer.setVpnService(OrbotVpnService.this);
+ ProxyServer.setVpnService(mService);
mSocksProxyServer.start(sSocksProxyServerPort, 5, InetAddress.getLocalHost());
}
@@ -201,6 +205,7 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
}
+ /**
@Override
public void onCreate() {
super.onCreate();
@@ -218,7 +223,7 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
@Override
public void onDestroy() {
stopVPN();
- }
+ }*/
private void stopVPN ()
{
@@ -260,13 +265,13 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
@Override
public boolean handleMessage(Message message) {
if (message != null) {
- Toast.makeText(this, message.what, Toast.LENGTH_SHORT).show();
+ Toast.makeText(mService, message.what, Toast.LENGTH_SHORT).show();
}
return true;
}
- private synchronized void setupTun2Socks() {
+ private synchronized void setupTun2Socks(final Builder builder) {
if (mInterface != null) //stop tun2socks now to give it time to clean up
@@ -289,7 +294,7 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
Thread.sleep(3000);
}
- //start PDNSD daemon pointing to OpenDNS
+ //start PDNSD daemon pointing to actual DNS
startDNS(DEFAULT_ACTUAL_DNS_HOST,DEFAULT_ACTUAL_DNS_PORT);
final String vpnName = "OrbotVPN";
@@ -305,10 +310,8 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
+ String.valueOf(mTorSocks);
final String localDNS = virtualGateway + ':' + "8091";//String.valueOf(TorServiceConstants.TOR_DNS_PORT_DEFAULT);
- final boolean localDnsTransparentProxy = true;
+ final boolean localDnsTransparentProxy = true;
- Builder builder = new Builder();
-
builder.setMtu(VPN_MTU);
builder.addAddress(virtualGateway,32);
@@ -355,6 +358,7 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
};
mThreadVPN.start();
+
}
@@ -362,13 +366,13 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
private void doLollipopAppRouting (Builder builder) throws NameNotFoundException
{
- ArrayList apps = AppManager.getApps(this, TorServiceUtils.getSharedPrefs(getApplicationContext()));
+ ArrayList apps = AppManager.getApps(mService, TorServiceUtils.getSharedPrefs(mService.getApplicationContext()));
boolean perAppEnabled = false;
for (TorifiedApp app : apps)
{
- if (app.isTorified() && (!app.getPackageName().equals(getPackageName())))
+ if (app.isTorified() && (!app.getPackageName().equals(mService.getPackageName())))
{
builder.addAllowedApplication(app.getPackageName());
perAppEnabled = true;
@@ -377,30 +381,32 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
}
if (!perAppEnabled)
- builder.addDisallowedApplication(getPackageName());
+ builder.addDisallowedApplication(mService.getPackageName());
}
- @Override
+
public void onRevoke() {
Log.w(TAG,"VPNService REVOKED!");
if (!isRestart)
{
- SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
+ SharedPreferences prefs = TorServiceUtils.getSharedPrefs(mService.getApplicationContext());
prefs.edit().putBoolean("pref_vpn", false).commit();
stopVPN();
}
isRestart = false;
- super.onRevoke();
+ //super.onRevoke();
+
}
+
private void startDNS (String dns, int port) throws IOException, TimeoutException
{
- makePdnsdConf(this, dns, port,OrbotApp.filePdnsd.getParentFile() );
+ makePdnsdConf(mService, dns, port,OrbotApp.filePdnsd.getParentFile() );
ArrayList customEnv = new ArrayList();
String baseDirectory = OrbotApp.filePdnsd.getParent();