commit 4bdfb79a68845ce2677c40eadde36fd7e294d6ea Author: n8fr8 nathan@freitas.net Date: Mon May 14 12:44:45 2018 -0400
update code to properly unzip entries from APK zip if needed --- .../android/service/util/NativeLoader.java | 114 +++++++++++++++++++++ .../service/util/OtherResourceInstaller.java | 29 ++++-- 2 files changed, 136 insertions(+), 7 deletions(-)
diff --git a/orbotservice/src/main/java/org/torproject/android/service/util/NativeLoader.java b/orbotservice/src/main/java/org/torproject/android/service/util/NativeLoader.java new file mode 100644 index 00000000..d6a25436 --- /dev/null +++ b/orbotservice/src/main/java/org/torproject/android/service/util/NativeLoader.java @@ -0,0 +1,114 @@ + +package org.torproject.android.service.util; + +import android.content.Context; +import android.os.Build; +import android.util.Log; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipInputStream; + +public class NativeLoader { + + private final static String TAG = "TorNativeLoader"; + + private static boolean loadFromZip(Context context, String libName, File destLocalFile, String folder) { + + + ZipFile zipFile = null; + ZipInputStream stream = null; + try { + zipFile = new ZipFile(context.getApplicationInfo().sourceDir); + ZipEntry entry = zipFile.getEntry("lib/" + folder + "/" + libName + ".so"); + if (entry == null) { + throw new Exception("Unable to find file in apk:" + "lib/" + folder + "/" + libName); + } + //the zip file entry is also zipped itself! + stream = new ZipInputStream(zipFile.getInputStream(entry)); + stream.getNextEntry(); + + OutputStream out = new FileOutputStream(destLocalFile); + byte[] buf = new byte[4096]; + int len; + while ((len = stream.read(buf)) > 0) { + Thread.yield(); + out.write(buf, 0, len); + } + out.close(); + + if (Build.VERSION.SDK_INT >= 9) { + destLocalFile.setReadable(true, false); + destLocalFile.setExecutable(true, false); + destLocalFile.setWritable(true); + } + + + return true; + } catch (Exception e) { + Log.e(TAG, e.getMessage()); + } finally { + if (stream != null) { + try { + stream.close(); + } catch (Exception e) { + Log.e(TAG, e.getMessage()); + } + } + if (zipFile != null) { + try { + zipFile.close(); + } catch (Exception e) { + Log.e(TAG, e.getMessage()); + } + } + } + return false; + } + + public static synchronized boolean initNativeLibs(Context context, String binaryName, File destLocalFile) { + + try { + String folder = null; + + try { + + if (Build.CPU_ABI.equalsIgnoreCase("armeabi-v7a")) { + folder = "armeabi-v7a"; + } else if (Build.CPU_ABI.startsWith("armeabi")) { + folder = "armeabi"; + } else if (Build.CPU_ABI.equalsIgnoreCase("x86")) { + folder = "x86"; + } else if (Build.CPU_ABI.equalsIgnoreCase("mips")) { + folder = "mips"; + } else { + folder = "armeabi"; + //FileLog.e("tmessages", "Unsupported arch: " + Build.CPU_ABI); + } + } catch (Exception e) { + // FileLog.e("tmessages", e); + Log.e(TAG, e.getMessage()); + folder = "armeabi"; + } + + + String javaArch = System.getProperty("os.arch"); + if (javaArch != null && javaArch.contains("686")) { + folder = "x86"; + } + + if (loadFromZip(context, binaryName, destLocalFile, folder)) { + return true; + } + + } catch (Throwable e) { + e.printStackTrace(); + } + + return false; + } +} diff --git a/orbotservice/src/main/java/org/torproject/android/service/util/OtherResourceInstaller.java b/orbotservice/src/main/java/org/torproject/android/service/util/OtherResourceInstaller.java index 672d6411..c02c5c54 100644 --- a/orbotservice/src/main/java/org/torproject/android/service/util/OtherResourceInstaller.java +++ b/orbotservice/src/main/java/org/torproject/android/service/util/OtherResourceInstaller.java @@ -72,22 +72,37 @@ public class OtherResourceInstaller implements TorServiceConstants {
File libBinary = new File(getNativeLibraryDir(context),OBFSCLIENT_ASSET_KEY + ".so"); outFile = new File(installFolder, OBFSCLIENT_ASSET_KEY); + if (libBinary.exists()) { + if ((!outFile.exists()) || (libBinary.lastModified() > outFile.lastModified())) { + streamToFile(new FileInputStream(libBinary), outFile, false, true); + }
- if ((!outFile.exists()) || (libBinary.lastModified() > outFile.lastModified())) { - streamToFile(new FileInputStream(libBinary), outFile, false, true); + setExecutable(outFile); + } + else + { + NativeLoader.initNativeLibs(context,OBFSCLIENT_ASSET_KEY,outFile); }
- setExecutable(outFile); + if (!outFile.exists()) + return false;
libBinary = new File(getNativeLibraryDir(context),PDNSD_ASSET_KEY + ".so"); outFile = new File(installFolder, PDNSD_ASSET_KEY); + if (libBinary.exists()) { + if ((!outFile.exists()) || (libBinary.lastModified() > outFile.lastModified())) { + streamToFile(new FileInputStream(libBinary), outFile, false, true); + }
- if ((!outFile.exists()) || (libBinary.lastModified() > outFile.lastModified())) { - streamToFile(new FileInputStream(libBinary), outFile, false, true); + setExecutable(outFile); + } + else + { + NativeLoader.initNativeLibs(context,PDNSD_ASSET_KEY,outFile); }
- setExecutable(outFile); - + if (!outFile.exists()) + return false;
return true; }
tor-commits@lists.torproject.org