Pier Angelo Vendrame pushed to branch tor-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
- 
f49834e2
by Dan Ballard at 2024-01-25T17:05:18+00:00
- 
db59cb25
by Dan Ballard at 2024-01-25T17:05:18+00:00
4 changed files:
- mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorIntegrationAndroid.java
- mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorSettings.java
- mobile/android/geckoview/src/main/java/org/mozilla/geckoview/androidlegacysettings/TorLegacyAndroidSettings.java
- toolkit/modules/TorSettings.sys.mjs
Changes:
| ... | ... | @@ -82,6 +82,10 @@ public class TorIntegrationAndroid implements BundleEventListener { | 
| 82 | 82 |      private final HashMap<Integer, MeekTransport> mMeeks = new HashMap<>();
 | 
| 83 | 83 |      private int mMeekCounter;
 | 
| 84 | 84 | |
| 85 | +    // mSettings is a java side copy of the authoritative settings in the JS code.
 | |
| 86 | +    // it's useful to maintain as the ui may be fetching these options often and
 | |
| 87 | +    // we don't watch each fetch to be a passthrough to JS with JSON serialization and
 | |
| 88 | +    // deserialization each time
 | |
| 85 | 89 |      private TorSettings mSettings = null;
 | 
| 86 | 90 | |
| 87 | 91 |      /* package */ TorIntegrationAndroid(Context context) {
 | 
| ... | ... | @@ -557,11 +561,38 @@ public class TorIntegrationAndroid implements BundleEventListener { | 
| 557 | 561 |          void onSettingsRequested();
 | 
| 558 | 562 |      }
 | 
| 559 | 563 | |
| 560 | -    public @NonNull GeckoResult<GeckoBundle> getSettings() {
 | |
| 561 | -        return EventDispatcher.getInstance().queryBundle(EVENT_SETTINGS_GET);
 | |
| 564 | +    private @NonNull void reloadSettings() {
 | |
| 565 | +        EventDispatcher.getInstance().queryBundle(EVENT_SETTINGS_GET).then( new GeckoResult.OnValueListener<GeckoBundle, Void>() {
 | |
| 566 | +            public GeckoResult<Void> onValue(final GeckoBundle bundle) {
 | |
| 567 | +                mSettings = new TorSettings(bundle);
 | |
| 568 | +                return new GeckoResult<Void>();
 | |
| 569 | +            }
 | |
| 570 | +        });
 | |
| 571 | +    }
 | |
| 572 | + | |
| 573 | +    public TorSettings getSettings() {
 | |
| 574 | +        return mSettings;
 | |
| 575 | +    }
 | |
| 576 | + | |
| 577 | +    public void setSettings(final TorSettings settings, boolean save, boolean apply) {
 | |
| 578 | +        mSettings = settings;
 | |
| 579 | + | |
| 580 | +        emitSetSettings(settings, save, apply).then(
 | |
| 581 | +            new GeckoResult.OnValueListener<Void, Void>() {
 | |
| 582 | +                public GeckoResult<Void> onValue(Void v) {
 | |
| 583 | +                    return new GeckoResult<Void>();
 | |
| 584 | +                }
 | |
| 585 | +            },
 | |
| 586 | +            new GeckoResult.OnExceptionListener<Void>() {
 | |
| 587 | +                public GeckoResult<Void> onException(final Throwable e) {
 | |
| 588 | +                    Log.e(TAG, "Failed to set settings", e);
 | |
| 589 | +                    reloadSettings();
 | |
| 590 | +                    return new GeckoResult<Void>();
 | |
| 591 | +                }
 | |
| 592 | +            });
 | |
| 562 | 593 |      }
 | 
| 563 | 594 | |
| 564 | -    public @NonNull GeckoResult<Void> setSettings(final TorSettings settings, boolean save, boolean apply) {
 | |
| 595 | +    private @NonNull GeckoResult<Void> emitSetSettings(final TorSettings settings, boolean save, boolean apply) {
 | |
| 565 | 596 |          GeckoBundle bundle = new GeckoBundle(3);
 | 
| 566 | 597 |          bundle.putBoolean("save", save);
 | 
| 567 | 598 |          bundle.putBoolean("apply", apply);
 | 
| ... | ... | @@ -2,24 +2,8 @@ package org.mozilla.geckoview; | 
| 2 | 2 | |
| 3 | 3 |  import android.util.Log;
 | 
| 4 | 4 | |
| 5 | -import org.json.JSONArray;
 | |
| 6 | -import org.json.JSONObject;
 | |
| 7 | 5 |  import org.mozilla.gecko.util.GeckoBundle;
 | 
| 8 | 6 | |
| 9 | -import java.io.ByteArrayInputStream;
 | |
| 10 | -import java.io.File;
 | |
| 11 | -import java.io.FileOutputStream;
 | |
| 12 | -import java.io.IOException;
 | |
| 13 | -import java.io.InputStream;
 | |
| 14 | -import java.io.PrintStream;
 | |
| 15 | -import java.io.SequenceInputStream;
 | |
| 16 | -import java.io.UnsupportedEncodingException;
 | |
| 17 | -import java.util.ArrayList;
 | |
| 18 | -import java.util.Arrays;
 | |
| 19 | -import java.util.List;
 | |
| 20 | -import java.util.Locale;
 | |
| 21 | -import java.util.stream.Collectors;
 | |
| 22 | - | |
| 23 | 7 |  public class TorSettings {
 | 
| 24 | 8 | |
| 25 | 9 |      public enum BridgeSource {
 | 
| ... | ... | @@ -76,6 +60,35 @@ public class TorSettings { | 
| 76 | 60 |          }
 | 
| 77 | 61 |      }
 | 
| 78 | 62 | |
| 63 | +    public enum BridgeBuiltinType {
 | |
| 64 | +        /* TorSettings.sys.mjs ~ln43:  string: obfs4|meek-azure|snowflake|etc */
 | |
| 65 | +        Invalid("invalid"),
 | |
| 66 | +        Obfs4("obfs4"),
 | |
| 67 | +        MeekAzure("meek-azure"),
 | |
| 68 | +        Snowflake("snowflake");
 | |
| 69 | + | |
| 70 | + | |
| 71 | +        private String type;
 | |
| 72 | + | |
| 73 | +        BridgeBuiltinType(String type) {
 | |
| 74 | +            this.type = type;
 | |
| 75 | +        }
 | |
| 76 | + | |
| 77 | +        public String toString() {
 | |
| 78 | +            return type;
 | |
| 79 | +        }
 | |
| 80 | + | |
| 81 | +        public static BridgeBuiltinType fromString(String s) {
 | |
| 82 | +            switch (s) {
 | |
| 83 | +                case "obfs4": return Obfs4;
 | |
| 84 | +                case "meek-azure": return MeekAzure;
 | |
| 85 | +                case "snowflake": return Snowflake;
 | |
| 86 | +            }
 | |
| 87 | +            return Invalid;
 | |
| 88 | +        }
 | |
| 89 | + | |
| 90 | +    }
 | |
| 91 | + | |
| 79 | 92 |      private boolean loaded = false;
 | 
| 80 | 93 | |
| 81 | 94 |      public boolean enabled = true;
 | 
| ... | ... | @@ -85,7 +98,7 @@ public class TorSettings { | 
| 85 | 98 |      // bridges section
 | 
| 86 | 99 |      public boolean bridgesEnabled = false;
 | 
| 87 | 100 |      public BridgeSource bridgesSource = BridgeSource.Invalid;
 | 
| 88 | -    public String bridgesBuiltinType = "";
 | |
| 101 | +    public BridgeBuiltinType bridgesBuiltinType = BridgeBuiltinType.Invalid;
 | |
| 89 | 102 |      public String[] bridgeBridgeStrings;
 | 
| 90 | 103 | |
| 91 | 104 |      // proxy section
 | 
| ... | ... | @@ -112,7 +125,7 @@ public class TorSettings { | 
| 112 | 125 | |
| 113 | 126 |              bridgesEnabled = bridges.getBoolean("enabled");
 | 
| 114 | 127 |              bridgesSource = BridgeSource.fromInt(bridges.getInt("source"));
 | 
| 115 | -            bridgesBuiltinType = bridges.getString("builtin_type");
 | |
| 128 | +            bridgesBuiltinType = BridgeBuiltinType.fromString(bridges.getString("builtin_type"));
 | |
| 116 | 129 |              bridgeBridgeStrings = bridges.getStringArray("bridge_strings");
 | 
| 117 | 130 | |
| 118 | 131 |              quickstart = qs.getBoolean("enabled");
 | 
| ... | ... | @@ -143,7 +156,7 @@ public class TorSettings { | 
| 143 | 156 | |
| 144 | 157 |          bridges.putBoolean("enabled", bridgesEnabled);
 | 
| 145 | 158 |          bridges.putInt("source", bridgesSource.toInt());
 | 
| 146 | -        bridges.putString("builtin_type", bridgesBuiltinType);
 | |
| 159 | +        bridges.putString("builtin_type", bridgesBuiltinType.toString());
 | |
| 147 | 160 |          bridges.putStringArray("bridge_strings", bridgeBridgeStrings);
 | 
| 148 | 161 | |
| 149 | 162 |          qs.putBoolean("enabled", quickstart);
 | 
| 1 | 1 |  package org.mozilla.geckoview.androidlegacysettings;
 | 
| 2 | 2 | |
| 3 | -import java.io.IOException;
 | |
| 4 | - | |
| 5 | -import android.content.SharedPreferences;
 | |
| 6 | - | |
| 7 | -import org.mozilla.gecko.GeckoAppShell;
 | |
| 8 | - | |
| 9 | 3 |  import org.mozilla.geckoview.TorSettings;
 | 
| 10 | 4 | |
| 11 | 5 |  public class TorLegacyAndroidSettings {
 | 
| ... | ... | @@ -54,10 +48,10 @@ public class TorLegacyAndroidSettings { | 
| 54 | 48 |              switch (userDefinedBridgeList) {
 | 
| 55 | 49 |                  case "obfs4":
 | 
| 56 | 50 |                  case "snowflake":
 | 
| 57 | -                    settings.bridgesBuiltinType = userDefinedBridgeList;
 | |
| 51 | +                    settings.bridgesBuiltinType = TorSettings.BridgeBuiltinType.fromString(userDefinedBridgeList);
 | |
| 58 | 52 |                      break;
 | 
| 59 | 53 |                  case "meek":
 | 
| 60 | -                    settings.bridgesBuiltinType = "meek-azure";
 | |
| 54 | +                    settings.bridgesBuiltinType = TorSettings.BridgeBuiltinType.MeekAzure;
 | |
| 61 | 55 |                      break;
 | 
| 62 | 56 |                  default:
 | 
| 63 | 57 |                      settings.bridgesSource = TorSettings.BridgeSource.Invalid;
 | 
| ... | ... | @@ -40,7 +40,7 @@ const TorSettingsPrefs = Object.freeze({ | 
| 40 | 40 |      enabled: "torbrowser.settings.bridges.enabled",
 | 
| 41 | 41 |      /* int: See TorBridgeSource */
 | 
| 42 | 42 |      source: "torbrowser.settings.bridges.source",
 | 
| 43 | -    /* string: obfs4|meek_azure|snowflake|etc */
 | |
| 43 | +    /* string: obfs4|meek-azure|snowflake|etc */
 | |
| 44 | 44 |      builtin_type: "torbrowser.settings.bridges.builtin_type",
 | 
| 45 | 45 |      /* preference branch: each child branch should be a bridge string */
 | 
| 46 | 46 |      bridge_strings: "torbrowser.settings.bridges.bridge_strings",
 |