[tor-commits] [orbot/master] fixes #239 #229 #227 #205 and other VPN / DNS issues
n8fr8 at torproject.org
n8fr8 at torproject.org
Mon Jul 8 18:55:44 UTC 2019
commit b7d100cac5beb4b68c211d027acff5f4ab17b93c
Author: n8fr8 <nathan at guardianproject.info>
Date: Mon Jul 8 14:07:33 2019 -0400
fixes #239 #229 #227 #205 and other VPN / DNS issues
moved PDNSD daemon to load from the .so native path
---
.../android/service/util/CustomNativeLoader.java | 48 ++++--
.../service/util/CustomTorResourceInstaller.java | 4 +-
.../android/service/vpn/OrbotVpnManager.java | 11 +-
.../android/service/vpn/PDNSDInstaller.java | 185 ---------------------
orbotservice/src/main/jni/Android.mk | 1 +
5 files changed, 47 insertions(+), 202 deletions(-)
diff --git a/orbotservice/src/main/java/org/torproject/android/service/util/CustomNativeLoader.java b/orbotservice/src/main/java/org/torproject/android/service/util/CustomNativeLoader.java
index 0df6784a..e44340b4 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/util/CustomNativeLoader.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/util/CustomNativeLoader.java
@@ -1,6 +1,7 @@
package org.torproject.android.service.util;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.os.Build;
import android.util.Log;
@@ -13,12 +14,9 @@ import java.util.zip.ZipFile;
public class CustomNativeLoader {
- private final static String LIB_NAME = "tor";
- private final static String LIB_SO_NAME = "tor.so";
+ private final static String TAG = "CNL";
- private final static String TAG = "TorNativeLoader";
-
- private static boolean loadFromZip(Context context, File destLocalFile, String arch) {
+ private static boolean loadFromZip(Context context, String libname, File destLocalFile, String arch) {
ZipFile zipFile = null;
@@ -26,9 +24,9 @@ public class CustomNativeLoader {
try {
zipFile = new ZipFile(context.getApplicationInfo().sourceDir);
- ZipEntry entry = zipFile.getEntry("lib/" + arch + "/" + LIB_SO_NAME);
+ ZipEntry entry = zipFile.getEntry("lib/" + arch + "/" + libname + ".so");
if (entry == null) {
- throw new Exception("Unable to find file in apk:" + "lib/" + arch + "/" + LIB_NAME);
+ throw new Exception("Unable to find file in apk:" + "lib/" + arch + "/" + libname);
}
//how we wrap this in another stream because the native .so is zipped itself
@@ -69,9 +67,26 @@ public class CustomNativeLoader {
return false;
}
- public static synchronized File initNativeLibs(Context context, File destLocalFile) {
+ public static File loadNativeBinary(Context context, String libname, File destLocalFile) {
try {
+
+
+ File fileNativeBin = new File(getNativeLibraryDir(context),libname + ".so");
+
+ if (fileNativeBin.exists())
+ {
+ if (fileNativeBin.canExecute())
+ return fileNativeBin;
+ else
+ {
+ setExecutable(fileNativeBin);
+
+ if (fileNativeBin.canExecute())
+ return fileNativeBin;
+ }
+ }
+
String folder = Build.CPU_ABI;
@@ -80,8 +95,7 @@ public class CustomNativeLoader {
folder = "x86";
}
-
- if (loadFromZip(context, destLocalFile, folder)) {
+ if (loadFromZip(context, libname, destLocalFile, folder)) {
return destLocalFile;
}
@@ -92,5 +106,19 @@ public class CustomNativeLoader {
return null;
}
+
+ private static void setExecutable(File fileBin) {
+ fileBin.setReadable(true);
+ fileBin.setExecutable(true);
+ fileBin.setWritable(false);
+ fileBin.setWritable(true, true);
+ }
+
+ // Return Full path to the directory where native JNI libraries are stored.
+ private static String getNativeLibraryDir(Context context) {
+ ApplicationInfo appInfo = context.getApplicationInfo();
+ return appInfo.nativeLibraryDir;
+ }
+
}
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 7e9dcc55..a2561238 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
@@ -74,9 +74,7 @@ public class CustomTorResourceInstaller implements TorServiceConstants {
}
//let's try another approach
- fileTor = new File(installFolder, TOR_ASSET_KEY);
- //fileTor = NativeLoader.initNativeLibs(context,fileTor);
- CustomNativeLoader.initNativeLibs(context,fileTor);
+ fileTor = CustomNativeLoader.loadNativeBinary(context,TOR_ASSET_KEY,new File(installFolder, TOR_ASSET_KEY));
setExecutable(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 541fd12f..7233159f 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
@@ -36,6 +36,7 @@ import com.runjva.sourceforge.jsocks.protocol.ProxyServer;
import com.runjva.sourceforge.jsocks.server.ServerAuthenticatorNone;
import org.torproject.android.service.R;
+import org.torproject.android.service.util.CustomNativeLoader;
import java.io.BufferedReader;
import java.io.File;
@@ -79,6 +80,7 @@ public class OrbotVpnManager implements Handler.Callback {
File filePdnsd = null;
+ private final static String PDNSD_BIN = "pdnsd";
private final static int PDNSD_PORT = 8091;
private boolean isRestart = false;
@@ -89,7 +91,8 @@ public class OrbotVpnManager implements Handler.Callback {
public OrbotVpnManager (VpnService service) throws IOException, TimeoutException {
mService = service;
- filePdnsd = new PDNSDInstaller(service.getApplicationContext(),service.getFilesDir()).installResources();
+
+ filePdnsd = CustomNativeLoader.loadNativeBinary(service.getApplicationContext(),PDNSD_BIN,new File(service.getFilesDir(),PDNSD_BIN));
Tun2Socks.init();
@@ -343,7 +346,7 @@ public class OrbotVpnManager implements Handler.Callback {
isRestart = false;
//start PDNSD daemon pointing to actual DNS
- startDNS("127.0.0.1",localDns);
+ startDNS(filePdnsd.getCanonicalPath(), "127.0.0.1",localDns);
Tun2Socks.Start(mInterface, VPN_MTU, virtualIP, virtualNetMask, localSocks , localDNS , localDnsTransparentProxy);
@@ -404,14 +407,14 @@ public class OrbotVpnManager implements Handler.Callback {
}
- private void startDNS (String dns, int port) throws IOException, TimeoutException
+ private void startDNS (String pdnsPath, String dns, int port) throws IOException, TimeoutException
{
File fileConf = makePdnsdConf(mService, dns, port,mService.getFilesDir());
// ArrayList<String> customEnv = new ArrayList<String>();
- String[] cmdString = {filePdnsd.getCanonicalPath(),"-c",fileConf.toString()};
+ String[] cmdString = {pdnsPath,"-c",fileConf.toString()};
ProcessBuilder pb = new ProcessBuilder(cmdString);
pb.redirectErrorStream(true);
Process proc = pb.start();
diff --git a/orbotservice/src/main/java/org/torproject/android/service/vpn/PDNSDInstaller.java b/orbotservice/src/main/java/org/torproject/android/service/vpn/PDNSDInstaller.java
deleted file mode 100644
index d19b7212..00000000
--- a/orbotservice/src/main/java/org/torproject/android/service/vpn/PDNSDInstaller.java
+++ /dev/null
@@ -1,185 +0,0 @@
-package org.torproject.android.service.vpn;
-
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.util.Log;
-
-import org.torproject.android.service.util.CustomNativeLoader;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.concurrent.TimeoutException;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-import static org.torproject.android.service.vpn.VpnConstants.FILE_WRITE_BUFFER_SIZE;
-
-public class PDNSDInstaller {
-
- private final static String LIB_NAME = "pdnsd";
- private final static String LIB_SO_NAME = "pdnsd.so";
-
- private final static String TAG = "TorNativeLoader";
-
- private File installFolder;
- private Context context;
- private File filePdnsd;
-
- public PDNSDInstaller (Context context, File installFolder)
- {
- this.installFolder = installFolder;
- this.context = context;
- }
-
- //
- /*
- * Extract the Tor resources from the APK file using ZIP
- *
- * @File path to the Tor executable
- */
- public File installResources () throws IOException, TimeoutException
- {
-
- filePdnsd = new File(installFolder, LIB_NAME);
-
- if (!installFolder.exists())
- installFolder.mkdirs();
-
- File fileNativeDir = new File(getNativeLibraryDir(context));
- filePdnsd = new File(fileNativeDir,LIB_NAME + ".so");
-
- if (filePdnsd.exists())
- {
- if (filePdnsd.canExecute())
- return filePdnsd;
- else
- {
- setExecutable(filePdnsd);
-
- if (filePdnsd.canExecute())
- return filePdnsd;
- }
- }
-
- if (filePdnsd.exists()) {
- InputStream is = new FileInputStream(filePdnsd);
- streamToFile(is, filePdnsd, false, true);
- setExecutable(filePdnsd);
-
- if (filePdnsd.exists() && filePdnsd.canExecute())
- return filePdnsd;
- }
-
- //let's try another approach
- filePdnsd = new File(installFolder, LIB_NAME);
- //fileTor = NativeLoader.initNativeLibs(context,fileTor);
- CustomNativeLoader.initNativeLibs(context,filePdnsd);
-
- setExecutable(filePdnsd);
-
- if (filePdnsd != null && filePdnsd.exists() && filePdnsd.canExecute())
- return filePdnsd;
-
- return null;
- }
-
-
- // Return Full path to the directory where native JNI libraries are stored.
- private static String getNativeLibraryDir(Context context) {
- ApplicationInfo appInfo = context.getApplicationInfo();
- return appInfo.nativeLibraryDir;
- }
-
-
-
-
-
-
- /*
- * Reads file from assetPath/assetKey writes it to the install folder
- */
- private File assetToFile(String assetPath, String assetKey, boolean isZipped, boolean isExecutable) throws IOException {
- InputStream is = context.getAssets().open(assetPath);
- File outFile = new File(installFolder, assetKey);
- streamToFile(is, outFile, false, isZipped);
- if (isExecutable) {
- setExecutable(outFile);
- }
- return outFile;
- }
-
-
- /*
- * Write the inputstream contents to the file
- */
- private static boolean streamToFile(InputStream stm, File outFile, boolean append, boolean zip) throws IOException
-
- {
- byte[] buffer = new byte[FILE_WRITE_BUFFER_SIZE];
-
- int bytecount;
-
- OutputStream stmOut = new FileOutputStream(outFile.getAbsolutePath(), append);
- ZipInputStream zis = null;
-
- if (zip)
- {
- zis = new ZipInputStream(stm);
- ZipEntry ze = zis.getNextEntry();
- stm = zis;
-
- }
-
- while ((bytecount = stm.read(buffer)) > 0)
- {
-
- stmOut.write(buffer, 0, bytecount);
-
- }
-
- stmOut.close();
- stm.close();
-
- if (zis != null)
- zis.close();
-
-
- return true;
-
- }
-
-
-
- private void setExecutable(File fileBin) {
- fileBin.setReadable(true);
- fileBin.setExecutable(true);
- fileBin.setWritable(false);
- fileBin.setWritable(true, true);
- }
-
- private static File[] listf(String directoryName) {
-
- // .............list file
- File directory = new File(directoryName);
-
- // get all the files from a directory
- File[] fList = directory.listFiles();
-
- if (fList != null)
- for (File file : fList) {
- if (file.isFile()) {
- Log.d(TAG,file.getAbsolutePath());
- } else if (file.isDirectory()) {
- listf(file.getAbsolutePath());
- }
- }
-
- return fList;
- }
-
-
-}
diff --git a/orbotservice/src/main/jni/Android.mk b/orbotservice/src/main/jni/Android.mk
index c4448dbc..10accb58 100644
--- a/orbotservice/src/main/jni/Android.mk
+++ b/orbotservice/src/main/jni/Android.mk
@@ -29,6 +29,7 @@ LOCAL_MODULE := pdnsd
LOCAL_SRC_FILES := $(PDNSD_SOURCES:$(LOCAL_PATH)/%=%)
LOCAL_CFLAGS := -Wall -O2 -I$(LOCAL_PATH)/pdnsd -DHAVE_STPCPY
+
include $(BUILD_EXECUTABLE)
########################################################
More information about the tor-commits
mailing list