[tor-commits] [tor-browser/tor-browser-60.3.0esr-8.5-1] 28051

gk at torproject.org gk at torproject.org
Thu Nov 22 21:16:52 UTC 2018


commit 8e8445c1d47644e6e34fc1b96d6934a9aa13f58b
Author: Georg Koppen <gk at torproject.org>
Date:   Thu Nov 22 14:58:20 2018 +0000

    28051
---
 build.gradle                                       |  4 ++
 mobile/android/app/000-tor-browser-android.js      |  3 --
 mobile/android/app/build.gradle                    | 11 +++++
 mobile/android/base/AndroidManifest.xml.in         |  1 +
 .../base/java/org/mozilla/gecko/BrowserApp.java    | 53 ++++++++++------------
 .../base/java/org/mozilla/gecko/GeckoApp.java      | 29 ++++++++++++
 .../java/org/mozilla/gecko/GeckoApplication.java   |  5 ++
 .../java/org/mozilla/gecko/LauncherActivity.java   | 18 ++++++++
 .../gecko/notifications/NotificationClient.java    |  6 ++-
 .../gecko/notifications/NotificationHelper.java    |  5 +-
 mobile/android/config/proguard/proguard.cfg        | 15 ++++++
 .../java/org/mozilla/gecko/util/ProxySelector.java |  4 +-
 12 files changed, 116 insertions(+), 38 deletions(-)

diff --git a/build.gradle b/build.gradle
index a080e15b2fac..6cf2d4cc0e7a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -32,6 +32,10 @@ allprojects {
                 url repository
             }
         }
+        // These are needed for Orbot's dependencies
+        maven { url "https://raw.githubusercontent.com/guardianproject/gpmaven/master" }
+        maven { url 'https://jitpack.io' }
+        jcenter()
     }
 }
 
diff --git a/mobile/android/app/000-tor-browser-android.js b/mobile/android/app/000-tor-browser-android.js
index c329fcdee5f7..e7e337276acb 100644
--- a/mobile/android/app/000-tor-browser-android.js
+++ b/mobile/android/app/000-tor-browser-android.js
@@ -54,9 +54,6 @@ pref("media.realtime_decoder.enabled", false);
 pref("general.useragent.updates.enabled", false);
 pref("general.useragent.updates.url", "");
 
-// Override this because Orbot uses 9050 as the default
-pref("network.proxy.socks_port", 9050);
-
 // Do not allow the user to install extensions from web
 pref("xpinstall.enabled", false);
 pref("extensions.enabledScopes", 1);
diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle
index 7c515bbe65a7..d0060901b6b3 100644
--- a/mobile/android/app/build.gradle
+++ b/mobile/android/app/build.gradle
@@ -225,6 +225,9 @@ dependencies {
     implementation "com.android.support:design:${mozconfig.substs.ANDROID_SUPPORT_LIBRARY_VERSION}"
     implementation "com.android.support:customtabs:${mozconfig.substs.ANDROID_SUPPORT_LIBRARY_VERSION}"
     implementation "com.android.support:palette-v7:${mozconfig.substs.ANDROID_SUPPORT_LIBRARY_VERSION}"
+    implementation files('Orbot-16.0.5-RC-1-tor-0.3.4.9-fullperm-release.aar')
+    implementation files('orbotservice-release.aar')
+    implementation files('jsocksAndroid-release.aar')
 
     if (mozconfig.substs.MOZ_NATIVE_DEVICES) {
         implementation "com.android.support:mediarouter-v7:${mozconfig.substs.ANDROID_SUPPORT_LIBRARY_VERSION}"
@@ -262,6 +265,14 @@ dependencies {
 
     // Including the Robotium JAR directly can cause issues with dexing.
     androidTestImplementation 'com.jayway.android.robotium:robotium-solo:5.5.4'
+
+    // Orbot
+    implementation 'com.github.delight-im:Android-Languages:v1.0.1'
+    implementation 'pl.bclogic:pulsator4droid:1.0.3'
+
+    // Orbotservice
+    implementation 'org.torproject:tor-android-binary:0.3.4.9'
+    implementation 'com.jrummyapps:android-shell:1.0.1'
 }
 
 // TODO: (bug 1261486): This impl is not robust -
diff --git a/mobile/android/base/AndroidManifest.xml.in b/mobile/android/base/AndroidManifest.xml.in
index c4ea9a37683e..0e5f4edaf814 100644
--- a/mobile/android/base/AndroidManifest.xml.in
+++ b/mobile/android/base/AndroidManifest.xml.in
@@ -24,6 +24,7 @@
 #include FennecManifest_permissions.xml.in
 
     <application android:label="@string/moz_app_displayname"
+                 tools:replace="android:label"
                  android:icon="@drawable/icon"
                  android:logo="@drawable/logo"
                  android:name="@MOZ_ANDROID_APPLICATION_CLASS@"
diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
index 5efd83398775..42b9ebd0a3f7 100644
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -181,7 +181,8 @@ import org.mozilla.gecko.widget.GeckoActionProvider;
 import org.mozilla.gecko.widget.SplashScreen;
 import org.mozilla.geckoview.GeckoSession;
 
-import info.guardianproject.netcipher.proxy.OrbotHelper;
+import org.torproject.android.OrbotMainActivity;
+import org.torproject.android.service.TorServiceConstants;
 
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -239,6 +240,9 @@ public class BrowserApp extends GeckoApp
     public static final int ACTIVITY_REQUEST_TRIPLE_READERVIEW = 4001;
     public static final int ACTIVITY_RESULT_TRIPLE_READERVIEW_ADD_BOOKMARK = 4002;
     public static final int ACTIVITY_RESULT_TRIPLE_READERVIEW_IGNORE = 4003;
+    public static final int ACTIVITY_RESULT_ORBOT_LAUNCH = 5001;
+
+    private static boolean mOrbotRun = false;
 
     public static final String ACTION_VIEW_MULTIPLE = AppConstants.ANDROID_PACKAGE_NAME + ".action.VIEW_MULTIPLE";
 
@@ -1282,41 +1286,26 @@ public class BrowserApp extends GeckoApp
 
         @Override
         public void onReceive(Context context, Intent intent) {
-            if (TextUtils.equals(intent.getAction(), OrbotHelper.ACTION_STATUS)) {
+            if (TextUtils.equals(intent.getAction(), TorServiceConstants.ACTION_STATUS)) {
                 GeckoAppShell.setTorStatus(intent);
             }
         }
     };
 
     public void checkStartOrbot() {
-        if (!OrbotHelper.isOrbotInstalled(this)) {
-            final Intent installOrbotIntent = OrbotHelper.getOrbotInstallIntent(this);
+        /* run in thread so Tor status updates will be received while the
+        * Gecko event sync is blocking the main thread */
+        HandlerThread handlerThread = new HandlerThread("torStatusReceiver");
+        handlerThread.start();
+        Looper looper = handlerThread.getLooper();
+        Handler handler = new Handler(looper);
+        registerReceiver(torStatusReceiver, new IntentFilter(TorServiceConstants.ACTION_STATUS),
+            null, handler);
 
-            AlertDialog.Builder builder = new AlertDialog.Builder(this);
-            builder.setTitle(R.string.install_orbot);
-            builder.setMessage(R.string.you_must_have_orbot);
-            builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
-                @Override
-                public void onClick(DialogInterface dialogInterface, int i) {
-                    startActivity(installOrbotIntent);
-                }
-            });
-            builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
-                @Override
-                public void onClick(DialogInterface dialogInterface, int i) {
-                }
-            });
-            builder.show();
-        } else {
-            /* run in thread so Tor status updates will be received while the
-            * Gecko event sync is blocking the main thread */
-            HandlerThread handlerThread = new HandlerThread("torStatusReceiver");
-            handlerThread.start();
-            Looper looper = handlerThread.getLooper();
-            Handler handler = new Handler(looper);
-            registerReceiver(torStatusReceiver, new IntentFilter(OrbotHelper.ACTION_STATUS),
-                null, handler);
-            OrbotHelper.requestStartTor(this);
+        if (!mOrbotRun) {
+          final String orbotStartAction = "android.intent.action.MAIN";
+          final Intent launchOrbot = new Intent(orbotStartAction, null, this, OrbotMainActivity.class);
+          startActivityForResult(launchOrbot, ACTIVITY_RESULT_ORBOT_LAUNCH, null);
         }
     }
 
@@ -3018,6 +3007,12 @@ public class BrowserApp extends GeckoApp
                 TabQueueHelper.processTabQueuePromptResponse(resultCode, this);
                 break;
 
+            case ACTIVITY_RESULT_ORBOT_LAUNCH:
+                final SafeIntent intent = new SafeIntent(getIntent());
+                Log.d(LOGTAG, "onActivityResult: ACTIVITY_RESULT_ORBOT_LAUNCH");
+                mOrbotRun = true;
+                break;
+
             default:
                 for (final BrowserAppDelegate delegate : delegates) {
                     delegate.onActivityResult(this, requestCode, resultCode, data);
diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
index 63a136541970..ef7da17e19a1 100644
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
@@ -91,6 +91,8 @@ import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 
+import org.torproject.android.service.TorService;
+
 import java.io.File;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -592,6 +594,9 @@ public abstract class GeckoApp extends GeckoActivity
 
         EventDispatcher.getInstance().dispatch("Browser:Quit", res);
 
+        Intent torService = new Intent(this, TorService.class);
+        stopService(torService);
+
         // We don't call shutdown here because this creates a race condition which
         // can cause the clearing of private data to fail. Instead, we shut down the
         // UI only after we're done sanitizing.
@@ -1201,6 +1206,30 @@ public abstract class GeckoApp extends GeckoActivity
                             }
                         }
                     }
+                } else if (mIsRestoringActivity) {
+                    /* Synchronize Tabs state with Gecko. We're restoring the Activity, this
+                     * mean all of the Chrome state was lost, but the previously created
+                     * Tabs still exist within the Android application, because those are
+                     * static and the application keeps track of those (and only the Activity
+                     * is starting, the application was never destroyed). */
+                    Iterable<Tab> tabs = Tabs.getInstance().getTabsInOrder();
+                    Tab selectedTab = Tabs.getInstance().getSelectedTab();
+                    for (Tab tab : tabs) {
+                        GeckoBundle reloadMessage = new GeckoBundle();
+                        reloadMessage.putString("url", tab.getURL());
+                        reloadMessage.putString("engine", null);
+                        reloadMessage.putInt("parentId", tab.getParentId());
+                        reloadMessage.putBoolean("userEntered", true);
+                        reloadMessage.putBoolean("isPrivate", tab.isPrivate());
+                        reloadMessage.putBoolean("pinned", false);
+                        reloadMessage.putBoolean("desktopMode", tab.getDesktopMode());
+                        reloadMessage.putString("referrerURI", null);
+                        reloadMessage.putInt("tabID", tab.getId());
+                        reloadMessage.putBoolean("newTab", true);
+                        reloadMessage.putBoolean("delayLoad", selectedTab != tab);
+                        reloadMessage.putBoolean("selected", selectedTab == tab);
+                        getAppEventDispatcher().dispatch("Tab:Load", reloadMessage);
+                    }
                 }
 
                 synchronized (GeckoApp.this) {
diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java
index e896134e0af9..b38e7184c798 100644
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java
@@ -62,6 +62,8 @@ import java.lang.reflect.Method;
 import java.net.URL;
 import java.util.UUID;
 
+import org.torproject.android.service.util.Prefs;
+
 public class GeckoApplication extends Application
                               implements HapticFeedbackDelegate {
     private static final String LOG_TAG = "GeckoApplication";
@@ -319,6 +321,9 @@ public class GeckoApplication extends Application
                 "Profile:Create",
                 null);
 
+        // Give Orbot the base Context
+        Prefs.setContext(context);
+
         super.onCreate();
     }
 
diff --git a/mobile/android/base/java/org/mozilla/gecko/LauncherActivity.java b/mobile/android/base/java/org/mozilla/gecko/LauncherActivity.java
index e8f8facc24c6..4cd94ed538c7 100644
--- a/mobile/android/base/java/org/mozilla/gecko/LauncherActivity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/LauncherActivity.java
@@ -45,6 +45,9 @@ import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_FXA_SIGNIN;
 
 import org.mozilla.gecko.deeplink.DeepLinkContract;
 
+import org.torproject.android.OrbotMainActivity;
+import org.torproject.android.service.TorServiceConstants;
+
 /**
  * Activity that receives incoming Intents and dispatches them to the appropriate activities (e.g. browser, custom tabs, web app).
  */
@@ -67,6 +70,9 @@ public class LauncherActivity extends Activity {
         } else if (isWebAppIntent(safeIntent)) {
             dispatchWebAppIntent();
 
+        } else if (TorServiceConstants.TOR_APP_USERNAME.equals(getIntent().getAction())) {
+            dispatchOrbotIntent();
+
         // If it's not a view intent, it won't be a custom tabs intent either. Just launch!
         } else if (!isViewIntentWithURL(safeIntent)) {
             dispatchNormalIntent();
@@ -116,6 +122,18 @@ public class LauncherActivity extends Activity {
         startActivity(intent);
     }
 
+    private void dispatchOrbotIntent() {
+        final String orbotStartAction = "android.intent.action.MAIN";
+        final Intent intent = new Intent(orbotStartAction, null, this, OrbotMainActivity.class);
+
+        //When we launch Orbot, we want a new task.
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
+        intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+
+        startActivity(intent);
+    }
+
     private void dispatchUrlIntent(@NonNull String url) {
         Intent intent = new Intent(getIntent());
         intent.setData(Uri.parse(url));
diff --git a/mobile/android/base/java/org/mozilla/gecko/notifications/NotificationClient.java b/mobile/android/base/java/org/mozilla/gecko/notifications/NotificationClient.java
index d8392a801e13..c66d67f32787 100644
--- a/mobile/android/base/java/org/mozilla/gecko/notifications/NotificationClient.java
+++ b/mobile/android/base/java/org/mozilla/gecko/notifications/NotificationClient.java
@@ -28,6 +28,8 @@ import org.mozilla.gecko.NotificationListener;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.util.BitmapUtils;
 
+import org.torproject.android.service.util.NotificationBuilderCompat;
+
 /**
  * Client for posting notifications.
  */
@@ -142,7 +144,7 @@ public final class NotificationClient implements NotificationListener {
     private void add(final String name, final String imageUrl, final String host,
                      final String alertTitle, final String alertText,
                      final PendingIntent contentIntent, final PendingIntent deleteIntent) {
-        final NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext)
+        final NotificationBuilderCompat builder = new NotificationBuilderCompat(mContext)
                 .setContentTitle(alertTitle)
                 .setContentText(alertText)
                 .setSmallIcon(R.drawable.ic_status_logo)
@@ -150,7 +152,7 @@ public final class NotificationClient implements NotificationListener {
                 .setDeleteIntent(deleteIntent)
                 .setAutoCancel(true)
                 .setDefaults(Notification.DEFAULT_SOUND)
-                .setStyle(new NotificationCompat.BigTextStyle()
+                .setStyle(new Notification.BigTextStyle()
                         .bigText(alertText)
                         .setSummaryText(host));
 
diff --git a/mobile/android/base/java/org/mozilla/gecko/notifications/NotificationHelper.java b/mobile/android/base/java/org/mozilla/gecko/notifications/NotificationHelper.java
index 34ea99882d9a..35366609da49 100644
--- a/mobile/android/base/java/org/mozilla/gecko/notifications/NotificationHelper.java
+++ b/mobile/android/base/java/org/mozilla/gecko/notifications/NotificationHelper.java
@@ -32,10 +32,11 @@ import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.graphics.Bitmap;
 import android.net.Uri;
-import android.support.v4.app.NotificationCompat;
 import android.support.v4.util.SimpleArrayMap;
 import android.util.Log;
 
+import org.torproject.android.service.util.NotificationBuilderCompat;
+
 public final class NotificationHelper implements BundleEventListener {
     public static final String HELPER_BROADCAST_ACTION = AppConstants.ANDROID_PACKAGE_NAME + ".helperBroadcastAction";
 
@@ -233,7 +234,7 @@ public final class NotificationHelper implements BundleEventListener {
     private void showNotification(final GeckoBundle message) {
         ThreadUtils.assertOnUiThread();
 
-        final NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
+        final NotificationBuilderCompat builder = new NotificationBuilderCompat(mContext);
 
         // These attributes are required
         final String id = message.getString(ID_ATTR);
diff --git a/mobile/android/config/proguard/proguard.cfg b/mobile/android/config/proguard/proguard.cfg
index 0be8a745e44b..3d03e3107c72 100644
--- a/mobile/android/config/proguard/proguard.cfg
+++ b/mobile/android/config/proguard/proguard.cfg
@@ -165,6 +165,21 @@
 # See: http://stackoverflow.com/questions/22441366/note-android-support-v4-text-icucompatics-cant-find-dynamically-referenced-cl
 -dontnote android.support.**
 
+# From https://github.com/square/okhttp/blob/master/okhttp/src/main/resources/META-INF/proguard/okhttp3.pro
+# JSR 305 annotations are for embedding nullability information.
+-dontwarn javax.annotation.**
+
+# A resource is loaded with a relative path so the package of this class must be preserved.
+-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
+
+# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java.
+-dontwarn org.codehaus.mojo.animal_sniffer.*
+
+# OkHttp platform used only on JVM and when Conscrypt dependency is available.
+-dontwarn okhttp3.internal.platform.ConscryptPlatform
+
+#-keepnames class org.torproject.*
+
 -include "adjust-keeps.cfg"
 
 -include "leakcanary-keeps.cfg"
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ProxySelector.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ProxySelector.java
index f05716fe1d09..41c2c7e705a1 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ProxySelector.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ProxySelector.java
@@ -30,8 +30,8 @@ import java.util.List;
 
 public class ProxySelector {
     private static final String TOR_PROXY_ADDRESS = "127.0.0.1";
-    private static final int TOR_SOCKS_PROXY_PORT = 9050;
-    private static final int TOR_HTTP_PROXY_PORT = 8118;
+    private static final int TOR_SOCKS_PROXY_PORT = 9150;
+    private static final int TOR_HTTP_PROXY_PORT = 8218;
 
     public static URLConnection openConnectionWithProxy(URI uri) throws IOException {
         java.net.ProxySelector ps = java.net.ProxySelector.getDefault();





More information about the tor-commits mailing list