tbb-commits
Threads by month
- ----- 2025 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 1 participants
- 18685 discussions

[Git][tpo/applications/tor-browser][tor-browser-115.7.0esr-13.5-1] 2 commits: fixup! Bug 40597: Implement TorSettings module
by Pier Angelo Vendrame (@pierov) 25 Jan '24
by Pier Angelo Vendrame (@pierov) 25 Jan '24
25 Jan '24
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
fixup! Bug 40597: Implement TorSettings module
Bug 42252: Fix typo in documents
- - - - -
db59cb25 by Dan Ballard at 2024-01-25T17:05:18+00:00
fixup! Bug 42247: Android helpers for the TorProvider
Bug 42252: Add support for TorController in firefox-android
- - - - -
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:
=====================================
mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorIntegrationAndroid.java
=====================================
@@ -82,6 +82,10 @@ public class TorIntegrationAndroid implements BundleEventListener {
private final HashMap<Integer, MeekTransport> mMeeks = new HashMap<>();
private int mMeekCounter;
+ // mSettings is a java side copy of the authoritative settings in the JS code.
+ // it's useful to maintain as the ui may be fetching these options often and
+ // we don't watch each fetch to be a passthrough to JS with JSON serialization and
+ // deserialization each time
private TorSettings mSettings = null;
/* package */ TorIntegrationAndroid(Context context) {
@@ -557,11 +561,38 @@ public class TorIntegrationAndroid implements BundleEventListener {
void onSettingsRequested();
}
- public @NonNull GeckoResult<GeckoBundle> getSettings() {
- return EventDispatcher.getInstance().queryBundle(EVENT_SETTINGS_GET);
+ private @NonNull void reloadSettings() {
+ EventDispatcher.getInstance().queryBundle(EVENT_SETTINGS_GET).then( new GeckoResult.OnValueListener<GeckoBundle, Void>() {
+ public GeckoResult<Void> onValue(final GeckoBundle bundle) {
+ mSettings = new TorSettings(bundle);
+ return new GeckoResult<Void>();
+ }
+ });
+ }
+
+ public TorSettings getSettings() {
+ return mSettings;
+ }
+
+ public void setSettings(final TorSettings settings, boolean save, boolean apply) {
+ mSettings = settings;
+
+ emitSetSettings(settings, save, apply).then(
+ new GeckoResult.OnValueListener<Void, Void>() {
+ public GeckoResult<Void> onValue(Void v) {
+ return new GeckoResult<Void>();
+ }
+ },
+ new GeckoResult.OnExceptionListener<Void>() {
+ public GeckoResult<Void> onException(final Throwable e) {
+ Log.e(TAG, "Failed to set settings", e);
+ reloadSettings();
+ return new GeckoResult<Void>();
+ }
+ });
}
- public @NonNull GeckoResult<Void> setSettings(final TorSettings settings, boolean save, boolean apply) {
+ private @NonNull GeckoResult<Void> emitSetSettings(final TorSettings settings, boolean save, boolean apply) {
GeckoBundle bundle = new GeckoBundle(3);
bundle.putBoolean("save", save);
bundle.putBoolean("apply", apply);
=====================================
mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorSettings.java
=====================================
@@ -2,24 +2,8 @@ package org.mozilla.geckoview;
import android.util.Log;
-import org.json.JSONArray;
-import org.json.JSONObject;
import org.mozilla.gecko.util.GeckoBundle;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintStream;
-import java.io.SequenceInputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Locale;
-import java.util.stream.Collectors;
-
public class TorSettings {
public enum BridgeSource {
@@ -76,6 +60,35 @@ public class TorSettings {
}
}
+ public enum BridgeBuiltinType {
+ /* TorSettings.sys.mjs ~ln43: string: obfs4|meek-azure|snowflake|etc */
+ Invalid("invalid"),
+ Obfs4("obfs4"),
+ MeekAzure("meek-azure"),
+ Snowflake("snowflake");
+
+
+ private String type;
+
+ BridgeBuiltinType(String type) {
+ this.type = type;
+ }
+
+ public String toString() {
+ return type;
+ }
+
+ public static BridgeBuiltinType fromString(String s) {
+ switch (s) {
+ case "obfs4": return Obfs4;
+ case "meek-azure": return MeekAzure;
+ case "snowflake": return Snowflake;
+ }
+ return Invalid;
+ }
+
+ }
+
private boolean loaded = false;
public boolean enabled = true;
@@ -85,7 +98,7 @@ public class TorSettings {
// bridges section
public boolean bridgesEnabled = false;
public BridgeSource bridgesSource = BridgeSource.Invalid;
- public String bridgesBuiltinType = "";
+ public BridgeBuiltinType bridgesBuiltinType = BridgeBuiltinType.Invalid;
public String[] bridgeBridgeStrings;
// proxy section
@@ -112,7 +125,7 @@ public class TorSettings {
bridgesEnabled = bridges.getBoolean("enabled");
bridgesSource = BridgeSource.fromInt(bridges.getInt("source"));
- bridgesBuiltinType = bridges.getString("builtin_type");
+ bridgesBuiltinType = BridgeBuiltinType.fromString(bridges.getString("builtin_type"));
bridgeBridgeStrings = bridges.getStringArray("bridge_strings");
quickstart = qs.getBoolean("enabled");
@@ -143,7 +156,7 @@ public class TorSettings {
bridges.putBoolean("enabled", bridgesEnabled);
bridges.putInt("source", bridgesSource.toInt());
- bridges.putString("builtin_type", bridgesBuiltinType);
+ bridges.putString("builtin_type", bridgesBuiltinType.toString());
bridges.putStringArray("bridge_strings", bridgeBridgeStrings);
qs.putBoolean("enabled", quickstart);
=====================================
mobile/android/geckoview/src/main/java/org/mozilla/geckoview/androidlegacysettings/TorLegacyAndroidSettings.java
=====================================
@@ -1,11 +1,5 @@
package org.mozilla.geckoview.androidlegacysettings;
-import java.io.IOException;
-
-import android.content.SharedPreferences;
-
-import org.mozilla.gecko.GeckoAppShell;
-
import org.mozilla.geckoview.TorSettings;
public class TorLegacyAndroidSettings {
@@ -54,10 +48,10 @@ public class TorLegacyAndroidSettings {
switch (userDefinedBridgeList) {
case "obfs4":
case "snowflake":
- settings.bridgesBuiltinType = userDefinedBridgeList;
+ settings.bridgesBuiltinType = TorSettings.BridgeBuiltinType.fromString(userDefinedBridgeList);
break;
case "meek":
- settings.bridgesBuiltinType = "meek-azure";
+ settings.bridgesBuiltinType = TorSettings.BridgeBuiltinType.MeekAzure;
break;
default:
settings.bridgesSource = TorSettings.BridgeSource.Invalid;
=====================================
toolkit/modules/TorSettings.sys.mjs
=====================================
@@ -40,7 +40,7 @@ const TorSettingsPrefs = Object.freeze({
enabled: "torbrowser.settings.bridges.enabled",
/* int: See TorBridgeSource */
source: "torbrowser.settings.bridges.source",
- /* string: obfs4|meek_azure|snowflake|etc */
+ /* string: obfs4|meek-azure|snowflake|etc */
builtin_type: "torbrowser.settings.bridges.builtin_type",
/* preference branch: each child branch should be a bridge string */
bridge_strings: "torbrowser.settings.bridges.bridge_strings",
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/308d6a…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/308d6a…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.7.0esr-13.5-1] fixup! Bug 42247: Android helpers for the TorProvider
by Pier Angelo Vendrame (@pierov) 25 Jan '24
by Pier Angelo Vendrame (@pierov) 25 Jan '24
25 Jan '24
Pier Angelo Vendrame pushed to branch tor-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
308d6a64 by Pier Angelo Vendrame at 2024-01-25T17:44:22+01:00
fixup! Bug 42247: Android helpers for the TorProvider
Bug 42368: Do not use API26+ java.nio features
- - - - -
1 changed file:
- mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorIntegrationAndroid.java
Changes:
=====================================
mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorIntegrationAndroid.java
=====================================
@@ -16,15 +16,10 @@ import androidx.annotation.Nullable;
import java.io.BufferedReader;
import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-import java.nio.file.attribute.PosixFilePermission;
-import java.nio.file.attribute.PosixFilePermissions;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -69,9 +64,9 @@ public class TorIntegrationAndroid implements BundleEventListener {
private static final String COOKIE_AUTH_FILE = "/auth-file";
private final String mLibraryDir;
- private final Path mCacheDir;
+ private final String mCacheDir;
private final String mIpcDirectory;
- private final String mDataDir;
+ private final File mDataDir;
private TorProcess mTorProcess = null;
/**
@@ -91,9 +86,9 @@ public class TorIntegrationAndroid implements BundleEventListener {
/* package */ TorIntegrationAndroid(Context context) {
mLibraryDir = context.getApplicationInfo().nativeLibraryDir;
- mCacheDir = context.getCacheDir().toPath();
+ mCacheDir = context.getCacheDir().getAbsolutePath();
mIpcDirectory = mCacheDir + "/tor-private";
- mDataDir = context.getDataDir().getAbsolutePath() + "/tor";
+ mDataDir = new File(context.getFilesDir(), "tor");
registerListener();
}
@@ -260,7 +255,7 @@ public class TorIntegrationAndroid implements BundleEventListener {
args.add("CookieAuthFile");
args.add(ipcDir + COOKIE_AUTH_FILE);
args.add("DataDirectory");
- args.add(mDataDir);
+ args.add(mDataDir.getAbsolutePath());
boolean copied = true;
try {
copyAndUseConfigFile("--defaults-torrc", "torrc-defaults", args);
@@ -322,15 +317,19 @@ public class TorIntegrationAndroid implements BundleEventListener {
private void cleanIpcDirectory() {
File directory = new File(TorIntegrationAndroid.this.mIpcDirectory);
- if (!Files.isDirectory(directory.toPath())) {
+ if (!directory.isDirectory()) {
if (!directory.mkdirs()) {
Log.e(TAG, "Failed to create the IPC directory.");
return;
}
try {
- Set<PosixFilePermission> chmod = PosixFilePermissions.fromString("rwx------");
- Files.setPosixFilePermissions(directory.toPath(), chmod);
- } catch (IOException e) {
+ directory.setReadable(false, false);
+ directory.setReadable(true, true);
+ directory.setWritable(false, false);
+ directory.setWritable(true, true);
+ directory.setExecutable(false, false);
+ directory.setExecutable(true, true);
+ } catch (SecurityException e) {
Log.e(TAG, "Could not set the permissions to the IPC directory.", e);
}
return;
@@ -347,15 +346,46 @@ public class TorIntegrationAndroid implements BundleEventListener {
}
private void copyAndUseConfigFile(String option, String name, ArrayList<String> args) throws IOException {
- final Path path = Paths.get(mCacheDir.toFile().getAbsolutePath(), name);
- if (!mCopiedConfigFiles || !path.toFile().exists()) {
- final Context context = GeckoAppShell.getApplicationContext();
- final InputStream in = context.getAssets().open("common/" + name);
- Files.copy(in, path, StandardCopyOption.REPLACE_EXISTING);
+ File file = copyConfigFile(name);
+ args.add(option);
+ args.add(file.getAbsolutePath());
+ }
+
+ private File copyConfigFile(String name) throws IOException {
+ final File file = new File(mCacheDir, name);
+ if (mCopiedConfigFiles && file.exists()) {
+ return file;
+ }
+
+ final Context context = GeckoAppShell.getApplicationContext();
+ final InputStream in = context.getAssets().open("common/" + name);
+ // Files.copy is API 26+, so use java.io and a loop for now.
+ FileOutputStream out = null;
+ try {
+ out = new FileOutputStream(file);
+ } catch (IOException e) {
in.close();
+ throw e;
}
- args.add(option);
- args.add(path.toString());
+ try {
+ byte buffer[] = new byte[4096];
+ int read;
+ while ((read = in.read(buffer)) >= 0) {
+ out.write(buffer, 0, read);
+ }
+ } finally {
+ try {
+ in.close();
+ } catch (IOException e) {
+ Log.w(TAG, "Cannot close the input stream for " + name);
+ }
+ try {
+ out.close();
+ } catch (IOException e) {
+ Log.w(TAG, "Cannot close the output stream for " + name);
+ }
+ }
+ return file;
}
public void shutdown() {
@@ -406,9 +436,10 @@ public class TorIntegrationAndroid implements BundleEventListener {
setName("meek-" + id);
final ProcessBuilder builder = new ProcessBuilder(mLibraryDir + "/libObfs4proxy.so");
{
+ File ptStateDir = new File(mDataDir, "pt_state");
final Map<String, String> env = builder.environment();
env.put("TOR_PT_MANAGED_TRANSPORT_VER", "1");
- env.put("TOR_PT_STATE_LOCATION", mDataDir + "/pt_state");
+ env.put("TOR_PT_STATE_LOCATION", ptStateDir.getAbsolutePath());
env.put("TOR_PT_EXIT_ON_STDIN_CLOSE", "1");
env.put("TOR_PT_CLIENT_TRANSPORTS", TRANSPORT);
}
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/308d6a6…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/308d6a6…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/rbm][main] Bug 40068: Use Capture::Tiny instead of IO::CaptureOutput
by richard (@richard) 25 Jan '24
by richard (@richard) 25 Jan '24
25 Jan '24
richard pushed to branch main at The Tor Project / Applications / RBM
Commits:
9336d42f by Nicolas Vigier at 2024-01-25T11:42:58+01:00
Bug 40068: Use Capture::Tiny instead of IO::CaptureOutput
The IO::CaptureOutput perl module is deprecated, so we switch to
Capture::Tiny.
The Capture::Tiny module does not provide a capture_exec function
similar to the one from IO::CaptureOutput, so we implement one using the
same name, which avoids changing all the places where we were using it.
- - - - -
2 changed files:
- lib/RBM.pm
- lib/RBM/DefaultConfig.pm
Changes:
=====================================
lib/RBM.pm
=====================================
@@ -10,7 +10,7 @@ use YAML::XS qw(LoadFile);
use Template;
use File::Basename;
use IO::Handle;
-use IO::CaptureOutput qw(capture_exec);
+use Capture::Tiny qw(capture);
use File::Temp;
use File::Copy;
use File::Copy::Recursive qw(fcopy);
@@ -29,7 +29,7 @@ use feature "state";
BEGIN {
require Exporter;
our @ISA = qw(Exporter);
- our @EXPORT = qw(exit_error);
+ our @EXPORT = qw(exit_error capture_exec);
}
our $config;
@@ -308,6 +308,15 @@ sub exit_error {
exit (exists $_[1] ? $_[1] : 1);
}
+sub capture_exec {
+ my @cmd = @_;
+ my ($stdout, $stderr, $exit) = capture {
+ system(@cmd);
+ };
+ return ($stdout, $stderr, $exit == 0, $exit) if wantarray();
+ return $stdout;
+}
+
sub set_git_gpg_wrapper {
my ($project) = @_;
my $w = project_config($project, 'gpg_wrapper');
=====================================
lib/RBM/DefaultConfig.pm
=====================================
@@ -10,9 +10,8 @@ BEGIN {
}
use File::Basename;
-use RBM;
+use RBM qw(capture_exec);
use Cwd qw(getcwd);
-use IO::CaptureOutput qw(capture_exec);
use File::Temp;
use File::Path qw(make_path);
View it on GitLab: https://gitlab.torproject.org/tpo/applications/rbm/-/commit/9336d42fdd669af…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/rbm/-/commit/9336d42fdd669af…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][maint-13.0] Update rbm for rbm#40067
by boklm (@boklm) 25 Jan '24
by boklm (@boklm) 25 Jan '24
25 Jan '24
boklm pushed to branch maint-13.0 at The Tor Project / Applications / tor-browser-build
Commits:
af1c78b5 by Nicolas Vigier at 2024-01-25T11:19:16+01:00
Update rbm for rbm#40067
- - - - -
1 changed file:
- rbm
Changes:
=====================================
rbm
=====================================
@@ -1 +1 @@
-Subproject commit 40acf540fe75055df2eb78454f070f57d0804729
+Subproject commit b5e5b04aaf677c4bacfb5ace45598313286bfdf6
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/a…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/a…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][main] Update rbm for rbm#40067
by boklm (@boklm) 25 Jan '24
by boklm (@boklm) 25 Jan '24
25 Jan '24
boklm pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
83a1a381 by Nicolas Vigier at 2024-01-25T11:17:52+01:00
Update rbm for rbm#40067
- - - - -
1 changed file:
- rbm
Changes:
=====================================
rbm
=====================================
@@ -1 +1 @@
-Subproject commit 40acf540fe75055df2eb78454f070f57d0804729
+Subproject commit b5e5b04aaf677c4bacfb5ace45598313286bfdf6
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/8…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/8…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.7.0esr-13.0-1] fixup! Bug 41668: Tweaks to the Base Browser updater for Tor Browser
by boklm (@boklm) 25 Jan '24
by boklm (@boklm) 25 Jan '24
25 Jan '24
boklm pushed to branch tor-browser-115.7.0esr-13.0-1 at The Tor Project / Applications / Tor Browser
Commits:
6292bbc9 by Nicolas Vigier at 2024-01-25T10:26:11+01:00
fixup! Bug 41668: Tweaks to the Base Browser updater for Tor Browser
Bug 42293: Don't disable updater when run by torbrowser-launcher flatpak
When the TORBROWSER_LAUNCHER environment variable is set (which
is set by torbrowser-launcher since version 0.3.7) we assume that Tor
Browser is not installed by a Flatkpak. Although torbrowser-launcher
itself can be installed by a Flatpak, this should not prevent the
updater from working.
- - - - -
1 changed file:
- widget/gtk/WidgetUtilsGtk.cpp
Changes:
=====================================
widget/gtk/WidgetUtilsGtk.cpp
=====================================
@@ -138,6 +138,11 @@ void SetLastMousePressEvent(GdkEvent* aEvent) {
bool IsRunningUnderSnap() { return !!GetSnapInstanceName(); }
bool IsRunningUnderFlatpak() {
+ // tor-browser#42293: Don't disable updater when run by torbrowser-launcher flatpak
+ const char* torbrowserLauncher = g_getenv("TORBROWSER_LAUNCHER");
+ if (torbrowserLauncher) {
+ return false;
+ }
// https://gitlab.gnome.org/GNOME/gtk/-/blob/4300a5c609306ce77cbc8a3580c19201d…
static bool sRunning = [] {
return g_file_test("/.flatpak-info", G_FILE_TEST_EXISTS);
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/6292bbc…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/6292bbc…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.7.0esr-13.5-1] fixup! Bug 41668: Tweaks to the Base Browser updater for Tor Browser
by boklm (@boklm) 25 Jan '24
by boklm (@boklm) 25 Jan '24
25 Jan '24
boklm pushed to branch tor-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
5898a9ab by Nicolas Vigier at 2024-01-25T10:21:48+01:00
fixup! Bug 41668: Tweaks to the Base Browser updater for Tor Browser
Bug 42293: Don't disable updater when run by torbrowser-launcher flatpak
When the TORBROWSER_LAUNCHER environment variable is set (which
is set by torbrowser-launcher since version 0.3.7) we assume that Tor
Browser is not installed by a Flatkpak. Although torbrowser-launcher
itself can be installed by a Flatpak, this should not prevent the
updater from working.
- - - - -
1 changed file:
- widget/gtk/WidgetUtilsGtk.cpp
Changes:
=====================================
widget/gtk/WidgetUtilsGtk.cpp
=====================================
@@ -138,6 +138,11 @@ void SetLastMousePressEvent(GdkEvent* aEvent) {
bool IsRunningUnderSnap() { return !!GetSnapInstanceName(); }
bool IsRunningUnderFlatpak() {
+ // tor-browser#42293: Don't disable updater when run by torbrowser-launcher flatpak
+ const char* torbrowserLauncher = g_getenv("TORBROWSER_LAUNCHER");
+ if (torbrowserLauncher) {
+ return false;
+ }
// https://gitlab.gnome.org/GNOME/gtk/-/blob/4300a5c609306ce77cbc8a3580c19201d…
static bool sRunning = [] {
return g_file_test("/.flatpak-info", G_FILE_TEST_EXISTS);
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/5898a9a…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/5898a9a…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.7.0esr-13.5-1] 3 commits: fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in...
by richard (@richard) 24 Jan '24
by richard (@richard) 24 Jan '24
24 Jan '24
richard pushed to branch tor-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
47afbf56 by Henry Wilkes at 2024-01-23T20:27:35+00:00
fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection
Bug 42036: Replace replace/add bridges section with new design, ready
for Lox.
- - - - -
0021e3f3 by Henry Wilkes at 2024-01-23T20:27:36+00:00
fixup! Tor Browser strings
Bug 42036: Add strings for adding/replacing bridges.
- - - - -
c1bcea9d by Henry Wilkes at 2024-01-23T20:27:36+00:00
fixup! Add TorStrings module for localization
Bug 42036: Remove old strings for replacing bridges.
- - - - -
11 changed files:
- + browser/components/torpreferences/content/bridge-bot.svg
- browser/components/torpreferences/content/connectionPane.js
- browser/components/torpreferences/content/connectionPane.xhtml
- browser/components/torpreferences/content/provideBridgeDialog.js
- browser/components/torpreferences/content/provideBridgeDialog.xhtml
- + browser/components/torpreferences/content/telegram-logo.svg
- browser/components/torpreferences/content/torPreferences.css
- browser/components/torpreferences/jar.mn
- browser/locales/en-US/browser/tor-browser.ftl
- toolkit/modules/TorStrings.sys.mjs
- toolkit/torbutton/chrome/locale/en-US/settings.properties
Changes:
=====================================
browser/components/torpreferences/content/bridge-bot.svg
=====================================
@@ -0,0 +1,13 @@
+<svg width="40" height="44" viewBox="0 0 40 44" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M37.1877 22.7584C38.7409 25.1504 38.9178 27.7923 37.5828 28.6591C36.2478 29.5259 33.9065 28.2895 32.3533 25.8975C30.8001 23.5055 30.6232 20.8637 31.9582 19.9969C33.2932 19.13 35.6345 20.3664 37.1877 22.7584Z" fill="#C069FF"/>
+<path d="M2.81234 22.7584C1.25915 25.1504 1.08224 27.7923 2.41721 28.6591C3.75217 29.5259 6.09349 28.2895 7.64668 25.8975C9.19987 23.5055 9.37678 20.8637 8.04181 19.9969C6.70685 19.13 4.36553 20.3664 2.81234 22.7584Z" fill="#C069FF"/>
+<path d="M32.2002 19.4754C33.9149 19.4754 35.3181 20.8678 35.1823 22.5772C34.7579 27.9186 33.2458 32.9181 30.8541 36.7668C28.0043 41.3527 24.1391 43.9291 20.1088 43.9291C16.0785 43.9291 12.2133 41.3527 9.36344 36.7668C6.97177 32.9181 5.45965 27.9186 5.03525 22.5772C4.89944 20.8678 6.30265 19.4754 8.0174 19.4754L32.2002 19.4754Z" fill="#C069FF"/>
+<path d="M28.4375 32.1121C28.4375 27.4522 24.6599 23.6746 20 23.6746C15.3401 23.6746 11.5625 27.4522 11.5625 32.1121V33.5139H12.8809V32.1121C12.8809 28.1803 16.0682 24.9929 20 24.9929C23.9318 24.9929 27.1191 28.1803 27.1191 32.1121V33.5139H28.4375V32.1121Z" fill="#15141A"/>
+<path d="M25.9062 32.1121C25.9062 28.8501 23.2619 26.2058 20 26.2058C16.7381 26.2058 14.0937 28.8501 14.0937 32.1121L14.0936 33.5139H15.412L15.4121 32.1121C15.4121 29.5782 17.4662 27.5242 20 27.5242C22.5338 27.5242 24.5879 29.5782 24.5879 32.1121L24.588 33.5139H25.9064L25.9062 32.1121Z" fill="#15141A"/>
+<path d="M20 28.7371C21.864 28.7371 23.375 30.2481 23.375 32.1121L23.3753 33.5139H22.0569L22.0566 32.1121C22.0566 30.9762 21.1359 30.0554 20 30.0554C18.8642 30.0554 17.9434 30.9762 17.9434 32.1121L17.9431 33.5139H16.6247V32.1121C16.6247 30.2481 18.136 28.7371 20 28.7371Z" fill="#15141A"/>
+<path d="M8.9145 17.8162C7.19975 17.8162 5.78665 16.4193 6.02668 14.7215C6.53221 11.1456 7.9061 7.82078 9.99195 5.21826C12.6698 1.87706 16.3018 -1.07451e-07 20.0889 0C23.8759 1.07451e-07 27.5079 1.87706 30.1858 5.21826C32.2716 7.82078 33.6455 11.1456 34.151 14.7215C34.3911 16.4193 32.978 17.8162 31.2632 17.8162H8.9145Z" fill="#C069FF"/>
+<path d="M13.1064 15.1091C11.3916 15.1091 9.96814 13.7048 10.3139 12.0252C10.7578 9.86855 11.6634 7.87853 12.956 6.27814C14.8477 3.93602 17.4134 2.62024 20.0887 2.62024C22.7639 2.62024 25.3296 3.93602 27.2213 6.27814C28.514 7.87853 29.4195 9.86855 29.8635 12.0252C30.2092 13.7048 28.7857 15.1091 27.071 15.1091H13.1064Z" fill="#EBD0FF"/>
+<path d="M17.5125 6.81215C17.5125 7.58388 16.9065 8.2095 16.1589 8.2095C15.4112 8.2095 14.8052 7.58388 14.8052 6.81215C14.8052 6.04041 15.4112 5.41479 16.1589 5.41479C16.9065 5.41479 17.5125 6.04041 17.5125 6.81215Z" fill="#15141A"/>
+<path d="M25.1981 6.81215C25.1981 7.58388 24.592 8.2095 23.8444 8.2095C23.0968 8.2095 22.4907 7.58388 22.4907 6.81215C22.4907 6.04041 23.0968 5.41479 23.8444 5.41479C24.592 5.41479 25.1981 6.04041 25.1981 6.81215Z" fill="#15141A"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M22.4395 9.01993L22.4044 9.11353C21.5971 11.2673 18.526 11.1951 17.8208 9.0058L18.427 8.81052C18.9472 10.4254 21.2125 10.4787 21.808 8.88998L21.8431 8.79639L22.4395 9.01993Z" fill="#15141A"/>
+</svg>
=====================================
browser/components/torpreferences/content/connectionPane.js
=====================================
@@ -1316,6 +1316,18 @@ const gBridgeSettings = {
* @type {Element?}
*/
_noBridgesEl: null,
+ /**
+ * The heading element for changing bridges.
+ *
+ * @type {Element?}
+ */
+ _changeHeadingEl: null,
+ /**
+ * The button for user to provide a bridge address or share code.
+ *
+ * @type {Element?}
+ */
+ _userProvideButton: null,
/**
* Initialize the bridge settings.
@@ -1345,6 +1357,47 @@ const gBridgeSettings = {
});
});
+ this._changeHeadingEl = document.getElementById(
+ "tor-bridges-change-heading"
+ );
+ this._userProvideButton = document.getElementById(
+ "tor-bridges-open-user-provide-dialog-button"
+ );
+
+ document.l10n.setAttributes(
+ document.getElementById("tor-bridges-user-provide-description"),
+ // TODO: Set a different string if we have Lox enabled.
+ "tor-bridges-add-addresses-description"
+ );
+
+ // TODO: Change to GetLoxBridges if Lox enabled, and the account is set up.
+ const telegramUserName = "GetBridgesBot";
+ const telegramInstruction = document.getElementById(
+ "tor-bridges-provider-instruction-telegram"
+ );
+ telegramInstruction.querySelector(
+ "a"
+ ).href = `https://t.me/${telegramUserName}`;
+ document.l10n.setAttributes(
+ telegramInstruction,
+ "tor-bridges-provider-telegram-instruction",
+ { telegramUserName }
+ );
+
+ document
+ .getElementById("tor-bridges-open-built-in-dialog-button")
+ .addEventListener("click", () => {
+ this._openBuiltinDialog();
+ });
+ this._userProvideButton.addEventListener("click", () => {
+ this._openUserProvideDialog(this._haveBridges ? "replace" : "add");
+ });
+ document
+ .getElementById("tor-bridges-open-request-dialog-button")
+ .addEventListener("click", () => {
+ this._openRequestDialog();
+ });
+
Services.obs.addObserver(this, TorSettingsTopics.SettingsChanged);
gBridgeGrid.init();
@@ -1488,6 +1541,17 @@ const gBridgeSettings = {
// and hidden.
this._groupEl.classList.toggle("no-bridges", !haveBridges);
this._groupEl.classList.toggle("have-bridges", haveBridges);
+
+ document.l10n.setAttributes(
+ this._changeHeadingEl,
+ haveBridges
+ ? "tor-bridges-replace-bridges-heading"
+ : "tor-bridges-add-bridges-heading"
+ );
+ document.l10n.setAttributes(
+ this._userProvideButton,
+ haveBridges ? "tor-bridges-replace-button" : "tor-bridges-add-new-button"
+ );
},
/**
@@ -1615,9 +1679,7 @@ const gBridgeSettings = {
"tor-bridges-options-edit-all-menu-item"
);
editItem.addEventListener("click", () => {
- // TODO: move to gBridgeSettings.
- // TODO: Change dialog title. Do not allow Lox invite.
- gConnectionPane.onAddBridgeManually();
+ this._openUserProvideDialog("edit");
});
// TODO: Do we want a different item for built-in bridges, rather than
@@ -1687,6 +1749,138 @@ const gBridgeSettings = {
_forceCloseBridgesMenu() {
this._bridgesMenu.hide(null, { force: true });
},
+
+ /**
+ * Open a bridge dialog that will change the users bridges.
+ *
+ * @param {string} url - The url of the dialog to open.
+ * @param {object?} inputData - The input data to send to the dialog window.
+ * @param {Function} onAccept - The method to call if the bridge dialog was
+ * accepted by the user. This will be passed a "result" object containing
+ * data set by the dialog. This should return a promise that resolves once
+ * the bridge settings have been set, or null if the settings have not
+ * been applied.
+ */
+ _openDialog(url, inputData, onAccept) {
+ const result = { accepted: false, connect: false };
+ let savedSettings = null;
+ gSubDialog.open(
+ url,
+ {
+ features: "resizable=yes",
+ closingCallback: () => {
+ if (!result.accepted) {
+ return;
+ }
+ savedSettings = onAccept(result);
+ if (!savedSettings) {
+ // No change in settings.
+ return;
+ }
+ if (!result.connect) {
+ // Do not open about:torconnect.
+ return;
+ }
+
+ // Wait until the settings are applied before bootstrapping.
+ savedSettings.then(() => {
+ // The bridge dialog button is "connect" when Tor is not
+ // bootstrapped, so do the connect.
+
+ // Start Bootstrapping, which should use the configured bridges.
+ // NOTE: We do this regardless of any previous TorConnect Error.
+ if (TorConnect.canBeginBootstrap) {
+ TorConnect.beginBootstrap();
+ }
+ // Open "about:torconnect".
+ // FIXME: If there has been a previous bootstrapping error then
+ // "about:torconnect" will be trying to get the user to use
+ // AutoBootstrapping. It is not set up to handle a forced direct
+ // entry to plain Bootstrapping from this dialog so the UI will
+ // not be aligned. In particular the
+ // AboutTorConnect.uiState.bootstrapCause will be aligned to
+ // whatever was shown previously in "about:torconnect" instead.
+ TorConnect.openTorConnect();
+ });
+ },
+ // closedCallback should be called after gSubDialog has already
+ // re-assigned focus back to the document.
+ closedCallback: () => {
+ if (!savedSettings) {
+ return;
+ }
+ // Wait until the settings have changed, so that the UI could
+ // respond, then move focus.
+ savedSettings.then(() => gBridgeSettings.takeFocus());
+ },
+ },
+ result,
+ inputData
+ );
+ },
+
+ /**
+ * Open the built-in bridge dialog.
+ */
+ _openBuiltinDialog() {
+ this._openDialog(
+ "chrome://browser/content/torpreferences/builtinBridgeDialog.xhtml",
+ null,
+ result => {
+ if (!result.type) {
+ return null;
+ }
+ return setTorSettings(() => {
+ TorSettings.bridges.enabled = true;
+ TorSettings.bridges.source = TorBridgeSource.BuiltIn;
+ TorSettings.bridges.builtin_type = result.type;
+ });
+ }
+ );
+ },
+
+ /*
+ * Open the request bridge dialog.
+ */
+ _openRequestDialog() {
+ this._openDialog(
+ "chrome://browser/content/torpreferences/requestBridgeDialog.xhtml",
+ null,
+ result => {
+ if (!result.bridges?.length) {
+ return null;
+ }
+ return setTorSettings(() => {
+ TorSettings.bridges.enabled = true;
+ TorSettings.bridges.source = TorBridgeSource.BridgeDB;
+ TorSettings.bridges.bridge_strings = result.bridges.join("\n");
+ });
+ }
+ );
+ },
+
+ /**
+ * Open the user provide dialog.
+ *
+ * @param {string} mode - The mode to open the dialog in: "add", "replace" or
+ * "edit".
+ */
+ _openUserProvideDialog(mode) {
+ this._openDialog(
+ "chrome://browser/content/torpreferences/provideBridgeDialog.xhtml",
+ { mode },
+ result => {
+ if (!result.bridgeStrings) {
+ return null;
+ }
+ return setTorSettings(() => {
+ TorSettings.bridges.enabled = true;
+ TorSettings.bridges.source = TorBridgeSource.UserProvided;
+ TorSettings.bridges.bridge_strings = result.bridgeStrings;
+ });
+ }
+ );
+ },
};
/*
@@ -1719,13 +1913,6 @@ const gConnectionPane = (function () {
location: "#torPreferences-bridges-location",
locationEntries: "#torPreferences-bridges-locationEntries",
chooseForMe: "#torPreferences-bridges-buttonChooseBridgeForMe",
- addHeader: "#torPreferences-addBridge-header",
- addBuiltinLabel: "#torPreferences-addBridge-labelBuiltinBridge",
- addBuiltinButton: "#torPreferences-addBridge-buttonBuiltinBridge",
- requestLabel: "#torPreferences-addBridge-labelRequestBridge",
- requestButton: "#torPreferences-addBridge-buttonRequestBridge",
- enterLabel: "#torPreferences-addBridge-labelEnterBridge",
- enterButton: "#torPreferences-addBridge-buttonEnterBridge",
},
advanced: {
header: "h1#torPreferences-advanced-header",
@@ -1985,39 +2172,6 @@ const gConnectionPane = (function () {
this._showAutoconfiguration();
}
- // Add a new bridge
- prefpane.querySelector(selectors.bridges.addHeader).textContent =
- TorStrings.settings.bridgeAdd;
- prefpane.querySelector(selectors.bridges.addBuiltinLabel).textContent =
- TorStrings.settings.bridgeSelectBrowserBuiltin;
- {
- const button = prefpane.querySelector(
- selectors.bridges.addBuiltinButton
- );
- button.setAttribute("label", TorStrings.settings.bridgeSelectBuiltin);
- button.addEventListener("command", e => {
- this.onAddBuiltinBridge();
- });
- }
- prefpane.querySelector(selectors.bridges.requestLabel).textContent =
- TorStrings.settings.bridgeRequestFromTorProject;
- {
- const button = prefpane.querySelector(selectors.bridges.requestButton);
- button.setAttribute("label", TorStrings.settings.bridgeRequest);
- button.addEventListener("command", e => {
- this.onRequestBridge();
- });
- }
- prefpane.querySelector(selectors.bridges.enterLabel).textContent =
- TorStrings.settings.bridgeEnterKnown;
- {
- const button = prefpane.querySelector(selectors.bridges.enterButton);
- button.setAttribute("label", TorStrings.settings.bridgeAddManually);
- button.addEventListener("command", e => {
- this.onAddBridgeManually();
- });
- }
-
// Advanced setup
prefpane.querySelector(selectors.advanced.header).innerText =
TorStrings.settings.advancedHeading;
@@ -2122,122 +2276,6 @@ const gConnectionPane = (function () {
this._showAutoconfiguration();
},
- /**
- * Open a bridge dialog that will change the users bridges.
- *
- * @param {string} url - The url of the dialog to open.
- * @param {Function} onAccept - The method to call if the bridge dialog was
- * accepted by the user. This will be passed a "result" object containing
- * data set by the dialog. This should return a promise that resolves once
- * the bridge settings have been set, or null if the settings have not
- * been applied.
- */
- openBridgeDialog(url, onAccept) {
- const result = { accepted: false, connect: false };
- let savedSettings = null;
- gSubDialog.open(
- url,
- {
- features: "resizable=yes",
- closingCallback: () => {
- if (!result.accepted) {
- return;
- }
- savedSettings = onAccept(result);
- if (!savedSettings) {
- // No change in settings.
- return;
- }
- if (!result.connect) {
- // Do not open about:torconnect.
- return;
- }
-
- // Wait until the settings are applied before bootstrapping.
- savedSettings.then(() => {
- // The bridge dialog button is "connect" when Tor is not
- // bootstrapped, so do the connect.
-
- // Start Bootstrapping, which should use the configured bridges.
- // NOTE: We do this regardless of any previous TorConnect Error.
- if (TorConnect.canBeginBootstrap) {
- TorConnect.beginBootstrap();
- }
- // Open "about:torconnect".
- // FIXME: If there has been a previous bootstrapping error then
- // "about:torconnect" will be trying to get the user to use
- // AutoBootstrapping. It is not set up to handle a forced direct
- // entry to plain Bootstrapping from this dialog so the UI will
- // not be aligned. In particular the
- // AboutTorConnect.uiState.bootstrapCause will be aligned to
- // whatever was shown previously in "about:torconnect" instead.
- TorConnect.openTorConnect();
- });
- },
- // closedCallback should be called after gSubDialog has already
- // re-assigned focus back to the document.
- closedCallback: () => {
- if (!savedSettings) {
- return;
- }
- // Wait until the settings have changed, so that the UI could
- // respond, then move focus.
- savedSettings.then(() => gCurrentBridgesArea.takeFocus());
- },
- },
- result
- );
- },
-
- onAddBuiltinBridge() {
- this.openBridgeDialog(
- "chrome://browser/content/torpreferences/builtinBridgeDialog.xhtml",
- result => {
- if (!result.type) {
- return null;
- }
- return setTorSettings(() => {
- TorSettings.bridges.enabled = true;
- TorSettings.bridges.source = TorBridgeSource.BuiltIn;
- TorSettings.bridges.builtin_type = result.type;
- });
- }
- );
- },
-
- // called when the request bridge button is activated
- onRequestBridge() {
- this.openBridgeDialog(
- "chrome://browser/content/torpreferences/requestBridgeDialog.xhtml",
- result => {
- if (!result.bridges?.length) {
- return null;
- }
- return setTorSettings(() => {
- TorSettings.bridges.enabled = true;
- TorSettings.bridges.source = TorBridgeSource.BridgeDB;
- TorSettings.bridges.bridge_strings = result.bridges.join("\n");
- });
- }
- );
- },
-
- onAddBridgeManually() {
- this.openBridgeDialog(
- "chrome://browser/content/torpreferences/provideBridgeDialog.xhtml",
- result => {
- if (!result.bridgeStrings) {
- return null;
- }
- return setTorSettings(() => {
- TorSettings.bridges.enabled = true;
- TorSettings.bridges.source = TorBridgeSource.UserProvided;
- TorSettings.bridges.bridge_strings = result.bridgeStrings;
- });
- }
- );
- },
-
onAdvancedSettings() {
gSubDialog.open(
"chrome://browser/content/torpreferences/connectionSettingsDialog.xhtml",
=====================================
browser/components/torpreferences/content/connectionPane.xhtml
=====================================
@@ -293,28 +293,102 @@
></html:button>
</html:div>
</html:div>
- <html:h2 id="torPreferences-addBridge-header"></html:h2>
+ <html:h2 id="tor-bridges-change-heading"></html:h2>
<hbox align="center">
- <label id="torPreferences-addBridge-labelBuiltinBridge" flex="1" />
- <button
- id="torPreferences-addBridge-buttonBuiltinBridge"
- class="accessory-button"
+ <description
+ flex="1"
+ data-l10n-id="tor-bridges-select-built-in-description"
/>
- </hbox>
- <hbox align="center">
- <label id="torPreferences-addBridge-labelRequestBridge" flex="1" />
- <button
- id="torPreferences-addBridge-buttonRequestBridge"
+ <html:button
+ id="tor-bridges-open-built-in-dialog-button"
class="accessory-button"
- />
+ data-l10n-id="tor-bridges-select-built-in-button"
+ ></html:button>
</hbox>
<hbox align="center">
- <label id="torPreferences-addBridge-labelEnterBridge" flex="1" />
- <button
- id="torPreferences-addBridge-buttonEnterBridge"
+ <description id="tor-bridges-user-provide-description" flex="1" />
+ <html:button
+ id="tor-bridges-open-user-provide-dialog-button"
class="accessory-button"
- />
+ ></html:button>
</hbox>
+ <html:h3
+ id="tor-bridges-provider-heading"
+ data-l10n-id="tor-bridges-find-more-heading"
+ ></html:h3>
+ <description data-l10n-id="tor-bridges-find-more-description" />
+ <html:div id="tor-bridges-provider-area">
+ <html:ul id="tor-bridges-provider-list">
+ <html:li class="tor-bridges-provider-item">
+ <html:img
+ id="tor-bridges-provider-icon-telegram"
+ class="tor-bridges-provider-icon"
+ alt=""
+ />
+ <html:div
+ class="tor-bridges-provider-name"
+ data-l10n-id="tor-bridges-provider-telegram-name"
+ ></html:div>
+ <html:div
+ id="tor-bridges-provider-instruction-telegram"
+ class="tor-bridges-provider-instruction"
+ >
+ <html:a data-l10n-name="user"></html:a>
+ </html:div>
+ </html:li>
+ <html:li class="tor-bridges-provider-item">
+ <html:img
+ id="tor-bridges-provider-icon-web"
+ class="tor-bridges-provider-icon"
+ alt=""
+ />
+ <html:div
+ class="tor-bridges-provider-name"
+ data-l10n-id="tor-bridges-provider-web-name"
+ ></html:div>
+ <html:div
+ class="tor-bridges-provider-instruction"
+ data-l10n-id="tor-bridges-provider-web-instruction"
+ data-l10n-args='{ "url": "bridges.torproject.org" }'
+ >
+ <html:a
+ href="https://bridges.torproject.org"
+ data-l10n-name="url"
+ ></html:a>
+ </html:div>
+ </html:li>
+ <html:li class="tor-bridges-provider-item">
+ <html:img
+ id="tor-bridges-provider-icon-email"
+ class="tor-bridges-provider-icon"
+ alt=""
+ />
+ <html:div
+ class="tor-bridges-provider-name"
+ data-l10n-id="tor-bridges-provider-email-name"
+ ></html:div>
+ <html:div
+ class="tor-bridges-provider-instruction"
+ data-l10n-id="tor-bridges-provider-email-instruction"
+ data-l10n-args='{ "address": "bridges(a)torproject.org" }'
+ ></html:div>
+ </html:li>
+ </html:ul>
+ <html:div id="tor-bridges-request-box">
+ <html:img
+ alt=""
+ src="chrome://browser/content/torpreferences/bridge-bot.svg"
+ ></html:img>
+ <html:div
+ id="tor-bridges-request-description"
+ data-l10n-id="tor-bridges-request-from-browser"
+ ></html:div>
+ <html:button
+ id="tor-bridges-open-request-dialog-button"
+ data-l10n-id="tor-bridges-request-button"
+ ></html:button>
+ </html:div>
+ </html:div>
</groupbox>
<!-- Advanced -->
=====================================
browser/components/torpreferences/content/provideBridgeDialog.js
=====================================
@@ -15,11 +15,24 @@ const { TorConnect, TorConnectTopics } = ChromeUtils.importESModule(
const gProvideBridgeDialog = {
init() {
this._result = window.arguments[0];
+ const mode = window.arguments[1].mode;
+
+ let titleId;
+ switch (mode) {
+ case "edit":
+ titleId = "user-provide-bridge-dialog-edit-title";
+ break;
+ case "add":
+ titleId = "user-provide-bridge-dialog-add-title";
+ break;
+ case "replace":
+ default:
+ titleId = "user-provide-bridge-dialog-replace-title";
+ break;
+ }
+
+ document.l10n.setAttributes(document.documentElement, titleId);
- document.documentElement.setAttribute(
- "title",
- TorStrings.settings.provideBridgeTitleAdd
- );
const learnMore = document.createXULElement("label");
learnMore.className = "learnMore text-link";
learnMore.setAttribute("is", "text-link");
=====================================
browser/components/torpreferences/content/provideBridgeDialog.xhtml
=====================================
@@ -9,6 +9,10 @@
xmlns:html="http://www.w3.org/1999/xhtml"
>
<dialog id="torPreferences-provideBridge-dialog" buttons="accept,cancel">
+ <linkset>
+ <html:link rel="localization" href="browser/tor-browser.ftl" />
+ </linkset>
+
<script src="chrome://browser/content/torpreferences/provideBridgeDialog.js" />
<description>
=====================================
browser/components/torpreferences/content/telegram-logo.svg
=====================================
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="context-fill" xmlns="http://www.w3.org/2000/svg">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M13.5527 3.74072C13.6057 3.44502 13.3069 3.21007 13.0321 3.33143L2.46222 7.99865L5.04818 8.60316L10.1001 5.29184C10.8373 4.80861 11.6593 5.7727 11.0656 6.42426L7.88895 9.91029L11.9093 12.8968L13.5527 3.74072ZM12.5272 2.18794C13.7181 1.66208 15.013 2.68016 14.783 3.96155L13.104 13.3162C12.9564 14.1382 11.9962 14.5186 11.3258 14.0205L7.03263 10.8313C6.49819 10.4343 6.42353 9.66259 6.87195 9.17049L7.47872 8.50462L5.68862 9.67797C5.4311 9.84676 5.11564 9.90263 4.81582 9.83254L1.81371 9.13075C0.762034 8.8849 0.627375 7.4424 1.61537 7.00614L12.5272 2.18794Z"/>
+</svg>
=====================================
browser/components/torpreferences/content/torPreferences.css
=====================================
@@ -447,6 +447,91 @@
fill: currentColor;
}
+#tor-bridges-provider-heading {
+ font-size: 1.14em;
+ margin-block: 48px 8px;
+}
+
+#tor-bridges-provider-area {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 16px;
+ align-items: start;
+ line-height: 1.8;
+ margin-block-start: 24px;
+}
+
+#tor-bridges-provider-list {
+ display: grid;
+ grid-template-columns: max-content max-content;
+ /* 16px gap between items. */
+ gap: 16px 12px;
+ margin-block: 16px;
+}
+
+.tor-bridges-provider-item {
+ grid-column: 1 / -1;
+ display: grid;
+ grid-template-columns: subgrid;
+ align-items: center;
+ justify-items: start;
+ /* No gap between the name and instruction. */
+ gap: 0 12px;
+}
+
+.tor-bridges-provider-icon {
+ width: 16px;
+ height: 16px;
+ -moz-context-properties: fill;
+ fill: var(--in-content-icon-color);
+}
+
+#tor-bridges-provider-icon-telegram {
+ content: url("chrome://browser/content/torpreferences/telegram-logo.svg");
+}
+
+#tor-bridges-provider-icon-web {
+ content: url("chrome://browser/content/torpreferences/network.svg");
+}
+
+#tor-bridges-provider-icon-email {
+ content: url("chrome://browser/skin/mail.svg");
+}
+
+.tor-bridges-provider-name {
+ font-weight: 600;
+ font-size: 0.85em;
+}
+
+.tor-bridges-provider-instruction {
+ grid-column: 2 / 3;
+}
+
+#tor-bridges-request-box {
+ /* Take up the full height in the container. */
+ align-self: stretch;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ padding: 16px;
+ background: var(--in-content-box-info-background);
+ border-radius: 4px;
+}
+
+#tor-bridges-request-box > * {
+ flex: 0 0 auto;
+}
+
+#tor-bridges-request-description {
+ margin-block: 12px 16px;
+}
+
+#tor-bridges-open-request-dialog-button {
+ margin: 0;
+ line-height: 1;
+}
+
#torPreferences-bridges-location {
width: 280px;
}
=====================================
browser/components/torpreferences/jar.mn
=====================================
@@ -1,6 +1,8 @@
browser.jar:
content/browser/torpreferences/bridge.svg (content/bridge.svg)
content/browser/torpreferences/bridge-qr.svg (content/bridge-qr.svg)
+ content/browser/torpreferences/telegram-logo.svg (content/telegram-logo.svg)
+ content/browser/torpreferences/bridge-bot.svg (content/bridge-bot.svg)
content/browser/torpreferences/bridgeQrDialog.xhtml (content/bridgeQrDialog.xhtml)
content/browser/torpreferences/bridgeQrDialog.js (content/bridgeQrDialog.js)
content/browser/torpreferences/builtinBridgeDialog.xhtml (content/builtinBridgeDialog.xhtml)
=====================================
browser/locales/en-US/browser/tor-browser.ftl
=====================================
@@ -121,3 +121,58 @@ tor-bridges-share-description = Share your bridges with trusted contacts.
tor-bridges-copy-addresses-button = Copy addresses
tor-bridges-qr-addresses-button =
.title = Show QR code
+
+# Shown as a heading when the user has no current bridges.
+tor-bridges-add-bridges-heading = Add bridges
+# Shown as a heading when the user has existing bridges that can be replaced.
+tor-bridges-replace-bridges-heading = Replace your bridges
+
+tor-bridges-select-built-in-description = Choose from one of { -brand-short-name }’s built-in bridges
+tor-bridges-select-built-in-button = Select a built-in bridge…
+
+tor-bridges-add-addresses-description = Enter bridge addresses you already know
+# Shown when the user has no current bridges.
+# Opens a dialog where the user can provide a new bridge address or share code.
+tor-bridges-add-new-button = Add new bridges…
+# Shown when the user has existing bridges.
+# Opens a dialog where the user can provide a new bridge address or share code to replace their current bridges.
+tor-bridges-replace-button = Replace bridges…
+
+tor-bridges-find-more-heading = Find more bridges
+# "Tor Project" is the organisation name.
+tor-bridges-find-more-description = Since many bridge addresses aren’t public, you may need to request some from the Tor Project.
+
+# "Telegram" is the common brand name of the Telegram Messenger application
+tor-bridges-provider-telegram-name = Telegram
+# Here "Message" is a verb, short for "Send a message to". This is an instruction to send a message to the given Telegram Messenger user to receive a new bridge.
+# $telegramUserName (String) - The Telegram Messenger user name that should receive messages. Should be wrapped in '<a data-l10n-name="user">' and '</a>'.
+# E.g. in English, "Message GetBridgesBot".
+tor-bridges-provider-telegram-instruction = Message <a data-l10n-name="user">{ $telegramUserName }</a>
+
+# "Web" is the proper noun for the "World Wide Web".
+tor-bridges-provider-web-name = Web
+# Instructions to visit the given website.
+# $url (String) - The URL for Tor Project bridges. Should be wrapped in '<a data-l10n-name"url">' and '</a>'.
+tor-bridges-provider-web-instruction = Visit <a data-l10n-name="url">{ $url }</a>
+
+# "Gmail" is the Google brand name. "Riseup" refers to the Riseup organisation at riseup.net.
+tor-bridges-provider-email-name = Gmail or Riseup
+# Here "Email" is a verb, short for "Send an email to". This is an instruction to send an email to the given address to receive a new bridge.
+# $address (String) - The email address that should receive the email.
+# E.g. in English, "Email bridges(a)torproject.org".
+tor-bridges-provider-email-instruction = Email { $address }
+
+tor-bridges-request-from-browser = You can also get bridges from the bridge bot without leaving { -brand-short-name }.
+tor-bridges-request-button = Request bridges…
+
+## User provided bridge dialog.
+
+# Used when the user is editing their existing bridge addresses.
+user-provide-bridge-dialog-edit-title =
+ .title = Edit your bridges
+# Used when the user has no existing bridges.
+user-provide-bridge-dialog-add-title =
+ .title = Add new bridges
+# Used when the user is replacing their existing bridges with new ones.
+user-provide-bridge-dialog-replace-title =
+ .title = Replace your bridges
=====================================
toolkit/modules/TorStrings.sys.mjs
=====================================
@@ -105,14 +105,6 @@ const Loader = {
bridgeRemoveAllDialogTitle: "Remove all bridges?",
bridgeRemoveAllDialogDescription:
"If these bridges were received from torproject.org or added manually, this action cannot be undone",
- bridgeAdd: "Add a New Bridge",
- bridgeSelectBrowserBuiltin:
- "Choose from one of Tor Browser’s built-in bridges",
- bridgeSelectBuiltin: "Select a Built-In Bridge…",
- bridgeRequestFromTorProject: "Request a bridge from torproject.org",
- bridgeRequest: "Request a Bridge…",
- bridgeEnterKnown: "Enter a bridge address you already know",
- bridgeAddManually: "Add a Bridge Manually…",
// Advanced settings
advancedHeading: "Advanced",
advancedLabel: "Configure how Tor Browser connects to the internet",
@@ -148,7 +140,6 @@ const Loader = {
captchaTextboxPlaceholder: "Enter the characters from the image",
incorrectCaptcha: "The solution is not correct. Please try again.",
// Provide bridge dialog
- provideBridgeTitleAdd: "Add a Bridge Manually",
provideBridgeDescription:
"Add a bridge provided by a trusted organization or someone you know. If you don’t have a bridge, you can request one from the Tor Project. %S",
provideBridgePlaceholder: "type address:port (one per line)",
=====================================
toolkit/torbutton/chrome/locale/en-US/settings.properties
=====================================
@@ -39,13 +39,6 @@ settings.bridgeDisableBuiltIn=Disable built-in bridges
settings.copied=Copied!
settings.bridgeRemoveAllDialogTitle=Remove all bridges?
settings.bridgeRemoveAllDialogDescription=If these bridges were received from torproject.org or added manually, this action cannot be undone
-settings.bridgeAdd=Add a New Bridge
-settings.bridgeSelectBrowserBuiltin=Choose from one of Tor Browser’s built-in bridges
-settings.bridgeSelectBuiltin=Select a Built-In Bridge…
-settings.bridgeRequestFromTorProject=Request a bridge from torproject.org
-settings.bridgeRequest=Request a Bridge…
-settings.bridgeEnterKnown=Enter a bridge address you already know
-settings.bridgeAddManually=Add a Bridge Manually…
# Advanced settings
settings.advancedHeading=Advanced
@@ -82,8 +75,6 @@ settings.solveTheCaptcha=Solve the CAPTCHA to request a bridge.
settings.captchaTextboxPlaceholder=Enter the characters from the image
settings.incorrectCaptcha=The solution is not correct. Please try again.
-# Provide bridge dialog
-settings.provideBridgeTitleAdd=Add a Bridge Manually
# Translation note: %S is a Learn more link.
settings.provideBridgeDescription=Add a bridge provided by a trusted organization or someone you know. If you don’t have a bridge, you can request one from the Tor Project. %S
settings.provideBridgePlaceholder=type address:port (one per line)
@@ -125,3 +116,13 @@ settings.bridgeShowAll=Show All Bridges
settings.bridgeShowFewer=Show Fewer Bridges
settings.allBridgesEnabled=Use current bridges
settings.bridgeRemoveAll=Remove All Bridges
+settings.bridgeAdd=Add a New Bridge
+settings.bridgeSelectBrowserBuiltin=Choose from one of Tor Browser’s built-in bridges
+settings.bridgeSelectBuiltin=Select a Built-In Bridge…
+settings.bridgeRequestFromTorProject=Request a bridge from torproject.org
+settings.bridgeRequest=Request a Bridge…
+settings.bridgeEnterKnown=Enter a bridge address you already know
+settings.bridgeAddManually=Add a Bridge Manually…
+
+# Provide bridge dialog
+settings.provideBridgeTitleAdd=Add a Bridge Manually
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/6211ed…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/6211ed…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][main] Bug 41066: Compress the APKs more
by Pier Angelo Vendrame (@pierov) 24 Jan '24
by Pier Angelo Vendrame (@pierov) 24 Jan '24
24 Jan '24
Pier Angelo Vendrame pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
23474930 by Pier Angelo Vendrame at 2024-01-24T17:08:30+01:00
Bug 41066: Compress the APKs more
Our APK was refused by the Play Store as too big.
As a workaround, for this release we can try to compress the APK more,
by extracting it and repacking it with 7-zip.
The preferred and long-term solution would be to switch to Android App
Bundles, but this might require some changes to our signing scripts.
- - - - -
2 changed files:
- projects/browser/build.android
- projects/browser/config
Changes:
=====================================
projects/browser/build.android
=====================================
@@ -46,13 +46,19 @@ mv $rootdir/[% c('input_files_by_name/noscript') %] "$noscript_path"
mv $rootdir/allowed_addons.json $assets_dir/allowed_addons.json
-[% c('zip', {
- zip_src => [ '$assets_dir' ],
- zip_args => '$apk',
- }) %]
+mkdir apk
+pushd apk
+7zz x "$apk"
+cp -R ../assets ./
+find -type f -exec touch -m -t '[% USE date; date.format(pc("firefox-android", "timestamp"), format = "%Y%m%d%H%M") %]' {} \;
+find -type f ! -name resources.arsc -printf '%P\n' | sort > ../files.txt
+7zz a -tzip -mx9 -mtc- -spf ../repacked.apk @../files.txt
+# resources.arsc must not be compressed as per the APK specifications
+7zz a -tzip -mm=Copy -mtc- ../repacked.apk resources.arsc
+popd
aligned_apk=$(basename $apk .apk)_aligned.apk
-zipalign -vp 4 $apk $aligned_apk
+zipalign -vp 4 repacked.apk $aligned_apk
# Sign a QA build. This .apk is not a debug version and doesn't contain a debug
# flag in the manifest.
=====================================
projects/browser/config
=====================================
@@ -46,7 +46,13 @@ targets:
var:
verify_allowed_addons: 1
arch_deps:
- - openjdk-11-jdk-headless
+ - 7zip
+ - openjdk-17-jdk-headless
+ container:
+ # 7zip is in backports in bullseye, and we can already use Java 17 for
+ # apksigner.
+ suite: bookworm
+ arch: amd64
torbrowser:
var:
prefs_file: 000-tor-browser.js
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/2…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/2…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/rbm][main] Bug 40067: Use --no-verbose wget option when not running in a terminal
by richard (@richard) 24 Jan '24
by richard (@richard) 24 Jan '24
24 Jan '24
richard pushed to branch main at The Tor Project / Applications / RBM
Commits:
b5e5b04a by Nicolas Vigier at 2024-01-24T10:24:19+01:00
Bug 40067: Use --no-verbose wget option when not running in a terminal
Use the `--no-verbose` option when stdout is not a tty. We avoid setting
the option when `getting_id` is set, in order to have constant
`input_file_id` when `urlget` is being used inside the `exec` script in
`input_files`.
- - - - -
2 changed files:
- doc/options_misc.asc
- lib/RBM/DefaultConfig.pm
Changes:
=====================================
doc/options_misc.asc
=====================================
@@ -21,6 +21,9 @@ abbrev_length::
This option sets the length of the abbreviated commits, when
using the +abbrev+ option.
+isatty::
+ This option is true when stdout is connected to a tty.
+
tar::
Use this options instead of 'tar' in build scripts when you want
to create deterministic tar files. This options set tar arguments
=====================================
lib/RBM/DefaultConfig.pm
=====================================
@@ -151,6 +151,7 @@ our %default_config = (
debug => 0,
compress_tar => 'gz',
version => "[%- exit_error('No version specified for ' _ project); -%]",
+ isatty => sub { -t STDOUT },
####
####
####
@@ -577,7 +578,7 @@ set -e
END;
-%]
tmpfile="\$(mktemp -p [% shell_quote(rbm_tmp_dir) %])"
-wget -O"\$tmpfile" [% shell_quote(c("URL")) %]
+wget[% IF !c("getting_id") && !c("isatty") %] --no-verbose[% END %] -O"\$tmpfile" [% shell_quote(c("URL")) %]
mv -f "\$tmpfile" [% shell_quote(dest_dir _ "/" _ c("filename")) %]
URLGET
sig_ext => [ qw(gpg asc sig) ],
View it on GitLab: https://gitlab.torproject.org/tpo/applications/rbm/-/commit/b5e5b04aaf677c4…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/rbm/-/commit/b5e5b04aaf677c4…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][main] Update release-prep template with startpage contact to notify on major ESR transition
by richard (@richard) 24 Jan '24
by richard (@richard) 24 Jan '24
24 Jan '24
richard pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
ef63c83c by Richard Pospesel at 2024-01-24T11:30:38+00:00
Update release-prep template with startpage contact to notify on major ESR transition
- - - - -
1 changed file:
- .gitlab/issue_templates/Release Prep - Tor Browser Alpha.md
Changes:
=====================================
.gitlab/issue_templates/Release Prep - Tor Browser Alpha.md
=====================================
@@ -169,6 +169,8 @@
- [ ] Email external partners:
- ***(Optional, after ESR migration)*** Cloudflare: ask-research(a)cloudflare.com
- **NOTE** : We need to provide them with updated user agent string so they can update their internal machinery to prevent Tor Browser users from getting so many CAPTCHAs
+ - ***(Optional, after ESR migration)*** Startpage: admin(a)startpage.com
+ - **NOTE** : Startpage also needs the updated user-agent string for better experience on their onion service sites.
</details>
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/e…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/e…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.7.0esr-13.5-1] fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in...
by richard (@richard) 23 Jan '24
by richard (@richard) 23 Jan '24
23 Jan '24
richard pushed to branch tor-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
6211ed8f by Henry Wilkes at 2024-01-23T18:27:26+00:00
fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection
Bug 42036: Refactor tor setting dialogs to follow firefox style.
Also, move the user focus to their new bridges when the bridge dialogs
succeed.
- - - - -
16 changed files:
- + browser/components/torpreferences/content/bridgeQrDialog.js
- − browser/components/torpreferences/content/bridgeQrDialog.mjs
- browser/components/torpreferences/content/bridgeQrDialog.xhtml
- browser/components/torpreferences/content/builtinBridgeDialog.mjs → browser/components/torpreferences/content/builtinBridgeDialog.js
- browser/components/torpreferences/content/builtinBridgeDialog.xhtml
- browser/components/torpreferences/content/connectionPane.js
- browser/components/torpreferences/content/connectionSettingsDialog.mjs → browser/components/torpreferences/content/connectionSettingsDialog.js
- browser/components/torpreferences/content/connectionSettingsDialog.xhtml
- browser/components/torpreferences/content/provideBridgeDialog.mjs → browser/components/torpreferences/content/provideBridgeDialog.js
- browser/components/torpreferences/content/provideBridgeDialog.xhtml
- browser/components/torpreferences/content/requestBridgeDialog.mjs → browser/components/torpreferences/content/requestBridgeDialog.js
- browser/components/torpreferences/content/requestBridgeDialog.xhtml
- + browser/components/torpreferences/content/torLogDialog.js
- − browser/components/torpreferences/content/torLogDialog.mjs
- browser/components/torpreferences/content/torLogDialog.xhtml
- browser/components/torpreferences/jar.mn
Changes:
=====================================
browser/components/torpreferences/content/bridgeQrDialog.js
=====================================
@@ -0,0 +1,34 @@
+"use strict";
+
+const { QRCode } = ChromeUtils.importESModule(
+ "resource://gre/modules/QRCode.sys.mjs"
+);
+
+const { TorStrings } = ChromeUtils.importESModule(
+ "resource://gre/modules/TorStrings.sys.mjs"
+);
+
+window.addEventListener(
+ "DOMContentLoaded",
+ () => {
+ const bridgeString = window.arguments[0];
+
+ document.documentElement.setAttribute(
+ "title",
+ TorStrings.settings.scanQrTitle
+ );
+ const target = document.getElementById("bridgeQr-target");
+ const style = window.getComputedStyle(target);
+ const width = style.width.substr(0, style.width.length - 2);
+ const height = style.height.substr(0, style.height.length - 2);
+ new QRCode(target, {
+ text: bridgeString,
+ width,
+ height,
+ colorDark: style.color,
+ colorLight: style.backgroundColor,
+ document,
+ });
+ },
+ { once: true }
+);
=====================================
browser/components/torpreferences/content/bridgeQrDialog.mjs deleted
=====================================
@@ -1,44 +0,0 @@
-import { QRCode } from "resource://gre/modules/QRCode.sys.mjs";
-
-import { TorStrings } from "resource://gre/modules/TorStrings.sys.mjs";
-
-export class BridgeQrDialog {
- constructor() {
- this._bridgeString = "";
- }
-
- static get selectors() {
- return {
- target: "#bridgeQr-target",
- };
- }
-
- _populateXUL(window, dialog) {
- dialog.parentElement.setAttribute("title", TorStrings.settings.scanQrTitle);
- const target = dialog.querySelector(BridgeQrDialog.selectors.target);
- const style = window.getComputedStyle(target);
- const width = style.width.substr(0, style.width.length - 2);
- const height = style.height.substr(0, style.height.length - 2);
- new QRCode(target, {
- text: this._bridgeString,
- width,
- height,
- colorDark: style.color,
- colorLight: style.backgroundColor,
- document: window.document,
- });
- }
-
- init(window, dialog) {
- this._populateXUL(window, dialog);
- }
-
- openDialog(gSubDialog, bridgeString) {
- this._bridgeString = bridgeString;
- gSubDialog.open(
- "chrome://browser/content/torpreferences/bridgeQrDialog.xhtml",
- { features: "resizable=yes" },
- this
- );
- }
-}
=====================================
browser/components/torpreferences/content/bridgeQrDialog.xhtml
=====================================
@@ -9,6 +9,8 @@
xmlns:html="http://www.w3.org/1999/xhtml"
>
<dialog id="bridgeQr-dialog" buttons="accept">
+ <script src="chrome://browser/content/torpreferences/bridgeQrDialog.js" />
+
<html:div>
<html:div id="bridgeQr">
<html:div id="bridgeQr-target" />
@@ -16,16 +18,5 @@
<html:div id="bridgeQr-onion" />
</html:div>
</html:div>
- <script type="application/javascript">
- <![CDATA[
- "use strict";
-
- let dialogObject = window.arguments[0];
- document.addEventListener("DOMContentLoaded", () => {
- let dialogElement = document.getElementById("bridgeQr-dialog");
- dialogObject.init(window, dialogElement);
- });
- ]]>
- </script>
</dialog>
</window>
=====================================
browser/components/torpreferences/content/builtinBridgeDialog.mjs → browser/components/torpreferences/content/builtinBridgeDialog.js
=====================================
@@ -1,38 +1,32 @@
-import { TorStrings } from "resource://gre/modules/TorStrings.sys.mjs";
-
-import {
- TorSettings,
- TorBridgeSource,
-} from "resource://gre/modules/TorSettings.sys.mjs";
-
-import {
- TorConnect,
- TorConnectTopics,
-} from "resource://gre/modules/TorConnect.sys.mjs";
-
-export class BuiltinBridgeDialog {
- /**
- * Create a new instance.
- *
- * @param {Function} onSubmit - A callback for when the user accepts the
- * dialog selection.
- */
- constructor(onSubmit) {
- this.onSubmit = onSubmit;
- this._acceptButton = null;
- this._radioGroup = null;
- }
-
- _populateXUL(window, dialog) {
- const dialogWin = dialog.parentElement;
- dialogWin.setAttribute("title", TorStrings.settings.builtinBridgeHeader);
-
- dialog.querySelector(
- "#torPreferences-builtinBridge-description"
+"use strict";
+
+const { TorStrings } = ChromeUtils.importESModule(
+ "resource://gre/modules/TorStrings.sys.mjs"
+);
+
+const { TorSettings, TorBridgeSource } = ChromeUtils.importESModule(
+ "resource://gre/modules/TorSettings.sys.mjs"
+);
+
+const { TorConnect, TorConnectTopics } = ChromeUtils.importESModule(
+ "resource://gre/modules/TorConnect.sys.mjs"
+);
+
+const gBuiltinBridgeDialog = {
+ init() {
+ this._result = window.arguments[0];
+
+ document.documentElement.setAttribute(
+ "title",
+ TorStrings.settings.builtinBridgeHeader
+ );
+
+ document.getElementById(
+ "torPreferences-builtinBridge-description"
).textContent = TorStrings.settings.builtinBridgeDescription2;
- this._radioGroup = dialog.querySelector(
- "#torPreferences-builtinBridge-typeSelection"
+ this._radioGroup = document.getElementById(
+ "torPreferences-builtinBridge-typeSelection"
);
const typeStrings = {
@@ -84,8 +78,12 @@ export class BuiltinBridgeDialog {
}
this._radioGroup.addEventListener("select", () => this.onSelectChange());
+
+ const dialog = document.getElementById(
+ "torPreferences-builtinBridge-dialog"
+ );
dialog.addEventListener("dialogaccept", () => {
- this.onSubmit(this._radioGroup.value, TorConnect.canBeginBootstrap);
+ this._result.accepted = true;
});
this._acceptButton = dialog.getButton("accept");
@@ -94,20 +92,28 @@ export class BuiltinBridgeDialog {
this.onSelectChange();
this.onAcceptStateChange();
- }
+ },
+
+ uninit() {
+ Services.obs.removeObserver(this, TorConnectTopics.StateChange);
+ },
onSelectChange() {
- this._acceptButton.disabled = !this._radioGroup.value;
- }
+ const value = this._radioGroup.value;
+ this._acceptButton.disabled = !value;
+ this._result.type = value;
+ },
onAcceptStateChange() {
+ const connect = TorConnect.canBeginBootstrap;
+ this._result.connect = connect;
this._acceptButton.setAttribute(
"label",
- TorConnect.canBeginBootstrap
+ connect
? TorStrings.settings.bridgeButtonConnect
: TorStrings.settings.bridgeButtonAccept
);
- }
+ },
observe(subject, topic, data) {
switch (topic) {
@@ -115,27 +121,20 @@ export class BuiltinBridgeDialog {
this.onAcceptStateChange();
break;
}
- }
-
- init(window, aDialog) {
- this._populateXUL(window, aDialog);
- }
-
- close() {
- // Unregister our observer topics.
- Services.obs.removeObserver(this, TorConnectTopics.StateChange);
- }
-
- openDialog(gSubDialog) {
- gSubDialog.open(
- "chrome://browser/content/torpreferences/builtinBridgeDialog.xhtml",
- {
- features: "resizable=yes",
- closingCallback: () => {
- this.close();
- },
+ },
+};
+
+window.addEventListener(
+ "DOMContentLoaded",
+ () => {
+ gBuiltinBridgeDialog.init();
+ window.addEventListener(
+ "unload",
+ () => {
+ gBuiltinBridgeDialog.uninit();
},
- this
+ { once: true }
);
- }
-}
+ },
+ { once: true }
+);
=====================================
browser/components/torpreferences/content/builtinBridgeDialog.xhtml
=====================================
@@ -9,6 +9,8 @@
xmlns:html="http://www.w3.org/1999/xhtml"
>
<dialog id="torPreferences-builtinBridge-dialog" buttons="accept,cancel">
+ <script src="chrome://browser/content/torpreferences/builtinBridgeDialog.js" />
+
<description id="torPreferences-builtinBridge-description"> </description>
<radiogroup id="torPreferences-builtinBridge-typeSelection">
<vbox class="builtin-bridges-option">
@@ -78,16 +80,5 @@
</html:div>
</vbox>
</radiogroup>
- <script type="application/javascript">
- <![CDATA[
- "use strict";
-
- let builtinBridgeDialog = window.arguments[0];
- document.addEventListener("DOMContentLoaded", () => {
- let dialog = document.getElementById("torPreferences-builtinBridge-dialog");
- builtinBridgeDialog.init(window, dialog);
- });
- ]]>
- </script>
</dialog>
</window>
=====================================
browser/components/torpreferences/content/connectionPane.js
=====================================
@@ -24,30 +24,6 @@ const { TorProviderBuilder, TorProviderTopics } = ChromeUtils.importESModule(
const { TorConnect, TorConnectTopics, TorConnectState, TorCensorshipLevel } =
ChromeUtils.importESModule("resource://gre/modules/TorConnect.sys.mjs");
-const { TorLogDialog } = ChromeUtils.importESModule(
- "chrome://browser/content/torpreferences/torLogDialog.mjs"
-);
-
-const { ConnectionSettingsDialog } = ChromeUtils.importESModule(
- "chrome://browser/content/torpreferences/connectionSettingsDialog.mjs"
-);
-
-const { BridgeQrDialog } = ChromeUtils.importESModule(
- "chrome://browser/content/torpreferences/bridgeQrDialog.mjs"
-);
-
-const { BuiltinBridgeDialog } = ChromeUtils.importESModule(
- "chrome://browser/content/torpreferences/builtinBridgeDialog.mjs"
-);
-
-const { RequestBridgeDialog } = ChromeUtils.importESModule(
- "chrome://browser/content/torpreferences/requestBridgeDialog.mjs"
-);
-
-const { ProvideBridgeDialog } = ChromeUtils.importESModule(
- "chrome://browser/content/torpreferences/provideBridgeDialog.mjs"
-);
-
const { MoatRPC } = ChromeUtils.importESModule(
"resource://gre/modules/Moat.sys.mjs"
);
@@ -114,6 +90,19 @@ async function getConnectedBridgeId() {
return bridge?.fingerprint ?? null;
}
+/**
+ * Show the bridge QR to the user.
+ *
+ * @param {string} bridgeString - The string to use in the QR.
+ */
+function showBridgeQr(bridgeString) {
+ gSubDialog.open(
+ "chrome://browser/content/torpreferences/bridgeQrDialog.xhtml",
+ { features: "resizable=yes" },
+ bridgeString
+ );
+}
+
// TODO: Instead of aria-live in the DOM, use the proposed ariaNotify
// API if it gets accepted into firefox and works with screen readers.
// See https://github.com/WICG/proposals/issues/112
@@ -803,8 +792,7 @@ const gBridgeGrid = {
if (!bridgeLine) {
return;
}
- const dialog = new BridgeQrDialog();
- dialog.openDialog(gSubDialog, bridgeLine);
+ showBridgeQr(bridgeLine);
});
row.menu
.querySelector(".tor-bridges-options-copy-one-menu-item")
@@ -1571,8 +1559,7 @@ const gBridgeSettings = {
if (!this._canQRBridges) {
return;
}
- const dialog = new BridgeQrDialog();
- dialog.openDialog(gSubDialog, this._bridgeStrings);
+ showBridgeQr(this._bridgeStrings);
},
/**
@@ -2136,96 +2123,133 @@ const gConnectionPane = (function () {
},
/**
- * Save and apply settings, then optionally open about:torconnect and start
- * bootstrapping.
+ * Open a bridge dialog that will change the users bridges.
*
- * @param {fucntion} changes - The changes to make.
- * @param {boolean} connect - Whether to open about:torconnect and start
- * bootstrapping if possible.
+ * @param {string} url - The url of the dialog to open.
+ * @param {Function} onAccept - The method to call if the bridge dialog was
+ * accepted by the user. This will be passed a "result" object containing
+ * data set by the dialog. This should return a promise that resolves once
+ * the bridge settings have been set, or null if the settings have not
+ * been applied.
*/
- async saveBridgeSettings(changes, connect) {
- // TODO: Move focus into the bridge area.
- // dialog.ownerGlobal.addEventListener("unload", () => gCurrentBridgesArea.takeFocus(), { once: true });
- // or use closedCallback in gSubDialog.open()
- setTorSettings(changes);
-
- if (!connect) {
- return;
- }
-
- // The bridge dialog button is "connect" when Tor is not bootstrapped,
- // so do the connect.
+ openBridgeDialog(url, onAccept) {
+ const result = { accepted: false, connect: false };
+ let savedSettings = null;
+ gSubDialog.open(
+ url,
+ {
+ features: "resizable=yes",
+ closingCallback: () => {
+ if (!result.accepted) {
+ return;
+ }
+ savedSettings = onAccept(result);
+ if (!savedSettings) {
+ // No change in settings.
+ return;
+ }
+ if (!result.connect) {
+ // Do not open about:torconnect.
+ return;
+ }
- // Start Bootstrapping, which should use the configured bridges.
- // NOTE: We do this regardless of any previous TorConnect Error.
- if (TorConnect.canBeginBootstrap) {
- TorConnect.beginBootstrap();
- }
- // Open "about:torconnect".
- // FIXME: If there has been a previous bootstrapping error then
- // "about:torconnect" will be trying to get the user to use
- // AutoBootstrapping. It is not set up to handle a forced direct
- // entry to plain Bootstrapping from this dialog so the UI will not
- // be aligned. In particular the
- // AboutTorConnect.uiState.bootstrapCause will be aligned to
- // whatever was shown previously in "about:torconnect" instead.
- TorConnect.openTorConnect();
+ // Wait until the settings are applied before bootstrapping.
+ savedSettings.then(() => {
+ // The bridge dialog button is "connect" when Tor is not
+ // bootstrapped, so do the connect.
+
+ // Start Bootstrapping, which should use the configured bridges.
+ // NOTE: We do this regardless of any previous TorConnect Error.
+ if (TorConnect.canBeginBootstrap) {
+ TorConnect.beginBootstrap();
+ }
+ // Open "about:torconnect".
+ // FIXME: If there has been a previous bootstrapping error then
+ // "about:torconnect" will be trying to get the user to use
+ // AutoBootstrapping. It is not set up to handle a forced direct
+ // entry to plain Bootstrapping from this dialog so the UI will
+ // not be aligned. In particular the
+ // AboutTorConnect.uiState.bootstrapCause will be aligned to
+ // whatever was shown previously in "about:torconnect" instead.
+ TorConnect.openTorConnect();
+ });
+ },
+ // closedCallback should be called after gSubDialog has already
+ // re-assigned focus back to the document.
+ closedCallback: () => {
+ if (!savedSettings) {
+ return;
+ }
+ // Wait until the settings have changed, so that the UI could
+ // respond, then move focus.
+ savedSettings.then(() => gCurrentBridgesArea.takeFocus());
+ },
+ },
+ result
+ );
},
onAddBuiltinBridge() {
- const builtinBridgeDialog = new BuiltinBridgeDialog(
- (bridgeType, connect) => {
- this.saveBridgeSettings(() => {
+ this.openBridgeDialog(
+ "chrome://browser/content/torpreferences/builtinBridgeDialog.xhtml",
+ result => {
+ if (!result.type) {
+ return null;
+ }
+ return setTorSettings(() => {
TorSettings.bridges.enabled = true;
TorSettings.bridges.source = TorBridgeSource.BuiltIn;
- TorSettings.bridges.builtin_type = bridgeType;
- }, connect);
+ TorSettings.bridges.builtin_type = result.type;
+ });
}
);
- builtinBridgeDialog.openDialog(gSubDialog);
},
// called when the request bridge button is activated
onRequestBridge() {
- const requestBridgeDialog = new RequestBridgeDialog(
- (aBridges, connect) => {
- if (!aBridges.length) {
- return;
+ this.openBridgeDialog(
+ "chrome://browser/content/torpreferences/requestBridgeDialog.xhtml",
+ result => {
+ if (!result.bridges?.length) {
+ return null;
}
-
- const bridgeStrings = aBridges.join("\n");
-
- this.saveBridgeSettings(() => {
+ return setTorSettings(() => {
TorSettings.bridges.enabled = true;
TorSettings.bridges.source = TorBridgeSource.BridgeDB;
- TorSettings.bridges.bridge_strings = bridgeStrings;
- }, connect);
+ TorSettings.bridges.bridge_strings = result.bridges.join("\n");
+ });
}
);
- requestBridgeDialog.openDialog(gSubDialog);
},
onAddBridgeManually() {
- const provideBridgeDialog = new ProvideBridgeDialog(
- (aBridgeString, connect) => {
- this.saveBridgeSettings(() => {
+ this.openBridgeDialog(
+ "chrome://browser/content/torpreferences/provideBridgeDialog.xhtml",
+ result => {
+ if (!result.bridgeStrings) {
+ return null;
+ }
+ return setTorSettings(() => {
TorSettings.bridges.enabled = true;
TorSettings.bridges.source = TorBridgeSource.UserProvided;
- TorSettings.bridges.bridge_strings = aBridgeString;
- }, connect);
+ TorSettings.bridges.bridge_strings = result.bridgeStrings;
+ });
}
);
- provideBridgeDialog.openDialog(gSubDialog);
},
onAdvancedSettings() {
- const connectionSettingsDialog = new ConnectionSettingsDialog();
- connectionSettingsDialog.openDialog(gSubDialog);
+ gSubDialog.open(
+ "chrome://browser/content/torpreferences/connectionSettingsDialog.xhtml",
+ { features: "resizable=yes" }
+ );
},
onViewTorLogs() {
- const torLogDialog = new TorLogDialog();
- torLogDialog.openDialog(gSubDialog);
+ gSubDialog.open(
+ "chrome://browser/content/torpreferences/torLogDialog.xhtml",
+ { features: "resizable=yes" }
+ );
},
};
return retval;
=====================================
browser/components/torpreferences/content/connectionSettingsDialog.mjs → browser/components/torpreferences/content/connectionSettingsDialog.js
=====================================
@@ -1,73 +1,67 @@
-import {
- TorSettings,
- TorProxyType,
-} from "resource://gre/modules/TorSettings.sys.mjs";
+"use strict";
-import { TorStrings } from "resource://gre/modules/TorStrings.sys.mjs";
+const { TorSettings, TorProxyType } = ChromeUtils.importESModule(
+ "resource://gre/modules/TorSettings.sys.mjs"
+);
-export class ConnectionSettingsDialog {
- constructor() {
- this._dialog = null;
- this._useProxyCheckbox = null;
- this._proxyTypeLabel = null;
- this._proxyTypeMenulist = null;
- this._proxyAddressLabel = null;
- this._proxyAddressTextbox = null;
- this._proxyPortLabel = null;
- this._proxyPortTextbox = null;
- this._proxyUsernameLabel = null;
- this._proxyUsernameTextbox = null;
- this._proxyPasswordLabel = null;
- this._proxyPasswordTextbox = null;
- this._useFirewallCheckbox = null;
- this._allowedPortsLabel = null;
- this._allowedPortsTextbox = null;
- }
+const { TorStrings } = ChromeUtils.importESModule(
+ "resource://gre/modules/TorStrings.sys.mjs"
+);
- static get selectors() {
- return {
- header: "#torPreferences-connection-header",
- useProxyCheckbox: "checkbox#torPreferences-connection-toggleProxy",
- proxyTypeLabel: "label#torPreferences-localProxy-type",
- proxyTypeList: "menulist#torPreferences-localProxy-builtinList",
- proxyAddressLabel: "label#torPreferences-localProxy-address",
- proxyAddressTextbox: "input#torPreferences-localProxy-textboxAddress",
- proxyPortLabel: "label#torPreferences-localProxy-port",
- proxyPortTextbox: "input#torPreferences-localProxy-textboxPort",
- proxyUsernameLabel: "label#torPreferences-localProxy-username",
- proxyUsernameTextbox: "input#torPreferences-localProxy-textboxUsername",
- proxyPasswordLabel: "label#torPreferences-localProxy-password",
- proxyPasswordTextbox: "input#torPreferences-localProxy-textboxPassword",
- useFirewallCheckbox: "checkbox#torPreferences-connection-toggleFirewall",
- firewallAllowedPortsLabel: "label#torPreferences-connection-allowedPorts",
- firewallAllowedPortsTextbox:
- "input#torPreferences-connection-textboxAllowedPorts",
- };
- }
+const gConnectionSettingsDialog = {
+ _useProxyCheckbox: null,
+ _proxyTypeLabel: null,
+ _proxyTypeMenulist: null,
+ _proxyAddressLabel: null,
+ _proxyAddressTextbox: null,
+ _proxyPortLabel: null,
+ _proxyPortTextbox: null,
+ _proxyUsernameLabel: null,
+ _proxyUsernameTextbox: null,
+ _proxyPasswordLabel: null,
+ _proxyPasswordTextbox: null,
+ _useFirewallCheckbox: null,
+ _allowedPortsLabel: null,
+ _allowedPortsTextbox: null,
+
+ selectors: {
+ header: "#torPreferences-connection-header",
+ useProxyCheckbox: "checkbox#torPreferences-connection-toggleProxy",
+ proxyTypeLabel: "label#torPreferences-localProxy-type",
+ proxyTypeList: "menulist#torPreferences-localProxy-builtinList",
+ proxyAddressLabel: "label#torPreferences-localProxy-address",
+ proxyAddressTextbox: "input#torPreferences-localProxy-textboxAddress",
+ proxyPortLabel: "label#torPreferences-localProxy-port",
+ proxyPortTextbox: "input#torPreferences-localProxy-textboxPort",
+ proxyUsernameLabel: "label#torPreferences-localProxy-username",
+ proxyUsernameTextbox: "input#torPreferences-localProxy-textboxUsername",
+ proxyPasswordLabel: "label#torPreferences-localProxy-password",
+ proxyPasswordTextbox: "input#torPreferences-localProxy-textboxPassword",
+ useFirewallCheckbox: "checkbox#torPreferences-connection-toggleFirewall",
+ firewallAllowedPortsLabel: "label#torPreferences-connection-allowedPorts",
+ firewallAllowedPortsTextbox:
+ "input#torPreferences-connection-textboxAllowedPorts",
+ },
// disables the provided list of elements
_setElementsDisabled(elements, disabled) {
for (let currentElement of elements) {
currentElement.disabled = disabled;
}
- }
+ },
- _populateXUL(window, aDialog) {
- const selectors = ConnectionSettingsDialog.selectors;
+ init() {
+ const selectors = this.selectors;
- this._dialog = aDialog;
- const dialogWin = this._dialog.parentElement;
- dialogWin.setAttribute(
+ document.documentElement.setAttribute(
"title",
TorStrings.settings.connectionSettingsDialogTitle
);
- this._dialog.querySelector(selectors.header).textContent =
+ document.querySelector(selectors.header).textContent =
TorStrings.settings.connectionSettingsDialogHeader;
// Local Proxy
- this._useProxyCheckbox = this._dialog.querySelector(
- selectors.useProxyCheckbox
- );
+ this._useProxyCheckbox = document.querySelector(selectors.useProxyCheckbox);
this._useProxyCheckbox.setAttribute(
"label",
TorStrings.settings.useLocalProxy
@@ -76,7 +70,7 @@ export class ConnectionSettingsDialog {
const checked = this._useProxyCheckbox.checked;
this.onToggleProxy(checked);
});
- this._proxyTypeLabel = this._dialog.querySelector(selectors.proxyTypeLabel);
+ this._proxyTypeLabel = document.querySelector(selectors.proxyTypeLabel);
this._proxyTypeLabel.setAttribute("value", TorStrings.settings.proxyType);
let mockProxies = [
@@ -90,9 +84,7 @@ export class ConnectionSettingsDialog {
},
{ value: TorProxyType.HTTPS, label: TorStrings.settings.proxyTypeHTTP },
];
- this._proxyTypeMenulist = this._dialog.querySelector(
- selectors.proxyTypeList
- );
+ this._proxyTypeMenulist = document.querySelector(selectors.proxyTypeList);
this._proxyTypeMenulist.addEventListener("command", e => {
const value = this._proxyTypeMenulist.value;
this.onSelectProxyType(value);
@@ -104,14 +96,14 @@ export class ConnectionSettingsDialog {
this._proxyTypeMenulist.querySelector("menupopup").appendChild(menuEntry);
}
- this._proxyAddressLabel = this._dialog.querySelector(
+ this._proxyAddressLabel = document.querySelector(
selectors.proxyAddressLabel
);
this._proxyAddressLabel.setAttribute(
"value",
TorStrings.settings.proxyAddress
);
- this._proxyAddressTextbox = this._dialog.querySelector(
+ this._proxyAddressTextbox = document.querySelector(
selectors.proxyAddressTextbox
);
this._proxyAddressTextbox.setAttribute(
@@ -129,33 +121,31 @@ export class ConnectionSettingsDialog {
}
}
});
- this._proxyPortLabel = this._dialog.querySelector(selectors.proxyPortLabel);
+ this._proxyPortLabel = document.querySelector(selectors.proxyPortLabel);
this._proxyPortLabel.setAttribute("value", TorStrings.settings.proxyPort);
- this._proxyPortTextbox = this._dialog.querySelector(
- selectors.proxyPortTextbox
- );
- this._proxyUsernameLabel = this._dialog.querySelector(
+ this._proxyPortTextbox = document.querySelector(selectors.proxyPortTextbox);
+ this._proxyUsernameLabel = document.querySelector(
selectors.proxyUsernameLabel
);
this._proxyUsernameLabel.setAttribute(
"value",
TorStrings.settings.proxyUsername
);
- this._proxyUsernameTextbox = this._dialog.querySelector(
+ this._proxyUsernameTextbox = document.querySelector(
selectors.proxyUsernameTextbox
);
this._proxyUsernameTextbox.setAttribute(
"placeholder",
TorStrings.settings.proxyUsernamePasswordPlaceholder
);
- this._proxyPasswordLabel = this._dialog.querySelector(
+ this._proxyPasswordLabel = document.querySelector(
selectors.proxyPasswordLabel
);
this._proxyPasswordLabel.setAttribute(
"value",
TorStrings.settings.proxyPassword
);
- this._proxyPasswordTextbox = this._dialog.querySelector(
+ this._proxyPasswordTextbox = document.querySelector(
selectors.proxyPasswordTextbox
);
this._proxyPasswordTextbox.setAttribute(
@@ -174,7 +164,7 @@ export class ConnectionSettingsDialog {
}
// Local firewall
- this._useFirewallCheckbox = this._dialog.querySelector(
+ this._useFirewallCheckbox = document.querySelector(
selectors.useFirewallCheckbox
);
this._useFirewallCheckbox.setAttribute(
@@ -185,14 +175,14 @@ export class ConnectionSettingsDialog {
const checked = this._useFirewallCheckbox.checked;
this.onToggleFirewall(checked);
});
- this._allowedPortsLabel = this._dialog.querySelector(
+ this._allowedPortsLabel = document.querySelector(
selectors.firewallAllowedPortsLabel
);
this._allowedPortsLabel.setAttribute(
"value",
TorStrings.settings.allowedPorts
);
- this._allowedPortsTextbox = this._dialog.querySelector(
+ this._allowedPortsTextbox = document.querySelector(
selectors.firewallAllowedPortsTextbox
);
this._allowedPortsTextbox.setAttribute(
@@ -207,10 +197,11 @@ export class ConnectionSettingsDialog {
TorSettings.firewall.allowed_ports.join(", ");
}
- this._dialog.addEventListener("dialogaccept", e => {
+ const dialog = document.getElementById("torPreferences-connection-dialog");
+ dialog.addEventListener("dialogaccept", e => {
this._applySettings();
});
- }
+ },
// callback when proxy is toggled
onToggleProxy(enabled) {
@@ -235,7 +226,7 @@ export class ConnectionSettingsDialog {
if (enabled) {
this.onSelectProxyType(this._proxyTypeMenulist.value);
}
- }
+ },
// callback when proxy type is changed
onSelectProxyType(value) {
@@ -308,7 +299,7 @@ export class ConnectionSettingsDialog {
break;
}
}
- }
+ },
// callback when firewall proxy is toggled
onToggleFirewall(enabled) {
@@ -319,7 +310,7 @@ export class ConnectionSettingsDialog {
[this._allowedPortsLabel, this._allowedPortsTextbox],
disabled
);
- }
+ },
// pushes settings from UI to tor
_applySettings() {
@@ -372,17 +363,13 @@ export class ConnectionSettingsDialog {
TorSettings.saveToPrefs();
TorSettings.applySettings();
- }
-
- init(window, aDialog) {
- this._populateXUL(window, aDialog);
- }
+ },
+};
- openDialog(gSubDialog) {
- gSubDialog.open(
- "chrome://browser/content/torpreferences/connectionSettingsDialog.xhtml",
- { features: "resizable=yes" },
- this
- );
- }
-}
+window.addEventListener(
+ "DOMContentLoaded",
+ () => {
+ gConnectionSettingsDialog.init();
+ },
+ { once: true }
+);
=====================================
browser/components/torpreferences/content/connectionSettingsDialog.xhtml
=====================================
@@ -9,6 +9,8 @@
xmlns:html="http://www.w3.org/1999/xhtml"
>
<dialog id="torPreferences-connection-dialog" buttons="accept,cancel">
+ <script src="chrome://browser/content/torpreferences/connectionSettingsDialog.js" />
+
<html:h3 id="torPreferences-connection-header">​</html:h3>
<!-- Local Proxy -->
<checkbox id="torPreferences-connection-toggleProxy" label="​" />
@@ -78,16 +80,5 @@
/>
</hbox>
</box>
- <script type="application/javascript">
- <![CDATA[
- "use strict";
-
- let connectionSettingsDialog = window.arguments[0];
- document.addEventListener("DOMContentLoaded", () => {
- let dialog = document.getElementById("torPreferences-connection-dialog");
- connectionSettingsDialog.init(window, dialog);
- });
- ]]>
- </script>
</dialog>
</window>
=====================================
browser/components/torpreferences/content/provideBridgeDialog.mjs → browser/components/torpreferences/content/provideBridgeDialog.js
=====================================
@@ -1,53 +1,44 @@
-import { TorStrings } from "resource://gre/modules/TorStrings.sys.mjs";
-
-import {
- TorSettings,
- TorBridgeSource,
-} from "resource://gre/modules/TorSettings.sys.mjs";
-
-import {
- TorConnect,
- TorConnectTopics,
-} from "resource://gre/modules/TorConnect.sys.mjs";
-
-export class ProvideBridgeDialog {
- constructor(onSubmit) {
- this.onSubmit = onSubmit;
- this._dialog = null;
- this._textarea = null;
- this._acceptButton = null;
- }
-
- static get selectors() {
- return {
- description: "#torPreferences-provideBridge-description",
- textarea: "#torPreferences-provideBridge-textarea",
- };
- }
-
- _populateXUL(window, aDialog) {
- const selectors = ProvideBridgeDialog.selectors;
-
- const openHelp = () => {
+"use strict";
+
+const { TorStrings } = ChromeUtils.importESModule(
+ "resource://gre/modules/TorStrings.sys.mjs"
+);
+
+const { TorSettings, TorBridgeSource } = ChromeUtils.importESModule(
+ "resource://gre/modules/TorSettings.sys.mjs"
+);
+
+const { TorConnect, TorConnectTopics } = ChromeUtils.importESModule(
+ "resource://gre/modules/TorConnect.sys.mjs"
+);
+
+const gProvideBridgeDialog = {
+ init() {
+ this._result = window.arguments[0];
+
+ document.documentElement.setAttribute(
+ "title",
+ TorStrings.settings.provideBridgeTitleAdd
+ );
+ const learnMore = document.createXULElement("label");
+ learnMore.className = "learnMore text-link";
+ learnMore.setAttribute("is", "text-link");
+ learnMore.setAttribute("value", TorStrings.settings.learnMore);
+ learnMore.addEventListener("click", () => {
window.top.openTrustedLinkIn(
TorStrings.settings.learnMoreBridgesURL,
"tab"
);
- };
+ });
- this._dialog = aDialog;
- const dialogWin = this._dialog.parentElement;
- dialogWin.setAttribute("title", TorStrings.settings.provideBridgeTitleAdd);
- const learnMore = window.document.createXULElement("label");
- learnMore.className = "learnMore text-link";
- learnMore.setAttribute("is", "text-link");
- learnMore.setAttribute("value", TorStrings.settings.learnMore);
- learnMore.addEventListener("click", openHelp);
- const descr = this._dialog.querySelector(selectors.description);
- descr.textContent = "";
const pieces = TorStrings.settings.provideBridgeDescription.split("%S");
- descr.append(pieces[0], learnMore, pieces[1] || "");
- this._textarea = this._dialog.querySelector(selectors.textarea);
+ document
+ .getElementById("torPreferences-provideBridge-description")
+ .replaceChildren(pieces[0], learnMore, pieces[1] || "");
+
+ this._textarea = document.getElementById(
+ "torPreferences-provideBridge-textarea"
+ );
this._textarea.setAttribute(
"placeholder",
TorStrings.settings.provideBridgePlaceholder
@@ -58,32 +49,44 @@ export class ProvideBridgeDialog {
this._textarea.value = TorSettings.bridges.bridge_strings.join("\n");
}
- this._dialog.addEventListener("dialogaccept", e => {
- this.onSubmit(this._textarea.value, TorConnect.canBeginBootstrap);
+ const dialog = document.getElementById(
+ "torPreferences-provideBridge-dialog"
+ );
+ dialog.addEventListener("dialogaccept", e => {
+ this._result.accepted = true;
});
- this._acceptButton = this._dialog.getButton("accept");
+ this._acceptButton = dialog.getButton("accept");
Services.obs.addObserver(this, TorConnectTopics.StateChange);
this.onValueChange();
this.onAcceptStateChange();
- }
+ },
+
+ uninit() {
+ Services.obs.removeObserver(this, TorConnectTopics.StateChange);
+ },
onValueChange() {
// TODO: Do some proper value parsing and error reporting. See
// tor-browser#40552.
- this._acceptButton.disabled = !this._textarea.value.trim();
- }
+ const value = this._textarea.value.trim();
+ this._acceptButton.disabled = !value;
+ this._result.bridgeStrings = value;
+ },
onAcceptStateChange() {
+ const connect = TorConnect.canBeginBootstrap;
+ this._result.connect = connect;
+
this._acceptButton.setAttribute(
"label",
- TorConnect.canBeginBootstrap
+ connect
? TorStrings.settings.bridgeButtonConnect
: TorStrings.settings.bridgeButtonAccept
);
- }
+ },
observe(subject, topic, data) {
switch (topic) {
@@ -91,27 +94,20 @@ export class ProvideBridgeDialog {
this.onAcceptStateChange();
break;
}
- }
-
- init(window, aDialog) {
- this._populateXUL(window, aDialog);
- }
-
- close() {
- // Unregister our observer topics.
- Services.obs.removeObserver(this, TorConnectTopics.StateChange);
- }
-
- openDialog(gSubDialog) {
- gSubDialog.open(
- "chrome://browser/content/torpreferences/provideBridgeDialog.xhtml",
- {
- features: "resizable=yes",
- closingCallback: () => {
- this.close();
- },
+ },
+};
+
+window.addEventListener(
+ "DOMContentLoaded",
+ () => {
+ gProvideBridgeDialog.init();
+ window.addEventListener(
+ "unload",
+ () => {
+ gProvideBridgeDialog.uninit();
},
- this
+ { once: true }
);
- }
-}
+ },
+ { once: true }
+);
=====================================
browser/components/torpreferences/content/provideBridgeDialog.xhtml
=====================================
@@ -9,6 +9,8 @@
xmlns:html="http://www.w3.org/1999/xhtml"
>
<dialog id="torPreferences-provideBridge-dialog" buttons="accept,cancel">
+ <script src="chrome://browser/content/torpreferences/provideBridgeDialog.js" />
+
<description>
<html:div id="torPreferences-provideBridge-description"
>​<br />​</html:div
@@ -19,16 +21,5 @@
multiline="true"
rows="3"
/>
- <script type="application/javascript">
- <![CDATA[
- "use strict";
-
- let provideBridgeDialog = window.arguments[0];
- document.addEventListener("DOMContentLoaded", () => {
- let dialog = document.getElementById("torPreferences-provideBridge-dialog");
- provideBridgeDialog.init(window, dialog);
- });
- ]]>
- </script>
</dialog>
</window>
=====================================
browser/components/torpreferences/content/requestBridgeDialog.mjs → browser/components/torpreferences/content/requestBridgeDialog.js
=====================================
@@ -1,44 +1,39 @@
-import { BridgeDB } from "resource://gre/modules/BridgeDB.sys.mjs";
-import { TorStrings } from "resource://gre/modules/TorStrings.sys.mjs";
-
-import {
- TorConnect,
- TorConnectTopics,
-} from "resource://gre/modules/TorConnect.sys.mjs";
-
-export class RequestBridgeDialog {
- constructor(onSubmit) {
- this.onSubmit = onSubmit;
- this._dialog = null;
- this._submitButton = null;
- this._dialogHeader = null;
- this._captchaImage = null;
- this._captchaEntryTextbox = null;
- this._captchaRefreshButton = null;
- this._incorrectCaptchaHbox = null;
- this._incorrectCaptchaLabel = null;
- }
-
- static get selectors() {
- return {
- dialogHeader: "h3#torPreferences-requestBridge-header",
- captchaImage: "image#torPreferences-requestBridge-captchaImage",
- captchaEntryTextbox: "input#torPreferences-requestBridge-captchaTextbox",
- refreshCaptchaButton:
- "button#torPreferences-requestBridge-refreshCaptchaButton",
- incorrectCaptchaHbox:
- "hbox#torPreferences-requestBridge-incorrectCaptchaHbox",
- incorrectCaptchaLabel:
- "label#torPreferences-requestBridge-incorrectCaptchaError",
- };
- }
-
- _populateXUL(window, dialog) {
- const selectors = RequestBridgeDialog.selectors;
+"use strict";
+
+const { BridgeDB } = ChromeUtils.importESModule(
+ "resource://gre/modules/BridgeDB.sys.mjs"
+);
+const { TorStrings } = ChromeUtils.importESModule(
+ "resource://gre/modules/TorStrings.sys.mjs"
+);
+
+const { TorConnect, TorConnectTopics } = ChromeUtils.importESModule(
+ "resource://gre/modules/TorConnect.sys.mjs"
+);
+
+const gRequestBridgeDialog = {
+ selectors: {
+ dialogHeader: "h3#torPreferences-requestBridge-header",
+ captchaImage: "image#torPreferences-requestBridge-captchaImage",
+ captchaEntryTextbox: "input#torPreferences-requestBridge-captchaTextbox",
+ refreshCaptchaButton:
+ "button#torPreferences-requestBridge-refreshCaptchaButton",
+ incorrectCaptchaHbox:
+ "hbox#torPreferences-requestBridge-incorrectCaptchaHbox",
+ incorrectCaptchaLabel:
+ "label#torPreferences-requestBridge-incorrectCaptchaError",
+ },
+
+ init() {
+ this._result = window.arguments[0];
+
+ const selectors = this.selectors;
+
+ this._dialog = document.getElementById(
+ "torPreferences-requestBridge-dialog"
+ );
- this._dialog = dialog;
- const dialogWin = dialog.parentElement;
- dialogWin.setAttribute(
+ document.documentElement.setAttribute(
"title",
TorStrings.settings.requestBridgeDialogTitle
);
@@ -104,16 +99,24 @@ export class RequestBridgeDialog {
Services.obs.addObserver(this, TorConnectTopics.StateChange);
this.onAcceptStateChange();
- }
+ },
+
+ uninit() {
+ BridgeDB.close();
+ // Unregister our observer topics.
+ Services.obs.removeObserver(this, TorConnectTopics.StateChange);
+ },
onAcceptStateChange() {
+ const connect = TorConnect.canBeginBootstrap;
+ this._result.connect = connect;
this._submitButton.setAttribute(
"label",
- TorConnect.canBeginBootstrap
+ connect
? TorStrings.settings.bridgeButtonConnect
: TorStrings.settings.submitCaptcha
);
- }
+ },
observe(subject, topic, data) {
switch (topic) {
@@ -121,7 +124,7 @@ export class RequestBridgeDialog {
this.onAcceptStateChange();
break;
}
- }
+ },
_setcaptchaImage(uri) {
if (uri != this._captchaImage.src) {
@@ -131,27 +134,17 @@ export class RequestBridgeDialog {
this._captchaEntryTextbox.focus();
this._captchaEntryTextbox.select();
}
- }
+ },
_setUIDisabled(disabled) {
this._submitButton.disabled = this._captchaGuessIsEmpty() || disabled;
this._captchaEntryTextbox.disabled = disabled;
this._captchaRefreshButton.disabled = disabled;
- }
+ },
_captchaGuessIsEmpty() {
return this._captchaEntryTextbox.value == "";
- }
-
- init(window, dialog) {
- this._populateXUL(window, dialog);
- }
-
- close() {
- BridgeDB.close();
- // Unregister our observer topics.
- Services.obs.removeObserver(this, TorConnectTopics.StateChange);
- }
+ },
/*
Event Handlers
@@ -169,8 +162,9 @@ export class RequestBridgeDialog {
BridgeDB.submitCaptchaGuess(captchaText)
.then(aBridges => {
- if (aBridges) {
- this.onSubmit(aBridges, TorConnect.canBeginBootstrap);
+ if (aBridges && aBridges.length) {
+ this._result.accepted = true;
+ this._result.bridges = aBridges;
this._submitButton.disabled = false;
// This was successful, but use cancelDialog() to close, since
// we intercept the `dialogaccept` event.
@@ -186,7 +180,7 @@ export class RequestBridgeDialog {
this._incorrectCaptchaHbox.style.visibility = "visible";
console.log(aError);
});
- }
+ },
onRefreshCaptcha() {
this._setUIDisabled(true);
@@ -198,18 +192,20 @@ export class RequestBridgeDialog {
BridgeDB.requestNewCaptchaImage().then(uri => {
this._setcaptchaImage(uri);
});
- }
-
- openDialog(gSubDialog) {
- gSubDialog.open(
- "chrome://browser/content/torpreferences/requestBridgeDialog.xhtml",
- {
- features: "resizable=yes",
- closingCallback: () => {
- this.close();
- },
+ },
+};
+
+window.addEventListener(
+ "DOMContentLoaded",
+ () => {
+ gRequestBridgeDialog.init();
+ window.addEventListener(
+ "unload",
+ () => {
+ gRequestBridgeDialog.uninit();
},
- this
+ { once: true }
);
- }
-}
+ },
+ { once: true }
+);
=====================================
browser/components/torpreferences/content/requestBridgeDialog.xhtml
=====================================
@@ -9,6 +9,8 @@
xmlns:html="http://www.w3.org/1999/xhtml"
>
<dialog id="torPreferences-requestBridge-dialog" buttons="accept,cancel">
+ <script src="chrome://browser/content/torpreferences/requestBridgeDialog.js" />
+
<!-- ok, so ​ is a zero-width space. We need to have *something* in the innerText so that XUL knows how tall the
title node is so that it can determine how large to make the dialog element's inner draw area. If we have nothing
in the innerText, then it collapse to 0 height, and the contents of the dialog ends up partially hidden >:( -->
@@ -30,16 +32,5 @@
<image id="torPreferences-requestBridge-errorIcon" />
<label id="torPreferences-requestBridge-incorrectCaptchaError" flex="1" />
</hbox>
- <script type="application/javascript">
- <![CDATA[
- "use strict";
-
- let requestBridgeDialog = window.arguments[0];
- document.addEventListener("DOMContentLoaded", () => {
- let dialog = document.getElementById("torPreferences-requestBridge-dialog");
- requestBridgeDialog.init(window, dialog);
- });
- ]]>
- </script>
</dialog>
</window>
=====================================
browser/components/torpreferences/content/torLogDialog.js
=====================================
@@ -0,0 +1,62 @@
+"use strict";
+
+const { setTimeout, clearTimeout } = ChromeUtils.importESModule(
+ "resource://gre/modules/Timer.sys.mjs"
+);
+
+const { TorProviderBuilder } = ChromeUtils.importESModule(
+ "resource://gre/modules/TorProviderBuilder.sys.mjs"
+);
+const { TorStrings } = ChromeUtils.importESModule(
+ "resource://gre/modules/TorStrings.sys.mjs"
+);
+
+window.addEventListener(
+ "DOMContentLoaded",
+ () => {
+ document.documentElement.setAttribute(
+ "title",
+ TorStrings.settings.torLogDialogTitle
+ );
+
+ const dialog = document.getElementById("torPreferences-torLog-dialog");
+ const copyLogButton = dialog.getButton("extra1");
+ copyLogButton.setAttribute("label", TorStrings.settings.copyLog);
+
+ const logText = document.getElementById(
+ "torPreferences-torDialog-textarea"
+ );
+
+ let restoreButtonTimeout = null;
+ copyLogButton.addEventListener("command", () => {
+ // Copy tor log messages to the system clipboard.
+ let clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(
+ Ci.nsIClipboardHelper
+ );
+ clipboard.copyString(logText.value);
+
+ const label = copyLogButton.querySelector("label");
+ label.setAttribute("value", TorStrings.settings.copied);
+ copyLogButton.classList.add("primary");
+
+ const RESTORE_TIME = 1200;
+ if (restoreButtonTimeout !== null) {
+ clearTimeout(restoreButtonTimeout);
+ }
+ restoreButtonTimeout = setTimeout(() => {
+ label.setAttribute("value", TorStrings.settings.copyLog);
+ copyLogButton.classList.remove("primary");
+ restoreButtonTimeout = null;
+ }, RESTORE_TIME);
+ });
+
+ // A waiting state should not be needed at this point.
+ // Also, we probably cannot even arrive here if the provider failed to
+ // initialize, otherwise we could use a try/catch, and write the exception
+ // text in the logs, instead.
+ TorProviderBuilder.build().then(
+ provider => (logText.value = provider.getLog())
+ );
+ },
+ { once: true }
+);
=====================================
browser/components/torpreferences/content/torLogDialog.mjs deleted
=====================================
@@ -1,78 +0,0 @@
-import { setTimeout, clearTimeout } from "resource://gre/modules/Timer.sys.mjs";
-
-import { TorProviderBuilder } from "resource://gre/modules/TorProviderBuilder.sys.mjs";
-import { TorStrings } from "resource://gre/modules/TorStrings.sys.mjs";
-
-export class TorLogDialog {
- constructor() {
- this._dialog = null;
- this._logTextarea = null;
- this._copyLogButton = null;
- this._restoreButtonTimeout = null;
- }
-
- static get selectors() {
- return {
- copyLogButton: "extra1",
- logTextarea: "textarea#torPreferences-torDialog-textarea",
- };
- }
-
- async _populateXUL(aDialog) {
- this._dialog = aDialog;
- const dialogWin = this._dialog.parentElement;
- dialogWin.setAttribute("title", TorStrings.settings.torLogDialogTitle);
-
- this._logTextarea = this._dialog.querySelector(
- TorLogDialog.selectors.logTextarea
- );
-
- this._copyLogButton = this._dialog.getButton(
- TorLogDialog.selectors.copyLogButton
- );
- this._copyLogButton.setAttribute("label", TorStrings.settings.copyLog);
- this._copyLogButton.addEventListener("command", () => {
- this.copyTorLog();
- const label = this._copyLogButton.querySelector("label");
- label.setAttribute("value", TorStrings.settings.copied);
- this._copyLogButton.classList.add("primary");
-
- const RESTORE_TIME = 1200;
- if (this._restoreButtonTimeout !== null) {
- clearTimeout(this._restoreButtonTimeout);
- }
- this._restoreButtonTimeout = setTimeout(() => {
- label.setAttribute("value", TorStrings.settings.copyLog);
- this._copyLogButton.classList.remove("primary");
- this._restoreButtonTimeout = null;
- }, RESTORE_TIME);
- });
-
- // A waiting state should not be needed at this point.
- // Also, we probably cannot even arrive here if the provider failed to
- // initialize, otherwise we could use a try/catch, and write the exception
- // text in the logs, instead.
- const provider = await TorProviderBuilder.build();
- this._logTextarea.value = provider.getLog();
- }
-
- init(window, aDialog) {
- this._populateXUL(aDialog);
- }
-
- copyTorLog() {
- // Copy tor log messages to the system clipboard.
- let clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(
- Ci.nsIClipboardHelper
- );
- clipboard.copyString(this._logTextarea.value);
- }
-
- openDialog(gSubDialog) {
- gSubDialog.open(
- "chrome://browser/content/torpreferences/torLogDialog.xhtml",
- { features: "resizable=yes" },
- this
- );
- }
-}
=====================================
browser/components/torpreferences/content/torLogDialog.xhtml
=====================================
@@ -9,21 +9,12 @@
xmlns:html="http://www.w3.org/1999/xhtml"
>
<dialog id="torPreferences-torLog-dialog" buttons="accept,extra1">
+ <script src="chrome://browser/content/torpreferences/torLogDialog.js" />
+
<html:textarea
id="torPreferences-torDialog-textarea"
multiline="true"
readonly="true"
/>
- <script type="application/javascript">
- <![CDATA[
- "use strict";
-
- let torLogDialog = window.arguments[0];
- document.addEventListener("DOMContentLoaded", () => {
- let dialog = document.getElementById("torPreferences-torLog-dialog");
- torLogDialog.init(window, dialog);
- });
- ]]>
- </script>
</dialog>
</window>
=====================================
browser/components/torpreferences/jar.mn
=====================================
@@ -2,19 +2,19 @@ browser.jar:
content/browser/torpreferences/bridge.svg (content/bridge.svg)
content/browser/torpreferences/bridge-qr.svg (content/bridge-qr.svg)
content/browser/torpreferences/bridgeQrDialog.xhtml (content/bridgeQrDialog.xhtml)
- content/browser/torpreferences/bridgeQrDialog.mjs (content/bridgeQrDialog.mjs)
+ content/browser/torpreferences/bridgeQrDialog.js (content/bridgeQrDialog.js)
content/browser/torpreferences/builtinBridgeDialog.xhtml (content/builtinBridgeDialog.xhtml)
- content/browser/torpreferences/builtinBridgeDialog.mjs (content/builtinBridgeDialog.mjs)
+ content/browser/torpreferences/builtinBridgeDialog.js (content/builtinBridgeDialog.js)
content/browser/torpreferences/connectionSettingsDialog.xhtml (content/connectionSettingsDialog.xhtml)
- content/browser/torpreferences/connectionSettingsDialog.mjs (content/connectionSettingsDialog.mjs)
+ content/browser/torpreferences/connectionSettingsDialog.js (content/connectionSettingsDialog.js)
content/browser/torpreferences/network.svg (content/network.svg)
content/browser/torpreferences/network-broken.svg (content/network-broken.svg)
content/browser/torpreferences/provideBridgeDialog.xhtml (content/provideBridgeDialog.xhtml)
- content/browser/torpreferences/provideBridgeDialog.mjs (content/provideBridgeDialog.mjs)
+ content/browser/torpreferences/provideBridgeDialog.js (content/provideBridgeDialog.js)
content/browser/torpreferences/requestBridgeDialog.xhtml (content/requestBridgeDialog.xhtml)
- content/browser/torpreferences/requestBridgeDialog.mjs (content/requestBridgeDialog.mjs)
+ content/browser/torpreferences/requestBridgeDialog.js (content/requestBridgeDialog.js)
content/browser/torpreferences/connectionCategory.inc.xhtml (content/connectionCategory.inc.xhtml)
- content/browser/torpreferences/torLogDialog.mjs (content/torLogDialog.mjs)
+ content/browser/torpreferences/torLogDialog.js (content/torLogDialog.js)
content/browser/torpreferences/torLogDialog.xhtml (content/torLogDialog.xhtml)
content/browser/torpreferences/connectionPane.js (content/connectionPane.js)
content/browser/torpreferences/connectionPane.xhtml (content/connectionPane.xhtml)
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/6211ed8…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/6211ed8…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.7.0esr-13.5-1] 5 commits: fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in...
by richard (@richard) 23 Jan '24
by richard (@richard) 23 Jan '24
23 Jan '24
richard pushed to branch tor-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
39bde3a7 by Henry Wilkes at 2024-01-23T17:30:24+00:00
fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection
Bug 42036: Remove old bridge cards.
- - - - -
8fee6e00 by Henry Wilkes at 2024-01-23T17:30:25+00:00
fixup! Add TorStrings module for localization
Bug 42036: Remove old bridge cards.
- - - - -
dc354cb3 by Henry Wilkes at 2024-01-23T17:30:25+00:00
fixup! Bug 40597: Implement TorSettings module
Bug 42036: Add syncSettings to TorSettings and improve error reporting.
- - - - -
0b412130 by Henry Wilkes at 2024-01-23T17:30:26+00:00
fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection
Bug 42036: Implement new bridge settings UI, ready for Lox.
- - - - -
02cf2743 by Henry Wilkes at 2024-01-23T17:30:26+00:00
fixup! Tor Browser strings
Bug 42036: New bridge UI strings.
- - - - -
12 changed files:
- + browser/components/torpreferences/content/bridge-qr.svg
- + browser/components/torpreferences/content/bridge.svg
- browser/components/torpreferences/content/builtinBridgeDialog.mjs
- browser/components/torpreferences/content/builtinBridgeDialog.xhtml
- browser/components/torpreferences/content/connectionPane.js
- browser/components/torpreferences/content/connectionPane.xhtml
- browser/components/torpreferences/content/torPreferences.css
- browser/components/torpreferences/jar.mn
- browser/locales/en-US/browser/tor-browser.ftl
- toolkit/modules/TorSettings.sys.mjs
- toolkit/modules/TorStrings.sys.mjs
- toolkit/torbutton/chrome/locale/en-US/settings.properties
Changes:
=====================================
browser/components/torpreferences/content/bridge-qr.svg
=====================================
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="context-fill" xmlns="http://www.w3.org/2000/svg">
+ <path d="M5.5 3C4.83696 3 4.20107 3.26339 3.73223 3.73223C3.26339 4.20107 3 4.83696 3 5.5V9H4.75V5.5C4.75 5.30109 4.82902 5.11032 4.96967 4.96967C5.11032 4.82902 5.30109 4.75 5.5 4.75H9V3H5.5ZM11 10.25C11 10.4489 10.921 10.6397 10.7803 10.7803C10.6397 10.921 10.4489 11 10.25 11H7.75C7.55109 11 7.36032 10.921 7.21967 10.7803C7.07902 10.6397 7 10.4489 7 10.25V7.75C7 7.55109 7.07902 7.36032 7.21967 7.21967C7.36032 7.07902 7.55109 7 7.75 7H10.25C10.4489 7 10.6397 7.07902 10.7803 7.21967C10.921 7.36032 11 7.55109 11 7.75V10.25ZM17 15H15V13H17V11H15V9H17V7H15V9H13V11H15V13H13V15H11V13H9V15H7V17H9V15H11V17H13V15H15V17H17V15ZM3 18.5V15H4.75V18.5C4.75 18.914 5.086 19.25 5.5 19.25H9V21H5.5C4.83696 21 4.20107 20.7366 3.73223 20.2678C3.26339 19.7989 3 19.163 3 18.5ZM15 3H18.5C19.163 3 19.7989 3.26339 20.2678 3.73223C20.7366 4.20107 21 4.83696 21 5.5V9H19.25V5.5C19.25 5.30109 19.171 5.11032 19.0303 4.96967C18.8897 4.82902 18.6989 4.75 18.5 4.75H15V3ZM21 18.5V15H19.25V18.5C19.25 18.6989 19.171 18.8897 19.0303 19.0303C18.8897 19.171 18.6989 19.25 18.5 19.25H15V21H18.5C19.163 21 19.7989 20.7366 20.2678 20.2678C20.7366 19.7989 21 19.163 21 18.5Z"/>
+</svg>
=====================================
browser/components/torpreferences/content/bridge.svg
=====================================
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="context-fill" xmlns="http://www.w3.org/2000/svg">
+ <path d="M15.5 11.5C15.5 7.35786 12.1421 4 8 4C3.85786 4 0.5 7.35786 0.5 11.5V12.7461H1.67188V11.5C1.67188 8.00507 4.50507 5.17188 8 5.17188C11.4949 5.17188 14.3281 8.00507 14.3281 11.5V12.7461H15.5V11.5Z"/>
+ <path d="M13.25 11.5C13.25 8.6005 10.8995 6.24999 7.99999 6.24999C5.1005 6.24999 2.74999 8.6005 2.74999 11.5L2.74989 12.7461H3.92177L3.92187 11.5C3.92187 9.24771 5.74771 7.42187 7.99999 7.42187C10.2523 7.42187 12.0781 9.24771 12.0781 11.5L12.0782 12.7461H13.2501L13.25 11.5Z"/>
+ <path d="M8 8.5C9.65686 8.5 11 9.84315 11 11.5L11.0002 12.7461H9.82836L9.82813 11.5C9.82813 10.4904 9.00965 9.67188 8 9.67188C6.99036 9.67188 6.17188 10.4904 6.17188 11.5L6.17164 12.7461H4.99977V11.5C4.99977 9.84315 6.34315 8.5 8 8.5Z"/>
+</svg>
=====================================
browser/components/torpreferences/content/builtinBridgeDialog.mjs
=====================================
@@ -69,10 +69,12 @@ export class BuiltinBridgeDialog {
optionEl.querySelector(
".torPreferences-current-bridge-label"
).textContent = TorStrings.settings.currentBridge;
- optionEl.classList.toggle(
- "current-builtin-bridge-type",
- type === currentBuiltinType
- );
+ optionEl
+ .querySelector(".bridge-status-badge")
+ .classList.toggle(
+ "bridge-status-current-built-in",
+ type === currentBuiltinType
+ );
}
if (currentBuiltinType) {
=====================================
browser/components/torpreferences/content/builtinBridgeDialog.xhtml
=====================================
@@ -20,8 +20,8 @@
aria-describedby="obfs-bridges-current obfs-bridges-description"
value="obfs4"
/>
- <html:span class="torPreferences-current-bridge-badge">
- <image class="torPreferences-current-bridge-icon" />
+ <html:span class="bridge-status-badge">
+ <html:div class="bridge-status-icon"></html:div>
<html:span
id="obfs-bridges-current"
class="torPreferences-current-bridge-label"
@@ -41,8 +41,8 @@
aria-describedby="snowflake-bridges-current snowflake-bridges-description"
value="snowflake"
/>
- <html:span class="torPreferences-current-bridge-badge">
- <image class="torPreferences-current-bridge-icon" />
+ <html:span class="bridge-status-badge">
+ <html:div class="bridge-status-icon"></html:div>
<html:span
id="snowflake-bridges-current"
class="torPreferences-current-bridge-label"
@@ -62,8 +62,8 @@
aria-describedby="meek-bridges-current meek-bridges-description"
value="meek-azure"
/>
- <html:span class="torPreferences-current-bridge-badge">
- <image class="torPreferences-current-bridge-icon" />
+ <html:span class="bridge-status-badge">
+ <html:div class="bridge-status-icon"></html:div>
<html:span
id="meek-bridges-current"
class="torPreferences-current-bridge-label"
=====================================
browser/components/torpreferences/content/connectionPane.js
=====================================
@@ -66,6 +66,1642 @@ const InternetStatus = Object.freeze({
Offline: -1,
});
+/**
+ * Make changes to TorSettings and save them.
+ *
+ * Bulk changes will be frozen together.
+ *
+ * @param {Function} changes - Method to apply changes to TorSettings.
+ */
+async function setTorSettings(changes) {
+ if (!TorSettings.initialized) {
+ console.warning("Ignoring changes to uninitialized TorSettings");
+ return;
+ }
+ TorSettings.freezeNotifications();
+ try {
+ changes();
+ // This will trigger TorSettings.#cleanupSettings()
+ TorSettings.saveToPrefs();
+ try {
+ // May throw.
+ await TorSettings.applySettings();
+ } catch (e) {
+ console.error("Failed to save Tor settings", e);
+ }
+ } finally {
+ TorSettings.thawNotifications();
+ }
+}
+
+/**
+ * Get the ID/fingerprint of the bridge used in the most recent Tor circuit.
+ *
+ * @returns {string?} - The bridge ID or null if a bridge with an id was not
+ * used in the last circuit.
+ */
+async function getConnectedBridgeId() {
+ // TODO: PieroV: We could make sure TorSettings is in sync by monitoring also
+ // changes of settings. At that point, we could query it, instead of doing a
+ // query over the control port.
+ let bridge = null;
+ try {
+ const provider = await TorProviderBuilder.build();
+ bridge = provider.currentBridge;
+ } catch (e) {
+ console.warn("Could not get current bridge", e);
+ }
+ return bridge?.fingerprint ?? null;
+}
+
+// TODO: Instead of aria-live in the DOM, use the proposed ariaNotify
+// API if it gets accepted into firefox and works with screen readers.
+// See https://github.com/WICG/proposals/issues/112
+/**
+ * Notification for screen reader users.
+ */
+const gBridgesNotification = {
+ /**
+ * The screen reader area that shows updates.
+ *
+ * @type {Element?}
+ */
+ _updateArea: null,
+ /**
+ * The text for the screen reader update.
+ *
+ * @type {Element?}
+ */
+ _textEl: null,
+ /**
+ * A timeout for hiding the update.
+ *
+ * @type {integer?}
+ */
+ _hideUpdateTimeout: null,
+
+ /**
+ * Initialize the area for notifications.
+ */
+ init() {
+ this._updateArea = document.getElementById("tor-bridges-update-area");
+ this._textEl = document.getElementById("tor-bridges-update-area-text");
+ },
+
+ /**
+ * Post a new notification, replacing any existing one.
+ *
+ * @param {string} type - The notification type.
+ */
+ post(type) {
+ this._updateArea.hidden = false;
+ // First we clear the update area to reset the text to be empty.
+ this._textEl.removeAttribute("data-l10n-id");
+ this._textEl.textContent = "";
+ if (this._hideUpdateTimeout !== null) {
+ clearTimeout(this._hideUpdateTimeout);
+ this._hideUpdateTimeout = null;
+ }
+
+ let updateId;
+ switch (type) {
+ case "removed-one":
+ updateId = "tor-bridges-update-removed-one-bridge";
+ break;
+ case "removed-all":
+ updateId = "tor-bridges-update-removed-all-bridges";
+ break;
+ case "changed":
+ default:
+ // Generic message for when bridges change.
+ updateId = "tor-bridges-update-changed-bridges";
+ break;
+ }
+
+ // Hide the area after 5 minutes, when the update is not "recent" any
+ // more.
+ this._hideUpdateTimeout = setTimeout(() => {
+ this._updateArea.hidden = true;
+ }, 300000);
+
+ // Wait a small amount of time to actually set the textContent. Otherwise
+ // the screen reader (tested with Orca) may not pick up on the change in
+ // text.
+ setTimeout(() => {
+ document.l10n.setAttributes(this._textEl, updateId);
+ }, 500);
+ },
+};
+
+/**
+ * Controls the bridge grid.
+ */
+const gBridgeGrid = {
+ /**
+ * The grid element.
+ *
+ * @type {Element?}
+ */
+ _grid: null,
+ /**
+ * The template for creating new rows.
+ *
+ * @type {HTMLTemplateElement?}
+ */
+ _rowTemplate: null,
+
+ /**
+ * @typedef {object} EmojiCell
+ *
+ * @property {Element} cell - The grid cell element.
+ * @property {Element} img - The grid cell icon.
+ * @property {Element} index - The emoji index.
+ */
+ /**
+ * @typedef {object} BridgeGridRow
+ *
+ * @property {Element} element - The row element.
+ * @property {Element} optionsButton - The options button.
+ * @property {EmojiCell[]} emojis - The emoji cells.
+ * @property {Element} menu - The options menupopup.
+ * @property {Element} statusEl - The bridge status element.
+ * @property {Element} statusText - The status text.
+ * @property {string} bridgeLine - The identifying bridge string for this row.
+ * @property {string?} bridgeId - The ID/fingerprint for the bridge, or null
+ * if it doesn't have one.
+ * @property {integer} index - The index of the row in the grid.
+ * @property {boolean} connected - Whether we are connected to the bridge
+ * (recently in use for a Tor circuit).
+ * @property {BridgeGridCell[]} cells - The cells that belong to the row,
+ * ordered by their column.
+ */
+ /**
+ * @typedef {object} BridgeGridCell
+ *
+ * @property {Element} element - The cell element.
+ * @property {Element} focusEl - The element belonging to the cell that should
+ * receive focus. Should be the cell element itself, or an interactive
+ * focusable child.
+ * @property {integer} columnIndex - The index of the column this cell belongs
+ * to.
+ * @property {BridgeGridRow} row - The row this cell belongs to.
+ */
+ /**
+ * The current rows in the grid.
+ *
+ * @type {BridgeGridRow[]}
+ */
+ _rows: [],
+ /**
+ * The cell that should be the focus target when the user moves focus into the
+ * grid, or null if the grid itself should be the target.
+ *
+ * @type {BridgeGridCell?}
+ */
+ _focusCell: null,
+
+ /**
+ * Initialize the bridge grid.
+ */
+ init() {
+ this._grid = document.getElementById("tor-bridges-grid-display");
+ // Initially, make only the grid itself part of the keyboard tab cycle.
+ // matches _focusCell = null.
+ this._grid.tabIndex = 0;
+
+ this._rowTemplate = document.getElementById(
+ "tor-bridges-grid-row-template"
+ );
+
+ this._grid.addEventListener("keydown", this);
+ this._grid.addEventListener("mousedown", this);
+ this._grid.addEventListener("focusin", this);
+
+ Services.obs.addObserver(this, TorSettingsTopics.SettingsChanged);
+
+ // NOTE: Before initializedPromise completes, this area is hidden.
+ TorSettings.initializedPromise.then(() => {
+ this._updateRows(true);
+ });
+ },
+
+ /**
+ * Uninitialize the bridge grid.
+ */
+ uninit() {
+ Services.obs.removeObserver(this, TorSettingsTopics.SettingsChanged);
+ this.deactivate();
+ },
+
+ /**
+ * Whether the grid is visible and responsive.
+ *
+ * @type {boolean}
+ */
+ _active: false,
+
+ /**
+ * Activate and show the bridge grid.
+ */
+ activate() {
+ if (this._active) {
+ return;
+ }
+
+ this._active = true;
+
+ Services.obs.addObserver(this, "intl:app-locales-changed");
+ Services.obs.addObserver(this, TorProviderTopics.BridgeChanged);
+
+ this._grid.classList.add("grid-active");
+
+ this._updateEmojiLangCode();
+ this._updateConnectedBridge();
+ },
+
+ /**
+ * Deactivate and hide the bridge grid.
+ */
+ deactivate() {
+ if (!this._active) {
+ return;
+ }
+
+ this._active = false;
+
+ this._forceCloseRowMenus();
+
+ this._grid.classList.remove("grid-active");
+
+ Services.obs.removeObserver(this, "intl:app-locales-changed");
+ Services.obs.removeObserver(this, TorProviderTopics.BridgeChanged);
+ },
+
+ observe(subject, topic, data) {
+ switch (topic) {
+ case TorSettingsTopics.SettingsChanged:
+ const { changes } = subject.wrappedJSObject;
+ if (
+ changes.includes("bridges.source") ||
+ changes.includes("bridges.bridge_strings")
+ ) {
+ this._updateRows();
+ }
+ break;
+ case "intl:app-locales-changed":
+ this._updateEmojiLangCode();
+ break;
+ case TorProviderTopics.BridgeChanged:
+ this._updateConnectedBridge();
+ break;
+ }
+ },
+
+ handleEvent(event) {
+ if (event.type === "keydown") {
+ if (event.altKey || event.shiftKey || event.metaKey || event.ctrlKey) {
+ // Don't interfere with these events.
+ return;
+ }
+
+ if (this._rows.some(row => row.menu.open)) {
+ // Have an open menu, let the menu handle the event instead.
+ return;
+ }
+
+ let numRows = this._rows.length;
+ if (!numRows) {
+ // Nowhere for focus to go.
+ return;
+ }
+
+ let moveRow = 0;
+ let moveColumn = 0;
+ const isLTR = this._grid.matches(":dir(ltr)");
+ switch (event.key) {
+ case "ArrowDown":
+ moveRow = 1;
+ break;
+ case "ArrowUp":
+ moveRow = -1;
+ break;
+ case "ArrowRight":
+ moveColumn = isLTR ? 1 : -1;
+ break;
+ case "ArrowLeft":
+ moveColumn = isLTR ? -1 : 1;
+ break;
+ default:
+ return;
+ }
+
+ // Prevent scrolling the nearest scroll container.
+ event.preventDefault();
+
+ const curCell = this._focusCell;
+ let row = curCell ? curCell.row.index + moveRow : 0;
+ let column = curCell ? curCell.columnIndex + moveColumn : 0;
+
+ // Clamp in bounds.
+ if (row < 0) {
+ row = 0;
+ } else if (row >= numRows) {
+ row = numRows - 1;
+ }
+
+ const numCells = this._rows[row].cells.length;
+ if (column < 0) {
+ column = 0;
+ } else if (column >= numCells) {
+ column = numCells - 1;
+ }
+
+ const newCell = this._rows[row].cells[column];
+
+ if (newCell !== curCell) {
+ this._setFocus(newCell);
+ }
+ } else if (event.type === "mousedown") {
+ if (event.button !== 0) {
+ return;
+ }
+ // Move focus index to the clicked target.
+ // NOTE: Since the cells and the grid have "tabindex=-1", they are still
+ // click-focusable. Therefore, the default mousedown handler will try to
+ // move focus to it.
+ // Rather than block this default handler, we instead re-direct the focus
+ // to the correct cell in the "focusin" listener.
+ const newCell = this._getCellFromTarget(event.target);
+ // NOTE: If newCell is null, then we do nothing here, but instead wait for
+ // the focusin handler to trigger.
+ if (newCell && newCell !== this._focusCell) {
+ this._setFocus(newCell);
+ }
+ } else if (event.type === "focusin") {
+ const focusCell = this._getCellFromTarget(event.target);
+ if (focusCell !== this._focusCell) {
+ // Focus is not where it is expected.
+ // E.g. the user has clicked the edge of the grid.
+ // Restore focus immediately back to the cell we expect.
+ this._setFocus(this._focusCell);
+ }
+ }
+ },
+
+ /**
+ * Return the cell that was the target of an event.
+ *
+ * @param {Element} element - The target of an event.
+ *
+ * @returns {BridgeGridCell?} - The cell that the element belongs to, or null
+ * if it doesn't belong to any cell.
+ */
+ _getCellFromTarget(element) {
+ for (const row of this._rows) {
+ for (const cell of row.cells) {
+ if (cell.element.contains(element)) {
+ return cell;
+ }
+ }
+ }
+ return null;
+ },
+
+ /**
+ * Determine whether the document's active element (focus) is within the grid
+ * or not.
+ *
+ * @returns {boolean} - Whether focus is within this grid or not.
+ */
+ _focusWithin() {
+ return this._grid.contains(document.activeElement);
+ },
+
+ /**
+ * Set the cell that should be the focus target of the grid, possibly moving
+ * the document's focus as well.
+ *
+ * @param {BridgeGridCell?} cell - The cell to make the focus target, or null
+ * if the grid itself should be the target.
+ * @param {boolean} [focusWithin] - Whether focus should be moved within the
+ * grid. If undefined, this will move focus if the grid currently contains
+ * the document's focus.
+ */
+ _setFocus(cell, focusWithin) {
+ if (focusWithin === undefined) {
+ focusWithin = this._focusWithin();
+ }
+ const prevFocusElement = this._focusCell
+ ? this._focusCell.focusEl
+ : this._grid;
+ const newFocusElement = cell ? cell.focusEl : this._grid;
+
+ if (prevFocusElement !== newFocusElement) {
+ prevFocusElement.tabIndex = -1;
+ newFocusElement.tabIndex = 0;
+ }
+ // Set _focusCell now, before we potentially call "focus", which can trigger
+ // the "focusin" handler.
+ this._focusCell = cell;
+
+ if (focusWithin) {
+ // Focus was within the grid, so we need to actively move it to the new
+ // element.
+ newFocusElement.focus({ preventScroll: true });
+ // Scroll to the whole cell into view, rather than just the focus element.
+ (cell?.element ?? newFocusElement).scrollIntoView({
+ block: "nearest",
+ inline: "nearest",
+ });
+ }
+ },
+
+ /**
+ * Reset the grids focus to be the first row's first cell, if any.
+ *
+ * @param {boolean} [focusWithin] - Whether focus should be moved within the
+ * grid. If undefined, this will move focus if the grid currently contains
+ * the document's focus.
+ */
+ _resetFocus(focusWithin) {
+ this._setFocus(
+ this._rows.length ? this._rows[0].cells[0] : null,
+ focusWithin
+ );
+ },
+
+ /**
+ * The bridge ID/fingerprint of the most recently used bridge (appearing in
+ * the latest Tor circuit). Roughly corresponds to the bridge we are currently
+ * connected to.
+ *
+ * null if there are no such bridges.
+ *
+ * @type {string?}
+ */
+ _connectedBridgeId: null,
+ /**
+ * Update _connectedBridgeId.
+ */
+ async _updateConnectedBridge() {
+ const bridgeId = await getConnectedBridgeId();
+ if (bridgeId === this._connectedBridgeId) {
+ return;
+ }
+ this._connectedBridgeId = bridgeId;
+ for (const row of this._rows) {
+ this._updateRowStatus(row);
+ }
+ },
+
+ /**
+ * Update the status of a row.
+ *
+ * @param {BridgeGridRow} row - The row to update.
+ */
+ _updateRowStatus(row) {
+ const connected = row.bridgeId && this._connectedBridgeId === row.bridgeId;
+ // NOTE: row.connected is initially undefined, so won't match `connected`.
+ if (connected === row.connected) {
+ return;
+ }
+
+ row.connected = connected;
+
+ const noStatus = !connected;
+
+ row.element.classList.toggle("hide-status", noStatus);
+ row.statusEl.classList.toggle("bridge-status-none", noStatus);
+ row.statusEl.classList.toggle("bridge-status-connected", connected);
+
+ if (connected) {
+ document.l10n.setAttributes(
+ row.statusText,
+ "tor-bridges-status-connected"
+ );
+ } else {
+ document.l10n.setAttributes(row.statusText, "tor-bridges-status-none");
+ }
+ },
+
+ /**
+ * The language code for emoji annotations.
+ *
+ * null if unset.
+ *
+ * @type {string?}
+ */
+ _emojiLangCode: null,
+ /**
+ * A promise that resolves to two JSON structures for bridge-emojis.json and
+ * annotations.json, respectively.
+ *
+ * @type {Promise}
+ */
+ _emojiPromise: Promise.all([
+ fetch(
+ "chrome://browser/content/torpreferences/bridgemoji/bridge-emojis.json"
+ ).then(response => response.json()),
+ fetch(
+ "chrome://browser/content/torpreferences/bridgemoji/annotations.json"
+ ).then(response => response.json()),
+ ]),
+
+ /**
+ * Update _emojiLangCode.
+ */
+ async _updateEmojiLangCode() {
+ let langCode;
+ const emojiAnnotations = (await this._emojiPromise)[1];
+ // Find the first desired locale we have annotations for.
+ // Add "en" as a fallback.
+ for (const bcp47 of [...Services.locale.appLocalesAsBCP47, "en"]) {
+ langCode = bcp47;
+ if (langCode in emojiAnnotations) {
+ break;
+ }
+ // Remove everything after the dash, if there is one.
+ langCode = bcp47.replace(/-.*/, "");
+ if (langCode in emojiAnnotations) {
+ break;
+ }
+ }
+ if (langCode !== this._emojiLangCode) {
+ this._emojiLangCode = langCode;
+ for (const row of this._rows) {
+ this._updateRowEmojis(row);
+ }
+ }
+ },
+
+ /**
+ * Update the bridge emojis to show their corresponding emoji with an
+ * annotation that matches the current locale.
+ *
+ * @param {BridgeGridRow} row - The row to update the emojis of.
+ */
+ async _updateRowEmojis(row) {
+ if (!this._emojiLangCode) {
+ // No lang code yet, wait until it is updated.
+ return;
+ }
+
+ const [emojiList, emojiAnnotations] = await this._emojiPromise;
+ const unknownString = await document.l10n.formatValue(
+ "tor-bridges-emoji-unknown"
+ );
+
+ for (const { cell, img, index } of row.emojis) {
+ const emoji = emojiList[index];
+ let emojiName;
+ if (!emoji) {
+ // Unexpected.
+ img.removeAttribute("src");
+ } else {
+ const cp = emoji.codePointAt(0).toString(16);
+ img.setAttribute(
+ "src",
+ `chrome://browser/content/torpreferences/bridgemoji/svgs/${cp}.svg`
+ );
+ emojiName = emojiAnnotations[this._emojiLangCode][cp];
+ }
+ if (!emojiName) {
+ console.error(`No emoji for index ${index}`);
+ emojiName = unknownString;
+ }
+ document.l10n.setAttributes(cell, "tor-bridges-emoji-cell", {
+ emojiName,
+ });
+ }
+ },
+
+ /**
+ * Create a new row for the grid.
+ *
+ * @param {string} bridgeLine - The bridge line for this row, which also acts
+ * as its ID.
+ *
+ * @returns {BridgeGridRow} - A new row, with then "index" unset and the
+ * "element" without a parent.
+ */
+ _createRow(bridgeLine) {
+ let details;
+ try {
+ details = TorParsers.parseBridgeLine(bridgeLine);
+ } catch (e) {
+ console.error(`Detected invalid bridge line: ${bridgeLine}`, e);
+ }
+ const row = {
+ element: this._rowTemplate.content.children[0].cloneNode(true),
+ bridgeLine,
+ bridgeId: details?.id ?? null,
+ cells: [],
+ };
+
+ const emojiBlock = row.element.querySelector(".tor-bridges-emojis-block");
+ row.emojis = makeBridgeId(bridgeLine).map(index => {
+ const cell = document.createElement("span");
+ // Each emoji is its own cell, we rely on the fact that makeBridgeId
+ // always returns four indices.
+ cell.setAttribute("role", "gridcell");
+ cell.classList.add("tor-bridges-grid-cell", "tor-bridges-emoji-cell");
+
+ const img = document.createElement("img");
+ img.classList.add("tor-bridges-emoji-icon");
+ // Accessible name will be set on the cell itself.
+ img.setAttribute("alt", "");
+
+ cell.appendChild(img);
+ emojiBlock.appendChild(cell);
+ // Image and text is set in _updateRowEmojis.
+ return { cell, img, index };
+ });
+
+ for (const [columnIndex, element] of row.element
+ .querySelectorAll(".tor-bridges-grid-cell")
+ .entries()) {
+ const focusEl =
+ element.querySelector(".tor-bridges-grid-focus") ?? element;
+ // Set a negative tabIndex, this makes the element click-focusable but not
+ // part of the tab navigation sequence.
+ focusEl.tabIndex = -1;
+ row.cells.push({ element, focusEl, columnIndex, row });
+ }
+
+ // TODO: properly handle "vanilla" bridges?
+ document.l10n.setAttributes(
+ row.element.querySelector(".tor-bridges-type-cell"),
+ "tor-bridges-type-prefix",
+ { type: details?.transport ?? "vanilla" }
+ );
+
+ row.element.querySelector(".tor-bridges-address-cell").textContent =
+ bridgeLine;
+
+ row.statusEl = row.element.querySelector(
+ ".tor-bridges-status-cell .bridge-status-badge"
+ );
+ row.statusText = row.element.querySelector(".tor-bridges-status-cell-text");
+
+ this._initRowMenu(row);
+
+ this._updateRowStatus(row);
+ this._updateRowEmojis(row);
+ return row;
+ },
+
+ /**
+ * The row menu index used for generating new ids.
+ *
+ * @type {integer}
+ */
+ _rowMenuIndex: 0,
+ /**
+ * Generate a new id for the options menu.
+ *
+ * @returns {string} - The new id.
+ */
+ _generateRowMenuId() {
+ const id = `tor-bridges-individual-options-menu-${this._rowMenuIndex}`;
+ // Assume we won't run out of ids.
+ this._rowMenuIndex++;
+ return id;
+ },
+
+ /**
+ * Initialize the shared menu for a row.
+ *
+ * @param {BridgeGridRow} row - The row to initialize the menu of.
+ */
+ _initRowMenu(row) {
+ row.menu = row.element.querySelector(
+ ".tor-bridges-individual-options-menu"
+ );
+ row.optionsButton = row.element.querySelector(
+ ".tor-bridges-options-cell-button"
+ );
+
+ row.menu.id = this._generateRowMenuId();
+ row.optionsButton.setAttribute("aria-controls", row.menu.id);
+
+ row.optionsButton.addEventListener("click", event => {
+ row.menu.toggle(event);
+ });
+
+ row.menu.addEventListener("hidden", () => {
+ // Make sure the button receives focus again when the menu is hidden.
+ // Currently, panel-list.js only does this when the menu is opened with a
+ // keyboard, but this causes focus to be lost from the page if the user
+ // uses a mixture of keyboard and mouse.
+ row.optionsButton.focus();
+ });
+
+ row.menu
+ .querySelector(".tor-bridges-options-qr-one-menu-item")
+ .addEventListener("click", () => {
+ const bridgeLine = row.bridgeLine;
+ if (!bridgeLine) {
+ return;
+ }
+ const dialog = new BridgeQrDialog();
+ dialog.openDialog(gSubDialog, bridgeLine);
+ });
+ row.menu
+ .querySelector(".tor-bridges-options-copy-one-menu-item")
+ .addEventListener("click", () => {
+ const clipboard = Cc[
+ "@mozilla.org/widget/clipboardhelper;1"
+ ].getService(Ci.nsIClipboardHelper);
+ clipboard.copyString(row.bridgeLine);
+ });
+ row.menu
+ .querySelector(".tor-bridges-options-remove-one-menu-item")
+ .addEventListener("click", () => {
+ const bridgeLine = row.bridgeLine;
+ const strings = TorSettings.bridges.bridge_strings;
+ const index = strings.indexOf(bridgeLine);
+ if (index === -1) {
+ return;
+ }
+ strings.splice(index, 1);
+
+ setTorSettings(() => {
+ TorSettings.bridges.bridge_strings = strings;
+ });
+ });
+ },
+
+ /**
+ * Force the row menu to close.
+ */
+ _forceCloseRowMenus() {
+ for (const row of this._rows) {
+ row.menu.hide(null, { force: true });
+ }
+ },
+
+ /**
+ * The known bridge source.
+ *
+ * Initially null to indicate that it is unset.
+ *
+ * @type {integer?}
+ */
+ _bridgeSource: null,
+ /**
+ * The bridge sources this is shown for.
+ *
+ * @type {string[]}
+ */
+ _supportedSources: [TorBridgeSource.BridgeDB, TorBridgeSource.UserProvided],
+
+ /**
+ * Update the grid to show the latest bridge strings.
+ *
+ * @param {boolean} [initializing=false] - Whether this is being called as
+ * part of initialization.
+ */
+ _updateRows(initializing = false) {
+ // Store whether we have focus within the grid, before removing or hiding
+ // DOM elements.
+ const focusWithin = this._focusWithin();
+
+ let lostAllBridges = false;
+ let newSource = false;
+ const bridgeSource = TorSettings.bridges.source;
+ if (bridgeSource !== this._bridgeSource) {
+ newSource = true;
+
+ this._bridgeSource = bridgeSource;
+
+ if (this._supportedSources.includes(bridgeSource)) {
+ this.activate();
+ } else {
+ if (this._active && bridgeSource === TorBridgeSource.Invalid) {
+ lostAllBridges = true;
+ }
+ this.deactivate();
+ }
+ }
+
+ const ordered = this._active
+ ? TorSettings.bridges.bridge_strings.map(bridgeLine => {
+ const row = this._rows.find(r => r.bridgeLine === bridgeLine);
+ if (row) {
+ return row;
+ }
+ return this._createRow(bridgeLine);
+ })
+ : [];
+
+ // Whether we should reset the grid's focus.
+ // We always reset when we have a new bridge source.
+ // We reset the focus if no current Cell has focus. I.e. when adding a row
+ // to an empty grid, we want the focus to move to the first item.
+ // We also reset the focus if the current Cell is in a row that will be
+ // removed (including if all rows are removed).
+ // NOTE: In principle, if a row is removed, we could move the focus to the
+ // next or previous row (in the same cell column). However, most likely if
+ // the grid has the user focus, they are removing a single row using its
+ // options button. In this case, returning the user to some other row's
+ // options button might be more disorienting since it would not be simple
+ // for them to know *which* bridge they have landed on.
+ // NOTE: We do not reset the focus in other cases because we do not want the
+ // user to loose their place in the grid unnecessarily.
+ let resetFocus =
+ newSource || !this._focusCell || !ordered.includes(this._focusCell.row);
+
+ // Remove rows no longer needed from the DOM.
+ let numRowsRemoved = 0;
+ let rowAddedOrMoved = false;
+
+ for (const row of this._rows) {
+ if (!ordered.includes(row)) {
+ numRowsRemoved++;
+ // If the row menu was open, it will also be deleted.
+ // NOTE: Since the row menu is part of the row, focusWithin will be true
+ // if the menu had focus, so focus should be re-assigned.
+ row.element.remove();
+ }
+ }
+
+ // Go through all the rows to set their ".index" property and to ensure they
+ // are in the correct position in the DOM.
+ // NOTE: We could use replaceChildren to get the correct DOM structure, but
+ // we want to avoid rebuilding the entire tree when a single row is added or
+ // removed.
+ for (const [index, row] of ordered.entries()) {
+ row.index = index;
+ const element = row.element;
+ // Get the expected previous element, that should already be in the DOM
+ // from the previous loop.
+ const prevEl = index ? ordered[index - 1].element : null;
+
+ if (
+ element.parentElement === this._grid &&
+ prevEl === element.previousElementSibling
+ ) {
+ // Already in the correct position in the DOM.
+ continue;
+ }
+
+ rowAddedOrMoved = true;
+ // NOTE: Any elements already in the DOM, but not in the correct position
+ // will be removed and re-added by the below command.
+ // NOTE: if the row has document focus, then it should remain there.
+ if (prevEl) {
+ prevEl.after(element);
+ } else {
+ this._grid.prepend(element);
+ }
+ }
+ this._rows = ordered;
+
+ // Restore any lost focus.
+ if (resetFocus) {
+ // If we are not active (and therefore hidden), we will not try and move
+ // focus (activeElement), but may still change the *focusable* element for
+ // when we are shown again.
+ this._resetFocus(this._active && focusWithin);
+ }
+ if (!this._active && focusWithin) {
+ // Move focus out of this element, which has been hidden.
+ gBridgeSettings.takeFocus();
+ }
+
+ // Notify the user if there was some change to the DOM.
+ // If we are initializing, we generate no notification since there has been
+ // no change in the setting.
+ if (!initializing) {
+ let notificationType;
+ if (lostAllBridges) {
+ // Just lost all bridges, and became de-active.
+ notificationType = "removed-all";
+ } else if (this._rows.length) {
+ // Otherwise, only generate a notification if we are still active, with
+ // at least one bridge.
+ // I.e. do not generate a message if the new source is "builtin".
+ if (newSource) {
+ // A change in source.
+ notificationType = "changed";
+ } else if (numRowsRemoved === 1 && !rowAddedOrMoved) {
+ // Only one bridge was removed. This is most likely in response to them
+ // manually removing a single bridge or using the bridge row's options
+ // menu.
+ notificationType = "removed-one";
+ } else if (numRowsRemoved || rowAddedOrMoved) {
+ // Some other change. This is most likely in response to a manual edit
+ // of the existing bridges.
+ notificationType = "changed";
+ }
+ // Else, there was no change.
+ }
+
+ if (notificationType) {
+ gBridgesNotification.post(notificationType);
+ }
+ }
+ },
+};
+
+/**
+ * Controls the built-in bridges area.
+ */
+const gBuiltinBridgesArea = {
+ /**
+ * The display area.
+ *
+ * @type {Element?}
+ */
+ _area: null,
+ /**
+ * The type name element.
+ *
+ * @type {Element?}
+ */
+ _nameEl: null,
+ /**
+ * The bridge type description element.
+ *
+ * @type {Element?}
+ */
+ _descriptionEl: null,
+ /**
+ * The connection status.
+ *
+ * @type {Element?}
+ */
+ _connectionStatusEl: null,
+
+ /**
+ * Initialize the built-in bridges area.
+ */
+ init() {
+ this._area = document.getElementById("tor-bridges-built-in-display");
+ this._nameEl = document.getElementById("tor-bridges-built-in-type-name");
+ this._descriptionEl = document.getElementById(
+ "tor-bridges-built-in-description"
+ );
+ this._connectionStatusEl = document.getElementById(
+ "tor-bridges-built-in-connected"
+ );
+
+ Services.obs.addObserver(this, TorSettingsTopics.SettingsChanged);
+
+ // NOTE: Before initializedPromise completes, this area is hidden.
+ TorSettings.initializedPromise.then(() => {
+ this._updateBridgeType(true);
+ });
+ },
+
+ /**
+ * Uninitialize the built-in bridges area.
+ */
+ uninit() {
+ Services.obs.removeObserver(this, TorSettingsTopics.SettingsChanged);
+ this.deactivate();
+ },
+
+ /**
+ * Whether the built-in area is visible and responsive.
+ *
+ * @type {boolean}
+ */
+ _active: false,
+
+ /**
+ * Activate and show the built-in bridge area.
+ */
+ activate() {
+ if (this._active) {
+ return;
+ }
+ this._active = true;
+
+ Services.obs.addObserver(this, TorProviderTopics.BridgeChanged);
+
+ this._area.classList.add("built-in-active");
+
+ this._updateBridgeIds();
+ this._updateConnectedBridge();
+ },
+
+ /**
+ * Deactivate and hide built-in bridge area.
+ */
+ deactivate() {
+ if (!this._active) {
+ return;
+ }
+ this._active = false;
+
+ this._area.classList.remove("built-in-active");
+
+ Services.obs.removeObserver(this, TorProviderTopics.BridgeChanged);
+ },
+
+ observe(subject, topic, data) {
+ switch (topic) {
+ case TorSettingsTopics.SettingsChanged:
+ const { changes } = subject.wrappedJSObject;
+ if (
+ changes.includes("bridges.source") ||
+ changes.includes("bridges.builtin_type")
+ ) {
+ this._updateBridgeType();
+ }
+ if (changes.includes("bridges.bridge_strings")) {
+ this._updateBridgeIds();
+ }
+ break;
+ case TorProviderTopics.BridgeChanged:
+ this._updateConnectedBridge();
+ break;
+ }
+ },
+
+ /**
+ * Updates the shown connected state.
+ */
+ _updateConnectedState() {
+ this._connectionStatusEl.classList.toggle(
+ "bridge-status-connected",
+ this._bridgeType &&
+ this._connectedBridgeId &&
+ this._bridgeIds.includes(this._connectedBridgeId)
+ );
+ },
+
+ /**
+ * The currently shown bridge type. Empty if deactivated, and null if
+ * uninitialized.
+ *
+ * @type {string?}
+ */
+ _bridgeType: null,
+ /**
+ * The strings for each known bridge type.
+ *
+ * @type {Object<string,object>}
+ */
+ _bridgeTypeStrings: {
+ // TODO: Change to Fluent ids.
+ obfs4: {
+ name: TorStrings.settings.builtinBridgeObfs4Title,
+ description: TorStrings.settings.builtinBridgeObfs4Description2,
+ },
+ snowflake: {
+ name: TorStrings.settings.builtinBridgeSnowflake,
+ description: TorStrings.settings.builtinBridgeSnowflakeDescription2,
+ },
+ "meek-azure": {
+ name: TorStrings.settings.builtinBridgeMeekAzure,
+ description: TorStrings.settings.builtinBridgeMeekAzureDescription2,
+ },
+ },
+
+ /**
+ * The known bridge source.
+ *
+ * Initially null to indicate that it is unset.
+ *
+ * @type {integer?}
+ */
+ _bridgeSource: null,
+
+ /**
+ * Update the shown bridge type.
+ *
+ * @param {boolean} [initializing=false] - Whether this is being called as
+ * part of initialization.
+ */
+ async _updateBridgeType(initializing = false) {
+ let lostAllBridges = false;
+ let newSource = false;
+ const bridgeSource = TorSettings.bridges.source;
+ if (bridgeSource !== this._bridgeSource) {
+ newSource = true;
+
+ this._bridgeSource = bridgeSource;
+
+ if (bridgeSource === TorBridgeSource.BuiltIn) {
+ this.activate();
+ } else {
+ if (this._active && bridgeSource === TorBridgeSource.Invalid) {
+ lostAllBridges = true;
+ }
+ const hadFocus = this._area.contains(document.activeElement);
+ this.deactivate();
+ if (hadFocus) {
+ gBridgeSettings.takeFocus();
+ }
+ }
+ }
+
+ const bridgeType = this._active ? TorSettings.bridges.builtin_type : "";
+
+ let newType = false;
+ if (bridgeType !== this._bridgeType) {
+ newType = true;
+
+ this._bridgeType = bridgeType;
+
+ const bridgeStrings = this._bridgeTypeStrings[bridgeType];
+ if (bridgeStrings) {
+ /*
+ document.l10n.setAttributes(this._nameEl, bridgeStrings.name);
+ document.l10n.setAttributes(
+ this._descriptionEl,
+ bridgeStrings.description
+ );
+ */
+ this._nameEl.textContent = bridgeStrings.name;
+ this._descriptionEl.textContent = bridgeStrings.description;
+ } else {
+ // Unknown type, or no type.
+ this._nameEl.removeAttribute("data-l10n-id");
+ this._nameEl.textContent = bridgeType;
+ this._descriptionEl.removeAttribute("data-l10n-id");
+ this._descriptionEl.textContent = "";
+ }
+
+ this._updateConnectedState();
+ }
+
+ // Notify the user if there was some change to the type.
+ // If we are initializing, we generate no notification since there has been
+ // no change in the setting.
+ if (!initializing) {
+ let notificationType;
+ if (lostAllBridges) {
+ // Just lost all bridges, and became de-active.
+ notificationType = "removed-all";
+ } else if (this._active && (newSource || newType)) {
+ // Otherwise, only generate a notification if we are still active, with
+ // a bridge type.
+ // I.e. do not generate a message if the new source is not "builtin".
+ notificationType = "changed";
+ }
+
+ if (notificationType) {
+ gBridgesNotification.post(notificationType);
+ }
+ }
+ },
+
+ /**
+ * The bridge IDs/fingerprints for the built-in bridges.
+ *
+ * @type {Array<string>}
+ */
+ _bridgeIds: [],
+ /**
+ * Update _bridgeIds
+ */
+ _updateBridgeIds() {
+ this._bridgeIds = [];
+ for (const bridgeLine of TorSettings.bridges.bridge_strings) {
+ try {
+ this._bridgeIds.push(TorParsers.parseBridgeLine(bridgeLine).id);
+ } catch (e) {
+ console.error(`Detected invalid bridge line: ${bridgeLine}`, e);
+ }
+ }
+
+ this._updateConnectedState();
+ },
+
+ /**
+ * The bridge ID/fingerprint of the most recently used bridge (appearing in
+ * the latest Tor circuit). Roughly corresponds to the bridge we are currently
+ * connected to.
+ *
+ * @type {string?}
+ */
+ _connectedBridgeId: null,
+ /**
+ * Update _connectedBridgeId.
+ */
+ async _updateConnectedBridge() {
+ this._connectedBridgeId = await getConnectedBridgeId();
+ this._updateConnectedState();
+ },
+};
+
+/**
+ * Controls the bridge settings.
+ */
+const gBridgeSettings = {
+ /**
+ * The preferences <groupbox> for bridges
+ *
+ * @type {Element?}
+ */
+ _groupEl: null,
+ /**
+ * The button for controlling whether bridges are enabled.
+ *
+ * @type {Element?}
+ */
+ _toggleButton: null,
+ /**
+ * The area for showing current bridges.
+ *
+ * @type {Element?}
+ */
+ _bridgesEl: null,
+ /**
+ * The heading for the bridge settings.
+ *
+ * @type {Element?}
+ */
+ _bridgesSettingsHeading: null,
+ /**
+ * The current bridges heading, at the start of the area.
+ *
+ * @type {Element?}
+ */
+ _currentBridgesHeading: null,
+ /**
+ * The area for showing no bridges.
+ *
+ * @type {Element?}
+ */
+ _noBridgesEl: null,
+
+ /**
+ * Initialize the bridge settings.
+ */
+ init() {
+ gBridgesNotification.init();
+
+ this._bridgesSettingsHeading = document.getElementById(
+ "torPreferences-bridges-header"
+ );
+ this._currentBridgesHeading = document.getElementById(
+ "tor-bridges-current-heading"
+ );
+ this._bridgesEl = document.getElementById("tor-bridges-current");
+ this._noBridgesEl = document.getElementById("tor-bridges-none");
+ this._groupEl = document.getElementById("torPreferences-bridges-group");
+ this._toggleButton = document.getElementById("tor-bridges-enabled-toggle");
+ // Initially disabled whilst TorSettings may not be initialized.
+ this._toggleButton.disabled = true;
+
+ this._toggleButton.addEventListener("toggle", () => {
+ if (!this._haveBridges) {
+ return;
+ }
+ setTorSettings(() => {
+ TorSettings.bridges.enabled = this._toggleButton.pressed;
+ });
+ });
+
+ Services.obs.addObserver(this, TorSettingsTopics.SettingsChanged);
+
+ gBridgeGrid.init();
+ gBuiltinBridgesArea.init();
+
+ this._initBridgesMenu();
+ this._initShareArea();
+
+ // NOTE: Before initializedPromise completes, the current bridges sections
+ // should be hidden.
+ // And gBridgeGrid and gBuiltinBridgesArea are not active.
+ TorSettings.initializedPromise.then(() => {
+ this._updateEnabled();
+ this._updateBridgeStrings();
+ this._updateSource();
+ });
+ },
+
+ /**
+ * Un-initialize the bridge settings.
+ */
+ uninit() {
+ gBridgeGrid.uninit();
+ gBuiltinBridgesArea.uninit();
+
+ Services.obs.removeObserver(this, TorSettingsTopics.SettingsChanged);
+ },
+
+ observe(subject, topic, data) {
+ switch (topic) {
+ case TorSettingsTopics.SettingsChanged:
+ const { changes } = subject.wrappedJSObject;
+ if (changes.includes("bridges.enabled")) {
+ this._updateEnabled();
+ }
+ if (changes.includes("bridges.source")) {
+ this._updateSource();
+ }
+ if (changes.includes("bridges.bridge_strings")) {
+ this._updateBridgeStrings();
+ }
+ break;
+ }
+ },
+
+ /**
+ * Update whether the bridges should be shown as enabled.
+ */
+ _updateEnabled() {
+ // Changing the pressed property on moz-toggle should not trigger its
+ // "toggle" event.
+ this._toggleButton.pressed = TorSettings.bridges.enabled;
+ },
+
+ /**
+ * The shown bridge source.
+ *
+ * Initially null to indicate that it is unset for the first call to
+ * _updateSource.
+ *
+ * @type {integer?}
+ */
+ _bridgeSource: null,
+
+ /**
+ * Update _bridgeSource.
+ */
+ _updateSource() {
+ // NOTE: This should only ever be called after TorSettings is already
+ // initialized.
+ const bridgeSource = TorSettings.bridges.source;
+ if (bridgeSource === this._bridgeSource) {
+ // Avoid re-activating an area if the source has not changed.
+ return;
+ }
+
+ this._bridgeSource = bridgeSource;
+
+ // Before hiding elements, we determine whether our region contained the
+ // user focus.
+ const hadFocus =
+ this._bridgesEl.contains(document.activeElement) ||
+ this._noBridgesEl.contains(document.activeElement);
+
+ this._bridgesEl.classList.toggle(
+ "source-built-in",
+ bridgeSource === TorBridgeSource.BuiltIn
+ );
+ this._bridgesEl.classList.toggle(
+ "source-user",
+ bridgeSource === TorBridgeSource.UserProvided
+ );
+ this._bridgesEl.classList.toggle(
+ "source-requested",
+ bridgeSource === TorBridgeSource.BridgeDB
+ );
+
+ // Force the menu to close whenever the source changes.
+ // NOTE: If the menu had focus then hadFocus will be true, and focus will be
+ // re-assigned.
+ this._forceCloseBridgesMenu();
+
+ // Update whether we have bridges.
+ this._updateHaveBridges();
+
+ if (hadFocus) {
+ // Always reset the focus to the start of the area whenever the source
+ // changes.
+ // NOTE: gBuiltinBridges._updateBridgeType and gBridgeGrid._updateRows
+ // may have already called takeFocus in response to them being
+ // de-activated. The re-call should be safe.
+ this.takeFocus();
+ }
+ },
+
+ /**
+ * Whether we have bridges or not, or null if it is unknown.
+ *
+ * @type {boolean?}
+ */
+ _haveBridges: null,
+
+ /**
+ * Update the _haveBridges value.
+ */
+ _updateHaveBridges() {
+ // NOTE: We use the TorSettings.bridges.source value, rather than
+ // this._bridgeSource because _updateHaveBridges can be called just before
+ // _updateSource (via takeFocus).
+ const haveBridges = TorSettings.bridges.source !== TorBridgeSource.Invalid;
+
+ if (haveBridges === this._haveBridges) {
+ return;
+ }
+
+ this._haveBridges = haveBridges;
+
+ this._toggleButton.disabled = !haveBridges;
+ // Add classes to show or hide the "no bridges" and "Your bridges" sections.
+ // NOTE: Before haveBridges is set, neither class is added, so both sections
+ // and hidden.
+ this._groupEl.classList.toggle("no-bridges", !haveBridges);
+ this._groupEl.classList.toggle("have-bridges", haveBridges);
+ },
+
+ /**
+ * Force the focus to move to the bridge area.
+ */
+ takeFocus() {
+ if (this._haveBridges === null) {
+ // The bridges area has not been initialized yet, which means that
+ // TorSettings may not be initialized.
+ // Unexpected to receive a call before then, so just return early.
+ return;
+ }
+
+ // Make sure we have the latest value for _haveBridges.
+ // We also ensure that the _currentBridgesHeading element is visible before
+ // we focus it.
+ this._updateHaveBridges();
+ if (this._haveBridges) {
+ // Move focus to the start of the area, which is the heading.
+ // It has tabindex="-1" so should be focusable, even though it is not part
+ // of the usual tab navigation.
+ this._currentBridgesHeading.focus();
+ } else {
+ // Move focus to the top of the bridge settings.
+ this._bridgesSettingsHeading.focus();
+ }
+ },
+
+ /**
+ * The bridge strings in a copy-able form.
+ *
+ * @type {string}
+ */
+ _bridgeStrings: "",
+ /**
+ * Whether the bridge strings should be shown as a QR code.
+ *
+ * @type {boolean}
+ */
+ _canQRBridges: false,
+
+ /**
+ * Update the stored bridge strings.
+ */
+ _updateBridgeStrings() {
+ const bridges = TorSettings.bridges.bridge_strings;
+
+ this._bridgeStrings = bridges.join("\n");
+ // TODO: Determine what logic we want.
+ this._canQRBridges = bridges.length <= 3;
+
+ this._qrButton.disabled = !this._canQRBridges;
+ },
+
+ /**
+ * Copy all the bridge addresses to the clipboard.
+ */
+ _copyBridges() {
+ const clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(
+ Ci.nsIClipboardHelper
+ );
+ clipboard.copyString(this._bridgeStrings);
+ },
+
+ /**
+ * Open the QR code dialog encoding all the bridge addresses.
+ */
+ _openQR() {
+ if (!this._canQRBridges) {
+ return;
+ }
+ const dialog = new BridgeQrDialog();
+ dialog.openDialog(gSubDialog, this._bridgeStrings);
+ },
+
+ /**
+ * The QR button for copying all QR codes.
+ *
+ * @type {Element?}
+ */
+ _qrButton: null,
+
+ _initShareArea() {
+ document
+ .getElementById("tor-bridges-copy-addresses-button")
+ .addEventListener("click", () => {
+ this._copyBridges();
+ });
+
+ this._qrButton = document.getElementById("tor-bridges-qr-addresses-button");
+ this._qrButton.addEventListener("click", () => {
+ this._openQR();
+ });
+ },
+
+ /**
+ * The menu for all bridges.
+ *
+ * @type {Element?}
+ */
+ _bridgesMenu: null,
+
+ /**
+ * Initialize the menu for all bridges.
+ */
+ _initBridgesMenu() {
+ this._bridgesMenu = document.getElementById("tor-bridges-all-options-menu");
+
+ // NOTE: We generally assume that once the bridge menu is opened the
+ // this._bridgeStrings value will not change.
+ const qrItem = document.getElementById(
+ "tor-bridges-options-qr-all-menu-item"
+ );
+ qrItem.addEventListener("click", () => {
+ this._openQR();
+ });
+
+ const copyItem = document.getElementById(
+ "tor-bridges-options-copy-all-menu-item"
+ );
+ copyItem.addEventListener("click", () => {
+ this._copyBridges();
+ });
+
+ const editItem = document.getElementById(
+ "tor-bridges-options-edit-all-menu-item"
+ );
+ editItem.addEventListener("click", () => {
+ // TODO: move to gBridgeSettings.
+ // TODO: Change dialog title. Do not allow Lox invite.
+ gConnectionPane.onAddBridgeManually();
+ });
+
+ // TODO: Do we want a different item for built-in bridges, rather than
+ // "Remove all bridges"?
+ document
+ .getElementById("tor-bridges-options-remove-all-menu-item")
+ .addEventListener("click", () => {
+ // TODO: Should we only have a warning when not built-in?
+ const parentWindow =
+ Services.wm.getMostRecentWindow("navigator:browser");
+ const flags =
+ Services.prompt.BUTTON_POS_0 *
+ Services.prompt.BUTTON_TITLE_IS_STRING +
+ Services.prompt.BUTTON_POS_0_DEFAULT +
+ Services.prompt.BUTTON_POS_1 * Services.prompt.BUTTON_TITLE_CANCEL;
+
+ // TODO: Update the text, and remove old strings.
+ const buttonIndex = Services.prompt.confirmEx(
+ parentWindow,
+ TorStrings.settings.bridgeRemoveAllDialogTitle,
+ TorStrings.settings.bridgeRemoveAllDialogDescription,
+ flags,
+ TorStrings.settings.remove,
+ null,
+ null,
+ null,
+ {}
+ );
+
+ if (buttonIndex !== 0) {
+ return;
+ }
+
+ setTorSettings(() => {
+ // This should always have the side effect of disabling bridges as
+ // well.
+ TorSettings.bridges.bridge_strings = [];
+ });
+ });
+
+ this._bridgesMenu.addEventListener("showing", () => {
+ const canCopy = this._bridgeSource !== TorBridgeSource.BuiltIn;
+ qrItem.hidden = !this._canQRBridges || !canCopy;
+ copyItem.hidden = !canCopy;
+ editItem.hidden = this._bridgeSource !== TorBridgeSource.UserProvided;
+ });
+
+ const bridgesMenuButton = document.getElementById(
+ "tor-bridges-all-options-button"
+ );
+ bridgesMenuButton.addEventListener("click", event => {
+ this._bridgesMenu.toggle(event, bridgesMenuButton);
+ });
+
+ this._bridgesMenu.addEventListener("hidden", () => {
+ // Make sure the button receives focus again when the menu is hidden.
+ // Currently, panel-list.js only does this when the menu is opened with a
+ // keyboard, but this causes focus to be lost from the page if the user
+ // uses a mixture of keyboard and mouse.
+ bridgesMenuButton.focus();
+ });
+ },
+
+ /**
+ * Force the bridges menu to close.
+ */
+ _forceCloseBridgesMenu() {
+ this._bridgesMenu.hide(null, { force: true });
+ },
+};
+
/*
Connection Pane
@@ -96,29 +1732,6 @@ const gConnectionPane = (function () {
location: "#torPreferences-bridges-location",
locationEntries: "#torPreferences-bridges-locationEntries",
chooseForMe: "#torPreferences-bridges-buttonChooseBridgeForMe",
- currentHeader: "#torPreferences-currentBridges-header",
- currentDescription: "#torPreferences-currentBridges-description",
- currentDescriptionText: "#torPreferences-currentBridges-descriptionText",
- controls: "#torPreferences-currentBridges-controls",
- switch: "#torPreferences-currentBridges-switch",
- cards: "#torPreferences-currentBridges-cards",
- cardTemplate: "#torPreferences-bridgeCard-template",
- card: ".torPreferences-bridgeCard",
- cardId: ".torPreferences-bridgeCard-id",
- cardHeadingManualLink: ".torPreferences-bridgeCard-manualLink",
- cardHeadingAddr: ".torPreferences-bridgeCard-headingAddr",
- cardConnectedLabel: ".torPreferences-current-bridge-label",
- cardOptions: ".torPreferences-bridgeCard-options",
- cardMenu: "#torPreferences-bridgeCard-menu",
- cardQrGrid: ".torPreferences-bridgeCard-grid",
- cardQrContainer: ".torPreferences-bridgeCard-qr",
- cardQr: ".torPreferences-bridgeCard-qrCode",
- cardShare: ".torPreferences-bridgeCard-share",
- cardAddr: ".torPreferences-bridgeCard-addr",
- cardLearnMore: ".torPreferences-bridgeCard-learnMore",
- cardCopy: ".torPreferences-bridgeCard-copyButton",
- showAll: "#torPreferences-currentBridges-showAll",
- removeAll: "#torPreferences-currentBridges-removeAll",
addHeader: "#torPreferences-addBridge-header",
addBuiltinLabel: "#torPreferences-addBridge-labelBuiltinBridge",
addBuiltinButton: "#torPreferences-addBridge-buttonBuiltinBridge",
@@ -142,8 +1755,6 @@ const gConnectionPane = (function () {
_internetStatus: InternetStatus.Unknown,
- _currentBridgeId: null,
-
// populate xul with strings and cache the relevant elements
_populateXUL() {
// saves tor settings to disk when navigate away from about:preferences
@@ -387,390 +1998,6 @@ const gConnectionPane = (function () {
this._showAutoconfiguration();
}
- // Bridge cards
- const bridgeHeader = prefpane.querySelector(
- selectors.bridges.currentHeader
- );
- bridgeHeader.textContent = TorStrings.settings.bridgeCurrent;
- const bridgeControls = prefpane.querySelector(selectors.bridges.controls);
- const bridgeSwitch = prefpane.querySelector(selectors.bridges.switch);
- bridgeSwitch.setAttribute("label", TorStrings.settings.allBridgesEnabled);
- bridgeSwitch.addEventListener("toggle", () => {
- TorSettings.bridges.enabled = bridgeSwitch.pressed;
- TorSettings.saveToPrefs();
- TorSettings.applySettings().finally(() => {
- this._populateBridgeCards();
- });
- });
- const bridgeDescription = prefpane.querySelector(
- selectors.bridges.currentDescription
- );
- bridgeDescription.querySelector(
- selectors.bridges.currentDescriptionText
- ).textContent = TorStrings.settings.bridgeCurrentDescription;
- const bridgeTemplate = prefpane.querySelector(
- selectors.bridges.cardTemplate
- );
- {
- const learnMore = bridgeTemplate.querySelector(
- selectors.bridges.cardLearnMore
- );
- learnMore.setAttribute("value", TorStrings.settings.learnMore);
- learnMore.setAttribute(
- "href",
- TorStrings.settings.learnMoreBridgesCardURL
- );
- if (TorStrings.settings.learnMoreBridgesCardURL.startsWith("about:")) {
- learnMore.setAttribute("useoriginprincipal", "true");
- }
- }
- {
- const manualLink = bridgeTemplate.querySelector(
- selectors.bridges.cardHeadingManualLink
- );
- manualLink.setAttribute("value", TorStrings.settings.whatAreThese);
- manualLink.setAttribute(
- "href",
- TorStrings.settings.learnMoreBridgesCardURL
- );
- if (TorStrings.settings.learnMoreBridgesCardURL.startsWith("about:")) {
- manualLink.setAttribute("useoriginprincipal", "true");
- }
- }
- bridgeTemplate.querySelector(
- selectors.bridges.cardConnectedLabel
- ).textContent = TorStrings.settings.connectedBridge;
- bridgeTemplate
- .querySelector(selectors.bridges.cardCopy)
- .setAttribute("label", TorStrings.settings.bridgeCopy);
- bridgeTemplate.querySelector(selectors.bridges.cardShare).textContent =
- TorStrings.settings.bridgeShare;
- const bridgeCards = prefpane.querySelector(selectors.bridges.cards);
- const bridgeMenu = prefpane.querySelector(selectors.bridges.cardMenu);
-
- this._addBridgeCard = bridgeString => {
- const card = bridgeTemplate.cloneNode(true);
- card.removeAttribute("id");
- const grid = card.querySelector(selectors.bridges.cardQrGrid);
- card.addEventListener("click", e => {
- if (
- card.classList.contains("currently-connected") ||
- bridgeCards.classList.contains("single-card")
- ) {
- return;
- }
- let target = e.target;
- let apply = true;
- while (target !== null && target !== card && apply) {
- // Deal with mixture of "command" and "click" events
- apply = !target.classList?.contains("stop-click");
- target = target.parentElement;
- }
- if (apply) {
- if (card.classList.toggle("expanded")) {
- grid.classList.add("to-animate");
- grid.style.height = `${grid.scrollHeight}px`;
- } else {
- // Be sure we still have the to-animate class
- grid.classList.add("to-animate");
- grid.style.height = "";
- }
- }
- });
- const emojis = makeBridgeId(bridgeString).map(emojiIndex => {
- const img = document.createElement("img");
- img.classList.add("emoji");
- // Image is set in _updateBridgeEmojis.
- img.dataset.emojiIndex = emojiIndex;
- return img;
- });
- const idString = TorStrings.settings.bridgeId;
- const id = card.querySelector(selectors.bridges.cardId);
- let details;
- try {
- details = TorParsers.parseBridgeLine(bridgeString);
- } catch (e) {
- console.error(`Detected invalid bridge line: ${bridgeString}`, e);
- }
- if (details && details.id !== undefined) {
- card.setAttribute("data-bridge-id", details.id);
- }
- // TODO: properly handle "vanilla" bridges?
- const type =
- details && details.transport !== undefined
- ? details.transport
- : "vanilla";
- for (const piece of idString.split(/(%[12]\$S)/)) {
- if (piece == "%1$S") {
- id.append(type);
- } else if (piece == "%2$S") {
- id.append(...emojis);
- } else {
- id.append(piece);
- }
- }
- card.querySelector(selectors.bridges.cardHeadingAddr).textContent =
- bridgeString;
- const optionsButton = card.querySelector(selectors.bridges.cardOptions);
- if (TorSettings.bridges.source === TorBridgeSource.BuiltIn) {
- optionsButton.setAttribute("hidden", "true");
- } else {
- // Cloning the menupopup element does not work as expected.
- // Therefore, we use only one, and just before opening it, we remove
- // its previous items, and add the ones relative to the bridge whose
- // button has been pressed.
- optionsButton.addEventListener("click", () => {
- const menuItem = document.createXULElement("menuitem");
- menuItem.setAttribute("label", TorStrings.settings.remove);
- menuItem.classList.add("menuitem-iconic");
- menuItem.image = "chrome://global/skin/icons/delete.svg";
- menuItem.addEventListener("command", e => {
- const strings = TorSettings.bridges.bridge_strings;
- const index = strings.indexOf(bridgeString);
- if (index !== -1) {
- strings.splice(index, 1);
- }
- TorSettings.bridges.enabled =
- bridgeSwitch.pressed && !!strings.length;
- TorSettings.bridges.bridge_strings = strings.join("\n");
- TorSettings.saveToPrefs();
- TorSettings.applySettings().finally(() => {
- this._populateBridgeCards();
- });
- });
- if (bridgeMenu.firstChild) {
- bridgeMenu.firstChild.remove();
- }
- bridgeMenu.append(menuItem);
- bridgeMenu.openPopup(optionsButton, {
- position: "bottomleft topleft",
- });
- });
- }
- const bridgeAddr = card.querySelector(selectors.bridges.cardAddr);
- bridgeAddr.setAttribute("value", bridgeString);
- const bridgeCopy = card.querySelector(selectors.bridges.cardCopy);
- let restoreTimeout = null;
- bridgeCopy.addEventListener("command", e => {
- this.onCopyBridgeAddress(bridgeAddr);
- const label = bridgeCopy.querySelector("label");
- label.setAttribute("value", TorStrings.settings.copied);
- bridgeCopy.classList.add("primary");
-
- const RESTORE_TIME = 1200;
- if (restoreTimeout !== null) {
- clearTimeout(restoreTimeout);
- }
- restoreTimeout = setTimeout(() => {
- label.setAttribute("value", TorStrings.settings.bridgeCopy);
- bridgeCopy.classList.remove("primary");
- restoreTimeout = null;
- }, RESTORE_TIME);
- });
- if (details?.id && details.id === this._currentBridgeId) {
- card.classList.add("currently-connected");
- bridgeCards.prepend(card);
- } else {
- bridgeCards.append(card);
- }
- // Add the QR only after appending the card, to have the computed style
- try {
- const container = card.querySelector(selectors.bridges.cardQr);
- const style = getComputedStyle(container);
- const width = style.width.substring(0, style.width.length - 2);
- const height = style.height.substring(0, style.height.length - 2);
- new QRCode(container, {
- text: bridgeString,
- width,
- height,
- colorDark: style.color,
- colorLight: style.backgroundColor,
- document,
- });
- container.parentElement.addEventListener("click", () => {
- this.onShowQr(bridgeString);
- });
- } catch (err) {
- // TODO: Add a generic image in case of errors such as code overflow.
- // It should never happen with correct codes, but after all this
- // content can be generated by users...
- console.error("Could not generate the QR code for the bridge:", err);
- }
- };
- this._checkBridgeCardsHeight = () => {
- for (const card of bridgeCards.children) {
- // Expanded cards have the height set manually to their details for
- // the CSS animation. However, when resizing the window, we may need
- // to adjust their height.
- if (
- card.classList.contains("expanded") ||
- card.classList.contains("currently-connected")
- ) {
- const grid = card.querySelector(selectors.bridges.cardQrGrid);
- // Reset it first, to avoid having a height that is higher than
- // strictly needed. Also, remove the to-animate class, because the
- // animation interferes with this process!
- grid.classList.remove("to-animate");
- grid.style.height = "";
- grid.style.height = `${grid.scrollHeight}px`;
- }
- }
- };
- this._currentBridgesExpanded = false;
- const showAll = prefpane.querySelector(selectors.bridges.showAll);
- showAll.setAttribute("label", TorStrings.settings.bridgeShowAll);
- showAll.addEventListener("command", () => {
- this._currentBridgesExpanded = !this._currentBridgesExpanded;
- this._populateBridgeCards();
- if (!this._currentBridgesExpanded) {
- bridgeSwitch.scrollIntoView({ behavior: "smooth" });
- }
- });
- const removeAll = prefpane.querySelector(selectors.bridges.removeAll);
- removeAll.setAttribute("label", TorStrings.settings.bridgeRemoveAll);
- removeAll.addEventListener("command", () => {
- this._confirmBridgeRemoval();
- });
- this._populateBridgeCards = () => {
- const collapseThreshold = 4;
-
- const newStrings = new Set(TorSettings.bridges.bridge_strings);
- const numBridges = newStrings.size;
- const noBridges = !numBridges;
- bridgeHeader.hidden = noBridges;
- bridgeDescription.hidden = noBridges;
- bridgeControls.hidden = noBridges;
- bridgeCards.hidden = noBridges;
- if (noBridges) {
- showAll.hidden = true;
- removeAll.hidden = true;
- bridgeCards.textContent = "";
- return;
- }
- // Changing the pressed property on moz-toggle should not trigger its
- // "toggle" event.
- bridgeSwitch.pressed = TorSettings.bridges.enabled;
- bridgeCards.classList.toggle("disabled", !TorSettings.bridges.enabled);
- bridgeCards.classList.toggle("single-card", numBridges === 1);
-
- let shownCards = 0;
- const toShow = this._currentBridgesExpanded
- ? numBridges
- : collapseThreshold;
-
- // Do not remove all the old cards, because it makes scrollbar "jump"
- const currentCards = bridgeCards.querySelectorAll(
- selectors.bridges.card
- );
- for (const card of currentCards) {
- const string = card.querySelector(selectors.bridges.cardAddr).value;
- const hadString = newStrings.delete(string);
- if (!hadString || shownCards == toShow) {
- card.remove();
- } else {
- shownCards++;
- }
- }
-
- // Add only the new strings that remained in the set
- for (const bridge of newStrings) {
- if (shownCards >= toShow) {
- if (!this._currentBridgeId) {
- break;
- } else if (!bridge.includes(this._currentBridgeId)) {
- continue;
- }
- }
- this._addBridgeCard(bridge);
- shownCards++;
- }
-
- // If we know the connected bridge, we may have added more than the ones
- // we should actually show (but the connected ones have been prepended,
- // if needed). So, remove any exceeding ones.
- while (shownCards > toShow) {
- bridgeCards.lastElementChild.remove();
- shownCards--;
- }
-
- // Newly added emojis.
- this._updateBridgeEmojis();
-
- // And finally update the buttons
- removeAll.hidden = false;
- showAll.classList.toggle("primary", TorSettings.bridges.enabled);
- if (numBridges > collapseThreshold) {
- showAll.hidden = false;
- showAll.setAttribute(
- "aria-expanded",
- // Boolean value gets converted to string "true" or "false".
- this._currentBridgesExpanded
- );
- showAll.setAttribute(
- "label",
- this._currentBridgesExpanded
- ? TorStrings.settings.bridgeShowFewer
- : TorStrings.settings.bridgeShowAll
- );
- // We do not want both collapsed and disabled at the same time,
- // because we use collapsed only to display a gradient on the list.
- bridgeCards.classList.toggle(
- "list-collapsed",
- !this._currentBridgesExpanded && TorSettings.bridges.enabled
- );
- } else {
- // NOTE: We do not expect the showAll button to have focus when we
- // hide it since we do not expect `numBridges` to decrease whilst
- // this button is focused.
- showAll.hidden = true;
- bridgeCards.classList.remove("list-collapsed");
- }
- };
- this._populateBridgeCards();
- this._updateConnectedBridges = () => {
- for (const card of bridgeCards.querySelectorAll(
- ".currently-connected"
- )) {
- card.classList.remove("currently-connected");
- card.querySelector(selectors.bridges.cardQrGrid).style.height = "";
- }
- if (!this._currentBridgeId) {
- return;
- }
- // Make sure we have the connected bridge in the list
- this._populateBridgeCards();
- // At the moment, IDs do not have to be unique (and it is a concrete
- // case also with built-in bridges!). E.g., one line for the IPv4
- // address and one for the IPv6 address, so use querySelectorAll
- const cards = bridgeCards.querySelectorAll(
- `[data-bridge-id="${this._currentBridgeId}"]`
- );
- for (const card of cards) {
- card.classList.add("currently-connected");
- }
- const placeholder = document.createElement("span");
- bridgeCards.prepend(placeholder);
- placeholder.replaceWith(...cards);
- this._checkBridgeCardsHeight();
- };
- this._checkConnectedBridge = async () => {
- // TODO: We could make sure TorSettings is in sync by monitoring also
- // changes of settings. At that point, we could query it, instead of
- // doing a query over the control port.
- let bridge = null;
- try {
- const provider = await TorProviderBuilder.build();
- bridge = provider.currentBridge;
- } catch (e) {
- console.warn("Could not get current bridge", e);
- }
- if (bridge?.fingerprint !== this._currentBridgeId) {
- this._currentBridgeId = bridge?.fingerprint ?? null;
- this._updateConnectedBridges();
- }
- };
- this._checkConnectedBridge();
-
// Add a new bridge
prefpane.querySelector(selectors.bridges.addHeader).textContent =
TorStrings.settings.bridgeAdd;
@@ -804,34 +2031,6 @@ const gConnectionPane = (function () {
});
}
- this._confirmBridgeRemoval = () => {
- const aParentWindow =
- Services.wm.getMostRecentWindow("navigator:browser");
-
- const ps = Services.prompt;
- const btnFlags =
- ps.BUTTON_POS_0 * ps.BUTTON_TITLE_IS_STRING +
- ps.BUTTON_POS_0_DEFAULT +
- ps.BUTTON_POS_1 * ps.BUTTON_TITLE_CANCEL;
-
- const notUsed = { value: false };
- const btnIndex = ps.confirmEx(
- aParentWindow,
- TorStrings.settings.bridgeRemoveAllDialogTitle,
- TorStrings.settings.bridgeRemoveAllDialogDescription,
- btnFlags,
- TorStrings.settings.remove,
- null,
- null,
- null,
- notUsed
- );
-
- if (btnIndex === 0) {
- this.onRemoveAllBridges();
- }
- };
-
// Advanced setup
prefpane.querySelector(selectors.advanced.header).innerText =
TorStrings.settings.advancedHeading;
@@ -862,11 +2061,11 @@ const gConnectionPane = (function () {
});
Services.obs.addObserver(this, TorConnectTopics.StateChange);
- Services.obs.addObserver(this, TorProviderTopics.BridgeChanged);
- Services.obs.addObserver(this, "intl:app-locales-changed");
},
init() {
+ gBridgeSettings.init();
+
TorSettings.initializedPromise.then(() => this._populateXUL());
const onUnload = () => {
@@ -874,21 +2073,14 @@ const gConnectionPane = (function () {
gConnectionPane.uninit();
};
window.addEventListener("unload", onUnload);
-
- window.addEventListener("resize", () => {
- this._checkBridgeCardsHeight();
- });
- window.addEventListener("hashchange", () => {
- this._checkBridgeCardsHeight();
- });
},
uninit() {
+ gBridgeSettings.uninit();
+
// unregister our observer topics
Services.obs.removeObserver(this, TorSettingsTopics.SettingsChanged);
Services.obs.removeObserver(this, TorConnectTopics.StateChange);
- Services.obs.removeObserver(this, TorProviderTopics.BridgeChanged);
- Services.obs.removeObserver(this, "intl:app-locales-changed");
},
// whether the page should be present in about:preferences
@@ -916,64 +2108,6 @@ const gConnectionPane = (function () {
this.onStateChange();
break;
}
- case TorProviderTopics.BridgeChanged: {
- this._checkConnectedBridge();
- break;
- }
- case "intl:app-locales-changed": {
- this._updateBridgeEmojis();
- break;
- }
- }
- },
-
- /**
- * Update the bridge emojis to show their corresponding emoji with an
- * annotation that matches the current locale.
- */
- async _updateBridgeEmojis() {
- if (!this._emojiPromise) {
- this._emojiPromise = Promise.all([
- fetch(
- "chrome://browser/content/torpreferences/bridgemoji/bridge-emojis.json"
- ).then(response => response.json()),
- fetch(
- "chrome://browser/content/torpreferences/bridgemoji/annotations.json"
- ).then(response => response.json()),
- ]);
- }
- const [emojiList, emojiAnnotations] = await this._emojiPromise;
- let langCode;
- // Find the first desired locale we have annotations for.
- // Add "en" as a fallback.
- for (const bcp47 of [...Services.locale.appLocalesAsBCP47, "en"]) {
- langCode = bcp47;
- if (langCode in emojiAnnotations) {
- break;
- }
- // Remove everything after the dash, if there is one.
- langCode = bcp47.replace(/-.*/, "");
- if (langCode in emojiAnnotations) {
- break;
- }
- }
- for (const img of document.querySelectorAll(".emoji[data-emoji-index]")) {
- const emoji = emojiList[img.dataset.emojiIndex];
- if (!emoji) {
- // Unexpected.
- console.error(`No emoji for index ${img.dataset.emojiIndex}`);
- img.removeAttribute("src");
- img.removeAttribute("alt");
- img.removeAttribute("title");
- continue;
- }
- const cp = emoji.codePointAt(0).toString(16);
- img.setAttribute(
- "src",
- `chrome://browser/content/torpreferences/bridgemoji/svgs/${cp}.svg`
- );
- img.setAttribute("alt", emoji);
- img.setAttribute("title", emojiAnnotations[langCode][cp]);
}
},
@@ -999,51 +2133,21 @@ const gConnectionPane = (function () {
onStateChange() {
this._populateStatus();
this._showAutoconfiguration();
- this._populateBridgeCards();
- },
-
- onShowQr(bridgeString) {
- const dialog = new BridgeQrDialog();
- dialog.openDialog(gSubDialog, bridgeString);
- },
-
- onCopyBridgeAddress(addressElem) {
- const clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(
- Ci.nsIClipboardHelper
- );
- clipboard.copyString(addressElem.value);
- },
-
- onRemoveAllBridges() {
- TorSettings.bridges.enabled = false;
- TorSettings.bridges.bridge_strings = "";
- if (TorSettings.bridges.source === TorBridgeSource.BuiltIn) {
- TorSettings.bridges.builtin_type = "";
- }
- TorSettings.saveToPrefs();
- TorSettings.applySettings().finally(() => {
- this._populateBridgeCards();
- });
},
/**
* Save and apply settings, then optionally open about:torconnect and start
* bootstrapping.
*
+ * @param {fucntion} changes - The changes to make.
* @param {boolean} connect - Whether to open about:torconnect and start
* bootstrapping if possible.
*/
- async saveBridgeSettings(connect) {
- TorSettings.saveToPrefs();
- // FIXME: This can throw if the user adds a bridge manually with invalid
- // content. Should be addressed by tor-browser#41913.
- try {
- await TorSettings.applySettings();
- } catch (e) {
- console.error("Applying settings failed", e);
- }
-
- this._populateBridgeCards();
+ async saveBridgeSettings(changes, connect) {
+ // TODO: Move focus into the bridge area.
+ // dialog.ownerGlobal.addEventListener("unload", () => gCurrentBridgesArea.takeFocus(), { once: true });
+ // or use closedCallback in gSubDialog.open()
+ setTorSettings(changes);
if (!connect) {
return;
@@ -1071,11 +2175,11 @@ const gConnectionPane = (function () {
onAddBuiltinBridge() {
const builtinBridgeDialog = new BuiltinBridgeDialog(
(bridgeType, connect) => {
- TorSettings.bridges.enabled = true;
- TorSettings.bridges.source = TorBridgeSource.BuiltIn;
- TorSettings.bridges.builtin_type = bridgeType;
-
- this.saveBridgeSettings(connect);
+ this.saveBridgeSettings(() => {
+ TorSettings.bridges.enabled = true;
+ TorSettings.bridges.source = TorBridgeSource.BuiltIn;
+ TorSettings.bridges.builtin_type = bridgeType;
+ }, connect);
}
);
builtinBridgeDialog.openDialog(gSubDialog);
@@ -1088,12 +2192,14 @@ const gConnectionPane = (function () {
if (!aBridges.length) {
return;
}
+
const bridgeStrings = aBridges.join("\n");
- TorSettings.bridges.enabled = true;
- TorSettings.bridges.source = TorBridgeSource.BridgeDB;
- TorSettings.bridges.bridge_strings = bridgeStrings;
- this.saveBridgeSettings(connect);
+ this.saveBridgeSettings(() => {
+ TorSettings.bridges.enabled = true;
+ TorSettings.bridges.source = TorBridgeSource.BridgeDB;
+ TorSettings.bridges.bridge_strings = bridgeStrings;
+ }, connect);
}
);
requestBridgeDialog.openDialog(gSubDialog);
@@ -1102,11 +2208,11 @@ const gConnectionPane = (function () {
onAddBridgeManually() {
const provideBridgeDialog = new ProvideBridgeDialog(
(aBridgeString, connect) => {
- TorSettings.bridges.enabled = true;
- TorSettings.bridges.source = TorBridgeSource.UserProvided;
- TorSettings.bridges.bridge_strings = aBridgeString;
-
- this.saveBridgeSettings(connect);
+ this.saveBridgeSettings(() => {
+ TorSettings.bridges.enabled = true;
+ TorSettings.bridges.source = TorBridgeSource.UserProvided;
+ TorSettings.bridges.bridge_strings = aBridgeString;
+ }, connect);
}
);
provideBridgeDialog.openDialog(gSubDialog);
=====================================
browser/components/torpreferences/content/connectionPane.xhtml
=====================================
@@ -67,7 +67,7 @@
<!-- Bridges -->
<hbox class="subcategory" data-category="paneConnection" hidden="true">
- <html:h1 id="torPreferences-bridges-header" />
+ <html:h1 id="torPreferences-bridges-header" tabindex="-1" />
</hbox>
<groupbox
id="torPreferences-bridges-group"
@@ -103,73 +103,196 @@
class="primary"
/>
</hbox>
- <html:h2 id="torPreferences-currentBridges-header"> </html:h2>
- <description flex="1" id="torPreferences-currentBridges-description">
- <html:span id="torPreferences-currentBridges-descriptionText" />
- </description>
- <hbox align="center" id="torPreferences-currentBridges-controls">
- <html:moz-toggle
- id="torPreferences-currentBridges-switch"
- label-align-after=""
- />
- <spacer flex="1" />
- <button id="torPreferences-currentBridges-removeAll" />
- </hbox>
- <menupopup id="torPreferences-bridgeCard-menu" />
- <vbox
- id="torPreferences-bridgeCard-template"
- class="torPreferences-bridgeCard"
- >
- <hbox class="torPreferences-bridgeCard-heading">
- <html:div class="torPreferences-bridgeCard-id" />
- <label
- class="torPreferences-bridgeCard-manualLink learnMore text-link stop-click"
- is="text-link"
- />
- <html:div class="torPreferences-bridgeCard-headingAddr" />
- <html:div class="torPreferences-bridgeCard-buttons">
- <html:span class="torPreferences-current-bridge-badge">
- <image class="torPreferences-current-bridge-icon" />
- <html:span class="torPreferences-current-bridge-label"></html:span>
+ <html:moz-toggle
+ id="tor-bridges-enabled-toggle"
+ label-align-after=""
+ data-l10n-id="tor-bridges-use-bridges"
+ data-l10n-attrs="label"
+ />
+ <!-- Add an aria-live area where we can post notifications to screen
+ - reader users about changes to their list of bridges. This is to give
+ - these users some feedback for when the remove a bridge or change
+ - their bridges in other ways. I.e. whenever tor-bridges-grid-display
+ - changes its rows.
+ -
+ - If we change the text in #tor-bridges-update-area-text, a screen
+ - reader should speak out the text to the user, even when this area
+ - does not have focus.
+ -
+ - In fact, we don't really want the user to navigate to this element
+ - directly. But currently using an aria-live region in the DOM is the
+ - only way to effectively pass a notification to a screen reader user.
+ - Since it must be somewhere in the DOM, we logically place it just
+ - before the grid, where it is hopefully least confusing to stumble
+ - across.
+ -
+ - TODO: Instead of aria-live in the DOM, use the proposed ariaNotify
+ - API if it gets accepted into firefox and works with screen readers.
+ - See https://github.com/WICG/proposals/issues/112
+ -->
+ <!-- NOTE: This area is hidden by default, and is only shown temporarily
+ - when a notification is added. -->
+ <html:div id="tor-bridges-update-area" hidden="hidden">
+ <!-- NOTE: This first span's text content will *not* be read out as part
+ - of the notification because it does not have an aria-live
+ - attribute. Instead it is just here to give context to the following
+ - text in #tor-bridges-update-area-text if the user navigates to
+ - #tor-bridges-update-area manually whilst it is not hidden.
+ - I.e. it is just here to make it less confusing if a screen reader
+ - user stumbles across this.
+ -->
+ <html:span data-l10n-id="tor-bridges-update-area-intro"></html:span>
+ <!-- Whitespace between spans. -->
+ <!-- This second span is the area to place notification text in. -->
+ <html:span
+ id="tor-bridges-update-area-text"
+ aria-live="polite"
+ ></html:span>
+ </html:div>
+ <html:div id="tor-bridges-none">
+ <html:img id="tor-bridges-none-icon" alt="" />
+ <html:div data-l10n-id="tor-bridges-none-added"></html:div>
+ </html:div>
+ <html:div id="tor-bridges-current">
+ <html:div id="tor-bridges-current-header-bar">
+ <html:h2
+ id="tor-bridges-current-heading"
+ tabindex="-1"
+ data-l10n-id="tor-bridges-your-bridges"
+ ></html:h2>
+ <html:span
+ id="tor-bridges-user-label"
+ data-l10n-id="tor-bridges-source-user"
+ ></html:span>
+ <html:span
+ id="tor-bridges-built-in-label"
+ data-l10n-id="tor-bridges-source-built-in"
+ ></html:span>
+ <html:span
+ id="tor-bridges-requested-label"
+ data-l10n-id="tor-bridges-source-requested"
+ ></html:span>
+ <html:button
+ id="tor-bridges-all-options-button"
+ class="tor-bridges-options-button"
+ aria-haspopup="menu"
+ aria-expanded="false"
+ aria-controls="tor-bridges-all-options-menu"
+ data-l10n-id="tor-bridges-options-button"
+ ></html:button>
+ <html:panel-list id="tor-bridges-all-options-menu">
+ <html:panel-item
+ id="tor-bridges-options-qr-all-menu-item"
+ data-l10n-attrs="accesskey"
+ data-l10n-id="tor-bridges-menu-item-qr-all-bridge-addresses"
+ ></html:panel-item>
+ <html:panel-item
+ id="tor-bridges-options-copy-all-menu-item"
+ data-l10n-attrs="accesskey"
+ data-l10n-id="tor-bridges-menu-item-copy-all-bridge-addresses"
+ ></html:panel-item>
+ <html:panel-item
+ id="tor-bridges-options-edit-all-menu-item"
+ data-l10n-attrs="accesskey"
+ data-l10n-id="tor-bridges-menu-item-edit-all-bridges"
+ ></html:panel-item>
+ <html:panel-item
+ id="tor-bridges-options-remove-all-menu-item"
+ data-l10n-attrs="accesskey"
+ data-l10n-id="tor-bridges-menu-item-remove-all-bridges"
+ ></html:panel-item>
+ </html:panel-list>
+ </html:div>
+ <html:div id="tor-bridges-built-in-display">
+ <html:div id="tor-bridges-built-in-type-name"></html:div>
+ <html:div
+ id="tor-bridges-built-in-connected"
+ class="bridge-status-badge"
+ >
+ <html:div class="bridge-status-icon"></html:div>
+ <html:span
+ data-l10n-id="tor-bridges-built-in-status-connected"
+ ></html:span>
+ </html:div>
+ <html:div id="tor-bridges-built-in-description"></html:div>
+ </html:div>
+ <html:div
+ id="tor-bridges-grid-display"
+ role="grid"
+ aria-labelledby="tor-bridges-current-heading"
+ ></html:div>
+ <html:template id="tor-bridges-grid-row-template">
+ <html:div class="tor-bridges-grid-row" role="row">
+ <!-- TODO: lox status cell for new bridges? -->
+ <html:span
+ class="tor-bridges-type-cell tor-bridges-grid-cell"
+ role="gridcell"
+ ></html:span>
+ <html:span class="tor-bridges-emojis-block" role="none"></html:span>
+ <html:span class="tor-bridges-grid-end-block" role="none">
+ <html:span
+ class="tor-bridges-address-cell tor-bridges-grid-cell"
+ role="gridcell"
+ ></html:span>
+ <html:span
+ class="tor-bridges-status-cell tor-bridges-grid-cell"
+ role="gridcell"
+ >
+ <html:div class="bridge-status-badge">
+ <html:div class="bridge-status-icon"></html:div>
+ <html:span class="tor-bridges-status-cell-text"></html:span>
+ </html:div>
+ </html:span>
+ <html:span
+ class="tor-bridges-options-cell tor-bridges-grid-cell"
+ role="gridcell"
+ >
+ <html:button
+ class="tor-bridges-options-cell-button tor-bridges-options-button tor-bridges-grid-focus"
+ aria-haspopup="menu"
+ aria-expanded="false"
+ data-l10n-id="tor-bridges-individual-bridge-options-button"
+ ></html:button>
+ <html:panel-list class="tor-bridges-individual-options-menu">
+ <html:panel-item
+ class="tor-bridges-options-qr-one-menu-item"
+ data-l10n-attrs="accesskey"
+ data-l10n-id="tor-bridges-menu-item-qr-address"
+ ></html:panel-item>
+ <html:panel-item
+ class="tor-bridges-options-copy-one-menu-item"
+ data-l10n-attrs="accesskey"
+ data-l10n-id="tor-bridges-menu-item-copy-address"
+ ></html:panel-item>
+ <html:panel-item
+ class="tor-bridges-options-remove-one-menu-item"
+ data-l10n-attrs="accesskey"
+ data-l10n-id="tor-bridges-menu-item-remove-bridge"
+ ></html:panel-item>
+ </html:panel-list>
+ </html:span>
</html:span>
- <html:button class="torPreferences-bridgeCard-options stop-click" />
</html:div>
- </hbox>
- <box class="torPreferences-bridgeCard-grid">
- <box class="torPreferences-bridgeCard-qrWrapper">
- <html:div class="torPreferences-bridgeCard-qr stop-click">
- <html:div class="torPreferences-bridgeCard-qrCode" />
- <html:div class="torPreferences-bridgeCard-qrOnionBox" />
- <html:div class="torPreferences-bridgeCard-qrOnion" />
- </html:div>
- </box>
- <description class="torPreferences-bridgeCard-share"></description>
- <hbox class="torPreferences-bridgeCard-addrBox">
- <html:input
- class="torPreferences-bridgeCard-addr stop-click"
- type="text"
- readonly="readonly"
- />
- </hbox>
- <!-- tor-browser#41977 disable this learn more link until we have an alternate manual entry -->
- <hbox class="torPreferences-bridgeCard-learnMoreBox" align="center" hidden="true">
- <label
- class="torPreferences-bridgeCard-learnMore learnMore text-link stop-click"
- is="text-link"
- />
- </hbox>
- <hbox class="torPreferences-bridgeCard-copy" align="center">
- <button class="torPreferences-bridgeCard-copyButton stop-click" />
- </hbox>
- </box>
- </vbox>
- <vbox id="torPreferences-currentBridges-cards"></vbox>
- <vbox align="center">
- <button
- id="torPreferences-currentBridges-showAll"
- aria-controls="torPreferences-currentBridges-cards"
- />
- </vbox>
+ </html:template>
+ <html:div id="tor-bridges-share">
+ <html:h3
+ id="tor-bridges-share-heading"
+ data-l10n-id="tor-bridges-share-heading"
+ ></html:h3>
+ <html:span
+ id="tor-bridges-share-description"
+ data-l10n-id="tor-bridges-share-description"
+ ></html:span>
+ <html:button
+ id="tor-bridges-copy-addresses-button"
+ data-l10n-id="tor-bridges-copy-addresses-button"
+ ></html:button>
+ <html:button
+ id="tor-bridges-qr-addresses-button"
+ data-l10n-id="tor-bridges-qr-addresses-button"
+ ></html:button>
+ </html:div>
+ </html:div>
<html:h2 id="torPreferences-addBridge-header"></html:h2>
<hbox align="center">
<label id="torPreferences-addBridge-labelBuiltinBridge" flex="1" />
=====================================
browser/components/torpreferences/content/torPreferences.css
=====================================
@@ -69,282 +69,391 @@
}
/* Bridge settings */
-#torPreferences-bridges-location {
- width: 280px;
-}
-#torPreferences-bridges-location menuitem[disabled="true"] {
- color: var(--in-content-button-text-color, inherit);
- font-weight: 700;
+.bridge-status-badge {
+ display: flex;
+ min-width: max-content;
+ align-items: center;
+ gap: 0.5em;
+ font-size: 0.85em;
}
-/* Bridge cards */
-:root {
- --bridgeCard-animation-time: 0.25s;
+.bridge-status-badge:not(
+ .bridge-status-connected,
+ .bridge-status-none,
+ .bridge-status-current-built-in
+) {
+ display: none;
}
-#torPreferences-currentBridges-cards {
- /* The padding is needed because the mask-image creates an unexpected result
- otherwise... */
- padding: 24px 4px;
+.bridge-status-badge.bridge-status-connected {
+ color: var(--purple-60);
}
-#torPreferences-currentBridges-cards.list-collapsed {
- mask-image: linear-gradient(rgb(0, 0, 0) 0% 75%, rgba(0, 0, 0, 0.1));
+@media (prefers-color-scheme: dark) {
+ .bridge-status-badge.bridge-status-connected {
+ color: var(--purple-30);
+ }
}
-#torPreferences-currentBridges-cards.disabled {
- opacity: 0.4;
+.bridge-status-badge.bridge-status-current-built-in {
+ color: var(--in-content-accent-color);
}
-.torPreferences-bridgeCard {
- padding: 16px 12px;
- /* define border-radius here because of the transition */
- border-radius: 4px;
- transition: margin var(--bridgeCard-animation-time), box-shadow 150ms;
- cursor: pointer;
+.bridge-status-badge > * {
+ flex: 0 0 auto;
}
-.torPreferences-bridgeCard.expanded,
-.torPreferences-bridgeCard.currently-connected,
-.single-card .torPreferences-bridgeCard {
- margin: 12px 0;
- background: var(--in-content-box-background);
- box-shadow: var(--card-shadow);
+.bridge-status-icon {
+ width: 16px;
+ height: 16px;
+ background-repeat: no-repeat;
+ background-position: center center;
+ -moz-context-properties: fill;
+ fill: currentColor;
}
-.torPreferences-bridgeCard:hover {
- background: var(--in-content-box-background);
- box-shadow: var(--card-shadow-hover);
+.bridge-status-badge:is(
+ .bridge-status-connected,
+ .bridge-status-current-built-in
+) .bridge-status-icon {
+ background-image: url("chrome://global/skin/icons/check.svg");
}
-.single-card .torPreferences-bridgeCard,
-.torPreferences-bridgeCard.currently-connected {
- cursor: default;
+.bridge-status-badge.bridge-status-none .bridge-status-icon {
+ /* Hide the icon. */
+ display: none;
}
-.torPreferences-bridgeCard-heading {
- display: flex;
- align-items: center;
+#tor-bridges-enabled-toggle {
+ margin-block: 16px;
+ width: max-content;
}
-.torPreferences-bridgeCard-id {
- display: flex;
- align-items: center;
- font-weight: 700;
+#tor-bridges-update-area {
+ /* Still accessible to screen reader, but not visual. */
+ position: absolute;
+ clip-path: inset(50%);
}
-.torPreferences-bridgeCard-id .emoji {
- width: 20px;
- height: 20px;
- margin-inline-start: 4px;
- padding: 4px;
- font-size: 20px;
- border-radius: 4px;
- background: var(--in-content-box-background-odd);
+#torPreferences-bridges-group:not(.have-bridges, .no-bridges) {
+ /* Hide bridge settings whilst not initialized. */
+ display: none;
}
-#torPreferences-currentBridges-cards:not(
- .single-card
-) .torPreferences-bridgeCard:not(
- .expanded,
- .currently-connected
-) .torPreferences-bridgeCard-manualLink {
+#torPreferences-bridges-group:not(.have-bridges) #tor-bridges-current {
display: none;
}
-.torPreferences-bridgeCard-manualLink {
- margin: 0 8px;
+#torPreferences-bridges-group:not(.no-bridges) #tor-bridges-none {
+ display: none;
}
-.torPreferences-bridgeCard-headingAddr {
- /* flex extends the element when needed, but without setting a width (any) the
- overflow + ellipses does not work. */
- width: 20px;
- flex: 1;
- margin: 0 8px;
- overflow: hidden;
- color: var(--text-color-deemphasized);
- white-space: nowrap;
- text-overflow: ellipsis;
+#tor-bridges-current:not(.source-built-in) #tor-bridges-built-in-label {
+ display: none;
}
-.expanded .torPreferences-bridgeCard-headingAddr,
-.currently-connected .torPreferences-bridgeCard-headingAddr,
-.single-card .torPreferences-bridgeCard-headingAddr {
+#tor-bridges-current:not(.source-user) #tor-bridges-user-label {
display: none;
}
-.torPreferences-bridgeCard-buttons {
- display: flex;
- align-items: center;
- margin-inline-start: auto;
- align-self: center;
+#tor-bridges-current:not(.source-requested) #tor-bridges-requested-label {
+ display: none;
}
-.torPreferences-current-bridge-badge {
- /* Hidden by default, otherwise display is "flex". */
+#tor-bridges-current:not(
+ .source-user,
+ .source-requested
+) #tor-bridges-share {
display: none;
- align-items: center;
- font-size: 0.85em;
}
-:is(
- .builtin-bridges-option.current-builtin-bridge-type,
- .torPreferences-bridgeCard.currently-connected
-) .torPreferences-current-bridge-badge {
- display: flex;
+#tor-bridges-none,
+#tor-bridges-current {
+ margin-inline: 0;
+ margin-block: 32px;
+ line-height: 1.8;
}
-.torPreferences-current-bridge-icon {
- margin-inline-start: 1px;
- margin-inline-end: 7px;
- list-style-image: url("chrome://global/skin/icons/check.svg");
+#tor-bridges-none {
+ display: grid;
+ justify-items: center;
+ text-align: center;
+ padding-block: 64px;
+ padding-inline: 32px;
+ gap: 16px;
+ border-radius: 4px;
+ color: var(--text-color-deemphasized);
+ border: 2px dashed color-mix(in srgb, currentColor 20%, transparent);
+}
+
+#tor-bridges-none-icon {
+ width: 20px;
+ height: 20px;
+ content: url("chrome://browser/content/torpreferences/bridge.svg");
-moz-context-properties: fill;
fill: currentColor;
- flex: 0 0 auto;
}
-.torPreferences-bridgeCard .torPreferences-current-bridge-badge {
- color: var(--purple-60);
- margin-inline-end: 12px;
+#tor-bridges-current {
+ padding: 16px;
+ border-radius: 4px;
+ background: var(--in-content-box-info-background);
}
-@media (prefers-color-scheme: dark) {
- .torPreferences-bridgeCard .torPreferences-current-bridge-badge {
- color: var(--purple-30);
- }
+#tor-bridges-current-header-bar {
+ display: flex;
+ min-width: max-content;
+ align-items: center;
+ border-block-end: 1px solid var(--in-content-border-color);
+ padding-block-end: 16px;
+ margin-block-end: 16px;
}
-.torPreferences-bridgeCard-options {
- width: 24px;
- min-width: 0;
- height: 24px;
- min-height: 0;
- margin-inline-start: 8px;
- padding: 1px;
+#tor-bridges-current-header-bar > * {
+ flex: 0 0 auto;
+}
+
+#tor-bridges-current-heading {
+ margin: 0;
+ margin-inline-end: 2em;
+ font-size: inherit;
+ flex: 1 0 auto;
+}
+
+.tor-bridges-options-button {
+ padding: 3px;
+ margin: 0;
+ min-height: auto;
+ min-width: auto;
+ box-sizing: content-box;
+ width: 16px;
+ height: 16px;
background-image: url("chrome://global/skin/icons/more.svg");
background-repeat: no-repeat;
background-position: center center;
- fill: currentColor;
+ background-origin: content-box;
+ background-size: contain;
-moz-context-properties: fill;
+ fill: currentColor;
}
-#torPreferences-bridgeCard-menu menuitem {
- fill: currentColor;
- -moz-context-properties: fill;
+#tor-bridges-all-options-button {
+ margin-inline-start: 8px;
}
-.torPreferences-bridgeCard-qrWrapper {
- grid-area: bridge-qr;
- display: block; /* So it doesn't stretch the child vertically. */
- margin-inline-end: 14px;
+#tor-bridges-built-in-display {
+ display: grid;
+ grid-template:
+ "type status" min-content
+ "description description" auto
+ / max-content 1fr;
+ gap: 4px 1.5em;
+ margin-block-end: 16px;
}
-.torPreferences-bridgeCard-qr {
- --qr-one: black;
- --qr-zero: white;
- background: var(--qr-zero);
- position: relative;
- padding: 4px;
- border-radius: 2px;
+#tor-bridges-built-in-display:not(.built-in-active) {
+ display: none;
}
-.torPreferences-bridgeCard-qrCode {
- width: 112px;
- height: 112px;
- /* Define these colors, as they will be passed to the QR code library */
- background: var(--qr-zero);
- color: var(--qr-one);
+#tor-bridges-built-in-type-name {
+ font-weight: 700;
+ grid-area: type;
}
-.torPreferences-bridgeCard-qrOnionBox {
- width: 28px;
- height: 28px;
- position: absolute;
- top: calc(50% - 14px);
- inset-inline-start: calc(50% - 14px);
- background: var(--qr-zero);
+#tor-bridges-built-in-connected {
+ grid-area: status;
+ justify-self: end;
}
-.torPreferences-bridgeCard-qrOnion {
- width: 16px;
- height: 16px;
- position: absolute;
- top: calc(50% - 8px);
- inset-inline-start: calc(50% - 8px);
+#tor-bridges-built-in-description {
+ grid-area: description;
+}
- mask: url("chrome://browser/content/torpreferences/bridge-qr-onion-mask.svg");
- mask-repeat: no-repeat;
- mask-size: 16px;
- background: var(--qr-one);
+#tor-bridges-grid-display {
+ display: grid;
+ grid-template-columns: max-content repeat(4, max-content) 1fr;
+ --tor-bridges-grid-column-gap: 8px;
+ --tor-bridges-grid-column-short-gap: 4px;
}
-.torPreferences-bridgeCard-qr:hover .torPreferences-bridgeCard-qrOnionBox {
- background: var(--qr-one);
+#tor-bridges-grid-display:not(.grid-active) {
+ display: none;
}
-.torPreferences-bridgeCard-qr:hover .torPreferences-bridgeCard-qrOnion {
- mask: url("chrome://global/skin/icons/search-glass.svg");
- background: var(--qr-zero);
+.tor-bridges-grid-row {
+ /* We want each row to act as a row of three items in the
+ * #tor-bridges-grid-display grid layout.
+ * We also want a 16px spacing between rows, and 8px spacing between columns,
+ * which are outside the .tor-bridges-grid-cell's border area. So that
+ * clicking these gaps will not focus any item, and their focus outlines do
+ * not overlap.
+ * Moreover, we also want each row to show its .tor-bridges-options-cell when
+ * the .tor-bridges-grid-row has :hover.
+ *
+ * We could use "display: contents" on the row and set a "gap: 16px 8px" on
+ * the parent so that its items fall into the parent layout. However, the gap
+ * between the items would mean there are places where no row has :hover. So
+ * if the user glided across the grid, the options button would visibly
+ * disappear any time the pointer entered a gap, causing the display to feel
+ * "jumpy".
+ *
+ * Instead, we use a "subgrid" layout for each .tor-bridges-grid-row, and
+ * using padding, rather than a gap, for the vertical spacing. Therefore,
+ * every part of the grid is covered by a row, so moving the pointer over the
+ * grid will always have one row with :hover, so one of the options cell will
+ * always be visible.
+ */
+ display: grid;
+ grid-column: 1 / -1;
+ grid-template-columns: subgrid;
+ /* Add 16px gap between rows, plus 8px at the start and end of the grid. */
+ padding-block: 8px;
}
-.torPreferences-bridgeCard-grid {
- height: 0; /* We will set it in JS when expanding it! */
+.tor-bridges-grid-cell:focus-visible {
+ outline: var(--in-content-focus-outline);
+ outline-offset: var(--in-content-focus-outline-offset);
+}
+
+.tor-bridges-grid-cell {
+ /* The cell is stretched to the height of the row, so that each focus outline
+ * shares the same height, but we want to center-align the content within,
+ * which is either a single Element or a TextNode. */
display: grid;
- grid-template-rows: auto 1fr;
- grid-template-columns: auto 1fr auto;
- grid-template-areas:
- 'bridge-qr bridge-share bridge-share'
- 'bridge-qr bridge-address bridge-address'
- 'bridge-qr bridge-learn-more bridge-copy';
- visibility: hidden;
+ align-content: center;
}
-.expanded .torPreferences-bridgeCard-grid,
-.currently-connected .torPreferences-bridgeCard-grid,
-.single-card .torPreferences-bridgeCard-grid {
- padding-top: 12px;
- visibility: visible;
+.tor-bridges-type-cell {
+ margin-inline-end: var(--tor-bridges-grid-column-gap);
}
-.currently-connected .torPreferences-bridgeCard-grid,
-.single-card .torPreferences-bridgeCard-grid {
- height: auto;
+.tor-bridges-emojis-block {
+ /* Emoji block occupies four columns, but with a smaller gap. */
+ display: contents;
}
-.torPreferences-bridgeCard-grid.to-animate {
- transition: height var(--bridgeCard-animation-time) ease-out, visibility var(--bridgeCard-animation-time);
- overflow: hidden;
+.tor-bridges-emoji-cell:not(:last-child) {
+ margin-inline-end: var(--tor-bridges-grid-column-short-gap);
}
-.torPreferences-bridgeCard-share {
- grid-area: bridge-share;
+.tor-bridges-emoji-icon {
+ display: block;
+ box-sizing: content-box;
+ width: 16px;
+ height: 16px;
+ background: var(--in-content-button-background);
+ border-radius: 4px;
+ padding: 8px;
}
-.torPreferences-bridgeCard-addrBox {
- grid-area: bridge-address;
+.tor-bridges-grid-end-block {
+ /* The last three cells all share a single grid item slot in the
+ * #tor-bridges-grid-display layout.
+ * This is because we do not want to align its cells between rows. */
+ min-width: max-content;
display: flex;
- align-items: center;
- justify-content: center;
- margin: 8px 0;
+ /* Choose "stretch" instead of "center" so that focus outline is a consistent
+ * height between cells. */
+ align-items: stretch;
+ margin-inline-start: var(--tor-bridges-grid-column-gap);
+ gap: var(--tor-bridges-grid-column-gap);
}
-input.torPreferences-bridgeCard-addr {
- width: 100%;
+.tor-bridges-address-cell {
+ /* base size */
+ width: 10em;
+ flex: 1 0 auto;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
color: var(--text-color-deemphasized);
}
-.torPreferences-bridgeCard-leranMoreBox {
- grid-area: bridge-learn-more;
+.tor-bridges-status-cell,
+.tor-bridges-options-cell {
+ flex: 0 0 auto;
}
-.torPreferences-bridgeCard-copy {
- grid-area: bridge-copy;
+/* Hide the options button if the row does not have hover or focus. */
+.tor-bridges-grid-row:not(
+ :hover,
+ :focus-within
+) .tor-bridges-options-cell,
+/* Hide the status cell when it shows "No status" if the cell does not have
+ * focus. */
+.tor-bridges-grid-row.hide-status .tor-bridges-status-cell:not(:focus) {
+ /* Still accessible to screen reader, but not visual and does not contribute
+ * to the parent flex layout. */
+ /* NOTE: We assume that the height of these cell's content is equal to or less
+ * than the other cells, so there won't be a jump in row height when they
+ * become visual again and contribute to the layout. */
+ position: absolute;
+ clip-path: inset(50%);
}
-#torPreferences-bridgeCard-template {
- display: none;
+#tor-bridges-share {
+ margin-block-start: 24px;
+ border-radius: 4px;
+ border: 1px solid var(--in-content-border-color);
+ padding: 16px;
+ display: grid;
+ grid-template:
+ "heading heading heading" min-content
+ /* If the description spans one line, it will be center-aligned with the
+ * buttons, otherwise it will start to expand upwards. */
+ "description . ." 1fr
+ "description copy qr" min-content
+ / 1fr max-content max-content;
+ gap: 0 8px;
+ align-items: center;
+}
+
+#tor-bridges-share-heading {
+ grid-area: heading;
+ font-size: inherit;
+ margin: 0;
+ font-weight: 700;
+}
+
+#tor-bridges-share-description {
+ grid-area: description;
+}
+
+#tor-bridges-copy-addresses-button {
+ grid-area: copy;
+ margin: 0;
+ /* Match the QR height if it is higher than ours. */
+ min-height: auto;
+ line-height: 1;
+ align-self: stretch;
+}
+
+#tor-bridges-qr-addresses-button {
+ grid-area: qr;
+ padding: 5px;
+ margin: 0;
+ min-height: auto;
+ min-width: auto;
+ box-sizing: content-box;
+ width: 24px;
+ height: 24px;
+ background-image: url("chrome://browser/content/torpreferences/bridge-qr.svg");
+ background-repeat: no-repeat;
+ background-position: center center;
+ background-origin: content-box;
+ background-size: contain;
+ -moz-context-properties: fill;
+ fill: currentColor;
+}
+
+#torPreferences-bridges-location {
+ width: 280px;
+}
+
+#torPreferences-bridges-location menuitem[disabled="true"] {
+ color: var(--in-content-button-text-color, inherit);
+ font-weight: 700;
}
/* Advanced Settings */
@@ -446,10 +555,6 @@ dialog#torPreferences-requestBridge-dialog > hbox {
font-weight: 700;
}
-.builtin-bridges-option .torPreferences-current-bridge-badge {
- color: var(--in-content-accent-color);
-}
-
/* Request bridge dialog */
/*
This hbox is hidden by css here by default so that the
=====================================
browser/components/torpreferences/jar.mn
=====================================
@@ -1,4 +1,6 @@
browser.jar:
+ content/browser/torpreferences/bridge.svg (content/bridge.svg)
+ content/browser/torpreferences/bridge-qr.svg (content/bridge-qr.svg)
content/browser/torpreferences/bridgeQrDialog.xhtml (content/bridgeQrDialog.xhtml)
content/browser/torpreferences/bridgeQrDialog.mjs (content/bridgeQrDialog.mjs)
content/browser/torpreferences/builtinBridgeDialog.xhtml (content/builtinBridgeDialog.xhtml)
=====================================
browser/locales/en-US/browser/tor-browser.ftl
=====================================
@@ -44,3 +44,80 @@ tor-browser-home-message-testing = This is an unstable version of Tor Browser fo
# Shown in Home settings, corresponds to the default about:tor home page.
home-mode-choice-tor =
.label = Tor Browser Home
+
+## Tor Bridges Settings
+
+# Toggle button for enabling and disabling the use of bridges.
+tor-bridges-use-bridges =
+ .label = Use bridges
+
+tor-bridges-none-added = No bridges added
+tor-bridges-your-bridges = Your bridges
+tor-bridges-source-user = Added by you
+tor-bridges-source-built-in = Built-in
+tor-bridges-source-requested = Requested from Tor
+# The "..." menu button for all current bridges.
+tor-bridges-options-button =
+ .title = All bridges
+# Shown in the "..." menu for all bridges when the user can generate a QR code for all of their bridges.
+tor-bridges-menu-item-qr-all-bridge-addresses = Show QR code
+ .accesskey = Q
+# Shown in the "..." menu for all bridges when the user can copy all of their bridges.
+tor-bridges-menu-item-copy-all-bridge-addresses = Copy bridge addresses
+ .accesskey = C
+# Only shown in the "..." menu for bridges added by the user.
+tor-bridges-menu-item-edit-all-bridges = Edit bridges
+ .accesskey = E
+# Shown in the "..." menu for all current bridges.
+tor-bridges-menu-item-remove-all-bridges = Remove all bridges
+ .accesskey = R
+
+# Shown when one of the built-in bridges is in use.
+tor-bridges-built-in-status-connected = Connected
+
+# Shown at the start of a Tor bridge line.
+# $type (String) - The Tor bridge type ("snowflake", "obfs4", "meek-azure").
+tor-bridges-type-prefix = { $type } bridge:
+# The name and accessible description for a bridge emoji cell. Each bridge address can be hashed into four emojis shown to the user (bridgemoji feature). This cell corresponds to a *single* such emoji. The "title" should just be emojiName. The "aria-description" should give screen reader users enough of a hint that the cell contains a single emoji.
+# $emojiName (String) - The name of the emoji, already localized.
+# E.g. with Orca screen reader in en-US this would read "unicorn. Row 2 Column 2. Emoji".
+tor-bridges-emoji-cell =
+ .title = { $emojiName }
+ .aria-description = Emoji
+# The emoji name to show on hover when a bridge emoji's name is unknown.
+tor-bridges-emoji-unknown = Unknown
+# Shown when the bridge has been used for the most recent Tor circuit, i.e. the most recent bridge we have connected to.
+tor-bridges-status-connected = Connected
+# Used when the bridge has no status, i.e. the *absence* of a status to report to the user. This is only visibly shown when the status cell has keyboard focus.
+tor-bridges-status-none = No status
+# The "..." menu button for an individual bridge row.
+tor-bridges-individual-bridge-options-button =
+ .title = Bridge options
+# Shown in the "..." menu for an individual bridge. Shows the QR code for this one bridge.
+tor-bridges-menu-item-qr-address = Show QR code
+ .accesskey = Q
+# Shown in the "..." menu for an individual bridge. Copies the single bridge address to clipboard.
+tor-bridges-menu-item-copy-address = Copy bridge address
+ .accesskey = C
+# Shown in the "..." menu for an individual bridge. Removes this one bridge.
+tor-bridges-menu-item-remove-bridge = Remove bridge
+ .accesskey = R
+
+# Text shown just before a description of the most recent change to the list of user's bridges. Some white space will separate this text from the change description.
+# This text is not visible, but is instead used for screen reader users.
+# E.g. in English this could be "Recent update: One of your Tor bridges has been removed."
+tor-bridges-update-area-intro = Recent update:
+# Update text for screen reader users when only one of their bridges has been removed.
+tor-bridges-update-removed-one-bridge = One of your Tor bridges has been removed.
+# Update text for screen reader users when all of their bridges have been removed.
+tor-bridges-update-removed-all-bridges = All of your Tor bridges have been removed.
+# Update text for screen reader users when their bridges have changed in some arbitrary way.
+tor-bridges-update-changed-bridges = Your Tor bridges have changed.
+
+# Shown for requested bridges and bridges added by the user.
+tor-bridges-share-heading = Help others connect
+#
+tor-bridges-share-description = Share your bridges with trusted contacts.
+tor-bridges-copy-addresses-button = Copy addresses
+tor-bridges-qr-addresses-button =
+ .title = Show QR code
=====================================
toolkit/modules/TorSettings.sys.mjs
=====================================
@@ -175,6 +175,14 @@ class TorSettingsImpl {
allowed_ports: [],
},
};
+ /**
+ * Accumulated errors from trying to set settings.
+ *
+ * Only added to if not null.
+ *
+ * @type {Array<Error>?}
+ */
+ #settingErrors = null;
/**
* The recommended pluggable transport.
@@ -224,16 +232,33 @@ class TorSettingsImpl {
enabled: {},
});
this.#addProperties("bridges", {
+ /**
+ * Whether the bridges are enabled or not.
+ *
+ * @type {boolean}
+ */
enabled: {},
+ /**
+ * The current bridge source.
+ *
+ * @type {integer}
+ */
source: {
- transform: val => {
+ transform: (val, addError) => {
if (Object.values(TorBridgeSource).includes(val)) {
return val;
}
- lazy.logger.error(`Not a valid bridge source: "${val}"`);
+ addError(`Not a valid bridge source: "${val}"`);
return TorBridgeSource.Invalid;
},
},
+ /**
+ * The current bridge strings.
+ *
+ * Can only be non-empty if the "source" is not Invalid.
+ *
+ * @type {Array<string>}
+ */
bridge_strings: {
transform: val => {
if (Array.isArray(val)) {
@@ -244,13 +269,15 @@ class TorSettingsImpl {
copy: val => [...val],
equal: (val1, val2) => this.#arrayEqual(val1, val2),
},
+ /**
+ * The built-in type to use when using the BuiltIn "source", or empty when
+ * using any other source.
+ *
+ * @type {string}
+ */
builtin_type: {
- callback: val => {
+ callback: (val, addError) => {
if (!val) {
- // Make sure that the source is not BuiltIn
- if (this.bridges.source === TorBridgeSource.BuiltIn) {
- this.bridges.source = TorBridgeSource.Invalid;
- }
return;
}
const bridgeStrings = this.#getBuiltinBridges(val);
@@ -258,39 +285,28 @@ class TorSettingsImpl {
this.bridges.bridge_strings = bridgeStrings;
return;
}
- lazy.logger.error(`No built-in ${val} bridges found`);
- // Change to be empty, this will trigger this callback again,
- // but with val as "".
- this.bridges.builtin_type == "";
+
+ addError(`No built-in ${val} bridges found`);
+ // Set as invalid, which will make the builtin_type "" and set the
+ // bridge_strings to be empty at the next #cleanupSettings.
+ this.bridges.source = TorBridgeSource.Invalid;
},
},
});
this.#addProperties("proxy", {
- enabled: {
- callback: val => {
- if (val) {
- return;
- }
- // Reset proxy settings.
- this.proxy.type = TorProxyType.Invalid;
- this.proxy.address = "";
- this.proxy.port = 0;
- this.proxy.username = "";
- this.proxy.password = "";
- },
- },
+ enabled: {},
type: {
- transform: val => {
+ transform: (val, addError) => {
if (Object.values(TorProxyType).includes(val)) {
return val;
}
- lazy.logger.error(`Not a valid proxy type: "${val}"`);
+ addError(`Not a valid proxy type: "${val}"`);
return TorProxyType.Invalid;
},
},
address: {},
port: {
- transform: val => {
+ transform: (val, addError) => {
if (val === 0) {
// This is a valid value that "unsets" the port.
// Keep this value without giving a warning.
@@ -298,15 +314,11 @@ class TorSettingsImpl {
return 0;
}
// Unset to 0 if invalid null is returned.
- return this.#parsePort(val, false) ?? 0;
+ return this.#parsePort(val, false, addError) ?? 0;
},
},
- username: {
- transform: val => val ?? "",
- },
- password: {
- transform: val => val ?? "",
- },
+ username: {},
+ password: {},
uri: {
getter: () => {
const { type, address, port, username, password } = this.proxy;
@@ -329,20 +341,16 @@ class TorSettingsImpl {
},
});
this.#addProperties("firewall", {
- enabled: {
- callback: val => {
- if (!val) {
- this.firewall.allowed_ports = "";
- }
- },
- },
+ enabled: {},
allowed_ports: {
- transform: val => {
+ transform: (val, addError) => {
if (!Array.isArray(val)) {
val = val === "" ? [] : val.split(",");
}
// parse and remove duplicates
- const portSet = new Set(val.map(p => this.#parsePort(p, true)));
+ const portSet = new Set(
+ val.map(p => this.#parsePort(p, true, addError))
+ );
// parsePort returns null for failed parses, so remove it.
portSet.delete(null);
return [...portSet];
@@ -353,6 +361,39 @@ class TorSettingsImpl {
});
}
+ /**
+ * Clean the setting values after making some changes, so that the values do
+ * not contradict each other.
+ */
+ #cleanupSettings() {
+ this.freezeNotifications();
+ try {
+ if (this.bridges.source === TorBridgeSource.Invalid) {
+ this.bridges.enabled = false;
+ this.bridges.bridge_strings = [];
+ }
+ if (!this.bridges.bridge_strings.length) {
+ this.bridges.enabled = false;
+ this.bridges.source = TorBridgeSource.Invalid;
+ }
+ if (this.bridges.source !== TorBridgeSource.BuiltIn) {
+ this.bridges.builtin_type = "";
+ }
+ if (!this.proxy.enabled) {
+ this.proxy.type = TorProxyType.Invalid;
+ this.proxy.address = "";
+ this.proxy.port = 0;
+ this.proxy.username = "";
+ this.proxy.password = "";
+ }
+ if (!this.firewall.enabled) {
+ this.firewall.allowed_ports = [];
+ }
+ } finally {
+ this.thawNotifications();
+ }
+ }
+
/**
* The current number of freezes applied to the notifications.
*
@@ -435,6 +476,13 @@ class TorSettingsImpl {
const group = {};
for (const name in propParams) {
const { getter, transform, callback, copy, equal } = propParams[name];
+ // Method for adding setting errors.
+ const addError = message => {
+ message = `TorSettings.${groupname}.${name}: ${message}`;
+ lazy.logger.error(message);
+ // Only add to #settingErrors if it is not null.
+ this.#settingErrors?.push(message);
+ };
Object.defineProperty(group, name, {
get: getter
? () => {
@@ -467,16 +515,20 @@ class TorSettingsImpl {
this.freezeNotifications();
try {
if (transform) {
- val = transform(val);
+ val = transform(val, addError);
}
const isEqual = equal ? equal(val, prevVal) : val === prevVal;
if (!isEqual) {
- if (callback) {
- callback(val);
- }
+ // Set before the callback.
this.#settings[groupname][name] = val;
this.#notificationQueue.add(`${groupname}.${name}`);
+
+ if (callback) {
+ callback(val, addError);
+ }
}
+ } catch (e) {
+ addError(e.message);
} finally {
this.thawNotifications();
}
@@ -503,11 +555,12 @@ class TorSettingsImpl {
* @param {string|integer} val - The value to parse.
* @param {boolean} trim - Whether a string value can be stripped of
* whitespace before parsing.
+ * @param {function} addError - Callback to add error messages to.
*
* @return {integer?} - The port number, or null if the given value was not
* valid.
*/
- #parsePort(val, trim) {
+ #parsePort(val, trim, addError) {
if (typeof val === "string") {
if (trim) {
val = val.trim();
@@ -516,12 +569,12 @@ class TorSettingsImpl {
if (this.#portRegex.test(val)) {
val = Number.parseInt(val, 10);
} else {
- lazy.logger.error(`Invalid port string "${val}"`);
+ addError(`Invalid port string "${val}"`);
return null;
}
}
if (!Number.isInteger(val) || val < 1 || val > 65535) {
- lazy.logger.error(`Port out of range: ${val}`);
+ addError(`Port out of range: ${val}`);
return null;
}
return val;
@@ -739,6 +792,8 @@ class TorSettingsImpl {
""
);
}
+
+ this.#cleanupSettings();
}
/**
@@ -748,6 +803,7 @@ class TorSettingsImpl {
lazy.logger.debug("saveToPrefs()");
this.#checkIfInitialized();
+ this.#cleanupSettings();
/* Quickstart */
Services.prefs.setBoolPref(
@@ -847,6 +903,8 @@ class TorSettingsImpl {
async #applySettings(allowUninitialized) {
lazy.logger.debug("#applySettings()");
+ this.#cleanupSettings();
+
const settingsMap = new Map();
// #applySettings can be called only when #allowUninitialized is false
@@ -928,6 +986,8 @@ class TorSettingsImpl {
const backup = this.getSettings();
const backupNotifications = [...this.#notificationQueue];
+ // Start collecting errors.
+ this.#settingErrors = [];
// Hold off on lots of notifications until all settings are changed.
this.freezeNotifications();
@@ -946,25 +1006,11 @@ class TorSettingsImpl {
case TorBridgeSource.UserProvided:
this.bridges.bridge_strings = settings.bridges.bridge_strings;
break;
- case TorBridgeSource.BuiltIn: {
+ case TorBridgeSource.BuiltIn:
this.bridges.builtin_type = settings.bridges.builtin_type;
- if (!this.bridges.bridge_strings.length) {
- // No bridges were found when setting the builtin_type.
- throw new Error(
- `No available builtin bridges of type ${settings.bridges.builtin_type}`
- );
- }
break;
- }
case TorBridgeSource.Invalid:
break;
- default:
- if (settings.bridges.enabled) {
- throw new Error(
- `Bridge source '${settings.source}' is not a valid source`
- );
- }
- break;
}
}
@@ -985,6 +1031,12 @@ class TorSettingsImpl {
this.firewall.allowed_ports = settings.firewall.allowed_ports;
}
}
+
+ this.#cleanupSettings();
+
+ if (this.#settingErrors.length) {
+ throw Error(this.#settingErrors.join("; "));
+ }
} catch (ex) {
// Restore the old settings without any new notifications generated from
// the above code.
@@ -1001,6 +1053,8 @@ class TorSettingsImpl {
lazy.logger.error("setSettings failed", ex);
} finally {
this.thawNotifications();
+ // Stop collecting errors.
+ this.#settingErrors = null;
}
lazy.logger.debug("setSettings result", this.#settings);
=====================================
toolkit/modules/TorStrings.sys.mjs
=====================================
@@ -3,8 +3,6 @@
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
-"use strict";
-
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
const { AppConstants } = ChromeUtils.import(
"resource://gre/modules/AppConstants.jsm"
@@ -86,7 +84,6 @@ const Loader = {
statusTorNotConnected: "Not Connected",
statusTorBlocked: "Potentially Blocked",
learnMore: "Learn more",
- whatAreThese: "What are these?",
// Quickstart
quickstartHeading: "Quickstart",
quickstartDescription:
@@ -101,22 +98,10 @@ const Loader = {
bridgeLocationFrequent: "Frequently selected locations",
bridgeLocationOther: "Other locations",
bridgeChooseForMe: "Choose a Bridge For Me…",
- bridgeCurrent: "Your Current Bridges",
- bridgeCurrentDescription:
- "You can keep one or more bridges saved, and Tor will choose which one to use when you connect. Tor will automatically switch to use another bridge when needed.",
- bridgeId: "%1$S bridge: %2$S",
currentBridge: "Current bridge",
- connectedBridge: "Connected",
remove: "Remove",
bridgeDisableBuiltIn: "Disable built-in bridges",
- bridgeShare:
- "Share this bridge using the QR code or by copying its address:",
- bridgeCopy: "Copy Bridge Address",
copied: "Copied!",
- bridgeShowAll: "Show All Bridges",
- bridgeShowFewer: "Show Fewer Bridges",
- allBridgesEnabled: "Use current bridges",
- bridgeRemoveAll: "Remove All Bridges",
bridgeRemoveAllDialogTitle: "Remove all bridges?",
bridgeRemoveAllDialogDescription:
"If these bridges were received from torproject.org or added manually, this action cannot be undone",
@@ -199,8 +184,6 @@ const Loader = {
...tsb.getStrings(strings),
learnMoreTorBrowserURL: "about:manual#about",
learnMoreBridgesURL: "about:manual#bridges",
- learnMoreBridgesCardURL: "about:manual#bridges_bridge-moji",
- learnMoreCircumventionURL: "about:manual#circumvention",
};
} /* Tor Network Settings Strings */,
=====================================
toolkit/torbutton/chrome/locale/en-US/settings.properties
=====================================
@@ -32,23 +32,11 @@ settings.bridgeLocationAutomatic=Automatic
settings.bridgeLocationFrequent=Frequently selected locations
settings.bridgeLocationOther=Other locations
settings.bridgeChooseForMe=Choose a Bridge For Me…
-settings.bridgeCurrent=Your Current Bridges
-settings.bridgeCurrentDescription=You can keep one or more bridges saved, and Tor will choose which one to use when you connect. Tor will automatically switch to use another bridge when needed.
-# Translation note: %1$S = bridge type; %2$S = bridge emoji id
-settings.bridgeId=%1$S bridge: %2$S
-settings.connectedBridge=Connected
settings.currentBridge=Current bridge
settings.remove=Remove
settings.bridgeDisableBuiltIn=Disable built-in bridges
-settings.bridgeShare=Share this bridge using the QR code or by copying its address:
-settings.whatAreThese=What are these?
-settings.bridgeCopy=Copy Bridge Address
settings.copied=Copied!
-settings.bridgeShowAll=Show All Bridges
-settings.bridgeShowFewer=Show Fewer Bridges
-settings.allBridgesEnabled=Use current bridges
-settings.bridgeRemoveAll=Remove All Bridges
settings.bridgeRemoveAllDialogTitle=Remove all bridges?
settings.bridgeRemoveAllDialogDescription=If these bridges were received from torproject.org or added manually, this action cannot be undone
settings.bridgeAdd=Add a New Bridge
@@ -121,3 +109,19 @@ settings.allowedPortsPlaceholder=Comma-separated values
# Log dialog
settings.torLogDialogTitle=Tor Logs
settings.copyLog=Copy Tor Log to Clipboard
+
+
+# TODO: Remove
+
+settings.bridgeCurrent=Your Current Bridges
+settings.bridgeCurrentDescription=You can keep one or more bridges saved, and Tor will choose which one to use when you connect. Tor will automatically switch to use another bridge when needed.
+# Translation note: %1$S = bridge type; %2$S = bridge emoji id
+settings.bridgeId=%1$S bridge: %2$S
+settings.connectedBridge=Connected
+settings.bridgeShare=Share this bridge using the QR code or by copying its address:
+settings.whatAreThese=What are these?
+settings.bridgeCopy=Copy Bridge Address
+settings.bridgeShowAll=Show All Bridges
+settings.bridgeShowFewer=Show Fewer Bridges
+settings.allBridgesEnabled=Use current bridges
+settings.bridgeRemoveAll=Remove All Bridges
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/cbeecf…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/cbeecf…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-update-responses][main] release: new version, 13.0.9
by richard (@richard) 23 Jan '24
by richard (@richard) 23 Jan '24
23 Jan '24
richard pushed to branch main at The Tor Project / Applications / Tor Browser update responses
Commits:
870a5f0b by Richard Pospesel at 2024-01-23T13:22:31+00:00
release: new version, 13.0.9
- - - - -
20 changed files:
- update_3/release/13.0.6-13.0.9-linux-i686-ALL.xml
- update_3/release/13.0.6-13.0.9-linux-x86_64-ALL.xml
- update_3/release/13.0.6-13.0.9-macos-ALL.xml
- update_3/release/13.0.6-13.0.9-windows-i686-ALL.xml
- update_3/release/13.0.6-13.0.9-windows-x86_64-ALL.xml
- update_3/release/13.0.7-13.0.9-linux-i686-ALL.xml
- update_3/release/13.0.7-13.0.9-linux-x86_64-ALL.xml
- update_3/release/13.0.7-13.0.9-macos-ALL.xml
- update_3/release/13.0.7-13.0.9-windows-i686-ALL.xml
- update_3/release/13.0.7-13.0.9-windows-x86_64-ALL.xml
- update_3/release/13.0.8-13.0.9-linux-i686-ALL.xml
- update_3/release/13.0.8-13.0.9-linux-x86_64-ALL.xml
- update_3/release/13.0.8-13.0.9-macos-ALL.xml
- update_3/release/13.0.8-13.0.9-windows-i686-ALL.xml
- update_3/release/13.0.8-13.0.9-windows-x86_64-ALL.xml
- update_3/release/13.0.9-linux-i686-ALL.xml
- update_3/release/13.0.9-linux-x86_64-ALL.xml
- update_3/release/13.0.9-macos-ALL.xml
- update_3/release/13.0.9-windows-i686-ALL.xml
- update_3/release/13.0.9-windows-x86_64-ALL.xml
Changes:
=====================================
update_3/release/13.0.6-13.0.9-linux-i686-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-i686-13…" hashFunction="SHA512" hashValue="d36e7dd3a39de83fb9a71fd5a8b7262aca98bb97953287fe9a3ab90c0a95ad97c40d240834d702b57182b599efc21f92aa15b6b62f5e180f0617d8fb678e035e" size="121912046" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-i686--1…" hashFunction="SHA512" hashValue="e347bbb01cab053e900bece0cc37f4b80170c5ccdfd41504d88ad3c9b1cfd9eda836257db99f8311ad7f2974c52293c38280be9cc2c28392aa491f1b883c25c4" size="14969289" type="partial"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-i686-13…" hashFunction="SHA512" hashValue="09f66723dade529f77267546a8cab70bb71c8621bc7c67e7975ce67139c0f8b305125b4cf38b4a77cea4182c382a215013ac718dc6ee3561b3046266f2d234c8" size="121912074" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-i686--1…" hashFunction="SHA512" hashValue="b539153addf108f35781a2564a84f659a42fc0c01fdc5f05b50747abc4eafefa4a5630918d82e502421fb56c24d9307c3d50f00dfb8ba5d22dbb7c6d8dc0ef58" size="14969329" type="partial"></patch></update></updates>
=====================================
update_3/release/13.0.6-13.0.9-linux-x86_64-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-x86_64-…" hashFunction="SHA512" hashValue="4c26112f794839450194bac302923e4fe8f4f9d15568b638b876760ed064e21f1c1eae0262f8b68d628e4ea78ad0466b4e841b859dc6183da1caf9d622590597" size="121131338" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-x86_64-…" hashFunction="SHA512" hashValue="4a4d0aa0fe3ff7ba342286a08af1dff0b024fb6db37b43f31b481f4148364ce833d7c48de8eb4a1831244968225a8473077d4cea4cd14a306b3dac2fc67bc397" size="14359671" type="partial"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-x86_64-…" hashFunction="SHA512" hashValue="d4f4a4a2a403dc597e475cc335a83e42774ff571baac4e1385e19a8d199a6fa9cae1ac42ee8d082b0ec01fb5e34f02c5482cd2723203c8d282c67349e43f5be8" size="121131366" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-x86_64-…" hashFunction="SHA512" hashValue="f4a2e180f439e1f94c2f8da7b1e46d6b35e2c77919ae0e65fc3fcfbc2d89ab565e28e23c57a87980100ad9459863b7eaf7e6258443ff61a444691ffb4af51291" size="14359711" type="partial"></patch></update></updates>
=====================================
update_3/release/13.0.6-13.0.9-macos-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-macos-13.0.9_…" hashFunction="SHA512" hashValue="86aaf0b4deb8eab82620ceb4829783e652735174e1106e92981aeb2ad7c5eeb576fbef9114d75f038ff26ae67bdc3e74c042677d28e18174d5ac1447b9cff0fe" size="169201961" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-macos--13.0.6…" hashFunction="SHA512" hashValue="bafe6b8d4b68915b41e16a31b44ad1237841d234c5f39546d1a09f7f251f4e2d79c1be5eaccbb7216887603931b850a151000869ca302b6bb7a2b3f5b8d58db3" size="46429595" type="partial"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-macos-13.0.9_…" hashFunction="SHA512" hashValue="b407a03608c5b816ab80cce5866d8126eabc68796cb022dafcb9b80f654aafe56eceb0f30477007f930ee8392c06817c5ce0873124cf325238ed6246eee6d870" size="169203413" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-macos--13.0.6…" hashFunction="SHA512" hashValue="d6b0de2b7d506ecde5f393a10d3392ceb9dd28bd7e9d75242b9a2a069257518c86d776602af374eae9bbf8d49f9cbb3a379561f8691f46ad36904d94ef2b07e2" size="46430283" type="partial"></patch></update></updates>
=====================================
update_3/release/13.0.6-13.0.9-windows-i686-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-i686-…" hashFunction="SHA512" hashValue="475cd3c2d31d174fbd30ac592da6d4b9257c61baf09832903bc07a5dac55089131738e3edbc2def7561c6477a2d3db78857249337496473be57c966b7ef809a7" size="109175033" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-i686-…" hashFunction="SHA512" hashValue="82084ddf48c29805bfdf7d7c56282018915cbbaebcfa3710428bcd9e023f17a1b9c7013f1c211b4144142face81edc19214f2c1a9de5bcd02a7c7307ae53331e" size="21150270" type="partial"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-i686-…" hashFunction="SHA512" hashValue="a220ac388f2974ee8c8f4162f6d3258ba3412875d1fd5bb0e7c52cf01fcbbcb548e2875753807c3b8a7feef4b01788940d7dd506343c3b817fbc7b419848db8b" size="109175061" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-i686-…" hashFunction="SHA512" hashValue="08db2cfaadd37427cae650fcd1a2cd884b3b5124a2004bfeea8633a810b31fca142160e2495d06ec73fe6370e6edeb1df7d6c9c781531fa55d91908a66d8ddda" size="21150310" type="partial"></patch></update></updates>
=====================================
update_3/release/13.0.6-13.0.9-windows-x86_64-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-x86_6…" hashFunction="SHA512" hashValue="d196e644f3a75bd877219c1e1e2fc070affdb312826696dc928e2fdec3d6bc513dfb7aac005b115192446a56ab188649accf3c89ec729855176e87af82c6915e" size="109340435" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-x86_6…" hashFunction="SHA512" hashValue="8f48e537a44c0a506c7d5004b8cc4bac4f9ba503a1303935b7ee250396bca84ad34d739c8fcacf7800098c9776d8eec845900145ae86093e7da590d384f1be6b" size="20153176" type="partial"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-x86_6…" hashFunction="SHA512" hashValue="071dc63319396dfe4a835d57646a4dcae73942d10a1b11f3967494d3a92e16664c9bc77127a5ffee357b7b32bc73ba3bf7665a40208f90e94093238e2a0e4bb2" size="109340463" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-x86_6…" hashFunction="SHA512" hashValue="1b78269c4d8c9a8522ab29eda37ba4efed7f472320411703247f5b9019f3c558ac2026b4eaab8c8b239599d6d4df5944aa48a0de5757d4784dc0c0b021810793" size="20153216" type="partial"></patch></update></updates>
=====================================
update_3/release/13.0.7-13.0.9-linux-i686-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-i686-13…" hashFunction="SHA512" hashValue="d36e7dd3a39de83fb9a71fd5a8b7262aca98bb97953287fe9a3ab90c0a95ad97c40d240834d702b57182b599efc21f92aa15b6b62f5e180f0617d8fb678e035e" size="121912046" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-i686--1…" hashFunction="SHA512" hashValue="7a2865c0f36bfde2084de0e9f7a35ecfa0c5850ef3e79b3d3b2a4fe13bb79681059c515722ae46dd46d3ee904a9d33309f15c57654ffcfbe374b14ffd4064258" size="11560810" type="partial"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-i686-13…" hashFunction="SHA512" hashValue="09f66723dade529f77267546a8cab70bb71c8621bc7c67e7975ce67139c0f8b305125b4cf38b4a77cea4182c382a215013ac718dc6ee3561b3046266f2d234c8" size="121912074" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-i686--1…" hashFunction="SHA512" hashValue="26ab2df3f8c18c92a7b5c8af181fbfd697d97e9164d9f820056a5c3ce97c63dcb0c6dd76708232fcc37387324fd0c0f0d57b708f91aae3d82b5e958fb072b127" size="11560838" type="partial"></patch></update></updates>
=====================================
update_3/release/13.0.7-13.0.9-linux-x86_64-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-x86_64-…" hashFunction="SHA512" hashValue="4c26112f794839450194bac302923e4fe8f4f9d15568b638b876760ed064e21f1c1eae0262f8b68d628e4ea78ad0466b4e841b859dc6183da1caf9d622590597" size="121131338" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-x86_64-…" hashFunction="SHA512" hashValue="84c5ae313b6df6d901cdd08ec852deaaf8a89beeda1b3b53076e045fc06fdee36e48932a3c3321e6445b3c382ca489f8f1883959ed7c6a4603bd594a39312ecc" size="11429422" type="partial"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-x86_64-…" hashFunction="SHA512" hashValue="d4f4a4a2a403dc597e475cc335a83e42774ff571baac4e1385e19a8d199a6fa9cae1ac42ee8d082b0ec01fb5e34f02c5482cd2723203c8d282c67349e43f5be8" size="121131366" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-x86_64-…" hashFunction="SHA512" hashValue="611af646854a54d98ede8da1d9a72e445c91d68b70b5bd697dede7bc399c5cf6c32b1b7c518e8312a27caf283a7283df0677f9d140e01c4e3eb2e80e9dd8de8c" size="11429450" type="partial"></patch></update></updates>
=====================================
update_3/release/13.0.7-13.0.9-macos-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-macos-13.0.9_…" hashFunction="SHA512" hashValue="86aaf0b4deb8eab82620ceb4829783e652735174e1106e92981aeb2ad7c5eeb576fbef9114d75f038ff26ae67bdc3e74c042677d28e18174d5ac1447b9cff0fe" size="169201961" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-macos--13.0.7…" hashFunction="SHA512" hashValue="0869d892ac0f2014534f46456668f8ce8595391afa8b3c28c5983cd71f08214b9a164f1c7d7367378f5b5f3b4e4e1f4d2f4a417487f29165f71f5c15bde28b54" size="42821574" type="partial"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-macos-13.0.9_…" hashFunction="SHA512" hashValue="b407a03608c5b816ab80cce5866d8126eabc68796cb022dafcb9b80f654aafe56eceb0f30477007f930ee8392c06817c5ce0873124cf325238ed6246eee6d870" size="169203413" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-macos--13.0.7…" hashFunction="SHA512" hashValue="324eb7c8ed16e5eb6c455447e3bcd7bcb1387d27764901b99ddce24ab5e653dc9cd6db7f2164c4e295b71d772edf574c16e81a9235ba1cecc1b7f89fd4482d32" size="42827222" type="partial"></patch></update></updates>
=====================================
update_3/release/13.0.7-13.0.9-windows-i686-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-i686-…" hashFunction="SHA512" hashValue="475cd3c2d31d174fbd30ac592da6d4b9257c61baf09832903bc07a5dac55089131738e3edbc2def7561c6477a2d3db78857249337496473be57c966b7ef809a7" size="109175033" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-i686-…" hashFunction="SHA512" hashValue="25cf3385153b06ab684a4a2454cc44d57518caa7cabd3dede389dad686932dbc477d40165de8b2d954d43973e5065046aa380f9cc0542e48ce3e7b926037642b" size="18349134" type="partial"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-i686-…" hashFunction="SHA512" hashValue="a220ac388f2974ee8c8f4162f6d3258ba3412875d1fd5bb0e7c52cf01fcbbcb548e2875753807c3b8a7feef4b01788940d7dd506343c3b817fbc7b419848db8b" size="109175061" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-i686-…" hashFunction="SHA512" hashValue="529d6c756a630f146534ffef87ab538c0ac2534c8e4b44b7fac2e96c0032ccb31b24953c8443626e028d07cc005d8d31a86adefd9a0ad8a6dbfd93f7066697b1" size="18349162" type="partial"></patch></update></updates>
=====================================
update_3/release/13.0.7-13.0.9-windows-x86_64-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-x86_6…" hashFunction="SHA512" hashValue="d196e644f3a75bd877219c1e1e2fc070affdb312826696dc928e2fdec3d6bc513dfb7aac005b115192446a56ab188649accf3c89ec729855176e87af82c6915e" size="109340435" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-x86_6…" hashFunction="SHA512" hashValue="0cb6d22edfeb0af7830a1ea86ea83314e620b04dc74e4ae3216011c72e31121fd130b4ec3ccb6af89e4269ca048d60efdb4a885c7d53c35eace2a0ee010d0c04" size="17160296" type="partial"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-x86_6…" hashFunction="SHA512" hashValue="071dc63319396dfe4a835d57646a4dcae73942d10a1b11f3967494d3a92e16664c9bc77127a5ffee357b7b32bc73ba3bf7665a40208f90e94093238e2a0e4bb2" size="109340463" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-x86_6…" hashFunction="SHA512" hashValue="2fe6e0d4b0618d7a41a4d5604b1934d303531229475d8f7f62dc3914e4e0846a5abbf4e0238685ce9ddd013a805ce431b6d362c512ae4f102cc30b666eb63a72" size="17160324" type="partial"></patch></update></updates>
=====================================
update_3/release/13.0.8-13.0.9-linux-i686-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-i686-13…" hashFunction="SHA512" hashValue="d36e7dd3a39de83fb9a71fd5a8b7262aca98bb97953287fe9a3ab90c0a95ad97c40d240834d702b57182b599efc21f92aa15b6b62f5e180f0617d8fb678e035e" size="121912046" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-i686--1…" hashFunction="SHA512" hashValue="6ca7d353bf303a2302ef050cadf092920248a2601c3d9322bd59403679305319e502b4c916ac5f9d52733dba07883b9d0a086087e5a9ab40be35a81044503060" size="11561086" type="partial"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-i686-13…" hashFunction="SHA512" hashValue="09f66723dade529f77267546a8cab70bb71c8621bc7c67e7975ce67139c0f8b305125b4cf38b4a77cea4182c382a215013ac718dc6ee3561b3046266f2d234c8" size="121912074" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-i686--1…" hashFunction="SHA512" hashValue="45d8f7cc409b94494e3bc8c5c205df499207bd768ad3a73fe2750316e886fca9a13f519c1d06de149e2b346b7049c4d651b2403bc670a2659241ac5e0e305a52" size="11561126" type="partial"></patch></update></updates>
=====================================
update_3/release/13.0.8-13.0.9-linux-x86_64-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-x86_64-…" hashFunction="SHA512" hashValue="4c26112f794839450194bac302923e4fe8f4f9d15568b638b876760ed064e21f1c1eae0262f8b68d628e4ea78ad0466b4e841b859dc6183da1caf9d622590597" size="121131338" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-x86_64-…" hashFunction="SHA512" hashValue="a487a662396760fb53c492fea9b5420866b6be2f2aa7a02fa79d1069caab63d484174f05c0917d48c64e55dcc36f7e0c38e34c12bb6b9f90652d82d25d57b4b4" size="11431798" type="partial"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-x86_64-…" hashFunction="SHA512" hashValue="d4f4a4a2a403dc597e475cc335a83e42774ff571baac4e1385e19a8d199a6fa9cae1ac42ee8d082b0ec01fb5e34f02c5482cd2723203c8d282c67349e43f5be8" size="121131366" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-x86_64-…" hashFunction="SHA512" hashValue="f472d50fbb16f21feb5f4a941af2fe22ac002b562b599a6c42f3e497a142bbf19388a7577475fddabfaf7eb05a02b65693b9a08857cda839d108f2cdbd568372" size="11431838" type="partial"></patch></update></updates>
=====================================
update_3/release/13.0.8-13.0.9-macos-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-macos-13.0.9_…" hashFunction="SHA512" hashValue="86aaf0b4deb8eab82620ceb4829783e652735174e1106e92981aeb2ad7c5eeb576fbef9114d75f038ff26ae67bdc3e74c042677d28e18174d5ac1447b9cff0fe" size="169201961" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-macos--13.0.8…" hashFunction="SHA512" hashValue="b31ee3228b074853fa531d53d09994aacb2d25e5e64e2da69befb06f7dfc191f43268c60cec6cbdf84b6b3624f75483f8f7e5d36d6b0532314bd84dd50ee0088" size="42830202" type="partial"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-macos-13.0.9_…" hashFunction="SHA512" hashValue="b407a03608c5b816ab80cce5866d8126eabc68796cb022dafcb9b80f654aafe56eceb0f30477007f930ee8392c06817c5ce0873124cf325238ed6246eee6d870" size="169203413" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-macos--13.0.8…" hashFunction="SHA512" hashValue="0305411dfdc93affa9d052bc8772acf66b63f5d48b5a76511eebc2e8ad9e27baa273d711c7e2eb7822b1fcdba3308d8a7fccf7934a8d3f48555757c7f6afeea0" size="42822506" type="partial"></patch></update></updates>
=====================================
update_3/release/13.0.8-13.0.9-windows-i686-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-i686-…" hashFunction="SHA512" hashValue="475cd3c2d31d174fbd30ac592da6d4b9257c61baf09832903bc07a5dac55089131738e3edbc2def7561c6477a2d3db78857249337496473be57c966b7ef809a7" size="109175033" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-i686-…" hashFunction="SHA512" hashValue="4067411ab90cb78f4045874d7b90ad69637fe351feba220e00cd56025408f8d43fa1a682e8b7ecf32fe0b8313b82516dffb231065a3b94f8b4fc6f1806c75e89" size="13209426" type="partial"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-i686-…" hashFunction="SHA512" hashValue="a220ac388f2974ee8c8f4162f6d3258ba3412875d1fd5bb0e7c52cf01fcbbcb548e2875753807c3b8a7feef4b01788940d7dd506343c3b817fbc7b419848db8b" size="109175061" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-i686-…" hashFunction="SHA512" hashValue="541a6cf4ddcbed4877e93b7721fffa05caeba48a12619fcdb784a1ea19c989efa0dfce25547500330bf54bb4a182df6dd5a5c3e48f8238ee16eb79d2475066ed" size="13209466" type="partial"></patch></update></updates>
=====================================
update_3/release/13.0.8-13.0.9-windows-x86_64-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-x86_6…" hashFunction="SHA512" hashValue="d196e644f3a75bd877219c1e1e2fc070affdb312826696dc928e2fdec3d6bc513dfb7aac005b115192446a56ab188649accf3c89ec729855176e87af82c6915e" size="109340435" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-x86_6…" hashFunction="SHA512" hashValue="df61d91b79ca5a77df1144be8dbb874d8d60cd30b87ea46ec4583294d5bc5e0694c049f6de6a740db5093fa98e6720f77b4918f49c5f8e69d0bbc13f5fb7260e" size="11908612" type="partial"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-x86_6…" hashFunction="SHA512" hashValue="071dc63319396dfe4a835d57646a4dcae73942d10a1b11f3967494d3a92e16664c9bc77127a5ffee357b7b32bc73ba3bf7665a40208f90e94093238e2a0e4bb2" size="109340463" type="complete"></patch><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-x86_6…" hashFunction="SHA512" hashValue="824c8d9a0d6d4b5741c6725ff15914c79c17d378c941d44e4e27e11557b148a1c62cd49376581ca74a22eb044f64978734974d1456a6a5cd34c0f1241707a9bd" size="11908652" type="partial"></patch></update></updates>
=====================================
update_3/release/13.0.9-linux-i686-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-i686-13…" hashFunction="SHA512" hashValue="d36e7dd3a39de83fb9a71fd5a8b7262aca98bb97953287fe9a3ab90c0a95ad97c40d240834d702b57182b599efc21f92aa15b6b62f5e180f0617d8fb678e035e" size="121912046" type="complete"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-i686-13…" hashFunction="SHA512" hashValue="09f66723dade529f77267546a8cab70bb71c8621bc7c67e7975ce67139c0f8b305125b4cf38b4a77cea4182c382a215013ac718dc6ee3561b3046266f2d234c8" size="121912074" type="complete"></patch></update></updates>
=====================================
update_3/release/13.0.9-linux-x86_64-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-x86_64-…" hashFunction="SHA512" hashValue="4c26112f794839450194bac302923e4fe8f4f9d15568b638b876760ed064e21f1c1eae0262f8b68d628e4ea78ad0466b4e841b859dc6183da1caf9d622590597" size="121131338" type="complete"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-linux-x86_64-…" hashFunction="SHA512" hashValue="d4f4a4a2a403dc597e475cc335a83e42774ff571baac4e1385e19a8d199a6fa9cae1ac42ee8d082b0ec01fb5e34f02c5482cd2723203c8d282c67349e43f5be8" size="121131366" type="complete"></patch></update></updates>
=====================================
update_3/release/13.0.9-macos-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-macos-13.0.9_…" hashFunction="SHA512" hashValue="86aaf0b4deb8eab82620ceb4829783e652735174e1106e92981aeb2ad7c5eeb576fbef9114d75f038ff26ae67bdc3e74c042677d28e18174d5ac1447b9cff0fe" size="169201961" type="complete"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-macos-13.0.9_…" hashFunction="SHA512" hashValue="b407a03608c5b816ab80cce5866d8126eabc68796cb022dafcb9b80f654aafe56eceb0f30477007f930ee8392c06817c5ce0873124cf325238ed6246eee6d870" size="169203413" type="complete"></patch></update></updates>
=====================================
update_3/release/13.0.9-windows-i686-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-i686-…" hashFunction="SHA512" hashValue="475cd3c2d31d174fbd30ac592da6d4b9257c61baf09832903bc07a5dac55089131738e3edbc2def7561c6477a2d3db78857249337496473be57c966b7ef809a7" size="109175033" type="complete"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-i686-…" hashFunction="SHA512" hashValue="a220ac388f2974ee8c8f4162f6d3258ba3412875d1fd5bb0e7c52cf01fcbbcb548e2875753807c3b8a7feef4b01788940d7dd506343c3b817fbc7b419848db8b" size="109175061" type="complete"></patch></update></updates>
=====================================
update_3/release/13.0.9-windows-x86_64-ALL.xml
=====================================
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-x86_6…" hashFunction="SHA512" hashValue="d196e644f3a75bd877219c1e1e2fc070affdb312826696dc928e2fdec3d6bc513dfb7aac005b115192446a56ab188649accf3c89ec729855176e87af82c6915e" size="109340435" type="complete"></patch></update></updates>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174022" detailsURL="https://blog.torproject.org/new-release-tor-browser-1309" actions="showURL" openURL="https://blog.torproject.org/new-release-tor-browser-1309" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.torproject.org/aus1/torbrowser/13.0.9/tor-browser-windows-x86_6…" hashFunction="SHA512" hashValue="071dc63319396dfe4a835d57646a4dcae73942d10a1b11f3967494d3a92e16664c9bc77127a5ffee357b7b32bc73ba3bf7665a40208f90e94093238e2a0e4bb2" size="109340463" type="complete"></patch></update></updates>
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-update-responses…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-update-responses…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build] Pushed new tag tbb-13.0.9-build2
by richard (@richard) 23 Jan '24
by richard (@richard) 23 Jan '24
23 Jan '24
richard pushed new tag tbb-13.0.9-build2 at The Tor Project / Applications / tor-browser-build
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/tree/tbb…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][maint-13.0] Bug 41055: Prepare Tor Browser Stable 13.0.9
by richard (@richard) 23 Jan '24
by richard (@richard) 23 Jan '24
23 Jan '24
richard pushed to branch maint-13.0 at The Tor Project / Applications / tor-browser-build
Commits:
e5f6056c by Richard Pospesel at 2024-01-23T10:58:37+00:00
Bug 41055: Prepare Tor Browser Stable 13.0.9
- add tor-browser-build#41066 to changelog
- - - - -
2 changed files:
- projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt
- rbm.conf
Changes:
=====================================
projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt
=====================================
@@ -28,6 +28,8 @@ Tor Browser 13.0.9 - January 23 2024
* Bug 41016: Switch from bullseye to bookworm for desktop platforms [tor-browser-build]
* Windows
* Bug 41015: Enable std::filesystem on libc++ on Windows [tor-browser-build]
+ * Android
+ * Bug 41066: The Android x86 APK for 13.0.9 is too big [tor-browser-build]
Tor Browser 13.5a3 - December 22 2023
* All Platforms
=====================================
rbm.conf
=====================================
@@ -82,7 +82,7 @@ buildconf:
var:
torbrowser_version: '13.0.9'
- torbrowser_build: 'build1'
+ torbrowser_build: 'build2'
torbrowser_incremental_from:
- '[% IF c("var/tor-browser") %]13.0.8[% END %]'
- '13.0.7'
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/e…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/e…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][maint-13.0] Bug 41066: Compress the APKs more
by richard (@richard) 23 Jan '24
by richard (@richard) 23 Jan '24
23 Jan '24
richard pushed to branch maint-13.0 at The Tor Project / Applications / tor-browser-build
Commits:
4ae6c26c by Pier Angelo Vendrame at 2024-01-23T10:48:57+01:00
Bug 41066: Compress the APKs more
Our APK was refused by the Play Store as too big.
As a workaround, for this release we can try to compress the APK more,
by extracting it and repacking it with 7-zip.
The preferred and long-term solution would be to switch to Android App
Bundles, but this might require some changes to our signing scripts.
- - - - -
2 changed files:
- projects/browser/build.android
- projects/browser/config
Changes:
=====================================
projects/browser/build.android
=====================================
@@ -31,13 +31,19 @@ mv $rootdir/[% c('input_files_by_name/noscript') %] "$noscript_path"
mv $rootdir/allowed_addons.json $assets_dir/allowed_addons.json
-[% c('zip', {
- zip_src => [ '$assets_dir' ],
- zip_args => '$apk',
- }) %]
+mkdir apk
+pushd apk
+7zz x "$apk"
+cp -R ../assets ./
+find -type f -exec touch -m -t '[% USE date; date.format(pc("firefox-android", "timestamp"), format = "%Y%m%d%H%M") %]' {} \;
+find -type f ! -name resources.arsc -printf '%P\n' | sort > ../files.txt
+7zz a -tzip -mx9 -mtc- -spf ../repacked.apk @../files.txt
+# resources.arsc must not be compressed as per the APK specifications
+7zz a -tzip -mm=Copy -mtc- ../repacked.apk resources.arsc
+popd
aligned_apk=$(basename $apk .apk)_aligned.apk
-zipalign -vp 4 $apk $aligned_apk
+zipalign -vp 4 repacked.apk $aligned_apk
# Sign a QA build. This .apk is not a debug version and doesn't contain a debug
# flag in the manifest.
=====================================
projects/browser/config
=====================================
@@ -46,7 +46,13 @@ targets:
var:
verify_allowed_addons: 1
arch_deps:
- - openjdk-11-jdk-headless
+ - 7zip
+ - openjdk-17-jdk-headless
+ container:
+ # 7zip is in backports in bullseye, and we can already use Java 17 for
+ # apksigner.
+ suite: bookworm
+ arch: amd64
torbrowser:
var:
prefs_file: 000-tor-browser.js
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/4…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/4…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Enable the connect assist experiments on alpha
by Pier Angelo Vendrame (@pierov) 23 Jan '24
by Pier Angelo Vendrame (@pierov) 23 Jan '24
23 Jan '24
Pier Angelo Vendrame pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android
Commits:
47c80363 by clairehurst at 2024-01-22T12:30:48-07:00
fixup! Enable the connect assist experiments on alpha
- - - - -
1 changed file:
- fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
Changes:
=====================================
fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
=====================================
@@ -1213,19 +1213,22 @@ abstract class BaseBrowserFragment :
}
private fun handleBetaHtmlTorConnect() {
- if (getCurrentTab()?.content?.url == "about:torconnect") {
+ val currentTab = getCurrentTab() ?: return
+ if (currentTab.content.url == "about:torconnect") {
if (!requireActivity().settings().useNewBootstrap) {
- requireContext().components.useCases.tabsUseCases.removeAllTabs()
+ requireContext().components.useCases.tabsUseCases.removeTab(currentTab.id)
(requireActivity() as HomeActivity).navHost.navController.navigate(
NavGraphDirections.actionStartupTorbootstrap(),
)
} else if (!requireActivity().settings().useNewBootstrapHtmlUi) {
- requireContext().components.useCases.tabsUseCases.removeAllTabs()
+ requireContext().components.useCases.tabsUseCases.removeTab(currentTab.id)
(requireActivity() as HomeActivity).navigateToHome()
} else {
// This just makes it not flash (be visible for a split second) before handleTabSelected() hides it again
browserToolbarView.view.visibility = View.GONE
}
+ } else if (currentTab.content.url == "about:tor") {
+ requireContext().components.useCases.tabsUseCases.removeTab(currentTab.id)
}
}
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/47c…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/47c…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser][mullvad-browser-115.7.0esr-13.5-1] Bug 1867408 - NSS backport
by ma1 (@ma1) 22 Jan '24
by ma1 (@ma1) 22 Jan '24
22 Jan '24
ma1 pushed to branch mullvad-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser
Commits:
00f5c6d8 by hackademix at 2024-01-22T17:00:26+01:00
Bug 1867408 - NSS backport
- - - - -
1 changed file:
- security/nss/lib/ssl/sslsecur.c
Changes:
=====================================
security/nss/lib/ssl/sslsecur.c
=====================================
@@ -488,7 +488,12 @@ ssl_SendSavedWriteData(sslSocket *ss)
if (rv < 0) {
return rv;
}
- ss->pendingBuf.len -= rv;
+ if (rv > ss->pendingBuf.len) {
+ PORT_Assert(0); /* This shouldn't happen */
+ ss->pendingBuf.len = 0;
+ } else {
+ ss->pendingBuf.len -= rv;
+ }
if (ss->pendingBuf.len > 0 && rv > 0) {
/* UGH !! This shifts the whole buffer down by copying it */
PORT_Memmove(ss->pendingBuf.buf, ss->pendingBuf.buf + rv,
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/00f…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/00f…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser][mullvad-browser-115.7.0esr-13.0-1] Bug 1867408 - NSS backport
by ma1 (@ma1) 22 Jan '24
by ma1 (@ma1) 22 Jan '24
22 Jan '24
ma1 pushed to branch mullvad-browser-115.7.0esr-13.0-1 at The Tor Project / Applications / Mullvad Browser
Commits:
e0af4349 by hackademix at 2024-01-22T16:57:26+01:00
Bug 1867408 - NSS backport
- - - - -
1 changed file:
- security/nss/lib/ssl/sslsecur.c
Changes:
=====================================
security/nss/lib/ssl/sslsecur.c
=====================================
@@ -488,7 +488,12 @@ ssl_SendSavedWriteData(sslSocket *ss)
if (rv < 0) {
return rv;
}
- ss->pendingBuf.len -= rv;
+ if (rv > ss->pendingBuf.len) {
+ PORT_Assert(0); /* This shouldn't happen */
+ ss->pendingBuf.len = 0;
+ } else {
+ ss->pendingBuf.len -= rv;
+ }
if (ss->pendingBuf.len > 0 && rv > 0) {
/* UGH !! This shifts the whole buffer down by copying it */
PORT_Memmove(ss->pendingBuf.buf, ss->pendingBuf.buf + rv,
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/e0a…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/e0a…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][base-browser-115.7.0esr-13.5-1] Bug 1867408 - NSS backport
by ma1 (@ma1) 22 Jan '24
by ma1 (@ma1) 22 Jan '24
22 Jan '24
ma1 pushed to branch base-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
eed2de42 by hackademix at 2024-01-22T16:56:41+01:00
Bug 1867408 - NSS backport
- - - - -
1 changed file:
- security/nss/lib/ssl/sslsecur.c
Changes:
=====================================
security/nss/lib/ssl/sslsecur.c
=====================================
@@ -488,7 +488,12 @@ ssl_SendSavedWriteData(sslSocket *ss)
if (rv < 0) {
return rv;
}
- ss->pendingBuf.len -= rv;
+ if (rv > ss->pendingBuf.len) {
+ PORT_Assert(0); /* This shouldn't happen */
+ ss->pendingBuf.len = 0;
+ } else {
+ ss->pendingBuf.len -= rv;
+ }
if (ss->pendingBuf.len > 0 && rv > 0) {
/* UGH !! This shifts the whole buffer down by copying it */
PORT_Memmove(ss->pendingBuf.buf, ss->pendingBuf.buf + rv,
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/eed2de4…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/eed2de4…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][base-browser-115.7.0esr-13.0-1] Bug 1867408 - NSS backport
by ma1 (@ma1) 22 Jan '24
by ma1 (@ma1) 22 Jan '24
22 Jan '24
ma1 pushed to branch base-browser-115.7.0esr-13.0-1 at The Tor Project / Applications / Tor Browser
Commits:
6c906dba by hackademix at 2024-01-22T16:46:05+01:00
Bug 1867408 - NSS backport
- - - - -
1 changed file:
- security/nss/lib/ssl/sslsecur.c
Changes:
=====================================
security/nss/lib/ssl/sslsecur.c
=====================================
@@ -488,7 +488,12 @@ ssl_SendSavedWriteData(sslSocket *ss)
if (rv < 0) {
return rv;
}
- ss->pendingBuf.len -= rv;
+ if (rv > ss->pendingBuf.len) {
+ PORT_Assert(0); /* This shouldn't happen */
+ ss->pendingBuf.len = 0;
+ } else {
+ ss->pendingBuf.len -= rv;
+ }
if (ss->pendingBuf.len > 0 && rv > 0) {
/* UGH !! This shifts the whole buffer down by copying it */
PORT_Memmove(ss->pendingBuf.buf, ss->pendingBuf.buf + rv,
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/6c906db…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/6c906db…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.7.0esr-13.5-1] Bug 1867408 - NSS backport
by ma1 (@ma1) 22 Jan '24
by ma1 (@ma1) 22 Jan '24
22 Jan '24
ma1 pushed to branch tor-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
cbeecf99 by hackademix at 2024-01-22T16:29:11+01:00
Bug 1867408 - NSS backport
- - - - -
1 changed file:
- security/nss/lib/ssl/sslsecur.c
Changes:
=====================================
security/nss/lib/ssl/sslsecur.c
=====================================
@@ -488,7 +488,12 @@ ssl_SendSavedWriteData(sslSocket *ss)
if (rv < 0) {
return rv;
}
- ss->pendingBuf.len -= rv;
+ if (rv > ss->pendingBuf.len) {
+ PORT_Assert(0); /* This shouldn't happen */
+ ss->pendingBuf.len = 0;
+ } else {
+ ss->pendingBuf.len -= rv;
+ }
if (ss->pendingBuf.len > 0 && rv > 0) {
/* UGH !! This shifts the whole buffer down by copying it */
PORT_Memmove(ss->pendingBuf.buf, ss->pendingBuf.buf + rv,
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/cbeecf9…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/cbeecf9…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-update-responses][main] release: new version, 13.0.9
by richard (@richard) 22 Jan '24
by richard (@richard) 22 Jan '24
22 Jan '24
richard pushed to branch main at The Tor Project / Applications / Tor Browser update responses
Commits:
dae6d47c by Richard Pospesel at 2024-01-22T14:57:04+00:00
release: new version, 13.0.9
- - - - -
30 changed files:
- update_3/release/.htaccess
- − update_3/release/13.0.5-13.0.8-linux-i686-ALL.xml
- − update_3/release/13.0.5-13.0.8-linux-x86_64-ALL.xml
- − update_3/release/13.0.5-13.0.8-macos-ALL.xml
- − update_3/release/13.0.5-13.0.8-windows-i686-ALL.xml
- − update_3/release/13.0.5-13.0.8-windows-x86_64-ALL.xml
- − update_3/release/13.0.6-13.0.8-linux-i686-ALL.xml
- − update_3/release/13.0.6-13.0.8-linux-x86_64-ALL.xml
- − update_3/release/13.0.6-13.0.8-macos-ALL.xml
- − update_3/release/13.0.6-13.0.8-windows-i686-ALL.xml
- − update_3/release/13.0.6-13.0.8-windows-x86_64-ALL.xml
- + update_3/release/13.0.6-13.0.9-linux-i686-ALL.xml
- + update_3/release/13.0.6-13.0.9-linux-x86_64-ALL.xml
- + update_3/release/13.0.6-13.0.9-macos-ALL.xml
- + update_3/release/13.0.6-13.0.9-windows-i686-ALL.xml
- + update_3/release/13.0.6-13.0.9-windows-x86_64-ALL.xml
- − update_3/release/13.0.7-13.0.8-linux-i686-ALL.xml
- − update_3/release/13.0.7-13.0.8-linux-x86_64-ALL.xml
- − update_3/release/13.0.7-13.0.8-macos-ALL.xml
- − update_3/release/13.0.7-13.0.8-windows-i686-ALL.xml
- − update_3/release/13.0.7-13.0.8-windows-x86_64-ALL.xml
- + update_3/release/13.0.7-13.0.9-linux-i686-ALL.xml
- + update_3/release/13.0.7-13.0.9-linux-x86_64-ALL.xml
- + update_3/release/13.0.7-13.0.9-macos-ALL.xml
- + update_3/release/13.0.7-13.0.9-windows-i686-ALL.xml
- + update_3/release/13.0.7-13.0.9-windows-x86_64-ALL.xml
- + update_3/release/13.0.8-13.0.9-linux-i686-ALL.xml
- + update_3/release/13.0.8-13.0.9-linux-x86_64-ALL.xml
- + update_3/release/13.0.8-13.0.9-macos-ALL.xml
- + update_3/release/13.0.8-13.0.9-windows-i686-ALL.xml
The diff was not included because it is too large.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-update-responses…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-update-responses…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.7.0esr-13.0-1] Bug 1867408 - NSS backport
by richard (@richard) 22 Jan '24
by richard (@richard) 22 Jan '24
22 Jan '24
richard pushed to branch tor-browser-115.7.0esr-13.0-1 at The Tor Project / Applications / Tor Browser
Commits:
734de07b by hackademix at 2024-01-19T22:48:05+01:00
Bug 1867408 - NSS backport
- - - - -
1 changed file:
- security/nss/lib/ssl/sslsecur.c
Changes:
=====================================
security/nss/lib/ssl/sslsecur.c
=====================================
@@ -488,7 +488,12 @@ ssl_SendSavedWriteData(sslSocket *ss)
if (rv < 0) {
return rv;
}
- ss->pendingBuf.len -= rv;
+ if (rv > ss->pendingBuf.len) {
+ PORT_Assert(0); /* This shouldn't happen */
+ ss->pendingBuf.len = 0;
+ } else {
+ ss->pendingBuf.len -= rv;
+ }
if (ss->pendingBuf.len > 0 && rv > 0) {
/* UGH !! This shifts the whole buffer down by copying it */
PORT_Memmove(ss->pendingBuf.buf, ss->pendingBuf.buf + rv,
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/734de07…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/734de07…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build] Pushed new tag tbb-13.0.9-build1
by richard (@richard) 19 Jan '24
by richard (@richard) 19 Jan '24
19 Jan '24
richard pushed new tag tbb-13.0.9-build1 at The Tor Project / Applications / tor-browser-build
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/tree/tbb…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][maint-13.0] Bug 41055: Prepare Tor Browser Stable 13.0.9
by richard (@richard) 19 Jan '24
by richard (@richard) 19 Jan '24
19 Jan '24
richard pushed to branch maint-13.0 at The Tor Project / Applications / tor-browser-build
Commits:
8d066a5c by Richard Pospesel at 2024-01-19T11:59:22+00:00
Bug 41055: Prepare Tor Browser Stable 13.0.9
- updated changelog
- - - - -
1 changed file:
- projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt
Changes:
=====================================
projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt
=====================================
@@ -3,7 +3,8 @@ Tor Browser 13.0.9 - January 23 2024
* Updated Snowflake to 2.8.1
* Bug 42363: Tab thumbnails enhancements [tor-browser]
* Bug 42365: Rebase Tor Browser Stable onto Firefox 115.7.0esr [tor-browser]
- * Bug 42367: Backport Android seucirty fixes from Firefox 122 [tor-browser]
+ * Bug 42367: Backport Android security fixes from Firefox 122 [tor-browser]
+ * Bug 42369: Revert YEC 2023 changes [tor-browser]
* Bug 41058: Update Snowflake to 2.8.1 [tor-browser-build]
* Windows + macOS + Linux
* Updated Firefox to 115.7.0esr
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/8…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/8…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/firefox-android] Pushed new tag firefox-android-115.2.1-13.0-1-build12
by richard (@richard) 19 Jan '24
by richard (@richard) 19 Jan '24
19 Jan '24
richard pushed new tag firefox-android-115.2.1-13.0-1-build12 at The Tor Project / Applications / firefox-android
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/tree/firef…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.0-1] fixup! Bug 42074: YEC 2023 Android
by Dan Ballard (@dan) 18 Jan '24
by Dan Ballard (@dan) 18 Jan '24
18 Jan '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.0-1 at The Tor Project / Applications / firefox-android
Commits:
f80ca9bc by Pier Angelo Vendrame at 2024-01-16T15:06:15+01:00
fixup! Bug 42074: YEC 2023 Android
Revert "fixup! Bug 42074: YEC 2023 Android"
This reverts commit 19ec8acc732943a2ddb154f735a3eab4d3fbda99.
Revert "Bug 42074: YEC 2023 Android"
This reverts commit 465ea2a837e49ba529605c0fa74e7130e93511ad.
- - - - -
12 changed files:
- fenix/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
- fenix/app/src/main/java/org/mozilla/fenix/theme/ThemeManager.kt
- fenix/app/src/main/java/org/mozilla/fenix/tor/TorBootstrapFragment.kt
- − fenix/app/src/main/res/drawable/tor_yec_donate_rounded_corners.xml
- − fenix/app/src/main/res/drawable/tor_yec_popup_rounded_corners.xml
- − fenix/app/src/main/res/drawable/yec_heart.xml
- − fenix/app/src/main/res/drawable/yec_illustration_android.xml
- − fenix/app/src/main/res/font/roboto_bold.ttf
- − fenix/app/src/main/res/font/roboto_regular.ttf
- fenix/app/src/main/res/layout/fragment_home.xml
- fenix/app/src/main/res/values/colors.xml
- fenix/app/src/main/res/values/styles.xml
Changes:
=====================================
fenix/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
=====================================
@@ -20,6 +20,8 @@ import android.widget.PopupWindow
import androidx.annotation.VisibleForTesting
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.ContextCompat
+import androidx.core.view.children
+import androidx.core.view.doOnLayout
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
@@ -61,8 +63,6 @@ import mozilla.components.lib.state.ext.consumeFrom
import mozilla.components.service.glean.private.NoExtras
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged
-import mozilla.components.support.locale.LocaleManager
-import org.mozilla.fenix.BrowserDirection
import org.mozilla.fenix.BuildConfig
import org.mozilla.fenix.GleanMetrics.HomeScreen
import org.mozilla.fenix.GleanMetrics.PrivateBrowsingShortcutCfr
@@ -112,7 +112,6 @@ import org.mozilla.fenix.perf.MarkersFragmentLifecycleCallbacks
import org.mozilla.fenix.perf.runBlockingIncrement
import org.mozilla.fenix.search.toolbar.DefaultSearchSelectorController
import org.mozilla.fenix.search.toolbar.SearchSelectorMenu
-import org.mozilla.fenix.settings.advanced.getSelectedLocale
import org.mozilla.fenix.tabstray.TabsTrayAccessPoint
import org.mozilla.fenix.tor.TorBootstrapFragmentDirections
import org.mozilla.fenix.tor.TorBootstrapStatus
@@ -121,8 +120,6 @@ import org.mozilla.fenix.utils.Settings.Companion.TOP_SITES_PROVIDER_MAX_THRESHO
import org.mozilla.fenix.utils.allowUndo
import org.mozilla.fenix.wallpapers.Wallpaper
import java.lang.ref.WeakReference
-import java.text.NumberFormat
-import java.util.Locale
import kotlin.math.min
@Suppress("TooManyFunctions", "LargeClass")
@@ -139,8 +136,6 @@ class HomeFragment : Fragment() {
private val homeViewModel: HomeScreenViewModel by activityViewModels()
- private var hideYEC = false
-
private val snackbarAnchorView: View?
get() = when (requireContext().settings().toolbarPosition) {
ToolbarPosition.BOTTOM -> binding.toolbarLayout
@@ -448,27 +443,6 @@ class HomeFragment : Fragment() {
FxNimbus.features.homescreen.recordExposure()
- controlYECDisplay()
-
- binding.donateNowButton.setOnClickListener {
- val country = LocaleManager.getSelectedLocale(requireContext()).country
- var locale = LocaleManager.getSelectedLocale(requireContext()).language
- if (country != "") {
- locale = "${locale}-${country}"
- }
- val localeUrl = "https://www.torproject.org/donate/2023yec-${locale}-mobile"
- activity.openToBrowserAndLoad(
- searchTermOrURL = localeUrl,
- newTab = true,
- from = BrowserDirection.FromHome
- )
- }
-
- binding.yecClose.setOnClickListener {
- this.hideYEC = true
- controlYECDisplay()
- }
-
// DO NOT MOVE ANYTHING BELOW THIS addMarker CALL!
requireComponents.core.engine.profiler?.addMarker(
MarkersFragmentLifecycleCallbacks.MARKER_NAME,
@@ -478,105 +452,6 @@ class HomeFragment : Fragment() {
return binding.root
}
- fun controlYECDisplay() {
- val yec23show = ((activity as? HomeActivity)?.themeManager?.isYECActive ?: false) && ! this.hideYEC
- val yec23matchingShow = ((activity as? HomeActivity)?.themeManager?.isYECPhase2Active ?: false) && ! this.hideYEC
-
- // hude onion pattern during EOY event
- binding.onionPatternImage.apply {
- visibility = if (!yec23show) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
-
- // Hide tor browser header EOY event
- binding.exploreprivately.apply {
- visibility = if (!yec23show) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
-
- // Hide EOY header text before EOY event
- binding.yecIntroText.apply {
- visibility = if (yec23show) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
-
- // Hide EOY matching announcement before its time
- binding.yecMatchingText.apply {
- visibility = if (yec23matchingShow) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
- binding.yecMatchingText.text = binding.yecMatchingText.text.replace(Regex("%s"), NumberFormat.getNumberInstance(Locale.getDefault()).format(75000))
-
- // Hide the EOY image before EOY event
- binding.yecIllustration.apply {
- visibility = if (yec23show) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
-
- binding.yecPleaseDonateText.apply {
- visibility = if (yec23show) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
- binding.yecFreeToUse.apply {
- visibility = if (yec23show) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
-
- // Hide the EOY donate button before EOY event
- binding.donateNowButton.apply {
- visibility = if (yec23show) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
-
- // Hide the EOY image before EOY event
- binding.yecPopup.apply {
- visibility = if (yec23show) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
-
- binding.exploreprivately.apply {
- visibility = if (yec23show) {
- View.GONE
- } else {
- View.VISIBLE
- }
- }
-
- binding.homeAppBar.apply {
- if (!yec23show){
- setExpanded(true, true)
- }
- }
-
- }
-
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
=====================================
fenix/app/src/main/java/org/mozilla/fenix/theme/ThemeManager.kt
=====================================
@@ -23,23 +23,11 @@ import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
import org.mozilla.fenix.customtabs.ExternalAppBrowserActivity
-import java.util.Date
abstract class ThemeManager {
- // 1696118400000 // 2022 10 04 - testing
- // 1697414400000 // 2023 10 16
- private val yec2023LaunchDate = Date(1697414400000)
- // 1700614800000 // 2023 11 22
- private val yec2023Phase2 = Date(1700614800000)
- // 1704067200000 // 2024 01 01
- private val yec2023EndDate = Date(1704067200000)
-
abstract var currentTheme: BrowsingMode
- val isYECActive get() = Date().after(yec2023LaunchDate) && Date().before(yec2023EndDate)
- val isYECPhase2Active get() = Date().after(yec2023Phase2) && Date().before(yec2023EndDate)
-
/**
* Returns the style resource corresponding to the [currentTheme].
*/
=====================================
fenix/app/src/main/java/org/mozilla/fenix/tor/TorBootstrapFragment.kt
=====================================
@@ -116,10 +116,6 @@ class TorBootstrapFragment : Fragment() {
binding.toolbarLayout.apply {
visibility = View.GONE
}
-
- binding.yecPopup.apply {
- visibility = View.GONE
- }
}
// This function should be paired with adjustHomeFragmentView()
=====================================
fenix/app/src/main/res/drawable/tor_yec_donate_rounded_corners.xml deleted
=====================================
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
- - License, v. 2.0. If a copy of the MPL was not distributed with this
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!-- Used for rounding the corners of a button -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <solid android:color="#FFBD4F" />
- <corners android:radius="10dp" />
-</shape>
=====================================
fenix/app/src/main/res/drawable/tor_yec_popup_rounded_corners.xml deleted
=====================================
@@ -1,5 +0,0 @@
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <solid android:color="#1F0333" />
- <corners android:radius="10dp" />
-</shape>
=====================================
fenix/app/src/main/res/drawable/yec_heart.xml deleted
=====================================
@@ -1,12 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="20dp"
- android:height="20dp"
- android:viewportWidth="16"
- android:viewportHeight="16">
- <path
- android:pathData="M8,6C8,6 8,2 11.5,2C15,2 15,5 15,6C15,10.5 8,15 8,15V6Z"
- android:fillColor="#1C1B22"/>
- <path
- android:pathData="M8,6C8,6 8,2 4.5,2C1,2 1,5 1,6C1,10.5 8,15 8,15L9,9L8,6Z"
- android:fillColor="#1C1B22"/>
-</vector>
=====================================
fenix/app/src/main/res/drawable/yec_illustration_android.xml deleted
=====================================
@@ -1,294 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="166dp"
- android:height="148dp"
- android:viewportWidth="166"
- android:viewportHeight="148">
- <path
- android:pathData="M126.13,91.93L125.73,68.74L130.04,68.67L130.44,91.98H131.45C131.55,88.57 134.35,85.84 137.78,85.84H151.17C154.68,85.84 157.51,88.68 157.51,92.18V99.25C157.51,102.73 154.69,105.55 151.21,105.55C147.73,105.55 144.91,102.73 144.91,99.25V98.32C144.91,97.2 144,96.29 142.88,96.29H130.51L130.6,101.24H131.24C134.74,101.24 137.58,104.08 137.58,107.58V112.36C137.58,115.86 134.74,118.7 131.24,118.7H130.89L131.15,134.12C131.22,137.68 128.3,140.57 124.78,140.57C121.3,140.57 118.41,137.75 118.41,134.22V120.73C118.41,117.23 121.25,114.39 124.75,114.39H126.51L126.36,105.55H120.12C116.61,105.55 113.78,102.71 113.78,99.21V87.67C113.78,84.69 116.19,82.28 119.16,82.28C122.14,82.28 124.55,84.69 124.55,87.67V89.95C124.55,90.91 125.22,91.72 126.13,91.93ZM126.2,96.28C122.88,96.08 120.24,93.32 120.24,89.95V87.67C120.24,87.07 119.76,86.59 119.16,86.59C118.57,86.59 118.08,87.07 118.08,87.67V99.21C118.08,100.33 118.99,101.24 120.12,101.24H126.29L126.2,96.28ZM130.67,105.55L130.82,114.39H131.24C132.37,114.39 133.27,113.48 133.27,112.36V107.58C133.27,106.46 132.37,105.55 131.24,105.55H130.67ZM126.58,118.7H124.75C123.63,118.7 122.72,119.61 122.72,120.73V134.22C122.72,135.32 123.64,136.26 124.78,136.26C125.94,136.26 126.86,135.3 126.85,134.19L126.58,118.7ZM135.76,91.98H142.88C146.38,91.98 149.22,94.82 149.22,98.32V99.25C149.22,100.35 150.11,101.24 151.21,101.24C152.31,101.24 153.21,100.35 153.21,99.25V92.18C153.21,91.06 152.29,90.15 151.17,90.15H137.78C136.73,90.15 135.86,90.95 135.76,91.98Z"
- android:strokeWidth="0.667939"
- android:fillColor="#F5F5F5"
- android:fillType="evenOdd"
- android:strokeColor="#F5F5F5"/>
- <path
- android:pathData="M128.04,91.89L127.64,68.71L131.95,68.64L132.35,91.94H133.35C133.46,88.53 136.26,85.8 139.69,85.8H153.08C156.58,85.8 159.42,88.64 159.42,92.14V99.21C159.42,102.69 156.6,105.52 153.12,105.52C149.64,105.52 146.82,102.69 146.82,99.21V98.28C146.82,97.16 145.91,96.25 144.79,96.25H132.42L132.51,101.21H133.15C136.65,101.21 139.49,104.05 139.49,107.55V112.32C139.49,115.82 136.65,118.66 133.15,118.66H132.8L133.06,134.08C133.12,137.65 130.21,140.53 126.69,140.53C123.21,140.53 120.32,137.71 120.32,134.19V120.69C120.32,117.19 123.15,114.35 126.66,114.35H128.42L128.27,105.52H122.03C118.52,105.52 115.68,102.68 115.68,99.17V87.63C115.68,84.66 118.1,82.25 121.07,82.25C124.04,82.25 126.46,84.66 126.46,87.63V89.91C126.46,90.88 127.13,91.69 128.04,91.89ZM128.11,96.24C124.78,96.04 122.15,93.29 122.15,89.91V87.63C122.15,87.04 121.67,86.56 121.07,86.56C120.47,86.56 119.99,87.04 119.99,87.63V99.17C119.99,100.3 120.9,101.21 122.03,101.21H128.2L128.11,96.24ZM132.58,105.52L132.73,114.35H133.15C134.27,114.35 135.18,113.44 135.18,112.32V107.55C135.18,106.43 134.27,105.52 133.15,105.52H132.58ZM128.49,118.66H126.66C125.54,118.66 124.63,119.57 124.63,120.69V134.19C124.63,135.29 125.55,136.22 126.69,136.22C127.85,136.22 128.77,135.27 128.76,134.15L128.49,118.66ZM137.67,91.94H144.79C148.29,91.94 151.13,94.78 151.13,98.28V99.21C151.13,100.31 152.02,101.21 153.12,101.21C154.22,101.21 155.11,100.31 155.11,99.21V92.14C155.11,91.02 154.2,90.11 153.08,90.11H139.69C138.64,90.11 137.77,90.91 137.67,91.94Z"
- android:strokeWidth="0.667939"
- android:fillColor="#1F0333"
- android:fillType="evenOdd"
- android:strokeColor="#F5F5F5"/>
- <path
- android:pathData="M93.9,101.29H93.56V101.63V103.55C93.56,104.84 94.61,105.89 95.91,105.89H100.17C103.5,105.89 106.2,108.59 106.2,111.92V118.45C106.2,121.78 103.5,124.48 100.17,124.48H94.71C93.84,124.48 93.13,125.19 93.13,126.06C93.13,126.93 93.84,127.64 94.71,127.64H100.17C103.5,127.64 106.2,130.34 106.2,133.67V134.17C106.2,137.5 103.5,140.2 100.17,140.2H63.16C59.83,140.2 57.13,137.5 57.13,134.17V130.84C57.13,127.51 59.83,124.82 63.16,124.82H64.81C66.1,124.82 67.15,123.77 67.15,122.47V121.78C67.15,120.49 66.1,119.44 64.81,119.44H63.16C59.83,119.44 57.13,116.74 57.13,113.41V111.06C57.13,107.72 59.83,105.03 63.16,105.03H70.02C71.31,105.03 72.36,103.98 72.36,102.68V101.63V101.29H72.03H68.87C65.54,101.29 62.84,98.6 62.84,95.27V93.36C62.84,90.03 65.54,87.33 68.87,87.33H70.02C73.35,87.33 76.05,90.03 76.05,93.36V97.28V97.61H76.38H89.55H89.88V97.28V91.35V91.02H89.55H87.06C83.73,91.02 81.03,88.32 81.03,84.99V69.52H84.71V84.99C84.71,86.29 85.76,87.33 87.06,87.33H97.91C101.24,87.33 103.94,90.03 103.94,93.36V95.27C103.94,98.6 101.24,101.29 97.91,101.29H93.9ZM93.56,97.28V97.61H93.9H97.91C99.2,97.61 100.25,96.56 100.25,95.27V93.36C100.25,92.07 99.2,91.02 97.91,91.02H93.9H93.56V91.35V97.28ZM76.38,101.29H76.05V101.63V102.68C76.05,106.01 73.35,108.71 70.02,108.71H63.16C61.86,108.71 60.81,109.76 60.81,111.06V113.41C60.81,114.7 61.86,115.75 63.16,115.75H64.81C68.13,115.75 70.83,118.45 70.83,121.78V122.47C70.83,125.8 68.13,128.5 64.81,128.5H63.16C61.86,128.5 60.81,129.55 60.81,130.84V134.17C60.81,135.46 61.86,136.51 63.16,136.51H100.17C101.47,136.51 102.51,135.46 102.51,134.17V133.67C102.51,132.37 101.47,131.32 100.17,131.32H94.71C91.81,131.32 89.45,128.97 89.45,126.06C89.45,123.15 91.81,120.8 94.71,120.8H100.17C101.47,120.8 102.51,119.75 102.51,118.45V111.92C102.51,110.63 101.47,109.58 100.17,109.58H95.91C92.58,109.58 89.88,106.88 89.88,103.55V101.63V101.29H89.55H76.38ZM72.03,97.61H72.36V97.28V93.36C72.36,92.07 71.31,91.02 70.02,91.02H68.87C67.57,91.02 66.52,92.07 66.52,93.36V95.27C66.52,96.56 67.57,97.61 68.87,97.61H72.03Z"
- android:strokeWidth="0.667939"
- android:fillColor="#F5F5F5"
- android:strokeColor="#F5F5F5"/>
- <path
- android:pathData="M95.81,101.29H95.47V101.63V103.55C95.47,104.84 96.52,105.89 97.82,105.89H102.08C105.41,105.89 108.11,108.59 108.11,111.92V118.45C108.11,121.78 105.41,124.48 102.08,124.48H96.62C95.75,124.48 95.04,125.19 95.04,126.06C95.04,126.93 95.75,127.64 96.62,127.64H102.08C105.41,127.64 108.11,130.34 108.11,133.67V134.17C108.11,137.5 105.41,140.2 102.08,140.2H65.07C61.74,140.2 59.04,137.5 59.04,134.17V130.84C59.04,127.51 61.74,124.82 65.07,124.82H66.71C68.01,124.82 69.06,123.77 69.06,122.47V121.78C69.06,120.49 68.01,119.44 66.71,119.44H65.07C61.74,119.44 59.04,116.74 59.04,113.41V111.06C59.04,107.72 61.74,105.03 65.07,105.03H71.93C73.22,105.03 74.27,103.98 74.27,102.68V101.63V101.29H73.94H70.78C67.45,101.29 64.75,98.6 64.75,95.27V93.36C64.75,90.03 67.45,87.33 70.78,87.33H71.93C75.26,87.33 77.96,90.03 77.96,93.36V97.28V97.61H78.29H91.45H91.79V97.28V91.35V91.02H91.45H88.96C85.64,91.02 82.94,88.32 82.94,84.99V69.52H86.62V84.99C86.62,86.29 87.67,87.33 88.96,87.33H99.82C103.15,87.33 105.85,90.03 105.85,93.36V95.27C105.85,98.6 103.15,101.29 99.82,101.29H95.81ZM95.47,97.28V97.61H95.81H99.82C101.11,97.61 102.16,96.56 102.16,95.27V93.36C102.16,92.07 101.11,91.02 99.82,91.02H95.81H95.47V91.35V97.28ZM78.29,101.29H77.96V101.63V102.68C77.96,106.01 75.26,108.71 71.93,108.71H65.07C63.77,108.71 62.72,109.76 62.72,111.06V113.41C62.72,114.7 63.77,115.75 65.07,115.75H66.71C70.04,115.75 72.74,118.45 72.74,121.78V122.47C72.74,125.8 70.04,128.5 66.71,128.5H65.07C63.77,128.5 62.72,129.55 62.72,130.84V134.17C62.72,135.46 63.77,136.51 65.07,136.51H102.08C103.37,136.51 104.42,135.46 104.42,134.17V133.67C104.42,132.37 103.37,131.32 102.08,131.32H96.62C93.71,131.32 91.36,128.97 91.36,126.06C91.36,123.15 93.71,120.8 96.62,120.8H102.08C103.37,120.8 104.42,119.75 104.42,118.45V111.92C104.42,110.63 103.37,109.58 102.08,109.58H97.82C94.49,109.58 91.79,106.88 91.79,103.55V101.63V101.29H91.45H78.29ZM73.94,97.61H74.27V97.28V93.36C74.27,92.07 73.22,91.02 71.93,91.02H70.78C69.48,91.02 68.43,92.07 68.43,93.36V95.27C68.43,96.56 69.48,97.61 70.78,97.61H73.94Z"
- android:strokeWidth="0.667939"
- android:fillColor="#1F0333"
- android:strokeColor="#F5F5F5"/>
- <path
- android:pathData="M34.54,77.93V70.95H38.9V77.93C38.9,81.44 36.05,84.29 32.54,84.29H15.98C14.88,84.29 13.97,85.19 13.97,86.31C13.97,87.43 14.88,88.33 15.98,88.33H40.34V86.3C40.34,82.79 43.19,79.94 46.7,79.94H52.25C55.77,79.94 58.61,82.8 58.61,86.31C58.61,89.82 55.77,92.68 52.25,92.68H44.69V103.56C44.69,105.04 43.72,106.31 42.37,106.74V108.34C42.37,111.54 39.78,114.13 36.57,114.13H31.36V119.35H36.01C39.52,119.35 42.37,122.19 42.37,125.71V134.1C42.37,137.61 39.52,140.46 36.01,140.46H33.37C29.86,140.46 27.01,137.61 27.01,134.1V123.7H26.97C23.46,123.7 20.61,120.85 20.61,117.34V116.14C20.61,112.63 23.46,109.78 26.97,109.78H27.01V102.52C27.01,99.01 29.86,96.16 33.37,96.16H40.34V92.68H15.98C12.46,92.68 9.62,89.82 9.62,86.31C9.62,82.8 12.46,79.94 15.98,79.94H32.54C33.65,79.94 34.54,79.04 34.54,77.93ZM40.34,100.51H33.37C32.26,100.51 31.36,101.41 31.36,102.52V109.78H36.57C37.37,109.78 38.02,109.14 38.02,108.34V105.88C38.02,104.39 38.99,103.13 40.34,102.7V100.51ZM27.01,114.13H26.97C25.86,114.13 24.96,115.03 24.96,116.14V117.34C24.96,118.45 25.86,119.35 26.97,119.35H27.01V114.13ZM31.36,123.7V134.1C31.36,135.21 32.26,136.11 33.37,136.11H36.01C37.12,136.11 38.02,135.21 38.02,134.1V125.71C38.02,124.6 37.12,123.7 36.01,123.7H31.36ZM44.69,88.33H52.25C53.35,88.33 54.26,87.43 54.26,86.31C54.26,85.19 53.35,84.29 52.25,84.29H46.7C45.59,84.29 44.69,85.19 44.69,86.3V88.33Z"
- android:strokeWidth="0.667939"
- android:fillColor="#F5F5F5"
- android:fillType="evenOdd"
- android:strokeColor="#F5F5F5"/>
- <path
- android:pathData="M36.45,78.04V71.13H40.81V78.04C40.81,81.55 37.96,84.4 34.44,84.4H17.89C16.79,84.4 15.88,85.3 15.88,86.42C15.88,87.54 16.79,88.44 17.89,88.44H42.25V86.41C42.25,82.89 45.1,80.05 48.61,80.05H54.16C57.68,80.05 60.52,82.91 60.52,86.42C60.52,89.93 57.68,92.79 54.16,92.79H46.6V103.66C46.6,105.15 45.63,106.41 44.28,106.84V108.44C44.28,111.65 41.69,114.24 38.48,114.24H33.27V119.45H37.92C41.43,119.45 44.28,122.3 44.28,125.82V134.21C44.28,137.72 41.43,140.57 37.92,140.57H35.28C31.77,140.57 28.92,137.72 28.92,134.21V123.81H28.88C25.37,123.81 22.52,120.96 22.52,117.44V116.25C22.52,112.74 25.37,109.89 28.88,109.89H28.92V102.63C28.92,99.11 31.77,96.26 35.28,96.26H42.25V92.79H17.89C14.37,92.79 11.53,89.93 11.53,86.42C11.53,82.91 14.37,80.05 17.89,80.05H34.44C35.55,80.05 36.45,79.15 36.45,78.04ZM42.25,100.62H35.28C34.17,100.62 33.27,101.52 33.27,102.63V109.89H38.48C39.28,109.89 39.93,109.24 39.93,108.44V105.99C39.93,104.5 40.9,103.24 42.25,102.81V100.62ZM28.92,114.24H28.88C27.77,114.24 26.87,115.14 26.87,116.25V117.44C26.87,118.55 27.77,119.45 28.88,119.45H28.92V114.24ZM33.27,123.81V134.21C33.27,135.32 34.17,136.22 35.28,136.22H37.92C39.03,136.22 39.93,135.32 39.93,134.21V125.82C39.93,124.71 39.03,123.81 37.92,123.81H33.27ZM46.6,88.44H54.16C55.26,88.44 56.17,87.54 56.17,86.42C56.17,85.3 55.26,84.4 54.16,84.4H48.61C47.5,84.4 46.6,85.3 46.6,86.41V88.44Z"
- android:strokeWidth="0.667939"
- android:fillColor="#1F0333"
- android:fillType="evenOdd"
- android:strokeColor="#F5F5F5"/>
- <path
- android:pathData="M146.05,19.25C146.05,19.53 146.28,19.75 146.56,19.75C146.84,19.75 147.07,19.53 147.07,19.25V14.35L148.52,12.9C148.56,12.87 148.59,12.83 148.61,12.79H153.53C153.81,12.79 154.04,12.56 154.04,12.28C154.04,12 153.81,11.78 153.53,11.78H148.35L147.07,10.49V5.32C147.07,5.04 146.84,4.81 146.56,4.81C146.28,4.81 146.05,5.04 146.05,5.32V10.49L144.77,11.78H139.6C139.32,11.78 139.09,12 139.09,12.28C139.09,12.56 139.32,12.79 139.6,12.79H144.51C144.54,12.83 144.57,12.87 144.6,12.9L146.05,14.35V19.25Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:strokeWidth="1"
- android:pathData="M146.05,19.25C146.05,19.53 146.28,19.75 146.56,19.75C146.84,19.75 147.07,19.53 147.07,19.25V14.35L148.52,12.9C148.56,12.87 148.59,12.83 148.61,12.79H153.53C153.81,12.79 154.04,12.56 154.04,12.28C154.04,12 153.81,11.78 153.53,11.78H148.35L147.07,10.49V5.32C147.07,5.04 146.84,4.81 146.56,4.81C146.28,4.81 146.05,5.04 146.05,5.32V10.49L144.77,11.78H139.6C139.32,11.78 139.09,12 139.09,12.28C139.09,12.56 139.32,12.79 139.6,12.79H144.51C144.54,12.83 144.57,12.87 144.6,12.9L146.05,14.35V19.25Z"
- android:fillColor="#00000000"
- android:strokeColor="#F9F9F9"/>
- <path
- android:pathData="M145.15,5.5L146.3,4.89L146.42,5.9L145.15,5.5Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M153.3,13.66L152.89,12.42L153.97,12.53L153.3,13.66Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M146.33,20.63L145.92,19.39L147.01,19.49L146.33,20.63Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M138.22,12.44L139.39,11.82L139.51,12.83L138.22,12.44Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M145.29,21.35C144.81,21.35 144.42,20.96 144.42,20.48V15.74L143.07,14.39C143.07,14.39 143.07,14.39 143.07,14.39C143.07,14.39 143.07,14.39 143.07,14.38H138.33C137.85,14.38 137.46,13.99 137.46,13.51C137.46,13.03 137.85,12.64 138.33,12.64H143.35L144.42,11.57V6.55C144.42,6.07 144.81,5.68 145.29,5.68C145.77,5.68 146.16,6.07 146.16,6.55V11.57L147.24,12.64H152.26C152.74,12.64 153.13,13.03 153.13,13.51C153.13,13.99 152.74,14.38 152.26,14.38H147.51C147.51,14.39 147.51,14.39 147.51,14.39C147.51,14.39 147.51,14.39 147.51,14.39L146.16,15.74V20.48C146.16,20.96 145.77,21.35 145.29,21.35ZM145.8,15.59L147.25,14.13C147.29,14.1 147.32,14.06 147.34,14.02H152.26C152.54,14.02 152.76,13.79 152.76,13.51C152.76,13.23 152.54,13.01 152.26,13.01H147.08L145.8,11.72V6.55C145.8,6.27 145.57,6.04 145.29,6.04C145.01,6.04 144.79,6.27 144.79,6.55V11.72L143.5,13.01H138.33C138.05,13.01 137.82,13.23 137.82,13.51C137.82,13.79 138.05,14.02 138.33,14.02H143.24C143.27,14.06 143.3,14.1 143.33,14.13L144.79,15.59V20.48C144.79,20.76 145.01,20.98 145.29,20.98C145.57,20.98 145.8,20.76 145.8,20.48V15.59Z"
- android:fillColor="#F9F9F9"
- android:fillType="evenOdd"/>
- <path
- android:pathData="M144.45,20.48C144.45,20.94 144.83,21.32 145.29,21.32C145.76,21.32 146.13,20.94 146.13,20.48V15.72L147.49,14.37C147.49,14.37 147.49,14.37 147.49,14.37C147.49,14.36 147.5,14.36 147.5,14.35H152.26C152.72,14.35 153.1,13.98 153.1,13.51C153.1,13.05 152.72,12.67 152.26,12.67H147.22L146.13,11.58V6.55C146.13,6.08 145.76,5.71 145.29,5.71C144.83,5.71 144.45,6.08 144.45,6.55V11.58L143.36,12.67H138.33C137.86,12.67 137.49,13.05 137.49,13.51C137.49,13.98 137.86,14.35 138.33,14.35H143.08C143.09,14.36 143.09,14.36 143.1,14.37L144.45,15.72V20.48Z"
- android:strokeWidth="0.666912"
- android:fillColor="#FBBE22"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M154.02,30.2C154.02,30.44 154.22,30.64 154.46,30.64C154.71,30.64 154.9,30.44 154.9,30.2V25.93L156.17,24.67C156.2,24.64 156.23,24.6 156.25,24.57H160.53C160.78,24.57 160.98,24.37 160.98,24.13C160.98,23.88 160.78,23.68 160.53,23.68H156.02L154.9,22.57V18.06C154.9,17.81 154.71,17.61 154.46,17.61C154.22,17.61 154.02,17.81 154.02,18.06V22.57L152.9,23.68H148.39C148.15,23.68 147.95,23.88 147.95,24.13C147.95,24.37 148.15,24.57 148.39,24.57H152.68C152.7,24.6 152.72,24.64 152.75,24.67L154.02,25.93V30.2Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:strokeWidth="1"
- android:pathData="M154.02,30.2C154.02,30.44 154.22,30.64 154.46,30.64C154.71,30.64 154.9,30.44 154.9,30.2V25.93L156.17,24.67C156.2,24.64 156.23,24.6 156.25,24.57H160.53C160.78,24.57 160.98,24.37 160.98,24.13C160.98,23.88 160.78,23.68 160.53,23.68H156.02L154.9,22.57V18.06C154.9,17.81 154.71,17.61 154.46,17.61C154.22,17.61 154.02,17.81 154.02,18.06V22.57L152.9,23.68H148.39C148.15,23.68 147.95,23.88 147.95,24.13C147.95,24.37 148.15,24.57 148.39,24.57H152.68C152.7,24.6 152.72,24.64 152.75,24.67L154.02,25.93V30.2Z"
- android:fillColor="#00000000"
- android:strokeColor="#F9F9F9"/>
- <path
- android:pathData="M153.23,18.21L154.23,17.69L154.34,18.57L153.23,18.21Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M160.33,25.33L159.98,24.25L160.92,24.34L160.33,25.33Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M154.26,31.4L153.91,30.32L154.85,30.41L154.26,31.4Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M147.19,24.27L148.21,23.72L148.32,24.6L147.19,24.27Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M153.35,32.03C152.93,32.03 152.6,31.69 152.6,31.27V27.14L151.42,25.96C151.42,25.96 151.42,25.96 151.42,25.96C151.42,25.96 151.42,25.96 151.42,25.96H147.29C146.87,25.96 146.52,25.62 146.52,25.2C146.52,24.78 146.87,24.44 147.29,24.44H151.66L152.6,23.51V19.13C152.6,18.71 152.93,18.37 153.35,18.37C153.77,18.37 154.11,18.71 154.11,19.13V23.51L155.05,24.44H159.43C159.85,24.44 160.18,24.78 160.18,25.2C160.18,25.62 159.85,25.96 159.43,25.96H155.29C155.29,25.96 155.29,25.96 155.29,25.96C155.29,25.96 155.29,25.96 155.29,25.96L154.11,27.14V31.27C154.11,31.69 153.77,32.03 153.35,32.03ZM153.8,27.01L155.06,25.74C155.09,25.71 155.12,25.68 155.14,25.64H159.43C159.67,25.64 159.87,25.44 159.87,25.2C159.87,24.96 159.67,24.76 159.43,24.76H154.92L153.8,23.64V19.13C153.8,18.89 153.6,18.69 153.35,18.69C153.11,18.69 152.91,18.89 152.91,19.13V23.64L151.79,24.76H147.29C147.04,24.76 146.84,24.96 146.84,25.2C146.84,25.44 147.04,25.64 147.29,25.64H151.57C151.59,25.68 151.62,25.71 151.65,25.74L152.91,27.01V31.27C152.91,31.51 153.11,31.71 153.35,31.71C153.6,31.71 153.8,31.51 153.8,31.27V27.01Z"
- android:fillColor="#F9F9F9"
- android:fillType="evenOdd"/>
- <path
- android:pathData="M152.58,31.27C152.58,31.7 152.93,32.04 153.35,32.04C153.78,32.04 154.13,31.7 154.13,31.27V27.14L155.3,25.97H159.43C159.85,25.97 160.2,25.63 160.2,25.2C160.2,24.77 159.85,24.42 159.43,24.42H155.05L154.13,23.5V19.13C154.13,18.7 153.78,18.35 153.35,18.35C152.93,18.35 152.58,18.7 152.58,19.13V23.5L151.65,24.42H147.29C146.86,24.42 146.51,24.77 146.51,25.2C146.51,25.63 146.86,25.97 147.29,25.97H151.41L152.58,27.14V31.27Z"
- android:strokeWidth="0.666912"
- android:fillColor="#FBBE22"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M11.76,48.84C11.76,49.09 11.57,49.28 11.32,49.28C11.08,49.28 10.88,49.09 10.88,48.84V44.58L9.61,43.31C9.58,43.28 9.56,43.25 9.53,43.21H5.25C5.01,43.21 4.81,43.02 4.81,42.77C4.81,42.53 5.01,42.33 5.25,42.33H9.76L10.88,41.21V36.7C10.88,36.46 11.08,36.26 11.32,36.26C11.57,36.26 11.76,36.46 11.76,36.7V41.21L12.88,42.33H17.39C17.64,42.33 17.83,42.53 17.83,42.77C17.83,43.02 17.64,43.21 17.39,43.21H13.11C13.09,43.25 13.06,43.28 13.03,43.31L11.76,44.58V48.84Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:strokeWidth="1"
- android:pathData="M11.76,48.84C11.76,49.09 11.57,49.28 11.32,49.28C11.08,49.28 10.88,49.09 10.88,48.84V44.58L9.61,43.31C9.58,43.28 9.56,43.25 9.53,43.21H5.25C5.01,43.21 4.81,43.02 4.81,42.77C4.81,42.53 5.01,42.33 5.25,42.33H9.76L10.88,41.21V36.7C10.88,36.46 11.08,36.26 11.32,36.26C11.57,36.26 11.76,36.46 11.76,36.7V41.21L12.88,42.33H17.39C17.64,42.33 17.83,42.53 17.83,42.77C17.83,43.02 17.64,43.21 17.39,43.21H13.11C13.09,43.25 13.06,43.28 13.03,43.31L11.76,44.58V48.84Z"
- android:fillColor="#00000000"
- android:strokeColor="#F9F9F9"/>
- <path
- android:pathData="M12.56,36.86L11.55,36.33L11.45,37.21L12.56,36.86Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M5.45,43.97L5.81,42.89L4.86,42.98L5.45,43.97Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M11.52,50.04L11.88,48.96L10.94,49.05L11.52,50.04Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M18.59,42.91L17.57,42.37L17.46,43.25L18.59,42.91Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M12.43,50.67C12.85,50.67 13.19,50.33 13.19,49.91V45.78L14.36,44.61C14.36,44.61 14.36,44.61 14.36,44.61C14.37,44.61 14.37,44.61 14.37,44.6H18.5C18.92,44.6 19.26,44.26 19.26,43.84C19.26,43.42 18.92,43.08 18.5,43.08H14.12L13.19,42.15V37.77C13.19,37.35 12.85,37.01 12.43,37.01C12.01,37.01 11.67,37.35 11.67,37.77V42.15L10.74,43.08H6.36C5.94,43.08 5.6,43.42 5.6,43.84C5.6,44.26 5.94,44.6 6.36,44.6H10.49C10.49,44.61 10.49,44.61 10.5,44.61C10.5,44.61 10.5,44.61 10.5,44.61L11.67,45.78V49.91C11.67,50.33 12.01,50.67 12.43,50.67ZM11.99,45.65L10.72,44.38C10.69,44.35 10.66,44.32 10.64,44.29H6.36C6.12,44.29 5.92,44.09 5.92,43.84C5.92,43.6 6.12,43.4 6.36,43.4H10.87L11.99,42.28V37.77C11.99,37.53 12.19,37.33 12.43,37.33C12.67,37.33 12.87,37.53 12.87,37.77V42.28L13.99,43.4H18.5C18.74,43.4 18.94,43.6 18.94,43.84C18.94,44.09 18.74,44.29 18.5,44.29H14.22C14.2,44.32 14.17,44.35 14.14,44.38L12.87,45.65V49.91C12.87,50.16 12.67,50.36 12.43,50.36C12.19,50.36 11.99,50.16 11.99,49.91V45.65Z"
- android:fillColor="#F9F9F9"
- android:fillType="evenOdd"/>
- <path
- android:pathData="M13.21,49.91C13.21,50.34 12.86,50.69 12.43,50.69C12,50.69 11.65,50.34 11.65,49.91V45.79L10.49,44.62H6.36C5.93,44.62 5.58,44.27 5.58,43.84C5.58,43.42 5.93,43.07 6.36,43.07H10.73L11.65,42.14V37.77C11.65,37.35 12,37 12.43,37C12.86,37 13.21,37.35 13.21,37.77V42.14L14.13,43.07H18.5C18.93,43.07 19.28,43.42 19.28,43.84C19.28,44.27 18.93,44.62 18.5,44.62H14.37L13.21,45.79V49.91Z"
- android:strokeWidth="0.666912"
- android:fillColor="#FBBE22"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M82.61,121.73C82.61,121.98 82.8,122.17 83.05,122.17C83.29,122.17 83.49,121.98 83.49,121.73V117.47L84.76,116.2C84.79,116.17 84.81,116.14 84.84,116.1H89.12C89.36,116.1 89.56,115.91 89.56,115.66C89.56,115.42 89.36,115.22 89.12,115.22H84.61L83.49,114.1V109.59C83.49,109.35 83.29,109.15 83.05,109.15C82.8,109.15 82.61,109.35 82.61,109.59V114.1L81.49,115.22H76.98C76.73,115.22 76.54,115.42 76.54,115.66C76.54,115.91 76.73,116.1 76.98,116.1H81.26C81.28,116.14 81.31,116.17 81.34,116.2L82.61,117.47V121.73Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:strokeWidth="1"
- android:pathData="M82.61,121.73C82.61,121.98 82.8,122.17 83.05,122.17C83.29,122.17 83.49,121.98 83.49,121.73V117.47L84.76,116.2C84.79,116.17 84.81,116.14 84.84,116.1H89.12C89.36,116.1 89.56,115.91 89.56,115.66C89.56,115.42 89.36,115.22 89.12,115.22H84.61L83.49,114.1V109.59C83.49,109.35 83.29,109.15 83.05,109.15C82.8,109.15 82.61,109.35 82.61,109.59V114.1L81.49,115.22H76.98C76.73,115.22 76.54,115.42 76.54,115.66C76.54,115.91 76.73,116.1 76.98,116.1H81.26C81.28,116.14 81.31,116.17 81.34,116.2L82.61,117.47V121.73Z"
- android:fillColor="#00000000"
- android:strokeColor="#F9F9F9"/>
- <path
- android:pathData="M81.81,109.75L82.82,109.22L82.92,110.1L81.81,109.75Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M88.92,116.86L88.56,115.78L89.51,115.87L88.92,116.86Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M82.85,122.93L82.49,121.85L83.43,121.94L82.85,122.93Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M75.78,115.8L76.8,115.26L76.91,116.14L75.78,115.8Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M81.94,123.56C81.52,123.56 81.18,123.22 81.18,122.81V118.67L80.01,117.5C80.01,117.5 80.01,117.5 80.01,117.5C80,117.5 80,117.5 80,117.49H75.87C75.45,117.49 75.11,117.15 75.11,116.74C75.11,116.32 75.45,115.97 75.87,115.97H80.25L81.18,115.04V110.66C81.18,110.25 81.52,109.9 81.94,109.9C82.36,109.9 82.7,110.25 82.7,110.66V115.04L83.63,115.97H88.01C88.43,115.97 88.77,116.32 88.77,116.74C88.77,117.15 88.43,117.49 88.01,117.49H83.88C83.88,117.5 83.88,117.5 83.87,117.5C83.87,117.5 83.87,117.5 83.87,117.5L82.7,118.67V122.81C82.7,123.22 82.36,123.56 81.94,123.56ZM82.38,118.54L83.65,117.27C83.68,117.24 83.71,117.21 83.73,117.18H88.01C88.25,117.18 88.45,116.98 88.45,116.74C88.45,116.49 88.25,116.29 88.01,116.29H83.5L82.38,115.17V110.66C82.38,110.42 82.18,110.22 81.94,110.22C81.7,110.22 81.5,110.42 81.5,110.66V115.17L80.38,116.29H75.87C75.63,116.29 75.43,116.49 75.43,116.74C75.43,116.98 75.63,117.18 75.87,117.18H80.15C80.17,117.21 80.2,117.24 80.23,117.27L81.5,118.54V122.81C81.5,123.05 81.7,123.25 81.94,123.25C82.18,123.25 82.38,123.05 82.38,122.81V118.54Z"
- android:fillColor="#F9F9F9"
- android:fillType="evenOdd"/>
- <path
- android:pathData="M81.16,122.81C81.16,123.23 81.51,123.58 81.94,123.58C82.37,123.58 82.72,123.23 82.72,122.81V118.68L83.88,117.51H88.01C88.44,117.51 88.79,117.16 88.79,116.74C88.79,116.31 88.44,115.96 88.01,115.96H83.64L82.72,115.04V110.66C82.72,110.24 82.37,109.89 81.94,109.89C81.51,109.89 81.16,110.24 81.16,110.66V115.04L80.24,115.96H75.87C75.44,115.96 75.09,116.31 75.09,116.74C75.09,117.16 75.44,117.51 75.87,117.51H80L81.16,118.68V122.81Z"
- android:strokeWidth="0.666912"
- android:fillColor="#FBBE22"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M84.51,36.84L84.84,36.89C84.86,36.75 84.8,36.62 84.68,36.55C84.57,36.48 84.42,36.49 84.32,36.57L84.51,36.84ZM83.78,37.36L83.58,37.09L83.58,37.09L83.78,37.36ZM83.62,37.31L83.94,37.21L83.94,37.21L83.62,37.31ZM84.55,23.09L84.5,23.43C84.52,23.43 84.53,23.43 84.55,23.43L84.55,23.09ZM85.33,28.82L85,28.8C84.99,28.98 85.12,29.13 85.29,29.15C85.47,29.17 85.63,29.06 85.66,28.88L85.33,28.82ZM90.05,20.62L90.2,20.32C90.19,20.32 90.18,20.31 90.16,20.31L90.05,20.62ZM88.55,29.32L88.24,29.19C88.18,29.33 88.22,29.49 88.34,29.58C88.47,29.67 88.63,29.67 88.75,29.58L88.55,29.32ZM91.5,28.25L91.56,27.92L91.56,27.92L91.5,28.25ZM91.65,29.17L91.41,28.93L91.41,28.93L91.65,29.17ZM86.94,38.3L86.6,38.29L86.6,38.29L86.94,38.3ZM84.38,38.29L84.05,38.28L84.05,38.28L84.38,38.29ZM84.32,36.57L83.58,37.09L83.97,37.63L84.7,37.11L84.32,36.57ZM83.58,37.09C83.71,37 83.89,37.06 83.94,37.21L83.3,37.4C83.38,37.69 83.73,37.81 83.97,37.63L83.58,37.09ZM83.94,37.21C82.92,33.77 82.63,30.2 82.85,27.52C82.96,26.18 83.2,25.09 83.53,24.36C83.69,24 83.87,23.74 84.04,23.59C84.2,23.45 84.35,23.41 84.5,23.43L84.59,22.76C84.21,22.71 83.88,22.85 83.6,23.09C83.32,23.33 83.1,23.67 82.92,24.09C82.55,24.91 82.3,26.09 82.18,27.46C81.95,30.22 82.25,33.89 83.3,37.4L83.94,37.21ZM84.55,23.43C84.58,23.43 84.67,23.44 84.78,23.69C84.89,23.94 84.97,24.33 85.01,24.85C85.11,25.87 85.07,27.28 85,28.8L85.67,28.83C85.73,27.32 85.78,25.87 85.68,24.79C85.63,24.25 85.55,23.78 85.4,23.43C85.25,23.08 84.98,22.76 84.55,22.76L84.55,23.43ZM85.66,28.88C86.1,26.6 86.73,24.4 87.51,22.87C87.9,22.1 88.32,21.53 88.73,21.2C89.14,20.88 89.53,20.79 89.94,20.94L90.16,20.31C89.49,20.07 88.86,20.24 88.32,20.67C87.79,21.09 87.32,21.76 86.92,22.56C86.1,24.18 85.45,26.45 85,28.76L85.66,28.88ZM89.91,20.92C90.16,21.05 90.33,21.31 90.39,21.79C90.44,22.27 90.37,22.92 90.18,23.69C89.82,25.24 89.05,27.19 88.24,29.19L88.86,29.44C89.67,27.45 90.46,25.45 90.84,23.85C91.03,23.04 91.12,22.31 91.05,21.71C90.98,21.11 90.74,20.59 90.2,20.32L89.91,20.92ZM88.75,29.58C89.76,28.79 90.72,28.46 91.45,28.58L91.56,27.92C90.56,27.76 89.41,28.21 88.34,29.05L88.75,29.58ZM91.45,28.58C91.49,28.59 91.5,28.6 91.5,28.61C91.51,28.61 91.52,28.63 91.52,28.66C91.53,28.73 91.5,28.84 91.41,28.93L91.88,29.41C92.11,29.18 92.22,28.87 92.19,28.58C92.15,28.27 91.94,27.98 91.56,27.92L91.45,28.58ZM91.41,28.93C90.16,30.14 88.98,31.9 88.1,33.63C87.23,35.36 86.63,37.1 86.6,38.29L87.27,38.3C87.3,37.27 87.84,35.64 88.7,33.94C89.56,32.25 90.7,30.55 91.88,29.41L91.41,28.93ZM86.6,38.29C86.6,38.16 86.71,38.06 86.83,38.06V38.73C87.07,38.73 87.26,38.55 87.27,38.3L86.6,38.29ZM86.83,38.06H84.48V38.73H86.83V38.06ZM84.48,38.06C84.62,38.06 84.72,38.17 84.72,38.3L84.05,38.28C84.04,38.53 84.23,38.73 84.48,38.73V38.06ZM84.72,38.3C84.73,37.82 84.77,37.35 84.84,36.89L84.18,36.79C84.11,37.27 84.06,37.77 84.05,38.28L84.72,38.3Z"
- android:fillColor="#F5F5F5"/>
- <path
- android:pathData="M82.07,39C80.62,40.13 79.16,40.92 77.61,41.81C84.53,41.86 95.63,43.4 94.14,42.54C92.36,41.51 89.67,39.69 88.59,38.5C87.52,37.3 83.89,37.58 82.07,39Z"
- android:fillColor="#B27AF4"/>
- <path
- android:pathData="M89.33,39.24C88.76,38.59 87.75,37.44 87.82,35.96C87.86,35.28 87.88,34.85 87.91,34.57C87.92,34.46 87.63,34.24 87.53,34.29C86.49,34.8 85.42,34.87 83.37,34.87C83.31,34.87 83.27,34.92 83.27,34.98C83.32,36.21 82.66,38.46 81.78,39.23C81.42,39.54 82.14,39.68 83.31,39.72C75.58,40.81 69.6,48.02 69.6,56.76C69.6,61.87 71.65,66.46 74.9,69.61C77.27,71.9 79.92,72.57 83.44,73.45C83.73,73.52 84.03,73.6 84.33,73.67C85,73.84 85.7,73.86 86.37,73.72C90.57,72.84 93.22,72.1 95.79,69.61C99.04,66.46 101.09,61.87 101.09,56.76C101.09,47.74 94.73,40.35 86.63,39.63C87.61,39.57 88.55,39.49 89.27,39.4C89.35,39.39 89.38,39.3 89.33,39.24Z"
- android:fillColor="#B27AF4"/>
- <path
- android:pathData="M97.87,56.9C97.87,64.12 92.25,69.95 85.36,69.95C78.46,69.95 72.85,64.12 72.85,56.9C72.85,49.68 78.46,43.86 85.36,43.86C92.25,43.86 97.87,49.68 97.87,56.9Z"
- android:strokeWidth="0.669091"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M95.19,56.9C95.19,62.57 90.77,67.14 85.36,67.14C79.94,67.14 75.53,62.57 75.53,56.9C75.53,51.23 79.94,46.66 85.36,46.66C90.77,46.66 95.19,51.23 95.19,56.9Z"
- android:strokeWidth="0.669091"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M92.54,56.9C92.54,61.04 89.32,64.38 85.36,64.38C81.4,64.38 78.17,61.04 78.17,56.9C78.17,52.76 81.4,49.43 85.36,49.43C89.32,49.43 92.54,52.76 92.54,56.9Z"
- android:strokeWidth="0.669091"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M90.15,56.9C90.15,59.68 87.99,61.91 85.36,61.91C82.73,61.91 80.57,59.68 80.57,56.9C80.57,54.13 82.73,51.9 85.36,51.9C87.99,51.9 90.15,54.13 90.15,56.9Z"
- android:strokeWidth="0.669091"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M87.83,56.9C87.83,58.34 86.71,59.48 85.36,59.48C84.01,59.48 82.89,58.34 82.89,56.9C82.89,55.47 84.01,54.33 85.36,54.33C86.71,54.33 87.83,55.47 87.83,56.9Z"
- android:strokeWidth="0.669091"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M129.44,36.85L129.77,36.89C129.79,36.76 129.73,36.63 129.62,36.56C129.5,36.49 129.36,36.5 129.25,36.57L129.44,36.85ZM128.71,37.37L128.9,37.64L128.9,37.64L128.71,37.37ZM128.55,37.31L128.87,37.22L128.87,37.22L128.55,37.31ZM129.48,23.11L129.44,23.44C129.45,23.44 129.46,23.44 129.48,23.44L129.48,23.11ZM130.27,28.83L129.93,28.81C129.92,28.99 130.05,29.14 130.23,29.16C130.4,29.18 130.56,29.07 130.59,28.89L130.27,28.83ZM134.98,20.64L135.13,20.34C135.12,20.33 135.11,20.33 135.1,20.32L134.98,20.64ZM133.48,29.33L133.17,29.2C133.11,29.34 133.15,29.5 133.27,29.59C133.4,29.68 133.56,29.68 133.68,29.59L133.48,29.33ZM136.43,28.26L136.38,28.59L136.38,28.59L136.43,28.26ZM136.58,29.18L136.34,28.94L136.34,28.94L136.58,29.18ZM131.87,38.3L131.53,38.29L131.53,38.29L131.87,38.3ZM129.31,38.3L128.98,38.29L128.98,38.29L129.31,38.3ZM129.25,36.57L128.52,37.09L128.9,37.64L129.64,37.12L129.25,36.57ZM128.52,37.09C128.65,37 128.83,37.06 128.87,37.22L128.23,37.41C128.32,37.69 128.66,37.81 128.9,37.64L128.52,37.09ZM128.87,37.22C127.85,33.78 127.56,30.21 127.79,27.53C127.9,26.19 128.14,25.1 128.46,24.37C128.62,24.01 128.8,23.76 128.97,23.61C129.13,23.46 129.29,23.42 129.44,23.44L129.52,22.78C129.15,22.73 128.81,22.86 128.53,23.1C128.26,23.34 128.04,23.69 127.85,24.1C127.48,24.92 127.23,26.1 127.12,27.48C126.89,30.23 127.19,33.89 128.23,37.41L128.87,37.22ZM129.48,23.44C129.52,23.44 129.61,23.45 129.71,23.71C129.82,23.96 129.9,24.34 129.95,24.86C130.04,25.88 130,27.29 129.93,28.81L130.6,28.84C130.67,27.33 130.71,25.88 130.61,24.8C130.57,24.27 130.48,23.79 130.33,23.44C130.18,23.1 129.92,22.77 129.48,22.77L129.48,23.44ZM130.59,28.89C131.04,26.62 131.67,24.41 132.44,22.88C132.83,22.11 133.25,21.54 133.67,21.21C134.07,20.89 134.46,20.81 134.87,20.95L135.1,20.32C134.42,20.08 133.79,20.26 133.25,20.69C132.72,21.11 132.26,21.77 131.85,22.58C131.03,24.19 130.38,26.46 129.94,28.77L130.59,28.89ZM134.84,20.94C135.1,21.06 135.26,21.33 135.32,21.8C135.37,22.29 135.3,22.93 135.12,23.7C134.75,25.25 133.98,27.2 133.17,29.2L133.79,29.45C134.6,27.46 135.39,25.46 135.77,23.86C135.96,23.06 136.05,22.32 135.98,21.73C135.91,21.12 135.67,20.6 135.13,20.34L134.84,20.94ZM133.68,29.59C134.69,28.8 135.65,28.47 136.38,28.59L136.49,27.93C135.49,27.77 134.34,28.22 133.27,29.06L133.68,29.59ZM136.38,28.59C136.42,28.6 136.43,28.61 136.43,28.62C136.44,28.62 136.45,28.64 136.45,28.67C136.46,28.74 136.43,28.85 136.34,28.94L136.81,29.42C137.04,29.19 137.15,28.88 137.12,28.59C137.08,28.28 136.87,28 136.49,27.93L136.38,28.59ZM136.34,28.94C135.1,30.15 133.91,31.91 133.04,33.64C132.16,35.36 131.56,37.11 131.53,38.29L132.2,38.31C132.23,37.28 132.77,35.64 133.63,33.95C134.49,32.26 135.63,30.56 136.81,29.42L136.34,28.94ZM131.53,38.29C131.54,38.17 131.64,38.07 131.76,38.07V38.74C132,38.74 132.2,38.55 132.2,38.31L131.53,38.29ZM131.76,38.07H129.42V38.74H131.76V38.07ZM129.42,38.07C129.55,38.07 129.65,38.18 129.65,38.31L128.98,38.29C128.97,38.53 129.17,38.74 129.42,38.74V38.07ZM129.65,38.31C129.66,37.82 129.71,37.35 129.77,36.89L129.11,36.8C129.04,37.28 129,37.78 128.98,38.29L129.65,38.31Z"
- android:fillColor="#F5F5F5"/>
- <path
- android:pathData="M126.82,40.36C125.38,41.49 121.93,43.73 120.39,44.62C127.26,44.67 139.3,43.87 137.82,43.01C134.87,41.3 134.36,41.05 133.29,39.86C132.23,38.68 128.62,38.95 126.82,40.36Z"
- android:fillColor="#B27AF4"/>
- <path
- android:pathData="M134.02,40.6C133.46,39.96 132.45,38.88 132.53,37.34C132.56,36.66 132.59,36.24 132.61,35.96C132.62,35.85 132.34,35.63 132.24,35.68C131.2,36.19 130.14,36.26 128.11,36.26C128.05,36.26 128,36.31 128.01,36.37C127.83,39.13 127.83,39.5 126.53,40.59C126.18,40.89 126.86,41.03 127.97,41.07C118.96,43.94 114.44,48.52 114.44,56.32C114.44,60.9 116.47,65.01 119.7,67.83C122.05,69.89 124.68,70.48 128.18,71.27C128.49,71.34 128.82,71.42 129.16,71.49C129.76,71.63 130.38,71.65 130.99,71.53C135.21,70.73 137.87,70.08 140.44,67.83C143.67,65.01 145.7,60.9 145.7,56.32C145.7,48.26 139.4,41.64 131.39,40.99C132.34,40.93 133.26,40.84 133.96,40.76C134.04,40.75 134.08,40.66 134.02,40.6Z"
- android:fillColor="#B27AF4"/>
- <path
- android:pathData="M142.58,55.93C142.58,62.58 136.99,68 130.08,68C123.16,68 117.57,62.58 117.57,55.93C117.57,49.27 123.16,43.86 130.08,43.86C136.99,43.86 142.58,49.27 142.58,55.93Z"
- android:strokeWidth="0.668769"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M139.9,55.93C139.9,61.15 135.51,65.4 130.08,65.4C124.64,65.4 120.25,61.15 120.25,55.93C120.25,50.71 124.64,46.46 130.08,46.46C135.51,46.46 139.9,50.71 139.9,55.93Z"
- android:strokeWidth="0.668769"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M137.26,55.93C137.26,59.73 134.05,62.84 130.08,62.84C126.1,62.84 122.89,59.73 122.89,55.93C122.89,52.13 126.1,49.02 130.08,49.02C134.05,49.02 137.26,52.13 137.26,55.93Z"
- android:strokeWidth="0.668769"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M134.87,55.93C134.87,58.47 132.73,60.54 130.08,60.54C127.42,60.54 125.29,58.47 125.29,55.93C125.29,53.39 127.42,51.31 130.08,51.31C132.73,51.31 134.87,53.39 134.87,55.93Z"
- android:strokeWidth="0.668769"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M132.54,55.93C132.54,57.22 131.45,58.29 130.08,58.29C128.7,58.29 127.61,57.22 127.61,55.93C127.61,54.64 128.7,53.57 130.08,53.57C131.45,53.57 132.54,54.64 132.54,55.93Z"
- android:strokeWidth="0.668769"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M133.71,35.21C133.23,35.77 132.63,36.59 132.55,37.92C130.66,42.59 129.83,48.47 129.83,54.62C129.83,60.77 130.95,66.47 132.85,71.14C131.95,71.36 131.02,71.51 130.06,71.57C121.13,71.24 114,64.55 114,56.35C114,50.58 117.53,45.56 122.74,42.97C124.91,41.77 127.56,40.29 127.65,38.85C127.74,37.37 127.33,36.27 126.95,35.46C126.79,35.13 127,34.72 127.35,34.69L133.32,34.25C133.71,34.22 133.97,34.66 133.8,35.02C133.77,35.08 133.74,35.14 133.71,35.21Z"
- android:fillColor="#1F0333"
- android:fillType="evenOdd"/>
- <group>
- <clip-path
- android:pathData="M133.71,35.21C133.23,35.77 132.63,36.59 132.55,37.92C130.66,42.59 129.83,48.47 129.83,54.62C129.83,60.77 130.95,66.47 132.85,71.14C131.95,71.36 131.02,71.51 130.06,71.57C121.13,71.24 114,64.55 114,56.35C114,50.58 117.53,45.56 122.74,42.97C124.91,41.77 127.56,40.29 127.65,38.85C127.74,37.37 127.33,36.27 126.95,35.46C126.79,35.13 127,34.72 127.35,34.69L133.32,34.25C133.71,34.22 133.97,34.66 133.8,35.02C133.77,35.08 133.74,35.14 133.71,35.21Z"
- android:fillType="evenOdd"/>
- <path
- android:pathData="M132.55,37.92L133.17,38.18L133.21,38.07L133.22,37.96L132.55,37.92ZM133.71,35.21L134.21,35.65L134.27,35.57L134.32,35.49L133.71,35.21ZM132.85,71.14L133.01,71.79L133.76,71.6L133.47,70.89L132.85,71.14ZM130.06,71.57L130.04,72.24L130.07,72.24L130.1,72.24L130.06,71.57ZM122.74,42.97L123.03,43.57L123.05,43.56L123.06,43.56L122.74,42.97ZM127.65,38.85L128.32,38.89L128.32,38.89L127.65,38.85ZM126.95,35.46L126.35,35.75L126.35,35.75L126.95,35.46ZM127.35,34.69L127.3,34.03L127.3,34.03L127.35,34.69ZM133.32,34.25L133.27,33.58L133.27,33.58L133.32,34.25ZM133.8,35.02L134.4,35.31L134.4,35.31L133.8,35.02ZM133.22,37.96C133.28,36.84 133.77,36.15 134.21,35.65L133.21,34.77C132.67,35.38 131.98,36.35 131.89,37.89L133.22,37.96ZM130.5,54.62C130.5,48.52 131.32,42.73 133.17,38.18L131.93,37.67C129.99,42.44 129.17,48.42 129.17,54.62H130.5ZM133.47,70.89C131.6,66.31 130.5,60.69 130.5,54.62H129.17C129.17,60.85 130.3,66.64 132.24,71.39L133.47,70.89ZM130.1,72.24C131.1,72.17 132.07,72.02 133.01,71.79L132.7,70.49C131.83,70.71 130.93,70.85 130.02,70.9L130.1,72.24ZM113.34,56.35C113.34,64.96 120.81,71.89 130.04,72.24L130.09,70.9C121.46,70.58 114.67,64.13 114.67,56.35H113.34ZM122.44,42.38C117.04,45.06 113.34,50.29 113.34,56.35H114.67C114.67,50.87 118.03,46.06 123.03,43.57L122.44,42.38ZM126.99,38.81C126.97,38.97 126.89,39.2 126.63,39.51C126.39,39.81 126.03,40.13 125.58,40.46C124.67,41.13 123.51,41.78 122.41,42.39L123.06,43.56C124.14,42.96 125.38,42.27 126.37,41.54C126.87,41.17 127.32,40.77 127.67,40.35C128.01,39.94 128.28,39.45 128.32,38.89L126.99,38.81ZM126.35,35.75C126.71,36.5 127.07,37.48 126.99,38.81L128.32,38.89C128.42,37.26 127.96,36.04 127.55,35.17L126.35,35.75ZM127.3,34.03C126.41,34.09 126.02,35.06 126.35,35.75L127.55,35.17C127.57,35.21 127.56,35.25 127.55,35.27C127.54,35.3 127.49,35.35 127.4,35.36L127.3,34.03ZM133.27,33.58L127.3,34.03L127.4,35.36L133.37,34.91L133.27,33.58ZM134.4,35.31C134.59,34.91 134.54,34.47 134.34,34.14C134.14,33.81 133.75,33.55 133.27,33.58L133.37,34.91C133.33,34.92 133.29,34.91 133.26,34.89C133.22,34.87 133.21,34.85 133.2,34.84C133.19,34.81 133.18,34.78 133.2,34.73L134.4,35.31ZM134.32,35.49C134.34,35.43 134.37,35.37 134.4,35.31L133.2,34.73C133.17,34.8 133.13,34.86 133.1,34.93L134.32,35.49Z"
- android:fillColor="#B27AF4"/>
- </group>
- <path
- android:pathData="M126.06,44.68C126.36,44.94 126.36,45.41 126.06,45.66L125.96,45.75C125.93,45.77 125.91,45.8 125.88,45.82L125.8,45.92C125.54,46.23 125.07,46.23 124.81,45.92L124.73,45.82C124.71,45.8 124.68,45.77 124.65,45.75L124.55,45.66C124.25,45.41 124.25,44.94 124.55,44.68L124.65,44.59C124.68,44.57 124.71,44.55 124.73,44.52L124.81,44.42C125.07,44.12 125.54,44.12 125.8,44.42L125.88,44.52C125.91,44.55 125.93,44.57 125.96,44.59L126.06,44.68Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M123.94,47.31C124.68,47.94 124.68,49.08 123.94,49.71L123.69,49.93C123.63,49.98 123.57,50.04 123.52,50.1L123.3,50.35C122.67,51.09 121.53,51.09 120.89,50.35L120.68,50.1C120.63,50.04 120.57,49.98 120.51,49.93L120.26,49.71C119.52,49.08 119.52,47.94 120.26,47.31L120.51,47.09C120.57,47.04 120.63,46.98 120.68,46.92L120.89,46.67C121.53,45.93 122.67,45.93 123.3,46.67L123.52,46.92C123.57,46.98 123.63,47.04 123.69,47.09L123.94,47.31Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M39.32,36.87L39.65,36.92C39.67,36.78 39.61,36.65 39.49,36.58C39.38,36.52 39.24,36.52 39.13,36.6L39.32,36.87ZM38.59,37.39L38.78,37.66L38.78,37.66L38.59,37.39ZM38.43,37.33L38.75,37.24L38.75,37.24L38.43,37.33ZM39.36,23.17L39.31,23.5C39.33,23.5 39.34,23.5 39.36,23.5L39.36,23.17ZM40.14,28.87L39.81,28.86C39.8,29.03 39.93,29.18 40.1,29.2C40.28,29.23 40.44,29.11 40.47,28.94L40.14,28.87ZM44.85,20.7L44.99,20.4C44.98,20.4 44.97,20.39 44.96,20.39L44.85,20.7ZM43.34,29.37L43.03,29.24C42.98,29.38 43.02,29.55 43.14,29.64C43.26,29.73 43.43,29.73 43.55,29.63L43.34,29.37ZM46.29,28.31L46.35,27.98L46.35,27.98L46.29,28.31ZM46.44,29.22L46.67,29.46L46.67,29.46L46.44,29.22ZM41.74,38.32L41.41,38.31L41.41,38.31L41.74,38.32ZM39.19,38.32L39.53,38.33L39.53,38.33L39.19,38.32ZM39.13,36.6L38.4,37.12L38.78,37.66L39.51,37.14L39.13,36.6ZM38.4,37.12C38.53,37.03 38.71,37.09 38.75,37.24L38.11,37.43C38.2,37.72 38.54,37.83 38.78,37.66L38.4,37.12ZM38.75,37.24C37.73,33.81 37.44,30.25 37.67,27.58C37.78,26.24 38.02,25.15 38.34,24.43C38.5,24.07 38.68,23.81 38.85,23.67C39.01,23.52 39.16,23.48 39.31,23.5L39.4,22.84C39.02,22.79 38.69,22.92 38.41,23.16C38.14,23.4 37.92,23.75 37.73,24.16C37.36,24.98 37.12,26.15 37,27.52C36.77,30.27 37.07,33.93 38.11,37.43L38.75,37.24ZM39.36,23.5C39.39,23.5 39.48,23.51 39.59,23.76C39.7,24.01 39.78,24.4 39.82,24.91C39.92,25.94 39.88,27.34 39.81,28.86L40.47,28.89C40.54,27.38 40.58,25.93 40.49,24.85C40.44,24.32 40.35,23.85 40.2,23.5C40.06,23.16 39.79,22.83 39.36,22.83L39.36,23.5ZM40.47,28.94C40.91,26.67 41.54,24.47 42.31,22.94C42.7,22.17 43.11,21.61 43.53,21.28C43.94,20.96 44.33,20.87 44.74,21.02L44.96,20.39C44.29,20.15 43.66,20.33 43.12,20.75C42.59,21.17 42.13,21.84 41.72,22.64C40.9,24.25 40.26,26.51 39.81,28.81L40.47,28.94ZM44.7,21C44.96,21.13 45.13,21.39 45.18,21.87C45.24,22.35 45.16,22.99 44.98,23.76C44.61,25.3 43.85,27.25 43.03,29.24L43.65,29.5C44.46,27.51 45.25,25.52 45.63,23.92C45.82,23.12 45.91,22.39 45.84,21.79C45.78,21.19 45.53,20.67 44.99,20.4L44.7,21ZM43.55,29.63C44.55,28.85 45.51,28.52 46.24,28.64L46.35,27.98C45.35,27.81 44.2,28.27 43.14,29.11L43.55,29.63ZM46.24,28.64C46.28,28.64 46.29,28.66 46.29,28.66C46.3,28.67 46.31,28.68 46.31,28.72C46.32,28.78 46.29,28.89 46.2,28.98L46.67,29.46C46.89,29.24 47.01,28.93 46.98,28.64C46.94,28.32 46.72,28.04 46.35,27.98L46.24,28.64ZM46.2,28.98C44.96,30.19 43.78,31.95 42.9,33.68C42.03,35.39 41.44,37.13 41.41,38.31L42.07,38.33C42.1,37.3 42.64,35.67 43.5,33.98C44.35,32.29 45.49,30.6 46.67,29.46L46.2,28.98ZM41.41,38.31C41.41,38.19 41.51,38.09 41.64,38.09V38.76C41.87,38.76 42.07,38.57 42.07,38.33L41.41,38.31ZM41.64,38.09H39.29V38.76H41.64V38.09ZM39.29,38.09C39.43,38.09 39.53,38.2 39.53,38.33L38.86,38.31C38.85,38.55 39.05,38.76 39.29,38.76V38.09ZM39.53,38.33C39.54,37.85 39.58,37.38 39.65,36.92L38.99,36.82C38.92,37.3 38.88,37.8 38.86,38.31L39.53,38.33Z"
- android:fillColor="#F5F5F5"/>
- <path
- android:pathData="M36.46,40.58C35,41.63 31.5,43.57 29.93,44.4C36.88,44.41 49.4,43.73 47.91,43.1C45.51,42.09 43.92,41.2 43.01,39.96C41.99,38.57 38.29,39.25 36.46,40.58Z"
- android:fillColor="#B27AF4"/>
- <path
- android:pathData="M36.22,40.71C36.85,40.01 38.08,38.64 38.01,37.22C37.96,36.31 37.84,35.68 37.71,35.27C37.68,35.16 37.88,34.98 37.98,35.04C39.02,35.74 40.04,36.41 42.09,36.43C42.15,36.43 42.27,36.85 42.27,36.91C42.22,38.2 42.8,40.01 43.68,40.78C44.13,41.17 42.88,41.29 41.2,41.27C49.88,41.91 56.71,48.56 56.71,56.67C56.71,65.2 49.15,72.12 39.83,72.12C30.51,72.12 22.95,65.2 22.95,56.67C22.95,48.2 30.4,41.32 39.63,41.22C38.39,41.16 37.12,41.06 36.21,40.95C36.13,40.94 36.1,40.85 36.15,40.79C36.18,40.76 36.2,40.74 36.22,40.71Z"
- android:fillColor="#B27AF4"/>
- <path
- android:pathData="M53.82,56.44C53.82,63.36 47.73,69.02 40.17,69.02C32.6,69.02 26.51,63.36 26.51,56.44C26.51,49.52 32.6,43.87 40.17,43.87C47.73,43.87 53.82,49.52 53.82,56.44Z"
- android:strokeWidth="0.667046"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M50.9,56.44C50.9,61.87 46.12,66.31 40.17,66.31C34.21,66.31 29.43,61.87 29.43,56.44C29.43,51.02 34.21,46.57 40.17,46.57C46.12,46.57 50.9,51.02 50.9,56.44Z"
- android:strokeWidth="0.667046"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M48.02,56.44C48.02,60.39 44.53,63.65 40.17,63.65C35.8,63.65 32.31,60.39 32.31,56.44C32.31,52.49 35.8,49.24 40.17,49.24C44.53,49.24 48.02,52.49 48.02,56.44Z"
- android:strokeWidth="0.667046"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M45.42,56.44C45.42,59.08 43.09,61.26 40.17,61.26C37.24,61.26 34.92,59.08 34.92,56.44C34.92,53.81 37.24,51.62 40.17,51.62C43.09,51.62 45.42,53.81 45.42,56.44Z"
- android:strokeWidth="0.667046"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M42.89,56.44C42.89,57.78 41.7,58.92 40.17,58.92C38.64,58.92 37.45,57.78 37.45,56.44C37.45,55.1 38.64,53.97 40.17,53.97C41.7,53.97 42.89,55.1 42.89,56.44Z"
- android:strokeWidth="0.667046"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M42.34,38C42.29,38.01 42.24,38.03 42.19,38.04C40.18,42.83 39,48.68 39,54.99C39,61.32 40.19,67.17 42.2,71.97C41.24,72.2 40.25,72.35 39.23,72.42C29.76,72.07 22.2,65.2 22.2,56.78C22.2,50.85 25.95,45.69 31.47,43.03C33.77,41.79 36.98,39.92 36.89,38.55C36.82,37.38 36.35,36.14 35.94,35.31C35.77,34.97 35.99,34.55 36.37,34.52L42.7,34.07C43.11,34.04 43.39,34.49 43.21,34.86C42.75,35.78 42.28,37.02 42.34,38Z"
- android:fillColor="#1F0333"
- android:fillType="evenOdd"/>
- <group>
- <clip-path
- android:pathData="M42.34,38C42.29,38.01 42.24,38.03 42.19,38.04C40.18,42.83 39,48.68 39,54.99C39,61.32 40.19,67.17 42.2,71.97C41.24,72.2 40.25,72.35 39.23,72.42C29.76,72.07 22.2,65.2 22.2,56.78C22.2,50.85 25.95,45.69 31.47,43.03C33.77,41.79 36.98,39.92 36.89,38.55C36.82,37.38 36.35,36.14 35.94,35.31C35.77,34.97 35.99,34.55 36.37,34.52L42.7,34.07C43.11,34.04 43.39,34.49 43.21,34.86C42.75,35.78 42.28,37.02 42.34,38Z"
- android:fillType="evenOdd"/>
- <path
- android:pathData="M42.19,38.04L42,37.41L41.7,37.5L41.58,37.79L42.19,38.04ZM42.34,38L42.55,38.63L43.04,38.47L43.01,37.95L42.34,38ZM42.2,71.97L42.36,72.61L43.12,72.43L42.82,71.71L42.2,71.97ZM39.23,72.42L39.21,73.08L39.24,73.08L39.27,73.08L39.23,72.42ZM31.47,43.03L31.76,43.63L31.77,43.62L31.78,43.62L31.47,43.03ZM36.89,38.55L37.56,38.51L37.56,38.51L36.89,38.55ZM35.94,35.31L35.34,35.6L35.34,35.6L35.94,35.31ZM36.37,34.52L36.32,33.86L36.32,33.86L36.37,34.52ZM42.7,34.07L42.75,34.73L42.75,34.73L42.7,34.07ZM43.21,34.86L42.61,34.56L42.61,34.56L43.21,34.86ZM42.38,38.68C42.44,38.66 42.49,38.65 42.55,38.63L42.14,37.36C42.1,37.38 42.05,37.39 42,37.41L42.38,38.68ZM39.66,54.99C39.66,48.76 40.83,43 42.81,38.3L41.58,37.79C39.53,42.67 38.33,48.6 38.33,54.99H39.66ZM42.82,71.71C40.84,67 39.66,61.24 39.66,54.99H38.33C38.33,61.4 39.53,67.34 41.59,72.23L42.82,71.71ZM39.27,73.08C40.33,73.01 41.36,72.85 42.36,72.61L42.05,71.32C41.12,71.54 40.17,71.69 39.19,71.75L39.27,73.08ZM21.54,56.78C21.54,65.63 29.46,72.72 39.21,73.08L39.26,71.75C30.06,71.41 22.86,64.77 22.86,56.78H21.54ZM31.18,42.43C25.47,45.18 21.54,50.55 21.54,56.78H22.86C22.86,51.14 26.42,46.2 31.76,43.63L31.18,42.43ZM36.23,38.59C36.23,38.67 36.19,38.88 35.9,39.23C35.62,39.56 35.2,39.92 34.68,40.3C33.64,41.07 32.3,41.83 31.15,42.44L31.78,43.62C32.94,43 34.35,42.2 35.47,41.38C36.03,40.96 36.54,40.53 36.92,40.08C37.27,39.65 37.59,39.11 37.56,38.51L36.23,38.59ZM35.34,35.6C35.73,36.4 36.16,37.54 36.23,38.59L37.56,38.51C37.47,37.21 36.96,35.88 36.53,35.02L35.34,35.6ZM36.32,33.86C35.43,33.92 34.98,34.88 35.34,35.6L36.53,35.02C36.55,35.06 36.54,35.09 36.53,35.11C36.52,35.14 36.48,35.18 36.41,35.18L36.32,33.86ZM42.65,33.4L36.32,33.86L36.41,35.18L42.75,34.73L42.65,33.4ZM43.8,35.15C44.19,34.37 43.62,33.33 42.65,33.4L42.75,34.73C42.72,34.73 42.69,34.72 42.66,34.71C42.63,34.7 42.62,34.68 42.61,34.67C42.6,34.65 42.59,34.61 42.61,34.56L43.8,35.15ZM43.01,37.95C42.96,37.17 43.35,36.07 43.8,35.15L42.61,34.56C42.14,35.5 41.61,36.88 41.68,38.04L43.01,37.95Z"
- android:fillColor="#B27AF4"/>
- </group>
- <path
- android:pathData="M32.73,48.33C32.63,48.4 32.53,48.47 32.43,48.55C32.02,48.85 31.63,49.17 31.26,49.5C31.22,49.54 31.17,49.58 31.12,49.61C30.61,49.97 29.9,49.96 29.44,49.52C28.93,49.04 28.91,48.24 29.42,47.77C29.47,47.72 29.52,47.68 29.57,47.63C29.99,47.25 30.43,46.89 30.88,46.56C31.02,46.45 31.17,46.34 31.32,46.23C31.79,45.91 32.26,45.61 32.75,45.32C32.79,45.3 32.83,45.28 32.87,45.26C32.89,45.25 32.91,45.24 32.93,45.23C33.54,44.89 34.29,45.16 34.59,45.79C34.86,46.37 34.65,47.04 34.15,47.42C34.11,47.45 34.06,47.48 34.01,47.51C33.57,47.76 33.14,48.03 32.73,48.33Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M24.9,50.74a1.27,1.27 46.59,1 0,2.54 0.07a1.27,1.27 46.59,1 0,-2.54 -0.07z"
- android:fillColor="#F9F9F9"/>
-</vector>
=====================================
fenix/app/src/main/res/font/roboto_bold.ttf deleted
=====================================
Binary files a/fenix/app/src/main/res/font/roboto_bold.ttf and /dev/null differ
=====================================
fenix/app/src/main/res/font/roboto_regular.ttf deleted
=====================================
Binary files a/fenix/app/src/main/res/font/roboto_regular.ttf and /dev/null differ
=====================================
fenix/app/src/main/res/layout/fragment_home.xml
=====================================
@@ -107,168 +107,24 @@
</com.google.android.material.appbar.CollapsingToolbarLayout>
- </com.google.android.material.appbar.AppBarLayout>
-
- <androidx.core.widget.NestedScrollView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:layout_behavior="@string/appbar_scrolling_view_behavior"
- android:paddingBottom="56dp"> <!-- height of bottom_bar -->
-
- <LinearLayout
- android:id="@+id/yec_popup"
- android:layout_width="match_parent"
+ <TextView
+ android:id="@+id/exploreprivately"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginTop="20dp"
- android:layout_marginStart="15dp"
- android:layout_marginEnd="15dp"
- android:paddingStart="30dp"
- android:paddingEnd="30dp"
- android:paddingTop="30dp"
- android:paddingBottom="30dp"
- android:layout_weight="1"
- android:orientation="vertical"
- style="@style/YecPopup" >
-
- <ImageView
- android:id="@+id/yec_close"
- android:layout_height="30dp"
- android:layout_width="30dp"
- android:layout_gravity="end"
- app:srcCompat="@drawable/ic_close"
- tools:ignore="ContentDescription" />
-
- <androidx.constraintlayout.widget.ConstraintLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginStart="40dp"
- android:layout_marginEnd="40dp"
- android:paddingTop="10dp">
-
- <!-- according to stackoverflow, width with wrap_content and match_parent are both wrong here,
- magically setting width to 0 makes it take up the space respective of constraints and the max
- :: exasperation :: -->
- <ImageView
- android:id="@+id/yec_illustration"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
-
- app:layout_constraintWidth_min="40dp"
- app:layout_constraintWidth_max="320dp"
- app:layout_constraintLeft_toLeftOf="parent"
- app:layout_constraintRight_toRightOf="parent"
- app:layout_constraintTop_toTopOf="parent"
- app:layout_constraintBottom_toBottomOf="parent"
- android:layout_gravity="center_horizontal"
-
- android:adjustViewBounds="true"
- app:layout_scrollFlags="scroll"
- app:srcCompat="@drawable/yec_illustration_android"
- tools:ignore="ContentDescription" />
-
- </androidx.constraintlayout.widget.ConstraintLayout>
-
- <TextView
- android:id="@+id/yec_matching_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:clickable="false"
- android:focusable="false"
- android:importantForAccessibility="no"
- android:layout_marginTop="15dp"
- android:text="@string/yec_2023_matched_donation"
- android:textColor="#FFBD4F"
- android:textSize="16sp"
- android:lineSpacingExtra="5dp"
- android:fontFamily="Roboto-Medium"
- app:layout_scrollFlags="scroll" />
-
- <TextView
- android:id="@+id/yec_intro_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:clickable="false"
- android:focusable="false"
- android:importantForAccessibility="no"
- android:layout_marginTop="15dp"
- android:text="@string/yec_2023_introduction"
- android:textColor="#FBFBFE"
- android:textSize="18sp"
- android:lineSpacingExtra="5dp"
- android:fontFamily="Roboto-Bold"
- android:textStyle="bold"
- app:layout_scrollFlags="scroll" />
-
- <TextView
- android:id="@+id/yec_please_donate_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:clickable="false"
- android:focusable="false"
- android:importantForAccessibility="no"
- android:layout_marginTop="15dp"
- android:text="@string/yec_2023_please_donate"
- android:textColor="#FBFBFE"
- android:textSize="16sp"
- android:lineSpacingExtra="5dp"
- android:fontFamily="Roboto-Medium"
- app:layout_scrollFlags="scroll" />
-
- <Button
- android:id="@+id/donate_now_button"
- style="@style/TorDonateYecButton"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:layout_marginTop="30dp"
- android:background="@drawable/tor_yec_donate_rounded_corners"
- android:drawableEnd="@drawable/yec_heart"
- android:drawablePadding="10dp"
- android:paddingEnd="15dp"
- android:paddingStart="15dp"
- android:text="@string/yec_2023_donate_button"
- android:textAllCaps="false"
- android:textColor="#1F0333"
- android:textSize="18sp"
- android:textStyle="bold"
- android:fontFamily="Roboto-Bold"
- android:visibility="visible"
- tools:ignore="ButtonStyleXmlDetector" />
-
- <TextView
- android:id="@+id/yec_free_to_use"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:clickable="false"
- android:focusable="false"
- android:importantForAccessibility="no"
- android:layout_marginTop="30dp"
- android:text="@string/yec_2023_free_to_use"
- android:textColor="#FBFBFE"
- android:textSize="16sp"
- android:lineSpacingExtra="5dp"
- android:fontFamily="Roboto-Medium"
- app:layout_scrollFlags="scroll" />
-
- </LinearLayout>
- </androidx.core.widget.NestedScrollView>
-
- <TextView
- android:id="@+id/exploreprivately"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center|center_vertical"
- android:gravity="center_horizontal"
- android:clickable="false"
- android:ellipsize="end"
- android:focusable="false"
- android:importantForAccessibility="no"
- android:text="@string/tor_explore_privately"
- android:fontFamily="Roboto-Medium"
- android:textColor="#DEFFFFFF"
- android:textSize="40sp"
- android:lineSpacingMultiplier="1.1"
- app:layout_scrollFlags="scroll" />
+ android:layout_gravity="center|center_vertical"
+ android:gravity="center_horizontal"
+ android:clickable="false"
+ android:ellipsize="end"
+ android:focusable="false"
+ android:importantForAccessibility="no"
+ android:text="@string/tor_explore_privately"
+ android:fontFamily="Roboto-Medium"
+ android:textColor="#DEFFFFFF"
+ android:textSize="40sp"
+ android:lineSpacingMultiplier="1.1"
+ app:layout_scrollFlags="scroll" />
+
+ </com.google.android.material.appbar.AppBarLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/sessionControlRecyclerView"
@@ -281,6 +137,7 @@
android:transitionGroup="false"
android:importantForAccessibility="yes"
android:overScrollMode="never"
+ tools:listitem="@layout/collection_home_list_row"
tools:itemCount="3"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"/>
=====================================
fenix/app/src/main/res/values/colors.xml
=====================================
@@ -274,7 +274,6 @@
<color name="onboarding_illustration_deselected_private_theme">#99FBFBFE</color>
<color name="prompt_login_edit_text_cursor_color_private_theme">@color/photonViolet50</color>
- <color name="tor_yec_home_background">#1F0333</color>
<!-- Normal theme colors for light mode -->
<color name="accent_normal_theme">@color/photonInk20</color>
<color name="accent_high_contrast_normal_theme">@color/photonInk20</color>
=====================================
fenix/app/src/main/res/values/styles.xml
=====================================
@@ -336,17 +336,6 @@
<style name="PrivateTheme" parent="PrivateThemeBase" />
- <style name="PrivateEOYTheme" parent="PrivateThemeBase" >
- <item name="android:windowBackground">@color/tor_yec_home_background</item>
- <item name="homeBackground">@color/tor_yec_home_background</item>
- </style>
-
- <style name="YecPopup" >
- <item name="homeBackground">@color/tor_yec_home_background</item>
- <item name="android:background">@drawable/tor_yec_popup_rounded_corners</item>
- </style>
-
-
<!-- Fade animation for theme switching -->
<style name="WindowAnimationTransition">
<item name="android:windowEnterAnimation">@anim/fade_in</item>
@@ -386,21 +375,6 @@
<item name="android:textColor">?attr/textPrimary</item>
</style>
- <style name="TorDonateYecButton" parent="NeutralButton">
- <item name="android:background">@drawable/tor_yec_donate_rounded_corners</item>
- <item name="backgroundTint">#FFBD4F</item>
- <item name="android:textColor">#1F0333</item>
- <item name="android:fontFamily">Roboto-Bold</item>
- <item name="fontFamily">Roboto-Bold</item>
- </style>
-
- <style name="TorDonateYecButtonText" parent="Base.TextAppearance.MaterialComponents.Badge">
-
- <item name="android:textStyle">bold</item>
- <item name="android:textColor">#000000</item>
- </style>
-
-
<style name="DestructiveButton" parent="NeutralButton">
<item name="iconTint">@color/fx_mobile_icon_color_warning_button</item>
<item name="android:textColor">@color/fx_mobile_text_color_warning_button</item>
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/f80…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/f80…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Bug 42074: YEC 2023 Android
by Dan Ballard (@dan) 18 Jan '24
by Dan Ballard (@dan) 18 Jan '24
18 Jan '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android
Commits:
35408039 by Pier Angelo Vendrame at 2024-01-16T15:28:47+01:00
fixup! Bug 42074: YEC 2023 Android
Revert "fixup! Bug 42074: YEC 2023 Android"
This reverts commit 19ec8acc732943a2ddb154f735a3eab4d3fbda99.
Revert "Bug 42074: YEC 2023 Android"
This reverts commit 465ea2a837e49ba529605c0fa74e7130e93511ad.
- - - - -
12 changed files:
- fenix/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
- fenix/app/src/main/java/org/mozilla/fenix/theme/ThemeManager.kt
- fenix/app/src/main/java/org/mozilla/fenix/tor/TorBootstrapFragment.kt
- − fenix/app/src/main/res/drawable/tor_yec_donate_rounded_corners.xml
- − fenix/app/src/main/res/drawable/tor_yec_popup_rounded_corners.xml
- − fenix/app/src/main/res/drawable/yec_heart.xml
- − fenix/app/src/main/res/drawable/yec_illustration_android.xml
- − fenix/app/src/main/res/font/roboto_bold.ttf
- − fenix/app/src/main/res/font/roboto_regular.ttf
- fenix/app/src/main/res/layout/fragment_home.xml
- fenix/app/src/main/res/values/colors.xml
- fenix/app/src/main/res/values/styles.xml
Changes:
=====================================
fenix/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
=====================================
@@ -20,6 +20,8 @@ import android.widget.PopupWindow
import androidx.annotation.VisibleForTesting
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.ContextCompat
+import androidx.core.view.children
+import androidx.core.view.doOnLayout
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
@@ -61,8 +63,6 @@ import mozilla.components.lib.state.ext.consumeFrom
import mozilla.components.service.glean.private.NoExtras
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged
-import mozilla.components.support.locale.LocaleManager
-import org.mozilla.fenix.BrowserDirection
import org.mozilla.fenix.BuildConfig
import org.mozilla.fenix.GleanMetrics.HomeScreen
import org.mozilla.fenix.GleanMetrics.PrivateBrowsingShortcutCfr
@@ -112,7 +112,6 @@ import org.mozilla.fenix.perf.MarkersFragmentLifecycleCallbacks
import org.mozilla.fenix.perf.runBlockingIncrement
import org.mozilla.fenix.search.toolbar.DefaultSearchSelectorController
import org.mozilla.fenix.search.toolbar.SearchSelectorMenu
-import org.mozilla.fenix.settings.advanced.getSelectedLocale
import org.mozilla.fenix.tabstray.TabsTrayAccessPoint
import org.mozilla.fenix.tor.TorBootstrapFragmentDirections
import org.mozilla.fenix.tor.TorBootstrapStatus
@@ -121,8 +120,6 @@ import org.mozilla.fenix.utils.Settings.Companion.TOP_SITES_PROVIDER_MAX_THRESHO
import org.mozilla.fenix.utils.allowUndo
import org.mozilla.fenix.wallpapers.Wallpaper
import java.lang.ref.WeakReference
-import java.text.NumberFormat
-import java.util.Locale
import kotlin.math.min
@Suppress("TooManyFunctions", "LargeClass")
@@ -139,8 +136,6 @@ class HomeFragment : Fragment() {
private val homeViewModel: HomeScreenViewModel by activityViewModels()
- private var hideYEC = false
-
private val snackbarAnchorView: View?
get() = when (requireContext().settings().toolbarPosition) {
ToolbarPosition.BOTTOM -> binding.toolbarLayout
@@ -448,27 +443,6 @@ class HomeFragment : Fragment() {
// FxNimbus.features.homescreen.recordExposure()
- controlYECDisplay()
-
- binding.donateNowButton.setOnClickListener {
- val country = LocaleManager.getSelectedLocale(requireContext()).country
- var locale = LocaleManager.getSelectedLocale(requireContext()).language
- if (country != "") {
- locale = "${locale}-${country}"
- }
- val localeUrl = "https://www.torproject.org/donate/2023yec-${locale}-mobile"
- activity.openToBrowserAndLoad(
- searchTermOrURL = localeUrl,
- newTab = true,
- from = BrowserDirection.FromHome
- )
- }
-
- binding.yecClose.setOnClickListener {
- this.hideYEC = true
- controlYECDisplay()
- }
-
// DO NOT MOVE ANYTHING BELOW THIS addMarker CALL!
requireComponents.core.engine.profiler?.addMarker(
MarkersFragmentLifecycleCallbacks.MARKER_NAME,
@@ -478,105 +452,6 @@ class HomeFragment : Fragment() {
return binding.root
}
- fun controlYECDisplay() {
- val yec23show = ((activity as? HomeActivity)?.themeManager?.isYECActive ?: false) && ! this.hideYEC
- val yec23matchingShow = ((activity as? HomeActivity)?.themeManager?.isYECPhase2Active ?: false) && ! this.hideYEC
-
- // hude onion pattern during EOY event
- binding.onionPatternImage.apply {
- visibility = if (!yec23show) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
-
- // Hide tor browser header EOY event
- binding.exploreprivately.apply {
- visibility = if (!yec23show) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
-
- // Hide EOY header text before EOY event
- binding.yecIntroText.apply {
- visibility = if (yec23show) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
-
- // Hide EOY matching announcement before its time
- binding.yecMatchingText.apply {
- visibility = if (yec23matchingShow) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
- binding.yecMatchingText.text = binding.yecMatchingText.text.replace(Regex("%s"), NumberFormat.getNumberInstance(Locale.getDefault()).format(75000))
-
- // Hide the EOY image before EOY event
- binding.yecIllustration.apply {
- visibility = if (yec23show) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
-
- binding.yecPleaseDonateText.apply {
- visibility = if (yec23show) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
- binding.yecFreeToUse.apply {
- visibility = if (yec23show) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
-
- // Hide the EOY donate button before EOY event
- binding.donateNowButton.apply {
- visibility = if (yec23show) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
-
- // Hide the EOY image before EOY event
- binding.yecPopup.apply {
- visibility = if (yec23show) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
-
- binding.exploreprivately.apply {
- visibility = if (yec23show) {
- View.GONE
- } else {
- View.VISIBLE
- }
- }
-
- binding.homeAppBar.apply {
- if (!yec23show){
- setExpanded(true, true)
- }
- }
-
- }
-
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
=====================================
fenix/app/src/main/java/org/mozilla/fenix/theme/ThemeManager.kt
=====================================
@@ -23,23 +23,11 @@ import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
import org.mozilla.fenix.customtabs.ExternalAppBrowserActivity
-import java.util.Date
abstract class ThemeManager {
- // 1696118400000 // 2022 10 04 - testing
- // 1697414400000 // 2023 10 16
- private val yec2023LaunchDate = Date(1697414400000)
- // 1700614800000 // 2023 11 22
- private val yec2023Phase2 = Date(1700614800000)
- // 1704067200000 // 2024 01 01
- private val yec2023EndDate = Date(1704067200000)
-
abstract var currentTheme: BrowsingMode
- val isYECActive get() = Date().after(yec2023LaunchDate) && Date().before(yec2023EndDate)
- val isYECPhase2Active get() = Date().after(yec2023Phase2) && Date().before(yec2023EndDate)
-
/**
* Returns the style resource corresponding to the [currentTheme].
*/
=====================================
fenix/app/src/main/java/org/mozilla/fenix/tor/TorBootstrapFragment.kt
=====================================
@@ -118,10 +118,6 @@ class TorBootstrapFragment : Fragment() {
binding.toolbarLayout.apply {
visibility = View.GONE
}
-
- binding.yecPopup.apply {
- visibility = View.GONE
- }
}
// This function should be paired with adjustHomeFragmentView()
=====================================
fenix/app/src/main/res/drawable/tor_yec_donate_rounded_corners.xml deleted
=====================================
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
- - License, v. 2.0. If a copy of the MPL was not distributed with this
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!-- Used for rounding the corners of a button -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <solid android:color="#FFBD4F" />
- <corners android:radius="10dp" />
-</shape>
=====================================
fenix/app/src/main/res/drawable/tor_yec_popup_rounded_corners.xml deleted
=====================================
@@ -1,5 +0,0 @@
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <solid android:color="#1F0333" />
- <corners android:radius="10dp" />
-</shape>
=====================================
fenix/app/src/main/res/drawable/yec_heart.xml deleted
=====================================
@@ -1,12 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="20dp"
- android:height="20dp"
- android:viewportWidth="16"
- android:viewportHeight="16">
- <path
- android:pathData="M8,6C8,6 8,2 11.5,2C15,2 15,5 15,6C15,10.5 8,15 8,15V6Z"
- android:fillColor="#1C1B22"/>
- <path
- android:pathData="M8,6C8,6 8,2 4.5,2C1,2 1,5 1,6C1,10.5 8,15 8,15L9,9L8,6Z"
- android:fillColor="#1C1B22"/>
-</vector>
=====================================
fenix/app/src/main/res/drawable/yec_illustration_android.xml deleted
=====================================
@@ -1,294 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="166dp"
- android:height="148dp"
- android:viewportWidth="166"
- android:viewportHeight="148">
- <path
- android:pathData="M126.13,91.93L125.73,68.74L130.04,68.67L130.44,91.98H131.45C131.55,88.57 134.35,85.84 137.78,85.84H151.17C154.68,85.84 157.51,88.68 157.51,92.18V99.25C157.51,102.73 154.69,105.55 151.21,105.55C147.73,105.55 144.91,102.73 144.91,99.25V98.32C144.91,97.2 144,96.29 142.88,96.29H130.51L130.6,101.24H131.24C134.74,101.24 137.58,104.08 137.58,107.58V112.36C137.58,115.86 134.74,118.7 131.24,118.7H130.89L131.15,134.12C131.22,137.68 128.3,140.57 124.78,140.57C121.3,140.57 118.41,137.75 118.41,134.22V120.73C118.41,117.23 121.25,114.39 124.75,114.39H126.51L126.36,105.55H120.12C116.61,105.55 113.78,102.71 113.78,99.21V87.67C113.78,84.69 116.19,82.28 119.16,82.28C122.14,82.28 124.55,84.69 124.55,87.67V89.95C124.55,90.91 125.22,91.72 126.13,91.93ZM126.2,96.28C122.88,96.08 120.24,93.32 120.24,89.95V87.67C120.24,87.07 119.76,86.59 119.16,86.59C118.57,86.59 118.08,87.07 118.08,87.67V99.21C118.08,100.33 118.99,101.24 120.12,101.24H126.29L126.2,96.28ZM130.67,105.55L130.82,114.39H131.24C132.37,114.39 133.27,113.48 133.27,112.36V107.58C133.27,106.46 132.37,105.55 131.24,105.55H130.67ZM126.58,118.7H124.75C123.63,118.7 122.72,119.61 122.72,120.73V134.22C122.72,135.32 123.64,136.26 124.78,136.26C125.94,136.26 126.86,135.3 126.85,134.19L126.58,118.7ZM135.76,91.98H142.88C146.38,91.98 149.22,94.82 149.22,98.32V99.25C149.22,100.35 150.11,101.24 151.21,101.24C152.31,101.24 153.21,100.35 153.21,99.25V92.18C153.21,91.06 152.29,90.15 151.17,90.15H137.78C136.73,90.15 135.86,90.95 135.76,91.98Z"
- android:strokeWidth="0.667939"
- android:fillColor="#F5F5F5"
- android:fillType="evenOdd"
- android:strokeColor="#F5F5F5"/>
- <path
- android:pathData="M128.04,91.89L127.64,68.71L131.95,68.64L132.35,91.94H133.35C133.46,88.53 136.26,85.8 139.69,85.8H153.08C156.58,85.8 159.42,88.64 159.42,92.14V99.21C159.42,102.69 156.6,105.52 153.12,105.52C149.64,105.52 146.82,102.69 146.82,99.21V98.28C146.82,97.16 145.91,96.25 144.79,96.25H132.42L132.51,101.21H133.15C136.65,101.21 139.49,104.05 139.49,107.55V112.32C139.49,115.82 136.65,118.66 133.15,118.66H132.8L133.06,134.08C133.12,137.65 130.21,140.53 126.69,140.53C123.21,140.53 120.32,137.71 120.32,134.19V120.69C120.32,117.19 123.15,114.35 126.66,114.35H128.42L128.27,105.52H122.03C118.52,105.52 115.68,102.68 115.68,99.17V87.63C115.68,84.66 118.1,82.25 121.07,82.25C124.04,82.25 126.46,84.66 126.46,87.63V89.91C126.46,90.88 127.13,91.69 128.04,91.89ZM128.11,96.24C124.78,96.04 122.15,93.29 122.15,89.91V87.63C122.15,87.04 121.67,86.56 121.07,86.56C120.47,86.56 119.99,87.04 119.99,87.63V99.17C119.99,100.3 120.9,101.21 122.03,101.21H128.2L128.11,96.24ZM132.58,105.52L132.73,114.35H133.15C134.27,114.35 135.18,113.44 135.18,112.32V107.55C135.18,106.43 134.27,105.52 133.15,105.52H132.58ZM128.49,118.66H126.66C125.54,118.66 124.63,119.57 124.63,120.69V134.19C124.63,135.29 125.55,136.22 126.69,136.22C127.85,136.22 128.77,135.27 128.76,134.15L128.49,118.66ZM137.67,91.94H144.79C148.29,91.94 151.13,94.78 151.13,98.28V99.21C151.13,100.31 152.02,101.21 153.12,101.21C154.22,101.21 155.11,100.31 155.11,99.21V92.14C155.11,91.02 154.2,90.11 153.08,90.11H139.69C138.64,90.11 137.77,90.91 137.67,91.94Z"
- android:strokeWidth="0.667939"
- android:fillColor="#1F0333"
- android:fillType="evenOdd"
- android:strokeColor="#F5F5F5"/>
- <path
- android:pathData="M93.9,101.29H93.56V101.63V103.55C93.56,104.84 94.61,105.89 95.91,105.89H100.17C103.5,105.89 106.2,108.59 106.2,111.92V118.45C106.2,121.78 103.5,124.48 100.17,124.48H94.71C93.84,124.48 93.13,125.19 93.13,126.06C93.13,126.93 93.84,127.64 94.71,127.64H100.17C103.5,127.64 106.2,130.34 106.2,133.67V134.17C106.2,137.5 103.5,140.2 100.17,140.2H63.16C59.83,140.2 57.13,137.5 57.13,134.17V130.84C57.13,127.51 59.83,124.82 63.16,124.82H64.81C66.1,124.82 67.15,123.77 67.15,122.47V121.78C67.15,120.49 66.1,119.44 64.81,119.44H63.16C59.83,119.44 57.13,116.74 57.13,113.41V111.06C57.13,107.72 59.83,105.03 63.16,105.03H70.02C71.31,105.03 72.36,103.98 72.36,102.68V101.63V101.29H72.03H68.87C65.54,101.29 62.84,98.6 62.84,95.27V93.36C62.84,90.03 65.54,87.33 68.87,87.33H70.02C73.35,87.33 76.05,90.03 76.05,93.36V97.28V97.61H76.38H89.55H89.88V97.28V91.35V91.02H89.55H87.06C83.73,91.02 81.03,88.32 81.03,84.99V69.52H84.71V84.99C84.71,86.29 85.76,87.33 87.06,87.33H97.91C101.24,87.33 103.94,90.03 103.94,93.36V95.27C103.94,98.6 101.24,101.29 97.91,101.29H93.9ZM93.56,97.28V97.61H93.9H97.91C99.2,97.61 100.25,96.56 100.25,95.27V93.36C100.25,92.07 99.2,91.02 97.91,91.02H93.9H93.56V91.35V97.28ZM76.38,101.29H76.05V101.63V102.68C76.05,106.01 73.35,108.71 70.02,108.71H63.16C61.86,108.71 60.81,109.76 60.81,111.06V113.41C60.81,114.7 61.86,115.75 63.16,115.75H64.81C68.13,115.75 70.83,118.45 70.83,121.78V122.47C70.83,125.8 68.13,128.5 64.81,128.5H63.16C61.86,128.5 60.81,129.55 60.81,130.84V134.17C60.81,135.46 61.86,136.51 63.16,136.51H100.17C101.47,136.51 102.51,135.46 102.51,134.17V133.67C102.51,132.37 101.47,131.32 100.17,131.32H94.71C91.81,131.32 89.45,128.97 89.45,126.06C89.45,123.15 91.81,120.8 94.71,120.8H100.17C101.47,120.8 102.51,119.75 102.51,118.45V111.92C102.51,110.63 101.47,109.58 100.17,109.58H95.91C92.58,109.58 89.88,106.88 89.88,103.55V101.63V101.29H89.55H76.38ZM72.03,97.61H72.36V97.28V93.36C72.36,92.07 71.31,91.02 70.02,91.02H68.87C67.57,91.02 66.52,92.07 66.52,93.36V95.27C66.52,96.56 67.57,97.61 68.87,97.61H72.03Z"
- android:strokeWidth="0.667939"
- android:fillColor="#F5F5F5"
- android:strokeColor="#F5F5F5"/>
- <path
- android:pathData="M95.81,101.29H95.47V101.63V103.55C95.47,104.84 96.52,105.89 97.82,105.89H102.08C105.41,105.89 108.11,108.59 108.11,111.92V118.45C108.11,121.78 105.41,124.48 102.08,124.48H96.62C95.75,124.48 95.04,125.19 95.04,126.06C95.04,126.93 95.75,127.64 96.62,127.64H102.08C105.41,127.64 108.11,130.34 108.11,133.67V134.17C108.11,137.5 105.41,140.2 102.08,140.2H65.07C61.74,140.2 59.04,137.5 59.04,134.17V130.84C59.04,127.51 61.74,124.82 65.07,124.82H66.71C68.01,124.82 69.06,123.77 69.06,122.47V121.78C69.06,120.49 68.01,119.44 66.71,119.44H65.07C61.74,119.44 59.04,116.74 59.04,113.41V111.06C59.04,107.72 61.74,105.03 65.07,105.03H71.93C73.22,105.03 74.27,103.98 74.27,102.68V101.63V101.29H73.94H70.78C67.45,101.29 64.75,98.6 64.75,95.27V93.36C64.75,90.03 67.45,87.33 70.78,87.33H71.93C75.26,87.33 77.96,90.03 77.96,93.36V97.28V97.61H78.29H91.45H91.79V97.28V91.35V91.02H91.45H88.96C85.64,91.02 82.94,88.32 82.94,84.99V69.52H86.62V84.99C86.62,86.29 87.67,87.33 88.96,87.33H99.82C103.15,87.33 105.85,90.03 105.85,93.36V95.27C105.85,98.6 103.15,101.29 99.82,101.29H95.81ZM95.47,97.28V97.61H95.81H99.82C101.11,97.61 102.16,96.56 102.16,95.27V93.36C102.16,92.07 101.11,91.02 99.82,91.02H95.81H95.47V91.35V97.28ZM78.29,101.29H77.96V101.63V102.68C77.96,106.01 75.26,108.71 71.93,108.71H65.07C63.77,108.71 62.72,109.76 62.72,111.06V113.41C62.72,114.7 63.77,115.75 65.07,115.75H66.71C70.04,115.75 72.74,118.45 72.74,121.78V122.47C72.74,125.8 70.04,128.5 66.71,128.5H65.07C63.77,128.5 62.72,129.55 62.72,130.84V134.17C62.72,135.46 63.77,136.51 65.07,136.51H102.08C103.37,136.51 104.42,135.46 104.42,134.17V133.67C104.42,132.37 103.37,131.32 102.08,131.32H96.62C93.71,131.32 91.36,128.97 91.36,126.06C91.36,123.15 93.71,120.8 96.62,120.8H102.08C103.37,120.8 104.42,119.75 104.42,118.45V111.92C104.42,110.63 103.37,109.58 102.08,109.58H97.82C94.49,109.58 91.79,106.88 91.79,103.55V101.63V101.29H91.45H78.29ZM73.94,97.61H74.27V97.28V93.36C74.27,92.07 73.22,91.02 71.93,91.02H70.78C69.48,91.02 68.43,92.07 68.43,93.36V95.27C68.43,96.56 69.48,97.61 70.78,97.61H73.94Z"
- android:strokeWidth="0.667939"
- android:fillColor="#1F0333"
- android:strokeColor="#F5F5F5"/>
- <path
- android:pathData="M34.54,77.93V70.95H38.9V77.93C38.9,81.44 36.05,84.29 32.54,84.29H15.98C14.88,84.29 13.97,85.19 13.97,86.31C13.97,87.43 14.88,88.33 15.98,88.33H40.34V86.3C40.34,82.79 43.19,79.94 46.7,79.94H52.25C55.77,79.94 58.61,82.8 58.61,86.31C58.61,89.82 55.77,92.68 52.25,92.68H44.69V103.56C44.69,105.04 43.72,106.31 42.37,106.74V108.34C42.37,111.54 39.78,114.13 36.57,114.13H31.36V119.35H36.01C39.52,119.35 42.37,122.19 42.37,125.71V134.1C42.37,137.61 39.52,140.46 36.01,140.46H33.37C29.86,140.46 27.01,137.61 27.01,134.1V123.7H26.97C23.46,123.7 20.61,120.85 20.61,117.34V116.14C20.61,112.63 23.46,109.78 26.97,109.78H27.01V102.52C27.01,99.01 29.86,96.16 33.37,96.16H40.34V92.68H15.98C12.46,92.68 9.62,89.82 9.62,86.31C9.62,82.8 12.46,79.94 15.98,79.94H32.54C33.65,79.94 34.54,79.04 34.54,77.93ZM40.34,100.51H33.37C32.26,100.51 31.36,101.41 31.36,102.52V109.78H36.57C37.37,109.78 38.02,109.14 38.02,108.34V105.88C38.02,104.39 38.99,103.13 40.34,102.7V100.51ZM27.01,114.13H26.97C25.86,114.13 24.96,115.03 24.96,116.14V117.34C24.96,118.45 25.86,119.35 26.97,119.35H27.01V114.13ZM31.36,123.7V134.1C31.36,135.21 32.26,136.11 33.37,136.11H36.01C37.12,136.11 38.02,135.21 38.02,134.1V125.71C38.02,124.6 37.12,123.7 36.01,123.7H31.36ZM44.69,88.33H52.25C53.35,88.33 54.26,87.43 54.26,86.31C54.26,85.19 53.35,84.29 52.25,84.29H46.7C45.59,84.29 44.69,85.19 44.69,86.3V88.33Z"
- android:strokeWidth="0.667939"
- android:fillColor="#F5F5F5"
- android:fillType="evenOdd"
- android:strokeColor="#F5F5F5"/>
- <path
- android:pathData="M36.45,78.04V71.13H40.81V78.04C40.81,81.55 37.96,84.4 34.44,84.4H17.89C16.79,84.4 15.88,85.3 15.88,86.42C15.88,87.54 16.79,88.44 17.89,88.44H42.25V86.41C42.25,82.89 45.1,80.05 48.61,80.05H54.16C57.68,80.05 60.52,82.91 60.52,86.42C60.52,89.93 57.68,92.79 54.16,92.79H46.6V103.66C46.6,105.15 45.63,106.41 44.28,106.84V108.44C44.28,111.65 41.69,114.24 38.48,114.24H33.27V119.45H37.92C41.43,119.45 44.28,122.3 44.28,125.82V134.21C44.28,137.72 41.43,140.57 37.92,140.57H35.28C31.77,140.57 28.92,137.72 28.92,134.21V123.81H28.88C25.37,123.81 22.52,120.96 22.52,117.44V116.25C22.52,112.74 25.37,109.89 28.88,109.89H28.92V102.63C28.92,99.11 31.77,96.26 35.28,96.26H42.25V92.79H17.89C14.37,92.79 11.53,89.93 11.53,86.42C11.53,82.91 14.37,80.05 17.89,80.05H34.44C35.55,80.05 36.45,79.15 36.45,78.04ZM42.25,100.62H35.28C34.17,100.62 33.27,101.52 33.27,102.63V109.89H38.48C39.28,109.89 39.93,109.24 39.93,108.44V105.99C39.93,104.5 40.9,103.24 42.25,102.81V100.62ZM28.92,114.24H28.88C27.77,114.24 26.87,115.14 26.87,116.25V117.44C26.87,118.55 27.77,119.45 28.88,119.45H28.92V114.24ZM33.27,123.81V134.21C33.27,135.32 34.17,136.22 35.28,136.22H37.92C39.03,136.22 39.93,135.32 39.93,134.21V125.82C39.93,124.71 39.03,123.81 37.92,123.81H33.27ZM46.6,88.44H54.16C55.26,88.44 56.17,87.54 56.17,86.42C56.17,85.3 55.26,84.4 54.16,84.4H48.61C47.5,84.4 46.6,85.3 46.6,86.41V88.44Z"
- android:strokeWidth="0.667939"
- android:fillColor="#1F0333"
- android:fillType="evenOdd"
- android:strokeColor="#F5F5F5"/>
- <path
- android:pathData="M146.05,19.25C146.05,19.53 146.28,19.75 146.56,19.75C146.84,19.75 147.07,19.53 147.07,19.25V14.35L148.52,12.9C148.56,12.87 148.59,12.83 148.61,12.79H153.53C153.81,12.79 154.04,12.56 154.04,12.28C154.04,12 153.81,11.78 153.53,11.78H148.35L147.07,10.49V5.32C147.07,5.04 146.84,4.81 146.56,4.81C146.28,4.81 146.05,5.04 146.05,5.32V10.49L144.77,11.78H139.6C139.32,11.78 139.09,12 139.09,12.28C139.09,12.56 139.32,12.79 139.6,12.79H144.51C144.54,12.83 144.57,12.87 144.6,12.9L146.05,14.35V19.25Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:strokeWidth="1"
- android:pathData="M146.05,19.25C146.05,19.53 146.28,19.75 146.56,19.75C146.84,19.75 147.07,19.53 147.07,19.25V14.35L148.52,12.9C148.56,12.87 148.59,12.83 148.61,12.79H153.53C153.81,12.79 154.04,12.56 154.04,12.28C154.04,12 153.81,11.78 153.53,11.78H148.35L147.07,10.49V5.32C147.07,5.04 146.84,4.81 146.56,4.81C146.28,4.81 146.05,5.04 146.05,5.32V10.49L144.77,11.78H139.6C139.32,11.78 139.09,12 139.09,12.28C139.09,12.56 139.32,12.79 139.6,12.79H144.51C144.54,12.83 144.57,12.87 144.6,12.9L146.05,14.35V19.25Z"
- android:fillColor="#00000000"
- android:strokeColor="#F9F9F9"/>
- <path
- android:pathData="M145.15,5.5L146.3,4.89L146.42,5.9L145.15,5.5Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M153.3,13.66L152.89,12.42L153.97,12.53L153.3,13.66Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M146.33,20.63L145.92,19.39L147.01,19.49L146.33,20.63Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M138.22,12.44L139.39,11.82L139.51,12.83L138.22,12.44Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M145.29,21.35C144.81,21.35 144.42,20.96 144.42,20.48V15.74L143.07,14.39C143.07,14.39 143.07,14.39 143.07,14.39C143.07,14.39 143.07,14.39 143.07,14.38H138.33C137.85,14.38 137.46,13.99 137.46,13.51C137.46,13.03 137.85,12.64 138.33,12.64H143.35L144.42,11.57V6.55C144.42,6.07 144.81,5.68 145.29,5.68C145.77,5.68 146.16,6.07 146.16,6.55V11.57L147.24,12.64H152.26C152.74,12.64 153.13,13.03 153.13,13.51C153.13,13.99 152.74,14.38 152.26,14.38H147.51C147.51,14.39 147.51,14.39 147.51,14.39C147.51,14.39 147.51,14.39 147.51,14.39L146.16,15.74V20.48C146.16,20.96 145.77,21.35 145.29,21.35ZM145.8,15.59L147.25,14.13C147.29,14.1 147.32,14.06 147.34,14.02H152.26C152.54,14.02 152.76,13.79 152.76,13.51C152.76,13.23 152.54,13.01 152.26,13.01H147.08L145.8,11.72V6.55C145.8,6.27 145.57,6.04 145.29,6.04C145.01,6.04 144.79,6.27 144.79,6.55V11.72L143.5,13.01H138.33C138.05,13.01 137.82,13.23 137.82,13.51C137.82,13.79 138.05,14.02 138.33,14.02H143.24C143.27,14.06 143.3,14.1 143.33,14.13L144.79,15.59V20.48C144.79,20.76 145.01,20.98 145.29,20.98C145.57,20.98 145.8,20.76 145.8,20.48V15.59Z"
- android:fillColor="#F9F9F9"
- android:fillType="evenOdd"/>
- <path
- android:pathData="M144.45,20.48C144.45,20.94 144.83,21.32 145.29,21.32C145.76,21.32 146.13,20.94 146.13,20.48V15.72L147.49,14.37C147.49,14.37 147.49,14.37 147.49,14.37C147.49,14.36 147.5,14.36 147.5,14.35H152.26C152.72,14.35 153.1,13.98 153.1,13.51C153.1,13.05 152.72,12.67 152.26,12.67H147.22L146.13,11.58V6.55C146.13,6.08 145.76,5.71 145.29,5.71C144.83,5.71 144.45,6.08 144.45,6.55V11.58L143.36,12.67H138.33C137.86,12.67 137.49,13.05 137.49,13.51C137.49,13.98 137.86,14.35 138.33,14.35H143.08C143.09,14.36 143.09,14.36 143.1,14.37L144.45,15.72V20.48Z"
- android:strokeWidth="0.666912"
- android:fillColor="#FBBE22"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M154.02,30.2C154.02,30.44 154.22,30.64 154.46,30.64C154.71,30.64 154.9,30.44 154.9,30.2V25.93L156.17,24.67C156.2,24.64 156.23,24.6 156.25,24.57H160.53C160.78,24.57 160.98,24.37 160.98,24.13C160.98,23.88 160.78,23.68 160.53,23.68H156.02L154.9,22.57V18.06C154.9,17.81 154.71,17.61 154.46,17.61C154.22,17.61 154.02,17.81 154.02,18.06V22.57L152.9,23.68H148.39C148.15,23.68 147.95,23.88 147.95,24.13C147.95,24.37 148.15,24.57 148.39,24.57H152.68C152.7,24.6 152.72,24.64 152.75,24.67L154.02,25.93V30.2Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:strokeWidth="1"
- android:pathData="M154.02,30.2C154.02,30.44 154.22,30.64 154.46,30.64C154.71,30.64 154.9,30.44 154.9,30.2V25.93L156.17,24.67C156.2,24.64 156.23,24.6 156.25,24.57H160.53C160.78,24.57 160.98,24.37 160.98,24.13C160.98,23.88 160.78,23.68 160.53,23.68H156.02L154.9,22.57V18.06C154.9,17.81 154.71,17.61 154.46,17.61C154.22,17.61 154.02,17.81 154.02,18.06V22.57L152.9,23.68H148.39C148.15,23.68 147.95,23.88 147.95,24.13C147.95,24.37 148.15,24.57 148.39,24.57H152.68C152.7,24.6 152.72,24.64 152.75,24.67L154.02,25.93V30.2Z"
- android:fillColor="#00000000"
- android:strokeColor="#F9F9F9"/>
- <path
- android:pathData="M153.23,18.21L154.23,17.69L154.34,18.57L153.23,18.21Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M160.33,25.33L159.98,24.25L160.92,24.34L160.33,25.33Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M154.26,31.4L153.91,30.32L154.85,30.41L154.26,31.4Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M147.19,24.27L148.21,23.72L148.32,24.6L147.19,24.27Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M153.35,32.03C152.93,32.03 152.6,31.69 152.6,31.27V27.14L151.42,25.96C151.42,25.96 151.42,25.96 151.42,25.96C151.42,25.96 151.42,25.96 151.42,25.96H147.29C146.87,25.96 146.52,25.62 146.52,25.2C146.52,24.78 146.87,24.44 147.29,24.44H151.66L152.6,23.51V19.13C152.6,18.71 152.93,18.37 153.35,18.37C153.77,18.37 154.11,18.71 154.11,19.13V23.51L155.05,24.44H159.43C159.85,24.44 160.18,24.78 160.18,25.2C160.18,25.62 159.85,25.96 159.43,25.96H155.29C155.29,25.96 155.29,25.96 155.29,25.96C155.29,25.96 155.29,25.96 155.29,25.96L154.11,27.14V31.27C154.11,31.69 153.77,32.03 153.35,32.03ZM153.8,27.01L155.06,25.74C155.09,25.71 155.12,25.68 155.14,25.64H159.43C159.67,25.64 159.87,25.44 159.87,25.2C159.87,24.96 159.67,24.76 159.43,24.76H154.92L153.8,23.64V19.13C153.8,18.89 153.6,18.69 153.35,18.69C153.11,18.69 152.91,18.89 152.91,19.13V23.64L151.79,24.76H147.29C147.04,24.76 146.84,24.96 146.84,25.2C146.84,25.44 147.04,25.64 147.29,25.64H151.57C151.59,25.68 151.62,25.71 151.65,25.74L152.91,27.01V31.27C152.91,31.51 153.11,31.71 153.35,31.71C153.6,31.71 153.8,31.51 153.8,31.27V27.01Z"
- android:fillColor="#F9F9F9"
- android:fillType="evenOdd"/>
- <path
- android:pathData="M152.58,31.27C152.58,31.7 152.93,32.04 153.35,32.04C153.78,32.04 154.13,31.7 154.13,31.27V27.14L155.3,25.97H159.43C159.85,25.97 160.2,25.63 160.2,25.2C160.2,24.77 159.85,24.42 159.43,24.42H155.05L154.13,23.5V19.13C154.13,18.7 153.78,18.35 153.35,18.35C152.93,18.35 152.58,18.7 152.58,19.13V23.5L151.65,24.42H147.29C146.86,24.42 146.51,24.77 146.51,25.2C146.51,25.63 146.86,25.97 147.29,25.97H151.41L152.58,27.14V31.27Z"
- android:strokeWidth="0.666912"
- android:fillColor="#FBBE22"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M11.76,48.84C11.76,49.09 11.57,49.28 11.32,49.28C11.08,49.28 10.88,49.09 10.88,48.84V44.58L9.61,43.31C9.58,43.28 9.56,43.25 9.53,43.21H5.25C5.01,43.21 4.81,43.02 4.81,42.77C4.81,42.53 5.01,42.33 5.25,42.33H9.76L10.88,41.21V36.7C10.88,36.46 11.08,36.26 11.32,36.26C11.57,36.26 11.76,36.46 11.76,36.7V41.21L12.88,42.33H17.39C17.64,42.33 17.83,42.53 17.83,42.77C17.83,43.02 17.64,43.21 17.39,43.21H13.11C13.09,43.25 13.06,43.28 13.03,43.31L11.76,44.58V48.84Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:strokeWidth="1"
- android:pathData="M11.76,48.84C11.76,49.09 11.57,49.28 11.32,49.28C11.08,49.28 10.88,49.09 10.88,48.84V44.58L9.61,43.31C9.58,43.28 9.56,43.25 9.53,43.21H5.25C5.01,43.21 4.81,43.02 4.81,42.77C4.81,42.53 5.01,42.33 5.25,42.33H9.76L10.88,41.21V36.7C10.88,36.46 11.08,36.26 11.32,36.26C11.57,36.26 11.76,36.46 11.76,36.7V41.21L12.88,42.33H17.39C17.64,42.33 17.83,42.53 17.83,42.77C17.83,43.02 17.64,43.21 17.39,43.21H13.11C13.09,43.25 13.06,43.28 13.03,43.31L11.76,44.58V48.84Z"
- android:fillColor="#00000000"
- android:strokeColor="#F9F9F9"/>
- <path
- android:pathData="M12.56,36.86L11.55,36.33L11.45,37.21L12.56,36.86Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M5.45,43.97L5.81,42.89L4.86,42.98L5.45,43.97Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M11.52,50.04L11.88,48.96L10.94,49.05L11.52,50.04Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M18.59,42.91L17.57,42.37L17.46,43.25L18.59,42.91Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M12.43,50.67C12.85,50.67 13.19,50.33 13.19,49.91V45.78L14.36,44.61C14.36,44.61 14.36,44.61 14.36,44.61C14.37,44.61 14.37,44.61 14.37,44.6H18.5C18.92,44.6 19.26,44.26 19.26,43.84C19.26,43.42 18.92,43.08 18.5,43.08H14.12L13.19,42.15V37.77C13.19,37.35 12.85,37.01 12.43,37.01C12.01,37.01 11.67,37.35 11.67,37.77V42.15L10.74,43.08H6.36C5.94,43.08 5.6,43.42 5.6,43.84C5.6,44.26 5.94,44.6 6.36,44.6H10.49C10.49,44.61 10.49,44.61 10.5,44.61C10.5,44.61 10.5,44.61 10.5,44.61L11.67,45.78V49.91C11.67,50.33 12.01,50.67 12.43,50.67ZM11.99,45.65L10.72,44.38C10.69,44.35 10.66,44.32 10.64,44.29H6.36C6.12,44.29 5.92,44.09 5.92,43.84C5.92,43.6 6.12,43.4 6.36,43.4H10.87L11.99,42.28V37.77C11.99,37.53 12.19,37.33 12.43,37.33C12.67,37.33 12.87,37.53 12.87,37.77V42.28L13.99,43.4H18.5C18.74,43.4 18.94,43.6 18.94,43.84C18.94,44.09 18.74,44.29 18.5,44.29H14.22C14.2,44.32 14.17,44.35 14.14,44.38L12.87,45.65V49.91C12.87,50.16 12.67,50.36 12.43,50.36C12.19,50.36 11.99,50.16 11.99,49.91V45.65Z"
- android:fillColor="#F9F9F9"
- android:fillType="evenOdd"/>
- <path
- android:pathData="M13.21,49.91C13.21,50.34 12.86,50.69 12.43,50.69C12,50.69 11.65,50.34 11.65,49.91V45.79L10.49,44.62H6.36C5.93,44.62 5.58,44.27 5.58,43.84C5.58,43.42 5.93,43.07 6.36,43.07H10.73L11.65,42.14V37.77C11.65,37.35 12,37 12.43,37C12.86,37 13.21,37.35 13.21,37.77V42.14L14.13,43.07H18.5C18.93,43.07 19.28,43.42 19.28,43.84C19.28,44.27 18.93,44.62 18.5,44.62H14.37L13.21,45.79V49.91Z"
- android:strokeWidth="0.666912"
- android:fillColor="#FBBE22"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M82.61,121.73C82.61,121.98 82.8,122.17 83.05,122.17C83.29,122.17 83.49,121.98 83.49,121.73V117.47L84.76,116.2C84.79,116.17 84.81,116.14 84.84,116.1H89.12C89.36,116.1 89.56,115.91 89.56,115.66C89.56,115.42 89.36,115.22 89.12,115.22H84.61L83.49,114.1V109.59C83.49,109.35 83.29,109.15 83.05,109.15C82.8,109.15 82.61,109.35 82.61,109.59V114.1L81.49,115.22H76.98C76.73,115.22 76.54,115.42 76.54,115.66C76.54,115.91 76.73,116.1 76.98,116.1H81.26C81.28,116.14 81.31,116.17 81.34,116.2L82.61,117.47V121.73Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:strokeWidth="1"
- android:pathData="M82.61,121.73C82.61,121.98 82.8,122.17 83.05,122.17C83.29,122.17 83.49,121.98 83.49,121.73V117.47L84.76,116.2C84.79,116.17 84.81,116.14 84.84,116.1H89.12C89.36,116.1 89.56,115.91 89.56,115.66C89.56,115.42 89.36,115.22 89.12,115.22H84.61L83.49,114.1V109.59C83.49,109.35 83.29,109.15 83.05,109.15C82.8,109.15 82.61,109.35 82.61,109.59V114.1L81.49,115.22H76.98C76.73,115.22 76.54,115.42 76.54,115.66C76.54,115.91 76.73,116.1 76.98,116.1H81.26C81.28,116.14 81.31,116.17 81.34,116.2L82.61,117.47V121.73Z"
- android:fillColor="#00000000"
- android:strokeColor="#F9F9F9"/>
- <path
- android:pathData="M81.81,109.75L82.82,109.22L82.92,110.1L81.81,109.75Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M88.92,116.86L88.56,115.78L89.51,115.87L88.92,116.86Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M82.85,122.93L82.49,121.85L83.43,121.94L82.85,122.93Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M75.78,115.8L76.8,115.26L76.91,116.14L75.78,115.8Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M81.94,123.56C81.52,123.56 81.18,123.22 81.18,122.81V118.67L80.01,117.5C80.01,117.5 80.01,117.5 80.01,117.5C80,117.5 80,117.5 80,117.49H75.87C75.45,117.49 75.11,117.15 75.11,116.74C75.11,116.32 75.45,115.97 75.87,115.97H80.25L81.18,115.04V110.66C81.18,110.25 81.52,109.9 81.94,109.9C82.36,109.9 82.7,110.25 82.7,110.66V115.04L83.63,115.97H88.01C88.43,115.97 88.77,116.32 88.77,116.74C88.77,117.15 88.43,117.49 88.01,117.49H83.88C83.88,117.5 83.88,117.5 83.87,117.5C83.87,117.5 83.87,117.5 83.87,117.5L82.7,118.67V122.81C82.7,123.22 82.36,123.56 81.94,123.56ZM82.38,118.54L83.65,117.27C83.68,117.24 83.71,117.21 83.73,117.18H88.01C88.25,117.18 88.45,116.98 88.45,116.74C88.45,116.49 88.25,116.29 88.01,116.29H83.5L82.38,115.17V110.66C82.38,110.42 82.18,110.22 81.94,110.22C81.7,110.22 81.5,110.42 81.5,110.66V115.17L80.38,116.29H75.87C75.63,116.29 75.43,116.49 75.43,116.74C75.43,116.98 75.63,117.18 75.87,117.18H80.15C80.17,117.21 80.2,117.24 80.23,117.27L81.5,118.54V122.81C81.5,123.05 81.7,123.25 81.94,123.25C82.18,123.25 82.38,123.05 82.38,122.81V118.54Z"
- android:fillColor="#F9F9F9"
- android:fillType="evenOdd"/>
- <path
- android:pathData="M81.16,122.81C81.16,123.23 81.51,123.58 81.94,123.58C82.37,123.58 82.72,123.23 82.72,122.81V118.68L83.88,117.51H88.01C88.44,117.51 88.79,117.16 88.79,116.74C88.79,116.31 88.44,115.96 88.01,115.96H83.64L82.72,115.04V110.66C82.72,110.24 82.37,109.89 81.94,109.89C81.51,109.89 81.16,110.24 81.16,110.66V115.04L80.24,115.96H75.87C75.44,115.96 75.09,116.31 75.09,116.74C75.09,117.16 75.44,117.51 75.87,117.51H80L81.16,118.68V122.81Z"
- android:strokeWidth="0.666912"
- android:fillColor="#FBBE22"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M84.51,36.84L84.84,36.89C84.86,36.75 84.8,36.62 84.68,36.55C84.57,36.48 84.42,36.49 84.32,36.57L84.51,36.84ZM83.78,37.36L83.58,37.09L83.58,37.09L83.78,37.36ZM83.62,37.31L83.94,37.21L83.94,37.21L83.62,37.31ZM84.55,23.09L84.5,23.43C84.52,23.43 84.53,23.43 84.55,23.43L84.55,23.09ZM85.33,28.82L85,28.8C84.99,28.98 85.12,29.13 85.29,29.15C85.47,29.17 85.63,29.06 85.66,28.88L85.33,28.82ZM90.05,20.62L90.2,20.32C90.19,20.32 90.18,20.31 90.16,20.31L90.05,20.62ZM88.55,29.32L88.24,29.19C88.18,29.33 88.22,29.49 88.34,29.58C88.47,29.67 88.63,29.67 88.75,29.58L88.55,29.32ZM91.5,28.25L91.56,27.92L91.56,27.92L91.5,28.25ZM91.65,29.17L91.41,28.93L91.41,28.93L91.65,29.17ZM86.94,38.3L86.6,38.29L86.6,38.29L86.94,38.3ZM84.38,38.29L84.05,38.28L84.05,38.28L84.38,38.29ZM84.32,36.57L83.58,37.09L83.97,37.63L84.7,37.11L84.32,36.57ZM83.58,37.09C83.71,37 83.89,37.06 83.94,37.21L83.3,37.4C83.38,37.69 83.73,37.81 83.97,37.63L83.58,37.09ZM83.94,37.21C82.92,33.77 82.63,30.2 82.85,27.52C82.96,26.18 83.2,25.09 83.53,24.36C83.69,24 83.87,23.74 84.04,23.59C84.2,23.45 84.35,23.41 84.5,23.43L84.59,22.76C84.21,22.71 83.88,22.85 83.6,23.09C83.32,23.33 83.1,23.67 82.92,24.09C82.55,24.91 82.3,26.09 82.18,27.46C81.95,30.22 82.25,33.89 83.3,37.4L83.94,37.21ZM84.55,23.43C84.58,23.43 84.67,23.44 84.78,23.69C84.89,23.94 84.97,24.33 85.01,24.85C85.11,25.87 85.07,27.28 85,28.8L85.67,28.83C85.73,27.32 85.78,25.87 85.68,24.79C85.63,24.25 85.55,23.78 85.4,23.43C85.25,23.08 84.98,22.76 84.55,22.76L84.55,23.43ZM85.66,28.88C86.1,26.6 86.73,24.4 87.51,22.87C87.9,22.1 88.32,21.53 88.73,21.2C89.14,20.88 89.53,20.79 89.94,20.94L90.16,20.31C89.49,20.07 88.86,20.24 88.32,20.67C87.79,21.09 87.32,21.76 86.92,22.56C86.1,24.18 85.45,26.45 85,28.76L85.66,28.88ZM89.91,20.92C90.16,21.05 90.33,21.31 90.39,21.79C90.44,22.27 90.37,22.92 90.18,23.69C89.82,25.24 89.05,27.19 88.24,29.19L88.86,29.44C89.67,27.45 90.46,25.45 90.84,23.85C91.03,23.04 91.12,22.31 91.05,21.71C90.98,21.11 90.74,20.59 90.2,20.32L89.91,20.92ZM88.75,29.58C89.76,28.79 90.72,28.46 91.45,28.58L91.56,27.92C90.56,27.76 89.41,28.21 88.34,29.05L88.75,29.58ZM91.45,28.58C91.49,28.59 91.5,28.6 91.5,28.61C91.51,28.61 91.52,28.63 91.52,28.66C91.53,28.73 91.5,28.84 91.41,28.93L91.88,29.41C92.11,29.18 92.22,28.87 92.19,28.58C92.15,28.27 91.94,27.98 91.56,27.92L91.45,28.58ZM91.41,28.93C90.16,30.14 88.98,31.9 88.1,33.63C87.23,35.36 86.63,37.1 86.6,38.29L87.27,38.3C87.3,37.27 87.84,35.64 88.7,33.94C89.56,32.25 90.7,30.55 91.88,29.41L91.41,28.93ZM86.6,38.29C86.6,38.16 86.71,38.06 86.83,38.06V38.73C87.07,38.73 87.26,38.55 87.27,38.3L86.6,38.29ZM86.83,38.06H84.48V38.73H86.83V38.06ZM84.48,38.06C84.62,38.06 84.72,38.17 84.72,38.3L84.05,38.28C84.04,38.53 84.23,38.73 84.48,38.73V38.06ZM84.72,38.3C84.73,37.82 84.77,37.35 84.84,36.89L84.18,36.79C84.11,37.27 84.06,37.77 84.05,38.28L84.72,38.3Z"
- android:fillColor="#F5F5F5"/>
- <path
- android:pathData="M82.07,39C80.62,40.13 79.16,40.92 77.61,41.81C84.53,41.86 95.63,43.4 94.14,42.54C92.36,41.51 89.67,39.69 88.59,38.5C87.52,37.3 83.89,37.58 82.07,39Z"
- android:fillColor="#B27AF4"/>
- <path
- android:pathData="M89.33,39.24C88.76,38.59 87.75,37.44 87.82,35.96C87.86,35.28 87.88,34.85 87.91,34.57C87.92,34.46 87.63,34.24 87.53,34.29C86.49,34.8 85.42,34.87 83.37,34.87C83.31,34.87 83.27,34.92 83.27,34.98C83.32,36.21 82.66,38.46 81.78,39.23C81.42,39.54 82.14,39.68 83.31,39.72C75.58,40.81 69.6,48.02 69.6,56.76C69.6,61.87 71.65,66.46 74.9,69.61C77.27,71.9 79.92,72.57 83.44,73.45C83.73,73.52 84.03,73.6 84.33,73.67C85,73.84 85.7,73.86 86.37,73.72C90.57,72.84 93.22,72.1 95.79,69.61C99.04,66.46 101.09,61.87 101.09,56.76C101.09,47.74 94.73,40.35 86.63,39.63C87.61,39.57 88.55,39.49 89.27,39.4C89.35,39.39 89.38,39.3 89.33,39.24Z"
- android:fillColor="#B27AF4"/>
- <path
- android:pathData="M97.87,56.9C97.87,64.12 92.25,69.95 85.36,69.95C78.46,69.95 72.85,64.12 72.85,56.9C72.85,49.68 78.46,43.86 85.36,43.86C92.25,43.86 97.87,49.68 97.87,56.9Z"
- android:strokeWidth="0.669091"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M95.19,56.9C95.19,62.57 90.77,67.14 85.36,67.14C79.94,67.14 75.53,62.57 75.53,56.9C75.53,51.23 79.94,46.66 85.36,46.66C90.77,46.66 95.19,51.23 95.19,56.9Z"
- android:strokeWidth="0.669091"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M92.54,56.9C92.54,61.04 89.32,64.38 85.36,64.38C81.4,64.38 78.17,61.04 78.17,56.9C78.17,52.76 81.4,49.43 85.36,49.43C89.32,49.43 92.54,52.76 92.54,56.9Z"
- android:strokeWidth="0.669091"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M90.15,56.9C90.15,59.68 87.99,61.91 85.36,61.91C82.73,61.91 80.57,59.68 80.57,56.9C80.57,54.13 82.73,51.9 85.36,51.9C87.99,51.9 90.15,54.13 90.15,56.9Z"
- android:strokeWidth="0.669091"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M87.83,56.9C87.83,58.34 86.71,59.48 85.36,59.48C84.01,59.48 82.89,58.34 82.89,56.9C82.89,55.47 84.01,54.33 85.36,54.33C86.71,54.33 87.83,55.47 87.83,56.9Z"
- android:strokeWidth="0.669091"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M129.44,36.85L129.77,36.89C129.79,36.76 129.73,36.63 129.62,36.56C129.5,36.49 129.36,36.5 129.25,36.57L129.44,36.85ZM128.71,37.37L128.9,37.64L128.9,37.64L128.71,37.37ZM128.55,37.31L128.87,37.22L128.87,37.22L128.55,37.31ZM129.48,23.11L129.44,23.44C129.45,23.44 129.46,23.44 129.48,23.44L129.48,23.11ZM130.27,28.83L129.93,28.81C129.92,28.99 130.05,29.14 130.23,29.16C130.4,29.18 130.56,29.07 130.59,28.89L130.27,28.83ZM134.98,20.64L135.13,20.34C135.12,20.33 135.11,20.33 135.1,20.32L134.98,20.64ZM133.48,29.33L133.17,29.2C133.11,29.34 133.15,29.5 133.27,29.59C133.4,29.68 133.56,29.68 133.68,29.59L133.48,29.33ZM136.43,28.26L136.38,28.59L136.38,28.59L136.43,28.26ZM136.58,29.18L136.34,28.94L136.34,28.94L136.58,29.18ZM131.87,38.3L131.53,38.29L131.53,38.29L131.87,38.3ZM129.31,38.3L128.98,38.29L128.98,38.29L129.31,38.3ZM129.25,36.57L128.52,37.09L128.9,37.64L129.64,37.12L129.25,36.57ZM128.52,37.09C128.65,37 128.83,37.06 128.87,37.22L128.23,37.41C128.32,37.69 128.66,37.81 128.9,37.64L128.52,37.09ZM128.87,37.22C127.85,33.78 127.56,30.21 127.79,27.53C127.9,26.19 128.14,25.1 128.46,24.37C128.62,24.01 128.8,23.76 128.97,23.61C129.13,23.46 129.29,23.42 129.44,23.44L129.52,22.78C129.15,22.73 128.81,22.86 128.53,23.1C128.26,23.34 128.04,23.69 127.85,24.1C127.48,24.92 127.23,26.1 127.12,27.48C126.89,30.23 127.19,33.89 128.23,37.41L128.87,37.22ZM129.48,23.44C129.52,23.44 129.61,23.45 129.71,23.71C129.82,23.96 129.9,24.34 129.95,24.86C130.04,25.88 130,27.29 129.93,28.81L130.6,28.84C130.67,27.33 130.71,25.88 130.61,24.8C130.57,24.27 130.48,23.79 130.33,23.44C130.18,23.1 129.92,22.77 129.48,22.77L129.48,23.44ZM130.59,28.89C131.04,26.62 131.67,24.41 132.44,22.88C132.83,22.11 133.25,21.54 133.67,21.21C134.07,20.89 134.46,20.81 134.87,20.95L135.1,20.32C134.42,20.08 133.79,20.26 133.25,20.69C132.72,21.11 132.26,21.77 131.85,22.58C131.03,24.19 130.38,26.46 129.94,28.77L130.59,28.89ZM134.84,20.94C135.1,21.06 135.26,21.33 135.32,21.8C135.37,22.29 135.3,22.93 135.12,23.7C134.75,25.25 133.98,27.2 133.17,29.2L133.79,29.45C134.6,27.46 135.39,25.46 135.77,23.86C135.96,23.06 136.05,22.32 135.98,21.73C135.91,21.12 135.67,20.6 135.13,20.34L134.84,20.94ZM133.68,29.59C134.69,28.8 135.65,28.47 136.38,28.59L136.49,27.93C135.49,27.77 134.34,28.22 133.27,29.06L133.68,29.59ZM136.38,28.59C136.42,28.6 136.43,28.61 136.43,28.62C136.44,28.62 136.45,28.64 136.45,28.67C136.46,28.74 136.43,28.85 136.34,28.94L136.81,29.42C137.04,29.19 137.15,28.88 137.12,28.59C137.08,28.28 136.87,28 136.49,27.93L136.38,28.59ZM136.34,28.94C135.1,30.15 133.91,31.91 133.04,33.64C132.16,35.36 131.56,37.11 131.53,38.29L132.2,38.31C132.23,37.28 132.77,35.64 133.63,33.95C134.49,32.26 135.63,30.56 136.81,29.42L136.34,28.94ZM131.53,38.29C131.54,38.17 131.64,38.07 131.76,38.07V38.74C132,38.74 132.2,38.55 132.2,38.31L131.53,38.29ZM131.76,38.07H129.42V38.74H131.76V38.07ZM129.42,38.07C129.55,38.07 129.65,38.18 129.65,38.31L128.98,38.29C128.97,38.53 129.17,38.74 129.42,38.74V38.07ZM129.65,38.31C129.66,37.82 129.71,37.35 129.77,36.89L129.11,36.8C129.04,37.28 129,37.78 128.98,38.29L129.65,38.31Z"
- android:fillColor="#F5F5F5"/>
- <path
- android:pathData="M126.82,40.36C125.38,41.49 121.93,43.73 120.39,44.62C127.26,44.67 139.3,43.87 137.82,43.01C134.87,41.3 134.36,41.05 133.29,39.86C132.23,38.68 128.62,38.95 126.82,40.36Z"
- android:fillColor="#B27AF4"/>
- <path
- android:pathData="M134.02,40.6C133.46,39.96 132.45,38.88 132.53,37.34C132.56,36.66 132.59,36.24 132.61,35.96C132.62,35.85 132.34,35.63 132.24,35.68C131.2,36.19 130.14,36.26 128.11,36.26C128.05,36.26 128,36.31 128.01,36.37C127.83,39.13 127.83,39.5 126.53,40.59C126.18,40.89 126.86,41.03 127.97,41.07C118.96,43.94 114.44,48.52 114.44,56.32C114.44,60.9 116.47,65.01 119.7,67.83C122.05,69.89 124.68,70.48 128.18,71.27C128.49,71.34 128.82,71.42 129.16,71.49C129.76,71.63 130.38,71.65 130.99,71.53C135.21,70.73 137.87,70.08 140.44,67.83C143.67,65.01 145.7,60.9 145.7,56.32C145.7,48.26 139.4,41.64 131.39,40.99C132.34,40.93 133.26,40.84 133.96,40.76C134.04,40.75 134.08,40.66 134.02,40.6Z"
- android:fillColor="#B27AF4"/>
- <path
- android:pathData="M142.58,55.93C142.58,62.58 136.99,68 130.08,68C123.16,68 117.57,62.58 117.57,55.93C117.57,49.27 123.16,43.86 130.08,43.86C136.99,43.86 142.58,49.27 142.58,55.93Z"
- android:strokeWidth="0.668769"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M139.9,55.93C139.9,61.15 135.51,65.4 130.08,65.4C124.64,65.4 120.25,61.15 120.25,55.93C120.25,50.71 124.64,46.46 130.08,46.46C135.51,46.46 139.9,50.71 139.9,55.93Z"
- android:strokeWidth="0.668769"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M137.26,55.93C137.26,59.73 134.05,62.84 130.08,62.84C126.1,62.84 122.89,59.73 122.89,55.93C122.89,52.13 126.1,49.02 130.08,49.02C134.05,49.02 137.26,52.13 137.26,55.93Z"
- android:strokeWidth="0.668769"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M134.87,55.93C134.87,58.47 132.73,60.54 130.08,60.54C127.42,60.54 125.29,58.47 125.29,55.93C125.29,53.39 127.42,51.31 130.08,51.31C132.73,51.31 134.87,53.39 134.87,55.93Z"
- android:strokeWidth="0.668769"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M132.54,55.93C132.54,57.22 131.45,58.29 130.08,58.29C128.7,58.29 127.61,57.22 127.61,55.93C127.61,54.64 128.7,53.57 130.08,53.57C131.45,53.57 132.54,54.64 132.54,55.93Z"
- android:strokeWidth="0.668769"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M133.71,35.21C133.23,35.77 132.63,36.59 132.55,37.92C130.66,42.59 129.83,48.47 129.83,54.62C129.83,60.77 130.95,66.47 132.85,71.14C131.95,71.36 131.02,71.51 130.06,71.57C121.13,71.24 114,64.55 114,56.35C114,50.58 117.53,45.56 122.74,42.97C124.91,41.77 127.56,40.29 127.65,38.85C127.74,37.37 127.33,36.27 126.95,35.46C126.79,35.13 127,34.72 127.35,34.69L133.32,34.25C133.71,34.22 133.97,34.66 133.8,35.02C133.77,35.08 133.74,35.14 133.71,35.21Z"
- android:fillColor="#1F0333"
- android:fillType="evenOdd"/>
- <group>
- <clip-path
- android:pathData="M133.71,35.21C133.23,35.77 132.63,36.59 132.55,37.92C130.66,42.59 129.83,48.47 129.83,54.62C129.83,60.77 130.95,66.47 132.85,71.14C131.95,71.36 131.02,71.51 130.06,71.57C121.13,71.24 114,64.55 114,56.35C114,50.58 117.53,45.56 122.74,42.97C124.91,41.77 127.56,40.29 127.65,38.85C127.74,37.37 127.33,36.27 126.95,35.46C126.79,35.13 127,34.72 127.35,34.69L133.32,34.25C133.71,34.22 133.97,34.66 133.8,35.02C133.77,35.08 133.74,35.14 133.71,35.21Z"
- android:fillType="evenOdd"/>
- <path
- android:pathData="M132.55,37.92L133.17,38.18L133.21,38.07L133.22,37.96L132.55,37.92ZM133.71,35.21L134.21,35.65L134.27,35.57L134.32,35.49L133.71,35.21ZM132.85,71.14L133.01,71.79L133.76,71.6L133.47,70.89L132.85,71.14ZM130.06,71.57L130.04,72.24L130.07,72.24L130.1,72.24L130.06,71.57ZM122.74,42.97L123.03,43.57L123.05,43.56L123.06,43.56L122.74,42.97ZM127.65,38.85L128.32,38.89L128.32,38.89L127.65,38.85ZM126.95,35.46L126.35,35.75L126.35,35.75L126.95,35.46ZM127.35,34.69L127.3,34.03L127.3,34.03L127.35,34.69ZM133.32,34.25L133.27,33.58L133.27,33.58L133.32,34.25ZM133.8,35.02L134.4,35.31L134.4,35.31L133.8,35.02ZM133.22,37.96C133.28,36.84 133.77,36.15 134.21,35.65L133.21,34.77C132.67,35.38 131.98,36.35 131.89,37.89L133.22,37.96ZM130.5,54.62C130.5,48.52 131.32,42.73 133.17,38.18L131.93,37.67C129.99,42.44 129.17,48.42 129.17,54.62H130.5ZM133.47,70.89C131.6,66.31 130.5,60.69 130.5,54.62H129.17C129.17,60.85 130.3,66.64 132.24,71.39L133.47,70.89ZM130.1,72.24C131.1,72.17 132.07,72.02 133.01,71.79L132.7,70.49C131.83,70.71 130.93,70.85 130.02,70.9L130.1,72.24ZM113.34,56.35C113.34,64.96 120.81,71.89 130.04,72.24L130.09,70.9C121.46,70.58 114.67,64.13 114.67,56.35H113.34ZM122.44,42.38C117.04,45.06 113.34,50.29 113.34,56.35H114.67C114.67,50.87 118.03,46.06 123.03,43.57L122.44,42.38ZM126.99,38.81C126.97,38.97 126.89,39.2 126.63,39.51C126.39,39.81 126.03,40.13 125.58,40.46C124.67,41.13 123.51,41.78 122.41,42.39L123.06,43.56C124.14,42.96 125.38,42.27 126.37,41.54C126.87,41.17 127.32,40.77 127.67,40.35C128.01,39.94 128.28,39.45 128.32,38.89L126.99,38.81ZM126.35,35.75C126.71,36.5 127.07,37.48 126.99,38.81L128.32,38.89C128.42,37.26 127.96,36.04 127.55,35.17L126.35,35.75ZM127.3,34.03C126.41,34.09 126.02,35.06 126.35,35.75L127.55,35.17C127.57,35.21 127.56,35.25 127.55,35.27C127.54,35.3 127.49,35.35 127.4,35.36L127.3,34.03ZM133.27,33.58L127.3,34.03L127.4,35.36L133.37,34.91L133.27,33.58ZM134.4,35.31C134.59,34.91 134.54,34.47 134.34,34.14C134.14,33.81 133.75,33.55 133.27,33.58L133.37,34.91C133.33,34.92 133.29,34.91 133.26,34.89C133.22,34.87 133.21,34.85 133.2,34.84C133.19,34.81 133.18,34.78 133.2,34.73L134.4,35.31ZM134.32,35.49C134.34,35.43 134.37,35.37 134.4,35.31L133.2,34.73C133.17,34.8 133.13,34.86 133.1,34.93L134.32,35.49Z"
- android:fillColor="#B27AF4"/>
- </group>
- <path
- android:pathData="M126.06,44.68C126.36,44.94 126.36,45.41 126.06,45.66L125.96,45.75C125.93,45.77 125.91,45.8 125.88,45.82L125.8,45.92C125.54,46.23 125.07,46.23 124.81,45.92L124.73,45.82C124.71,45.8 124.68,45.77 124.65,45.75L124.55,45.66C124.25,45.41 124.25,44.94 124.55,44.68L124.65,44.59C124.68,44.57 124.71,44.55 124.73,44.52L124.81,44.42C125.07,44.12 125.54,44.12 125.8,44.42L125.88,44.52C125.91,44.55 125.93,44.57 125.96,44.59L126.06,44.68Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M123.94,47.31C124.68,47.94 124.68,49.08 123.94,49.71L123.69,49.93C123.63,49.98 123.57,50.04 123.52,50.1L123.3,50.35C122.67,51.09 121.53,51.09 120.89,50.35L120.68,50.1C120.63,50.04 120.57,49.98 120.51,49.93L120.26,49.71C119.52,49.08 119.52,47.94 120.26,47.31L120.51,47.09C120.57,47.04 120.63,46.98 120.68,46.92L120.89,46.67C121.53,45.93 122.67,45.93 123.3,46.67L123.52,46.92C123.57,46.98 123.63,47.04 123.69,47.09L123.94,47.31Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M39.32,36.87L39.65,36.92C39.67,36.78 39.61,36.65 39.49,36.58C39.38,36.52 39.24,36.52 39.13,36.6L39.32,36.87ZM38.59,37.39L38.78,37.66L38.78,37.66L38.59,37.39ZM38.43,37.33L38.75,37.24L38.75,37.24L38.43,37.33ZM39.36,23.17L39.31,23.5C39.33,23.5 39.34,23.5 39.36,23.5L39.36,23.17ZM40.14,28.87L39.81,28.86C39.8,29.03 39.93,29.18 40.1,29.2C40.28,29.23 40.44,29.11 40.47,28.94L40.14,28.87ZM44.85,20.7L44.99,20.4C44.98,20.4 44.97,20.39 44.96,20.39L44.85,20.7ZM43.34,29.37L43.03,29.24C42.98,29.38 43.02,29.55 43.14,29.64C43.26,29.73 43.43,29.73 43.55,29.63L43.34,29.37ZM46.29,28.31L46.35,27.98L46.35,27.98L46.29,28.31ZM46.44,29.22L46.67,29.46L46.67,29.46L46.44,29.22ZM41.74,38.32L41.41,38.31L41.41,38.31L41.74,38.32ZM39.19,38.32L39.53,38.33L39.53,38.33L39.19,38.32ZM39.13,36.6L38.4,37.12L38.78,37.66L39.51,37.14L39.13,36.6ZM38.4,37.12C38.53,37.03 38.71,37.09 38.75,37.24L38.11,37.43C38.2,37.72 38.54,37.83 38.78,37.66L38.4,37.12ZM38.75,37.24C37.73,33.81 37.44,30.25 37.67,27.58C37.78,26.24 38.02,25.15 38.34,24.43C38.5,24.07 38.68,23.81 38.85,23.67C39.01,23.52 39.16,23.48 39.31,23.5L39.4,22.84C39.02,22.79 38.69,22.92 38.41,23.16C38.14,23.4 37.92,23.75 37.73,24.16C37.36,24.98 37.12,26.15 37,27.52C36.77,30.27 37.07,33.93 38.11,37.43L38.75,37.24ZM39.36,23.5C39.39,23.5 39.48,23.51 39.59,23.76C39.7,24.01 39.78,24.4 39.82,24.91C39.92,25.94 39.88,27.34 39.81,28.86L40.47,28.89C40.54,27.38 40.58,25.93 40.49,24.85C40.44,24.32 40.35,23.85 40.2,23.5C40.06,23.16 39.79,22.83 39.36,22.83L39.36,23.5ZM40.47,28.94C40.91,26.67 41.54,24.47 42.31,22.94C42.7,22.17 43.11,21.61 43.53,21.28C43.94,20.96 44.33,20.87 44.74,21.02L44.96,20.39C44.29,20.15 43.66,20.33 43.12,20.75C42.59,21.17 42.13,21.84 41.72,22.64C40.9,24.25 40.26,26.51 39.81,28.81L40.47,28.94ZM44.7,21C44.96,21.13 45.13,21.39 45.18,21.87C45.24,22.35 45.16,22.99 44.98,23.76C44.61,25.3 43.85,27.25 43.03,29.24L43.65,29.5C44.46,27.51 45.25,25.52 45.63,23.92C45.82,23.12 45.91,22.39 45.84,21.79C45.78,21.19 45.53,20.67 44.99,20.4L44.7,21ZM43.55,29.63C44.55,28.85 45.51,28.52 46.24,28.64L46.35,27.98C45.35,27.81 44.2,28.27 43.14,29.11L43.55,29.63ZM46.24,28.64C46.28,28.64 46.29,28.66 46.29,28.66C46.3,28.67 46.31,28.68 46.31,28.72C46.32,28.78 46.29,28.89 46.2,28.98L46.67,29.46C46.89,29.24 47.01,28.93 46.98,28.64C46.94,28.32 46.72,28.04 46.35,27.98L46.24,28.64ZM46.2,28.98C44.96,30.19 43.78,31.95 42.9,33.68C42.03,35.39 41.44,37.13 41.41,38.31L42.07,38.33C42.1,37.3 42.64,35.67 43.5,33.98C44.35,32.29 45.49,30.6 46.67,29.46L46.2,28.98ZM41.41,38.31C41.41,38.19 41.51,38.09 41.64,38.09V38.76C41.87,38.76 42.07,38.57 42.07,38.33L41.41,38.31ZM41.64,38.09H39.29V38.76H41.64V38.09ZM39.29,38.09C39.43,38.09 39.53,38.2 39.53,38.33L38.86,38.31C38.85,38.55 39.05,38.76 39.29,38.76V38.09ZM39.53,38.33C39.54,37.85 39.58,37.38 39.65,36.92L38.99,36.82C38.92,37.3 38.88,37.8 38.86,38.31L39.53,38.33Z"
- android:fillColor="#F5F5F5"/>
- <path
- android:pathData="M36.46,40.58C35,41.63 31.5,43.57 29.93,44.4C36.88,44.41 49.4,43.73 47.91,43.1C45.51,42.09 43.92,41.2 43.01,39.96C41.99,38.57 38.29,39.25 36.46,40.58Z"
- android:fillColor="#B27AF4"/>
- <path
- android:pathData="M36.22,40.71C36.85,40.01 38.08,38.64 38.01,37.22C37.96,36.31 37.84,35.68 37.71,35.27C37.68,35.16 37.88,34.98 37.98,35.04C39.02,35.74 40.04,36.41 42.09,36.43C42.15,36.43 42.27,36.85 42.27,36.91C42.22,38.2 42.8,40.01 43.68,40.78C44.13,41.17 42.88,41.29 41.2,41.27C49.88,41.91 56.71,48.56 56.71,56.67C56.71,65.2 49.15,72.12 39.83,72.12C30.51,72.12 22.95,65.2 22.95,56.67C22.95,48.2 30.4,41.32 39.63,41.22C38.39,41.16 37.12,41.06 36.21,40.95C36.13,40.94 36.1,40.85 36.15,40.79C36.18,40.76 36.2,40.74 36.22,40.71Z"
- android:fillColor="#B27AF4"/>
- <path
- android:pathData="M53.82,56.44C53.82,63.36 47.73,69.02 40.17,69.02C32.6,69.02 26.51,63.36 26.51,56.44C26.51,49.52 32.6,43.87 40.17,43.87C47.73,43.87 53.82,49.52 53.82,56.44Z"
- android:strokeWidth="0.667046"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M50.9,56.44C50.9,61.87 46.12,66.31 40.17,66.31C34.21,66.31 29.43,61.87 29.43,56.44C29.43,51.02 34.21,46.57 40.17,46.57C46.12,46.57 50.9,51.02 50.9,56.44Z"
- android:strokeWidth="0.667046"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M48.02,56.44C48.02,60.39 44.53,63.65 40.17,63.65C35.8,63.65 32.31,60.39 32.31,56.44C32.31,52.49 35.8,49.24 40.17,49.24C44.53,49.24 48.02,52.49 48.02,56.44Z"
- android:strokeWidth="0.667046"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M45.42,56.44C45.42,59.08 43.09,61.26 40.17,61.26C37.24,61.26 34.92,59.08 34.92,56.44C34.92,53.81 37.24,51.62 40.17,51.62C43.09,51.62 45.42,53.81 45.42,56.44Z"
- android:strokeWidth="0.667046"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M42.89,56.44C42.89,57.78 41.7,58.92 40.17,58.92C38.64,58.92 37.45,57.78 37.45,56.44C37.45,55.1 38.64,53.97 40.17,53.97C41.7,53.97 42.89,55.1 42.89,56.44Z"
- android:strokeWidth="0.667046"
- android:fillColor="#00000000"
- android:strokeColor="#1F0333"/>
- <path
- android:pathData="M42.34,38C42.29,38.01 42.24,38.03 42.19,38.04C40.18,42.83 39,48.68 39,54.99C39,61.32 40.19,67.17 42.2,71.97C41.24,72.2 40.25,72.35 39.23,72.42C29.76,72.07 22.2,65.2 22.2,56.78C22.2,50.85 25.95,45.69 31.47,43.03C33.77,41.79 36.98,39.92 36.89,38.55C36.82,37.38 36.35,36.14 35.94,35.31C35.77,34.97 35.99,34.55 36.37,34.52L42.7,34.07C43.11,34.04 43.39,34.49 43.21,34.86C42.75,35.78 42.28,37.02 42.34,38Z"
- android:fillColor="#1F0333"
- android:fillType="evenOdd"/>
- <group>
- <clip-path
- android:pathData="M42.34,38C42.29,38.01 42.24,38.03 42.19,38.04C40.18,42.83 39,48.68 39,54.99C39,61.32 40.19,67.17 42.2,71.97C41.24,72.2 40.25,72.35 39.23,72.42C29.76,72.07 22.2,65.2 22.2,56.78C22.2,50.85 25.95,45.69 31.47,43.03C33.77,41.79 36.98,39.92 36.89,38.55C36.82,37.38 36.35,36.14 35.94,35.31C35.77,34.97 35.99,34.55 36.37,34.52L42.7,34.07C43.11,34.04 43.39,34.49 43.21,34.86C42.75,35.78 42.28,37.02 42.34,38Z"
- android:fillType="evenOdd"/>
- <path
- android:pathData="M42.19,38.04L42,37.41L41.7,37.5L41.58,37.79L42.19,38.04ZM42.34,38L42.55,38.63L43.04,38.47L43.01,37.95L42.34,38ZM42.2,71.97L42.36,72.61L43.12,72.43L42.82,71.71L42.2,71.97ZM39.23,72.42L39.21,73.08L39.24,73.08L39.27,73.08L39.23,72.42ZM31.47,43.03L31.76,43.63L31.77,43.62L31.78,43.62L31.47,43.03ZM36.89,38.55L37.56,38.51L37.56,38.51L36.89,38.55ZM35.94,35.31L35.34,35.6L35.34,35.6L35.94,35.31ZM36.37,34.52L36.32,33.86L36.32,33.86L36.37,34.52ZM42.7,34.07L42.75,34.73L42.75,34.73L42.7,34.07ZM43.21,34.86L42.61,34.56L42.61,34.56L43.21,34.86ZM42.38,38.68C42.44,38.66 42.49,38.65 42.55,38.63L42.14,37.36C42.1,37.38 42.05,37.39 42,37.41L42.38,38.68ZM39.66,54.99C39.66,48.76 40.83,43 42.81,38.3L41.58,37.79C39.53,42.67 38.33,48.6 38.33,54.99H39.66ZM42.82,71.71C40.84,67 39.66,61.24 39.66,54.99H38.33C38.33,61.4 39.53,67.34 41.59,72.23L42.82,71.71ZM39.27,73.08C40.33,73.01 41.36,72.85 42.36,72.61L42.05,71.32C41.12,71.54 40.17,71.69 39.19,71.75L39.27,73.08ZM21.54,56.78C21.54,65.63 29.46,72.72 39.21,73.08L39.26,71.75C30.06,71.41 22.86,64.77 22.86,56.78H21.54ZM31.18,42.43C25.47,45.18 21.54,50.55 21.54,56.78H22.86C22.86,51.14 26.42,46.2 31.76,43.63L31.18,42.43ZM36.23,38.59C36.23,38.67 36.19,38.88 35.9,39.23C35.62,39.56 35.2,39.92 34.68,40.3C33.64,41.07 32.3,41.83 31.15,42.44L31.78,43.62C32.94,43 34.35,42.2 35.47,41.38C36.03,40.96 36.54,40.53 36.92,40.08C37.27,39.65 37.59,39.11 37.56,38.51L36.23,38.59ZM35.34,35.6C35.73,36.4 36.16,37.54 36.23,38.59L37.56,38.51C37.47,37.21 36.96,35.88 36.53,35.02L35.34,35.6ZM36.32,33.86C35.43,33.92 34.98,34.88 35.34,35.6L36.53,35.02C36.55,35.06 36.54,35.09 36.53,35.11C36.52,35.14 36.48,35.18 36.41,35.18L36.32,33.86ZM42.65,33.4L36.32,33.86L36.41,35.18L42.75,34.73L42.65,33.4ZM43.8,35.15C44.19,34.37 43.62,33.33 42.65,33.4L42.75,34.73C42.72,34.73 42.69,34.72 42.66,34.71C42.63,34.7 42.62,34.68 42.61,34.67C42.6,34.65 42.59,34.61 42.61,34.56L43.8,35.15ZM43.01,37.95C42.96,37.17 43.35,36.07 43.8,35.15L42.61,34.56C42.14,35.5 41.61,36.88 41.68,38.04L43.01,37.95Z"
- android:fillColor="#B27AF4"/>
- </group>
- <path
- android:pathData="M32.73,48.33C32.63,48.4 32.53,48.47 32.43,48.55C32.02,48.85 31.63,49.17 31.26,49.5C31.22,49.54 31.17,49.58 31.12,49.61C30.61,49.97 29.9,49.96 29.44,49.52C28.93,49.04 28.91,48.24 29.42,47.77C29.47,47.72 29.52,47.68 29.57,47.63C29.99,47.25 30.43,46.89 30.88,46.56C31.02,46.45 31.17,46.34 31.32,46.23C31.79,45.91 32.26,45.61 32.75,45.32C32.79,45.3 32.83,45.28 32.87,45.26C32.89,45.25 32.91,45.24 32.93,45.23C33.54,44.89 34.29,45.16 34.59,45.79C34.86,46.37 34.65,47.04 34.15,47.42C34.11,47.45 34.06,47.48 34.01,47.51C33.57,47.76 33.14,48.03 32.73,48.33Z"
- android:fillColor="#F9F9F9"/>
- <path
- android:pathData="M24.9,50.74a1.27,1.27 46.59,1 0,2.54 0.07a1.27,1.27 46.59,1 0,-2.54 -0.07z"
- android:fillColor="#F9F9F9"/>
-</vector>
=====================================
fenix/app/src/main/res/font/roboto_bold.ttf deleted
=====================================
Binary files a/fenix/app/src/main/res/font/roboto_bold.ttf and /dev/null differ
=====================================
fenix/app/src/main/res/font/roboto_regular.ttf deleted
=====================================
Binary files a/fenix/app/src/main/res/font/roboto_regular.ttf and /dev/null differ
=====================================
fenix/app/src/main/res/layout/fragment_home.xml
=====================================
@@ -109,168 +109,24 @@
</com.google.android.material.appbar.CollapsingToolbarLayout>
- </com.google.android.material.appbar.AppBarLayout>
-
- <androidx.core.widget.NestedScrollView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:layout_behavior="@string/appbar_scrolling_view_behavior"
- android:paddingBottom="56dp"> <!-- height of bottom_bar -->
-
- <LinearLayout
- android:id="@+id/yec_popup"
- android:layout_width="match_parent"
+ <TextView
+ android:id="@+id/exploreprivately"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginTop="20dp"
- android:layout_marginStart="15dp"
- android:layout_marginEnd="15dp"
- android:paddingStart="30dp"
- android:paddingEnd="30dp"
- android:paddingTop="30dp"
- android:paddingBottom="30dp"
- android:layout_weight="1"
- android:orientation="vertical"
- style="@style/YecPopup" >
-
- <ImageView
- android:id="@+id/yec_close"
- android:layout_height="30dp"
- android:layout_width="30dp"
- android:layout_gravity="end"
- app:srcCompat="@drawable/ic_close"
- tools:ignore="ContentDescription" />
-
- <androidx.constraintlayout.widget.ConstraintLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginStart="40dp"
- android:layout_marginEnd="40dp"
- android:paddingTop="10dp">
-
- <!-- according to stackoverflow, width with wrap_content and match_parent are both wrong here,
- magically setting width to 0 makes it take up the space respective of constraints and the max
- :: exasperation :: -->
- <ImageView
- android:id="@+id/yec_illustration"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
-
- app:layout_constraintWidth_min="40dp"
- app:layout_constraintWidth_max="320dp"
- app:layout_constraintLeft_toLeftOf="parent"
- app:layout_constraintRight_toRightOf="parent"
- app:layout_constraintTop_toTopOf="parent"
- app:layout_constraintBottom_toBottomOf="parent"
- android:layout_gravity="center_horizontal"
-
- android:adjustViewBounds="true"
- app:layout_scrollFlags="scroll"
- app:srcCompat="@drawable/yec_illustration_android"
- tools:ignore="ContentDescription" />
-
- </androidx.constraintlayout.widget.ConstraintLayout>
-
- <TextView
- android:id="@+id/yec_matching_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:clickable="false"
- android:focusable="false"
- android:importantForAccessibility="no"
- android:layout_marginTop="15dp"
- android:text="@string/yec_2023_matched_donation"
- android:textColor="#FFBD4F"
- android:textSize="16sp"
- android:lineSpacingExtra="5dp"
- android:fontFamily="Roboto-Medium"
- app:layout_scrollFlags="scroll" />
-
- <TextView
- android:id="@+id/yec_intro_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:clickable="false"
- android:focusable="false"
- android:importantForAccessibility="no"
- android:layout_marginTop="15dp"
- android:text="@string/yec_2023_introduction"
- android:textColor="#FBFBFE"
- android:textSize="18sp"
- android:lineSpacingExtra="5dp"
- android:fontFamily="Roboto-Bold"
- android:textStyle="bold"
- app:layout_scrollFlags="scroll" />
-
- <TextView
- android:id="@+id/yec_please_donate_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:clickable="false"
- android:focusable="false"
- android:importantForAccessibility="no"
- android:layout_marginTop="15dp"
- android:text="@string/yec_2023_please_donate"
- android:textColor="#FBFBFE"
- android:textSize="16sp"
- android:lineSpacingExtra="5dp"
- android:fontFamily="Roboto-Medium"
- app:layout_scrollFlags="scroll" />
-
- <Button
- android:id="@+id/donate_now_button"
- style="@style/TorDonateYecButton"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:layout_marginTop="30dp"
- android:background="@drawable/tor_yec_donate_rounded_corners"
- android:drawableEnd="@drawable/yec_heart"
- android:drawablePadding="10dp"
- android:paddingEnd="15dp"
- android:paddingStart="15dp"
- android:text="@string/yec_2023_donate_button"
- android:textAllCaps="false"
- android:textColor="#1F0333"
- android:textSize="18sp"
- android:textStyle="bold"
- android:fontFamily="Roboto-Bold"
- android:visibility="visible"
- tools:ignore="ButtonStyleXmlDetector" />
-
- <TextView
- android:id="@+id/yec_free_to_use"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:clickable="false"
- android:focusable="false"
- android:importantForAccessibility="no"
- android:layout_marginTop="30dp"
- android:text="@string/yec_2023_free_to_use"
- android:textColor="#FBFBFE"
- android:textSize="16sp"
- android:lineSpacingExtra="5dp"
- android:fontFamily="Roboto-Medium"
- app:layout_scrollFlags="scroll" />
-
- </LinearLayout>
- </androidx.core.widget.NestedScrollView>
-
- <TextView
- android:id="@+id/exploreprivately"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center|center_vertical"
- android:gravity="center_horizontal"
- android:clickable="false"
- android:ellipsize="end"
- android:focusable="false"
- android:importantForAccessibility="no"
- android:text="@string/tor_explore_privately"
- android:fontFamily="Roboto-Medium"
- android:textColor="#DEFFFFFF"
- android:textSize="40sp"
- android:lineSpacingMultiplier="1.1"
- app:layout_scrollFlags="scroll" />
+ android:layout_gravity="center|center_vertical"
+ android:gravity="center_horizontal"
+ android:clickable="false"
+ android:ellipsize="end"
+ android:focusable="false"
+ android:importantForAccessibility="no"
+ android:text="@string/tor_explore_privately"
+ android:fontFamily="Roboto-Medium"
+ android:textColor="#DEFFFFFF"
+ android:textSize="40sp"
+ android:lineSpacingMultiplier="1.1"
+ app:layout_scrollFlags="scroll" />
+
+ </com.google.android.material.appbar.AppBarLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/sessionControlRecyclerView"
@@ -283,6 +139,7 @@
android:transitionGroup="false"
android:importantForAccessibility="yes"
android:overScrollMode="never"
+ tools:listitem="@layout/collection_home_list_row"
tools:itemCount="3"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"/>
=====================================
fenix/app/src/main/res/values/colors.xml
=====================================
@@ -274,7 +274,6 @@
<color name="onboarding_illustration_deselected_private_theme">#99FBFBFE</color>
<color name="prompt_login_edit_text_cursor_color_private_theme">@color/photonViolet50</color>
- <color name="tor_yec_home_background">#1F0333</color>
<!-- Normal theme colors for light mode -->
<color name="accent_normal_theme">@color/photonInk20</color>
<color name="accent_high_contrast_normal_theme">@color/photonInk20</color>
=====================================
fenix/app/src/main/res/values/styles.xml
=====================================
@@ -336,17 +336,6 @@
<style name="PrivateTheme" parent="PrivateThemeBase" />
- <style name="PrivateEOYTheme" parent="PrivateThemeBase" >
- <item name="android:windowBackground">@color/tor_yec_home_background</item>
- <item name="homeBackground">@color/tor_yec_home_background</item>
- </style>
-
- <style name="YecPopup" >
- <item name="homeBackground">@color/tor_yec_home_background</item>
- <item name="android:background">@drawable/tor_yec_popup_rounded_corners</item>
- </style>
-
-
<!-- Fade animation for theme switching -->
<style name="WindowAnimationTransition">
<item name="android:windowEnterAnimation">@anim/fade_in</item>
@@ -386,21 +375,6 @@
<item name="android:textColor">?attr/textPrimary</item>
</style>
- <style name="TorDonateYecButton" parent="NeutralButton">
- <item name="android:background">@drawable/tor_yec_donate_rounded_corners</item>
- <item name="backgroundTint">#FFBD4F</item>
- <item name="android:textColor">#1F0333</item>
- <item name="android:fontFamily">Roboto-Bold</item>
- <item name="fontFamily">Roboto-Bold</item>
- </style>
-
- <style name="TorDonateYecButtonText" parent="Base.TextAppearance.MaterialComponents.Badge">
-
- <item name="android:textStyle">bold</item>
- <item name="android:textColor">#000000</item>
- </style>
-
-
<style name="DestructiveButton" parent="NeutralButton">
<item name="iconTint">@color/fx_mobile_icon_color_warning_button</item>
<item name="android:textColor">@color/fx_mobile_text_color_warning_button</item>
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/354…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/354…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][base-browser-115.7.0esr-13.5-1] Bug 42374: Check for spoof English in number conversions
by Pier Angelo Vendrame (@pierov) 18 Jan '24
by Pier Angelo Vendrame (@pierov) 18 Jan '24
18 Jan '24
Pier Angelo Vendrame pushed to branch base-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
248a7e5f by Pier Angelo Vendrame at 2024-01-18T14:21:21+01:00
Bug 42374: Check for spoof English in number conversions
Some of the code that converts numbers to strings for inputs uses ICU
functions to localize numbers, but it does not check for spoof English.
Also, not all functions where consistent in the conversion, so this
commit addresses also this.
- - - - -
2 changed files:
- dom/html/input/NumericInputTypes.cpp
- intl/unicharutil/util/ICUUtils.cpp
Changes:
=====================================
dom/html/input/NumericInputTypes.cpp
=====================================
@@ -52,11 +52,7 @@ nsresult NumericInputTypeBase::GetRangeOverflowMessage(nsAString& aMessage) {
MOZ_ASSERT(!maximum.isNaN());
nsAutoString maxStr;
- char buf[32];
- DebugOnly<bool> ok = maximum.toString(buf, ArrayLength(buf));
- maxStr.AssignASCII(buf);
- MOZ_ASSERT(ok, "buf not big enough");
-
+ ConvertNumberToString(maximum, maxStr);
return nsContentUtils::FormatMaybeLocalizedString(
aMessage, nsContentUtils::eDOM_PROPERTIES,
"FormValidationNumberRangeOverflow", mInputElement->OwnerDoc(), maxStr);
@@ -67,11 +63,7 @@ nsresult NumericInputTypeBase::GetRangeUnderflowMessage(nsAString& aMessage) {
MOZ_ASSERT(!minimum.isNaN());
nsAutoString minStr;
- char buf[32];
- DebugOnly<bool> ok = minimum.toString(buf, ArrayLength(buf));
- minStr.AssignASCII(buf);
- MOZ_ASSERT(ok, "buf not big enough");
-
+ ConvertNumberToString(minimum, minStr);
return nsContentUtils::FormatMaybeLocalizedString(
aMessage, nsContentUtils::eDOM_PROPERTIES,
"FormValidationNumberRangeUnderflow", mInputElement->OwnerDoc(), minStr);
=====================================
intl/unicharutil/util/ICUUtils.cpp
=====================================
@@ -49,6 +49,13 @@ void ICUUtils::LanguageTagIterForContent::GetNext(nsACString& aBCP47LangTag) {
mCurrentFallbackIndex = 2;
// Else take the app's locale:
+ const bool spoofLocale = nsContentUtils::SpoofLocaleEnglish() &&
+ !mContent->OwnerDoc()->AllowsL10n();
+ if (spoofLocale) {
+ aBCP47LangTag.AssignLiteral("en-US");
+ return;
+ }
+
nsAutoCString appLocale;
LocaleService::GetInstance()->GetAppLocaleAsBCP47(aBCP47LangTag);
return;
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/248a7e5…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/248a7e5…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser][mullvad-browser-115.7.0esr-13.5-1] Bug 42374: Check for spoof English in number conversions
by Pier Angelo Vendrame (@pierov) 18 Jan '24
by Pier Angelo Vendrame (@pierov) 18 Jan '24
18 Jan '24
Pier Angelo Vendrame pushed to branch mullvad-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser
Commits:
839022b4 by Pier Angelo Vendrame at 2024-01-18T14:20:49+01:00
Bug 42374: Check for spoof English in number conversions
Some of the code that converts numbers to strings for inputs uses ICU
functions to localize numbers, but it does not check for spoof English.
Also, not all functions where consistent in the conversion, so this
commit addresses also this.
- - - - -
2 changed files:
- dom/html/input/NumericInputTypes.cpp
- intl/unicharutil/util/ICUUtils.cpp
Changes:
=====================================
dom/html/input/NumericInputTypes.cpp
=====================================
@@ -52,11 +52,7 @@ nsresult NumericInputTypeBase::GetRangeOverflowMessage(nsAString& aMessage) {
MOZ_ASSERT(!maximum.isNaN());
nsAutoString maxStr;
- char buf[32];
- DebugOnly<bool> ok = maximum.toString(buf, ArrayLength(buf));
- maxStr.AssignASCII(buf);
- MOZ_ASSERT(ok, "buf not big enough");
-
+ ConvertNumberToString(maximum, maxStr);
return nsContentUtils::FormatMaybeLocalizedString(
aMessage, nsContentUtils::eDOM_PROPERTIES,
"FormValidationNumberRangeOverflow", mInputElement->OwnerDoc(), maxStr);
@@ -67,11 +63,7 @@ nsresult NumericInputTypeBase::GetRangeUnderflowMessage(nsAString& aMessage) {
MOZ_ASSERT(!minimum.isNaN());
nsAutoString minStr;
- char buf[32];
- DebugOnly<bool> ok = minimum.toString(buf, ArrayLength(buf));
- minStr.AssignASCII(buf);
- MOZ_ASSERT(ok, "buf not big enough");
-
+ ConvertNumberToString(minimum, minStr);
return nsContentUtils::FormatMaybeLocalizedString(
aMessage, nsContentUtils::eDOM_PROPERTIES,
"FormValidationNumberRangeUnderflow", mInputElement->OwnerDoc(), minStr);
=====================================
intl/unicharutil/util/ICUUtils.cpp
=====================================
@@ -49,6 +49,13 @@ void ICUUtils::LanguageTagIterForContent::GetNext(nsACString& aBCP47LangTag) {
mCurrentFallbackIndex = 2;
// Else take the app's locale:
+ const bool spoofLocale = nsContentUtils::SpoofLocaleEnglish() &&
+ !mContent->OwnerDoc()->AllowsL10n();
+ if (spoofLocale) {
+ aBCP47LangTag.AssignLiteral("en-US");
+ return;
+ }
+
nsAutoCString appLocale;
LocaleService::GetInstance()->GetAppLocaleAsBCP47(aBCP47LangTag);
return;
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/839…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/839…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.7.0esr-13.5-1] Bug 42374: Check for spoof English in number conversions
by Pier Angelo Vendrame (@pierov) 18 Jan '24
by Pier Angelo Vendrame (@pierov) 18 Jan '24
18 Jan '24
Pier Angelo Vendrame pushed to branch tor-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
a7932fac by Pier Angelo Vendrame at 2024-01-18T11:10:48+01:00
Bug 42374: Check for spoof English in number conversions
Some of the code that converts numbers to strings for inputs uses ICU
functions to localize numbers, but it does not check for spoof English.
Also, not all functions where consistent in the conversion, so this
commit addresses also this.
- - - - -
2 changed files:
- dom/html/input/NumericInputTypes.cpp
- intl/unicharutil/util/ICUUtils.cpp
Changes:
=====================================
dom/html/input/NumericInputTypes.cpp
=====================================
@@ -52,11 +52,7 @@ nsresult NumericInputTypeBase::GetRangeOverflowMessage(nsAString& aMessage) {
MOZ_ASSERT(!maximum.isNaN());
nsAutoString maxStr;
- char buf[32];
- DebugOnly<bool> ok = maximum.toString(buf, ArrayLength(buf));
- maxStr.AssignASCII(buf);
- MOZ_ASSERT(ok, "buf not big enough");
-
+ ConvertNumberToString(maximum, maxStr);
return nsContentUtils::FormatMaybeLocalizedString(
aMessage, nsContentUtils::eDOM_PROPERTIES,
"FormValidationNumberRangeOverflow", mInputElement->OwnerDoc(), maxStr);
@@ -67,11 +63,7 @@ nsresult NumericInputTypeBase::GetRangeUnderflowMessage(nsAString& aMessage) {
MOZ_ASSERT(!minimum.isNaN());
nsAutoString minStr;
- char buf[32];
- DebugOnly<bool> ok = minimum.toString(buf, ArrayLength(buf));
- minStr.AssignASCII(buf);
- MOZ_ASSERT(ok, "buf not big enough");
-
+ ConvertNumberToString(minimum, minStr);
return nsContentUtils::FormatMaybeLocalizedString(
aMessage, nsContentUtils::eDOM_PROPERTIES,
"FormValidationNumberRangeUnderflow", mInputElement->OwnerDoc(), minStr);
=====================================
intl/unicharutil/util/ICUUtils.cpp
=====================================
@@ -49,6 +49,13 @@ void ICUUtils::LanguageTagIterForContent::GetNext(nsACString& aBCP47LangTag) {
mCurrentFallbackIndex = 2;
// Else take the app's locale:
+ const bool spoofLocale = nsContentUtils::SpoofLocaleEnglish() &&
+ !mContent->OwnerDoc()->AllowsL10n();
+ if (spoofLocale) {
+ aBCP47LangTag.AssignLiteral("en-US");
+ return;
+ }
+
nsAutoCString appLocale;
LocaleService::GetInstance()->GetAppLocaleAsBCP47(aBCP47LangTag);
return;
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/a7932fa…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/a7932fa…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][maint-13.0] Bug 41037: Set time on signing machine before starting signing
by richard (@richard) 18 Jan '24
by richard (@richard) 18 Jan '24
18 Jan '24
richard pushed to branch maint-13.0 at The Tor Project / Applications / tor-browser-build
Commits:
c12f1511 by Nicolas Vigier at 2024-01-18T10:33:05+00:00
Bug 41037: Set time on signing machine before starting signing
After a reboot, the time on our signing machine is incorrect. To avoid
signing a release with incorrect timestamps, we set the time on the
signing machine at the beginning of the signing process.
(cherry picked from commit de4e1feba72e8357c9f40ec3c555aa0dce5e0df2)
- - - - -
3 changed files:
- tools/signing/do-all-signing
- tools/signing/machines-setup/setup-signing-machine
- + tools/signing/machines-setup/sudoers.d/set-date
Changes:
=====================================
tools/signing/do-all-signing
=====================================
@@ -29,6 +29,11 @@ test -f "$steps_dir/linux-signer-gpg-sign.done" ||
read -sp "Enter gpg passphrase: " GPG_PASS
echo
+function set-time-on-signing-machine {
+ local current_time=$(date -u)
+ ssh "$ssh_host_linux_signer" sudo /usr/bin/date -s "'$current_time'"
+}
+
function wait-for-finished-build {
"$script_dir/wait-for-finished-build"
}
@@ -171,6 +176,7 @@ function do_step {
export SIGNING_PROJECTNAME
+do_step set-time-on-signing-machine
do_step wait-for-finished-build
do_step sync-builder-unsigned-to-local-signed
do_step sync-scripts-to-linux-signer
=====================================
tools/signing/machines-setup/setup-signing-machine
=====================================
@@ -91,6 +91,7 @@ sudoers_file sign-mar
sudoers_file sign-exe
sudoers_file sign-apk
sudoers_file sign-rcodesign
+sudoers_file set-date
authorized_keys boklm boklm-tb-release.pub boklm-yk1.pub
create_user richard signing
=====================================
tools/signing/machines-setup/sudoers.d/set-date
=====================================
@@ -0,0 +1 @@
+%signing ALL = NOPASSWD: /usr/bin/date -s *
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/c…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/c…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][main] Bug 41037: Set time on signing machine before starting signing
by richard (@richard) 18 Jan '24
by richard (@richard) 18 Jan '24
18 Jan '24
richard pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
de4e1feb by Nicolas Vigier at 2024-01-18T09:50:25+01:00
Bug 41037: Set time on signing machine before starting signing
After a reboot, the time on our signing machine is incorrect. To avoid
signing a release with incorrect timestamps, we set the time on the
signing machine at the beginning of the signing process.
- - - - -
3 changed files:
- tools/signing/do-all-signing
- tools/signing/machines-setup/setup-signing-machine
- + tools/signing/machines-setup/sudoers.d/set-date
Changes:
=====================================
tools/signing/do-all-signing
=====================================
@@ -29,6 +29,11 @@ test -f "$steps_dir/linux-signer-gpg-sign.done" ||
read -sp "Enter gpg passphrase: " GPG_PASS
echo
+function set-time-on-signing-machine {
+ local current_time=$(date -u)
+ ssh "$ssh_host_linux_signer" sudo /usr/bin/date -s "'$current_time'"
+}
+
function wait-for-finished-build {
"$script_dir/wait-for-finished-build"
}
@@ -171,6 +176,7 @@ function do_step {
export SIGNING_PROJECTNAME
+do_step set-time-on-signing-machine
do_step wait-for-finished-build
do_step sync-builder-unsigned-to-local-signed
do_step sync-scripts-to-linux-signer
=====================================
tools/signing/machines-setup/setup-signing-machine
=====================================
@@ -91,6 +91,7 @@ sudoers_file sign-mar
sudoers_file sign-exe
sudoers_file sign-apk
sudoers_file sign-rcodesign
+sudoers_file set-date
authorized_keys boklm boklm-tb-release.pub boklm-yk1.pub
create_user richard signing
=====================================
tools/signing/machines-setup/sudoers.d/set-date
=====================================
@@ -0,0 +1 @@
+%signing ALL = NOPASSWD: /usr/bin/date -s *
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/d…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/d…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser] Pushed new tag mullvad-browser-115.7.0esr-13.5-1-build1
by Pier Angelo Vendrame (@pierov) 17 Jan '24
by Pier Angelo Vendrame (@pierov) 17 Jan '24
17 Jan '24
Pier Angelo Vendrame pushed new tag mullvad-browser-115.7.0esr-13.5-1-build1 at The Tor Project / Applications / Mullvad Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/tree/mullv…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser][mullvad-browser-115.7.0esr-13.5-1] 19 commits: MB 38: Mullvad Browser configuration
by Pier Angelo Vendrame (@pierov) 17 Jan '24
by Pier Angelo Vendrame (@pierov) 17 Jan '24
17 Jan '24
Pier Angelo Vendrame pushed to branch mullvad-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser
Commits:
a4286e22 by Pier Angelo Vendrame at 2024-01-15T19:41:34+01:00
MB 38: Mullvad Browser configuration
- - - - -
6323523b by Pier Angelo Vendrame at 2024-01-15T19:41:36+01:00
MB 1: Mullvad Browser branding
See also:
mullvad-browser#5: Product name and directory customization
mullvad-browser#12: Create new branding directories and integrate Mullvad icons+branding
mullvad-browser#14: Remove Default Built-in bookmarks
mullvad-browser#35: Add custom PDF icons for Windows builds
mullvad-browser#48: Replace Mozilla copyright and legal trademarks in mullvadbrowser.exe metadata
mullvad-browser#51: Update trademark string
mullvad-browser#104: Update shipped dll metadata copyright/licensing info
mullvad-browser#107: Add alpha and nightly icons
- - - - -
48351652 by Pier Angelo Vendrame at 2024-01-15T19:41:36+01:00
MB 20: Allow packaged-addons in PBM.
We install a few addons from the distribution directory, but they are
not automatically enabled for PBM mode.
This commit modifies the code that installs them to also add the PBM
permission to the known ones.
- - - - -
306635f6 by Pier Angelo Vendrame at 2024-01-15T19:41:36+01:00
MB 63: Customize some about pages for Mullvad Browser
Also:
mullvad-browser#57: Purge unneeded about: pages
- - - - -
1026aa85 by Pier Angelo Vendrame at 2024-01-15T19:41:37+01:00
MB 37: Customization for the about dialog
- - - - -
b7b874db by Henry Wilkes at 2024-01-15T19:41:37+01:00
MB 39: Add home page about:mullvad-browser
- - - - -
d5de1c25 by hackademix at 2024-01-15T19:41:37+01:00
MB 97: Remove UI cues to install new extensions.
- - - - -
5defc607 by hackademix at 2024-01-15T19:41:37+01:00
MB 47: uBlock Origin customization
- - - - -
e61d7a1b by Pier Angelo Vendrame at 2024-01-15T19:41:38+01:00
MB 21: Disable the password manager
This commit disables the about:login page and removes the "Login and
Password" section of about:preferences.
We do not do anything to the real password manager of Firefox, that is
in toolkit: it contains C++ parts that make it difficult to actually
prevent it from being built..
Finally, we modify the the function that opens about:login to report an
error in the console so that we can quickly get a backtrace to the code
that tries to use it.
- - - - -
bd64d5f0 by Pier Angelo Vendrame at 2024-01-15T19:41:38+01:00
MB 87: Disable the default browser box on Windows and Linux
Windows and Linux will be distributed only as portable apps at the
beginning, so they should not be settable as default browsers.
We will need to improve the logic once we decide to ship system-wide
installers, too.
- - - - -
ca4556bb by Pier Angelo Vendrame at 2024-01-15T19:41:38+01:00
MB 112: Updater customization for Mullvad Browser
MB 71: Set the updater base URL to Mullvad domain
- - - - -
a941cc0c by Nicolas Vigier at 2024-01-15T19:41:39+01:00
MB 79: Add Mullvad Browser MAR signing keys
- - - - -
f0e54b46 by Nicolas Vigier at 2024-01-15T19:41:50+01:00
squash! MB 79: Add Mullvad Browser MAR signing keys
MB 256: Add mullvad-browser nightly mar signing key
- - - - -
facc272b by Pier Angelo Vendrame at 2024-01-15T19:42:09+01:00
MB 34: Hide unsafe and unwanted preferences UI
about:preferences allow to override some of our defaults, that could
be fingeprintable or have some other unwanted consequences.
- - - - -
a91fca82 by Pier Angelo Vendrame at 2024-01-15T19:42:10+01:00
MB 160: Disable the cookie exceptions button
Besides disabling the "Delete on close checkbox", disable also the
"Manage Exceptions" button when always using PBM.
- - - - -
271fd4b4 by hackademix at 2024-01-15T19:42:10+01:00
MB 163: prevent uBlock Origin from being uninstalled/disabled
- - - - -
93dc7201 by Richard Pospesel at 2024-01-15T19:42:11+01:00
MB 188: Customize Gitlab Issue and Merge templates
- - - - -
d3db3643 by rui hildt at 2024-01-15T19:42:11+01:00
MB 213: Customize the search engines list
- - - - -
7c7c3bcb by hackademix at 2024-01-15T19:42:11+01:00
MB 214: Enable cross-tab identity leak protection in "quiet" mode
- - - - -
30 changed files:
- + .gitlab/issue_templates/Rebase Browser - Alpha.md
- + .gitlab/issue_templates/Rebase Browser - Stable.md
- .gitlab/merge_request_templates/default.md
- browser/app/Makefile.in
- browser/app/macbuild/Contents/Info.plist.in
- browser/app/module.ver
- browser/app/firefox.exe.manifest → browser/app/mullvadbrowser.exe.manifest
- + browser/app/profile/000-mullvad-browser.js
- browser/app/profile/001-base-profile.js
- browser/base/content/aboutDialog.xhtml
- browser/base/content/appmenu-viewcache.inc.xhtml
- browser/base/content/browser-menubar.inc
- browser/base/content/browser-places.js
- browser/base/content/browser.js
- browser/base/content/default-bookmarks.html
- browser/base/content/nsContextMenu.js
- browser/base/content/overrides/app-license.html
- browser/base/content/pageinfo/pageInfo.xhtml
- browser/base/content/utilityOverlay.js
- browser/branding/branding-common.mozbuild
- + browser/branding/mb-alpha/VisualElements_150.png
- + browser/branding/mb-alpha/VisualElements_70.png
- + browser/branding/mb-alpha/configure.sh
- + browser/branding/mb-alpha/content/about-logo.png
- + browser/branding/mb-alpha/content/about-logo.svg
- + browser/branding/mb-alpha/content/about-logo(a)2x.png
- + browser/branding/mb-alpha/content/about-wordmark.svg
- + browser/branding/mb-alpha/content/about.png
- + browser/branding/mb-alpha/content/aboutDialog.css
- + browser/branding/mb-alpha/content/firefox-wordmark.svg
The diff was not included because it is too large.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/cd…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/cd…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser-update-responses][main] release: new version, 13.0.9
by boklm (@boklm) 17 Jan '24
by boklm (@boklm) 17 Jan '24
17 Jan '24
boklm pushed to branch main at The Tor Project / Applications / mullvad-browser-update-responses
Commits:
cbfde1fc by Nicolas Vigier at 2024-01-17T19:55:53+01:00
release: new version, 13.0.9
- - - - -
29 changed files:
- update_1/release/.htaccess
- − update_1/release/13.0-13.0.7-linux-x86_64-ALL.xml
- − update_1/release/13.0-13.0.7-macos-ALL.xml
- − update_1/release/13.0-13.0.7-windows-x86_64-ALL.xml
- − update_1/release/13.0.1-13.0.7-linux-x86_64-ALL.xml
- − update_1/release/13.0.1-13.0.7-macos-ALL.xml
- − update_1/release/13.0.1-13.0.7-windows-x86_64-ALL.xml
- − update_1/release/13.0.4-13.0.7-linux-x86_64-ALL.xml
- − update_1/release/13.0.4-13.0.7-macos-ALL.xml
- − update_1/release/13.0.4-13.0.7-windows-x86_64-ALL.xml
- + update_1/release/13.0.4-13.0.9-linux-x86_64-ALL.xml
- + update_1/release/13.0.4-13.0.9-macos-ALL.xml
- + update_1/release/13.0.4-13.0.9-windows-x86_64-ALL.xml
- + update_1/release/13.0.6-13.0.9-linux-x86_64-ALL.xml
- + update_1/release/13.0.6-13.0.9-macos-ALL.xml
- + update_1/release/13.0.6-13.0.9-windows-x86_64-ALL.xml
- + update_1/release/13.0.7-13.0.9-linux-x86_64-ALL.xml
- + update_1/release/13.0.7-13.0.9-macos-ALL.xml
- + update_1/release/13.0.7-13.0.9-windows-x86_64-ALL.xml
- − update_1/release/13.0.7-linux-x86_64-ALL.xml
- − update_1/release/13.0.7-macos-ALL.xml
- − update_1/release/13.0.7-windows-x86_64-ALL.xml
- + update_1/release/13.0.9-linux-x86_64-ALL.xml
- + update_1/release/13.0.9-macos-ALL.xml
- + update_1/release/13.0.9-windows-x86_64-ALL.xml
- update_1/release/download-linux-x86_64.json
- update_1/release/download-macos.json
- update_1/release/download-windows-x86_64.json
- update_1/release/downloads.json
Changes:
=====================================
update_1/release/.htaccess
=====================================
@@ -1,22 +1,22 @@
RewriteEngine On
-RewriteRule ^[^/]+/13.0.7/ no-update.xml [last]
-RewriteRule ^Linux_x86_64-gcc3/13.0/ALL 13.0-13.0.7-linux-x86_64-ALL.xml [last]
-RewriteRule ^Linux_x86_64-gcc3/13.0.1/ALL 13.0.1-13.0.7-linux-x86_64-ALL.xml [last]
-RewriteRule ^Linux_x86_64-gcc3/13.0.4/ALL 13.0.4-13.0.7-linux-x86_64-ALL.xml [last]
-RewriteRule ^Linux_x86_64-gcc3/[^/]+/ALL 13.0.7-linux-x86_64-ALL.xml [last]
-RewriteRule ^Linux_x86_64-gcc3/ 13.0.7-linux-x86_64-ALL.xml [last]
-RewriteRule ^Darwin_x86_64-gcc3/13.0/ALL 13.0-13.0.7-macos-ALL.xml [last]
-RewriteRule ^Darwin_x86_64-gcc3/13.0.1/ALL 13.0.1-13.0.7-macos-ALL.xml [last]
-RewriteRule ^Darwin_x86_64-gcc3/13.0.4/ALL 13.0.4-13.0.7-macos-ALL.xml [last]
-RewriteRule ^Darwin_x86_64-gcc3/[^/]+/ALL 13.0.7-macos-ALL.xml [last]
-RewriteRule ^Darwin_x86_64-gcc3/ 13.0.7-macos-ALL.xml [last]
-RewriteRule ^Darwin_aarch64-gcc3/13.0/ALL 13.0-13.0.7-macos-ALL.xml [last]
-RewriteRule ^Darwin_aarch64-gcc3/13.0.1/ALL 13.0.1-13.0.7-macos-ALL.xml [last]
-RewriteRule ^Darwin_aarch64-gcc3/13.0.4/ALL 13.0.4-13.0.7-macos-ALL.xml [last]
-RewriteRule ^Darwin_aarch64-gcc3/[^/]+/ALL 13.0.7-macos-ALL.xml [last]
-RewriteRule ^Darwin_aarch64-gcc3/ 13.0.7-macos-ALL.xml [last]
-RewriteRule ^WINNT_x86_64-gcc3-x64/13.0/ALL 13.0-13.0.7-windows-x86_64-ALL.xml [last]
-RewriteRule ^WINNT_x86_64-gcc3-x64/13.0.1/ALL 13.0.1-13.0.7-windows-x86_64-ALL.xml [last]
-RewriteRule ^WINNT_x86_64-gcc3-x64/13.0.4/ALL 13.0.4-13.0.7-windows-x86_64-ALL.xml [last]
-RewriteRule ^WINNT_x86_64-gcc3-x64/[^/]+/ALL 13.0.7-windows-x86_64-ALL.xml [last]
-RewriteRule ^WINNT_x86_64-gcc3-x64/ 13.0.7-windows-x86_64-ALL.xml [last]
+RewriteRule ^[^/]+/13.0.9/ no-update.xml [last]
+RewriteRule ^Linux_x86_64-gcc3/13.0.4/ALL 13.0.4-13.0.9-linux-x86_64-ALL.xml [last]
+RewriteRule ^Linux_x86_64-gcc3/13.0.6/ALL 13.0.6-13.0.9-linux-x86_64-ALL.xml [last]
+RewriteRule ^Linux_x86_64-gcc3/13.0.7/ALL 13.0.7-13.0.9-linux-x86_64-ALL.xml [last]
+RewriteRule ^Linux_x86_64-gcc3/[^/]+/ALL 13.0.9-linux-x86_64-ALL.xml [last]
+RewriteRule ^Linux_x86_64-gcc3/ 13.0.9-linux-x86_64-ALL.xml [last]
+RewriteRule ^Darwin_x86_64-gcc3/13.0.4/ALL 13.0.4-13.0.9-macos-ALL.xml [last]
+RewriteRule ^Darwin_x86_64-gcc3/13.0.6/ALL 13.0.6-13.0.9-macos-ALL.xml [last]
+RewriteRule ^Darwin_x86_64-gcc3/13.0.7/ALL 13.0.7-13.0.9-macos-ALL.xml [last]
+RewriteRule ^Darwin_x86_64-gcc3/[^/]+/ALL 13.0.9-macos-ALL.xml [last]
+RewriteRule ^Darwin_x86_64-gcc3/ 13.0.9-macos-ALL.xml [last]
+RewriteRule ^Darwin_aarch64-gcc3/13.0.4/ALL 13.0.4-13.0.9-macos-ALL.xml [last]
+RewriteRule ^Darwin_aarch64-gcc3/13.0.6/ALL 13.0.6-13.0.9-macos-ALL.xml [last]
+RewriteRule ^Darwin_aarch64-gcc3/13.0.7/ALL 13.0.7-13.0.9-macos-ALL.xml [last]
+RewriteRule ^Darwin_aarch64-gcc3/[^/]+/ALL 13.0.9-macos-ALL.xml [last]
+RewriteRule ^Darwin_aarch64-gcc3/ 13.0.9-macos-ALL.xml [last]
+RewriteRule ^WINNT_x86_64-gcc3-x64/13.0.4/ALL 13.0.4-13.0.9-windows-x86_64-ALL.xml [last]
+RewriteRule ^WINNT_x86_64-gcc3-x64/13.0.6/ALL 13.0.6-13.0.9-windows-x86_64-ALL.xml [last]
+RewriteRule ^WINNT_x86_64-gcc3-x64/13.0.7/ALL 13.0.7-13.0.9-windows-x86_64-ALL.xml [last]
+RewriteRule ^WINNT_x86_64-gcc3-x64/[^/]+/ALL 13.0.9-windows-x86_64-ALL.xml [last]
+RewriteRule ^WINNT_x86_64-gcc3-x64/ 13.0.9-windows-x86_64-ALL.xml [last]
=====================================
update_1/release/13.0-13.0.7-linux-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.7" appVersion="13.0.7" platformVersion="115.6.0" buildID="20231212135313" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-linux-x86_64-13.0.7_…" hashFunction="SHA512" hashValue="0049ea6b49e9e234bd22bb1b8f32dcf1df589af559191fba9339b8e9a99c1f4cc032fe3ebb1afa5d24597944339bcc72a279ca6a39834484093225273fcc4227" size="106772786" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-linux-x86_64--13.0-1…" hashFunction="SHA512" hashValue="cdde836ca522b8c15e02e87a2cdf13a83c262dd7b80da4a075919dadb223e165834b747b51dcf8bf7a5c7aa6f0882fd24129d8e0d2a202cc851810497c00555b" size="8747852" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0-13.0.7-macos-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.7" appVersion="13.0.7" platformVersion="115.6.0" buildID="20231212135313" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-macos-13.0.7_ALL.mar" hashFunction="SHA512" hashValue="ade433141e238b542ad77e701cd7e83998d292a89d32106a354c9e5372fbac83883a6bc480324d4e8e595cdcf8b54690588feff9ca479629af6c90ba425d5275" size="114807843" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-macos--13.0-13.0.7_A…" hashFunction="SHA512" hashValue="663eabb5c5f632ba2aff1b6babcb43deab581b47ddc10e6ab9cb1a97aa472c72be1cb5a7aa1946f10227f7566765b94072391bfb94e98435ce02ccafbfe5272a" size="13850477" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0-13.0.7-windows-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.7" appVersion="13.0.7" platformVersion="115.6.0" buildID="20231212135313" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-windows-x86_64-13.0.…" hashFunction="SHA512" hashValue="042620fe4e03d22528ec349297ef7c98ad51cd9d12e705233c41046dcf53052f7b524631541a5cb61cb70d9390b05a23f41d7f79bbe79015501ee54db782d2ec" size="88745215" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-windows-x86_64--13.0…" hashFunction="SHA512" hashValue="9adfc6c76d0d365cd4db151f6f2cf608a27a6af84cc6894fe65999bad9e0323f8823962af24d97f2cee22f906db395391b5a59d5916c61cde6fd48f14ceee9e3" size="9175064" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.1-13.0.7-linux-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.7" appVersion="13.0.7" platformVersion="115.6.0" buildID="20231212135313" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-linux-x86_64-13.0.7_…" hashFunction="SHA512" hashValue="0049ea6b49e9e234bd22bb1b8f32dcf1df589af559191fba9339b8e9a99c1f4cc032fe3ebb1afa5d24597944339bcc72a279ca6a39834484093225273fcc4227" size="106772786" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-linux-x86_64--13.0.1…" hashFunction="SHA512" hashValue="4fda0525f4b86f91f9d16da5efb7face01f1a7040cc7eac5e5272ec71b984e5419f44eefa3ccb8a221c52895fc6f1915fd06d7851e5b1704b71429a7ac9b9aae" size="8401564" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.1-13.0.7-macos-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.7" appVersion="13.0.7" platformVersion="115.6.0" buildID="20231212135313" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-macos-13.0.7_ALL.mar" hashFunction="SHA512" hashValue="ade433141e238b542ad77e701cd7e83998d292a89d32106a354c9e5372fbac83883a6bc480324d4e8e595cdcf8b54690588feff9ca479629af6c90ba425d5275" size="114807843" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-macos--13.0.1-13.0.7…" hashFunction="SHA512" hashValue="a37aeb6b61fd22c9633615bd3f22ae29ee1eed5d1ad8f8b45e65d09ab4e6f32b57d54ecdea23a5b1cad89b30d5b2d57aa581d979d5aec2b3c014c2965b25f114" size="13507245" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.1-13.0.7-windows-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.7" appVersion="13.0.7" platformVersion="115.6.0" buildID="20231212135313" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-windows-x86_64-13.0.…" hashFunction="SHA512" hashValue="042620fe4e03d22528ec349297ef7c98ad51cd9d12e705233c41046dcf53052f7b524631541a5cb61cb70d9390b05a23f41d7f79bbe79015501ee54db782d2ec" size="88745215" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-windows-x86_64--13.0…" hashFunction="SHA512" hashValue="2b98e21672025ece7104976f33f6e201c2dc565cb6bee38720dfac56191a06a336c71bbd18b65ea1173e58e10b309f5be0d5e8a35b08736c0283c85eadfd8235" size="8927108" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.4-13.0.7-linux-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.7" appVersion="13.0.7" platformVersion="115.6.0" buildID="20231212135313" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-linux-x86_64-13.0.7_…" hashFunction="SHA512" hashValue="0049ea6b49e9e234bd22bb1b8f32dcf1df589af559191fba9339b8e9a99c1f4cc032fe3ebb1afa5d24597944339bcc72a279ca6a39834484093225273fcc4227" size="106772786" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-linux-x86_64--13.0.4…" hashFunction="SHA512" hashValue="4b7b09215582a552b2af7be4e7623c5e4955257fabd2b6093dd3fd7e4b6330d4c0b9005cc89978a73b4bea6ce8d1b516040c35d0fdd81f1a15a17e9682f55e77" size="7542432" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.4-13.0.7-macos-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.7" appVersion="13.0.7" platformVersion="115.6.0" buildID="20231212135313" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-macos-13.0.7_ALL.mar" hashFunction="SHA512" hashValue="ade433141e238b542ad77e701cd7e83998d292a89d32106a354c9e5372fbac83883a6bc480324d4e8e595cdcf8b54690588feff9ca479629af6c90ba425d5275" size="114807843" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-macos--13.0.4-13.0.7…" hashFunction="SHA512" hashValue="8754855c6288751b5141557ff824e507f01f05bfc5e4566d35f734289568b2e680256e72ba5abae1254906e98f39587bb69f25f29d29771b5b62daabeb173d70" size="12411977" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.4-13.0.7-windows-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.7" appVersion="13.0.7" platformVersion="115.6.0" buildID="20231212135313" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-windows-x86_64-13.0.…" hashFunction="SHA512" hashValue="042620fe4e03d22528ec349297ef7c98ad51cd9d12e705233c41046dcf53052f7b524631541a5cb61cb70d9390b05a23f41d7f79bbe79015501ee54db782d2ec" size="88745215" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-windows-x86_64--13.0…" hashFunction="SHA512" hashValue="127e47f252e9508046433d425b6a3a6eba645449cb88b97b0ac8bc0382b553b25dd56da9eba741c35c8b6eb1a97e306bbe5ad146f8bd52c30de7ee34c9546789" size="7986156" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.4-13.0.9-linux-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174108" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-linux-x86_64-13.0.9_…" hashFunction="SHA512" hashValue="18fdf0900b6e5e58f833828e2a854b44e997dd6a752a1fa38d29acf69ca6d88e39e5e8f1811ffb9a0ea5240afa32efa8459c25ddd1d7e57090b8ffdfa7a112ad" size="107222791" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-linux-x86_64--13.0.4…" hashFunction="SHA512" hashValue="a93457c9f91ac3277f0120e88cfe99f133b45f4db6d5d8bebb3a63f9fa3980afcb9dc995374574db32a47b46fa32be2c416d20f758b392880700bc6d147c60a8" size="11307785" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.4-13.0.9-macos-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174108" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-macos-13.0.9_ALL.mar" hashFunction="SHA512" hashValue="2f2fb000e87b425a8df5b25160354eab158a86d7b20b0cb957a9e6f33e9d54a02873b118bc4ad007886e3361ed85a3c3b3f397a36ebe748b91abaf9d72a28887" size="115259351" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-macos--13.0.4-13.0.9…" hashFunction="SHA512" hashValue="fabe36cb82c4393ad2cbe7d28315c4d75667aa4cc5f073d9da5b61d109d54cd9721309e2f5a9109b5dca57eb3af31271daee0caf28c80aa268b1b815f5b4efda" size="76833715" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.4-13.0.9-windows-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174108" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-windows-x86_64-13.0.…" hashFunction="SHA512" hashValue="6b955bb9b9f28f34b0199eaad15dcbc7bc28a62ed318ae95b2f162dba2f45a4ca877a47c86d892f2ef859a69f7188a1ab2c08ec9861b7682b214214014369282" size="89196812" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-windows-x86_64--13.0…" hashFunction="SHA512" hashValue="43e8d970e16f216c7e7cd2094d23ccde0ac5af397973c0a15d33a45c5602f9893f43ee42f5a6204f4c2582b1ddfbc1fe858dba5ee18b49d1d929946972753ac3" size="11833733" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.6-13.0.9-linux-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174108" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-linux-x86_64-13.0.9_…" hashFunction="SHA512" hashValue="18fdf0900b6e5e58f833828e2a854b44e997dd6a752a1fa38d29acf69ca6d88e39e5e8f1811ffb9a0ea5240afa32efa8459c25ddd1d7e57090b8ffdfa7a112ad" size="107222791" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-linux-x86_64--13.0.6…" hashFunction="SHA512" hashValue="f2cb0404a1af1a097bc7715497efc5f8dd8d60af9e09408fbcd781b3bf0123102b08b26d35643f4ed865a2fa09d9828e1503efd44b8e218eee7948bd22830e6c" size="11023938" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.6-13.0.9-macos-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174108" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-macos-13.0.9_ALL.mar" hashFunction="SHA512" hashValue="2f2fb000e87b425a8df5b25160354eab158a86d7b20b0cb957a9e6f33e9d54a02873b118bc4ad007886e3361ed85a3c3b3f397a36ebe748b91abaf9d72a28887" size="115259351" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-macos--13.0.6-13.0.9…" hashFunction="SHA512" hashValue="ae9748ea2851ddfdb076c71cc71eddd3cd8ea6a336ca1a1759b975256223fd51951407793953157a3dfeec229d1875bfcf391417f1b0f3b58a0ba4fe9ae41287" size="76593879" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.6-13.0.9-windows-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174108" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-windows-x86_64-13.0.…" hashFunction="SHA512" hashValue="6b955bb9b9f28f34b0199eaad15dcbc7bc28a62ed318ae95b2f162dba2f45a4ca877a47c86d892f2ef859a69f7188a1ab2c08ec9861b7682b214214014369282" size="89196812" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-windows-x86_64--13.0…" hashFunction="SHA512" hashValue="4de8e6b0fdeb35371d9c051e9ebbfa2878487cd1ad4dc7e22583e3f9cedadd8a9867d77073ec22ae950bcb5fbabd5858d9a3e0d2f357dd69e3783b39aa71b12c" size="11587701" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.7-13.0.9-linux-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174108" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-linux-x86_64-13.0.9_…" hashFunction="SHA512" hashValue="18fdf0900b6e5e58f833828e2a854b44e997dd6a752a1fa38d29acf69ca6d88e39e5e8f1811ffb9a0ea5240afa32efa8459c25ddd1d7e57090b8ffdfa7a112ad" size="107222791" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-linux-x86_64--13.0.7…" hashFunction="SHA512" hashValue="d580164e63cf556cbeec1115289534762337ff00b8eb1f9404f181a6d7cd6200133026c89764212b1dd558949e8b9e8c5aa161de935824803ce82afef1aa6556" size="9720353" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.7-13.0.9-macos-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174108" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-macos-13.0.9_ALL.mar" hashFunction="SHA512" hashValue="2f2fb000e87b425a8df5b25160354eab158a86d7b20b0cb957a9e6f33e9d54a02873b118bc4ad007886e3361ed85a3c3b3f397a36ebe748b91abaf9d72a28887" size="115259351" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-macos--13.0.7-13.0.9…" hashFunction="SHA512" hashValue="d77ea66fd5ed38912332c4fdb9b3b50212f6f10cfea9276e73b4cd5e53d6e70b2c581e0d887073fda0313ebc6d179866d359c54b178d703944f55da4cb50104e" size="76133103" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.7-13.0.9-windows-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174108" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-windows-x86_64-13.0.…" hashFunction="SHA512" hashValue="6b955bb9b9f28f34b0199eaad15dcbc7bc28a62ed318ae95b2f162dba2f45a4ca877a47c86d892f2ef859a69f7188a1ab2c08ec9861b7682b214214014369282" size="89196812" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-windows-x86_64--13.0…" hashFunction="SHA512" hashValue="20e5cfca2e945dc4f3bfa3ebe1885de2a9764ba55e7a2e8436a55dc8c6d3de196c3d081e9510a7d1ef130cdac8d1564127ed9c1445c2ed7d3c398b8142c42b6b" size="9629252" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.7-linux-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.7" appVersion="13.0.7" platformVersion="115.6.0" buildID="20231212135313" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-linux-x86_64-13.0.7_…" hashFunction="SHA512" hashValue="0049ea6b49e9e234bd22bb1b8f32dcf1df589af559191fba9339b8e9a99c1f4cc032fe3ebb1afa5d24597944339bcc72a279ca6a39834484093225273fcc4227" size="106772786" type="complete"></patch></update></updates>
=====================================
update_1/release/13.0.7-macos-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.7" appVersion="13.0.7" platformVersion="115.6.0" buildID="20231212135313" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-macos-13.0.7_ALL.mar" hashFunction="SHA512" hashValue="ade433141e238b542ad77e701cd7e83998d292a89d32106a354c9e5372fbac83883a6bc480324d4e8e595cdcf8b54690588feff9ca479629af6c90ba425d5275" size="114807843" type="complete"></patch></update></updates>
=====================================
update_1/release/13.0.7-windows-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.7" appVersion="13.0.7" platformVersion="115.6.0" buildID="20231212135313" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.7" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-windows-x86_64-13.0.…" hashFunction="SHA512" hashValue="042620fe4e03d22528ec349297ef7c98ad51cd9d12e705233c41046dcf53052f7b524631541a5cb61cb70d9390b05a23f41d7f79bbe79015501ee54db782d2ec" size="88745215" type="complete"></patch></update></updates>
=====================================
update_1/release/13.0.9-linux-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174108" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-linux-x86_64-13.0.9_…" hashFunction="SHA512" hashValue="18fdf0900b6e5e58f833828e2a854b44e997dd6a752a1fa38d29acf69ca6d88e39e5e8f1811ffb9a0ea5240afa32efa8459c25ddd1d7e57090b8ffdfa7a112ad" size="107222791" type="complete"></patch></update></updates>
=====================================
update_1/release/13.0.9-macos-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174108" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-macos-13.0.9_ALL.mar" hashFunction="SHA512" hashValue="2f2fb000e87b425a8df5b25160354eab158a86d7b20b0cb957a9e6f33e9d54a02873b118bc4ad007886e3361ed85a3c3b3f397a36ebe748b91abaf9d72a28887" size="115259351" type="complete"></patch></update></updates>
=====================================
update_1/release/13.0.9-windows-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.9" appVersion="13.0.9" platformVersion="115.7.0" buildID="20240115174108" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.9" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-windows-x86_64-13.0.…" hashFunction="SHA512" hashValue="6b955bb9b9f28f34b0199eaad15dcbc7bc28a62ed318ae95b2f162dba2f45a4ca877a47c86d892f2ef859a69f7188a1ab2c08ec9861b7682b214214014369282" size="89196812" type="complete"></patch></update></updates>
=====================================
update_1/release/download-linux-x86_64.json
=====================================
@@ -1 +1 @@
-{"binary":"https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-linux-x86_64-13.0.7.…","git_tag":"mb-13.0.7-build1","sig":"https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-linux-x86_64-13.0.7.…","version":"13.0.7"}
\ No newline at end of file
+{"binary":"https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-linux-x86_64-13.0.9.…","git_tag":"mb-13.0.9-build1","sig":"https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-linux-x86_64-13.0.9.…","version":"13.0.9"}
\ No newline at end of file
=====================================
update_1/release/download-macos.json
=====================================
@@ -1 +1 @@
-{"binary":"https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-macos-13.0.7.dmg","git_tag":"mb-13.0.7-build1","sig":"https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-macos-13.0.7.dmg.asc","version":"13.0.7"}
\ No newline at end of file
+{"binary":"https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-macos-13.0.9.dmg","git_tag":"mb-13.0.9-build1","sig":"https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-macos-13.0.9.dmg.asc","version":"13.0.9"}
\ No newline at end of file
=====================================
update_1/release/download-windows-x86_64.json
=====================================
@@ -1 +1 @@
-{"binary":"https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-windows-x86_64-porta…","git_tag":"mb-13.0.7-build1","sig":"https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-windows-x86_64-porta…","version":"13.0.7"}
\ No newline at end of file
+{"binary":"https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-windows-x86_64-porta…","git_tag":"mb-13.0.9-build1","sig":"https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-windows-x86_64-porta…","version":"13.0.9"}
\ No newline at end of file
=====================================
update_1/release/downloads.json
=====================================
@@ -1 +1 @@
-{"downloads":{"linux-x86_64":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-linux-x86_64-13.0.7.…","sig":"https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-linux-x86_64-13.0.7.…"}},"macos":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-macos-13.0.7.dmg","sig":"https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-macos-13.0.7.dmg.asc"}},"win64":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-windows-x86_64-porta…","sig":"https://cdn.mullvad.net/browser/13.0.7/mullvad-browser-windows-x86_64-porta…"}}},"tag":"mb-13.0.7-build1","version":"13.0.7"}
\ No newline at end of file
+{"downloads":{"linux-x86_64":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-linux-x86_64-13.0.9.…","sig":"https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-linux-x86_64-13.0.9.…"}},"macos":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-macos-13.0.9.dmg","sig":"https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-macos-13.0.9.dmg.asc"}},"win64":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-windows-x86_64-porta…","sig":"https://cdn.mullvad.net/browser/13.0.9/mullvad-browser-windows-x86_64-porta…"}}},"tag":"mb-13.0.9-build1","version":"13.0.9"}
\ No newline at end of file
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser-update-respo…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser-update-respo…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/torbrowser-launcher] Deleted branch asciiwolf-readme-update
by asciiwolf (@asciiwolf) 17 Jan '24
by asciiwolf (@asciiwolf) 17 Jan '24
17 Jan '24
asciiwolf deleted branch asciiwolf-readme-update at The Tor Project / Applications / torbrowser-launcher
--
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/torbrowser-launcher][main] Update the Flatpak name
by boklm (@boklm) 17 Jan '24
by boklm (@boklm) 17 Jan '24
17 Jan '24
boklm pushed to branch main at The Tor Project / Applications / torbrowser-launcher
Commits:
96594666 by asciiwolf at 2024-01-17T13:22:42+00:00
Update the Flatpak name
- - - - -
1 changed file:
- README.md
Changes:
=====================================
README.md
=====================================
@@ -27,11 +27,11 @@ Install Flatpak using these [instructions](https://flatpak.org/setup/).
Then install `torbrowser-launcher` like this:
```
-flatpak install flathub com.github.micahflee.torbrowser-launcher -y
+flatpak install flathub org.torproject.torbrowser-launcher -y
```
Run `torbrowser-launcher` either by using the GUI desktop launcher, or by running:
```
-flatpak run com.github.micahflee.torbrowser-launcher
+flatpak run org.torproject.torbrowser-launcher
```
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/commit…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/commit…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/torbrowser-launcher] Pushed new branch asciiwolf-readme-update
by asciiwolf (@asciiwolf) 17 Jan '24
by asciiwolf (@asciiwolf) 17 Jan '24
17 Jan '24
asciiwolf pushed new branch asciiwolf-readme-update at The Tor Project / Applications / torbrowser-launcher
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/tree/a…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build] Pushed new tag mb-13.0.9-build1
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed new tag mb-13.0.9-build1 at The Tor Project / Applications / tor-browser-build
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/tree/mb-…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][maint-13.0] Bug 41034&41055: Prepare Tor Browser and Mullvad Browser 13.0.9
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed to branch maint-13.0 at The Tor Project / Applications / tor-browser-build
Commits:
8e8cfea2 by Pier Angelo Vendrame at 2024-01-16T14:08:27+01:00
Bug 41034&41055: Prepare Tor Browser and Mullvad Browser 13.0.9
- - - - -
10 changed files:
- projects/browser/Bundle-Data/Docs-MB/ChangeLog.txt
- projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt
- projects/browser/allowed_addons.json
- projects/browser/config
- projects/firefox-android/config
- projects/firefox/config
- projects/geckoview/config
- projects/go/config
- projects/translation/config
- rbm.conf
Changes:
=====================================
projects/browser/Bundle-Data/Docs-MB/ChangeLog.txt
=====================================
@@ -1,3 +1,57 @@
+Mullvad Browser 13.0.9 - January 23 2024
+ * All Platforms
+ * Updated Firefox to 115.7.0esr
+ * Updated uBlock Origin to 1.55.0
+ * Bug 249: BrowserHost has null mRoot when applying initial window size in debug [mullvad-browser]
+ * Bug 260: Rebase Mullvad Browser Stable onto Firefox 115.7.0esr [mullvad-browser]
+ * Bug 42189: Assertion failure: the value of mPrivateBrowsingId in the loadContext and in the loadInfo are not the same! [tor-browser]
+ * Bug 41044: Add tbb_version.json-like file for Mullvad Browser [tor-browser-build]
+ * Linux
+ * Bug 41050: Improve the disk leak sanitization on start-$browser [tor-browser-build]
+ * Build System
+ * All Platforms
+ * Bug 41042: Add options to include updates in the changelog scripts [tor-browser-build]
+ * Bug 41043: Create script to push build requests to Mullvad build servers [tor-browser-build]
+ * Bug 41056: Make it possible to use templates in var/torbrowser_incremental_from [tor-browser-build]
+ * Bug 41059: Update keyring/torbrowser.gpg with updated key [tor-browser-build]
+ * Windows + macOS
+ * Bug 41016: Switch from bullseye to bookworm for desktop platforms [tor-browser-build]
+ * Windows
+ * Bug 41015: Enable std::filesystem on libc++ on Windows [tor-browser-build]
+
+Mullvad Browser 13.5a3 - December 20 2023
+ * All Platforms
+ * Updated Firefox to 115.6.0esr
+ * Updated NoScript to 11.4.29
+ * Bug 249: BrowserHost has null mRoot when applying initial window size in debug [mullvad-browser]
+ * Bug 256: Update nightly mar signing key [mullvad-browser]
+ * Bug 258: Rebase Mullvad Browser alpha onto 115.6.0esr [mullvad-browser]
+ * Bug 42042: view-source:http://ip-address does not work because of HTTPS Only [tor-browser]
+ * Bug 42189: Assertion failure: the value of mPrivateBrowsingId in the loadContext and in the loadInfo are not the same! [tor-browser]
+ * Bug 42335: Do not localize the order of locales for app lang [tor-browser]
+ * Bug 41044: Add tbb_version.json-like file for Mullvad Browser [tor-browser-build]
+ * Windows
+ * Bug 42163: Make the 3rd party DLL blocklist obey portable mode [tor-browser]
+ * Linux
+ * Bug 41050: Improve disk leak sanitization on startup [tor-browser]
+ * Build System
+ * All Platforms
+ * Bug 40995: Use cdn.stagemole.eu instead of cdn.devmole.eu in download-unsigned-sha256sums-gpg-signatures-from-people-tpo [tor-browser-build]
+ * Bug 41026: Do not use ~ when uploading the signed hashes [tor-browser-build]
+ * Bug 41027: Remove tb-build-04 and tb-build-05 from tools/signing/download-unsigned-sha256sums-gpg-signatures-from-people-tpo [tor-browser-build]
+ * Bug 41031: Add command to unsign .mar files and compare with sha256sums-unsigned-build.txt [tor-browser-build]
+ * Bug 41039: Update tools/signing/upload-update_responses-to-staticiforme to keep download-*json files from previous release when new release does not include them [tor-browser-build]
+ * Bug 41041: Sign mullvad-browser nightly updates [tor-browser-build]
+ * Bug 41042: Add options to include updates in the changelog scripts [tor-browser-build]
+ * Bug 41043: Create script to push build requests to Mullvad build servers [tor-browser-build]
+ * Windows + macOS
+ * Bug 41016: Switch from bullseye to bookworm for desktop platforms [tor-browser-build]
+ * Windows
+ * Bug 41015: Enable std::filesystem on libc++ on Windows [tor-browser-build]
+ * Bug 41030: Add command to unsign .exe files and compare with sha256sums-unsigned-build.txt [tor-browser-build]
+ * macOS
+ * Bug 40990: Remove old macos signing scripts [tor-browser-build]
+
Mullvad Browser 13.0.7 - December 19 2023
* All Platforms
* Updated Firefox to 115.6.0esr
=====================================
projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt
=====================================
@@ -1,3 +1,94 @@
+Tor Browser 13.0.9 - January 23 2024
+ * All Platforms
+ * Updated Snowflake to 2.8.1
+ * Bug 42363: Tab thumbnails enhancements [tor-browser]
+ * Bug 42365: Rebase Tor Browser Stable onto Firefox 115.7.0esr [tor-browser]
+ * Bug 42367: Backport Android seucirty fixes from Firefox 122 [tor-browser]
+ * Bug 41058: Update Snowflake to 2.8.1 [tor-browser-build]
+ * Windows + macOS + Linux
+ * Updated Firefox to 115.7.0esr
+ * Bug 42099: Blind cross-origin requests to .tor.onion domains [tor-browser]
+ * Bug 42189: Assertion failure: the value of mPrivateBrowsingId in the loadContext and in the loadInfo are not the same! [tor-browser]
+ * Android
+ * Updated GeckoView to 115.7.0esr
+ * Bug 42313: Enable One UI Sans KR as a possible font for Korean (MozBug 1865238) [tor-browser]
+ * Bug 42324: Onion Location on Android is ignored [tor-browser]
+ * Bug 42346: Crash in firefox-android originating in backported FullScreenNotificationDialog patch [tor-browser]
+ * Bug 42353: Fix Android NoScript automatic updates [tor-browser]
+ * Bug 42355: Fullscreen on Android doesn't hide system bars [tor-browser]
+ * Build System
+ * All Platforms
+ * Updated Go to 1.20.13 and 1.21.6
+ * Bug 41059: Update keyring/torbrowser.gpg with updated key [tor-browser-build]
+ * Bug 41063: Run "file $keyring" in tools/keyring/list-all-keyrings [tor-browser-build]
+ * Windows + macOS + Linux
+ * Bug 41056: Make it possible to use templates in var/torbrowser_incremental_from [tor-browser-build]
+ * Windows + macOS
+ * Bug 41016: Switch from bullseye to bookworm for desktop platforms [tor-browser-build]
+ * Windows
+ * Bug 41015: Enable std::filesystem on libc++ on Windows [tor-browser-build]
+
+Tor Browser 13.5a3 - December 22 2023
+ * All Platforms
+ * Updated Tor to 0.4.8.10
+ * Updated NoScript to 11.4.29
+ * Bug 42042: view-source:http://ip-address does not work because of HTTPS Only [tor-browser]
+ * Bug 42308: Update README for tor browser [tor-browser]
+ * Bug 42332: Rebase Tor Browser alpha onto 115.6.0esr [tor-browser]
+ * Bug 42334: Keep returning ERROR_ONION_WITH_SELF_SIGNED_CERT only for .onion sites whose cert throws ERROR_UNKNOWN_ISSUER [tor-browser]
+ * Bug 42335: Do not localize the order of locales for app lang [tor-browser]
+ * Bug 42340: TorBridgeChanged notification sends out "[object Object]" as its data. [tor-browser]
+ * Windows + macOS + Linux
+ * Updated Firefox to 115.6.0esr
+ * Bug 40856: Add a default for preferences in TorSettings [tor-browser]
+ * Bug 42099: Blind cross-origin requests to .tor.onion domains [tor-browser]
+ * Bug 42189: Assertion failure: the value of mPrivateBrowsingId in the loadContext and in the loadInfo are not the same! [tor-browser]
+ * Bug 42283: Tor Browser shouldn't ship blockchair by default [tor-browser]
+ * Bug 42299: After adding incorrect bridge addres on user cannot go back to the Connection page [tor-browser]
+ * Bug 42303: Remove unused "help" button logic in tor dialogs [tor-browser]
+ * Bug 42319: Make all the wordmark of the same size [tor-browser]
+ * Windows
+ * Bug 42163: Make the 3rd party DLL blocklist obey portable mode [tor-browser]
+ * Bug 42179: PTs on Tor Browser 13 do not work with Windows 7 [tor-browser]
+ * Linux
+ * Bug 41050: Improve the disk leak sanitization on start-$browser [tor-browser-build]
+ * Android
+ * Updated GeckoView to 115.6.0esr
+ * Bug 42248: Allow GeckoView to launch tor [tor-browser]
+ * Bug 42249: Allow GeckoView to launch lyrebird [tor-browser]
+ * Bug 42250: Allow Moat.sys.mjs to invoke lyrebird on Android [tor-browser]
+ * Bug 42301: Make TorSettings interact with the old Android Settings [tor-browser]
+ * Bug 42313: Enable One UI Sans KR as a possible font for Korean (MozBug 1865238) [tor-browser]
+ * Bug 42323: Add a checkbox to enable the connect assist experiments on alpha [tor-browser]
+ * Bug 42324: Onion Location on Android is ignored [tor-browser]
+ * Bug 42339: Backport Android security fixes from Firefox 121 to 115.6 - based Tor Browser [tor-browser]
+ * Build System
+ * All Platforms
+ * Updated Go to 1.21.5
+ * Bug 42331: tb-dev fetch command is missing repository argument [tor-browser]
+ * Bug 40995: Use cdn.stagemole.eu instead of cdn.devmole.eu in download-unsigned-sha256sums-gpg-signatures-from-people-tpo [tor-browser-build]
+ * Bug 41026: Do not use ~ when uploading the signed hashes [tor-browser-build]
+ * Bug 41027: Remove tb-build-04 and tb-build-05 from tools/signing/download-unsigned-sha256sums-gpg-signatures-from-people-tpo [tor-browser-build]
+ * Bug 41036: Remove go_vendor-lyrebird-nightly makefile target, and rename go_vendor-$project-alpha makefile targets to go_vendor-$project [tor-browser-build]
+ * Bug 41039: Update tools/signing/upload-update_responses-to-staticiforme to keep download-*json files from previous release when new release does not include them [tor-browser-build]
+ * Bug 41042: Add options to include updates in the changelog scripts [tor-browser-build]
+ * Bug 41043: Create script to push build requests to Mullvad build servers [tor-browser-build]
+ * Bug 41045: Dump more information about build times on Firefox [tor-browser-build]
+ * Bug 41048: Drop the kcp-go project [tor-browser-build]
+ * Windows + macOS + Linux
+ * Bug 41031: Add command to unsign .mar files and compare with sha256sums-unsigned-build.txt [tor-browser-build]
+ * Bug 41056: Make it possible to use templates in var/torbrowser_incremental_from [tor-browser-build]
+ * Bug 41057: make fetch is not fetching mullvad repo [tor-browser-build]
+ * Windows + macOS
+ * Bug 41016: Switch from bullseye to bookworm for desktop platforms [tor-browser-build]
+ * Windows
+ * Bug 41015: Enable std::filesystem on libc++ on Windows [tor-browser-build]
+ * Bug 41030: Add command to unsign .exe files and compare with sha256sums-unsigned-build.txt [tor-browser-build]
+ * macOS
+ * Bug 40990: Remove old macos signing scripts [tor-browser-build]
+ * Linux
+ * Bug 41046: Use the final path for Linux debug symbols [tor-browser-build]
+
Tor Browser 13.0.8 - December 20 2023
* Windows
* Bug 41053: All PT's crash instantly in 13.0.7 [tor-browser-build]
=====================================
projects/browser/allowed_addons.json
=====================================
@@ -17,7 +17,7 @@
"picture_url": "https://addons.mozilla.org/user-media/userpics/34/9734/13299734/13299734.pn…"
}
],
- "average_daily_users": 1111341,
+ "average_daily_users": 1132322,
"categories": {
"firefox": [
"web-development",
@@ -28,7 +28,7 @@
"contributions_url": "https://opencollective.com/darkreader?utm_content=product-page-contribute&u…",
"created": "2017-09-19T07:03:00Z",
"current_version": {
- "id": 5661222,
+ "id": 5672334,
"compatibility": {
"firefox": {
"min": "54.0",
@@ -39,7 +39,7 @@
"max": "*"
}
},
- "edit_url": "https://addons.mozilla.org/en-US/developers/addon/darkreader/versions/56612…",
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/darkreader/versions/56723…",
"is_strict_compatibility_enabled": false,
"license": {
"id": 22,
@@ -50,22 +50,22 @@
"url": "http://www.opensource.org/license/mit"
},
"release_notes": {
- "en-US": "- Improved subdomain handling in Site List.\n- Improved dark theme detection.\n- Fixed page crashes (Slack issue).\n- Fixed Site List migration.\n- Reduced image analysis memory usage.\n- Users' fixes for websites."
+ "en-US": "- Improved image analysis performance.\n- Improved dark theme detection.\n- Fixed 404 errors when loading images with relative paths.\n- v5 Preview: Moved settings into a separate page.\n- Users' fixes for websites."
},
- "reviewed": "2023-12-08T12:55:44Z",
- "version": "4.9.73",
+ "reviewed": "2024-01-08T08:34:10Z",
+ "version": "4.9.74",
"files": [
{
- "id": 4205543,
- "created": "2023-12-06T15:41:16Z",
- "hash": "sha256:7c399ff32561886bb80dad0cafaf8f629792b0b71ff1efcf12667e05a2b38f1a",
+ "id": 4216652,
+ "created": "2024-01-03T21:18:58Z",
+ "hash": "sha256:140a72b36750ba68a9da30d0f0df3ff192f58160b711b86c3d4f674e5be2bb2c",
"is_restart_required": false,
"is_webextension": true,
"is_mozilla_signed_extension": false,
"platform": "all",
- "size": 682962,
+ "size": 716574,
"status": "public",
- "url": "https://addons.mozilla.org/firefox/downloads/file/4205543/darkreader-4.9.73…",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/4216652/darkreader-4.9.74…",
"permissions": [
"alarms",
"contextMenus",
@@ -143,7 +143,7 @@
},
"is_disabled": false,
"is_experimental": false,
- "last_updated": "2023-12-08T12:55:44Z",
+ "last_updated": "2024-01-08T08:34:10Z",
"name": {
"ar": "Dark Reader",
"bn": "Dark Reader",
@@ -218,10 +218,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.5516,
- "bayesian_average": 4.550475504261017,
- "count": 5303,
- "text_count": 1667
+ "average": 4.5486,
+ "bayesian_average": 4.547482095849253,
+ "count": 5355,
+ "text_count": 1679
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/darkreader/reviews/",
"requires_payment": false,
@@ -318,7 +318,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/darkreader/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/darkreader/versions/",
- "weekly_downloads": 41426
+ "weekly_downloads": 26881
},
"notes": null
},
@@ -334,7 +334,7 @@
"picture_url": "https://addons.mozilla.org/user-media/userpics/56/7656/6937656/6937656.png?…"
}
],
- "average_daily_users": 264619,
+ "average_daily_users": 264469,
"categories": {
"firefox": [
"privacy-security"
@@ -547,10 +547,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.8036,
- "bayesian_average": 4.7989944298239395,
- "count": 1380,
- "text_count": 245
+ "average": 4.8027,
+ "bayesian_average": 4.798136425398132,
+ "count": 1399,
+ "text_count": 250
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/decentraleyes/reviews/",
"requires_payment": false,
@@ -635,7 +635,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/decentraleyes/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/decentraleyes/versions/",
- "weekly_downloads": 3583
+ "weekly_downloads": 4097
},
"notes": null
},
@@ -651,7 +651,7 @@
"picture_url": "https://addons.mozilla.org/user-media/userpics/73/4073/5474073/5474073.png?…"
}
],
- "average_daily_users": 1200452,
+ "average_daily_users": 1200897,
"categories": {
"firefox": [
"privacy-security"
@@ -1170,10 +1170,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.799,
- "bayesian_average": 4.79629496440493,
- "count": 2348,
- "text_count": 444
+ "average": 4.7958,
+ "bayesian_average": 4.793109511550156,
+ "count": 2370,
+ "text_count": 449
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/reviews/",
"requires_payment": false,
@@ -1197,7 +1197,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/versions/",
- "weekly_downloads": 24321
+ "weekly_downloads": 23541
},
"notes": null
},
@@ -1213,7 +1213,7 @@
"picture_url": null
}
],
- "average_daily_users": 7388167,
+ "average_daily_users": 7460988,
"categories": {
"firefox": [
"privacy-security"
@@ -1222,7 +1222,7 @@
"contributions_url": "",
"created": "2015-04-25T07:26:22Z",
"current_version": {
- "id": 5654508,
+ "id": 5672315,
"compatibility": {
"firefox": {
"min": "78.0",
@@ -1233,7 +1233,7 @@
"max": "*"
}
},
- "edit_url": "https://addons.mozilla.org/en-US/developers/addon/ublock-origin/versions/56…",
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/ublock-origin/versions/56…",
"is_strict_compatibility_enabled": false,
"license": {
"id": 6,
@@ -1244,23 +1244,24 @@
"url": "http://www.gnu.org/licenses/gpl-3.0.html"
},
"release_notes": {
- "en-US": "See complete release notes for <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/4c736806dc9702f9496c1c…" rel=\"nofollow\">1.54.0</a>.\n\n<b>Fixes / changes</b>\n\n<ul><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/30ee045a42c04a557ec92d…" rel=\"nofollow\">Enable path for native <code>has()</code> selector in Firefox</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/26aaa3263afd1e6e450a7f…" rel=\"nofollow\">Allow scriptlets to be injected in <code>about:blank</code></a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/5967388a2432967ee63e77…" rel=\"nofollow\">Fix faulty <code>as</code> vararg in <code>set-constant</code> scriptlet</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/b9a3ce2fd67895cc3fd06f…" rel=\"nofollow\">Add support to redirect to <code>noop.json</code></a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/1a7fcce826cb83449490e3…" rel=\"nofollow\">More improvements to the <code>google-ima</code> shim script</a> (by @kzar)</li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/56d921f7e251fb313a4be0…" rel=\"nofollow\">All exceptions filters are exempt from requiring a trusted source</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/b3b9c520dd7fef26a4f129…" rel=\"nofollow\">Add <code>trusted-set-session-storage-item</code> scriptlet</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/5f347a4a217555ac7ff920…" rel=\"nofollow\">Allow the use of quotes in <code>set-cookie</code> scriptlet </a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/fe9490248b43262e2613b2…" rel=\"nofollow\">Allow the use of quotes in <code>set-(local|session)-storage-item</code></a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/92d58a934e2392a346a587…" rel=\"nofollow\">Add ability to trigger cookie removal on specific events</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/23e952e408915752c90dc3…" rel=\"nofollow\">Ensure CSSTree does not hold a reference onto last parsed string</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/302676f334820cdfe567f7…" rel=\"nofollow\">Lower minimum Expires value to 4h</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/03ac48dee7ecbf33ac2dd4…" rel=\"nofollow\">Properly reset needle length in unserialized buffer</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/d4babab0e0c4b624992f8f…" rel=\"nofollow\">Add additional flags to regional lists</a> (by @DandelionSprout)</li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/a09bd04e017892dd0b0d12…" rel=\"nofollow\">Harden scriptlets which need to serialize function code into string</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/1a5be5c8aa0baa49879f92…" rel=\"nofollow\">Reset <code>g</code> regexes before use in <code>rmnt</code>/<code>rpnt</code> scriptlets</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/f2e3dd373c3a474ca27bad…" rel=\"nofollow\">Apply response filtering according to mime type</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/12cfcbade6a208e02352fd…" rel=\"nofollow\">Add t/f to set-cookie</a> (by @ryanbr)</li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/7856310df6fe39bff4e1b0…" rel=\"nofollow\">Have <code>urltransform=</code> use the same syntax as <code>replace=</code></a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/520b2f8c295d638b0c72f5…" rel=\"nofollow\">Implement network filter option <code>replace=</code></a></li><li>...</li></ul>\n<a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/3f4f5634b3bdd26c8e335f…" rel=\"nofollow\">Commits history since last version</a>"
+ "en-US": "See complete release notes for <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/514b85ddd154153a63fe9c…" rel=\"nofollow\">1.55.0</a>.\n\n<b>Fixes / changes</b>\n\n<ul><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/1e03af965f6b7a76aa94f6…" rel=\"nofollow\">Mind drop events in filter expression field of logger</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/e018352ca30c61b4a80c2a…" rel=\"nofollow\">Improve <code>xml-prune</code> scriptlet</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/ec6b213ac8c38077b676e1…" rel=\"nofollow\">Fix message entries overflowing in logger</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/a6311ada7aec5e36a802c2…" rel=\"nofollow\">Add support for <code>application/x-javascript</code> in <code>replace=</code> option</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8b0f4ac6d1a68a10f0736a…" rel=\"nofollow\">Extend support for differential updates to imported lists</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/5e2218ad38a67bad16b5a2…" rel=\"nofollow\">Add detection of mismatched <code>!#if</code>-<code>!#endif</code> in linter</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/d3d5708132bbca2b9b3232…" rel=\"nofollow\">Support links to update lists which are differential update-friendly</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/5da8dae3bfc5fd15895013…" rel=\"nofollow\">Remove \"Purge all caches\" button from \"Filter lists\" pane</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/f9bd0d08194525f2457cf5…" rel=\"nofollow\">Add support for <code>all</code> list token in updater-link feature</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/f266c7ca3a6228a20999be…" rel=\"nofollow\">Fix logging of broad exception filter <code>#@#+js()</code></a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/444dcf1f11a8dacef0553e…" rel=\"nofollow\">Improve <code>no-xhr-if</code> scriptlet</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/5f699ca11537ba17c330a8…" rel=\"nofollow\">Ensure cache storage backend is selected before access</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/983fbc3b50419c274040d9…" rel=\"nofollow\">Fix popup panel rendering when embedded in logger</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/2f972ff52f4edc3dc99084…" rel=\"nofollow\">Add visual hint in support information re. differential update</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/75541b4012443bd5602cc0…" rel=\"nofollow\">Remove obsolete web accessible resources</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8eb76fbc2577032e63698e…" rel=\"nofollow\">Rename <code>urltransform</code> to <code>uritransform</code></a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/43e266ca8d07228388c2a6…" rel=\"nofollow\">Vertically expand/collapse in steps in dom inspector</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/d1f0669c5cf9357a9528d8…" rel=\"nofollow\">Reset the DOM inspector when URL in top context changes</a></li><li><a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/d2f70a310ccc2ce2b2c97c…" rel=\"nofollow\">Support shadow-piercing combinator <code>>>></code> in <code>trusted-click-element</code></a></li><li>[...]</li></ul>\n<a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/7d13ab8046ad75d1230ea5…" rel=\"nofollow\">Commits history since last version</a>"
},
- "reviewed": "2023-11-27T08:08:01Z",
- "version": "1.54.0",
+ "reviewed": "2024-01-08T10:26:54Z",
+ "version": "1.55.0",
"files": [
{
- "id": 4198829,
- "created": "2023-11-22T16:24:35Z",
- "hash": "sha256:9797160908191710ff0858536ba6dc29ecad9923c30b2ad6d3e5e371d759e44d",
+ "id": 4216633,
+ "created": "2024-01-03T20:24:50Z",
+ "hash": "sha256:a02ca1d32737c3437f97553e5caaead6479a66ac1f8ff3b84a06cfa6bb0c7647",
"is_restart_required": false,
"is_webextension": true,
"is_mozilla_signed_extension": false,
"platform": "all",
- "size": 3630690,
+ "size": 3647341,
"status": "public",
- "url": "https://addons.mozilla.org/firefox/downloads/file/4198829/ublock_origin-1.5…",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/4216633/ublock_origin-1.5…",
"permissions": [
+ "alarms",
"dns",
"menus",
"privacy",
@@ -1378,7 +1379,7 @@
},
"is_disabled": false,
"is_experimental": false,
- "last_updated": "2023-12-14T22:05:25Z",
+ "last_updated": "2024-01-14T18:40:19Z",
"name": {
"ar": "uBlock Origin",
"bg": "uBlock Origin",
@@ -1523,10 +1524,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.7863,
- "bayesian_average": 4.7859243673114,
- "count": 16865,
- "text_count": 4397
+ "average": 4.7862,
+ "bayesian_average": 4.7858262322479135,
+ "count": 17029,
+ "text_count": 4446
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/reviews/",
"requires_payment": false,
@@ -1589,7 +1590,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/versions/",
- "weekly_downloads": 205700
+ "weekly_downloads": 195010
},
"notes": null
},
@@ -1605,7 +1606,7 @@
"picture_url": null
}
],
- "average_daily_users": 175062,
+ "average_daily_users": 177316,
"categories": {
"firefox": [
"photos-music-videos",
@@ -1701,10 +1702,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.4845,
- "bayesian_average": 4.479449733868465,
- "count": 1158,
- "text_count": 434
+ "average": 4.4774,
+ "bayesian_average": 4.472406681309426,
+ "count": 1175,
+ "text_count": 443
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/video-background-play-fix/re…",
"requires_payment": false,
@@ -1726,7 +1727,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/video-background-play-fix/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/video-background-play-fix/ve…",
- "weekly_downloads": 374
+ "weekly_downloads": 428
},
"notes": null
},
@@ -1742,7 +1743,7 @@
"picture_url": null
}
],
- "average_daily_users": 86192,
+ "average_daily_users": 81759,
"categories": {
"firefox": [
"privacy-security",
@@ -1852,10 +1853,10 @@
],
"promoted": null,
"ratings": {
- "average": 4.3766,
- "bayesian_average": 4.362648333186986,
- "count": 401,
- "text_count": 112
+ "average": 4.3802,
+ "bayesian_average": 4.366169675126323,
+ "count": 405,
+ "text_count": 113
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-possum/reviews/",
"requires_payment": false,
@@ -1877,7 +1878,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-possum/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-possum/versions/",
- "weekly_downloads": 1054
+ "weekly_downloads": 1270
},
"notes": null
},
@@ -1893,7 +1894,7 @@
"picture_url": "https://addons.mozilla.org/user-media/userpics/64/9064/12929064/12929064.pn…"
}
],
- "average_daily_users": 288741,
+ "average_daily_users": 294389,
"categories": {
"firefox": [
"search-tools",
@@ -1904,7 +1905,7 @@
"contributions_url": "https://www.paypal.com/donate?hosted_button_id=GLL4UNSNU6SQN&utm_content=pr…",
"created": "2017-06-17T15:23:33Z",
"current_version": {
- "id": 5645237,
+ "id": 5665608,
"compatibility": {
"firefox": {
"min": "115.0",
@@ -1915,7 +1916,7 @@
"max": "*"
}
},
- "edit_url": "https://addons.mozilla.org/en-US/developers/addon/search_by_image/versions/…",
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/search_by_image/versions/…",
"is_strict_compatibility_enabled": false,
"license": {
"id": 6,
@@ -1928,20 +1929,20 @@
"release_notes": {
"en-US": "Learn more about this release from the <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/d50855f24f77fa6f2614b9…" rel=\"nofollow\">changelog</a>."
},
- "reviewed": "2023-11-07T07:33:21Z",
- "version": "6.1.0",
+ "reviewed": "2023-12-19T14:03:13Z",
+ "version": "6.1.1",
"files": [
{
- "id": 4189577,
- "created": "2023-11-02T18:15:34Z",
- "hash": "sha256:1de51c7522b8bf3aca5c2bc4fbd94f5fb092d4418ea8fe4583c8dff2b71b4209",
+ "id": 4209928,
+ "created": "2023-12-17T01:28:51Z",
+ "hash": "sha256:254d78084e332190a2b6ccb1959a42257bdc287addc0685419fcde7df1a52e76",
"is_restart_required": false,
"is_webextension": true,
"is_mozilla_signed_extension": false,
"platform": "all",
- "size": 1156452,
+ "size": 1165289,
"status": "public",
- "url": "https://addons.mozilla.org/firefox/downloads/file/4189577/search_by_image-6…",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/4209928/search_by_image-6…",
"permissions": [
"alarms",
"contextMenus",
@@ -1984,7 +1985,7 @@
},
"is_disabled": false,
"is_experimental": false,
- "last_updated": "2023-11-07T07:33:21Z",
+ "last_updated": "2023-12-19T14:03:13Z",
"name": {
"en-US": "Search by Image"
},
@@ -2110,10 +2111,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.65,
- "bayesian_average": 4.645504940520216,
- "count": 1360,
- "text_count": 265
+ "average": 4.6435,
+ "bayesian_average": 4.6390566621044025,
+ "count": 1380,
+ "text_count": 266
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/search_by_image/reviews/",
"requires_payment": false,
@@ -2134,7 +2135,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/search_by_image/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/search_by_image/versions/",
- "weekly_downloads": 6343
+ "weekly_downloads": 6351
},
"notes": null
},
@@ -2157,7 +2158,7 @@
"picture_url": null
}
],
- "average_daily_users": 118713,
+ "average_daily_users": 123429,
"categories": {
"firefox": [
"search-tools",
@@ -2438,10 +2439,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.3699,
- "bayesian_average": 4.36549570183314,
- "count": 1287,
- "text_count": 364
+ "average": 4.3747,
+ "bayesian_average": 4.370328322743152,
+ "count": 1305,
+ "text_count": 369
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/google-search-fixer/reviews/",
"requires_payment": false,
@@ -2461,7 +2462,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/google-search-fixer/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/google-search-fixer/versions/",
- "weekly_downloads": 81
+ "weekly_downloads": 58
},
"notes": null
},
@@ -2477,7 +2478,7 @@
"picture_url": "https://addons.mozilla.org/user-media/userpics/43/0143/143/143.png?modified…"
}
],
- "average_daily_users": 313680,
+ "average_daily_users": 311129,
"categories": {
"firefox": [
"web-development",
@@ -2664,10 +2665,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.3984,
- "bayesian_average": 4.395742595786679,
- "count": 2151,
- "text_count": 830
+ "average": 4.397,
+ "bayesian_average": 4.394353096936605,
+ "count": 2166,
+ "text_count": 835
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/noscript/reviews/",
"requires_payment": false,
@@ -2711,7 +2712,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/noscript/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/noscript/versions/",
- "weekly_downloads": 8167
+ "weekly_downloads": 7835
},
"notes": null
},
@@ -2727,7 +2728,7 @@
"picture_url": null
}
],
- "average_daily_users": 158779,
+ "average_daily_users": 161130,
"categories": {
"firefox": [
"photos-music-videos",
@@ -2836,10 +2837,10 @@
"category": "recommended"
},
"ratings": {
- "average": 3.8682,
- "bayesian_average": 3.864132502143421,
- "count": 1199,
- "text_count": 434
+ "average": 3.8698,
+ "bayesian_average": 3.865733920025514,
+ "count": 1206,
+ "text_count": 437
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/youtube-high-definition/revi…",
"requires_payment": false,
@@ -2858,7 +2859,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/youtube-high-definition/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/youtube-high-definition/vers…",
- "weekly_downloads": 2542
+ "weekly_downloads": 3356
},
"notes": null
}
=====================================
projects/browser/config
=====================================
@@ -93,9 +93,9 @@ input_files:
- URL: https://addons.mozilla.org/firefox/downloads/file/4206186/noscript-11.4.29.…
name: noscript
sha256sum: 05b98840b05ef2acbac333543e4b7c3d40fee2ce5fb4e29260b05e2ff6fe24cd
- - URL: https://addons.mozilla.org/firefox/downloads/file/4198829/ublock_origin-1.5…
+ - URL: https://addons.mozilla.org/firefox/downloads/file/4216633/ublock_origin-1.5…
name: ublock-origin
- sha256sum: 9797160908191710ff0858536ba6dc29ecad9923c30b2ad6d3e5e371d759e44d
+ sha256sum: a02ca1d32737c3437f97553e5caaead6479a66ac1f8ff3b84a06cfa6bb0c7647
enable: '[% c("var/mullvad-browser") %]'
- URL: https://cdn.mullvad.net/browser-extension/0.8.4/mullvad-browser-extension-0…
name: mullvad-extension
=====================================
projects/firefox-android/config
=====================================
@@ -16,7 +16,7 @@ container:
var:
fenix_version: 115.2.1
browser_branch: 13.0-1
- browser_build: 11
+ browser_build: 12
variant: Beta
# This should be updated when the list of gradle dependencies is changed.
gradle_dependencies_version: 1
=====================================
projects/firefox/config
=====================================
@@ -14,11 +14,11 @@ container:
use_container: 1
var:
- firefox_platform_version: 115.6.0
+ firefox_platform_version: 115.7.0
firefox_version: '[% c("var/firefox_platform_version") %]esr'
browser_series: '13.0'
browser_branch: '[% c("var/browser_series") %]-1'
- browser_build: 2
+ browser_build: 1
branding_directory_prefix: 'tb'
copyright_year: '[% exec("git show -s --format=%ci").remove("-.*") %]'
nightly_updates_publish_dir: '[% c("var/nightly_updates_publish_dir_prefix") %]nightly-[% c("var/osname") %]'
=====================================
projects/geckoview/config
=====================================
@@ -14,9 +14,9 @@ container:
use_container: 1
var:
- geckoview_version: 115.6.0esr
+ geckoview_version: 115.7.0esr
browser_branch: 13.0-1
- browser_build: 2
+ browser_build: 1
copyright_year: '[% exec("git show -s --format=%ci").remove("-.*") %]'
gitlab_project: https://gitlab.torproject.org/tpo/applications/tor-browser
git_commit: '[% exec("git rev-parse HEAD") %]'
=====================================
projects/go/config
=====================================
@@ -1,5 +1,5 @@
# vim: filetype=yaml sw=2
-version: '[% IF c("var/use_go_1_20") %]1.20.12[% ELSE %]1.21.5[% END %]'
+version: '[% IF c("var/use_go_1_20") %]1.20.13[% ELSE %]1.21.6[% END %]'
filename: '[% project %]-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]'
container:
use_container: 1
@@ -121,11 +121,11 @@ input_files:
enable: '[% ! c("var/linux") %]'
- URL: 'https://go.dev/dl/go[% c("version") %].src.tar.gz'
name: go
- sha256sum: 285cbbdf4b6e6e62ed58f370f3f6d8c30825d6e56c5853c66d3c23bcdb09db19
+ sha256sum: 124926a62e45f78daabbaedb9c011d97633186a33c238ffc1e25320c02046248
enable: '[% !c("var/use_go_1_20") %]'
- URL: 'https://go.dev/dl/go[% c("version") %].src.tar.gz'
name: go
- sha256sum: c5bf934751d31c315c1d0bb5fb02296545fa6d08923566f7a5afec81f2ed27d6
+ sha256sum: 0fe745c530f2f1d67193af3c5ea25246be077989ec5178df266e975f3532449e
enable: '[% c("var/use_go_1_20") %]'
- project: go-bootstrap
name: go-bootstrap
=====================================
projects/translation/config
=====================================
@@ -12,13 +12,13 @@ compress_tar: 'gz'
steps:
base-browser:
base-browser: '[% INCLUDE build %]'
- git_hash: 5490489a8d356a44d792300b4dfddba792d10f2e
+ git_hash: cbd9b6c415ec2edb99237ef67ccd4f033a7b9c2a
targets:
nightly:
git_hash: 'base-browser'
tor-browser:
tor-browser: '[% INCLUDE build %]'
- git_hash: 273592eca488ca3bf535d3789b1130fd1970f09a
+ git_hash: 767ab5111f065b82151275775af5ecf7a529ef48
targets:
nightly:
git_hash: 'tor-browser'
@@ -32,7 +32,7 @@ steps:
fenix: '[% INCLUDE build %]'
# We need to bump the commit before releasing but just pointing to a branch
# might cause too much rebuidling of the Firefox part.
- git_hash: 2fbc645d4efb7ccb2de92394d59e99a32ecfa3ba
+ git_hash: 8eab0d483cdba2a9628f8b534c802bbc910171d4
compress_tar: 'zst'
targets:
nightly:
=====================================
rbm.conf
=====================================
@@ -81,12 +81,13 @@ buildconf:
git_signtag_opt: '-s'
var:
- torbrowser_version: '13.0.8'
+ torbrowser_version: '13.0.9'
torbrowser_build: 'build1'
torbrowser_incremental_from:
+ - '[% IF c("var/tor-browser") %]13.0.8[% END %]'
- '13.0.7'
- '13.0.6'
- - '13.0.[% IF c("var/tor-browser") %]5[% ELSE %]4[% END %]'
+ - '[% IF c("var/mullvad-browser") %]13.0.4[% END %]'
updater_enabled: 1
build_mar: 1
mar_channel_id: '[% c("var/projectname") %]-torproject-[% c("var/channel") %]'
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/8…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/8…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser][mullvad-browser-115.7.0esr-13.5-1] 101 commits: Bug 1819160 - Map Android ids to doc/accessible id pairs. r=Jamie
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed to branch mullvad-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser
Commits:
dc27077f by Eitan Isaacson at 2024-01-15T18:24:38+01:00
Bug 1819160 - Map Android ids to doc/accessible id pairs. r=Jamie
Differential Revision: https://phabricator.services.mozilla.com/D179737
- - - - -
9c94ccb6 by Pier Angelo Vendrame at 2024-01-15T18:24:39+01:00
Bug 1832523 - Allow using NSS to sign and verify MAR signatures. r=application-update-reviewers,glandium,bytesized
Allow using NSS for checking MAR signatures also in platforms where
OS-native APIs are used by default, i.e., macOS and Windows.
Differential Revision: https://phabricator.services.mozilla.com/D177743
- - - - -
6739f4ed by Pier Angelo Vendrame at 2024-01-15T18:24:40+01:00
Bug 1849129: Prevent exceptions caused by extensions from interrupting the SearchService initialization. r=search-reviewers,Standard8
Differential Revision: https://phabricator.services.mozilla.com/D186456
- - - - -
7dfe1f10 by Emilio Cobos Álvarez at 2024-01-15T18:24:40+01:00
Bug 1853731 - Use html:img for message-bar-icon. r=Gijs,dao,settings-reviewers,desktop-theme-reviewers,sfoster
Differential Revision: https://phabricator.services.mozilla.com/D188521
- - - - -
e99cf66e by Pier Angelo Vendrame at 2024-01-15T18:24:41+01:00
Bug 1854117 - Sort the DLL blocklist flags. r=mossop,win-reviewers,gstoll
Differential Revision: https://phabricator.services.mozilla.com/D188716
- - - - -
87492bc5 by Eden Chuang at 2024-01-15T18:24:41+01:00
Bug 1738426 - Ignoring status 206 and vary header checking for opaque response in Cache API. r=asuth
Differential Revision: https://phabricator.services.mozilla.com/D186431
- - - - -
0221332a by edgul at 2024-01-15T18:24:42+01:00
Bug 1802057 - Block the following characters from use in the cookie name in the cookie string: 0x3B (semi-colon), 0x3D (equals), and 0x7F (del) r=dveditz,cookie-reviewers
Differential Revision: https://phabricator.services.mozilla.com/D182373
- - - - -
71bca736 by Kelsey Gilbert at 2024-01-15T18:24:42+01:00
Bug 1819497 - Don't race on static bool for initialization. r=gfx-reviewers,aosmond
We could do non-racy static init here (e.g. with a static initializer
self-calling-closure), but there doesn't seem to be a strong reason for
this. Let's just use a switch and get robustness from -Werror=switch.
Differential Revision: https://phabricator.services.mozilla.com/D188054
- - - - -
6b80d5b5 by Mark Banner at 2024-01-15T18:24:43+01:00
Bug 1845752. r=ckerschb
Differential Revision: https://phabricator.services.mozilla.com/D186676
- - - - -
ab369a84 by Pier Angelo Vendrame at 2024-01-15T18:24:43+01:00
Bug 1849186 - Add a preference not to expose the content title in the window title. r=Gijs,tabbrowser-reviewers,dao
Differential Revision: https://phabricator.services.mozilla.com/D190496
- - - - -
8b3be202 by Bob Owen at 2024-01-15T18:24:44+01:00
Bug 1850072: Initialize RecordedDrawTargetCreation::mHasExistingData. r=jrmuizel
This also specializes ElementStreamFormat for bool.
Differential Revision: https://phabricator.services.mozilla.com/D187794
- - - - -
428e7b54 by Malte Juergens at 2024-01-15T18:24:44+01:00
Bug 1850200 - Add delay to HTTPS-Only "Continue to HTTPS Site" button r=freddyb
Differential Revision: https://phabricator.services.mozilla.com/D187887
- - - - -
7f20a8c0 by Andreas Pehrson at 2024-01-15T18:24:45+01:00
Bug 1851803 - Introduce SourceMediaTrack::mDirectDisabledMode. r=karlt
Similar to MediaTrack::mDisabledMode, but this is for uses on the
SourceMediaTrack producer thread. It is still signaled via a control message
from the control thread to maintain order of operations, and is protected by the
SourceMediaTrack mutex.
Differential Revision: https://phabricator.services.mozilla.com/D187554
- - - - -
50100cc8 by Pier Angelo Vendrame at 2024-01-15T18:24:45+01:00
Bug 1860020 - Remove the assertion on the value of toolkit.telemetry.enabled. r=KrisWright,chutten
Bug 1444275 introduced an assertion on the parent process to check that
the value of toolkit.telemetry.enabled is the expected one.
However, this expected value could be different from the one set and
locked e.g. in some forks. Therefore, the assertion prevented debug
builds from working in these cases.
Differential Revision: https://phabricator.services.mozilla.com/D195080
- - - - -
31018d1b by Kagami Sascha Rosylight at 2024-01-15T18:24:46+01:00
Bug 1865238 - Use One UI Sans KR VF for Korean sans-serif font on Android r=jfkthame
Per /etc/fonts.xml, there are now only two `<family lang="ko">` nodes there:
* OneUISansKRVF series
* SECCJK series (but no KR postfix anymore?)
This patch uses One UI Sans KR VF as the replacement as this is newer and is a variable font (tested with https://codepen.io/SaschaNaz/pen/ExrdYXJ)
Differential Revision: https://phabricator.services.mozilla.com/D195078
- - - - -
b5b6d436 by Tom Ritter at 2024-01-15T18:24:57+01:00
Bug 1873526: Refactor the restriction override list from a big if statement to a list r=KrisWright
Differential Revision: https://phabricator.services.mozilla.com/D198081
- - - - -
965577ea by Henry Wilkes at 2024-01-15T18:25:40+01:00
Bug 41454: Move focus after calling openPreferences for a sub-category.
Temporary fix until mozilla bug 1799153 gets a patch upstream.
- - - - -
d2feaf69 by hackademix at 2024-01-15T18:25:41+01:00
Bug 42194: Fix blank net error page on failed DNS resolution with active proxy.
- - - - -
f5e4d72b by Henry Wilkes at 2024-01-15T18:25:42+01:00
Bug 41483: Remove the firefox override for appstrings.properties
Remove this patch after upstream bugzilla bug 1790187
- - - - -
25e023ad by Pier Angelo Vendrame at 2024-01-15T18:25:42+01:00
Bug 41116: Normalize system fonts.
System fonts are an enormous fingerprinting vector.
Even with font allow lists and with our custom configuration on Linux,
which counter metrics measurements, getComputedStyle leaks several
details.
This patch counters both these kinds of attacks.
- - - - -
cb7998a4 by Marco Simonelli at 2024-01-15T18:25:43+01:00
Bug 41459: WebRTC fails to build under mingw (Part 1)
- properly define NOMINMAX for just MSVC builds
- - - - -
aca4ae38 by Marco Simonelli at 2024-01-15T18:25:43+01:00
Bug 41459: WebRTC fails to build under mingw (Part 2)
- fixes required to build third_party/libwebrtc
- - - - -
1fb3755a by Marco Simonelli at 2024-01-15T18:25:44+01:00
Bug 41459: WebRTC fails to build under mingw (Part 3)
- fixes required to build third_party/sipcc
- - - - -
23a327f2 by Marco Simonelli at 2024-01-15T18:25:44+01:00
Bug 41459: WebRTC fails to build under mingw (Part 4)
- fixes requried to build netwerk/sctp
- - - - -
adb3f4bb by Marco Simonelli at 2024-01-15T18:25:44+01:00
Bug 41459: WebRTC fails to build under mingw (Part 5)
- fixes required to build dom/media/webrtc
- - - - -
5836b6b8 by Marco Simonelli at 2024-01-15T18:25:45+01:00
Bug 41459: WebRTC fails to build under mingw (Part 6)
- fixes required to build dom/media/systemservices
- - - - -
8b8b900d by hackademix at 2024-01-15T18:25:45+01:00
Bug 41854: Allow overriding download spam protection.
- - - - -
954fb272 by Gaba at 2024-01-15T18:27:27+01:00
Adding issue and merge request templates
- - - - -
b197d888 by Pier Angelo Vendrame at 2024-01-15T18:27:28+01:00
Base Browser's .mozconfigs.
Bug 17858: Cannot create incremental MARs for hardened builds.
Define HOST_CFLAGS, etc. to avoid compiling programs such as mbsdiff
(which is part of mar-tools and is not distributed to end-users) with
ASan.
Bug 21849: Don't allow SSL key logging.
Bug 25741 - TBA: Disable features at compile-time
Define MOZ_ANDROID_NETWORK_STATE and MOZ_ANDROID_LOCATION
Bug 27623 - Export MOZILLA_OFFICIAL during desktop builds
This fixes a problem where some preferences had the wrong default value.
Also see bug 27472 where we made a similar fix for Android.
Bug 29859: Disable HLS support for now
Bug 30463: Explicitly disable MOZ_TELEMETRY_REPORTING
Bug 32493: Disable MOZ_SERVICES_HEALTHREPORT
Bug 33734: Set MOZ_NORMANDY to False
Bug 33851: Omit Parental Controls.
Bug 40252: Add --enable-rust-simd to our tor-browser mozconfig files
Bug 41584: Move some configuration options to base-browser level
- - - - -
908ffb5d by Pier Angelo Vendrame at 2024-01-15T18:42:38+01:00
fixup! Base Browser's .mozconfigs.
Bug 42337: Enable GeckoDriver for all desktop platforms
- - - - -
d1ddf52b by Pier Angelo Vendrame at 2024-01-15T18:42:40+01:00
fixup! Base Browser's .mozconfigs.
Bug 42146: Use LLD on Linux.
This should allow us to restore debug symbols on Linux i686.
- - - - -
f473cb50 by Pier Angelo Vendrame at 2024-01-15T18:42:40+01:00
Tweaks to the build system
Bug 40857: Modified the fat .aar creation file
This is a workaround to build fat .aars with the compiling enviornment
disabled.
Mozilla does not use a similar configuration, but either runs a Firefox
build and discards its output, or uses artifacts build.
We might switch to artifact builds too, and drop this patch, or write a
better one to upstream. But until then we need this patch.
See also https://bugzilla.mozilla.org/show_bug.cgi?id=1763770.
Bug 41458: Prevent `mach package-multi-locale` from actually creating a package
macOS builds need some files to be moved around with
./mach package-multi-locale to create multi-locale packages.
The required command isn't exposed through any other mach command.
So, we patch package-multi-locale both to prevent it from failing when
doing official builds and to detect any future changes on it.
- - - - -
2d34dea1 by Pier Angelo Vendrame at 2024-01-15T18:42:40+01:00
Bug 41108: Remove privileged macOS installation from 102
- - - - -
3b772262 by Dan Ballard at 2024-01-15T18:42:41+01:00
Bug 41149: Re-enable DLL injection protection in all builds not just nightlies
- - - - -
e5635e74 by Matthew Finkel at 2024-01-15T18:42:41+01:00
Bug 24796: Comment out excess permissions from GeckoView
The GeckoView AndroidManifest.xml is not preprocessed unlike Fennec's
manifest, so we can't use the ifdef preprocessor guards around the
permissions we do not want. Commenting the permissions is the
next-best-thing.
- - - - -
1d581684 by Matthew Finkel at 2024-01-15T18:42:41+01:00
Bug 28125: Prevent non-Necko network connections
- - - - -
342c65b3 by Mike Perry at 2024-01-15T18:42:42+01:00
Bug 12974: Disable NTLM and Negotiate HTTP Auth
The Mozilla bugs: https://bugzilla.mozilla.org/show_bug.cgi?id=1046421,
https://bugzilla.mozilla.org/show_bug.cgi?id=1261591, tor-browser#27602
- - - - -
b0bd0532 by Alex Catarineu at 2024-01-15T18:42:42+01:00
Bug 40166: Disable security.certerrors.mitm.auto_enable_enterprise_roots
Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1768899
- - - - -
aa45056d by Georg Koppen at 2024-01-15T18:42:42+01:00
Bug 16285: Exclude ClearKey system for now
In the past the ClearKey system had not been compiled when specifying
--disable-eme. But that changed and it is even bundled nowadays (see:
Mozilla's bug 1300654). We don't want to ship it right now as the use
case for it is not really visible while the code had security
vulnerabilities in the past.
- - - - -
7bc58484 by Kathy Brade at 2024-01-15T18:42:43+01:00
Bug 21431: Clean-up system extensions shipped in Firefox
Only ship the pdfjs extension.
- - - - -
25da3cca by Kathy Brade at 2024-01-15T18:42:43+01:00
Bug 33852: Clean up about:logins (LockWise) to avoid mentioning sync, etc.
Hide elements on about:logins that mention sync, "Firefox LockWise", and
Mozilla's LockWise mobile apps.
Disable the "Create New Login" button when security.nocertdb is true.
- - - - -
c6aad3d2 by Alex Catarineu at 2024-01-15T18:42:43+01:00
Bug 41457: Remove Mozilla permissions
Bug 40025: Remove Mozilla add-on install permissions
- - - - -
bdfccba2 by Kathy Brade at 2024-01-15T18:42:44+01:00
Bug 40002: Remove about:ion
Firefox Ion (previously Firefox Pioneer) is an opt-in program in which people
volunteer to participate in studies that collect detailed, sensitive data about
how they use their browser.
Bug 41662: Disable about:sync-logs
Even though we disable sync by default with
`identity.fxaccounts.enabled`, this about: page is still avilable.
We could throw an exception on the constructor of the related
component, but it would result only in an error in the console, without
a visible "this address does not look right" error page.
If we fix the issues with MOZ_SERVICES_SYNC, we can restore the
component.
- - - - -
b485e748 by Arthur Edelstein at 2024-01-15T18:42:44+01:00
Bug 26353: Prevent speculative connect that violated FPI.
Connections were observed in the catch-all circuit when
the user entered an https or http URL in the URL bar, or
typed a search term.
- - - - -
f60d239a by Alex Catarineu at 2024-01-15T18:42:44+01:00
Bug 31740: Remove some unnecessary RemoteSettings instances
More concretely, SearchService.jsm 'hijack-blocklists' and
url-classifier-skip-urls.
Avoid creating instance for 'anti-tracking-url-decoration'.
If prefs are disabling their usage, avoid creating instances for
'cert-revocations' and 'intermediates'.
Do not ship JSON dumps for collections we do not expect to need. For
the ones in the 'main' bucket, this prevents them from being synced
unnecessarily (the code in remote-settings does so for collections
in the main bucket for which a dump or local data exists). For the
collections in the other buckets, we just save some size by not
shipping their dumps.
We also clear the collections database on the v2 -> v3 migration.
- - - - -
740d6463 by cypherpunks1 at 2024-01-15T18:42:45+01:00
Bug 41092: Add a RemoteSettings JSON dump for query-stripping
- - - - -
4ba5cb9a by Pier Angelo Vendrame at 2024-01-15T18:42:45+01:00
Bug 41635: Disable the Normandy component
Do not include Normandy at all whenever MOZ_NORMANDY is False.
- - - - -
f659d493 by Georg Koppen at 2024-01-15T18:42:45+01:00
Bug 30541: Disable WebGL readPixel() for web content
Related Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1428034
- - - - -
777ac5bc by Alex Catarineu at 2024-01-15T18:42:46+01:00
Bug 28369: Stop shipping pingsender executable
- - - - -
073dee20 by cypherpunks1 at 2024-01-15T18:42:46+01:00
Bug 41568: Disable LaterRun
- - - - -
f1048f07 by cypherpunks1 at 2024-01-15T18:42:46+01:00
Bug 40717: Hide Windows SSO in settings
- - - - -
6bc20ba1 by Pier Angelo Vendrame at 2024-01-15T18:42:47+01:00
Bug 41599: Always return an empty string as network ID
Firefox computes an internal network ID used to detect network changes
and act consequently (e.g., to improve WebSocket UX).
However, there are a few ways to get this internal network ID, so we
patch them out, to be sure any new code will not be able to use them and
possibly link users.
We also sent a patch to Mozilla to seed the internal network ID, to
prevent any accidental leak in the future.
Upstream: https://bugzilla.mozilla.org/show_bug.cgi?id=1817756
- - - - -
679f44da by cypherpunks1 at 2024-01-15T18:42:47+01:00
Bug 40175: Add origin attributes to about:reader top-level requests
- - - - -
f44a0bbc by Richard Pospesel at 2024-01-15T18:42:47+01:00
Bug 41327: Disable UrlbarProviderInterventions
- - - - -
58cbfed6 by Richard Pospesel at 2024-01-15T18:42:48+01:00
Bug 42037: Disable about:firefoxview page
- - - - -
57b2f41b by Mike Perry at 2024-01-15T18:42:48+01:00
Firefox preference overrides.
This hack directly includes our preference changes in omni.ja.
Bug 18292: Staged updates fail on Windows
Temporarily disable staged updates on Windows.
Bug 18297: Use separate Noto JP,KR,SC,TC fonts
Bug 23404: Add Noto Sans Buginese to the macOS whitelist
Bug 23745: Set dom.indexedDB.enabled = true
Bug 13575: Disable randomised Firefox HTTP cache decay user tests.
(Fernando Fernandez Mancera <ffmancera(a)riseup.net>)
Bug 17252: Enable session identifiers with FPI
Session tickets and session identifiers were isolated
by OriginAttributes, so we can re-enable them by
allowing the default value (true) of
"security.ssl.disable_session_identifiers".
The pref "security.enable_tls_session_tickets" is obsolete
(removed in https://bugzilla.mozilla.org/917049)
Bug 14952: Enable http/2 and AltSvc
In Firefox, SPDY/HTTP2 now uses Origin Attributes for
isolation of connections, push streams, origin frames, etc.
That means we get first-party isolation provided
"privacy.firstparty.isolate" is true. So in this patch, we
stop overriding "network.http.spdy.enabled" and
"network.http.spdy.enabled.http2".
Alternate Services also use Origin Attributes for isolation.
So we stop overriding
"network.http.altsvc.enabled" and "network.http.altsvc.oe"
as well.
(All 4 of the abovementioned "network.http.*" prefs adopt
Firefox 60ESR's default value of true.)
However, we want to disable HTTP/2 push for now, so we
set "network.http.spdy.allow-push" to false.
"network.http.spdy.enabled.http2draft" was removed in Bug 1132357.
"network.http.sped.enabled.v2" was removed in Bug 912550.
"network.http.sped.enabled.v3" was removed in Bug 1097944.
"network.http.sped.enabled.v3-1" was removed in Bug 1248197.
Bug 26114: addons.mozilla.org is not special
* Don't expose navigator.mozAddonManager on any site
* Don't block NoScript from modifying addons.mozilla.org or other sites
Enable ReaderView mode again (#27281).
Bug 29916: Make sure enterprise policies are disabled
Bug 2874: Block Components.interfaces from content
Bug 26146: Spoof HTTP User-Agent header for desktop platforms
In Tor Browser 8.0, the OS was revealed in both the HTTP User-Agent
header and to JavaScript code via navigator.userAgent. To avoid
leaking the OS inside each HTTP request (which many web servers
log), always use the Windows 7 OS value in the desktop User-Agent
header. We continue to allow access to the actual OS via JavaScript,
since doing so improves compatibility with web applications such
as GitHub and Google Docs.
Bug 12885: Windows Jump Lists fail for Tor Browser
Jumplist entries are stored in a binary file in:
%APPDATA%\\Microsoft\Windows\Recent\CustomDestinations\
and has a name in the form
[a-f0-9]+.customDestinations-ms
The hex at the front is unique per app, and is ultimately derived from
something called the 'App User Model ID' (AUMID) via some unknown
hashing method. The AUMID is provided as a key when programmatically
creating, updating, and deleting a jumplist. The default behaviour in
firefox is for the installer to define an AUMID for an app, and save it
in the registry so that the jumplist data can be removed by the
uninstaller.
However, the Tor Browser does not set this (or any other) regkey during
installation, so this codepath fails and the app's AUMID is left
undefined. As a result the app's AUMID ends up being defined by
windows, but unknowable by Tor Browser. This unknown AUMID is used to
create and modify the jumplist, but the delete API requires that we
provide the app's AUMID explicitly. Since we don't know what the AUMID
is (since the expected regkey where it is normally stored does not
exist) jumplist deletion will fail and we will leave behind a mostly
empty customDestinations-ms file. The name of the file is derived from
the binary path, so an enterprising person could reverse engineer how
that hex name is calculated, and generate the name for Tor Browser's
default Desktop installation path to determine whether a person had
used Tor Browser in the past.
The 'taskbar.grouping.useprofile' option that is enabled by this patch
works around this AUMID problem by having firefox.exe create it's own
AUMID based on the profile path (rather than looking for a regkey). This
way, if a user goes in and enables and disables jumplist entries, the
backing store is properly deleted.
Unfortunately, all windows users currently have this file lurking in
the above mentioned directory and this patch will not remove it since it
was created with an unknown AUMID. However, another patch could be
written which goes to that directory and deletes any item containing the
'Tor Browser' string. See bug 28996.
Bug 30845: Make sure default themes and other internal extensions are enabled
Bug 28896: Enable extensions in private browsing by default
Bug 31065: Explicitly allow proxying localhost
Bug 31598: Enable letterboxing
Disable Presentation API everywhere
Bug 21549 - Use Firefox's WASM default pref. It is disabled at safer
security levels.
Bug 32321: Disable Mozilla's MitM pings
Bug 19890: Disable installation of system addons
By setting the URL to "" we make sure that already installed system
addons get deleted as well.
Bug 22548: Firefox downgrades VP9 videos to VP8.
On systems where H.264 is not available or no HWA, VP9 is preferred. But in Tor
Browser 7.0 all youtube videos are degraded to VP8.
This behaviour can be turned off by setting media.benchmark.vp9.threshold to 0.
All clients will get better experience and lower traffic, beause TBB doesn't
use "Use hardware acceleration when available".
Bug 25741 - TBA: Add mobile-override of 000-tor-browser prefs
Bug 16441: Suppress "Reset Tor Browser" prompt.
Bug 29120: Use the in-memory media cache and increase its maximum size.
Bug 33697: use old search config based on list.json
Bug 33855: Ensure that site-specific browser mode is disabled.
Bug 30682: Disable Intermediate CA Preloading.
Bug 40061: Omit the Windows default browser agent from the build
Bug 40322: Consider disabling network.connectivity-service.enabled
Bug 40408: Disallow SVG Context Paint in all web content
Bug 40308: Disable network partitioning until we evaluate dFPI
Bug 40322: Consider disabling network.connectivity-service.enabled
Bug 40383: Disable dom.enable_event_timing
Bug 40423: Disable http/3
Bug 40177: Update prefs for Fx91esr
Bug 40700: Disable addons and features recommendations
Bug 40682: Disable network.proxy.allow_bypass
Bug 40736: Disable third-party cookies in PBM
Bug 19850: Enabled HTTPS-Only by default
Bug 40912: Hide the screenshot menu
Bug 41292: Disable moreFromMozilla in preferences page
Bug 40057: Ensure the CSS4 system colors are not a fingerprinting vector
Bug 24686: Set network.http.tailing.enabled to true
Bug 40183: Disable TLS ciphersuites using SHA-1
Bug 40783: Review 000-tor-browser.js and 001-base-profile.js for 102
We reviewed all the preferences we set for 102, and remove a few old
ones. See the description of that issue to see all the preferences we
believed were still valid for 102, and some brief description for the
reasons to keep them.
- - - - -
495160f1 by Richard Pospesel at 2024-01-15T18:42:48+01:00
Bug 41659: Add canonical color definitions to base-browser
- - - - -
88cfa4ac by Pier Angelo Vendrame at 2024-01-15T18:42:49+01:00
Bug 41043: Hardcode the UI font on Linux
The mechanism to choose the UI font does not play well with our
fontconfig configuration. As a result, the final criterion to choose
the font for the UI was its version.
Since we hardcode Arimo as a default sans-serif on preferences, we use
it also for the UI. FontConfig will fall back to some other font for
scripts Arimo does not cover as expected (we tested with Japanese).
- - - - -
d1de7b16 by Alex Catarineu at 2024-01-15T18:42:49+01:00
Bug 30605: Honor privacy.spoof_english in Android
This checks `privacy.spoof_english` whenever `setLocales` is
called from Fenix side and sets `intl.accept_languages`
accordingly.
Bug 40198: Expose privacy.spoof_english pref in GeckoView
- - - - -
9c83cabc by Alex Catarineu at 2024-01-15T18:42:49+01:00
Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView
- - - - -
69a13114 by Alex Catarineu at 2024-01-15T18:42:50+01:00
Bug 40171: Make WebRequest and GeckoWebExecutor First-Party aware
- - - - -
32771fa2 by Alex Catarineu at 2024-01-15T18:42:50+01:00
Bug 26345: Hide tracking protection UI
- - - - -
ceba9fe5 by Pier Angelo Vendrame at 2024-01-15T18:43:04+01:00
Bug 9173: Change the default Firefox profile directory to be relative.
This commit makes Firefox look for the default profile directory in a
directory relative to the binary path.
The directory can be specified through the --with-relative-data-dir.
This is relative to the same directory as the firefox main binary for
Linux and Windows.
On macOS, we remove Contents/MacOS from it.
Or, in other words, the directory is relative to the application
bundle.
This behavior can be overriden at runtime, by placing a file called
system-install adjacent to the firefox main binary (also on macOS).
- - - - -
72d6867a by Alex Catarineu at 2024-01-15T18:43:06+01:00
Bug 27604: Fix addon issues when moving the profile directory
Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1429838
- - - - -
c23fcced by Mike Perry at 2024-01-15T18:43:06+01:00
Bug 13028: Prevent potential proxy bypass cases.
It looks like these cases should only be invoked in the NSS command line
tools, and not the browser, but I decided to patch them anyway because there
literally is a maze of network function pointers being passed around, and it's
very hard to tell if some random code might not pass in the proper proxied
versions of the networking code here by accident.
Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1433509
- - - - -
ad261a23 by Igor Oliveira at 2024-01-15T18:43:06+01:00
Bug 23104: Add a default line height compensation
Many fonts have issues with their vertical metrics. they
are used to influence the height of ascenders and depth
of descenders. Gecko uses it to calculate the line height
(font height + ascender + descender), however because of
that idiosyncratic behavior across multiple operating
systems, it can be used to identify the user's OS.
The solution proposed in the patch uses a default factor
to be multiplied with the font size, simulating the concept
of ascender and descender. This way all operating
systems will have the same line height.
- - - - -
ef7e55e7 by Pier Angelo Vendrame at 2024-01-15T18:43:07+01:00
Bug 40309: Avoid using regional OS locales
Avoid regional OS locales if the pref
`intl.regional_prefs.use_os_locales` is false but RFP is enabled.
- - - - -
4199fb02 by Matthew Finkel at 2024-01-15T18:43:07+01:00
Bug 40432: Prevent probing installed applications
Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1711084
- - - - -
138c5203 by cypherpunks1 at 2024-01-15T18:43:07+01:00
Bug 33955: When copying an image only copy the image contents to the clipboard
- - - - -
c98b31aa by cypherpunks1 at 2024-01-15T18:43:08+01:00
Bug 41791: Omit the source URL when copying page contents to the clipboard
- - - - -
6d3c146f by hackademix at 2024-01-15T18:43:08+01:00
Bug 42288: Allow language spoofing in status messages.
- - - - -
5eacbc20 by Pier Angelo Vendrame at 2024-01-15T18:43:08+01:00
Base Browser strings
This commit adds all the strings needed by following Base Browser
patches.
- - - - -
8e545b54 by hackademix at 2024-01-15T18:43:09+01:00
Bug 41434: Letterboxing, preemptively apply margins in a global CSS rule to mitigate race conditions on newly created windows and tabs.
- - - - -
56f8b4a0 by hackademix at 2024-01-15T18:43:09+01:00
Bug 41434: Letterboxing, improve logging.
- - - - -
25d651a5 by hackademix at 2024-01-15T18:43:09+01:00
Bug 31064: Letterboxing, exempt browser extensions.
- - - - -
de7fe120 by hackademix at 2024-01-15T18:43:10+01:00
Bug 32411: Letterboxing, exempt view-source: URIs.
- - - - -
38734867 by hackademix at 2024-01-15T18:43:10+01:00
Bug 32308: use direct browser sizing for letterboxing.
Bug 30556: align letterboxing with 200x100 new win width stepping
- - - - -
c94558ad by hackademix at 2024-01-15T18:43:10+01:00
Bug 41631: Prevent weird initial window dimensions caused by subpixel computations
- - - - -
42292d23 by Pier Angelo Vendrame at 2024-01-15T18:43:11+01:00
Bug 41369: Improve Firefox language settings for multi-lingual packages
Change the language selector to be sorted by language code, rather than
name, and to display the language code to the user.
Bug 41372: Handle Japanese as a special case in preferences on macOS
Japanese is treated in a special way on macOS. However, seeing the
Japanese language tag could be confusing for users, and moreover the
language name is not localized correctly like other langs.
Bug 41378: Tell users that they can change their language at the first start
With multi-lingual builds, Tor Browser matches the user's system
language, but some users might want to change it.
So, we tell them that it is possible, but only once.
- - - - -
58588cd3 by p13dz at 2024-01-15T18:43:11+01:00
Bug 40283: Workaround for the file upload bug
- - - - -
f5c3a949 by Arthur Edelstein at 2024-01-15T18:43:11+01:00
Bug 18905: Hide unwanted items from help menu
Bug 25660: Remove the "New Private Window" option
- - - - -
b38853f6 by cypherpunks1 at 2024-01-15T18:43:12+01:00
Bug 41740: Change the RFP value of devicePixelRatio to 2
- - - - -
9995b517 by Pier Angelo Vendrame at 2024-01-15T18:43:12+01:00
Bug 41739: Remove "Website appearance" from about:preferences.
It is ignored because of RFP and it is confusing for users.
- - - - -
1d13480a by cypherpunks1 at 2024-01-15T18:43:12+01:00
Bug 41881: Don't persist custom network requests on private windows
- - - - -
13049d69 by hackademix at 2024-01-15T18:43:13+01:00
Bug 42019: Empty browser's clipboard on browser shutdown
- - - - -
f1230a87 by hackademix at 2024-01-15T18:43:13+01:00
Bug 42084: Ensure English spoofing works even if preferences are set out of order.
- - - - -
8f46449f by Pier Angelo Vendrame at 2024-01-15T18:43:13+01:00
Bug 41603: Customize the creation of MOZ_SOURCE_URL
MOZ_SOURCE_URL is created by combining MOZ_SOURCE_REPO and
MOZ_SOURCE_CHANGESET.
But the code takes for granted that it refers to a Hg instance, so it
combines them as `$MOZ_SOURCE_REPO/rev/$MOZ_SOURCE_CHANGESET`.
With this commit, we change this logic to combine them to create a URL
that is valid for GitLab.
$MOZ_SOURCE_CHANGESET needs to be a commit hash, not a branch or a tag.
If that is needed, we could use /-/tree/, instead of /-/commit/.
- - - - -
27c6eeb0 by Henry Wilkes at 2024-01-15T18:43:14+01:00
Bug 31575: Disable Firefox Home (Activity Stream)
Treat about:blank as the default home page and new tab page.
Avoid loading AboutNewTab in BrowserGlue.sys.mjs in order
to avoid several network requests that we do not need.
Bug 41624: Disable about:pocket-* pages.
Bug 40144: Redirect about:privatebrowsing to the user's home
- - - - -
3dd6e7f4 by Kathy Brade at 2024-01-15T18:43:14+01:00
Bug 4234: Use the Firefox Update Process for Base Browser.
Windows: disable "runas" code path in updater (15201).
Windows: avoid writing to the registry (16236).
Also includes fixes for tickets 13047, 13301, 13356, 13594, 15406,
16014, 16909, 24476, and 25909.
Also fix bug 27221: purge the startup cache if the Base Browser
version changed (even if the Firefox version and build ID did
not change), e.g., after a minor Base Browser update.
Also fix 32616: Disable GetSecureOutputDirectoryPath() functionality.
Bug 26048: potentially confusing "restart to update" message
Within the update doorhanger, remove the misleading message that mentions
that windows will be restored after an update is applied, and replace the
"Restart and Restore" button label with an existing
"Restart to update Tor Browser" string.
Bug 28885: notify users that update is downloading
Add a "Downloading Base Browser update" item which appears in the
hamburger (app) menu while the update service is downloading a MAR
file. Before this change, the browser did not indicate to the user
that an update was in progress, which is especially confusing in
Tor Browser because downloads often take some time. If the user
clicks on the new menu item, the about dialog is opened to allow
the user to see download progress.
As part of this fix, the update service was changed to always show
update-related messages in the hamburger menu, even if the update
was started in the foreground via the about dialog or via the
"Check for Tor Browser Update" toolbar menu item. This change is
consistent with the Tor Browser goal of making sure users are
informed about the update process.
Removed #28885 parts of this patch which have been uplifted to Firefox.
- - - - -
5be7eae4 by Pier Angelo Vendrame at 2024-01-15T18:43:14+01:00
Bug 42061: Create an alpha update channel.
- - - - -
3c95e0b0 by Nicolas Vigier at 2024-01-15T18:43:15+01:00
Bug 41682: Add base-browser nightly mar signing key
- - - - -
afcc8ed2 by hackademix at 2024-01-15T18:43:15+01:00
Bug 41695: Warn on window maximization without letterboxing in RFPHelper module
- - - - -
3dff65ae by Pier Angelo Vendrame at 2024-01-15T18:43:15+01:00
Bug 41698: Reword the recommendation badges in about:addons
Firefox strings use { -brand-product-name }.
As a result, it seems that the fork is recommending extensions, whereas
AMO curators are doing that.
So, we replace the strings with custom ones that clarify that Mozilla is
recommending them.
We assign the strings with JS because our translation backend does not
support Fluent attributes, yet, but once it does, we should switch to
them, instead.
Upstream bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1825033
- - - - -
3bc3833a by Alex Catarineu at 2024-01-15T18:43:16+01:00
Bug 40069: Add helpers for message passing with extensions
- - - - -
86119631 by Matthew Finkel at 2024-01-15T18:43:16+01:00
Bug 41598: Prevent NoScript from being removed/disabled.
Bug 40253: Explicitly allow NoScript in Private Browsing mode.
- - - - -
9abf802b by Henry Wilkes at 2024-01-15T18:43:16+01:00
Bug 41736: Hide NoScript extension's toolbar button by default.
This hides it from both the toolbar and the unified extensions panel.
We also hide the unified-extension-button if the panel would be empty:
not including the NoScript button when it is hidden. As a result, this
will be hidden by default until a user installs another extension (or
shows the NoScript button and unpins it).
- - - - -
5b88db98 by hackademix at 2024-01-15T18:43:17+01:00
Bug 41834: Hide "Can't Be Removed - learn more" menu line for uninstallable add-ons
- - - - -
5a4d96db by Pier Angelo Vendrame at 2024-01-15T18:43:17+01:00
Bug 40925: Implemented the Security Level component
This component adds a new Security Level toolbar button which visually
indicates the current global security level via icon (as defined by the
extensions.torbutton.security_slider pref), a drop-down hanger with a
short description of the current security level, and a new section in
the about:preferences#privacy page where users can change their current
security level. In addition, the hanger and the preferences page will
show a visual warning when the user has modified prefs associated with
the security level and provide a one-click 'Restore Defaults' button to
get the user back on recommended settings.
Bug 40125: Expose Security Level pref in GeckoView
- - - - -
1d5e6479 by Pier Angelo Vendrame at 2024-01-15T18:43:17+01:00
Bug 40926: Implemented the New Identity feature
- - - - -
13e8491d by Henry Wilkes at 2024-01-15T18:43:17+01:00
Bug 41736: Customize toolbar for base-browser.
- - - - -
cd181db2 by Pier Angelo Vendrame at 2024-01-15T18:43:18+01:00
Bug 42027: Base Browser migration procedures.
This commit implmenents the the Base Browser's version of _migrateUI.
- - - - -
30 changed files:
- .eslintignore
- + .gitlab/issue_templates/bug.md
- + .gitlab/merge_request_templates/default.md
- accessible/android/SessionAccessibility.cpp
- accessible/android/SessionAccessibility.h
- accessible/ipc/DocAccessibleParent.cpp
- accessible/ipc/DocAccessibleParent.h
- accessible/ipc/moz.build
- − browser/actors/RFPHelperChild.sys.mjs
- − browser/actors/RFPHelperParent.sys.mjs
- browser/actors/moz.build
- browser/app/Makefile.in
- browser/app/macbuild/Contents/MacOS-files.in
- browser/app/moz.build
- browser/app/permissions
- + browser/app/profile/001-base-profile.js
- browser/app/profile/firefox.js
- browser/base/content/aboutDialog-appUpdater.js
- browser/base/content/aboutDialog.js
- browser/base/content/aboutDialog.xhtml
- browser/base/content/appmenu-viewcache.inc.xhtml
- browser/base/content/browser-addons.js
- browser/base/content/browser-context.inc
- browser/base/content/browser-menubar.inc
- browser/base/content/browser-safebrowsing.js
- browser/base/content/browser-sets.inc
- browser/base/content/browser-siteIdentity.js
- browser/base/content/browser.css
- browser/base/content/browser.js
- browser/base/content/browser.xhtml
The diff was not included because it is too large.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/45…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/45…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser] Pushed new tag base-browser-115.7.0esr-13.5-1-build1
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed new tag base-browser-115.7.0esr-13.5-1-build1 at The Tor Project / Applications / Tor Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/base-brow…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser] Pushed new branch base-browser-115.7.0esr-13.5-1
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed new branch base-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/base-brow…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser] Pushed new tag tor-browser-115.7.0esr-13.5-1-build1
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed new tag tor-browser-115.7.0esr-13.5-1-build1 at The Tor Project / Applications / Tor Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/tor-brows…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][main] Bump Firefox version to 115.7.0esr for nightly builds.
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
656f1be4 by Pier Angelo Vendrame at 2024-01-16T14:27:52+01:00
Bump Firefox version to 115.7.0esr for nightly builds.
- - - - -
2 changed files:
- projects/firefox/config
- projects/geckoview/config
Changes:
=====================================
projects/firefox/config
=====================================
@@ -14,11 +14,11 @@ container:
use_container: 1
var:
- firefox_platform_version: 115.6.0
+ firefox_platform_version: 115.7.0
firefox_version: '[% c("var/firefox_platform_version") %]esr'
browser_series: '13.5'
browser_branch: '[% c("var/browser_series") %]-1'
- browser_build: 2
+ browser_build: 1
branding_directory_prefix: 'tb'
copyright_year: '[% exec("git show -s --format=%ci").remove("-.*") %]'
nightly_updates_publish_dir: '[% c("var/nightly_updates_publish_dir_prefix") %]nightly-[% c("var/osname") %]'
=====================================
projects/geckoview/config
=====================================
@@ -14,9 +14,9 @@ container:
use_container: 1
var:
- geckoview_version: 115.6.0esr
+ geckoview_version: 115.7.0esr
browser_branch: 13.5-1
- browser_build: 3
+ browser_build: 1
copyright_year: '[% exec("git show -s --format=%ci").remove("-.*") %]'
gitlab_project: https://gitlab.torproject.org/tpo/applications/tor-browser
git_commit: '[% exec("git rev-parse HEAD") %]'
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/6…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/6…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.7.0esr-13.5-1] 175 commits: Bug 1819160 - Map Android ids to doc/accessible id pairs. r=Jamie
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed to branch tor-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
dc27077f by Eitan Isaacson at 2024-01-15T18:24:38+01:00
Bug 1819160 - Map Android ids to doc/accessible id pairs. r=Jamie
Differential Revision: https://phabricator.services.mozilla.com/D179737
- - - - -
9c94ccb6 by Pier Angelo Vendrame at 2024-01-15T18:24:39+01:00
Bug 1832523 - Allow using NSS to sign and verify MAR signatures. r=application-update-reviewers,glandium,bytesized
Allow using NSS for checking MAR signatures also in platforms where
OS-native APIs are used by default, i.e., macOS and Windows.
Differential Revision: https://phabricator.services.mozilla.com/D177743
- - - - -
6739f4ed by Pier Angelo Vendrame at 2024-01-15T18:24:40+01:00
Bug 1849129: Prevent exceptions caused by extensions from interrupting the SearchService initialization. r=search-reviewers,Standard8
Differential Revision: https://phabricator.services.mozilla.com/D186456
- - - - -
7dfe1f10 by Emilio Cobos Álvarez at 2024-01-15T18:24:40+01:00
Bug 1853731 - Use html:img for message-bar-icon. r=Gijs,dao,settings-reviewers,desktop-theme-reviewers,sfoster
Differential Revision: https://phabricator.services.mozilla.com/D188521
- - - - -
e99cf66e by Pier Angelo Vendrame at 2024-01-15T18:24:41+01:00
Bug 1854117 - Sort the DLL blocklist flags. r=mossop,win-reviewers,gstoll
Differential Revision: https://phabricator.services.mozilla.com/D188716
- - - - -
87492bc5 by Eden Chuang at 2024-01-15T18:24:41+01:00
Bug 1738426 - Ignoring status 206 and vary header checking for opaque response in Cache API. r=asuth
Differential Revision: https://phabricator.services.mozilla.com/D186431
- - - - -
0221332a by edgul at 2024-01-15T18:24:42+01:00
Bug 1802057 - Block the following characters from use in the cookie name in the cookie string: 0x3B (semi-colon), 0x3D (equals), and 0x7F (del) r=dveditz,cookie-reviewers
Differential Revision: https://phabricator.services.mozilla.com/D182373
- - - - -
71bca736 by Kelsey Gilbert at 2024-01-15T18:24:42+01:00
Bug 1819497 - Don't race on static bool for initialization. r=gfx-reviewers,aosmond
We could do non-racy static init here (e.g. with a static initializer
self-calling-closure), but there doesn't seem to be a strong reason for
this. Let's just use a switch and get robustness from -Werror=switch.
Differential Revision: https://phabricator.services.mozilla.com/D188054
- - - - -
6b80d5b5 by Mark Banner at 2024-01-15T18:24:43+01:00
Bug 1845752. r=ckerschb
Differential Revision: https://phabricator.services.mozilla.com/D186676
- - - - -
ab369a84 by Pier Angelo Vendrame at 2024-01-15T18:24:43+01:00
Bug 1849186 - Add a preference not to expose the content title in the window title. r=Gijs,tabbrowser-reviewers,dao
Differential Revision: https://phabricator.services.mozilla.com/D190496
- - - - -
8b3be202 by Bob Owen at 2024-01-15T18:24:44+01:00
Bug 1850072: Initialize RecordedDrawTargetCreation::mHasExistingData. r=jrmuizel
This also specializes ElementStreamFormat for bool.
Differential Revision: https://phabricator.services.mozilla.com/D187794
- - - - -
428e7b54 by Malte Juergens at 2024-01-15T18:24:44+01:00
Bug 1850200 - Add delay to HTTPS-Only "Continue to HTTPS Site" button r=freddyb
Differential Revision: https://phabricator.services.mozilla.com/D187887
- - - - -
7f20a8c0 by Andreas Pehrson at 2024-01-15T18:24:45+01:00
Bug 1851803 - Introduce SourceMediaTrack::mDirectDisabledMode. r=karlt
Similar to MediaTrack::mDisabledMode, but this is for uses on the
SourceMediaTrack producer thread. It is still signaled via a control message
from the control thread to maintain order of operations, and is protected by the
SourceMediaTrack mutex.
Differential Revision: https://phabricator.services.mozilla.com/D187554
- - - - -
50100cc8 by Pier Angelo Vendrame at 2024-01-15T18:24:45+01:00
Bug 1860020 - Remove the assertion on the value of toolkit.telemetry.enabled. r=KrisWright,chutten
Bug 1444275 introduced an assertion on the parent process to check that
the value of toolkit.telemetry.enabled is the expected one.
However, this expected value could be different from the one set and
locked e.g. in some forks. Therefore, the assertion prevented debug
builds from working in these cases.
Differential Revision: https://phabricator.services.mozilla.com/D195080
- - - - -
31018d1b by Kagami Sascha Rosylight at 2024-01-15T18:24:46+01:00
Bug 1865238 - Use One UI Sans KR VF for Korean sans-serif font on Android r=jfkthame
Per /etc/fonts.xml, there are now only two `<family lang="ko">` nodes there:
* OneUISansKRVF series
* SECCJK series (but no KR postfix anymore?)
This patch uses One UI Sans KR VF as the replacement as this is newer and is a variable font (tested with https://codepen.io/SaschaNaz/pen/ExrdYXJ)
Differential Revision: https://phabricator.services.mozilla.com/D195078
- - - - -
b5b6d436 by Tom Ritter at 2024-01-15T18:24:57+01:00
Bug 1873526: Refactor the restriction override list from a big if statement to a list r=KrisWright
Differential Revision: https://phabricator.services.mozilla.com/D198081
- - - - -
965577ea by Henry Wilkes at 2024-01-15T18:25:40+01:00
Bug 41454: Move focus after calling openPreferences for a sub-category.
Temporary fix until mozilla bug 1799153 gets a patch upstream.
- - - - -
d2feaf69 by hackademix at 2024-01-15T18:25:41+01:00
Bug 42194: Fix blank net error page on failed DNS resolution with active proxy.
- - - - -
f5e4d72b by Henry Wilkes at 2024-01-15T18:25:42+01:00
Bug 41483: Remove the firefox override for appstrings.properties
Remove this patch after upstream bugzilla bug 1790187
- - - - -
25e023ad by Pier Angelo Vendrame at 2024-01-15T18:25:42+01:00
Bug 41116: Normalize system fonts.
System fonts are an enormous fingerprinting vector.
Even with font allow lists and with our custom configuration on Linux,
which counter metrics measurements, getComputedStyle leaks several
details.
This patch counters both these kinds of attacks.
- - - - -
cb7998a4 by Marco Simonelli at 2024-01-15T18:25:43+01:00
Bug 41459: WebRTC fails to build under mingw (Part 1)
- properly define NOMINMAX for just MSVC builds
- - - - -
aca4ae38 by Marco Simonelli at 2024-01-15T18:25:43+01:00
Bug 41459: WebRTC fails to build under mingw (Part 2)
- fixes required to build third_party/libwebrtc
- - - - -
1fb3755a by Marco Simonelli at 2024-01-15T18:25:44+01:00
Bug 41459: WebRTC fails to build under mingw (Part 3)
- fixes required to build third_party/sipcc
- - - - -
23a327f2 by Marco Simonelli at 2024-01-15T18:25:44+01:00
Bug 41459: WebRTC fails to build under mingw (Part 4)
- fixes requried to build netwerk/sctp
- - - - -
adb3f4bb by Marco Simonelli at 2024-01-15T18:25:44+01:00
Bug 41459: WebRTC fails to build under mingw (Part 5)
- fixes required to build dom/media/webrtc
- - - - -
5836b6b8 by Marco Simonelli at 2024-01-15T18:25:45+01:00
Bug 41459: WebRTC fails to build under mingw (Part 6)
- fixes required to build dom/media/systemservices
- - - - -
8b8b900d by hackademix at 2024-01-15T18:25:45+01:00
Bug 41854: Allow overriding download spam protection.
- - - - -
954fb272 by Gaba at 2024-01-15T18:27:27+01:00
Adding issue and merge request templates
- - - - -
b197d888 by Pier Angelo Vendrame at 2024-01-15T18:27:28+01:00
Base Browser's .mozconfigs.
Bug 17858: Cannot create incremental MARs for hardened builds.
Define HOST_CFLAGS, etc. to avoid compiling programs such as mbsdiff
(which is part of mar-tools and is not distributed to end-users) with
ASan.
Bug 21849: Don't allow SSL key logging.
Bug 25741 - TBA: Disable features at compile-time
Define MOZ_ANDROID_NETWORK_STATE and MOZ_ANDROID_LOCATION
Bug 27623 - Export MOZILLA_OFFICIAL during desktop builds
This fixes a problem where some preferences had the wrong default value.
Also see bug 27472 where we made a similar fix for Android.
Bug 29859: Disable HLS support for now
Bug 30463: Explicitly disable MOZ_TELEMETRY_REPORTING
Bug 32493: Disable MOZ_SERVICES_HEALTHREPORT
Bug 33734: Set MOZ_NORMANDY to False
Bug 33851: Omit Parental Controls.
Bug 40252: Add --enable-rust-simd to our tor-browser mozconfig files
Bug 41584: Move some configuration options to base-browser level
- - - - -
908ffb5d by Pier Angelo Vendrame at 2024-01-15T18:42:38+01:00
fixup! Base Browser's .mozconfigs.
Bug 42337: Enable GeckoDriver for all desktop platforms
- - - - -
d1ddf52b by Pier Angelo Vendrame at 2024-01-15T18:42:40+01:00
fixup! Base Browser's .mozconfigs.
Bug 42146: Use LLD on Linux.
This should allow us to restore debug symbols on Linux i686.
- - - - -
f473cb50 by Pier Angelo Vendrame at 2024-01-15T18:42:40+01:00
Tweaks to the build system
Bug 40857: Modified the fat .aar creation file
This is a workaround to build fat .aars with the compiling enviornment
disabled.
Mozilla does not use a similar configuration, but either runs a Firefox
build and discards its output, or uses artifacts build.
We might switch to artifact builds too, and drop this patch, or write a
better one to upstream. But until then we need this patch.
See also https://bugzilla.mozilla.org/show_bug.cgi?id=1763770.
Bug 41458: Prevent `mach package-multi-locale` from actually creating a package
macOS builds need some files to be moved around with
./mach package-multi-locale to create multi-locale packages.
The required command isn't exposed through any other mach command.
So, we patch package-multi-locale both to prevent it from failing when
doing official builds and to detect any future changes on it.
- - - - -
2d34dea1 by Pier Angelo Vendrame at 2024-01-15T18:42:40+01:00
Bug 41108: Remove privileged macOS installation from 102
- - - - -
3b772262 by Dan Ballard at 2024-01-15T18:42:41+01:00
Bug 41149: Re-enable DLL injection protection in all builds not just nightlies
- - - - -
e5635e74 by Matthew Finkel at 2024-01-15T18:42:41+01:00
Bug 24796: Comment out excess permissions from GeckoView
The GeckoView AndroidManifest.xml is not preprocessed unlike Fennec's
manifest, so we can't use the ifdef preprocessor guards around the
permissions we do not want. Commenting the permissions is the
next-best-thing.
- - - - -
1d581684 by Matthew Finkel at 2024-01-15T18:42:41+01:00
Bug 28125: Prevent non-Necko network connections
- - - - -
342c65b3 by Mike Perry at 2024-01-15T18:42:42+01:00
Bug 12974: Disable NTLM and Negotiate HTTP Auth
The Mozilla bugs: https://bugzilla.mozilla.org/show_bug.cgi?id=1046421,
https://bugzilla.mozilla.org/show_bug.cgi?id=1261591, tor-browser#27602
- - - - -
b0bd0532 by Alex Catarineu at 2024-01-15T18:42:42+01:00
Bug 40166: Disable security.certerrors.mitm.auto_enable_enterprise_roots
Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1768899
- - - - -
aa45056d by Georg Koppen at 2024-01-15T18:42:42+01:00
Bug 16285: Exclude ClearKey system for now
In the past the ClearKey system had not been compiled when specifying
--disable-eme. But that changed and it is even bundled nowadays (see:
Mozilla's bug 1300654). We don't want to ship it right now as the use
case for it is not really visible while the code had security
vulnerabilities in the past.
- - - - -
7bc58484 by Kathy Brade at 2024-01-15T18:42:43+01:00
Bug 21431: Clean-up system extensions shipped in Firefox
Only ship the pdfjs extension.
- - - - -
25da3cca by Kathy Brade at 2024-01-15T18:42:43+01:00
Bug 33852: Clean up about:logins (LockWise) to avoid mentioning sync, etc.
Hide elements on about:logins that mention sync, "Firefox LockWise", and
Mozilla's LockWise mobile apps.
Disable the "Create New Login" button when security.nocertdb is true.
- - - - -
c6aad3d2 by Alex Catarineu at 2024-01-15T18:42:43+01:00
Bug 41457: Remove Mozilla permissions
Bug 40025: Remove Mozilla add-on install permissions
- - - - -
bdfccba2 by Kathy Brade at 2024-01-15T18:42:44+01:00
Bug 40002: Remove about:ion
Firefox Ion (previously Firefox Pioneer) is an opt-in program in which people
volunteer to participate in studies that collect detailed, sensitive data about
how they use their browser.
Bug 41662: Disable about:sync-logs
Even though we disable sync by default with
`identity.fxaccounts.enabled`, this about: page is still avilable.
We could throw an exception on the constructor of the related
component, but it would result only in an error in the console, without
a visible "this address does not look right" error page.
If we fix the issues with MOZ_SERVICES_SYNC, we can restore the
component.
- - - - -
b485e748 by Arthur Edelstein at 2024-01-15T18:42:44+01:00
Bug 26353: Prevent speculative connect that violated FPI.
Connections were observed in the catch-all circuit when
the user entered an https or http URL in the URL bar, or
typed a search term.
- - - - -
f60d239a by Alex Catarineu at 2024-01-15T18:42:44+01:00
Bug 31740: Remove some unnecessary RemoteSettings instances
More concretely, SearchService.jsm 'hijack-blocklists' and
url-classifier-skip-urls.
Avoid creating instance for 'anti-tracking-url-decoration'.
If prefs are disabling their usage, avoid creating instances for
'cert-revocations' and 'intermediates'.
Do not ship JSON dumps for collections we do not expect to need. For
the ones in the 'main' bucket, this prevents them from being synced
unnecessarily (the code in remote-settings does so for collections
in the main bucket for which a dump or local data exists). For the
collections in the other buckets, we just save some size by not
shipping their dumps.
We also clear the collections database on the v2 -> v3 migration.
- - - - -
740d6463 by cypherpunks1 at 2024-01-15T18:42:45+01:00
Bug 41092: Add a RemoteSettings JSON dump for query-stripping
- - - - -
4ba5cb9a by Pier Angelo Vendrame at 2024-01-15T18:42:45+01:00
Bug 41635: Disable the Normandy component
Do not include Normandy at all whenever MOZ_NORMANDY is False.
- - - - -
f659d493 by Georg Koppen at 2024-01-15T18:42:45+01:00
Bug 30541: Disable WebGL readPixel() for web content
Related Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1428034
- - - - -
777ac5bc by Alex Catarineu at 2024-01-15T18:42:46+01:00
Bug 28369: Stop shipping pingsender executable
- - - - -
073dee20 by cypherpunks1 at 2024-01-15T18:42:46+01:00
Bug 41568: Disable LaterRun
- - - - -
f1048f07 by cypherpunks1 at 2024-01-15T18:42:46+01:00
Bug 40717: Hide Windows SSO in settings
- - - - -
6bc20ba1 by Pier Angelo Vendrame at 2024-01-15T18:42:47+01:00
Bug 41599: Always return an empty string as network ID
Firefox computes an internal network ID used to detect network changes
and act consequently (e.g., to improve WebSocket UX).
However, there are a few ways to get this internal network ID, so we
patch them out, to be sure any new code will not be able to use them and
possibly link users.
We also sent a patch to Mozilla to seed the internal network ID, to
prevent any accidental leak in the future.
Upstream: https://bugzilla.mozilla.org/show_bug.cgi?id=1817756
- - - - -
679f44da by cypherpunks1 at 2024-01-15T18:42:47+01:00
Bug 40175: Add origin attributes to about:reader top-level requests
- - - - -
f44a0bbc by Richard Pospesel at 2024-01-15T18:42:47+01:00
Bug 41327: Disable UrlbarProviderInterventions
- - - - -
58cbfed6 by Richard Pospesel at 2024-01-15T18:42:48+01:00
Bug 42037: Disable about:firefoxview page
- - - - -
57b2f41b by Mike Perry at 2024-01-15T18:42:48+01:00
Firefox preference overrides.
This hack directly includes our preference changes in omni.ja.
Bug 18292: Staged updates fail on Windows
Temporarily disable staged updates on Windows.
Bug 18297: Use separate Noto JP,KR,SC,TC fonts
Bug 23404: Add Noto Sans Buginese to the macOS whitelist
Bug 23745: Set dom.indexedDB.enabled = true
Bug 13575: Disable randomised Firefox HTTP cache decay user tests.
(Fernando Fernandez Mancera <ffmancera(a)riseup.net>)
Bug 17252: Enable session identifiers with FPI
Session tickets and session identifiers were isolated
by OriginAttributes, so we can re-enable them by
allowing the default value (true) of
"security.ssl.disable_session_identifiers".
The pref "security.enable_tls_session_tickets" is obsolete
(removed in https://bugzilla.mozilla.org/917049)
Bug 14952: Enable http/2 and AltSvc
In Firefox, SPDY/HTTP2 now uses Origin Attributes for
isolation of connections, push streams, origin frames, etc.
That means we get first-party isolation provided
"privacy.firstparty.isolate" is true. So in this patch, we
stop overriding "network.http.spdy.enabled" and
"network.http.spdy.enabled.http2".
Alternate Services also use Origin Attributes for isolation.
So we stop overriding
"network.http.altsvc.enabled" and "network.http.altsvc.oe"
as well.
(All 4 of the abovementioned "network.http.*" prefs adopt
Firefox 60ESR's default value of true.)
However, we want to disable HTTP/2 push for now, so we
set "network.http.spdy.allow-push" to false.
"network.http.spdy.enabled.http2draft" was removed in Bug 1132357.
"network.http.sped.enabled.v2" was removed in Bug 912550.
"network.http.sped.enabled.v3" was removed in Bug 1097944.
"network.http.sped.enabled.v3-1" was removed in Bug 1248197.
Bug 26114: addons.mozilla.org is not special
* Don't expose navigator.mozAddonManager on any site
* Don't block NoScript from modifying addons.mozilla.org or other sites
Enable ReaderView mode again (#27281).
Bug 29916: Make sure enterprise policies are disabled
Bug 2874: Block Components.interfaces from content
Bug 26146: Spoof HTTP User-Agent header for desktop platforms
In Tor Browser 8.0, the OS was revealed in both the HTTP User-Agent
header and to JavaScript code via navigator.userAgent. To avoid
leaking the OS inside each HTTP request (which many web servers
log), always use the Windows 7 OS value in the desktop User-Agent
header. We continue to allow access to the actual OS via JavaScript,
since doing so improves compatibility with web applications such
as GitHub and Google Docs.
Bug 12885: Windows Jump Lists fail for Tor Browser
Jumplist entries are stored in a binary file in:
%APPDATA%\\Microsoft\Windows\Recent\CustomDestinations\
and has a name in the form
[a-f0-9]+.customDestinations-ms
The hex at the front is unique per app, and is ultimately derived from
something called the 'App User Model ID' (AUMID) via some unknown
hashing method. The AUMID is provided as a key when programmatically
creating, updating, and deleting a jumplist. The default behaviour in
firefox is for the installer to define an AUMID for an app, and save it
in the registry so that the jumplist data can be removed by the
uninstaller.
However, the Tor Browser does not set this (or any other) regkey during
installation, so this codepath fails and the app's AUMID is left
undefined. As a result the app's AUMID ends up being defined by
windows, but unknowable by Tor Browser. This unknown AUMID is used to
create and modify the jumplist, but the delete API requires that we
provide the app's AUMID explicitly. Since we don't know what the AUMID
is (since the expected regkey where it is normally stored does not
exist) jumplist deletion will fail and we will leave behind a mostly
empty customDestinations-ms file. The name of the file is derived from
the binary path, so an enterprising person could reverse engineer how
that hex name is calculated, and generate the name for Tor Browser's
default Desktop installation path to determine whether a person had
used Tor Browser in the past.
The 'taskbar.grouping.useprofile' option that is enabled by this patch
works around this AUMID problem by having firefox.exe create it's own
AUMID based on the profile path (rather than looking for a regkey). This
way, if a user goes in and enables and disables jumplist entries, the
backing store is properly deleted.
Unfortunately, all windows users currently have this file lurking in
the above mentioned directory and this patch will not remove it since it
was created with an unknown AUMID. However, another patch could be
written which goes to that directory and deletes any item containing the
'Tor Browser' string. See bug 28996.
Bug 30845: Make sure default themes and other internal extensions are enabled
Bug 28896: Enable extensions in private browsing by default
Bug 31065: Explicitly allow proxying localhost
Bug 31598: Enable letterboxing
Disable Presentation API everywhere
Bug 21549 - Use Firefox's WASM default pref. It is disabled at safer
security levels.
Bug 32321: Disable Mozilla's MitM pings
Bug 19890: Disable installation of system addons
By setting the URL to "" we make sure that already installed system
addons get deleted as well.
Bug 22548: Firefox downgrades VP9 videos to VP8.
On systems where H.264 is not available or no HWA, VP9 is preferred. But in Tor
Browser 7.0 all youtube videos are degraded to VP8.
This behaviour can be turned off by setting media.benchmark.vp9.threshold to 0.
All clients will get better experience and lower traffic, beause TBB doesn't
use "Use hardware acceleration when available".
Bug 25741 - TBA: Add mobile-override of 000-tor-browser prefs
Bug 16441: Suppress "Reset Tor Browser" prompt.
Bug 29120: Use the in-memory media cache and increase its maximum size.
Bug 33697: use old search config based on list.json
Bug 33855: Ensure that site-specific browser mode is disabled.
Bug 30682: Disable Intermediate CA Preloading.
Bug 40061: Omit the Windows default browser agent from the build
Bug 40322: Consider disabling network.connectivity-service.enabled
Bug 40408: Disallow SVG Context Paint in all web content
Bug 40308: Disable network partitioning until we evaluate dFPI
Bug 40322: Consider disabling network.connectivity-service.enabled
Bug 40383: Disable dom.enable_event_timing
Bug 40423: Disable http/3
Bug 40177: Update prefs for Fx91esr
Bug 40700: Disable addons and features recommendations
Bug 40682: Disable network.proxy.allow_bypass
Bug 40736: Disable third-party cookies in PBM
Bug 19850: Enabled HTTPS-Only by default
Bug 40912: Hide the screenshot menu
Bug 41292: Disable moreFromMozilla in preferences page
Bug 40057: Ensure the CSS4 system colors are not a fingerprinting vector
Bug 24686: Set network.http.tailing.enabled to true
Bug 40183: Disable TLS ciphersuites using SHA-1
Bug 40783: Review 000-tor-browser.js and 001-base-profile.js for 102
We reviewed all the preferences we set for 102, and remove a few old
ones. See the description of that issue to see all the preferences we
believed were still valid for 102, and some brief description for the
reasons to keep them.
- - - - -
495160f1 by Richard Pospesel at 2024-01-15T18:42:48+01:00
Bug 41659: Add canonical color definitions to base-browser
- - - - -
88cfa4ac by Pier Angelo Vendrame at 2024-01-15T18:42:49+01:00
Bug 41043: Hardcode the UI font on Linux
The mechanism to choose the UI font does not play well with our
fontconfig configuration. As a result, the final criterion to choose
the font for the UI was its version.
Since we hardcode Arimo as a default sans-serif on preferences, we use
it also for the UI. FontConfig will fall back to some other font for
scripts Arimo does not cover as expected (we tested with Japanese).
- - - - -
d1de7b16 by Alex Catarineu at 2024-01-15T18:42:49+01:00
Bug 30605: Honor privacy.spoof_english in Android
This checks `privacy.spoof_english` whenever `setLocales` is
called from Fenix side and sets `intl.accept_languages`
accordingly.
Bug 40198: Expose privacy.spoof_english pref in GeckoView
- - - - -
9c83cabc by Alex Catarineu at 2024-01-15T18:42:49+01:00
Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView
- - - - -
69a13114 by Alex Catarineu at 2024-01-15T18:42:50+01:00
Bug 40171: Make WebRequest and GeckoWebExecutor First-Party aware
- - - - -
32771fa2 by Alex Catarineu at 2024-01-15T18:42:50+01:00
Bug 26345: Hide tracking protection UI
- - - - -
ceba9fe5 by Pier Angelo Vendrame at 2024-01-15T18:43:04+01:00
Bug 9173: Change the default Firefox profile directory to be relative.
This commit makes Firefox look for the default profile directory in a
directory relative to the binary path.
The directory can be specified through the --with-relative-data-dir.
This is relative to the same directory as the firefox main binary for
Linux and Windows.
On macOS, we remove Contents/MacOS from it.
Or, in other words, the directory is relative to the application
bundle.
This behavior can be overriden at runtime, by placing a file called
system-install adjacent to the firefox main binary (also on macOS).
- - - - -
72d6867a by Alex Catarineu at 2024-01-15T18:43:06+01:00
Bug 27604: Fix addon issues when moving the profile directory
Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1429838
- - - - -
c23fcced by Mike Perry at 2024-01-15T18:43:06+01:00
Bug 13028: Prevent potential proxy bypass cases.
It looks like these cases should only be invoked in the NSS command line
tools, and not the browser, but I decided to patch them anyway because there
literally is a maze of network function pointers being passed around, and it's
very hard to tell if some random code might not pass in the proper proxied
versions of the networking code here by accident.
Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1433509
- - - - -
ad261a23 by Igor Oliveira at 2024-01-15T18:43:06+01:00
Bug 23104: Add a default line height compensation
Many fonts have issues with their vertical metrics. they
are used to influence the height of ascenders and depth
of descenders. Gecko uses it to calculate the line height
(font height + ascender + descender), however because of
that idiosyncratic behavior across multiple operating
systems, it can be used to identify the user's OS.
The solution proposed in the patch uses a default factor
to be multiplied with the font size, simulating the concept
of ascender and descender. This way all operating
systems will have the same line height.
- - - - -
ef7e55e7 by Pier Angelo Vendrame at 2024-01-15T18:43:07+01:00
Bug 40309: Avoid using regional OS locales
Avoid regional OS locales if the pref
`intl.regional_prefs.use_os_locales` is false but RFP is enabled.
- - - - -
4199fb02 by Matthew Finkel at 2024-01-15T18:43:07+01:00
Bug 40432: Prevent probing installed applications
Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1711084
- - - - -
138c5203 by cypherpunks1 at 2024-01-15T18:43:07+01:00
Bug 33955: When copying an image only copy the image contents to the clipboard
- - - - -
c98b31aa by cypherpunks1 at 2024-01-15T18:43:08+01:00
Bug 41791: Omit the source URL when copying page contents to the clipboard
- - - - -
6d3c146f by hackademix at 2024-01-15T18:43:08+01:00
Bug 42288: Allow language spoofing in status messages.
- - - - -
5eacbc20 by Pier Angelo Vendrame at 2024-01-15T18:43:08+01:00
Base Browser strings
This commit adds all the strings needed by following Base Browser
patches.
- - - - -
8e545b54 by hackademix at 2024-01-15T18:43:09+01:00
Bug 41434: Letterboxing, preemptively apply margins in a global CSS rule to mitigate race conditions on newly created windows and tabs.
- - - - -
56f8b4a0 by hackademix at 2024-01-15T18:43:09+01:00
Bug 41434: Letterboxing, improve logging.
- - - - -
25d651a5 by hackademix at 2024-01-15T18:43:09+01:00
Bug 31064: Letterboxing, exempt browser extensions.
- - - - -
de7fe120 by hackademix at 2024-01-15T18:43:10+01:00
Bug 32411: Letterboxing, exempt view-source: URIs.
- - - - -
38734867 by hackademix at 2024-01-15T18:43:10+01:00
Bug 32308: use direct browser sizing for letterboxing.
Bug 30556: align letterboxing with 200x100 new win width stepping
- - - - -
c94558ad by hackademix at 2024-01-15T18:43:10+01:00
Bug 41631: Prevent weird initial window dimensions caused by subpixel computations
- - - - -
42292d23 by Pier Angelo Vendrame at 2024-01-15T18:43:11+01:00
Bug 41369: Improve Firefox language settings for multi-lingual packages
Change the language selector to be sorted by language code, rather than
name, and to display the language code to the user.
Bug 41372: Handle Japanese as a special case in preferences on macOS
Japanese is treated in a special way on macOS. However, seeing the
Japanese language tag could be confusing for users, and moreover the
language name is not localized correctly like other langs.
Bug 41378: Tell users that they can change their language at the first start
With multi-lingual builds, Tor Browser matches the user's system
language, but some users might want to change it.
So, we tell them that it is possible, but only once.
- - - - -
58588cd3 by p13dz at 2024-01-15T18:43:11+01:00
Bug 40283: Workaround for the file upload bug
- - - - -
f5c3a949 by Arthur Edelstein at 2024-01-15T18:43:11+01:00
Bug 18905: Hide unwanted items from help menu
Bug 25660: Remove the "New Private Window" option
- - - - -
b38853f6 by cypherpunks1 at 2024-01-15T18:43:12+01:00
Bug 41740: Change the RFP value of devicePixelRatio to 2
- - - - -
9995b517 by Pier Angelo Vendrame at 2024-01-15T18:43:12+01:00
Bug 41739: Remove "Website appearance" from about:preferences.
It is ignored because of RFP and it is confusing for users.
- - - - -
1d13480a by cypherpunks1 at 2024-01-15T18:43:12+01:00
Bug 41881: Don't persist custom network requests on private windows
- - - - -
13049d69 by hackademix at 2024-01-15T18:43:13+01:00
Bug 42019: Empty browser's clipboard on browser shutdown
- - - - -
f1230a87 by hackademix at 2024-01-15T18:43:13+01:00
Bug 42084: Ensure English spoofing works even if preferences are set out of order.
- - - - -
8f46449f by Pier Angelo Vendrame at 2024-01-15T18:43:13+01:00
Bug 41603: Customize the creation of MOZ_SOURCE_URL
MOZ_SOURCE_URL is created by combining MOZ_SOURCE_REPO and
MOZ_SOURCE_CHANGESET.
But the code takes for granted that it refers to a Hg instance, so it
combines them as `$MOZ_SOURCE_REPO/rev/$MOZ_SOURCE_CHANGESET`.
With this commit, we change this logic to combine them to create a URL
that is valid for GitLab.
$MOZ_SOURCE_CHANGESET needs to be a commit hash, not a branch or a tag.
If that is needed, we could use /-/tree/, instead of /-/commit/.
- - - - -
27c6eeb0 by Henry Wilkes at 2024-01-15T18:43:14+01:00
Bug 31575: Disable Firefox Home (Activity Stream)
Treat about:blank as the default home page and new tab page.
Avoid loading AboutNewTab in BrowserGlue.sys.mjs in order
to avoid several network requests that we do not need.
Bug 41624: Disable about:pocket-* pages.
Bug 40144: Redirect about:privatebrowsing to the user's home
- - - - -
3dd6e7f4 by Kathy Brade at 2024-01-15T18:43:14+01:00
Bug 4234: Use the Firefox Update Process for Base Browser.
Windows: disable "runas" code path in updater (15201).
Windows: avoid writing to the registry (16236).
Also includes fixes for tickets 13047, 13301, 13356, 13594, 15406,
16014, 16909, 24476, and 25909.
Also fix bug 27221: purge the startup cache if the Base Browser
version changed (even if the Firefox version and build ID did
not change), e.g., after a minor Base Browser update.
Also fix 32616: Disable GetSecureOutputDirectoryPath() functionality.
Bug 26048: potentially confusing "restart to update" message
Within the update doorhanger, remove the misleading message that mentions
that windows will be restored after an update is applied, and replace the
"Restart and Restore" button label with an existing
"Restart to update Tor Browser" string.
Bug 28885: notify users that update is downloading
Add a "Downloading Base Browser update" item which appears in the
hamburger (app) menu while the update service is downloading a MAR
file. Before this change, the browser did not indicate to the user
that an update was in progress, which is especially confusing in
Tor Browser because downloads often take some time. If the user
clicks on the new menu item, the about dialog is opened to allow
the user to see download progress.
As part of this fix, the update service was changed to always show
update-related messages in the hamburger menu, even if the update
was started in the foreground via the about dialog or via the
"Check for Tor Browser Update" toolbar menu item. This change is
consistent with the Tor Browser goal of making sure users are
informed about the update process.
Removed #28885 parts of this patch which have been uplifted to Firefox.
- - - - -
5be7eae4 by Pier Angelo Vendrame at 2024-01-15T18:43:14+01:00
Bug 42061: Create an alpha update channel.
- - - - -
3c95e0b0 by Nicolas Vigier at 2024-01-15T18:43:15+01:00
Bug 41682: Add base-browser nightly mar signing key
- - - - -
afcc8ed2 by hackademix at 2024-01-15T18:43:15+01:00
Bug 41695: Warn on window maximization without letterboxing in RFPHelper module
- - - - -
3dff65ae by Pier Angelo Vendrame at 2024-01-15T18:43:15+01:00
Bug 41698: Reword the recommendation badges in about:addons
Firefox strings use { -brand-product-name }.
As a result, it seems that the fork is recommending extensions, whereas
AMO curators are doing that.
So, we replace the strings with custom ones that clarify that Mozilla is
recommending them.
We assign the strings with JS because our translation backend does not
support Fluent attributes, yet, but once it does, we should switch to
them, instead.
Upstream bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1825033
- - - - -
3bc3833a by Alex Catarineu at 2024-01-15T18:43:16+01:00
Bug 40069: Add helpers for message passing with extensions
- - - - -
86119631 by Matthew Finkel at 2024-01-15T18:43:16+01:00
Bug 41598: Prevent NoScript from being removed/disabled.
Bug 40253: Explicitly allow NoScript in Private Browsing mode.
- - - - -
9abf802b by Henry Wilkes at 2024-01-15T18:43:16+01:00
Bug 41736: Hide NoScript extension's toolbar button by default.
This hides it from both the toolbar and the unified extensions panel.
We also hide the unified-extension-button if the panel would be empty:
not including the NoScript button when it is hidden. As a result, this
will be hidden by default until a user installs another extension (or
shows the NoScript button and unpins it).
- - - - -
5b88db98 by hackademix at 2024-01-15T18:43:17+01:00
Bug 41834: Hide "Can't Be Removed - learn more" menu line for uninstallable add-ons
- - - - -
5a4d96db by Pier Angelo Vendrame at 2024-01-15T18:43:17+01:00
Bug 40925: Implemented the Security Level component
This component adds a new Security Level toolbar button which visually
indicates the current global security level via icon (as defined by the
extensions.torbutton.security_slider pref), a drop-down hanger with a
short description of the current security level, and a new section in
the about:preferences#privacy page where users can change their current
security level. In addition, the hanger and the preferences page will
show a visual warning when the user has modified prefs associated with
the security level and provide a one-click 'Restore Defaults' button to
get the user back on recommended settings.
Bug 40125: Expose Security Level pref in GeckoView
- - - - -
1d5e6479 by Pier Angelo Vendrame at 2024-01-15T18:43:17+01:00
Bug 40926: Implemented the New Identity feature
- - - - -
13e8491d by Henry Wilkes at 2024-01-15T18:43:17+01:00
Bug 41736: Customize toolbar for base-browser.
- - - - -
cd181db2 by Pier Angelo Vendrame at 2024-01-15T18:43:18+01:00
Bug 42027: Base Browser migration procedures.
This commit implmenents the the Base Browser's version of _migrateUI.
- - - - -
da75e28c by Henry Wilkes at 2024-01-15T18:45:23+01:00
Bug 42308: Create README for tor-browser.
We drop the README.txt that comes from Mozilla Firefox and add README.md
for tor-browser.
- - - - -
34d7d745 by Richard Pospesel at 2024-01-15T19:24:16+01:00
Bug 41649: Create rebase and security backport gitlab issue templates
- - - - -
b2f8ed8c by Richard Pospesel at 2024-01-15T19:24:24+01:00
Bug 41089: Add tor-browser build scripts + Makefile to tor-browser
- - - - -
d6dd7613 by Pier Angelo Vendrame at 2024-01-15T19:24:24+01:00
fixup! Bug 41089: Add tor-browser build scripts + Makefile to tor-browser
Bug 42343: Read built-in bridges from pt_config.json instead of
preferences.
Do not copy the bridges anymore when doing the deploy.
- - - - -
87e17f2f by Henry Wilkes at 2024-01-15T19:24:25+01:00
Bug 41803: Add some developer tools for working on tor-browser.
- - - - -
3394ce41 by Kathy Brade at 2024-01-15T19:24:25+01:00
Bug 11641: Disable remoting by default.
Unless the -osint command line flag is used, the browser now defaults
to the equivalent of -no-remote. There is a new -allow-remote flag that
may be used to restore the original (Firefox-like) default behavior.
- - - - -
31331f13 by Alex Catarineu at 2024-01-15T19:24:25+01:00
Add TorStrings module for localization
- - - - -
04088626 by Henry Wilkes at 2024-01-15T19:24:26+01:00
Tor Browser strings
This commit adds all the strings needed for Tor Browser patches.
- - - - -
c98c33e7 by Henry Wilkes at 2024-01-15T19:24:26+01:00
Tor Browser localization migration scripts.
- - - - -
925964b2 by Mike Perry at 2024-01-15T19:24:26+01:00
Bug 2176: Rebrand Firefox to TorBrowser
See also Bugs #5194, #7187, #8115, #8219.
This patch does some basic renaming of Firefox to TorBrowser. The rest of the
branding is done by images and icons.
Also fix bug 27905.
Bug 25702: Update Tor Browser icon to follow design guidelines
- Updated all of the branding in /browser/branding/official with new 'stable'
icon series.
- Updated /extensions/onboarding/content/img/tor-watermark.png with new icon and
add the source svg in the same directory
- Copied /browser/branding/official over /browser/branding/nightly and the new
/browser/branding/alpha directories. Replaced content with 'nightly' and
'alpha' icon series.
Updated VisualElements_70.png and VisualElements_150.png with updated icons in
each branding directory (fixes #22654)
- Updated firefox.VisualElementsManfiest.xml with updated colors in each
branding directory
- Added firefox.svg to each branding directory from which all the other icons
are derived (apart from document.icns and document.ico)
- Added default256.png and default512.png icons
- Updated aboutTBUpdate.css to point to branding-aware icon128.png and removed
original icon
- Use the Tor Browser icon within devtools/client/themes/images/.
Bug 30631: Blurry Tor Browser icon on macOS app switcher
It would seem the png2icns tool does not generate correct icns files and
so on macOS the larger icons were missing resulting in blurry icons in
the OS chrome. Regenerated the padded icons in a macOS VM using
iconutil.
Bug 28196: preparations for using torbutton tor-browser-brand.ftl
A small change to Fluent FileSource class is required so that we
can register a new source without its supported locales being
counted as available locales for the browser.
Bug 31803: Replaced about:debugging logo with flat version
Bug 21724: Make Firefox and Tor Browser distinct macOS apps
When macOS opens a document or selects a default browser, it sometimes
uses the CFBundleSignature. Changing from the Firefox MOZB signature to
a different signature TORB allows macOS to distinguish between Firefox
and Tor Browser.
Bug 32092: Fix Tor Browser Support link in preferences
For bug 40562, we moved onionPattern* from bug 27476 to here, as
about:tor needs these files but it is included earlier.
Bug 41278: Create Tor Browser styled pdf logo similar to the vanilla Firefox one
Bug 42088: New application icons (used in-app and on linux).
Bug 42087: New application icons (windows).
- - - - -
b0bb6022 by sanketh at 2024-01-15T19:24:27+01:00
Bug 40209: Implement Basic Crypto Safety
Adds a CryptoSafety actor which detects when you've copied a crypto
address from a HTTP webpage and shows a warning.
Closes #40209.
Bug 40428: Fix string attribute names
- - - - -
35765829 by Mike Perry at 2024-01-15T19:24:27+01:00
TB3: Tor Browser's official .mozconfigs.
Also:
Add an --enable-tor-browser-data-outside-app-dir configure option
Add --with-tor-browser-version configure option
Bug 31457: disable per-installation profiles
The dedicated profiles (per-installation) feature does not interact
well with our bundled profiles on Linux and Windows, and it also causes
multiple profiles to be created on macOS under TorBrowser-Data.
Bug 31935: Disable profile downgrade protection.
Since Tor Browser does not support more than one profile, disable
the prompt and associated code that offers to create one when a
version downgrade situation is detected.
Add --enable-tor-browser-update build option
Bug 40793: moved Tor configuration options from old-configure.in to moz.configure
Bug 41584: Move some configuration options to base-browser level
- - - - -
d37c34a6 by Henry Wilkes at 2024-01-15T19:24:27+01:00
Bug 41340: Enable TOR_BROWSER_NIGHTLY_BUILD features for dev and nightly builds
tor-browser#41285: Enable fluent warnings.
- - - - -
989926e9 by Pier Angelo Vendrame at 2024-01-15T19:24:28+01:00
Bug 40562: Added Tor Browser preferences to 000-tor-browser.js
Before reordering patches, we used to keep the Tor-related patches
(torbutton and tor-launcher) at the beginning.
After that issue, we decided to move them towards the end.
In addition to that, we have decided to move Tor Browser-only
preferences there, too, to make Base Browser-only fixups easier to
apply.
- - - - -
29c1af75 by Pier Angelo Vendrame at 2024-01-15T19:24:28+01:00
fixup! Bug 40562: Added Tor Browser preferences to 000-tor-browser.js
Bug 42343: Read built-in bridges from pt_config.json instead of
preferences.
Remove some preferences we do not use anymore and their documentation.
- - - - -
8b8d023a by Pier Angelo Vendrame at 2024-01-15T19:24:28+01:00
Bug 13252: Customize profile management on macOS
On macOS we allow both portable mode and system installation.
However, in the latter case, we customize Firefox's directories to
match the hierarchy we use for the portable mode.
Also, display an informative error message if the TorBrowser-Data
directory cannot be created due to an "access denied" or a
"read only volume" error.
- - - - -
5b42f7da by Pier Angelo Vendrame at 2024-01-15T19:24:29+01:00
Bug 40933: Add tor-launcher functionality
Bug 41926: Reimplement the control port
- - - - -
97d585b0 by Henry Wilkes at 2024-01-15T19:24:29+01:00
fixup! Bug 40933: Add tor-launcher functionality
Bug 42340: Stop adding #currentBridge to the TorBridgeChanged
notification data, since it is converted into a string.
- - - - -
792a7dfb by Pier Angelo Vendrame at 2024-01-15T19:24:29+01:00
fixup! Bug 40933: Add tor-launcher functionality
Removed a redundant wrappedJSObject that broke stuff.
- - - - -
53b0cddc by Richard Pospesel at 2024-01-15T19:24:30+01:00
Bug 40597: Implement TorSettings module
- migrated in-page settings read/write implementation from about:preferences#tor
to the TorSettings module
- TorSettings initially loads settings from the tor daemon, and saves them to
firefox prefs
- TorSettings notifies observers when a setting has changed; currently only
QuickStart notification is implemented for parity with previous preference
notify logic in about:torconnect and about:preferences#tor
- about:preferences#tor, and about:torconnect now read and write settings
thorugh the TorSettings module
- all tor settings live in the torbrowser.settings.* preference branch
- removed unused pref modify permission for about:torconnect content page from
AsyncPrefs.jsm
Bug 40645: Migrate Moat APIs to Moat.jsm module
- - - - -
c46ed903 by Pier Angelo Vendrame at 2024-01-15T19:24:30+01:00
fixup! Bug 40597: Implement TorSettings module
Convert TorSettings to an ES class.
- - - - -
8fac3d98 by Pier Angelo Vendrame at 2024-01-15T19:24:30+01:00
fixup! Bug 40597: Implement TorSettings module
Replace _ with # for private stuff in TorSettings.
- - - - -
4f53c226 by Pier Angelo Vendrame at 2024-01-15T19:24:30+01:00
fixup! Bug 40597: Implement TorSettings module
Bug 42343: Read built-in bridges from pt_config.json instead of
preferences.
- - - - -
8870fba8 by Pier Angelo Vendrame at 2024-01-15T19:24:31+01:00
fixup! Bug 40597: Implement TorSettings module
Added checks on TorSettings.initialized, and some documentation
improvements.
- - - - -
b0076a91 by Pier Angelo Vendrame at 2024-01-15T19:24:31+01:00
fixup! Bug 40597: Implement TorSettings module
Batch of changes requested in the MR.
- - - - -
e6a6de19 by Pier Angelo Vendrame at 2024-01-15T19:24:31+01:00
fixup! Bug 40597: Implement TorSettings module
Bug 42359: Handle firewall and proxy in setSettings.
- - - - -
3f0efca2 by Pier Angelo Vendrame at 2024-01-15T19:24:32+01:00
fixup! Bug 40597: Implement TorSettings module
Bug 42358: Extract the domain fronting request functionality form MoatRPC.
- - - - -
e5a43ae9 by Pier Angelo Vendrame at 2024-01-15T19:24:34+01:00
fixup! Bug 40597: Implement TorSettings module
Bug 42348: Do not use TorSettings.defaultSettings as a starting point
for the settings object we receive from Moat.
Also, removed the TODO about proxy and firewall, since Moat is not
going to send them for now, but throw when we do not receive bridge
settings.
- - - - -
113e9f9b by Arthur Edelstein at 2024-01-15T19:24:34+01:00
Bug 3455: Add DomainIsolator, for isolating circuit by domain.
Add an XPCOM component that registers a ProtocolProxyChannelFilter
which sets the username/password for each web request according to
url bar domain.
Bug 9442: Add New Circuit button
Bug 13766: Set a 10 minute circuit dirty timeout for the catch-all circ.
Bug 19206: Include a 128 bit random tag as part of the domain isolator nonce.
Bug 19206: Clear out the domain isolator state on `New Identity`.
Bug 21201.2: Isolate by firstPartyDomain from OriginAttributes
Bug 21745: Fix handling of catch-all circuit
Bug 41741: Refactor the domain isolator and new circuit
- - - - -
eec5f321 by Pier Angelo Vendrame at 2024-01-15T19:24:34+01:00
fixup! Bug 3455: Add DomainIsolator, for isolating circuit by domain.
Bug 42338: Make TorDomainIsolator.newCircuitForDomain public again
- - - - -
8ff709e1 by Henry Wilkes at 2024-01-15T19:24:35+01:00
Bug 41600: Add a tor circuit display panel.
- - - - -
130882cc by Pier Angelo Vendrame at 2024-01-15T19:24:35+01:00
Bug 42247: Android helpers for the TorProvider
GeckoView is missing some API we use on desktop for the integration
with the tor daemon, such as subprocess.
Therefore, we need to implement them in Java and plumb the data
back and forth between JS and Java.
- - - - -
be7f5cf9 by Pier Angelo Vendrame at 2024-01-15T19:24:35+01:00
fixup! Bug 42247: Android helpers for the TorProvider
Some wiring for TorSettings and TorConnect stuff and fixes to the one I
created previously.
- - - - -
49c1786e by Dan Ballard at 2024-01-15T19:24:36+01:00
fixup! Bug 42247: Android helpers for the TorProvider
Bug 42301: fix and implement loading settings and saving them to TorSettings.sys.mjs from Java
- - - - -
972359d7 by Pier Angelo Vendrame at 2024-01-15T19:24:36+01:00
fixup! Bug 42247: Android helpers for the TorProvider
Bug 42251: Wired bootstrap updates.
- - - - -
2511a1c1 by Dan Ballard at 2024-01-15T19:24:36+01:00
fixup! Bug 42247: Android helpers for the TorProvider
Fix settings loading issues and saving
- - - - -
ffdae1ad by Pier Angelo Vendrame at 2024-01-15T19:24:37+01:00
fixup! Bug 42247: Android helpers for the TorProvider
Fix bridge migration.
- - - - -
81de0756 by hackademix at 2024-01-15T19:24:37+01:00
Bug 8324: Prevent DNS proxy bypasses caused by Drag&Drop
Bug 41613: Skip Drang & Drop filtering for DNS-safe URLs
- - - - -
8c4f8b19 by Amogh Pradeep at 2024-01-15T19:24:37+01:00
Orfox: Centralized proxy applied to AbstractCommunicator and BaseResources.
See Bug 1357997 for partial uplift.
Also:
Bug 28051 - Use our Orbot for proxying our connections
Bug 31144 - ESR68 Network Code Review
- - - - -
aaf3efd7 by Matthew Finkel at 2024-01-15T19:24:38+01:00
Bug 25741: TBA: Disable GeckoNetworkManager
The browser should not need information related to the network
interface or network state, tor should take care of that.
- - - - -
e7406754 by Kathy Brade at 2024-01-15T19:24:38+01:00
Bug 14631: Improve profile access error messages.
Instead of always reporting that the profile is locked, display specific
messages for "access denied" and "read-only file system".
To allow for localization, get profile-related error strings from Torbutton.
Use app display name ("Tor Browser") in profile-related error alerts.
- - - - -
22d0721f by Pier Angelo Vendrame at 2024-01-15T19:24:38+01:00
Bug 40807: Added QRCode.js to toolkit/modules
- - - - -
17d6c457 by Richard Pospesel at 2024-01-15T19:24:39+01:00
Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection
This patch adds a new about:preferences#connection page which allows
modifying bridge, proxy, and firewall settings from within Tor Browser.
All of the functionality present in tor-launcher's Network
Configuration panel is present:
- Setting built-in bridges
- Requesting bridges from BridgeDB via moat
- Using user-provided bridges
- Configuring SOCKS4, SOCKS5, and HTTP/HTTPS proxies
- Setting firewall ports
- Viewing and Copying Tor's logs
- The Networking Settings in General preferences has been removed
Bug 40774: Update about:preferences page to match new UI designs
- - - - -
154b5046 by Henry Wilkes at 2024-01-15T19:24:39+01:00
fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection
Bug 42340: Stop reading the TorBridgeChanged data argument. This was
always a string before, rather than a NodeData object.
- - - - -
b878e3c7 by Pier Angelo Vendrame at 2024-01-15T19:24:39+01:00
fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection
Bug 42343: Read built-in bridges from pt_config.json instead of
preferences.
Update the way in which we query the PTs we have bundled bridge lines
for.
- - - - -
387831ad by Richard Pospesel at 2024-01-15T19:24:40+01:00
Bug 27476: Implement about:torconnect captive portal within Tor Browser
- implements new about:torconnect page as tor-launcher replacement
- adds new torconnect component to browser
- tor process management functionality remains implemented in tor-launcher through the TorProtocolService module
- adds warning/error box to about:preferences#tor when not connected to tor
Bug 40773: Update the about:torconnect frontend page to match additional UI flows.
Bug 41608: Add a toolbar status button and a urlbar "Connect" button.
- - - - -
d6184984 by Pier Angelo Vendrame at 2024-01-15T19:24:40+01:00
Temporary changes to about:torconnect for Android.
We are planning of tempoorarily using about:torconnect on Android, until
the native UX is ready.
- - - - -
3398c106 by Pier Angelo Vendrame at 2024-01-15T19:24:40+01:00
fixup! Temporary changes to about:torconnect for Android.
Temporary message to open Android settings from about:torconnect
- - - - -
1f5a1b4f by Henry Wilkes at 2024-01-15T19:24:41+01:00
Bug 7494: Create local home page for TBB.
Bug 41333: Update about:tor to new design. Including:
+ make the favicon match the branding icon.
+ make the location bar show a search icon.
- - - - -
91e1a7a2 by Arthur Edelstein at 2024-01-15T19:24:41+01:00
Bug 12620: TorBrowser regression tests
Regression tests for Bug #2950: Make Permissions Manager memory-only
Regression tests for TB4: Tor Browser's Firefox preference overrides.
Note: many more functional tests could be made here
Regression tests for #2874: Block Components.interfaces from content
Bug 18923: Add a script to run all Tor Browser specific tests
Regression tests for Bug #16441: Suppress "Reset Tor Browser" prompt.
- - - - -
d96de104 by Pier Angelo Vendrame at 2024-01-15T19:24:41+01:00
Bug 41668: Tweaks to the Base Browser updater for Tor Browser
This commit was once part of "Bug 4234: Use the Firefox Update Process
for Tor Browser.".
However, some parts of it were not needed for Base Browser and some
derivative browsers.
Therefore, we extracted from that commit the parts for Tor Browser
legacy, and we add them back to the patch set with this commit.
- - - - -
b69e0060 by Kathy Brade at 2024-01-15T19:24:42+01:00
Bug 12647: Support symlinks in the updater.
- - - - -
c48f5aa2 by Kathy Brade at 2024-01-15T19:24:42+01:00
Bug 19121: reinstate the update.xml hash check
This is a partial revert of commit f1241db6986e4b54473a1ed870f7584c75d51122.
Revert most changes from Mozilla Bug 862173 "don't verify mar file hash
when using mar signing to verify the mar file (lessens main thread I/O)."
We kept the addition to the AppConstants API in case other JS code
references it in the future.
- - - - -
5e55fa6e by Kathy Brade at 2024-01-15T19:24:42+01:00
Bug 16940: After update, load local change notes.
Add an about:tbupdate page that displays the first section from
TorBrowser/Docs/ChangeLog.txt and includes a link to the remote
post-update page (typically our blog entry for the release).
Always load about:tbupdate in a content process, but implement the
code that reads the file system (changelog) in the chrome process
for compatibility with future sandboxing efforts.
Also fix bug 29440. Now about:tbupdate is styled as a fairly simple
changelog page that is designed to be displayed via a link that is on
about:tor.
- - - - -
9ff00011 by Georg Koppen at 2024-01-15T19:24:42+01:00
Bug 32658: Create a new MAR signing key
It's time for our rotation again: Move the backup key in the front
position and add a new backup key.
Bug 33803: Move our primary nightly MAR signing key to tor-browser
Bug 33803: Add a secondary nightly MAR signing key
- - - - -
35a0883d by Mike Perry at 2024-01-15T19:24:43+01:00
Omnibox: Add DDG, Startpage, Disconnect, Youtube, Twitter; remove Amazon, eBay, bing
eBay and Amazon don't treat Tor users very well. Accounts often get locked and
payments reversed.
Also:
Bug 16322: Update DuckDuckGo search engine
We are replacing the clearnet URL with an onion service one (thanks to a
patch by a cypherpunk) and are removing the duplicated DDG search
engine. Duplicating DDG happend due to bug 1061736 where Mozilla
included DDG itself into Firefox. Interestingly, this caused breaking
the DDG search if JavaScript is disabled as the Mozilla engine, which
gets loaded earlier, does not use the html version of the search page.
Moreover, the Mozilla engine tracked where the users were searching from
by adding a respective parameter to the search query. We got rid of that
feature as well.
Also:
This fixes bug 20809: the DuckDuckGo team has changed its server-side
code in a way that lets users with JavaScript enabled use the default
landing page while those without JavaScript available get redirected
directly to the non-JS page. We adapt the search engine URLs
accordingly.
Also fixes bug 29798 by making sure we only specify the Google search
engine we actually ship an .xml file for.
Also regression tests.
squash! Omnibox: Add DDG, Startpage, Disconnect, Youtube, Twitter; remove Amazon, eBay, bing
Bug 40494: Update Startpage search provider
squash! Omnibox: Add DDG, Startpage, Disconnect, Youtube, Twitter; remove Amazon, eBay, bing
Bug 40438: Add Blockchair as a search engine
Bug 33342: Avoid disconnect search addon error after removal.
We removed the addon in #32767, but it was still being loaded
from addonStartup.json.lz4 and throwing an error on startup
because its resource: location is not available anymore.
- - - - -
f97c1564 by Alex Catarineu at 2024-01-15T19:24:43+01:00
Bug 40073: Disable remote Public Suffix List fetching
In https://bugzilla.mozilla.org/show_bug.cgi?id=1563246 Firefox implemented
fetching the Public Suffix List via RemoteSettings and replacing the default
one at runtime, which we do not want.
- - - - -
f1dc38c5 by Henry Wilkes at 2024-01-15T19:24:43+01:00
Bug 41906: Hide DNS over HTTPS preferences.
- - - - -
58b5b4ed by Richard Pospesel at 2024-01-15T19:24:44+01:00
Bug 23247: Communicating security expectations for .onion
Encrypting pages hosted on Onion Services with SSL/TLS is redundant
(in terms of hiding content) as all traffic within the Tor network is
already fully encrypted. Therefore, serving HTTP pages from an Onion
Service is more or less fine.
Prior to this patch, Tor Browser would mostly treat pages delivered
via Onion Services as well as pages delivered in the ordinary fashion
over the internet in the same way. This created some inconsistencies
in behaviour and misinformation presented to the user relating to the
security of pages delivered via Onion Services:
- HTTP Onion Service pages did not have any 'lock' icon indicating
the site was secure
- HTTP Onion Service pages would be marked as unencrypted in the Page
Info screen
- Mixed-mode content restrictions did not apply to HTTP Onion Service
pages embedding Non-Onion HTTP content
This patch fixes the above issues, and also adds several new 'Onion'
icons to the mix to indicate all of the various permutations of Onion
Services hosted HTTP or HTTPS pages with HTTP or HTTPS content.
Strings for Onion Service Page Info page are pulled from Torbutton's
localization strings.
- - - - -
a98f84b7 by Pier Angelo Vendrame at 2024-01-15T19:24:44+01:00
fixup! Bug 23247: Communicating security expectations for .onion
Bug 42334: Adapt our self-signed patch to Bug 1611381
Bug 1611381 introduced a few changes to catch more self-signed
certificates. As a result, we risk of accepting some cases different
than unknown issuer for .onion certificates, such as bad signature or
invalid use for a certificate.
It makes sense to still display an error for such cases, and to keep
accepting only unknown issuers.
- - - - -
e72c017b by Kathy Brade at 2024-01-15T19:24:44+01:00
Bug 30237: Add v3 onion services client authentication prompt
When Tor informs the browser that client authentication is needed,
temporarily load about:blank instead of about:neterror and prompt
for the user's key.
If a correctly formatted key is entered, use Tor's ONION_CLIENT_AUTH_ADD
control port command to add the key (via Torbutton's control port
module) and reload the page.
If the user cancels the prompt, display the standard about:neterror
"Unable to connect" page. This requires a small change to
browser/actors/NetErrorChild.jsm to account for the fact that the
docShell no longer has the failedChannel information. The failedChannel
is used to extract TLS-related error info, which is not applicable
in the case of a canceled .onion authentication prompt.
Add a leaveOpen option to PopupNotifications.show so we can display
error messages within the popup notification doorhanger without
closing the prompt.
Add support for onion services strings to the TorStrings module.
Add support for Tor extended SOCKS errors (Tor proposal 304) to the
socket transport and SOCKS layers. Improved display of all of these
errors will be implemented as part of bug 30025.
Also fixes bug 19757:
Add a "Remember this key" checkbox to the client auth prompt.
Add an "Onion Services Authentication" section within the
about:preferences "Privacy & Security section" to allow
viewing and removal of v3 onion client auth keys that have
been stored on disk.
Also fixes bug 19251: use enhanced error pages for onion service errors.
- - - - -
c5ab1f20 by Alex Catarineu at 2024-01-15T19:24:45+01:00
Bug 21952: Implement Onion-Location
Whenever a valid Onion-Location HTTP header (or corresponding HTML
<meta> http-equiv attribute) is found in a document load, we either
redirect to it (if the user opted-in via preference) or notify the
presence of an onionsite alternative with a badge in the urlbar.
- - - - -
ce807a3b by Pier Angelo Vendrame at 2024-01-15T19:24:45+01:00
Bug 40458: Implement .tor.onion aliases
We have enabled HTTPS-Only mode, therefore we do not need
HTTPS-Everywhere anymore.
However, we want to keep supporting .tor.onion aliases (especially for
securedrop).
Therefore, in this patch we implemented the parsing of HTTPS-Everywhere
rulesets, and the redirect of .tor.onion domains.
Actually, Tor Browser believes they are actual domains. We change them
on the fly on the SOCKS proxy requests to resolve the domain, and on
the code that verifies HTTPS certificates.
- - - - -
936aade1 by hackademix at 2024-01-15T19:24:45+01:00
fixup! Bug 40458: Implement .tor.onion aliases
Bug 42099: Blind cross-site .onion requests.
- - - - -
d3a5ac48 by guest475646844 at 2024-01-15T19:24:46+01:00
fixup! Bug 40458: Implement .tor.onion aliases
- - - - -
0a1b141b by Pier Angelo Vendrame at 2024-01-15T19:24:46+01:00
Bug 11698: Incorporate Tor Browser Manual pages into Tor Browser
This patch associates the about:manual page to a translated page that
must be injected to browser/omni.ja after the build.
The content must be placed in chrome/browser/content/browser/manual/, so
that is then available at chrome://browser/content/manual/.
We preferred giving absolute freedom to the web team, rather than having
to change the patch in case of changes on the documentation.
- - - - -
55d75aa4 by Pier Angelo Vendrame at 2024-01-15T19:24:46+01:00
Bug 41435: Add a Tor Browser migration function
For now this function only deletes old language packs for which we are
already packaging the strings with the application.
- - - - -
ba9e4d4c by Henry Wilkes at 2024-01-15T19:24:47+01:00
Bug 42110: Add TorUIUtils module for common tor component methods.
- - - - -
132f66f4 by Dan Ballard at 2024-01-15T19:24:47+01:00
Bug 40701: Add security warning when downloading a file
Shown in the downloads panel, about:downloads and places.xhtml.
- - - - -
e526d26f by Henry Wilkes at 2024-01-15T19:24:47+01:00
Bug 41736: Customize toolbar for tor-browser.
- - - - -
041194cb by hackademix at 2024-01-15T19:24:48+01:00
Bug 41728: Pin bridges.torproject.org domains to Let's Encrypt's root cert public key
- - - - -
28b0d051 by Henry Wilkes at 2024-01-15T19:24:48+01:00
Customize moz-toggle for tor-browser.
- - - - -
7d0f9930 by Richard Pospesel at 2024-01-15T19:24:51+01:00
Bug 41822: Unconditionally disable default browser UX in about:preferences
- - - - -
db3708e2 by Pier Angelo Vendrame at 2024-01-15T19:24:51+01:00
Add built-in bridge lines for Android.
Temporary workaround for 13.5a3.
We chould revert once tor-browser!877 is merged.
- - - - -
30 changed files:
- .eslintignore
- .gitignore
- + .gitlab/issue_templates/Backport Android Security Fixes.md
- + .gitlab/issue_templates/Rebase Browser - Alpha.md
- + .gitlab/issue_templates/Rebase Browser - Stable.md
- + .gitlab/issue_templates/bug.md
- + .gitlab/merge_request_templates/default.md
- + README.md
- − README.txt
- accessible/android/SessionAccessibility.cpp
- accessible/android/SessionAccessibility.h
- accessible/ipc/DocAccessibleParent.cpp
- accessible/ipc/DocAccessibleParent.h
- accessible/ipc/moz.build
- + browser/actors/AboutTBUpdateChild.jsm
- + browser/actors/AboutTBUpdateParent.jsm
- + browser/actors/CryptoSafetyChild.jsm
- + browser/actors/CryptoSafetyParent.jsm
- − browser/actors/RFPHelperChild.sys.mjs
- − browser/actors/RFPHelperParent.sys.mjs
- browser/actors/moz.build
- browser/app/Makefile.in
- browser/app/macbuild/Contents/Info.plist.in
- browser/app/macbuild/Contents/MacOS-files.in
- browser/app/moz.build
- browser/app/permissions
- + browser/app/profile/000-tor-browser.js
- + browser/app/profile/001-base-profile.js
- browser/app/profile/firefox.js
- browser/base/content/aboutDialog-appUpdater.js
The diff was not included because it is too large.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/45a553…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/45a553…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser] Pushed new tag mullvad-browser-115.7.0esr-13.0-1-build1
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed new tag mullvad-browser-115.7.0esr-13.0-1-build1 at The Tor Project / Applications / Mullvad Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/tree/mullv…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser][mullvad-browser-115.7.0esr-13.0-1] 19 commits: MB 38: Mullvad Browser configuration
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed to branch mullvad-browser-115.7.0esr-13.0-1 at The Tor Project / Applications / Mullvad Browser
Commits:
e0523287 by Pier Angelo Vendrame at 2024-01-15T18:19:12+01:00
MB 38: Mullvad Browser configuration
- - - - -
2a662dc4 by Pier Angelo Vendrame at 2024-01-15T18:19:13+01:00
MB 1: Mullvad Browser branding
See also:
mullvad-browser#5: Product name and directory customization
mullvad-browser#12: Create new branding directories and integrate Mullvad icons+branding
mullvad-browser#14: Remove Default Built-in bookmarks
mullvad-browser#35: Add custom PDF icons for Windows builds
mullvad-browser#48: Replace Mozilla copyright and legal trademarks in mullvadbrowser.exe metadata
mullvad-browser#51: Update trademark string
mullvad-browser#104: Update shipped dll metadata copyright/licensing info
mullvad-browser#107: Add alpha and nightly icons
- - - - -
8a7a3cdc by Pier Angelo Vendrame at 2024-01-15T18:19:13+01:00
MB 20: Allow packaged-addons in PBM.
We install a few addons from the distribution directory, but they are
not automatically enabled for PBM mode.
This commit modifies the code that installs them to also add the PBM
permission to the known ones.
- - - - -
d6b79e81 by Pier Angelo Vendrame at 2024-01-15T18:19:13+01:00
MB 63: Customize some about pages for Mullvad Browser
Also:
mullvad-browser#57: Purge unneeded about: pages
- - - - -
4d4d9ef8 by Pier Angelo Vendrame at 2024-01-15T18:19:14+01:00
MB 37: Customization for the about dialog
- - - - -
52d38b42 by Henry Wilkes at 2024-01-15T18:19:14+01:00
MB 39: Add home page about:mullvad-browser
- - - - -
2499efc0 by hackademix at 2024-01-15T18:19:14+01:00
MB 97: Remove UI cues to install new extensions.
- - - - -
9d9ac72a by hackademix at 2024-01-15T18:19:15+01:00
MB 47: uBlock Origin customization
- - - - -
33c82eaa by Pier Angelo Vendrame at 2024-01-15T18:19:15+01:00
MB 21: Disable the password manager
This commit disables the about:login page and removes the "Login and
Password" section of about:preferences.
We do not do anything to the real password manager of Firefox, that is
in toolkit: it contains C++ parts that make it difficult to actually
prevent it from being built..
Finally, we modify the the function that opens about:login to report an
error in the console so that we can quickly get a backtrace to the code
that tries to use it.
- - - - -
2901c13e by Pier Angelo Vendrame at 2024-01-15T18:19:15+01:00
MB 87: Disable the default browser box on Windows and Linux
Windows and Linux will be distributed only as portable apps at the
beginning, so they should not be settable as default browsers.
We will need to improve the logic once we decide to ship system-wide
installers, too.
- - - - -
b62427c4 by Pier Angelo Vendrame at 2024-01-15T18:19:16+01:00
MB 112: Updater customization for Mullvad Browser
MB 71: Set the updater base URL to Mullvad domain
- - - - -
30cef9bc by Nicolas Vigier at 2024-01-15T18:19:16+01:00
MB 79: Add Mullvad Browser MAR signing keys
- - - - -
a82b2c8c by Nicolas Vigier at 2024-01-15T18:19:16+01:00
squash! MB 79: Add Mullvad Browser MAR signing keys
MB 256: Add mullvad-browser nightly mar signing key
- - - - -
6d3bf80a by Pier Angelo Vendrame at 2024-01-15T18:19:17+01:00
MB 34: Hide unsafe and unwanted preferences UI
about:preferences allow to override some of our defaults, that could
be fingeprintable or have some other unwanted consequences.
- - - - -
5fb3b82b by Pier Angelo Vendrame at 2024-01-15T18:19:17+01:00
MB 160: Disable the cookie exceptions button
Besides disabling the "Delete on close checkbox", disable also the
"Manage Exceptions" button when always using PBM.
- - - - -
dbea70a8 by hackademix at 2024-01-15T18:19:18+01:00
MB 163: prevent uBlock Origin from being uninstalled/disabled
- - - - -
d2214c84 by Richard Pospesel at 2024-01-15T18:19:18+01:00
MB 188: Customize Gitlab Issue and Merge templates
- - - - -
3e79437f by rui hildt at 2024-01-15T18:19:18+01:00
MB 213: Customize the search engines list
- - - - -
9917db4f by hackademix at 2024-01-15T18:19:19+01:00
MB 214: Enable cross-tab identity leak protection in "quiet" mode
- - - - -
30 changed files:
- + .gitlab/issue_templates/Rebase Browser - Alpha.md
- + .gitlab/issue_templates/Rebase Browser - Stable.md
- .gitlab/merge_request_templates/default.md
- browser/app/Makefile.in
- browser/app/macbuild/Contents/Info.plist.in
- browser/app/module.ver
- browser/app/firefox.exe.manifest → browser/app/mullvadbrowser.exe.manifest
- + browser/app/profile/000-mullvad-browser.js
- browser/app/profile/001-base-profile.js
- browser/base/content/aboutDialog.xhtml
- browser/base/content/appmenu-viewcache.inc.xhtml
- browser/base/content/browser-menubar.inc
- browser/base/content/browser-places.js
- browser/base/content/browser.js
- browser/base/content/default-bookmarks.html
- browser/base/content/nsContextMenu.js
- browser/base/content/overrides/app-license.html
- browser/base/content/pageinfo/pageInfo.xhtml
- browser/base/content/utilityOverlay.js
- browser/branding/branding-common.mozbuild
- + browser/branding/mb-alpha/VisualElements_150.png
- + browser/branding/mb-alpha/VisualElements_70.png
- + browser/branding/mb-alpha/configure.sh
- + browser/branding/mb-alpha/content/about-logo.png
- + browser/branding/mb-alpha/content/about-logo.svg
- + browser/branding/mb-alpha/content/about-logo(a)2x.png
- + browser/branding/mb-alpha/content/about-wordmark.svg
- + browser/branding/mb-alpha/content/about.png
- + browser/branding/mb-alpha/content/aboutDialog.css
- + browser/branding/mb-alpha/content/firefox-wordmark.svg
The diff was not included because it is too large.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/2a…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/2a…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser][mullvad-browser-115.7.0esr-13.0-1] 97 commits: Bug 1819160 - Map Android ids to doc/accessible id pairs. r=Jamie
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed to branch mullvad-browser-115.7.0esr-13.0-1 at The Tor Project / Applications / Mullvad Browser
Commits:
9aa65468 by Eitan Isaacson at 2024-01-15T18:17:35+01:00
Bug 1819160 - Map Android ids to doc/accessible id pairs. r=Jamie
Differential Revision: https://phabricator.services.mozilla.com/D179737
- - - - -
2976578c by Pier Angelo Vendrame at 2024-01-15T18:17:37+01:00
Bug 1832523 - Allow using NSS to sign and verify MAR signatures. r=application-update-reviewers,glandium,bytesized
Allow using NSS for checking MAR signatures also in platforms where
OS-native APIs are used by default, i.e., macOS and Windows.
Differential Revision: https://phabricator.services.mozilla.com/D177743
- - - - -
dc127062 by Pier Angelo Vendrame at 2024-01-15T18:17:37+01:00
Bug 1849129: Prevent exceptions caused by extensions from interrupting the SearchService initialization. r=search-reviewers,Standard8
Differential Revision: https://phabricator.services.mozilla.com/D186456
- - - - -
b8c52ad1 by Emilio Cobos Álvarez at 2024-01-15T18:17:37+01:00
Bug 1853731 - Use html:img for message-bar-icon. r=Gijs,dao,settings-reviewers,desktop-theme-reviewers,sfoster
Differential Revision: https://phabricator.services.mozilla.com/D188521
- - - - -
18a41f64 by Pier Angelo Vendrame at 2024-01-15T18:17:38+01:00
Bug 1854117 - Sort the DLL blocklist flags. r=mossop,win-reviewers,gstoll
Differential Revision: https://phabricator.services.mozilla.com/D188716
- - - - -
5b9e0290 by Eden Chuang at 2024-01-15T18:17:38+01:00
Bug 1738426 - Ignoring status 206 and vary header checking for opaque response in Cache API. r=asuth
Differential Revision: https://phabricator.services.mozilla.com/D186431
- - - - -
504bbdd8 by edgul at 2024-01-15T18:17:38+01:00
Bug 1802057 - Block the following characters from use in the cookie name in the cookie string: 0x3B (semi-colon), 0x3D (equals), and 0x7F (del) r=dveditz,cookie-reviewers
Differential Revision: https://phabricator.services.mozilla.com/D182373
- - - - -
a81d2117 by Kelsey Gilbert at 2024-01-15T18:17:39+01:00
Bug 1819497 - Don't race on static bool for initialization. r=gfx-reviewers,aosmond
We could do non-racy static init here (e.g. with a static initializer
self-calling-closure), but there doesn't seem to be a strong reason for
this. Let's just use a switch and get robustness from -Werror=switch.
Differential Revision: https://phabricator.services.mozilla.com/D188054
- - - - -
f3caf97d by Mark Banner at 2024-01-15T18:17:39+01:00
Bug 1845752. r=ckerschb
Differential Revision: https://phabricator.services.mozilla.com/D186676
- - - - -
d00655c0 by Bob Owen at 2024-01-15T18:17:39+01:00
Bug 1850072: Initialize RecordedDrawTargetCreation::mHasExistingData. r=jrmuizel
This also specializes ElementStreamFormat for bool.
Differential Revision: https://phabricator.services.mozilla.com/D187794
- - - - -
4de67526 by Malte Juergens at 2024-01-15T18:17:40+01:00
Bug 1850200 - Add delay to HTTPS-Only "Continue to HTTPS Site" button r=freddyb
Differential Revision: https://phabricator.services.mozilla.com/D187887
- - - - -
53dcdc09 by Andreas Pehrson at 2024-01-15T18:17:40+01:00
Bug 1851803 - Introduce SourceMediaTrack::mDirectDisabledMode. r=karlt
Similar to MediaTrack::mDisabledMode, but this is for uses on the
SourceMediaTrack producer thread. It is still signaled via a control message
from the control thread to maintain order of operations, and is protected by the
SourceMediaTrack mutex.
Differential Revision: https://phabricator.services.mozilla.com/D187554
- - - - -
766bd0ad by Pier Angelo Vendrame at 2024-01-15T18:17:40+01:00
Bug 1860020 - Remove the assertion on the value of toolkit.telemetry.enabled. r=KrisWright,chutten
Bug 1444275 introduced an assertion on the parent process to check that
the value of toolkit.telemetry.enabled is the expected one.
However, this expected value could be different from the one set and
locked e.g. in some forks. Therefore, the assertion prevented debug
builds from working in these cases.
Differential Revision: https://phabricator.services.mozilla.com/D195080
- - - - -
d8192ef3 by Kagami Sascha Rosylight at 2024-01-15T18:17:41+01:00
Bug 1865238 - Use One UI Sans KR VF for Korean sans-serif font on Android r=jfkthame
Per /etc/fonts.xml, there are now only two `<family lang="ko">` nodes there:
* OneUISansKRVF series
* SECCJK series (but no KR postfix anymore?)
This patch uses One UI Sans KR VF as the replacement as this is newer and is a variable font (tested with https://codepen.io/SaschaNaz/pen/ExrdYXJ)
Differential Revision: https://phabricator.services.mozilla.com/D195078
- - - - -
5ee982dd by Henry Wilkes at 2024-01-15T18:17:41+01:00
Bug 41454: Move focus after calling openPreferences for a sub-category.
Temporary fix until mozilla bug 1799153 gets a patch upstream.
- - - - -
8501e4a0 by hackademix at 2024-01-15T18:17:41+01:00
Bug 42194: Fix blank net error page on failed DNS resolution with active proxy.
- - - - -
3acb45bc by Henry Wilkes at 2024-01-15T18:17:42+01:00
Bug 41483: Remove the firefox override for appstrings.properties
Remove this patch after upstream bugzilla bug 1790187
- - - - -
83438856 by Pier Angelo Vendrame at 2024-01-15T18:17:42+01:00
Bug 41116: Normalize system fonts.
System fonts are an enormous fingerprinting vector.
Even with font allow lists and with our custom configuration on Linux,
which counter metrics measurements, getComputedStyle leaks several
details.
This patch counters both these kinds of attacks.
- - - - -
90034928 by Marco Simonelli at 2024-01-15T18:17:43+01:00
Bug 41459: WebRTC fails to build under mingw (Part 1)
- properly define NOMINMAX for just MSVC builds
- - - - -
68b3b47d by Marco Simonelli at 2024-01-15T18:17:43+01:00
Bug 41459: WebRTC fails to build under mingw (Part 2)
- fixes required to build third_party/libwebrtc
- - - - -
edc8db35 by Marco Simonelli at 2024-01-15T18:17:43+01:00
Bug 41459: WebRTC fails to build under mingw (Part 3)
- fixes required to build third_party/sipcc
- - - - -
db192660 by Marco Simonelli at 2024-01-15T18:17:44+01:00
Bug 41459: WebRTC fails to build under mingw (Part 4)
- fixes requried to build netwerk/sctp
- - - - -
e6e4cc99 by Marco Simonelli at 2024-01-15T18:17:44+01:00
Bug 41459: WebRTC fails to build under mingw (Part 5)
- fixes required to build dom/media/webrtc
- - - - -
f9f2d661 by Marco Simonelli at 2024-01-15T18:17:44+01:00
Bug 41459: WebRTC fails to build under mingw (Part 6)
- fixes required to build dom/media/systemservices
- - - - -
b71a2aca by hackademix at 2024-01-15T18:17:45+01:00
Bug 41854: Allow overriding download spam protection.
- - - - -
27a3c437 by Gaba at 2024-01-15T18:17:45+01:00
Adding issue and merge request templates
- - - - -
5aafd4af by Pier Angelo Vendrame at 2024-01-15T18:17:45+01:00
Base Browser's .mozconfigs.
Bug 17858: Cannot create incremental MARs for hardened builds.
Define HOST_CFLAGS, etc. to avoid compiling programs such as mbsdiff
(which is part of mar-tools and is not distributed to end-users) with
ASan.
Bug 21849: Don't allow SSL key logging.
Bug 25741 - TBA: Disable features at compile-time
Define MOZ_ANDROID_NETWORK_STATE and MOZ_ANDROID_LOCATION
Bug 27623 - Export MOZILLA_OFFICIAL during desktop builds
This fixes a problem where some preferences had the wrong default value.
Also see bug 27472 where we made a similar fix for Android.
Bug 29859: Disable HLS support for now
Bug 30463: Explicitly disable MOZ_TELEMETRY_REPORTING
Bug 32493: Disable MOZ_SERVICES_HEALTHREPORT
Bug 33734: Set MOZ_NORMANDY to False
Bug 33851: Omit Parental Controls.
Bug 40252: Add --enable-rust-simd to our tor-browser mozconfig files
Bug 41584: Move some configuration options to base-browser level
- - - - -
33898a4b by Pier Angelo Vendrame at 2024-01-15T18:17:46+01:00
Tweaks to the build system
Bug 40857: Modified the fat .aar creation file
This is a workaround to build fat .aars with the compiling enviornment
disabled.
Mozilla does not use a similar configuration, but either runs a Firefox
build and discards its output, or uses artifacts build.
We might switch to artifact builds too, and drop this patch, or write a
better one to upstream. But until then we need this patch.
See also https://bugzilla.mozilla.org/show_bug.cgi?id=1763770.
Bug 41458: Prevent `mach package-multi-locale` from actually creating a package
macOS builds need some files to be moved around with
./mach package-multi-locale to create multi-locale packages.
The required command isn't exposed through any other mach command.
So, we patch package-multi-locale both to prevent it from failing when
doing official builds and to detect any future changes on it.
- - - - -
bd745e63 by Pier Angelo Vendrame at 2024-01-15T18:17:46+01:00
Bug 41108: Remove privileged macOS installation from 102
- - - - -
24ff518d by Dan Ballard at 2024-01-15T18:17:47+01:00
Bug 41149: Re-enable DLL injection protection in all builds not just nightlies
- - - - -
4166e5d6 by Matthew Finkel at 2024-01-15T18:17:47+01:00
Bug 24796: Comment out excess permissions from GeckoView
The GeckoView AndroidManifest.xml is not preprocessed unlike Fennec's
manifest, so we can't use the ifdef preprocessor guards around the
permissions we do not want. Commenting the permissions is the
next-best-thing.
- - - - -
57cd90f4 by Matthew Finkel at 2024-01-15T18:17:47+01:00
Bug 28125: Prevent non-Necko network connections
- - - - -
197de106 by Mike Perry at 2024-01-15T18:17:48+01:00
Bug 12974: Disable NTLM and Negotiate HTTP Auth
The Mozilla bugs: https://bugzilla.mozilla.org/show_bug.cgi?id=1046421,
https://bugzilla.mozilla.org/show_bug.cgi?id=1261591, tor-browser#27602
- - - - -
0e7e01a7 by Alex Catarineu at 2024-01-15T18:17:48+01:00
Bug 40166: Disable security.certerrors.mitm.auto_enable_enterprise_roots
Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1768899
- - - - -
b98549a6 by Georg Koppen at 2024-01-15T18:17:48+01:00
Bug 16285: Exclude ClearKey system for now
In the past the ClearKey system had not been compiled when specifying
--disable-eme. But that changed and it is even bundled nowadays (see:
Mozilla's bug 1300654). We don't want to ship it right now as the use
case for it is not really visible while the code had security
vulnerabilities in the past.
- - - - -
aa703bd7 by Kathy Brade at 2024-01-15T18:17:49+01:00
Bug 21431: Clean-up system extensions shipped in Firefox
Only ship the pdfjs extension.
- - - - -
757680f3 by Kathy Brade at 2024-01-15T18:17:49+01:00
Bug 33852: Clean up about:logins (LockWise) to avoid mentioning sync, etc.
Hide elements on about:logins that mention sync, "Firefox LockWise", and
Mozilla's LockWise mobile apps.
Disable the "Create New Login" button when security.nocertdb is true.
- - - - -
b4a754bb by Alex Catarineu at 2024-01-15T18:17:49+01:00
Bug 41457: Remove Mozilla permissions
Bug 40025: Remove Mozilla add-on install permissions
- - - - -
9b53dc57 by Kathy Brade at 2024-01-15T18:17:50+01:00
Bug 40002: Remove about:ion
Firefox Ion (previously Firefox Pioneer) is an opt-in program in which people
volunteer to participate in studies that collect detailed, sensitive data about
how they use their browser.
Bug 41662: Disable about:sync-logs
Even though we disable sync by default with
`identity.fxaccounts.enabled`, this about: page is still avilable.
We could throw an exception on the constructor of the related
component, but it would result only in an error in the console, without
a visible "this address does not look right" error page.
If we fix the issues with MOZ_SERVICES_SYNC, we can restore the
component.
- - - - -
35256850 by Arthur Edelstein at 2024-01-15T18:17:50+01:00
Bug 26353: Prevent speculative connect that violated FPI.
Connections were observed in the catch-all circuit when
the user entered an https or http URL in the URL bar, or
typed a search term.
- - - - -
424b55e3 by Alex Catarineu at 2024-01-15T18:17:50+01:00
Bug 31740: Remove some unnecessary RemoteSettings instances
More concretely, SearchService.jsm 'hijack-blocklists' and
url-classifier-skip-urls.
Avoid creating instance for 'anti-tracking-url-decoration'.
If prefs are disabling their usage, avoid creating instances for
'cert-revocations' and 'intermediates'.
Do not ship JSON dumps for collections we do not expect to need. For
the ones in the 'main' bucket, this prevents them from being synced
unnecessarily (the code in remote-settings does so for collections
in the main bucket for which a dump or local data exists). For the
collections in the other buckets, we just save some size by not
shipping their dumps.
We also clear the collections database on the v2 -> v3 migration.
- - - - -
bd1f5d46 by cypherpunks1 at 2024-01-15T18:17:51+01:00
Bug 41092: Add a RemoteSettings JSON dump for query-stripping
- - - - -
7df0cab9 by Pier Angelo Vendrame at 2024-01-15T18:17:55+01:00
Bug 41635: Disable the Normandy component
Do not include Normandy at all whenever MOZ_NORMANDY is False.
- - - - -
4cb38cf9 by Georg Koppen at 2024-01-15T18:17:55+01:00
Bug 30541: Disable WebGL readPixel() for web content
Related Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1428034
- - - - -
bd77b4e6 by Alex Catarineu at 2024-01-15T18:17:56+01:00
Bug 28369: Stop shipping pingsender executable
- - - - -
dc179de2 by cypherpunks1 at 2024-01-15T18:17:56+01:00
Bug 41568: Disable LaterRun
- - - - -
b57a7b23 by cypherpunks1 at 2024-01-15T18:17:56+01:00
Bug 40717: Hide Windows SSO in settings
- - - - -
49ea759c by Pier Angelo Vendrame at 2024-01-15T18:17:57+01:00
Bug 41599: Always return an empty string as network ID
Firefox computes an internal network ID used to detect network changes
and act consequently (e.g., to improve WebSocket UX).
However, there are a few ways to get this internal network ID, so we
patch them out, to be sure any new code will not be able to use them and
possibly link users.
We also sent a patch to Mozilla to seed the internal network ID, to
prevent any accidental leak in the future.
Upstream: https://bugzilla.mozilla.org/show_bug.cgi?id=1817756
- - - - -
7b3b270e by cypherpunks1 at 2024-01-15T18:17:57+01:00
Bug 40175: Add origin attributes to about:reader top-level requests
- - - - -
40898b73 by Richard Pospesel at 2024-01-15T18:17:57+01:00
Bug 41327: Disable UrlbarProviderInterventions
- - - - -
efdd96e8 by Richard Pospesel at 2024-01-15T18:17:58+01:00
Bug 42037: Disable about:firefoxview page
- - - - -
76a7bd05 by Mike Perry at 2024-01-15T18:17:58+01:00
Firefox preference overrides.
This hack directly includes our preference changes in omni.ja.
Bug 18292: Staged updates fail on Windows
Temporarily disable staged updates on Windows.
Bug 18297: Use separate Noto JP,KR,SC,TC fonts
Bug 23404: Add Noto Sans Buginese to the macOS whitelist
Bug 23745: Set dom.indexedDB.enabled = true
Bug 13575: Disable randomised Firefox HTTP cache decay user tests.
(Fernando Fernandez Mancera <ffmancera(a)riseup.net>)
Bug 17252: Enable session identifiers with FPI
Session tickets and session identifiers were isolated
by OriginAttributes, so we can re-enable them by
allowing the default value (true) of
"security.ssl.disable_session_identifiers".
The pref "security.enable_tls_session_tickets" is obsolete
(removed in https://bugzilla.mozilla.org/917049)
Bug 14952: Enable http/2 and AltSvc
In Firefox, SPDY/HTTP2 now uses Origin Attributes for
isolation of connections, push streams, origin frames, etc.
That means we get first-party isolation provided
"privacy.firstparty.isolate" is true. So in this patch, we
stop overriding "network.http.spdy.enabled" and
"network.http.spdy.enabled.http2".
Alternate Services also use Origin Attributes for isolation.
So we stop overriding
"network.http.altsvc.enabled" and "network.http.altsvc.oe"
as well.
(All 4 of the abovementioned "network.http.*" prefs adopt
Firefox 60ESR's default value of true.)
However, we want to disable HTTP/2 push for now, so we
set "network.http.spdy.allow-push" to false.
"network.http.spdy.enabled.http2draft" was removed in Bug 1132357.
"network.http.sped.enabled.v2" was removed in Bug 912550.
"network.http.sped.enabled.v3" was removed in Bug 1097944.
"network.http.sped.enabled.v3-1" was removed in Bug 1248197.
Bug 26114: addons.mozilla.org is not special
* Don't expose navigator.mozAddonManager on any site
* Don't block NoScript from modifying addons.mozilla.org or other sites
Enable ReaderView mode again (#27281).
Bug 29916: Make sure enterprise policies are disabled
Bug 2874: Block Components.interfaces from content
Bug 26146: Spoof HTTP User-Agent header for desktop platforms
In Tor Browser 8.0, the OS was revealed in both the HTTP User-Agent
header and to JavaScript code via navigator.userAgent. To avoid
leaking the OS inside each HTTP request (which many web servers
log), always use the Windows 7 OS value in the desktop User-Agent
header. We continue to allow access to the actual OS via JavaScript,
since doing so improves compatibility with web applications such
as GitHub and Google Docs.
Bug 12885: Windows Jump Lists fail for Tor Browser
Jumplist entries are stored in a binary file in:
%APPDATA%\\Microsoft\Windows\Recent\CustomDestinations\
and has a name in the form
[a-f0-9]+.customDestinations-ms
The hex at the front is unique per app, and is ultimately derived from
something called the 'App User Model ID' (AUMID) via some unknown
hashing method. The AUMID is provided as a key when programmatically
creating, updating, and deleting a jumplist. The default behaviour in
firefox is for the installer to define an AUMID for an app, and save it
in the registry so that the jumplist data can be removed by the
uninstaller.
However, the Tor Browser does not set this (or any other) regkey during
installation, so this codepath fails and the app's AUMID is left
undefined. As a result the app's AUMID ends up being defined by
windows, but unknowable by Tor Browser. This unknown AUMID is used to
create and modify the jumplist, but the delete API requires that we
provide the app's AUMID explicitly. Since we don't know what the AUMID
is (since the expected regkey where it is normally stored does not
exist) jumplist deletion will fail and we will leave behind a mostly
empty customDestinations-ms file. The name of the file is derived from
the binary path, so an enterprising person could reverse engineer how
that hex name is calculated, and generate the name for Tor Browser's
default Desktop installation path to determine whether a person had
used Tor Browser in the past.
The 'taskbar.grouping.useprofile' option that is enabled by this patch
works around this AUMID problem by having firefox.exe create it's own
AUMID based on the profile path (rather than looking for a regkey). This
way, if a user goes in and enables and disables jumplist entries, the
backing store is properly deleted.
Unfortunately, all windows users currently have this file lurking in
the above mentioned directory and this patch will not remove it since it
was created with an unknown AUMID. However, another patch could be
written which goes to that directory and deletes any item containing the
'Tor Browser' string. See bug 28996.
Bug 30845: Make sure default themes and other internal extensions are enabled
Bug 28896: Enable extensions in private browsing by default
Bug 31065: Explicitly allow proxying localhost
Bug 31598: Enable letterboxing
Disable Presentation API everywhere
Bug 21549 - Use Firefox's WASM default pref. It is disabled at safer
security levels.
Bug 32321: Disable Mozilla's MitM pings
Bug 19890: Disable installation of system addons
By setting the URL to "" we make sure that already installed system
addons get deleted as well.
Bug 22548: Firefox downgrades VP9 videos to VP8.
On systems where H.264 is not available or no HWA, VP9 is preferred. But in Tor
Browser 7.0 all youtube videos are degraded to VP8.
This behaviour can be turned off by setting media.benchmark.vp9.threshold to 0.
All clients will get better experience and lower traffic, beause TBB doesn't
use "Use hardware acceleration when available".
Bug 25741 - TBA: Add mobile-override of 000-tor-browser prefs
Bug 16441: Suppress "Reset Tor Browser" prompt.
Bug 29120: Use the in-memory media cache and increase its maximum size.
Bug 33697: use old search config based on list.json
Bug 33855: Ensure that site-specific browser mode is disabled.
Bug 30682: Disable Intermediate CA Preloading.
Bug 40061: Omit the Windows default browser agent from the build
Bug 40322: Consider disabling network.connectivity-service.enabled
Bug 40408: Disallow SVG Context Paint in all web content
Bug 40308: Disable network partitioning until we evaluate dFPI
Bug 40322: Consider disabling network.connectivity-service.enabled
Bug 40383: Disable dom.enable_event_timing
Bug 40423: Disable http/3
Bug 40177: Update prefs for Fx91esr
Bug 40700: Disable addons and features recommendations
Bug 40682: Disable network.proxy.allow_bypass
Bug 40736: Disable third-party cookies in PBM
Bug 19850: Enabled HTTPS-Only by default
Bug 40912: Hide the screenshot menu
Bug 41292: Disable moreFromMozilla in preferences page
Bug 40057: Ensure the CSS4 system colors are not a fingerprinting vector
Bug 24686: Set network.http.tailing.enabled to true
Bug 40183: Disable TLS ciphersuites using SHA-1
Bug 40783: Review 000-tor-browser.js and 001-base-profile.js for 102
We reviewed all the preferences we set for 102, and remove a few old
ones. See the description of that issue to see all the preferences we
believed were still valid for 102, and some brief description for the
reasons to keep them.
- - - - -
8563f850 by Richard Pospesel at 2024-01-15T18:17:59+01:00
Bug 41659: Add canonical color definitions to base-browser
- - - - -
403dca48 by Pier Angelo Vendrame at 2024-01-15T18:17:59+01:00
Bug 41043: Hardcode the UI font on Linux
The mechanism to choose the UI font does not play well with our
fontconfig configuration. As a result, the final criterion to choose
the font for the UI was its version.
Since we hardcode Arimo as a default sans-serif on preferences, we use
it also for the UI. FontConfig will fall back to some other font for
scripts Arimo does not cover as expected (we tested with Japanese).
- - - - -
eb080454 by Alex Catarineu at 2024-01-15T18:17:59+01:00
Bug 30605: Honor privacy.spoof_english in Android
This checks `privacy.spoof_english` whenever `setLocales` is
called from Fenix side and sets `intl.accept_languages`
accordingly.
Bug 40198: Expose privacy.spoof_english pref in GeckoView
- - - - -
596127d0 by Alex Catarineu at 2024-01-15T18:18:00+01:00
Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView
- - - - -
8b71beaa by Alex Catarineu at 2024-01-15T18:18:00+01:00
Bug 40171: Make WebRequest and GeckoWebExecutor First-Party aware
- - - - -
4c61ae70 by Alex Catarineu at 2024-01-15T18:18:00+01:00
Bug 26345: Hide tracking protection UI
- - - - -
e283ef9a by Pier Angelo Vendrame at 2024-01-15T18:18:01+01:00
Bug 9173: Change the default Firefox profile directory to be relative.
This commit makes Firefox look for the default profile directory in a
directory relative to the binary path.
The directory can be specified through the --with-relative-data-dir.
This is relative to the same directory as the firefox main binary for
Linux and Windows.
On macOS, we remove Contents/MacOS from it.
Or, in other words, the directory is relative to the application
bundle.
This behavior can be overriden at runtime, by placing a file called
system-install adjacent to the firefox main binary (also on macOS).
- - - - -
31377e90 by Alex Catarineu at 2024-01-15T18:18:01+01:00
Bug 27604: Fix addon issues when moving the profile directory
Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1429838
- - - - -
bc060902 by Mike Perry at 2024-01-15T18:18:01+01:00
Bug 13028: Prevent potential proxy bypass cases.
It looks like these cases should only be invoked in the NSS command line
tools, and not the browser, but I decided to patch them anyway because there
literally is a maze of network function pointers being passed around, and it's
very hard to tell if some random code might not pass in the proper proxied
versions of the networking code here by accident.
Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1433509
- - - - -
a3c36881 by Igor Oliveira at 2024-01-15T18:18:02+01:00
Bug 23104: Add a default line height compensation
Many fonts have issues with their vertical metrics. they
are used to influence the height of ascenders and depth
of descenders. Gecko uses it to calculate the line height
(font height + ascender + descender), however because of
that idiosyncratic behavior across multiple operating
systems, it can be used to identify the user's OS.
The solution proposed in the patch uses a default factor
to be multiplied with the font size, simulating the concept
of ascender and descender. This way all operating
systems will have the same line height.
- - - - -
aa022451 by Pier Angelo Vendrame at 2024-01-15T18:18:02+01:00
Bug 40309: Avoid using regional OS locales
Avoid regional OS locales if the pref
`intl.regional_prefs.use_os_locales` is false but RFP is enabled.
- - - - -
f8519d8b by Matthew Finkel at 2024-01-15T18:18:02+01:00
Bug 40432: Prevent probing installed applications
Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1711084
- - - - -
97722889 by cypherpunks1 at 2024-01-15T18:18:03+01:00
Bug 33955: When copying an image only copy the image contents to the clipboard
- - - - -
f5147aa9 by cypherpunks1 at 2024-01-15T18:18:03+01:00
Bug 41791: Omit the source URL when copying page contents to the clipboard
- - - - -
ed48ee14 by hackademix at 2024-01-15T18:18:03+01:00
Bug 42288: Allow language spoofing in status messages.
- - - - -
377c65ae by Pier Angelo Vendrame at 2024-01-15T18:18:04+01:00
Base Browser strings
This commit adds all the strings needed by following Base Browser
patches.
- - - - -
e5285d06 by hackademix at 2024-01-15T18:18:04+01:00
Bug 41434: Letterboxing, preemptively apply margins in a global CSS rule to mitigate race conditions on newly created windows and tabs.
- - - - -
a14ada3a by hackademix at 2024-01-15T18:18:04+01:00
Bug 41434: Letterboxing, improve logging.
- - - - -
67ddfb0d by hackademix at 2024-01-15T18:18:05+01:00
Bug 31064: Letterboxing, exempt browser extensions.
- - - - -
78e7a2a6 by hackademix at 2024-01-15T18:18:05+01:00
Bug 32411: Letterboxing, exempt view-source: URIs.
- - - - -
d0b06fc2 by hackademix at 2024-01-15T18:18:06+01:00
Bug 32308: use direct browser sizing for letterboxing.
Bug 30556: align letterboxing with 200x100 new win width stepping
- - - - -
9daef88e by hackademix at 2024-01-15T18:18:06+01:00
Bug 41631: Prevent weird initial window dimensions caused by subpixel computations
- - - - -
ff24e8b3 by Pier Angelo Vendrame at 2024-01-15T18:18:06+01:00
Bug 41369: Improve Firefox language settings for multi-lingual packages
Change the language selector to be sorted by language code, rather than
name, and to display the language code to the user.
Bug 41372: Handle Japanese as a special case in preferences on macOS
Japanese is treated in a special way on macOS. However, seeing the
Japanese language tag could be confusing for users, and moreover the
language name is not localized correctly like other langs.
Bug 41378: Tell users that they can change their language at the first start
With multi-lingual builds, Tor Browser matches the user's system
language, but some users might want to change it.
So, we tell them that it is possible, but only once.
- - - - -
0f545312 by p13dz at 2024-01-15T18:18:07+01:00
Bug 40283: Workaround for the file upload bug
- - - - -
afd3b304 by Arthur Edelstein at 2024-01-15T18:18:07+01:00
Bug 18905: Hide unwanted items from help menu
Bug 25660: Remove the "New Private Window" option
- - - - -
14828ec3 by cypherpunks1 at 2024-01-15T18:18:07+01:00
Bug 41740: Change the RFP value of devicePixelRatio to 2
- - - - -
5ca7b0e7 by Pier Angelo Vendrame at 2024-01-15T18:18:08+01:00
Bug 41739: Remove "Website appearance" from about:preferences.
It is ignored because of RFP and it is confusing for users.
- - - - -
b8e4fc05 by cypherpunks1 at 2024-01-15T18:18:08+01:00
Bug 41881: Don't persist custom network requests on private windows
- - - - -
d7dc77af by hackademix at 2024-01-15T18:18:08+01:00
Bug 42019: Empty browser's clipboard on browser shutdown
- - - - -
cc67a6c9 by hackademix at 2024-01-15T18:18:09+01:00
Bug 42084: Ensure English spoofing works even if preferences are set out of order.
- - - - -
ccb5aa78 by Pier Angelo Vendrame at 2024-01-15T18:18:09+01:00
Bug 41603: Customize the creation of MOZ_SOURCE_URL
MOZ_SOURCE_URL is created by combining MOZ_SOURCE_REPO and
MOZ_SOURCE_CHANGESET.
But the code takes for granted that it refers to a Hg instance, so it
combines them as `$MOZ_SOURCE_REPO/rev/$MOZ_SOURCE_CHANGESET`.
With this commit, we change this logic to combine them to create a URL
that is valid for GitLab.
$MOZ_SOURCE_CHANGESET needs to be a commit hash, not a branch or a tag.
If that is needed, we could use /-/tree/, instead of /-/commit/.
- - - - -
bd0c1a60 by Henry Wilkes at 2024-01-15T18:18:11+01:00
Bug 31575: Disable Firefox Home (Activity Stream)
Treat about:blank as the default home page and new tab page.
Avoid loading AboutNewTab in BrowserGlue.sys.mjs in order
to avoid several network requests that we do not need.
Bug 41624: Disable about:pocket-* pages.
Bug 40144: Redirect about:privatebrowsing to the user's home
- - - - -
21d89b8c by Kathy Brade at 2024-01-15T18:18:12+01:00
Bug 4234: Use the Firefox Update Process for Base Browser.
Windows: disable "runas" code path in updater (15201).
Windows: avoid writing to the registry (16236).
Also includes fixes for tickets 13047, 13301, 13356, 13594, 15406,
16014, 16909, 24476, and 25909.
Also fix bug 27221: purge the startup cache if the Base Browser
version changed (even if the Firefox version and build ID did
not change), e.g., after a minor Base Browser update.
Also fix 32616: Disable GetSecureOutputDirectoryPath() functionality.
Bug 26048: potentially confusing "restart to update" message
Within the update doorhanger, remove the misleading message that mentions
that windows will be restored after an update is applied, and replace the
"Restart and Restore" button label with an existing
"Restart to update Tor Browser" string.
Bug 28885: notify users that update is downloading
Add a "Downloading Base Browser update" item which appears in the
hamburger (app) menu while the update service is downloading a MAR
file. Before this change, the browser did not indicate to the user
that an update was in progress, which is especially confusing in
Tor Browser because downloads often take some time. If the user
clicks on the new menu item, the about dialog is opened to allow
the user to see download progress.
As part of this fix, the update service was changed to always show
update-related messages in the hamburger menu, even if the update
was started in the foreground via the about dialog or via the
"Check for Tor Browser Update" toolbar menu item. This change is
consistent with the Tor Browser goal of making sure users are
informed about the update process.
Removed #28885 parts of this patch which have been uplifted to Firefox.
- - - - -
9bbec7d4 by Pier Angelo Vendrame at 2024-01-15T18:18:12+01:00
Bug 42061: Create an alpha update channel.
- - - - -
23df1a9a by Nicolas Vigier at 2024-01-15T18:18:13+01:00
Bug 41682: Add base-browser nightly mar signing key
- - - - -
504c9c48 by hackademix at 2024-01-15T18:18:13+01:00
Bug 41695: Warn on window maximization without letterboxing in RFPHelper module
- - - - -
d1387a24 by Pier Angelo Vendrame at 2024-01-15T18:18:13+01:00
Bug 41698: Reword the recommendation badges in about:addons
Firefox strings use { -brand-product-name }.
As a result, it seems that the fork is recommending extensions, whereas
AMO curators are doing that.
So, we replace the strings with custom ones that clarify that Mozilla is
recommending them.
We assign the strings with JS because our translation backend does not
support Fluent attributes, yet, but once it does, we should switch to
them, instead.
Upstream bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1825033
- - - - -
4330b7eb by Alex Catarineu at 2024-01-15T18:18:14+01:00
Bug 40069: Add helpers for message passing with extensions
- - - - -
4b69dff4 by Matthew Finkel at 2024-01-15T18:18:14+01:00
Bug 41598: Prevent NoScript from being removed/disabled.
Bug 40253: Explicitly allow NoScript in Private Browsing mode.
- - - - -
c0d2f7ac by Henry Wilkes at 2024-01-15T18:18:14+01:00
Bug 41736: Hide NoScript extension's toolbar button by default.
This hides it from both the toolbar and the unified extensions panel.
We also hide the unified-extension-button if the panel would be empty:
not including the NoScript button when it is hidden. As a result, this
will be hidden by default until a user installs another extension (or
shows the NoScript button and unpins it).
- - - - -
c13cb704 by hackademix at 2024-01-15T18:18:14+01:00
Bug 41834: Hide "Can't Be Removed - learn more" menu line for uninstallable add-ons
- - - - -
88009132 by Pier Angelo Vendrame at 2024-01-15T18:18:15+01:00
Bug 40925: Implemented the Security Level component
This component adds a new Security Level toolbar button which visually
indicates the current global security level via icon (as defined by the
extensions.torbutton.security_slider pref), a drop-down hanger with a
short description of the current security level, and a new section in
the about:preferences#privacy page where users can change their current
security level. In addition, the hanger and the preferences page will
show a visual warning when the user has modified prefs associated with
the security level and provide a one-click 'Restore Defaults' button to
get the user back on recommended settings.
Bug 40125: Expose Security Level pref in GeckoView
- - - - -
4e2957bf by Pier Angelo Vendrame at 2024-01-15T18:18:15+01:00
Bug 40926: Implemented the New Identity feature
- - - - -
e2927de2 by Henry Wilkes at 2024-01-15T18:18:16+01:00
Bug 41736: Customize toolbar for base-browser.
- - - - -
2aa6f239 by Pier Angelo Vendrame at 2024-01-15T18:18:16+01:00
Bug 42027: Base Browser migration procedures.
This commit implmenents the the Base Browser's version of _migrateUI.
- - - - -
30 changed files:
- .eslintignore
- + .gitlab/issue_templates/bug.md
- + .gitlab/merge_request_templates/default.md
- accessible/android/SessionAccessibility.cpp
- accessible/android/SessionAccessibility.h
- accessible/ipc/DocAccessibleParent.cpp
- accessible/ipc/DocAccessibleParent.h
- accessible/ipc/moz.build
- − browser/actors/RFPHelperChild.sys.mjs
- − browser/actors/RFPHelperParent.sys.mjs
- browser/actors/moz.build
- browser/app/Makefile.in
- browser/app/macbuild/Contents/MacOS-files.in
- browser/app/moz.build
- browser/app/permissions
- + browser/app/profile/001-base-profile.js
- browser/app/profile/firefox.js
- browser/base/content/aboutDialog-appUpdater.js
- browser/base/content/aboutDialog.js
- browser/base/content/aboutDialog.xhtml
- browser/base/content/appmenu-viewcache.inc.xhtml
- browser/base/content/browser-addons.js
- browser/base/content/browser-context.inc
- browser/base/content/browser-menubar.inc
- browser/base/content/browser-safebrowsing.js
- browser/base/content/browser-sets.inc
- browser/base/content/browser-siteIdentity.js
- browser/base/content/browser.css
- browser/base/content/browser.js
- browser/base/content/browser.xhtml
The diff was not included because it is too large.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/45…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/45…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser] Pushed new tag base-browser-115.7.0esr-13.0-1-build1
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed new tag base-browser-115.7.0esr-13.0-1-build1 at The Tor Project / Applications / Tor Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/base-brow…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser] Pushed new branch base-browser-115.7.0esr-13.0-1
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed new branch base-browser-115.7.0esr-13.0-1 at The Tor Project / Applications / Tor Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/base-brow…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser] Pushed new tag tor-browser-115.7.0esr-13.0-1-build1
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed new tag tor-browser-115.7.0esr-13.0-1-build1 at The Tor Project / Applications / Tor Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/tor-brows…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.7.0esr-13.0-1] 145 commits: Bug 1819160 - Map Android ids to doc/accessible id pairs. r=Jamie
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed to branch tor-browser-115.7.0esr-13.0-1 at The Tor Project / Applications / Tor Browser
Commits:
9aa65468 by Eitan Isaacson at 2024-01-15T18:17:35+01:00
Bug 1819160 - Map Android ids to doc/accessible id pairs. r=Jamie
Differential Revision: https://phabricator.services.mozilla.com/D179737
- - - - -
2976578c by Pier Angelo Vendrame at 2024-01-15T18:17:37+01:00
Bug 1832523 - Allow using NSS to sign and verify MAR signatures. r=application-update-reviewers,glandium,bytesized
Allow using NSS for checking MAR signatures also in platforms where
OS-native APIs are used by default, i.e., macOS and Windows.
Differential Revision: https://phabricator.services.mozilla.com/D177743
- - - - -
dc127062 by Pier Angelo Vendrame at 2024-01-15T18:17:37+01:00
Bug 1849129: Prevent exceptions caused by extensions from interrupting the SearchService initialization. r=search-reviewers,Standard8
Differential Revision: https://phabricator.services.mozilla.com/D186456
- - - - -
b8c52ad1 by Emilio Cobos Álvarez at 2024-01-15T18:17:37+01:00
Bug 1853731 - Use html:img for message-bar-icon. r=Gijs,dao,settings-reviewers,desktop-theme-reviewers,sfoster
Differential Revision: https://phabricator.services.mozilla.com/D188521
- - - - -
18a41f64 by Pier Angelo Vendrame at 2024-01-15T18:17:38+01:00
Bug 1854117 - Sort the DLL blocklist flags. r=mossop,win-reviewers,gstoll
Differential Revision: https://phabricator.services.mozilla.com/D188716
- - - - -
5b9e0290 by Eden Chuang at 2024-01-15T18:17:38+01:00
Bug 1738426 - Ignoring status 206 and vary header checking for opaque response in Cache API. r=asuth
Differential Revision: https://phabricator.services.mozilla.com/D186431
- - - - -
504bbdd8 by edgul at 2024-01-15T18:17:38+01:00
Bug 1802057 - Block the following characters from use in the cookie name in the cookie string: 0x3B (semi-colon), 0x3D (equals), and 0x7F (del) r=dveditz,cookie-reviewers
Differential Revision: https://phabricator.services.mozilla.com/D182373
- - - - -
a81d2117 by Kelsey Gilbert at 2024-01-15T18:17:39+01:00
Bug 1819497 - Don't race on static bool for initialization. r=gfx-reviewers,aosmond
We could do non-racy static init here (e.g. with a static initializer
self-calling-closure), but there doesn't seem to be a strong reason for
this. Let's just use a switch and get robustness from -Werror=switch.
Differential Revision: https://phabricator.services.mozilla.com/D188054
- - - - -
f3caf97d by Mark Banner at 2024-01-15T18:17:39+01:00
Bug 1845752. r=ckerschb
Differential Revision: https://phabricator.services.mozilla.com/D186676
- - - - -
d00655c0 by Bob Owen at 2024-01-15T18:17:39+01:00
Bug 1850072: Initialize RecordedDrawTargetCreation::mHasExistingData. r=jrmuizel
This also specializes ElementStreamFormat for bool.
Differential Revision: https://phabricator.services.mozilla.com/D187794
- - - - -
4de67526 by Malte Juergens at 2024-01-15T18:17:40+01:00
Bug 1850200 - Add delay to HTTPS-Only "Continue to HTTPS Site" button r=freddyb
Differential Revision: https://phabricator.services.mozilla.com/D187887
- - - - -
53dcdc09 by Andreas Pehrson at 2024-01-15T18:17:40+01:00
Bug 1851803 - Introduce SourceMediaTrack::mDirectDisabledMode. r=karlt
Similar to MediaTrack::mDisabledMode, but this is for uses on the
SourceMediaTrack producer thread. It is still signaled via a control message
from the control thread to maintain order of operations, and is protected by the
SourceMediaTrack mutex.
Differential Revision: https://phabricator.services.mozilla.com/D187554
- - - - -
766bd0ad by Pier Angelo Vendrame at 2024-01-15T18:17:40+01:00
Bug 1860020 - Remove the assertion on the value of toolkit.telemetry.enabled. r=KrisWright,chutten
Bug 1444275 introduced an assertion on the parent process to check that
the value of toolkit.telemetry.enabled is the expected one.
However, this expected value could be different from the one set and
locked e.g. in some forks. Therefore, the assertion prevented debug
builds from working in these cases.
Differential Revision: https://phabricator.services.mozilla.com/D195080
- - - - -
d8192ef3 by Kagami Sascha Rosylight at 2024-01-15T18:17:41+01:00
Bug 1865238 - Use One UI Sans KR VF for Korean sans-serif font on Android r=jfkthame
Per /etc/fonts.xml, there are now only two `<family lang="ko">` nodes there:
* OneUISansKRVF series
* SECCJK series (but no KR postfix anymore?)
This patch uses One UI Sans KR VF as the replacement as this is newer and is a variable font (tested with https://codepen.io/SaschaNaz/pen/ExrdYXJ)
Differential Revision: https://phabricator.services.mozilla.com/D195078
- - - - -
5ee982dd by Henry Wilkes at 2024-01-15T18:17:41+01:00
Bug 41454: Move focus after calling openPreferences for a sub-category.
Temporary fix until mozilla bug 1799153 gets a patch upstream.
- - - - -
8501e4a0 by hackademix at 2024-01-15T18:17:41+01:00
Bug 42194: Fix blank net error page on failed DNS resolution with active proxy.
- - - - -
3acb45bc by Henry Wilkes at 2024-01-15T18:17:42+01:00
Bug 41483: Remove the firefox override for appstrings.properties
Remove this patch after upstream bugzilla bug 1790187
- - - - -
83438856 by Pier Angelo Vendrame at 2024-01-15T18:17:42+01:00
Bug 41116: Normalize system fonts.
System fonts are an enormous fingerprinting vector.
Even with font allow lists and with our custom configuration on Linux,
which counter metrics measurements, getComputedStyle leaks several
details.
This patch counters both these kinds of attacks.
- - - - -
90034928 by Marco Simonelli at 2024-01-15T18:17:43+01:00
Bug 41459: WebRTC fails to build under mingw (Part 1)
- properly define NOMINMAX for just MSVC builds
- - - - -
68b3b47d by Marco Simonelli at 2024-01-15T18:17:43+01:00
Bug 41459: WebRTC fails to build under mingw (Part 2)
- fixes required to build third_party/libwebrtc
- - - - -
edc8db35 by Marco Simonelli at 2024-01-15T18:17:43+01:00
Bug 41459: WebRTC fails to build under mingw (Part 3)
- fixes required to build third_party/sipcc
- - - - -
db192660 by Marco Simonelli at 2024-01-15T18:17:44+01:00
Bug 41459: WebRTC fails to build under mingw (Part 4)
- fixes requried to build netwerk/sctp
- - - - -
e6e4cc99 by Marco Simonelli at 2024-01-15T18:17:44+01:00
Bug 41459: WebRTC fails to build under mingw (Part 5)
- fixes required to build dom/media/webrtc
- - - - -
f9f2d661 by Marco Simonelli at 2024-01-15T18:17:44+01:00
Bug 41459: WebRTC fails to build under mingw (Part 6)
- fixes required to build dom/media/systemservices
- - - - -
b71a2aca by hackademix at 2024-01-15T18:17:45+01:00
Bug 41854: Allow overriding download spam protection.
- - - - -
27a3c437 by Gaba at 2024-01-15T18:17:45+01:00
Adding issue and merge request templates
- - - - -
5aafd4af by Pier Angelo Vendrame at 2024-01-15T18:17:45+01:00
Base Browser's .mozconfigs.
Bug 17858: Cannot create incremental MARs for hardened builds.
Define HOST_CFLAGS, etc. to avoid compiling programs such as mbsdiff
(which is part of mar-tools and is not distributed to end-users) with
ASan.
Bug 21849: Don't allow SSL key logging.
Bug 25741 - TBA: Disable features at compile-time
Define MOZ_ANDROID_NETWORK_STATE and MOZ_ANDROID_LOCATION
Bug 27623 - Export MOZILLA_OFFICIAL during desktop builds
This fixes a problem where some preferences had the wrong default value.
Also see bug 27472 where we made a similar fix for Android.
Bug 29859: Disable HLS support for now
Bug 30463: Explicitly disable MOZ_TELEMETRY_REPORTING
Bug 32493: Disable MOZ_SERVICES_HEALTHREPORT
Bug 33734: Set MOZ_NORMANDY to False
Bug 33851: Omit Parental Controls.
Bug 40252: Add --enable-rust-simd to our tor-browser mozconfig files
Bug 41584: Move some configuration options to base-browser level
- - - - -
33898a4b by Pier Angelo Vendrame at 2024-01-15T18:17:46+01:00
Tweaks to the build system
Bug 40857: Modified the fat .aar creation file
This is a workaround to build fat .aars with the compiling enviornment
disabled.
Mozilla does not use a similar configuration, but either runs a Firefox
build and discards its output, or uses artifacts build.
We might switch to artifact builds too, and drop this patch, or write a
better one to upstream. But until then we need this patch.
See also https://bugzilla.mozilla.org/show_bug.cgi?id=1763770.
Bug 41458: Prevent `mach package-multi-locale` from actually creating a package
macOS builds need some files to be moved around with
./mach package-multi-locale to create multi-locale packages.
The required command isn't exposed through any other mach command.
So, we patch package-multi-locale both to prevent it from failing when
doing official builds and to detect any future changes on it.
- - - - -
bd745e63 by Pier Angelo Vendrame at 2024-01-15T18:17:46+01:00
Bug 41108: Remove privileged macOS installation from 102
- - - - -
24ff518d by Dan Ballard at 2024-01-15T18:17:47+01:00
Bug 41149: Re-enable DLL injection protection in all builds not just nightlies
- - - - -
4166e5d6 by Matthew Finkel at 2024-01-15T18:17:47+01:00
Bug 24796: Comment out excess permissions from GeckoView
The GeckoView AndroidManifest.xml is not preprocessed unlike Fennec's
manifest, so we can't use the ifdef preprocessor guards around the
permissions we do not want. Commenting the permissions is the
next-best-thing.
- - - - -
57cd90f4 by Matthew Finkel at 2024-01-15T18:17:47+01:00
Bug 28125: Prevent non-Necko network connections
- - - - -
197de106 by Mike Perry at 2024-01-15T18:17:48+01:00
Bug 12974: Disable NTLM and Negotiate HTTP Auth
The Mozilla bugs: https://bugzilla.mozilla.org/show_bug.cgi?id=1046421,
https://bugzilla.mozilla.org/show_bug.cgi?id=1261591, tor-browser#27602
- - - - -
0e7e01a7 by Alex Catarineu at 2024-01-15T18:17:48+01:00
Bug 40166: Disable security.certerrors.mitm.auto_enable_enterprise_roots
Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1768899
- - - - -
b98549a6 by Georg Koppen at 2024-01-15T18:17:48+01:00
Bug 16285: Exclude ClearKey system for now
In the past the ClearKey system had not been compiled when specifying
--disable-eme. But that changed and it is even bundled nowadays (see:
Mozilla's bug 1300654). We don't want to ship it right now as the use
case for it is not really visible while the code had security
vulnerabilities in the past.
- - - - -
aa703bd7 by Kathy Brade at 2024-01-15T18:17:49+01:00
Bug 21431: Clean-up system extensions shipped in Firefox
Only ship the pdfjs extension.
- - - - -
757680f3 by Kathy Brade at 2024-01-15T18:17:49+01:00
Bug 33852: Clean up about:logins (LockWise) to avoid mentioning sync, etc.
Hide elements on about:logins that mention sync, "Firefox LockWise", and
Mozilla's LockWise mobile apps.
Disable the "Create New Login" button when security.nocertdb is true.
- - - - -
b4a754bb by Alex Catarineu at 2024-01-15T18:17:49+01:00
Bug 41457: Remove Mozilla permissions
Bug 40025: Remove Mozilla add-on install permissions
- - - - -
9b53dc57 by Kathy Brade at 2024-01-15T18:17:50+01:00
Bug 40002: Remove about:ion
Firefox Ion (previously Firefox Pioneer) is an opt-in program in which people
volunteer to participate in studies that collect detailed, sensitive data about
how they use their browser.
Bug 41662: Disable about:sync-logs
Even though we disable sync by default with
`identity.fxaccounts.enabled`, this about: page is still avilable.
We could throw an exception on the constructor of the related
component, but it would result only in an error in the console, without
a visible "this address does not look right" error page.
If we fix the issues with MOZ_SERVICES_SYNC, we can restore the
component.
- - - - -
35256850 by Arthur Edelstein at 2024-01-15T18:17:50+01:00
Bug 26353: Prevent speculative connect that violated FPI.
Connections were observed in the catch-all circuit when
the user entered an https or http URL in the URL bar, or
typed a search term.
- - - - -
424b55e3 by Alex Catarineu at 2024-01-15T18:17:50+01:00
Bug 31740: Remove some unnecessary RemoteSettings instances
More concretely, SearchService.jsm 'hijack-blocklists' and
url-classifier-skip-urls.
Avoid creating instance for 'anti-tracking-url-decoration'.
If prefs are disabling their usage, avoid creating instances for
'cert-revocations' and 'intermediates'.
Do not ship JSON dumps for collections we do not expect to need. For
the ones in the 'main' bucket, this prevents them from being synced
unnecessarily (the code in remote-settings does so for collections
in the main bucket for which a dump or local data exists). For the
collections in the other buckets, we just save some size by not
shipping their dumps.
We also clear the collections database on the v2 -> v3 migration.
- - - - -
bd1f5d46 by cypherpunks1 at 2024-01-15T18:17:51+01:00
Bug 41092: Add a RemoteSettings JSON dump for query-stripping
- - - - -
7df0cab9 by Pier Angelo Vendrame at 2024-01-15T18:17:55+01:00
Bug 41635: Disable the Normandy component
Do not include Normandy at all whenever MOZ_NORMANDY is False.
- - - - -
4cb38cf9 by Georg Koppen at 2024-01-15T18:17:55+01:00
Bug 30541: Disable WebGL readPixel() for web content
Related Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1428034
- - - - -
bd77b4e6 by Alex Catarineu at 2024-01-15T18:17:56+01:00
Bug 28369: Stop shipping pingsender executable
- - - - -
dc179de2 by cypherpunks1 at 2024-01-15T18:17:56+01:00
Bug 41568: Disable LaterRun
- - - - -
b57a7b23 by cypherpunks1 at 2024-01-15T18:17:56+01:00
Bug 40717: Hide Windows SSO in settings
- - - - -
49ea759c by Pier Angelo Vendrame at 2024-01-15T18:17:57+01:00
Bug 41599: Always return an empty string as network ID
Firefox computes an internal network ID used to detect network changes
and act consequently (e.g., to improve WebSocket UX).
However, there are a few ways to get this internal network ID, so we
patch them out, to be sure any new code will not be able to use them and
possibly link users.
We also sent a patch to Mozilla to seed the internal network ID, to
prevent any accidental leak in the future.
Upstream: https://bugzilla.mozilla.org/show_bug.cgi?id=1817756
- - - - -
7b3b270e by cypherpunks1 at 2024-01-15T18:17:57+01:00
Bug 40175: Add origin attributes to about:reader top-level requests
- - - - -
40898b73 by Richard Pospesel at 2024-01-15T18:17:57+01:00
Bug 41327: Disable UrlbarProviderInterventions
- - - - -
efdd96e8 by Richard Pospesel at 2024-01-15T18:17:58+01:00
Bug 42037: Disable about:firefoxview page
- - - - -
76a7bd05 by Mike Perry at 2024-01-15T18:17:58+01:00
Firefox preference overrides.
This hack directly includes our preference changes in omni.ja.
Bug 18292: Staged updates fail on Windows
Temporarily disable staged updates on Windows.
Bug 18297: Use separate Noto JP,KR,SC,TC fonts
Bug 23404: Add Noto Sans Buginese to the macOS whitelist
Bug 23745: Set dom.indexedDB.enabled = true
Bug 13575: Disable randomised Firefox HTTP cache decay user tests.
(Fernando Fernandez Mancera <ffmancera(a)riseup.net>)
Bug 17252: Enable session identifiers with FPI
Session tickets and session identifiers were isolated
by OriginAttributes, so we can re-enable them by
allowing the default value (true) of
"security.ssl.disable_session_identifiers".
The pref "security.enable_tls_session_tickets" is obsolete
(removed in https://bugzilla.mozilla.org/917049)
Bug 14952: Enable http/2 and AltSvc
In Firefox, SPDY/HTTP2 now uses Origin Attributes for
isolation of connections, push streams, origin frames, etc.
That means we get first-party isolation provided
"privacy.firstparty.isolate" is true. So in this patch, we
stop overriding "network.http.spdy.enabled" and
"network.http.spdy.enabled.http2".
Alternate Services also use Origin Attributes for isolation.
So we stop overriding
"network.http.altsvc.enabled" and "network.http.altsvc.oe"
as well.
(All 4 of the abovementioned "network.http.*" prefs adopt
Firefox 60ESR's default value of true.)
However, we want to disable HTTP/2 push for now, so we
set "network.http.spdy.allow-push" to false.
"network.http.spdy.enabled.http2draft" was removed in Bug 1132357.
"network.http.sped.enabled.v2" was removed in Bug 912550.
"network.http.sped.enabled.v3" was removed in Bug 1097944.
"network.http.sped.enabled.v3-1" was removed in Bug 1248197.
Bug 26114: addons.mozilla.org is not special
* Don't expose navigator.mozAddonManager on any site
* Don't block NoScript from modifying addons.mozilla.org or other sites
Enable ReaderView mode again (#27281).
Bug 29916: Make sure enterprise policies are disabled
Bug 2874: Block Components.interfaces from content
Bug 26146: Spoof HTTP User-Agent header for desktop platforms
In Tor Browser 8.0, the OS was revealed in both the HTTP User-Agent
header and to JavaScript code via navigator.userAgent. To avoid
leaking the OS inside each HTTP request (which many web servers
log), always use the Windows 7 OS value in the desktop User-Agent
header. We continue to allow access to the actual OS via JavaScript,
since doing so improves compatibility with web applications such
as GitHub and Google Docs.
Bug 12885: Windows Jump Lists fail for Tor Browser
Jumplist entries are stored in a binary file in:
%APPDATA%\\Microsoft\Windows\Recent\CustomDestinations\
and has a name in the form
[a-f0-9]+.customDestinations-ms
The hex at the front is unique per app, and is ultimately derived from
something called the 'App User Model ID' (AUMID) via some unknown
hashing method. The AUMID is provided as a key when programmatically
creating, updating, and deleting a jumplist. The default behaviour in
firefox is for the installer to define an AUMID for an app, and save it
in the registry so that the jumplist data can be removed by the
uninstaller.
However, the Tor Browser does not set this (or any other) regkey during
installation, so this codepath fails and the app's AUMID is left
undefined. As a result the app's AUMID ends up being defined by
windows, but unknowable by Tor Browser. This unknown AUMID is used to
create and modify the jumplist, but the delete API requires that we
provide the app's AUMID explicitly. Since we don't know what the AUMID
is (since the expected regkey where it is normally stored does not
exist) jumplist deletion will fail and we will leave behind a mostly
empty customDestinations-ms file. The name of the file is derived from
the binary path, so an enterprising person could reverse engineer how
that hex name is calculated, and generate the name for Tor Browser's
default Desktop installation path to determine whether a person had
used Tor Browser in the past.
The 'taskbar.grouping.useprofile' option that is enabled by this patch
works around this AUMID problem by having firefox.exe create it's own
AUMID based on the profile path (rather than looking for a regkey). This
way, if a user goes in and enables and disables jumplist entries, the
backing store is properly deleted.
Unfortunately, all windows users currently have this file lurking in
the above mentioned directory and this patch will not remove it since it
was created with an unknown AUMID. However, another patch could be
written which goes to that directory and deletes any item containing the
'Tor Browser' string. See bug 28996.
Bug 30845: Make sure default themes and other internal extensions are enabled
Bug 28896: Enable extensions in private browsing by default
Bug 31065: Explicitly allow proxying localhost
Bug 31598: Enable letterboxing
Disable Presentation API everywhere
Bug 21549 - Use Firefox's WASM default pref. It is disabled at safer
security levels.
Bug 32321: Disable Mozilla's MitM pings
Bug 19890: Disable installation of system addons
By setting the URL to "" we make sure that already installed system
addons get deleted as well.
Bug 22548: Firefox downgrades VP9 videos to VP8.
On systems where H.264 is not available or no HWA, VP9 is preferred. But in Tor
Browser 7.0 all youtube videos are degraded to VP8.
This behaviour can be turned off by setting media.benchmark.vp9.threshold to 0.
All clients will get better experience and lower traffic, beause TBB doesn't
use "Use hardware acceleration when available".
Bug 25741 - TBA: Add mobile-override of 000-tor-browser prefs
Bug 16441: Suppress "Reset Tor Browser" prompt.
Bug 29120: Use the in-memory media cache and increase its maximum size.
Bug 33697: use old search config based on list.json
Bug 33855: Ensure that site-specific browser mode is disabled.
Bug 30682: Disable Intermediate CA Preloading.
Bug 40061: Omit the Windows default browser agent from the build
Bug 40322: Consider disabling network.connectivity-service.enabled
Bug 40408: Disallow SVG Context Paint in all web content
Bug 40308: Disable network partitioning until we evaluate dFPI
Bug 40322: Consider disabling network.connectivity-service.enabled
Bug 40383: Disable dom.enable_event_timing
Bug 40423: Disable http/3
Bug 40177: Update prefs for Fx91esr
Bug 40700: Disable addons and features recommendations
Bug 40682: Disable network.proxy.allow_bypass
Bug 40736: Disable third-party cookies in PBM
Bug 19850: Enabled HTTPS-Only by default
Bug 40912: Hide the screenshot menu
Bug 41292: Disable moreFromMozilla in preferences page
Bug 40057: Ensure the CSS4 system colors are not a fingerprinting vector
Bug 24686: Set network.http.tailing.enabled to true
Bug 40183: Disable TLS ciphersuites using SHA-1
Bug 40783: Review 000-tor-browser.js and 001-base-profile.js for 102
We reviewed all the preferences we set for 102, and remove a few old
ones. See the description of that issue to see all the preferences we
believed were still valid for 102, and some brief description for the
reasons to keep them.
- - - - -
8563f850 by Richard Pospesel at 2024-01-15T18:17:59+01:00
Bug 41659: Add canonical color definitions to base-browser
- - - - -
403dca48 by Pier Angelo Vendrame at 2024-01-15T18:17:59+01:00
Bug 41043: Hardcode the UI font on Linux
The mechanism to choose the UI font does not play well with our
fontconfig configuration. As a result, the final criterion to choose
the font for the UI was its version.
Since we hardcode Arimo as a default sans-serif on preferences, we use
it also for the UI. FontConfig will fall back to some other font for
scripts Arimo does not cover as expected (we tested with Japanese).
- - - - -
eb080454 by Alex Catarineu at 2024-01-15T18:17:59+01:00
Bug 30605: Honor privacy.spoof_english in Android
This checks `privacy.spoof_english` whenever `setLocales` is
called from Fenix side and sets `intl.accept_languages`
accordingly.
Bug 40198: Expose privacy.spoof_english pref in GeckoView
- - - - -
596127d0 by Alex Catarineu at 2024-01-15T18:18:00+01:00
Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView
- - - - -
8b71beaa by Alex Catarineu at 2024-01-15T18:18:00+01:00
Bug 40171: Make WebRequest and GeckoWebExecutor First-Party aware
- - - - -
4c61ae70 by Alex Catarineu at 2024-01-15T18:18:00+01:00
Bug 26345: Hide tracking protection UI
- - - - -
e283ef9a by Pier Angelo Vendrame at 2024-01-15T18:18:01+01:00
Bug 9173: Change the default Firefox profile directory to be relative.
This commit makes Firefox look for the default profile directory in a
directory relative to the binary path.
The directory can be specified through the --with-relative-data-dir.
This is relative to the same directory as the firefox main binary for
Linux and Windows.
On macOS, we remove Contents/MacOS from it.
Or, in other words, the directory is relative to the application
bundle.
This behavior can be overriden at runtime, by placing a file called
system-install adjacent to the firefox main binary (also on macOS).
- - - - -
31377e90 by Alex Catarineu at 2024-01-15T18:18:01+01:00
Bug 27604: Fix addon issues when moving the profile directory
Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1429838
- - - - -
bc060902 by Mike Perry at 2024-01-15T18:18:01+01:00
Bug 13028: Prevent potential proxy bypass cases.
It looks like these cases should only be invoked in the NSS command line
tools, and not the browser, but I decided to patch them anyway because there
literally is a maze of network function pointers being passed around, and it's
very hard to tell if some random code might not pass in the proper proxied
versions of the networking code here by accident.
Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1433509
- - - - -
a3c36881 by Igor Oliveira at 2024-01-15T18:18:02+01:00
Bug 23104: Add a default line height compensation
Many fonts have issues with their vertical metrics. they
are used to influence the height of ascenders and depth
of descenders. Gecko uses it to calculate the line height
(font height + ascender + descender), however because of
that idiosyncratic behavior across multiple operating
systems, it can be used to identify the user's OS.
The solution proposed in the patch uses a default factor
to be multiplied with the font size, simulating the concept
of ascender and descender. This way all operating
systems will have the same line height.
- - - - -
aa022451 by Pier Angelo Vendrame at 2024-01-15T18:18:02+01:00
Bug 40309: Avoid using regional OS locales
Avoid regional OS locales if the pref
`intl.regional_prefs.use_os_locales` is false but RFP is enabled.
- - - - -
f8519d8b by Matthew Finkel at 2024-01-15T18:18:02+01:00
Bug 40432: Prevent probing installed applications
Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1711084
- - - - -
97722889 by cypherpunks1 at 2024-01-15T18:18:03+01:00
Bug 33955: When copying an image only copy the image contents to the clipboard
- - - - -
f5147aa9 by cypherpunks1 at 2024-01-15T18:18:03+01:00
Bug 41791: Omit the source URL when copying page contents to the clipboard
- - - - -
ed48ee14 by hackademix at 2024-01-15T18:18:03+01:00
Bug 42288: Allow language spoofing in status messages.
- - - - -
377c65ae by Pier Angelo Vendrame at 2024-01-15T18:18:04+01:00
Base Browser strings
This commit adds all the strings needed by following Base Browser
patches.
- - - - -
e5285d06 by hackademix at 2024-01-15T18:18:04+01:00
Bug 41434: Letterboxing, preemptively apply margins in a global CSS rule to mitigate race conditions on newly created windows and tabs.
- - - - -
a14ada3a by hackademix at 2024-01-15T18:18:04+01:00
Bug 41434: Letterboxing, improve logging.
- - - - -
67ddfb0d by hackademix at 2024-01-15T18:18:05+01:00
Bug 31064: Letterboxing, exempt browser extensions.
- - - - -
78e7a2a6 by hackademix at 2024-01-15T18:18:05+01:00
Bug 32411: Letterboxing, exempt view-source: URIs.
- - - - -
d0b06fc2 by hackademix at 2024-01-15T18:18:06+01:00
Bug 32308: use direct browser sizing for letterboxing.
Bug 30556: align letterboxing with 200x100 new win width stepping
- - - - -
9daef88e by hackademix at 2024-01-15T18:18:06+01:00
Bug 41631: Prevent weird initial window dimensions caused by subpixel computations
- - - - -
ff24e8b3 by Pier Angelo Vendrame at 2024-01-15T18:18:06+01:00
Bug 41369: Improve Firefox language settings for multi-lingual packages
Change the language selector to be sorted by language code, rather than
name, and to display the language code to the user.
Bug 41372: Handle Japanese as a special case in preferences on macOS
Japanese is treated in a special way on macOS. However, seeing the
Japanese language tag could be confusing for users, and moreover the
language name is not localized correctly like other langs.
Bug 41378: Tell users that they can change their language at the first start
With multi-lingual builds, Tor Browser matches the user's system
language, but some users might want to change it.
So, we tell them that it is possible, but only once.
- - - - -
0f545312 by p13dz at 2024-01-15T18:18:07+01:00
Bug 40283: Workaround for the file upload bug
- - - - -
afd3b304 by Arthur Edelstein at 2024-01-15T18:18:07+01:00
Bug 18905: Hide unwanted items from help menu
Bug 25660: Remove the "New Private Window" option
- - - - -
14828ec3 by cypherpunks1 at 2024-01-15T18:18:07+01:00
Bug 41740: Change the RFP value of devicePixelRatio to 2
- - - - -
5ca7b0e7 by Pier Angelo Vendrame at 2024-01-15T18:18:08+01:00
Bug 41739: Remove "Website appearance" from about:preferences.
It is ignored because of RFP and it is confusing for users.
- - - - -
b8e4fc05 by cypherpunks1 at 2024-01-15T18:18:08+01:00
Bug 41881: Don't persist custom network requests on private windows
- - - - -
d7dc77af by hackademix at 2024-01-15T18:18:08+01:00
Bug 42019: Empty browser's clipboard on browser shutdown
- - - - -
cc67a6c9 by hackademix at 2024-01-15T18:18:09+01:00
Bug 42084: Ensure English spoofing works even if preferences are set out of order.
- - - - -
ccb5aa78 by Pier Angelo Vendrame at 2024-01-15T18:18:09+01:00
Bug 41603: Customize the creation of MOZ_SOURCE_URL
MOZ_SOURCE_URL is created by combining MOZ_SOURCE_REPO and
MOZ_SOURCE_CHANGESET.
But the code takes for granted that it refers to a Hg instance, so it
combines them as `$MOZ_SOURCE_REPO/rev/$MOZ_SOURCE_CHANGESET`.
With this commit, we change this logic to combine them to create a URL
that is valid for GitLab.
$MOZ_SOURCE_CHANGESET needs to be a commit hash, not a branch or a tag.
If that is needed, we could use /-/tree/, instead of /-/commit/.
- - - - -
bd0c1a60 by Henry Wilkes at 2024-01-15T18:18:11+01:00
Bug 31575: Disable Firefox Home (Activity Stream)
Treat about:blank as the default home page and new tab page.
Avoid loading AboutNewTab in BrowserGlue.sys.mjs in order
to avoid several network requests that we do not need.
Bug 41624: Disable about:pocket-* pages.
Bug 40144: Redirect about:privatebrowsing to the user's home
- - - - -
21d89b8c by Kathy Brade at 2024-01-15T18:18:12+01:00
Bug 4234: Use the Firefox Update Process for Base Browser.
Windows: disable "runas" code path in updater (15201).
Windows: avoid writing to the registry (16236).
Also includes fixes for tickets 13047, 13301, 13356, 13594, 15406,
16014, 16909, 24476, and 25909.
Also fix bug 27221: purge the startup cache if the Base Browser
version changed (even if the Firefox version and build ID did
not change), e.g., after a minor Base Browser update.
Also fix 32616: Disable GetSecureOutputDirectoryPath() functionality.
Bug 26048: potentially confusing "restart to update" message
Within the update doorhanger, remove the misleading message that mentions
that windows will be restored after an update is applied, and replace the
"Restart and Restore" button label with an existing
"Restart to update Tor Browser" string.
Bug 28885: notify users that update is downloading
Add a "Downloading Base Browser update" item which appears in the
hamburger (app) menu while the update service is downloading a MAR
file. Before this change, the browser did not indicate to the user
that an update was in progress, which is especially confusing in
Tor Browser because downloads often take some time. If the user
clicks on the new menu item, the about dialog is opened to allow
the user to see download progress.
As part of this fix, the update service was changed to always show
update-related messages in the hamburger menu, even if the update
was started in the foreground via the about dialog or via the
"Check for Tor Browser Update" toolbar menu item. This change is
consistent with the Tor Browser goal of making sure users are
informed about the update process.
Removed #28885 parts of this patch which have been uplifted to Firefox.
- - - - -
9bbec7d4 by Pier Angelo Vendrame at 2024-01-15T18:18:12+01:00
Bug 42061: Create an alpha update channel.
- - - - -
23df1a9a by Nicolas Vigier at 2024-01-15T18:18:13+01:00
Bug 41682: Add base-browser nightly mar signing key
- - - - -
504c9c48 by hackademix at 2024-01-15T18:18:13+01:00
Bug 41695: Warn on window maximization without letterboxing in RFPHelper module
- - - - -
d1387a24 by Pier Angelo Vendrame at 2024-01-15T18:18:13+01:00
Bug 41698: Reword the recommendation badges in about:addons
Firefox strings use { -brand-product-name }.
As a result, it seems that the fork is recommending extensions, whereas
AMO curators are doing that.
So, we replace the strings with custom ones that clarify that Mozilla is
recommending them.
We assign the strings with JS because our translation backend does not
support Fluent attributes, yet, but once it does, we should switch to
them, instead.
Upstream bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1825033
- - - - -
4330b7eb by Alex Catarineu at 2024-01-15T18:18:14+01:00
Bug 40069: Add helpers for message passing with extensions
- - - - -
4b69dff4 by Matthew Finkel at 2024-01-15T18:18:14+01:00
Bug 41598: Prevent NoScript from being removed/disabled.
Bug 40253: Explicitly allow NoScript in Private Browsing mode.
- - - - -
c0d2f7ac by Henry Wilkes at 2024-01-15T18:18:14+01:00
Bug 41736: Hide NoScript extension's toolbar button by default.
This hides it from both the toolbar and the unified extensions panel.
We also hide the unified-extension-button if the panel would be empty:
not including the NoScript button when it is hidden. As a result, this
will be hidden by default until a user installs another extension (or
shows the NoScript button and unpins it).
- - - - -
c13cb704 by hackademix at 2024-01-15T18:18:14+01:00
Bug 41834: Hide "Can't Be Removed - learn more" menu line for uninstallable add-ons
- - - - -
88009132 by Pier Angelo Vendrame at 2024-01-15T18:18:15+01:00
Bug 40925: Implemented the Security Level component
This component adds a new Security Level toolbar button which visually
indicates the current global security level via icon (as defined by the
extensions.torbutton.security_slider pref), a drop-down hanger with a
short description of the current security level, and a new section in
the about:preferences#privacy page where users can change their current
security level. In addition, the hanger and the preferences page will
show a visual warning when the user has modified prefs associated with
the security level and provide a one-click 'Restore Defaults' button to
get the user back on recommended settings.
Bug 40125: Expose Security Level pref in GeckoView
- - - - -
4e2957bf by Pier Angelo Vendrame at 2024-01-15T18:18:15+01:00
Bug 40926: Implemented the New Identity feature
- - - - -
e2927de2 by Henry Wilkes at 2024-01-15T18:18:16+01:00
Bug 41736: Customize toolbar for base-browser.
- - - - -
2aa6f239 by Pier Angelo Vendrame at 2024-01-15T18:18:16+01:00
Bug 42027: Base Browser migration procedures.
This commit implmenents the the Base Browser's version of _migrateUI.
- - - - -
87d461a3 by Richard Pospesel at 2024-01-15T18:18:16+01:00
Bug 41649: Create rebase and security backport gitlab issue templates
- - - - -
471d68e4 by Richard Pospesel at 2024-01-15T18:18:17+01:00
Bug 41089: Add tor-browser build scripts + Makefile to tor-browser
- - - - -
c38b6a30 by Henry Wilkes at 2024-01-15T18:18:17+01:00
Bug 41803: Add some developer tools for working on tor-browser.
- - - - -
a8d7c057 by Kathy Brade at 2024-01-15T18:18:17+01:00
Bug 11641: Disable remoting by default.
Unless the -osint command line flag is used, the browser now defaults
to the equivalent of -no-remote. There is a new -allow-remote flag that
may be used to restore the original (Firefox-like) default behavior.
- - - - -
1d89dbb2 by Alex Catarineu at 2024-01-15T18:18:18+01:00
Add TorStrings module for localization
- - - - -
e0466d82 by Henry Wilkes at 2024-01-15T18:18:18+01:00
Tor Browser strings
This commit adds all the strings needed for Tor Browser patches.
- - - - -
aa86c840 by Henry Wilkes at 2024-01-15T18:18:18+01:00
Tor Browser localization migration scripts.
- - - - -
61b2dd86 by Mike Perry at 2024-01-15T18:18:19+01:00
Bug 2176: Rebrand Firefox to TorBrowser
See also Bugs #5194, #7187, #8115, #8219.
This patch does some basic renaming of Firefox to TorBrowser. The rest of the
branding is done by images and icons.
Also fix bug 27905.
Bug 25702: Update Tor Browser icon to follow design guidelines
- Updated all of the branding in /browser/branding/official with new 'stable'
icon series.
- Updated /extensions/onboarding/content/img/tor-watermark.png with new icon and
add the source svg in the same directory
- Copied /browser/branding/official over /browser/branding/nightly and the new
/browser/branding/alpha directories. Replaced content with 'nightly' and
'alpha' icon series.
Updated VisualElements_70.png and VisualElements_150.png with updated icons in
each branding directory (fixes #22654)
- Updated firefox.VisualElementsManfiest.xml with updated colors in each
branding directory
- Added firefox.svg to each branding directory from which all the other icons
are derived (apart from document.icns and document.ico)
- Added default256.png and default512.png icons
- Updated aboutTBUpdate.css to point to branding-aware icon128.png and removed
original icon
- Use the Tor Browser icon within devtools/client/themes/images/.
Bug 30631: Blurry Tor Browser icon on macOS app switcher
It would seem the png2icns tool does not generate correct icns files and
so on macOS the larger icons were missing resulting in blurry icons in
the OS chrome. Regenerated the padded icons in a macOS VM using
iconutil.
Bug 28196: preparations for using torbutton tor-browser-brand.ftl
A small change to Fluent FileSource class is required so that we
can register a new source without its supported locales being
counted as available locales for the browser.
Bug 31803: Replaced about:debugging logo with flat version
Bug 21724: Make Firefox and Tor Browser distinct macOS apps
When macOS opens a document or selects a default browser, it sometimes
uses the CFBundleSignature. Changing from the Firefox MOZB signature to
a different signature TORB allows macOS to distinguish between Firefox
and Tor Browser.
Bug 32092: Fix Tor Browser Support link in preferences
For bug 40562, we moved onionPattern* from bug 27476 to here, as
about:tor needs these files but it is included earlier.
Bug 41278: Create Tor Browser styled pdf logo similar to the vanilla Firefox one
Bug 42088: New application icons (used in-app and on linux).
Bug 42087: New application icons (windows).
- - - - -
54d37f37 by sanketh at 2024-01-15T18:18:19+01:00
Bug 40209: Implement Basic Crypto Safety
Adds a CryptoSafety actor which detects when you've copied a crypto
address from a HTTP webpage and shows a warning.
Closes #40209.
Bug 40428: Fix string attribute names
- - - - -
07c31b4c by Mike Perry at 2024-01-15T18:18:19+01:00
TB3: Tor Browser's official .mozconfigs.
Also:
Add an --enable-tor-browser-data-outside-app-dir configure option
Add --with-tor-browser-version configure option
Bug 31457: disable per-installation profiles
The dedicated profiles (per-installation) feature does not interact
well with our bundled profiles on Linux and Windows, and it also causes
multiple profiles to be created on macOS under TorBrowser-Data.
Bug 31935: Disable profile downgrade protection.
Since Tor Browser does not support more than one profile, disable
the prompt and associated code that offers to create one when a
version downgrade situation is detected.
Add --enable-tor-browser-update build option
Bug 40793: moved Tor configuration options from old-configure.in to moz.configure
Bug 41584: Move some configuration options to base-browser level
- - - - -
9fa06046 by Henry Wilkes at 2024-01-15T18:18:20+01:00
Bug 41340: Enable TOR_BROWSER_NIGHTLY_BUILD features for dev and nightly builds
tor-browser#41285: Enable fluent warnings.
- - - - -
bbd9d0a0 by Pier Angelo Vendrame at 2024-01-15T18:18:20+01:00
Bug 40562: Added Tor Browser preferences to 000-tor-browser.js
Before reordering patches, we used to keep the Tor-related patches
(torbutton and tor-launcher) at the beginning.
After that issue, we decided to move them towards the end.
In addition to that, we have decided to move Tor Browser-only
preferences there, too, to make Base Browser-only fixups easier to
apply.
- - - - -
e5deb997 by Pier Angelo Vendrame at 2024-01-15T18:18:20+01:00
Bug 13252: Customize profile management on macOS
On macOS we allow both portable mode and system installation.
However, in the latter case, we customize Firefox's directories to
match the hierarchy we use for the portable mode.
Also, display an informative error message if the TorBrowser-Data
directory cannot be created due to an "access denied" or a
"read only volume" error.
- - - - -
962dcbc4 by Pier Angelo Vendrame at 2024-01-15T18:18:21+01:00
Bug 40933: Add tor-launcher functionality
Bug 41926: Reimplement the control port
- - - - -
aa7e66cb by Richard Pospesel at 2024-01-15T18:18:21+01:00
Bug 40597: Implement TorSettings module
- migrated in-page settings read/write implementation from about:preferences#tor
to the TorSettings module
- TorSettings initially loads settings from the tor daemon, and saves them to
firefox prefs
- TorSettings notifies observers when a setting has changed; currently only
QuickStart notification is implemented for parity with previous preference
notify logic in about:torconnect and about:preferences#tor
- about:preferences#tor, and about:torconnect now read and write settings
thorugh the TorSettings module
- all tor settings live in the torbrowser.settings.* preference branch
- removed unused pref modify permission for about:torconnect content page from
AsyncPrefs.jsm
Bug 40645: Migrate Moat APIs to Moat.jsm module
- - - - -
5a2d540c by Arthur Edelstein at 2024-01-15T18:18:21+01:00
Bug 3455: Add DomainIsolator, for isolating circuit by domain.
Add an XPCOM component that registers a ProtocolProxyChannelFilter
which sets the username/password for each web request according to
url bar domain.
Bug 9442: Add New Circuit button
Bug 13766: Set a 10 minute circuit dirty timeout for the catch-all circ.
Bug 19206: Include a 128 bit random tag as part of the domain isolator nonce.
Bug 19206: Clear out the domain isolator state on `New Identity`.
Bug 21201.2: Isolate by firstPartyDomain from OriginAttributes
Bug 21745: Fix handling of catch-all circuit
Bug 41741: Refactor the domain isolator and new circuit
- - - - -
b33be2e8 by Henry Wilkes at 2024-01-15T18:18:21+01:00
Bug 41600: Add a tor circuit display panel.
- - - - -
927c87a4 by hackademix at 2024-01-15T18:18:22+01:00
Bug 8324: Prevent DNS proxy bypasses caused by Drag&Drop
Bug 41613: Skip Drang & Drop filtering for DNS-safe URLs
- - - - -
9a518d9a by Amogh Pradeep at 2024-01-15T18:18:22+01:00
Orfox: Centralized proxy applied to AbstractCommunicator and BaseResources.
See Bug 1357997 for partial uplift.
Also:
Bug 28051 - Use our Orbot for proxying our connections
Bug 31144 - ESR68 Network Code Review
- - - - -
0475449f by Matthew Finkel at 2024-01-15T18:18:22+01:00
Bug 25741: TBA: Disable GeckoNetworkManager
The browser should not need information related to the network
interface or network state, tor should take care of that.
- - - - -
ecc16542 by Kathy Brade at 2024-01-15T18:18:23+01:00
Bug 14631: Improve profile access error messages.
Instead of always reporting that the profile is locked, display specific
messages for "access denied" and "read-only file system".
To allow for localization, get profile-related error strings from Torbutton.
Use app display name ("Tor Browser") in profile-related error alerts.
- - - - -
114eb179 by Pier Angelo Vendrame at 2024-01-15T18:18:23+01:00
Bug 40807: Added QRCode.js to toolkit/modules
- - - - -
4df5e97c by Richard Pospesel at 2024-01-15T18:18:23+01:00
Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection
This patch adds a new about:preferences#connection page which allows
modifying bridge, proxy, and firewall settings from within Tor Browser.
All of the functionality present in tor-launcher's Network
Configuration panel is present:
- Setting built-in bridges
- Requesting bridges from BridgeDB via moat
- Using user-provided bridges
- Configuring SOCKS4, SOCKS5, and HTTP/HTTPS proxies
- Setting firewall ports
- Viewing and Copying Tor's logs
- The Networking Settings in General preferences has been removed
Bug 40774: Update about:preferences page to match new UI designs
- - - - -
afbfceb7 by Richard Pospesel at 2024-01-15T18:18:24+01:00
Bug 27476: Implement about:torconnect captive portal within Tor Browser
- implements new about:torconnect page as tor-launcher replacement
- adds new torconnect component to browser
- tor process management functionality remains implemented in tor-launcher through the TorProtocolService module
- adds warning/error box to about:preferences#tor when not connected to tor
Bug 40773: Update the about:torconnect frontend page to match additional UI flows.
Bug 41608: Add a toolbar status button and a urlbar "Connect" button.
- - - - -
79b2c30e by Henry Wilkes at 2024-01-15T18:18:24+01:00
Bug 7494: Create local home page for TBB.
Bug 41333: Update about:tor to new design. Including:
+ make the favicon match the branding icon.
+ make the location bar show a search icon.
- - - - -
e42b506d by Arthur Edelstein at 2024-01-15T18:18:24+01:00
Bug 12620: TorBrowser regression tests
Regression tests for Bug #2950: Make Permissions Manager memory-only
Regression tests for TB4: Tor Browser's Firefox preference overrides.
Note: many more functional tests could be made here
Regression tests for #2874: Block Components.interfaces from content
Bug 18923: Add a script to run all Tor Browser specific tests
Regression tests for Bug #16441: Suppress "Reset Tor Browser" prompt.
- - - - -
29543191 by Pier Angelo Vendrame at 2024-01-15T18:18:25+01:00
Bug 41668: Tweaks to the Base Browser updater for Tor Browser
This commit was once part of "Bug 4234: Use the Firefox Update Process
for Tor Browser.".
However, some parts of it were not needed for Base Browser and some
derivative browsers.
Therefore, we extracted from that commit the parts for Tor Browser
legacy, and we add them back to the patch set with this commit.
- - - - -
aef08e80 by Kathy Brade at 2024-01-15T18:18:25+01:00
Bug 12647: Support symlinks in the updater.
- - - - -
4cba81e1 by Kathy Brade at 2024-01-15T18:18:25+01:00
Bug 19121: reinstate the update.xml hash check
This is a partial revert of commit f1241db6986e4b54473a1ed870f7584c75d51122.
Revert most changes from Mozilla Bug 862173 "don't verify mar file hash
when using mar signing to verify the mar file (lessens main thread I/O)."
We kept the addition to the AppConstants API in case other JS code
references it in the future.
- - - - -
fee9255a by Kathy Brade at 2024-01-15T18:18:27+01:00
Bug 16940: After update, load local change notes.
Add an about:tbupdate page that displays the first section from
TorBrowser/Docs/ChangeLog.txt and includes a link to the remote
post-update page (typically our blog entry for the release).
Always load about:tbupdate in a content process, but implement the
code that reads the file system (changelog) in the chrome process
for compatibility with future sandboxing efforts.
Also fix bug 29440. Now about:tbupdate is styled as a fairly simple
changelog page that is designed to be displayed via a link that is on
about:tor.
- - - - -
835ac8d7 by Georg Koppen at 2024-01-15T18:18:28+01:00
Bug 32658: Create a new MAR signing key
It's time for our rotation again: Move the backup key in the front
position and add a new backup key.
Bug 33803: Move our primary nightly MAR signing key to tor-browser
Bug 33803: Add a secondary nightly MAR signing key
- - - - -
97974978 by Mike Perry at 2024-01-15T18:18:28+01:00
Omnibox: Add DDG, Startpage, Disconnect, Youtube, Twitter; remove Amazon, eBay, bing
eBay and Amazon don't treat Tor users very well. Accounts often get locked and
payments reversed.
Also:
Bug 16322: Update DuckDuckGo search engine
We are replacing the clearnet URL with an onion service one (thanks to a
patch by a cypherpunk) and are removing the duplicated DDG search
engine. Duplicating DDG happend due to bug 1061736 where Mozilla
included DDG itself into Firefox. Interestingly, this caused breaking
the DDG search if JavaScript is disabled as the Mozilla engine, which
gets loaded earlier, does not use the html version of the search page.
Moreover, the Mozilla engine tracked where the users were searching from
by adding a respective parameter to the search query. We got rid of that
feature as well.
Also:
This fixes bug 20809: the DuckDuckGo team has changed its server-side
code in a way that lets users with JavaScript enabled use the default
landing page while those without JavaScript available get redirected
directly to the non-JS page. We adapt the search engine URLs
accordingly.
Also fixes bug 29798 by making sure we only specify the Google search
engine we actually ship an .xml file for.
Also regression tests.
squash! Omnibox: Add DDG, Startpage, Disconnect, Youtube, Twitter; remove Amazon, eBay, bing
Bug 40494: Update Startpage search provider
squash! Omnibox: Add DDG, Startpage, Disconnect, Youtube, Twitter; remove Amazon, eBay, bing
Bug 40438: Add Blockchair as a search engine
Bug 33342: Avoid disconnect search addon error after removal.
We removed the addon in #32767, but it was still being loaded
from addonStartup.json.lz4 and throwing an error on startup
because its resource: location is not available anymore.
- - - - -
73007290 by Alex Catarineu at 2024-01-15T18:18:28+01:00
Bug 40073: Disable remote Public Suffix List fetching
In https://bugzilla.mozilla.org/show_bug.cgi?id=1563246 Firefox implemented
fetching the Public Suffix List via RemoteSettings and replacing the default
one at runtime, which we do not want.
- - - - -
366cf16c by Henry Wilkes at 2024-01-15T18:18:29+01:00
Bug 41906: Hide DNS over HTTPS preferences.
- - - - -
1748dd58 by Richard Pospesel at 2024-01-15T18:18:29+01:00
Bug 23247: Communicating security expectations for .onion
Encrypting pages hosted on Onion Services with SSL/TLS is redundant
(in terms of hiding content) as all traffic within the Tor network is
already fully encrypted. Therefore, serving HTTP pages from an Onion
Service is more or less fine.
Prior to this patch, Tor Browser would mostly treat pages delivered
via Onion Services as well as pages delivered in the ordinary fashion
over the internet in the same way. This created some inconsistencies
in behaviour and misinformation presented to the user relating to the
security of pages delivered via Onion Services:
- HTTP Onion Service pages did not have any 'lock' icon indicating
the site was secure
- HTTP Onion Service pages would be marked as unencrypted in the Page
Info screen
- Mixed-mode content restrictions did not apply to HTTP Onion Service
pages embedding Non-Onion HTTP content
This patch fixes the above issues, and also adds several new 'Onion'
icons to the mix to indicate all of the various permutations of Onion
Services hosted HTTP or HTTPS pages with HTTP or HTTPS content.
Strings for Onion Service Page Info page are pulled from Torbutton's
localization strings.
- - - - -
98487808 by Pier Angelo Vendrame at 2024-01-15T18:18:29+01:00
fixup! Bug 23247: Communicating security expectations for .onion
Bug 42334: Adapt our self-signed patch to Bug 1611381
Bug 1611381 introduced a few changes to catch more self-signed
certificates. As a result, we risk of accepting some cases different
than unknown issuer for .onion certificates, such as bad signature or
invalid use for a certificate.
It makes sense to still display an error for such cases, and to keep
accepting only unknown issuers.
- - - - -
a7a5e10b by Kathy Brade at 2024-01-15T18:18:30+01:00
Bug 30237: Add v3 onion services client authentication prompt
When Tor informs the browser that client authentication is needed,
temporarily load about:blank instead of about:neterror and prompt
for the user's key.
If a correctly formatted key is entered, use Tor's ONION_CLIENT_AUTH_ADD
control port command to add the key (via Torbutton's control port
module) and reload the page.
If the user cancels the prompt, display the standard about:neterror
"Unable to connect" page. This requires a small change to
browser/actors/NetErrorChild.jsm to account for the fact that the
docShell no longer has the failedChannel information. The failedChannel
is used to extract TLS-related error info, which is not applicable
in the case of a canceled .onion authentication prompt.
Add a leaveOpen option to PopupNotifications.show so we can display
error messages within the popup notification doorhanger without
closing the prompt.
Add support for onion services strings to the TorStrings module.
Add support for Tor extended SOCKS errors (Tor proposal 304) to the
socket transport and SOCKS layers. Improved display of all of these
errors will be implemented as part of bug 30025.
Also fixes bug 19757:
Add a "Remember this key" checkbox to the client auth prompt.
Add an "Onion Services Authentication" section within the
about:preferences "Privacy & Security section" to allow
viewing and removal of v3 onion client auth keys that have
been stored on disk.
Also fixes bug 19251: use enhanced error pages for onion service errors.
- - - - -
6d64e9a0 by Alex Catarineu at 2024-01-15T18:18:30+01:00
Bug 21952: Implement Onion-Location
Whenever a valid Onion-Location HTTP header (or corresponding HTML
<meta> http-equiv attribute) is found in a document load, we either
redirect to it (if the user opted-in via preference) or notify the
presence of an onionsite alternative with a badge in the urlbar.
- - - - -
1b77a1c5 by Pier Angelo Vendrame at 2024-01-15T18:18:30+01:00
Bug 40458: Implement .tor.onion aliases
We have enabled HTTPS-Only mode, therefore we do not need
HTTPS-Everywhere anymore.
However, we want to keep supporting .tor.onion aliases (especially for
securedrop).
Therefore, in this patch we implemented the parsing of HTTPS-Everywhere
rulesets, and the redirect of .tor.onion domains.
Actually, Tor Browser believes they are actual domains. We change them
on the fly on the SOCKS proxy requests to resolve the domain, and on
the code that verifies HTTPS certificates.
- - - - -
07cff11e by hackademix at 2024-01-15T18:18:31+01:00
fixup! Bug 40458: Implement .tor.onion aliases
Bug 42099: Blind cross-site .onion requests.
- - - - -
ee0ed93b by Pier Angelo Vendrame at 2024-01-15T18:18:31+01:00
Bug 11698: Incorporate Tor Browser Manual pages into Tor Browser
This patch associates the about:manual page to a translated page that
must be injected to browser/omni.ja after the build.
The content must be placed in chrome/browser/content/browser/manual/, so
that is then available at chrome://browser/content/manual/.
We preferred giving absolute freedom to the web team, rather than having
to change the patch in case of changes on the documentation.
- - - - -
f2153dca by Pier Angelo Vendrame at 2024-01-15T18:18:31+01:00
Bug 41435: Add a Tor Browser migration function
For now this function only deletes old language packs for which we are
already packaging the strings with the application.
- - - - -
8bb74fe0 by Henry Wilkes at 2024-01-15T18:18:32+01:00
Bug 42110: Add TorUIUtils module for common tor component methods.
- - - - -
8c46471b by Dan Ballard at 2024-01-15T18:18:32+01:00
Bug 40701: Add security warning when downloading a file
Shown in the downloads panel, about:downloads and places.xhtml.
- - - - -
512958ef by Henry Wilkes at 2024-01-15T18:18:32+01:00
Bug 41736: Customize toolbar for tor-browser.
- - - - -
8019a07a by hackademix at 2024-01-15T18:18:33+01:00
Bug 41728: Pin bridges.torproject.org domains to Let's Encrypt's root cert public key
- - - - -
70c5aa16 by Henry Wilkes at 2024-01-15T18:18:33+01:00
Customize moz-toggle for tor-browser.
- - - - -
9194a262 by Richard Pospesel at 2024-01-15T18:18:33+01:00
Bug 41822: Unconditionally disable default browser UX in about:preferences
- - - - -
30 changed files:
- .eslintignore
- .gitignore
- + .gitlab/issue_templates/Backport Android Security Fixes.md
- + .gitlab/issue_templates/Rebase Browser - Alpha.md
- + .gitlab/issue_templates/Rebase Browser - Stable.md
- + .gitlab/issue_templates/bug.md
- + .gitlab/merge_request_templates/default.md
- accessible/android/SessionAccessibility.cpp
- accessible/android/SessionAccessibility.h
- accessible/ipc/DocAccessibleParent.cpp
- accessible/ipc/DocAccessibleParent.h
- accessible/ipc/moz.build
- + browser/actors/AboutTBUpdateChild.jsm
- + browser/actors/AboutTBUpdateParent.jsm
- + browser/actors/CryptoSafetyChild.jsm
- + browser/actors/CryptoSafetyParent.jsm
- − browser/actors/RFPHelperChild.sys.mjs
- − browser/actors/RFPHelperParent.sys.mjs
- browser/actors/moz.build
- browser/app/Makefile.in
- browser/app/macbuild/Contents/Info.plist.in
- browser/app/macbuild/Contents/MacOS-files.in
- browser/app/moz.build
- browser/app/permissions
- + browser/app/profile/000-tor-browser.js
- + browser/app/profile/001-base-profile.js
- browser/app/profile/firefox.js
- browser/base/content/aboutDialog-appUpdater.js
- browser/base/content/aboutDialog.js
- browser/base/content/aboutDialog.xhtml
The diff was not included because it is too large.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/45a553…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/45a553…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser] Pushed new branch mullvad-browser-115.7.0esr-13.5-1
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed new branch mullvad-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/tree/mullv…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser] Pushed new branch mullvad-browser-115.7.0esr-13.0-1
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed new branch mullvad-browser-115.7.0esr-13.0-1 at The Tor Project / Applications / Mullvad Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/tree/mullv…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser] Pushed new branch tor-browser-115.7.0esr-13.5-1
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed new branch tor-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/tor-brows…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser] Pushed new branch tor-browser-115.7.0esr-13.0-1
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed new branch tor-browser-115.7.0esr-13.0-1 at The Tor Project / Applications / Tor Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/tor-brows…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser] Pushed new tag FIREFOX_115_7_0esr_BUILD1
by Pier Angelo Vendrame (@pierov) 16 Jan '24
by Pier Angelo Vendrame (@pierov) 16 Jan '24
16 Jan '24
Pier Angelo Vendrame pushed new tag FIREFOX_115_7_0esr_BUILD1 at The Tor Project / Applications / Tor Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/FIREFOX_1…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][base-browser-115.6.0esr-13.5-1] 3 commits: fixup! Base Browser's .mozconfigs.
by Pier Angelo Vendrame (@pierov) 15 Jan '24
by Pier Angelo Vendrame (@pierov) 15 Jan '24
15 Jan '24
Pier Angelo Vendrame pushed to branch base-browser-115.6.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
87e50941 by Pier Angelo Vendrame at 2024-01-15T18:30:54+01:00
fixup! Base Browser's .mozconfigs.
Bug 42337: Enable GeckoDriver for all desktop platforms
- - - - -
2aaaaab1 by Pier Angelo Vendrame at 2024-01-15T18:30:58+01:00
fixup! Base Browser's .mozconfigs.
Bug 42146: Use LLD on Linux.
This should allow us to restore debug symbols on Linux i686.
- - - - -
b6fdd885 by Tom Ritter at 2024-01-15T18:39:37+01:00
Bug 1873526: Refactor the restriction override list from a big if statement to a list r=KrisWright
Differential Revision: https://phabricator.services.mozilla.com/D198081
- - - - -
5 changed files:
- browser/config/mozconfigs/base-browser
- modules/libpref/Preferences.cpp
- mozconfig-linux-i686
- mozconfig-linux-x86_64
- mozconfig-linux-x86_64-dev
Changes:
=====================================
browser/config/mozconfigs/base-browser
=====================================
@@ -50,4 +50,7 @@ if test -z "$WASI_SYSROOT"; then
ac_add_options --without-wasm-sandboxed-libraries
fi
+# tor-browser#42337
+ac_add_options --enable-geckodriver
+
ac_add_options --with-relative-data-dir=BaseBrowser/Data/Browser
=====================================
modules/libpref/Preferences.cpp
=====================================
@@ -6024,7 +6024,8 @@ struct PrefListEntry {
// StaticPrefList.yml), a string pref, and it is NOT exempted in
// sDynamicPrefOverrideList
//
-// This behavior is codified in ShouldSanitizePreference() below
+// This behavior is codified in ShouldSanitizePreference() below.
+// Exclusions of preferences can be defined in sOverrideRestrictionsList[].
static const PrefListEntry sRestrictFromWebContentProcesses[] = {
// Remove prefs with user data
PREF_LIST_ENTRY("datareporting.policy."),
@@ -6073,6 +6074,15 @@ static const PrefListEntry sRestrictFromWebContentProcesses[] = {
PREF_LIST_ENTRY("toolkit.telemetry.previousBuildID"),
};
+// Allowlist for prefs and branches blocklisted in
+// sRestrictFromWebContentProcesses[], including prefs from
+// StaticPrefList.yaml and *.js, to let them pass.
+static const PrefListEntry sOverrideRestrictionsList[]{
+ PREF_LIST_ENTRY("services.settings.clock_skew_seconds"),
+ PREF_LIST_ENTRY("services.settings.last_update_seconds"),
+ PREF_LIST_ENTRY("services.settings.server"),
+};
+
// These prefs are dynamically-named (i.e. not specified in prefs.js or
// StaticPrefList) and would normally by blocklisted but we allow them through
// anyway, so this override list acts as an allowlist
@@ -6168,10 +6178,12 @@ static bool ShouldSanitizePreference(const Pref* const aPref) {
// pref through.
for (const auto& entry : sRestrictFromWebContentProcesses) {
if (strncmp(entry.mPrefBranch, prefName, entry.mLen) == 0) {
- const auto* p = prefName; // This avoids clang-format doing ugly things.
- return !(strncmp("services.settings.clock_skew_seconds", p, 36) == 0 ||
- strncmp("services.settings.last_update_seconds", p, 37) == 0 ||
- strncmp("services.settings.server", p, 24) == 0);
+ for (const auto& pasEnt : sOverrideRestrictionsList) {
+ if (strncmp(pasEnt.mPrefBranch, prefName, pasEnt.mLen) == 0) {
+ return false;
+ }
+ }
+ return true;
}
}
=====================================
mozconfig-linux-i686
=====================================
@@ -2,8 +2,11 @@
ac_add_options --target=i686-linux-gnu
-ac_add_options --enable-default-toolkit=cairo-gtk3
+# Moz switched to lld for all Linux targets in Bug 1839739.
+# Also, gold used not to work with debug symbols (tor-browser#42146).
+ac_add_options --enable-linker=lld
+
+ac_add_options --disable-strip
+ac_add_options --disable-install-strip
-# Bug 31448: ld.gold fails if we don't disable debug-symbols.
-# Also, we keep strip enabled.
-ac_add_options --disable-debug-symbols
+ac_add_options --enable-default-toolkit=cairo-gtk3
=====================================
mozconfig-linux-x86_64
=====================================
@@ -1,9 +1,9 @@
. $topsrcdir/browser/config/mozconfigs/base-browser
-ac_add_options --enable-default-toolkit=cairo-gtk3
+# Moz switched to lld for all Linux targets in Bug 1839739.
+ac_add_options --enable-linker=lld
ac_add_options --disable-strip
ac_add_options --disable-install-strip
-# We want to bundle an own geckodriver, so we can use it for QA and other work
-ac_add_options --enable-geckodriver
+ac_add_options --enable-default-toolkit=cairo-gtk3
=====================================
mozconfig-linux-x86_64-dev
=====================================
@@ -4,6 +4,9 @@
# It is only intended to be used when doing incremental Linux builds
# during development.
+# Moz switched to lld for all Linux targets in Bug 1839739.
+ac_add_options --enable-linker=lld
+
export MOZILLA_OFFICIAL=
ac_add_options --enable-default-toolkit=cairo-gtk3
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/ae39cc…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/ae39cc…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.6.0esr-13.5-1] 3 commits: dropme! Bug 40458: Implement .tor.onion aliases
by Pier Angelo Vendrame (@pierov) 15 Jan '24
by Pier Angelo Vendrame (@pierov) 15 Jan '24
15 Jan '24
Pier Angelo Vendrame pushed to branch tor-browser-115.6.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
05d20cc1 by Pier Angelo Vendrame at 2024-01-15T09:46:08+01:00
dropme! Bug 40458: Implement .tor.onion aliases
Bug 42354: Upstreamed the ShouldSanitizePreference refactor
Drop this commit on the rebase.
- - - - -
d548b69e by Tom Ritter at 2024-01-15T09:54:34+01:00
Bug 1873526: Refactor the restriction override list from a big if statement to a list r=KrisWright
Differential Revision: https://phabricator.services.mozilla.com/D198081
- - - - -
5cbefa67 by guest475646844 at 2024-01-15T09:57:16+01:00
fixup! Bug 40458: Implement .tor.onion aliases
- - - - -
1 changed file:
- modules/libpref/Preferences.cpp
Changes:
=====================================
modules/libpref/Preferences.cpp
=====================================
@@ -6024,7 +6024,8 @@ struct PrefListEntry {
// StaticPrefList.yml), a string pref, and it is NOT exempted in
// sDynamicPrefOverrideList
//
-// This behavior is codified in ShouldSanitizePreference() below
+// This behavior is codified in ShouldSanitizePreference() below.
+// Exclusions of preferences can be defined in sOverrideRestrictionsList[].
static const PrefListEntry sRestrictFromWebContentProcesses[] = {
// Remove prefs with user data
PREF_LIST_ENTRY("datareporting.policy."),
@@ -6073,6 +6074,18 @@ static const PrefListEntry sRestrictFromWebContentProcesses[] = {
PREF_LIST_ENTRY("toolkit.telemetry.previousBuildID"),
};
+// Allowlist for prefs and branches blocklisted in
+// sRestrictFromWebContentProcesses[], including prefs from
+// StaticPrefList.yaml and *.js, to let them pass.
+static const PrefListEntry sOverrideRestrictionsList[]{
+ PREF_LIST_ENTRY("services.settings.clock_skew_seconds"),
+ PREF_LIST_ENTRY("services.settings.last_update_seconds"),
+ PREF_LIST_ENTRY("services.settings.server"),
+ // tor-browser#41165, tor-browser!765: leave this static pref in
+ // gSharedMap to prevent a crash in gpu process in debug builds.
+ PREF_LIST_ENTRY("browser.urlbar.onionRewrites.enabled"),
+};
+
// These prefs are dynamically-named (i.e. not specified in prefs.js or
// StaticPrefList) and would normally by blocklisted but we allow them through
// anyway, so this override list acts as an allowlist
@@ -6168,13 +6181,12 @@ static bool ShouldSanitizePreference(const Pref* const aPref) {
// pref through.
for (const auto& entry : sRestrictFromWebContentProcesses) {
if (strncmp(entry.mPrefBranch, prefName, entry.mLen) == 0) {
- const auto* p = prefName; // This avoids clang-format doing ugly things.
- return !(strncmp("services.settings.clock_skew_seconds", p, 36) == 0 ||
- strncmp("services.settings.last_update_seconds", p, 37) == 0 ||
- strncmp("services.settings.server", p, 24) == 0 ||
- // Prevent a crash in debug builds. Please refer to
- // StaticPrefList.yaml, tor-browser#41165 and tor-browser!765 for details.
- strncmp("browser.urlbar.onionRewrites.enabled", p, 36) == 0);
+ for (const auto& pasEnt : sOverrideRestrictionsList) {
+ if (strncmp(pasEnt.mPrefBranch, prefName, pasEnt.mLen) == 0) {
+ return false;
+ }
+ }
+ return true;
}
}
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/0c55a3…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/0c55a3…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/torbrowser-launcher][main] Add script to tag new release (#13)
by boklm (@boklm) 15 Jan '24
by boklm (@boklm) 15 Jan '24
15 Jan '24
boklm pushed to branch main at The Tor Project / Applications / torbrowser-launcher
Commits:
899ea231 by Nicolas Vigier at 2024-01-12T11:13:05+01:00
Add script to tag new release (#13)
- - - - -
1 changed file:
- + git-tag_release.sh
Changes:
=====================================
git-tag_release.sh
=====================================
@@ -0,0 +1,6 @@
+#!/bin/sh
+# Make a signed git tag for the current commit, for a new release
+set -e
+VERSION=$(cat share/torbrowser-launcher/version)
+git tag -s --message="torbrowser-launcher version $VERSION" v$VERSION
+echo "Created git tag v$VERSION"
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/commit…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/commit…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

12 Jan '24
boklm pushed new tag v0.3.7 at The Tor Project / Applications / torbrowser-launcher
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/tree/v…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/torbrowser-launcher][main] Version bump to 0.3.7 and update changelog
by boklm (@boklm) 12 Jan '24
by boklm (@boklm) 12 Jan '24
12 Jan '24
boklm pushed to branch main at The Tor Project / Applications / torbrowser-launcher
Commits:
e4bb9790 by Nicolas Vigier at 2024-01-11T20:00:16+01:00
Version bump to 0.3.7 and update changelog
- - - - -
3 changed files:
- CHANGELOG.md
- share/metainfo/org.torproject.torbrowser-launcher.metainfo.xml
- share/torbrowser-launcher/version
Changes:
=====================================
CHANGELOG.md
=====================================
@@ -1,5 +1,19 @@
# Tor Browser Launcher Changelog
+## 0.3.7
+
+* Use Tor Browser 13.0 new filenames
+* Adapt AppArmor profile for Tor Browser 13.0
+* Set the TORBROWSER_LAUNCHER environment variable to make it easier
+ for Tor Browser to see that it is being run by torbrowser-launcher
+* Use a proper rDNS ID in AppStream metainfo
+* Update to latest version of the Tor Browser OpenPGP signing key
+* Remove some unused code to fix a warning
+* Add dbus-glib to the rpm package dependencies
+* Maintenance of torbrowser-launcher has been handed to Tor Project,
+ and the git repository moved to
+ https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/
+
## 0.3.6
* Tor Browser 12.0 no longer uses locales, so the download URL and local path have changed
=====================================
share/metainfo/org.torproject.torbrowser-launcher.metainfo.xml
=====================================
@@ -31,6 +31,7 @@
<update_contact>boklm(a)torproject.org</update_contact>
<content_rating type="oars-1.1"/>
<releases>
+ <release version="0.3.7" date="2024-01-12"/>
<release version="0.3.6" date="2022-12-13"/>
</releases>
</component>
=====================================
share/torbrowser-launcher/version
=====================================
@@ -1 +1 @@
-0.3.6
+0.3.7
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/commit…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/commit…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/torbrowser-launcher][main] Remove gnupg_import_ok_pattern from torbrowser_launcher/common.py (#12)
by boklm (@boklm) 11 Jan '24
by boklm (@boklm) 11 Jan '24
11 Jan '24
boklm pushed to branch main at The Tor Project / Applications / torbrowser-launcher
Commits:
10a13e3f by Nicolas Vigier at 2024-01-11T13:33:31+01:00
Remove gnupg_import_ok_pattern from torbrowser_launcher/common.py (#12)
According to https://github.com/torproject/torbrowser-launcher/pull/716
the definition of `gnupg_import_ok_pattern` in
`torbrowser_launcher/common.py` is causing some warnings.
But it looks like it is not being used since
83fa1d38c44f16a76dd98407e321b9cc9b5b5743, so we can remove it.
Thanks to meator for reporting the issue.
- - - - -
1 changed file:
- torbrowser_launcher/common.py
Changes:
=====================================
torbrowser_launcher/common.py
=====================================
@@ -41,15 +41,6 @@ SHARE = os.getenv("TBL_SHARE", sys.prefix + "/share") + "/torbrowser-launcher"
gettext.install("torbrowser-launcher")
-# We're looking for output which:
-#
-# 1. The first portion must be `[GNUPG:] IMPORT_OK`
-# 2. The second must be an integer between [0, 15], inclusive
-# 3. The third must be an uppercased hex-encoded 160-bit fingerprint
-gnupg_import_ok_pattern = re.compile(
- b"(\[GNUPG\:\]) (IMPORT_OK) ([0-9]|[1]?[0-5]) ([A-F0-9]{40})"
-)
-
class Common(object):
def __init__(self, tbl_version):
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/commit…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/commit…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.0-1] 10 commits: fixup! Bug 1823316 - Use 'Snackbar' themed Dialog to notify on making app full-screen
by ma1 (@ma1) 11 Jan '24
by ma1 (@ma1) 11 Jan '24
11 Jan '24
ma1 pushed to branch firefox-android-115.2.1-13.0-1 at The Tor Project / Applications / firefox-android
Commits:
753c937e by hackademix at 2024-01-11T16:53:03+01:00
fixup! Bug 1823316 - Use 'Snackbar' themed Dialog to notify on making app full-screen
Fix tor-browser#42355 backporting regression.
- - - - -
0cd27910 by t-p-white at 2024-01-11T16:53:04+01:00
Bug 1864549 - Fix for IllegalStateException in full screen notification dialog
- - - - -
a7cafd1b by Alexandru2909 at 2024-01-11T16:53:04+01:00
Bug 1810776 - Move DismissedTabBackground into its own file
- - - - -
e40a62ad by DreVla at 2024-01-11T16:53:05+01:00
Bug 1828493 - Apply purple overlay on list item when in multi-select
When having the list layout for tabs tray and entering multi-select
mode, the selected list items should have a purple non opaque overlay
on the thumbnail, as it was before in the XML implementation.
- - - - -
b4e5ab52 by Alexandru2909 at 2024-01-11T16:53:05+01:00
Bug 1810776 - Add SwipeToDismiss to composed tabs tray
- - - - -
20a18e5b by Noah Bond at 2024-01-11T16:53:05+01:00
Bug 1815579 - Improve performance of image loading in tab items
- - - - -
a07ec0d9 by Noah Bond at 2024-01-11T16:53:06+01:00
Bug 1840896 - Remove `rememberSaveable` since bitmaps are not serializable
- - - - -
a860d4a3 by Noah Bond at 2024-01-11T16:53:06+01:00
Bug 1844967 - Improve performance of tab thumbnail loading in Compose
- - - - -
0481dabe by Matthew Tighe at 2024-01-11T16:53:07+01:00
Bug 1721904 - update thumbnail caching on app open
- - - - -
3400c111 by hackademix at 2024-01-11T16:53:07+01:00
Bug 42191: Temporary StrictMode relaxation to clear the thumbnail cache.
- - - - -
30 changed files:
- android-components/components/browser/state/src/main/java/mozilla/components/browser/state/action/BrowserAction.kt
- android-components/components/browser/state/src/main/java/mozilla/components/browser/state/reducer/ContentStateReducer.kt
- android-components/components/browser/tabstray/src/main/java/mozilla/components/browser/tabstray/TabViewHolder.kt
- android-components/components/browser/tabstray/src/test/java/mozilla/components/browser/tabstray/DefaultTabViewHolderTest.kt
- android-components/components/browser/thumbnails/src/main/java/mozilla/components/browser/thumbnails/ThumbnailsMiddleware.kt
- android-components/components/browser/thumbnails/src/main/java/mozilla/components/browser/thumbnails/storage/ThumbnailStorage.kt
- android-components/components/browser/thumbnails/src/main/java/mozilla/components/browser/thumbnails/utils/ThumbnailDiskCache.kt
- android-components/components/browser/thumbnails/src/test/java/mozilla/components/browser/thumbnails/ThumbnailsMiddlewareTest.kt
- android-components/components/browser/thumbnails/src/test/java/mozilla/components/browser/thumbnails/loader/ThumbnailLoaderTest.kt
- android-components/components/browser/thumbnails/src/test/java/mozilla/components/browser/thumbnails/storage/ThumbnailStorageTest.kt
- android-components/components/browser/thumbnails/src/test/java/mozilla/components/browser/thumbnails/utils/ThumbnailDiskCacheTest.kt
- android-components/components/concept/base/src/main/java/mozilla/components/concept/base/images/ImageRequest.kt
- android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/FullScreenNotificationDialog.kt
- fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
- fenix/app/src/main/java/org/mozilla/fenix/browser/TabPreview.kt
- fenix/app/src/main/java/org/mozilla/fenix/browser/ToolbarGestureHandler.kt
- + fenix/app/src/main/java/org/mozilla/fenix/compose/SwipeToDismiss.kt
- + fenix/app/src/main/java/org/mozilla/fenix/compose/TabThumbnail.kt
- fenix/app/src/main/java/org/mozilla/fenix/compose/ThumbnailCard.kt
- + fenix/app/src/main/java/org/mozilla/fenix/compose/ThumbnailImage.kt
- fenix/app/src/main/java/org/mozilla/fenix/compose/list/ListItem.kt
- + fenix/app/src/main/java/org/mozilla/fenix/compose/tabstray/DismissedTabBackground.kt
- fenix/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt
- fenix/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabListItem.kt
- fenix/app/src/main/java/org/mozilla/fenix/home/collections/CollectionItem.kt
- fenix/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTab.kt
- fenix/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTabViewHolder.kt
- fenix/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabViewHolder.kt
- fenix/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabs.kt
- fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTray.kt
The diff was not included because it is too large.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/compare/da…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/compare/da…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.6.0esr-13.5-1] fixup! Bug 40597: Implement TorSettings module
by Pier Angelo Vendrame (@pierov) 11 Jan '24
by Pier Angelo Vendrame (@pierov) 11 Jan '24
11 Jan '24
Pier Angelo Vendrame pushed to branch tor-browser-115.6.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
0c55a36a by Pier Angelo Vendrame at 2024-01-09T18:39:07+01:00
fixup! Bug 40597: Implement TorSettings module
Bug 42348: Do not use TorSettings.defaultSettings as a starting point
for the settings object we receive from Moat.
Also, removed the TODO about proxy and firewall, since Moat is not
going to send them for now, but throw when we do not receive bridge
settings.
- - - - -
1 changed file:
- toolkit/modules/Moat.sys.mjs
Changes:
=====================================
toolkit/modules/Moat.sys.mjs
=====================================
@@ -2,10 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import {
- TorSettings,
- TorBridgeSource,
-} from "resource://gre/modules/TorSettings.sys.mjs";
+import { TorBridgeSource } from "resource://gre/modules/TorSettings.sys.mjs";
const lazy = {};
@@ -204,68 +201,52 @@ export class MoatRPC {
// Convert received settings object to format used by TorSettings module
// In the event of error, just return null
#fixupSettings(settings) {
- try {
- let retval = TorSettings.defaultSettings();
- if ("bridges" in settings) {
- retval.bridges.enabled = true;
- switch (settings.bridges.source) {
- case "builtin":
- retval.bridges.source = TorBridgeSource.BuiltIn;
- retval.bridges.builtin_type = settings.bridges.type;
- // Tor Browser will periodically update the built-in bridge strings list using the
- // circumvention_builtin() function, so we can ignore the bridge strings we have received here;
- // BridgeDB only returns a subset of the available built-in bridges through the circumvention_settings()
- // function which is fine for our 3rd parties, but we're better off ignoring them in Tor Browser, otherwise
- // we get in a weird situation of needing to update our built-in bridges in a piece-meal fashion which
- // seems over-complicated/error-prone
- break;
- case "bridgedb":
- retval.bridges.source = TorBridgeSource.BridgeDB;
- if (settings.bridges.bridge_strings) {
- retval.bridges.bridge_strings = settings.bridges.bridge_strings;
- retval.bridges.disabled_strings = [];
- } else {
- throw new Error(
- "MoatRPC::_fixupSettings(): Received no bridge-strings for BridgeDB bridge source"
- );
- }
- break;
- default:
- throw new Error(
- `MoatRPC::_fixupSettings(): Unexpected bridge source '${settings.bridges.source}'`
- );
+ if (!("bridges" in settings)) {
+ throw new Error("Expected to find `bridges` in the settings object.");
+ }
+ const retval = {
+ bridges: {
+ enabled: true,
+ },
+ };
+ switch (settings.bridges.source) {
+ case "builtin":
+ retval.bridges.source = TorBridgeSource.BuiltIn;
+ retval.bridges.builtin_type = settings.bridges.type;
+ // TorSettings will ignore strings for built-in bridges, and use the
+ // ones it already knows, instead.
+ break;
+ case "bridgedb":
+ retval.bridges.source = TorBridgeSource.BridgeDB;
+ if (settings.bridges.bridge_strings) {
+ retval.bridges.bridge_strings = settings.bridges.bridge_strings;
+ } else {
+ throw new Error(
+ "Received no bridge-strings for BridgeDB bridge source"
+ );
}
- }
- if ("proxy" in settings) {
- // TODO: populate proxy settings
- }
- if ("firewall" in settings) {
- // TODO: populate firewall settings
- }
- return retval;
- } catch (ex) {
- console.log(ex.message);
- return null;
+ break;
+ default:
+ throw new Error(
+ `Unexpected bridge source '${settings.bridges.source}'`
+ );
}
+ return retval;
}
// Converts a list of settings objects received from BridgeDB to a list of settings objects
// understood by the TorSettings module
// In the event of error, returns and empty list
#fixupSettingsList(settingsList) {
- try {
- let retval = [];
- for (let settings of settingsList) {
- settings = this.#fixupSettings(settings);
- if (settings != null) {
- retval.push(settings);
- }
+ const retval = [];
+ for (const settings of settingsList) {
+ try {
+ retval.push(this.#fixupSettings(settings));
+ } catch (ex) {
+ console.log(ex);
}
- return retval;
- } catch (ex) {
- console.log(ex.message);
- return [];
}
+ return retval;
}
// Request tor settings for the user optionally based on their location (derived
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/0c55a36…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/0c55a36…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.6.0esr-13.5-1] fixup! Bug 40597: Implement TorSettings module
by Pier Angelo Vendrame (@pierov) 11 Jan '24
by Pier Angelo Vendrame (@pierov) 11 Jan '24
11 Jan '24
Pier Angelo Vendrame pushed to branch tor-browser-115.6.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
da0f3108 by Pier Angelo Vendrame at 2024-01-09T18:38:42+01:00
fixup! Bug 40597: Implement TorSettings module
Bug 42358: Extract the domain fronting request functionality form MoatRPC.
- - - - -
3 changed files:
- + toolkit/modules/DomainFrontedRequests.sys.mjs
- toolkit/modules/Moat.sys.mjs
- toolkit/modules/moz.build
Changes:
=====================================
toolkit/modules/DomainFrontedRequests.sys.mjs
=====================================
@@ -0,0 +1,525 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const lazy = {};
+
+ChromeUtils.defineESModuleGetters(lazy, {
+ EventDispatcher: "resource://gre/modules/Messaging.sys.mjs",
+ Subprocess: "resource://gre/modules/Subprocess.sys.mjs",
+ TorLauncherUtil: "resource://gre/modules/TorLauncherUtil.sys.mjs",
+ TorProviderBuilder: "resource://gre/modules/TorProviderBuilder.sys.mjs",
+ TorSettings: "resource://gre/modules/TorSettings.sys.mjs",
+});
+
+/**
+ * The meek pluggable transport takes the reflector URL and front domain as
+ * proxy credentials, which can be prepared with this function.
+ *
+ * @param {string} proxyType The proxy type (socks for socks5 or socks4)
+ * @param {string} reflector The URL of the service hosted by the CDN
+ * @param {string} front The domain to use as a front
+ * @returns {string[]} An array containing [username, password]
+ */
+function makeMeekCredentials(proxyType, reflector, front) {
+ // Construct the per-connection arguments.
+ let meekClientEscapedArgs = "";
+
+ // Escape aValue per section 3.5 of the PT specification:
+ // First the "<Key>=<Value>" formatted arguments MUST be escaped,
+ // such that all backslash, equal sign, and semicolon characters
+ // are escaped with a backslash.
+ const escapeArgValue = aValue =>
+ aValue
+ ? aValue
+ .replaceAll("\\", "\\\\")
+ .replaceAll("=", "\\=")
+ .replaceAll(";", "\\;")
+ : "";
+
+ if (reflector) {
+ meekClientEscapedArgs += "url=";
+ meekClientEscapedArgs += escapeArgValue(reflector);
+ }
+
+ if (front) {
+ if (meekClientEscapedArgs.length) {
+ meekClientEscapedArgs += ";";
+ }
+ meekClientEscapedArgs += "front=";
+ meekClientEscapedArgs += escapeArgValue(front);
+ }
+
+ // socks5
+ if (proxyType === "socks") {
+ if (meekClientEscapedArgs.length <= 255) {
+ return [meekClientEscapedArgs, "\x00"];
+ }
+ return [
+ meekClientEscapedArgs.substring(0, 255),
+ meekClientEscapedArgs.substring(255),
+ ];
+ } else if (proxyType === "socks4") {
+ return [meekClientEscapedArgs, undefined];
+ }
+ throw new Error(`Unsupported proxy type ${proxyType}.`);
+}
+
+/**
+ * Subprocess-based implementation to launch and control a PT process.
+ */
+class MeekTransport {
+ // These members are used by consumers to setup the proxy to do requests over
+ // meek. They are passed to newProxyInfoWithAuth.
+ proxyType = null;
+ proxyAddress = null;
+ proxyPort = 0;
+ proxyUsername = null;
+ proxyPassword = null;
+
+ #inited = false;
+ #meekClientProcess = null;
+
+ // launches the meekprocess
+ async init(reflector, front) {
+ // ensure we haven't already init'd
+ if (this.#inited) {
+ throw new Error("MeekTransport: Already initialized");
+ }
+
+ try {
+ // figure out which pluggable transport to use
+ const supportedTransports = ["meek", "meek_lite"];
+ const provider = await lazy.TorProviderBuilder.build();
+ const proxy = (await provider.getPluggableTransports()).find(
+ pt =>
+ pt.type === "exec" &&
+ supportedTransports.some(t => pt.transports.includes(t))
+ );
+ if (!proxy) {
+ throw new Error("No supported transport found.");
+ }
+
+ const meekTransport = proxy.transports.find(t =>
+ supportedTransports.includes(t)
+ );
+ // Convert meek client path to absolute path if necessary
+ const meekWorkDir = lazy.TorLauncherUtil.getTorFile(
+ "pt-startup-dir",
+ false
+ );
+ if (lazy.TorLauncherUtil.isPathRelative(proxy.pathToBinary)) {
+ const meekPath = meekWorkDir.clone();
+ meekPath.appendRelativePath(proxy.pathToBinary);
+ proxy.pathToBinary = meekPath.path;
+ }
+
+ // Setup env and start meek process
+ const ptStateDir = lazy.TorLauncherUtil.getTorFile("tordatadir", false);
+ ptStateDir.append("pt_state"); // Match what tor uses.
+
+ const envAdditions = {
+ TOR_PT_MANAGED_TRANSPORT_VER: "1",
+ TOR_PT_STATE_LOCATION: ptStateDir.path,
+ TOR_PT_EXIT_ON_STDIN_CLOSE: "1",
+ TOR_PT_CLIENT_TRANSPORTS: meekTransport,
+ };
+ if (lazy.TorSettings.proxy.enabled) {
+ envAdditions.TOR_PT_PROXY = lazy.TorSettings.proxy.uri;
+ }
+
+ const opts = {
+ command: proxy.pathToBinary,
+ arguments: proxy.options.split(/s+/),
+ workdir: meekWorkDir.path,
+ environmentAppend: true,
+ environment: envAdditions,
+ stderr: "pipe",
+ };
+
+ // Launch meek client
+ this.#meekClientProcess = await lazy.Subprocess.call(opts);
+
+ // Callback chain for reading stderr
+ const stderrLogger = async () => {
+ while (this.#meekClientProcess) {
+ const errString = await this.#meekClientProcess.stderr.readString();
+ if (errString) {
+ console.log(`MeekTransport: stderr => ${errString}`);
+ }
+ }
+ };
+ stderrLogger();
+
+ // Read pt's stdout until terminal (CMETHODS DONE) is reached
+ // returns array of lines for parsing
+ const getInitLines = async (stdout = "") => {
+ stdout += await this.#meekClientProcess.stdout.readString();
+
+ // look for the final message
+ const CMETHODS_DONE = "CMETHODS DONE";
+ let endIndex = stdout.lastIndexOf(CMETHODS_DONE);
+ if (endIndex !== -1) {
+ endIndex += CMETHODS_DONE.length;
+ return stdout.substring(0, endIndex).split("\n");
+ }
+ return getInitLines(stdout);
+ };
+
+ // read our lines from pt's stdout
+ const meekInitLines = await getInitLines();
+ // tokenize our pt lines
+ const meekInitTokens = meekInitLines.map(line => {
+ const tokens = line.split(" ");
+ return {
+ keyword: tokens[0],
+ args: tokens.slice(1),
+ };
+ });
+
+ // parse our pt tokens
+ for (const { keyword, args } of meekInitTokens) {
+ const argsJoined = args.join(" ");
+ let keywordError = false;
+ switch (keyword) {
+ case "VERSION": {
+ if (args.length !== 1 || args[0] !== "1") {
+ keywordError = true;
+ }
+ break;
+ }
+ case "PROXY": {
+ if (args.length !== 1 || args[0] !== "DONE") {
+ keywordError = true;
+ }
+ break;
+ }
+ case "CMETHOD": {
+ if (args.length !== 3) {
+ keywordError = true;
+ break;
+ }
+ const transport = args[0];
+ const proxyType = args[1];
+ const addrPortString = args[2];
+ const addrPort = addrPortString.split(":");
+
+ if (transport !== meekTransport) {
+ throw new Error(
+ `MeekTransport: Expected ${meekTransport} but found ${transport}`
+ );
+ }
+ if (!["socks4", "socks4a", "socks5"].includes(proxyType)) {
+ throw new Error(
+ `MeekTransport: Invalid proxy type => ${proxyType}`
+ );
+ }
+ if (addrPort.length !== 2) {
+ throw new Error(
+ `MeekTransport: Invalid proxy address => ${addrPortString}`
+ );
+ }
+ const addr = addrPort[0];
+ const port = parseInt(addrPort[1]);
+ if (port < 1 || port > 65535) {
+ throw new Error(`MeekTransport: Invalid proxy port => ${port}`);
+ }
+
+ // convert proxy type to strings used by protocol-proxy-servce
+ this.proxyType = proxyType === "socks5" ? "socks" : "socks4";
+ this.proxyAddress = addr;
+ this.proxyPort = port;
+
+ break;
+ }
+ // terminal
+ case "CMETHODS": {
+ if (args.length !== 1 || args[0] !== "DONE") {
+ keywordError = true;
+ }
+ break;
+ }
+ // errors (all fall through):
+ case "VERSION-ERROR":
+ case "ENV-ERROR":
+ case "PROXY-ERROR":
+ case "CMETHOD-ERROR":
+ throw new Error(`MeekTransport: ${keyword} => '${argsJoined}'`);
+ }
+ if (keywordError) {
+ throw new Error(
+ `MeekTransport: Invalid ${keyword} keyword args => '${argsJoined}'`
+ );
+ }
+ }
+
+ // register callback to cleanup on process exit
+ this.#meekClientProcess.wait().then(exitObj => {
+ this.#meekClientProcess = null;
+ this.uninit();
+ });
+ [this.proxyUsername, this.proxyPassword] = makeMeekCredentials(
+ this.proxyType,
+ reflector,
+ front
+ );
+ this.#inited = true;
+ } catch (ex) {
+ if (this.#meekClientProcess) {
+ this.#meekClientProcess.kill();
+ this.#meekClientProcess = null;
+ }
+ throw ex;
+ }
+ }
+
+ async uninit() {
+ this.#inited = false;
+
+ await this.#meekClientProcess?.kill();
+ this.#meekClientProcess = null;
+ this.proxyType = null;
+ this.proxyAddress = null;
+ this.proxyPort = 0;
+ this.proxyUsername = null;
+ this.proxyPassword = null;
+ }
+}
+
+/**
+ * Android implementation of the Meek process.
+ *
+ * GeckoView does not provide the subprocess module, so we have to use the
+ * EventDispatcher, and have a Java handler start and stop the proxy process.
+ */
+class MeekTransportAndroid {
+ // These members are used by consumers to setup the proxy to do requests over
+ // meek. They are passed to newProxyInfoWithAuth.
+ proxyType = null;
+ proxyAddress = null;
+ proxyPort = 0;
+ proxyUsername = null;
+ proxyPassword = null;
+
+ /**
+ * An id for process this instance is linked to.
+ *
+ * Since we do not restrict the transport to be a singleton, we need a handle to
+ * identify the process we want to stop when the transport owner is done.
+ * We use a counter incremented on the Java side for now.
+ *
+ * This number must be a positive integer (i.e., 0 is an invalid handler).
+ *
+ * @type {number}
+ */
+ #id = 0;
+
+ async init(reflector, front) {
+ // ensure we haven't already init'd
+ if (this.#id) {
+ throw new Error("MeekTransport: Already initialized");
+ }
+ const details = await lazy.EventDispatcher.instance.sendRequestForResult({
+ type: "GeckoView:Tor:StartMeek",
+ });
+ this.#id = details.id;
+ this.proxyType = "socks";
+ this.proxyAddress = details.address;
+ this.proxyPort = details.port;
+ [this.proxyUsername, this.proxyPassword] = makeMeekCredentials(
+ this.proxyType,
+ reflector,
+ front
+ );
+ }
+
+ async uninit() {
+ lazy.EventDispatcher.instance.sendRequest({
+ type: "GeckoView:Tor:StopMeek",
+ id: this.#id,
+ });
+ this.#id = 0;
+ this.proxyType = null;
+ this.proxyAddress = null;
+ this.proxyPort = 0;
+ this.proxyUsername = null;
+ this.proxyPassword = null;
+ }
+}
+
+/**
+ * Callback object to promisify the XPCOM request.
+ */
+class ResponseListener {
+ #response = "";
+ #responsePromise;
+ #resolve;
+ #reject;
+ constructor() {
+ this.#response = "";
+ // we need this promise here because await nsIHttpChannel::asyncOpen does
+ // not return only once the request is complete, it seems to return
+ // after it begins, so we have to get the result from this listener object.
+ // This promise is only resolved once onStopRequest is called
+ this.#responsePromise = new Promise((resolve, reject) => {
+ this.#resolve = resolve;
+ this.#reject = reject;
+ });
+ }
+
+ // callers wait on this for final response
+ response() {
+ return this.#responsePromise;
+ }
+
+ // noop
+ onStartRequest(request) {}
+
+ // resolve or reject our Promise
+ onStopRequest(request, status) {
+ try {
+ if (!Components.isSuccessCode(status)) {
+ const errorMessage =
+ lazy.TorLauncherUtil.getLocalizedStringForError(status);
+ this.#reject(new Error(errorMessage));
+ }
+ if (request.responseStatus !== 200) {
+ this.#reject(new Error(request.responseStatusText));
+ }
+ } catch (err) {
+ this.#reject(err);
+ }
+ this.#resolve(this.#response);
+ }
+
+ // read response data
+ onDataAvailable(request, stream, offset, length) {
+ const scriptableStream = Cc[
+ "@mozilla.org/scriptableinputstream;1"
+ ].createInstance(Ci.nsIScriptableInputStream);
+ scriptableStream.init(stream);
+ this.#response += scriptableStream.read(length);
+ }
+}
+
+// constructs the json objects and sends the request over moat
+export class DomainFrontRequestBuilder {
+ #inited = false;
+ #meekTransport = null;
+
+ get inited() {
+ return this.#inited;
+ }
+
+ async init(reflector, front) {
+ if (this.#inited) {
+ throw new Error("MoatRPC: Already initialized");
+ }
+
+ const meekTransport =
+ Services.appinfo.OS === "Android"
+ ? new MeekTransportAndroid()
+ : new MeekTransport();
+ await meekTransport.init(reflector, front);
+ this.#meekTransport = meekTransport;
+ this.#inited = true;
+ }
+
+ async uninit() {
+ await this.#meekTransport?.uninit();
+ this.#meekTransport = null;
+ this.#inited = false;
+ }
+
+ buildHttpHandler(uriString) {
+ if (!this.#inited) {
+ throw new Error("MoatRPC: Not initialized");
+ }
+
+ const { proxyType, proxyAddress, proxyPort, proxyUsername, proxyPassword } =
+ this.#meekTransport;
+
+ const proxyPS = Cc[
+ "@mozilla.org/network/protocol-proxy-service;1"
+ ].getService(Ci.nsIProtocolProxyService);
+ const flags = Ci.nsIProxyInfo.TRANSPARENT_PROXY_RESOLVES_HOST;
+ const noTimeout = 0xffffffff; // UINT32_MAX
+ const proxyInfo = proxyPS.newProxyInfoWithAuth(
+ proxyType,
+ proxyAddress,
+ proxyPort,
+ proxyUsername,
+ proxyPassword,
+ undefined,
+ undefined,
+ flags,
+ noTimeout,
+ undefined
+ );
+
+ const uri = Services.io.newURI(uriString);
+ // There does not seem to be a way to directly create an nsILoadInfo from
+ // JavaScript, so we create a throw away non-proxied channel to get one.
+ const secFlags = Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_SEC_CONTEXT_IS_NULL;
+ const loadInfo = Services.io.newChannelFromURI(
+ uri,
+ undefined,
+ Services.scriptSecurityManager.getSystemPrincipal(),
+ undefined,
+ secFlags,
+ Ci.nsIContentPolicy.TYPE_OTHER
+ ).loadInfo;
+
+ const httpHandler = Services.io
+ .getProtocolHandler("http")
+ .QueryInterface(Ci.nsIHttpProtocolHandler);
+ const ch = httpHandler
+ .newProxiedChannel(uri, proxyInfo, 0, undefined, loadInfo)
+ .QueryInterface(Ci.nsIHttpChannel);
+
+ // remove all headers except for 'Host"
+ const headers = [];
+ ch.visitRequestHeaders({
+ visitHeader: (key, val) => {
+ if (key !== "Host") {
+ headers.push(key);
+ }
+ },
+ });
+ headers.forEach(key => ch.setRequestHeader(key, "", false));
+
+ return ch;
+ }
+
+ /**
+ * Make a POST request with a JSON body.
+ *
+ * @param {string} url The URL to load
+ * @param {object} args The arguments to send to the procedure. It will be
+ * serialized to JSON by this function and then set as POST body
+ * @returns {Promise<object>} A promise with the parsed response
+ */
+ async buildPostRequest(url, args) {
+ const ch = this.buildHttpHandler(url);
+
+ const argsJson = JSON.stringify(args);
+ const inStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(
+ Ci.nsIStringInputStream
+ );
+ inStream.setData(argsJson, argsJson.length);
+ const upChannel = ch.QueryInterface(Ci.nsIUploadChannel);
+ const contentType = "application/vnd.api+json";
+ upChannel.setUploadStream(inStream, contentType, argsJson.length);
+ ch.requestMethod = "POST";
+
+ // Make request
+ const listener = new ResponseListener();
+ await ch.asyncOpen(listener, ch);
+
+ // wait for response
+ const responseJSON = await listener.response();
+
+ // parse that JSON
+ return JSON.parse(responseJSON);
+ }
+}
=====================================
toolkit/modules/Moat.sys.mjs
=====================================
@@ -10,10 +10,8 @@ import {
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
- EventDispatcher: "resource://gre/modules/Messaging.sys.mjs",
- Subprocess: "resource://gre/modules/Subprocess.sys.mjs",
- TorLauncherUtil: "resource://gre/modules/TorLauncherUtil.sys.mjs",
- TorProviderBuilder: "resource://gre/modules/TorProviderBuilder.sys.mjs",
+ DomainFrontRequestBuilder:
+ "resource://gre/modules/DomainFrontedRequests.sys.mjs",
});
const TorLauncherPrefs = Object.freeze({
@@ -22,372 +20,9 @@ const TorLauncherPrefs = Object.freeze({
moat_service: "extensions.torlauncher.moat_service",
});
-function makeMeekCredentials(proxyType) {
- // Construct the per-connection arguments.
- let meekClientEscapedArgs = "";
- const meekReflector = Services.prefs.getStringPref(
- TorLauncherPrefs.bridgedb_reflector
- );
-
- // Escape aValue per section 3.5 of the PT specification:
- // First the "<Key>=<Value>" formatted arguments MUST be escaped,
- // such that all backslash, equal sign, and semicolon characters
- // are escaped with a backslash.
- const escapeArgValue = aValue =>
- aValue
- ? aValue
- .replaceAll("\\", "\\\\")
- .replaceAll("=", "\\=")
- .replaceAll(";", "\\;")
- : "";
-
- if (meekReflector) {
- meekClientEscapedArgs += "url=";
- meekClientEscapedArgs += escapeArgValue(meekReflector);
- }
- const meekFront = Services.prefs.getStringPref(
- TorLauncherPrefs.bridgedb_front
- );
- if (meekFront) {
- if (meekClientEscapedArgs.length) {
- meekClientEscapedArgs += ";";
- }
- meekClientEscapedArgs += "front=";
- meekClientEscapedArgs += escapeArgValue(meekFront);
- }
-
- // socks5
- if (proxyType === "socks") {
- if (meekClientEscapedArgs.length <= 255) {
- return [meekClientEscapedArgs, "\x00"];
- } else {
- return [
- meekClientEscapedArgs.substring(0, 255),
- meekClientEscapedArgs.substring(255),
- ];
- }
- // socks4
- } else {
- return [meekClientEscapedArgs, undefined];
- }
-}
-
-//
-// Launches and controls the PT process lifetime
-//
-class MeekTransport {
- // These members are used by consumers to setup the proxy to do requests over
- // meek. They are passed to newProxyInfoWithAuth.
- proxyType = null;
- proxyAddress = null;
- proxyPort = 0;
- proxyUsername = null;
- proxyPassword = null;
-
- #inited = false;
- #meekClientProcess = null;
-
- // launches the meekprocess
- async init() {
- // ensure we haven't already init'd
- if (this.#inited) {
- throw new Error("MeekTransport: Already initialized");
- }
-
- try {
- // figure out which pluggable transport to use
- const supportedTransports = ["meek", "meek_lite"];
- const provider = await lazy.TorProviderBuilder.build();
- const proxy = (await provider.getPluggableTransports()).find(
- pt =>
- pt.type === "exec" &&
- supportedTransports.some(t => pt.transports.includes(t))
- );
- if (!proxy) {
- throw new Error("No supported transport found.");
- }
-
- const meekTransport = proxy.transports.find(t =>
- supportedTransports.includes(t)
- );
- // Convert meek client path to absolute path if necessary
- const meekWorkDir = lazy.TorLauncherUtil.getTorFile(
- "pt-startup-dir",
- false
- );
- if (lazy.TorLauncherUtil.isPathRelative(proxy.pathToBinary)) {
- const meekPath = meekWorkDir.clone();
- meekPath.appendRelativePath(proxy.pathToBinary);
- proxy.pathToBinary = meekPath.path;
- }
-
- // Setup env and start meek process
- const ptStateDir = lazy.TorLauncherUtil.getTorFile("tordatadir", false);
- ptStateDir.append("pt_state"); // Match what tor uses.
-
- const envAdditions = {
- TOR_PT_MANAGED_TRANSPORT_VER: "1",
- TOR_PT_STATE_LOCATION: ptStateDir.path,
- TOR_PT_EXIT_ON_STDIN_CLOSE: "1",
- TOR_PT_CLIENT_TRANSPORTS: meekTransport,
- };
- if (TorSettings.proxy.enabled) {
- envAdditions.TOR_PT_PROXY = TorSettings.proxy.uri;
- }
-
- const opts = {
- command: proxy.pathToBinary,
- arguments: proxy.options.split(/s+/),
- workdir: meekWorkDir.path,
- environmentAppend: true,
- environment: envAdditions,
- stderr: "pipe",
- };
-
- // Launch meek client
- this.#meekClientProcess = await lazy.Subprocess.call(opts);
-
- // Callback chain for reading stderr
- const stderrLogger = async () => {
- while (this.#meekClientProcess) {
- const errString = await this.#meekClientProcess.stderr.readString();
- if (errString) {
- console.log(`MeekTransport: stderr => ${errString}`);
- }
- }
- };
- stderrLogger();
-
- // Read pt's stdout until terminal (CMETHODS DONE) is reached
- // returns array of lines for parsing
- const getInitLines = async (stdout = "") => {
- stdout += await this.#meekClientProcess.stdout.readString();
-
- // look for the final message
- const CMETHODS_DONE = "CMETHODS DONE";
- let endIndex = stdout.lastIndexOf(CMETHODS_DONE);
- if (endIndex != -1) {
- endIndex += CMETHODS_DONE.length;
- return stdout.substring(0, endIndex).split("\n");
- }
- return getInitLines(stdout);
- };
-
- // read our lines from pt's stdout
- const meekInitLines = await getInitLines();
- // tokenize our pt lines
- const meekInitTokens = meekInitLines.map(line => {
- const tokens = line.split(" ");
- return {
- keyword: tokens[0],
- args: tokens.slice(1),
- };
- });
-
- // parse our pt tokens
- for (const { keyword, args } of meekInitTokens) {
- const argsJoined = args.join(" ");
- let keywordError = false;
- switch (keyword) {
- case "VERSION": {
- if (args.length != 1 || args[0] !== "1") {
- keywordError = true;
- }
- break;
- }
- case "PROXY": {
- if (args.length != 1 || args[0] !== "DONE") {
- keywordError = true;
- }
- break;
- }
- case "CMETHOD": {
- if (args.length != 3) {
- keywordError = true;
- break;
- }
- const transport = args[0];
- const proxyType = args[1];
- const addrPortString = args[2];
- const addrPort = addrPortString.split(":");
-
- if (transport !== meekTransport) {
- throw new Error(
- `MeekTransport: Expected ${meekTransport} but found ${transport}`
- );
- }
- if (!["socks4", "socks4a", "socks5"].includes(proxyType)) {
- throw new Error(
- `MeekTransport: Invalid proxy type => ${proxyType}`
- );
- }
- if (addrPort.length != 2) {
- throw new Error(
- `MeekTransport: Invalid proxy address => ${addrPortString}`
- );
- }
- const addr = addrPort[0];
- const port = parseInt(addrPort[1]);
- if (port < 1 || port > 65535) {
- throw new Error(`MeekTransport: Invalid proxy port => ${port}`);
- }
-
- // convert proxy type to strings used by protocol-proxy-servce
- this.proxyType = proxyType === "socks5" ? "socks" : "socks4";
- this.proxyAddress = addr;
- this.proxyPort = port;
-
- break;
- }
- // terminal
- case "CMETHODS": {
- if (args.length != 1 || args[0] !== "DONE") {
- keywordError = true;
- }
- break;
- }
- // errors (all fall through):
- case "VERSION-ERROR":
- case "ENV-ERROR":
- case "PROXY-ERROR":
- case "CMETHOD-ERROR":
- throw new Error(`MeekTransport: ${keyword} => '${argsJoined}'`);
- }
- if (keywordError) {
- throw new Error(
- `MeekTransport: Invalid ${keyword} keyword args => '${argsJoined}'`
- );
- }
- }
-
- // register callback to cleanup on process exit
- this.#meekClientProcess.wait().then(exitObj => {
- this.#meekClientProcess = null;
- this.uninit();
- });
- [this.proxyUsername, this.proxyPassword] = makeMeekCredentials(
- this.proxyType
- );
- this.#inited = true;
- } catch (ex) {
- if (this.#meekClientProcess) {
- this.#meekClientProcess.kill();
- this.#meekClientProcess = null;
- }
- throw ex;
- }
- }
-
- async uninit() {
- this.#inited = false;
-
- await this.#meekClientProcess?.kill();
- this.#meekClientProcess = null;
- this.proxyType = null;
- this.proxyAddress = null;
- this.proxyPort = 0;
- this.proxyUsername = null;
- this.proxyPassword = null;
- }
-}
-
-class MeekTransportAndroid {
- // These members are used by consumers to setup the proxy to do requests over
- // meek. They are passed to newProxyInfoWithAuth.
- proxyType = null;
- proxyAddress = null;
- proxyPort = 0;
- proxyUsername = null;
- proxyPassword = null;
-
- #id = 0;
-
- async init() {
- // ensure we haven't already init'd
- if (this.#id) {
- throw new Error("MeekTransport: Already initialized");
- }
- const details = await lazy.EventDispatcher.instance.sendRequestForResult({
- type: "GeckoView:Tor:StartMeek",
- });
- this.#id = details.id;
- this.proxyType = "socks";
- this.proxyAddress = details.address;
- this.proxyPort = details.port;
- [this.proxyUsername, this.proxyPassword] = makeMeekCredentials(
- this.proxyType
- );
- }
-
- async uninit() {
- lazy.EventDispatcher.instance.sendRequest({
- type: "GeckoView:Tor:StopMeek",
- id: this.#id,
- });
- this.#id = 0;
- this.proxyType = null;
- this.proxyAddress = null;
- this.proxyPort = 0;
- this.proxyUsername = null;
- this.proxyPassword = null;
- }
-}
-
-//
-// Callback object with a cached promise for the returned Moat data
-//
-class MoatResponseListener {
- #response = "";
- #responsePromise;
- #resolve;
- #reject;
- constructor() {
- this.#response = "";
- // we need this promise here because await nsIHttpChannel::asyncOpen does
- // not return only once the request is complete, it seems to return
- // after it begins, so we have to get the result from this listener object.
- // This promise is only resolved once onStopRequest is called
- this.#responsePromise = new Promise((resolve, reject) => {
- this.#resolve = resolve;
- this.#reject = reject;
- });
- }
-
- // callers wait on this for final response
- response() {
- return this.#responsePromise;
- }
-
- // noop
- onStartRequest(request) {}
-
- // resolve or reject our Promise
- onStopRequest(request, status) {
- try {
- if (!Components.isSuccessCode(status)) {
- const errorMessage =
- lazy.TorLauncherUtil.getLocalizedStringForError(status);
- this.#reject(new Error(errorMessage));
- }
- if (request.responseStatus != 200) {
- this.#reject(new Error(request.responseStatusText));
- }
- } catch (err) {
- this.#reject(err);
- }
- this.#resolve(this.#response);
- }
-
- // read response data
- onDataAvailable(request, stream, offset, length) {
- const scriptableStream = Cc[
- "@mozilla.org/scriptableinputstream;1"
- ].createInstance(Ci.nsIScriptableInputStream);
- scriptableStream.init(stream);
- this.#response += scriptableStream.read(length);
- }
-}
-
+/**
+ * A special response listener that collects the received headers.
+ */
class InternetTestResponseListener {
#promise;
#resolve;
@@ -436,129 +71,45 @@ class InternetTestResponseListener {
}
}
-// constructs the json objects and sends the request over moat
+/**
+ * Constructs JSON objects and sends requests over Moat.
+ * The documentation about the JSON schemas to use are available at
+ * https://gitlab.torproject.org/tpo/anti-censorship/rdsys/-/blob/main/doc/moa….
+ */
export class MoatRPC {
- #inited = false;
- #meekTransport = null;
-
- get inited() {
- return this.#inited;
- }
+ #requestBuilder = null;
async init() {
- if (this.#inited) {
- throw new Error("MoatRPC: Already initialized");
+ if (this.#requestBuilder !== null) {
+ return;
}
- const meekTransport =
- Services.appinfo.OS === "Android"
- ? new MeekTransportAndroid()
- : new MeekTransport();
- await meekTransport.init();
- this.#meekTransport = meekTransport;
- this.#inited = true;
+ const reflector = Services.prefs.getStringPref(
+ TorLauncherPrefs.bridgedb_reflector
+ );
+ const front = Services.prefs.getStringPref(TorLauncherPrefs.bridgedb_front);
+ const builder = new lazy.DomainFrontRequestBuilder();
+ await builder.init(reflector, front);
+ this.#requestBuilder = builder;
}
async uninit() {
- await this.#meekTransport?.uninit();
- this.#meekTransport = null;
- this.#inited = false;
- }
-
- #makeHttpHandler(uriString) {
- if (!this.#inited) {
- throw new Error("MoatRPC: Not initialized");
- }
-
- const { proxyType, proxyAddress, proxyPort, proxyUsername, proxyPassword } =
- this.#meekTransport;
-
- const proxyPS = Cc[
- "@mozilla.org/network/protocol-proxy-service;1"
- ].getService(Ci.nsIProtocolProxyService);
- const flags = Ci.nsIProxyInfo.TRANSPARENT_PROXY_RESOLVES_HOST;
- const noTimeout = 0xffffffff; // UINT32_MAX
- const proxyInfo = proxyPS.newProxyInfoWithAuth(
- proxyType,
- proxyAddress,
- proxyPort,
- proxyUsername,
- proxyPassword,
- undefined,
- undefined,
- flags,
- noTimeout,
- undefined
- );
-
- const uri = Services.io.newURI(uriString);
- // There does not seem to be a way to directly create an nsILoadInfo from
- // JavaScript, so we create a throw away non-proxied channel to get one.
- const secFlags = Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_SEC_CONTEXT_IS_NULL;
- const loadInfo = Services.io.newChannelFromURI(
- uri,
- undefined,
- Services.scriptSecurityManager.getSystemPrincipal(),
- undefined,
- secFlags,
- Ci.nsIContentPolicy.TYPE_OTHER
- ).loadInfo;
-
- const httpHandler = Services.io
- .getProtocolHandler("http")
- .QueryInterface(Ci.nsIHttpProtocolHandler);
- const ch = httpHandler
- .newProxiedChannel(uri, proxyInfo, 0, undefined, loadInfo)
- .QueryInterface(Ci.nsIHttpChannel);
-
- // remove all headers except for 'Host"
- const headers = [];
- ch.visitRequestHeaders({
- visitHeader: (key, val) => {
- if (key !== "Host") {
- headers.push(key);
- }
- },
- });
- headers.forEach(key => ch.setRequestHeader(key, "", false));
-
- return ch;
+ await this.#requestBuilder?.uninit();
+ this.#requestBuilder = null;
}
async #makeRequest(procedure, args) {
const procedureURIString = `${Services.prefs.getStringPref(
TorLauncherPrefs.moat_service
)}/${procedure}`;
- const ch = this.#makeHttpHandler(procedureURIString);
-
- // Arrange for the POST data to be sent.
- const argsJson = JSON.stringify(args);
-
- const inStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(
- Ci.nsIStringInputStream
- );
- inStream.setData(argsJson, argsJson.length);
- const upChannel = ch.QueryInterface(Ci.nsIUploadChannel);
- const contentType = "application/vnd.api+json";
- upChannel.setUploadStream(inStream, contentType, argsJson.length);
- ch.requestMethod = "POST";
-
- // Make request
- const listener = new MoatResponseListener();
- await ch.asyncOpen(listener, ch);
-
- // wait for response
- const responseJSON = await listener.response();
-
- // parse that JSON
- return JSON.parse(responseJSON);
+ return this.#requestBuilder.buildPostRequest(procedureURIString, args);
}
async testInternetConnection() {
const uri = `${Services.prefs.getStringPref(
TorLauncherPrefs.moat_service
)}/circumvention/countries`;
- const ch = this.#makeHttpHandler(uri);
+ const ch = this.#requestBuilder.buildHttpHandler(uri);
ch.requestMethod = "HEAD";
const listener = new InternetTestResponseListener();
@@ -566,10 +117,6 @@ export class MoatRPC {
return listener.status;
}
- //
- // Moat APIs
- //
-
// Receive a CAPTCHA challenge, takes the following parameters:
// - transports: array of transport strings available to us eg: ["obfs4", "meek"]
//
=====================================
toolkit/modules/moz.build
=====================================
@@ -166,6 +166,7 @@ EXTRA_JS_MODULES += [
"DateTimePickerPanel.sys.mjs",
"DeferredTask.sys.mjs",
"Deprecated.sys.mjs",
+ "DomainFrontedRequests.sys.mjs",
"DragDropFilter.sys.mjs",
"E10SUtils.sys.mjs",
"EventEmitter.sys.mjs",
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/da0f310…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/da0f310…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][maint-13.0] Bug 41063: Run "file $keyring" in tools/keyring/list-all-keyrings
by richard (@richard) 11 Jan '24
by richard (@richard) 11 Jan '24
11 Jan '24
richard pushed to branch maint-13.0 at The Tor Project / Applications / tor-browser-build
Commits:
aa5571de by Nicolas Vigier at 2024-01-11T15:30:06+00:00
Bug 41063: Run "file $keyring" in tools/keyring/list-all-keyrings
(cherry picked from commit 0fe87b4a9c5645157297106da33991d4e5a7dc3c)
- - - - -
1 changed file:
- tools/keyring/list-all-keyrings
Changes:
=====================================
tools/keyring/list-all-keyrings
=====================================
@@ -6,5 +6,6 @@ set -e
cd $(dirname "$0")/../..
for keyring in ./keyring/*.gpg
do
+ file "$keyring"
gpg --no-auto-check-trustdb --list-options show-unusable-subkeys,show-keyring --no-default-keyring --list-keys --keyring "$keyring"
done
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/a…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/a…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][main] Bug 41063: Run "file $keyring" in tools/keyring/list-all-keyrings
by richard (@richard) 11 Jan '24
by richard (@richard) 11 Jan '24
11 Jan '24
richard pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
0fe87b4a by Nicolas Vigier at 2024-01-11T10:47:16+01:00
Bug 41063: Run "file $keyring" in tools/keyring/list-all-keyrings
- - - - -
1 changed file:
- tools/keyring/list-all-keyrings
Changes:
=====================================
tools/keyring/list-all-keyrings
=====================================
@@ -6,5 +6,6 @@ set -e
cd $(dirname "$0")/../..
for keyring in ./keyring/*.gpg
do
+ file "$keyring"
gpg --no-auto-check-trustdb --list-options show-unusable-subkeys,show-keyring --no-default-keyring --list-keys --keyring "$keyring"
done
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/0…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/0…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

11 Jan '24
boklm pushed to branch main at The Tor Project / Applications / torbrowser-launcher
Commits:
961da39f by Vecna at 2024-01-11T09:57:30+00:00
Depend on dbus-glib
- - - - -
1 changed file:
- build_rpm.sh
Changes:
=====================================
build_rpm.sh
=====================================
@@ -6,7 +6,7 @@ VERSION=$(cat share/torbrowser-launcher/version)
rm -r build dist
# build binary package
-python3 setup.py bdist_rpm --requires="python3-qt5, python3-gpg, python3-requests, python3-pysocks, python3-packaging, gnupg2"
+python3 setup.py bdist_rpm --requires="python3-qt5, python3-gpg, python3-requests, python3-pysocks, python3-packaging, gnupg2, dbus-glib"
# install it
echo ""
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/commit…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/commit…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/torbrowser-launcher][main] 2 commits: Update Copyright lines (#11)
by boklm (@boklm) 10 Jan '24
by boklm (@boklm) 10 Jan '24
10 Jan '24
boklm pushed to branch main at The Tor Project / Applications / torbrowser-launcher
Commits:
e5b82a62 by Nicolas Vigier at 2024-01-10T09:47:10+01:00
Update Copyright lines (#11)
- - - - -
6f55236b by Nicolas Vigier at 2024-01-10T09:47:11+01:00
Update torbrowser_launcher.pot
- - - - -
8 changed files:
- LICENSE
- setup.py
- share/metainfo/org.torproject.torbrowser-launcher.metainfo.xml
- torbrowser-launcher
- torbrowser_launcher.pot
- torbrowser_launcher/__init__.py
- torbrowser_launcher/launcher.py
- torbrowser_launcher/settings.py
Changes:
=====================================
LICENSE
=====================================
@@ -1,4 +1,5 @@
Copyright (c) 2013-2023 Micah Lee <micah(a)micahflee.com>
+Copyright (c) 2024 Tor Project
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
=====================================
setup.py
=====================================
@@ -2,7 +2,8 @@
Tor Browser Launcher
https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/
-Copyright (c) 2013-2017 Micah Lee <micah(a)micahflee.com>
+Copyright (c) 2013-2023 Micah Lee <micah(a)micahflee.com>
+Copyright (c) 2024 Tor Project
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
@@ -100,6 +101,8 @@ setup(
version=version,
author="Micah Lee",
author_email="micah(a)micahflee.com",
+ maintainer="Nicolas Vigier",
+ maintainer_email="boklm(a)torproject.org",
url="https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/",
platforms=["GNU/Linux"],
license="MIT",
=====================================
share/metainfo/org.torproject.torbrowser-launcher.metainfo.xml
=====================================
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2014 Micah Lee <micah(a)micahflee.com> -->
+<!-- Copyright 2014-2023 Micah Lee <micah(a)micahflee.com> -->
+<!-- Copyright 2024 Tor Project -->
<component type="desktop-application">
<id>org.torproject.torbrowser-launcher</id>
<launchable type="desktop-id">torbrowser.desktop</launchable>
@@ -27,7 +28,7 @@
</screenshot>
</screenshots>
<url type="homepage">https://gitlab.torproject.org/tpo/applications/torbrowser-launcher</url>
- <update_contact>micah(a)micahflee.com</update_contact>
+ <update_contact>boklm(a)torproject.org</update_contact>
<content_rating type="oars-1.1"/>
<releases>
<release version="0.3.6" date="2022-12-13"/>
=====================================
torbrowser-launcher
=====================================
@@ -3,7 +3,8 @@
Tor Browser Launcher
https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/
-Copyright (c) 2013-2017 Micah Lee <micah(a)micahflee.com>
+Copyright (c) 2013-2023 Micah Lee <micah(a)micahflee.com>
+Copyright (c) 2024 Tor Project
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
=====================================
torbrowser_launcher.pot
=====================================
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-03-23 15:47-0700\n"
+"POT-Creation-Date: 2024-01-09 17:04+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL(a)li.org>\n"
@@ -17,153 +17,154 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: __init__.py:65 launcher.py:470
+#: __init__.py:76 launcher.py:520
msgid "Tor Browser Launcher"
msgstr ""
-#: __init__.py:66
-msgid "By Micah Lee, licensed under MIT"
+#: __init__.py:77
+msgid "By Micah Lee & Tor Project, licensed under MIT"
msgstr ""
-#: __init__.py:67
+#: __init__.py:78
#, python-brace-format
msgid "version {0}"
msgstr ""
-#: common.py:100
+#: common.py:90
#, python-brace-format
msgid "Error creating {0}"
msgstr ""
-#: common.py:102 common.py:180
+#: common.py:187
#, python-brace-format
-msgid "{0} is not writable"
+msgid "Renamed {0} to {1}"
msgstr ""
-#: common.py:177
+#: common.py:201
#, python-brace-format
msgid "Cannot create directory {0}"
msgstr ""
-#: common.py:187
+#: common.py:204
+#, python-brace-format
+msgid "{0} is not writable"
+msgstr ""
+
+#: common.py:211
msgid "Creating GnuPG homedir"
msgstr ""
-#: common.py:254
+#: common.py:302
#, python-format
msgid "Could not import key with fingerprint: %s."
msgstr ""
-#: common.py:259
+#: common.py:309
msgid "Not all keys were imported successfully!"
msgstr ""
-#: launcher.py:83
+#: launcher.py:87
msgid "Downloading Tor Browser for the first time."
msgstr ""
-#: launcher.py:85
+#: launcher.py:90
msgid ""
"Your version of Tor Browser is out-of-date. Downloading the newest version."
msgstr ""
-#: launcher.py:100
+#: launcher.py:111
msgid "Downloading over Tor"
msgstr ""
-#: launcher.py:111
+#: launcher.py:122
msgid "Tor Browser"
msgstr ""
-#: launcher.py:128
+#: launcher.py:141
msgid "Start"
msgstr ""
-#: launcher.py:174
+#: launcher.py:191
msgid "Yes"
msgstr ""
-#: launcher.py:178
+#: launcher.py:195
msgid "Exit"
msgstr ""
-#: launcher.py:192 settings.py:136
+#: launcher.py:209 settings.py:136
msgid "Cancel"
msgstr ""
-#: launcher.py:231 launcher.py:245 launcher.py:249 launcher.py:279
-#: launcher.py:281
+#: launcher.py:246 launcher.py:267 launcher.py:276 launcher.py:315
+#: launcher.py:318
msgid "Downloading"
msgstr ""
-#: launcher.py:238
+#: launcher.py:257
msgid "Latest version: {}"
msgstr ""
-#: launcher.py:241
+#: launcher.py:261
msgid "Error detecting Tor Browser version."
msgstr ""
-#: launcher.py:256 launcher.py:357
+#: launcher.py:291 launcher.py:389
msgid "Verifying Signature"
msgstr ""
-#: launcher.py:260
+#: launcher.py:295
msgid "Extracting"
msgstr ""
-#: launcher.py:264
+#: launcher.py:299
msgid "Running"
msgstr ""
-#: launcher.py:268
+#: launcher.py:303
msgid "Starting download over again"
msgstr ""
-#: launcher.py:279 launcher.py:295
+#: launcher.py:315 launcher.py:334
msgid "(over Tor)"
msgstr ""
-#: launcher.py:293
+#: launcher.py:330
msgid "Downloaded"
msgstr ""
-#: launcher.py:393
+#: launcher.py:431
msgid "Installing"
msgstr ""
-#: launcher.py:401
+#: launcher.py:440
#, python-brace-format
msgid "Tor Browser Launcher doesn't understand the file format of {0}"
msgstr ""
-#: launcher.py:427
+#: launcher.py:471
msgid ""
"The version of Tor Browser you have installed is earlier than it should be, "
"which could be a sign of an attack!"
msgstr ""
-#: launcher.py:446
+#: launcher.py:488
msgid "Downloading Tor Browser over again."
msgstr ""
-#: launcher.py:516 launcher.py:525 launcher.py:533
+#: launcher.py:561 launcher.py:569
msgid "Download Error:"
msgstr ""
-#: launcher.py:517
+#: launcher.py:563
msgid "You are currently using a non-default mirror"
msgstr ""
-#: launcher.py:518
+#: launcher.py:565
msgid "Would you like to switch back to the default?"
msgstr ""
-#: launcher.py:527
-msgid "Would you like to try the English version of Tor Browser instead?"
-msgstr ""
-
-#: launcher.py:548
+#: launcher.py:585
#, python-brace-format
msgid ""
"Invalid SSL certificate for:\n"
@@ -172,11 +173,11 @@ msgid ""
"You may be under attack."
msgstr ""
-#: launcher.py:550
+#: launcher.py:588
msgid "Try the download again using Tor?"
msgstr ""
-#: launcher.py:559
+#: launcher.py:598
#, python-brace-format
msgid ""
"Error starting download:\n"
@@ -187,7 +188,7 @@ msgid ""
"running?"
msgstr ""
-#: launcher.py:563
+#: launcher.py:604
#, python-brace-format
msgid ""
"Error starting download:\n"
@@ -197,42 +198,38 @@ msgid ""
"Are you connected to the internet?"
msgstr ""
-#: settings.py:46
+#: settings.py:48
msgid "Tor Browser Launcher Settings"
msgstr ""
-#: settings.py:50
+#: settings.py:52
msgid "Download over system Tor"
msgstr ""
-#: settings.py:57
-msgid "Force downloading English version of Tor Browser"
-msgstr ""
-
-#: settings.py:66
+#: settings.py:59
msgid "Tor server"
msgstr ""
-#: settings.py:82
+#: settings.py:74
msgid "Status: Installed"
msgstr ""
-#: settings.py:84
+#: settings.py:76
msgid "Status: Not Installed"
msgstr ""
-#: settings.py:87
+#: settings.py:79
msgid "Install Tor Browser"
msgstr ""
-#: settings.py:92
+#: settings.py:86
msgid "Reinstall Tor Browser"
msgstr ""
-#: settings.py:115
+#: settings.py:111
msgid "Mirror"
msgstr ""
-#: settings.py:131
+#: settings.py:129
msgid "Save && Exit"
msgstr ""
=====================================
torbrowser_launcher/__init__.py
=====================================
@@ -2,7 +2,8 @@
Tor Browser Launcher
https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/
-Copyright (c) 2013-2021 Micah Lee <micah(a)micahflee.com>
+Copyright (c) 2013-2023 Micah Lee <micah(a)micahflee.com>
+Copyright (c) 2024 Tor Project
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
@@ -73,7 +74,7 @@ def main():
tor_browser_launcher_version = buf.read().strip()
print(_("Tor Browser Launcher"))
- print(_("By Micah Lee, licensed under MIT"))
+ print(_("By Micah Lee & Tor Project, licensed under MIT"))
print(_("version {0}").format(tor_browser_launcher_version))
print("https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/")
=====================================
torbrowser_launcher/launcher.py
=====================================
@@ -2,7 +2,8 @@
Tor Browser Launcher
https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/
-Copyright (c) 2013-2021 Micah Lee <micah(a)micahflee.com>
+Copyright (c) 2013-2023 Micah Lee <micah(a)micahflee.com>
+Copyright (c) 2024 Tor Project
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
=====================================
torbrowser_launcher/settings.py
=====================================
@@ -2,7 +2,8 @@
Tor Browser Launcher
https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/
-Copyright (c) 2013-2021 Micah Lee <micah(a)micahflee.com>
+Copyright (c) 2013-2023 Micah Lee <micah(a)micahflee.com>
+Copyright (c) 2024 Tor Project
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/compar…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/compar…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] 8 commits: Bug 1810776 - Move DismissedTabBackground into its own file
by Dan Ballard (@dan) 10 Jan '24
by Dan Ballard (@dan) 10 Jan '24
10 Jan '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android
Commits:
eb11d34f by Alexandru2909 at 2024-01-10T09:23:58+01:00
Bug 1810776 - Move DismissedTabBackground into its own file
- - - - -
d3d59baf by DreVla at 2024-01-10T09:23:59+01:00
Bug 1828493 - Apply purple overlay on list item when in multi-select
When having the list layout for tabs tray and entering multi-select
mode, the selected list items should have a purple non opaque overlay
on the thumbnail, as it was before in the XML implementation.
- - - - -
594d50c7 by Alexandru2909 at 2024-01-10T09:23:59+01:00
Bug 1810776 - Add SwipeToDismiss to composed tabs tray
- - - - -
65c66210 by Noah Bond at 2024-01-10T09:24:00+01:00
Bug 1815579 - Improve performance of image loading in tab items
- - - - -
7a94beac by Noah Bond at 2024-01-10T09:24:00+01:00
Bug 1840896 - Remove `rememberSaveable` since bitmaps are not serializable
- - - - -
963aaa93 by Noah Bond at 2024-01-10T09:24:01+01:00
Bug 1844967 - Improve performance of tab thumbnail loading in Compose
- - - - -
f6a83e7b by Matthew Tighe at 2024-01-10T09:24:01+01:00
Bug 1721904 - update thumbnail caching on app open
- - - - -
4d646df9 by hackademix at 2024-01-10T10:24:54+01:00
Bug 42191: Temporary StrictMode relaxation to clear the thumbnail cache.
- - - - -
30 changed files:
- android-components/components/browser/state/src/main/java/mozilla/components/browser/state/action/BrowserAction.kt
- android-components/components/browser/state/src/main/java/mozilla/components/browser/state/reducer/ContentStateReducer.kt
- android-components/components/browser/tabstray/src/main/java/mozilla/components/browser/tabstray/TabViewHolder.kt
- android-components/components/browser/tabstray/src/test/java/mozilla/components/browser/tabstray/DefaultTabViewHolderTest.kt
- android-components/components/browser/thumbnails/src/main/java/mozilla/components/browser/thumbnails/ThumbnailsMiddleware.kt
- android-components/components/browser/thumbnails/src/main/java/mozilla/components/browser/thumbnails/storage/ThumbnailStorage.kt
- android-components/components/browser/thumbnails/src/main/java/mozilla/components/browser/thumbnails/utils/ThumbnailDiskCache.kt
- android-components/components/browser/thumbnails/src/test/java/mozilla/components/browser/thumbnails/ThumbnailsMiddlewareTest.kt
- android-components/components/browser/thumbnails/src/test/java/mozilla/components/browser/thumbnails/loader/ThumbnailLoaderTest.kt
- android-components/components/browser/thumbnails/src/test/java/mozilla/components/browser/thumbnails/storage/ThumbnailStorageTest.kt
- android-components/components/browser/thumbnails/src/test/java/mozilla/components/browser/thumbnails/utils/ThumbnailDiskCacheTest.kt
- android-components/components/concept/base/src/main/java/mozilla/components/concept/base/images/ImageRequest.kt
- fenix/app/src/main/java/org/mozilla/fenix/browser/TabPreview.kt
- fenix/app/src/main/java/org/mozilla/fenix/browser/ToolbarGestureHandler.kt
- + fenix/app/src/main/java/org/mozilla/fenix/compose/SwipeToDismiss.kt
- + fenix/app/src/main/java/org/mozilla/fenix/compose/TabThumbnail.kt
- fenix/app/src/main/java/org/mozilla/fenix/compose/ThumbnailCard.kt
- + fenix/app/src/main/java/org/mozilla/fenix/compose/ThumbnailImage.kt
- fenix/app/src/main/java/org/mozilla/fenix/compose/list/ListItem.kt
- + fenix/app/src/main/java/org/mozilla/fenix/compose/tabstray/DismissedTabBackground.kt
- fenix/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabGridItem.kt
- fenix/app/src/main/java/org/mozilla/fenix/compose/tabstray/TabListItem.kt
- fenix/app/src/main/java/org/mozilla/fenix/home/collections/CollectionItem.kt
- fenix/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTab.kt
- fenix/app/src/main/java/org/mozilla/fenix/home/recentsyncedtabs/view/RecentSyncedTabViewHolder.kt
- fenix/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabViewHolder.kt
- fenix/app/src/main/java/org/mozilla/fenix/home/recenttabs/view/RecentTabs.kt
- fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTray.kt
- fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt
- fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayTabLayouts.kt
The diff was not included because it is too large.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/compare/c1…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/compare/c1…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][maint-13.0] Bug 41059: Update keyring/torbrowser.gpg with updated key
by richard (@richard) 10 Jan '24
by richard (@richard) 10 Jan '24
10 Jan '24
richard pushed to branch maint-13.0 at The Tor Project / Applications / tor-browser-build
Commits:
2a253fd5 by Nicolas Vigier at 2024-01-10T15:55:56+00:00
Bug 41059: Update keyring/torbrowser.gpg with updated key
Tor Browser gpg key has been updated with a new expiration date on its
current subkey.
(cherry picked from commit 07f2eaceff557d7dbb10123d7af9cec752f0e6f8)
- - - - -
1 changed file:
- keyring/torbrowser.gpg
Changes:
=====================================
keyring/torbrowser.gpg
=====================================
Binary files a/keyring/torbrowser.gpg and b/keyring/torbrowser.gpg differ
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/2…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/2…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][main] Bug 41059: Update keyring/torbrowser.gpg with updated key
by richard (@richard) 10 Jan '24
by richard (@richard) 10 Jan '24
10 Jan '24
richard pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
07f2eace by Nicolas Vigier at 2024-01-10T15:54:54+00:00
Bug 41059: Update keyring/torbrowser.gpg with updated key
Tor Browser gpg key has been updated with a new expiration date on its
current subkey.
- - - - -
1 changed file:
- keyring/torbrowser.gpg
Changes:
=====================================
keyring/torbrowser.gpg
=====================================
Binary files a/keyring/torbrowser.gpg and b/keyring/torbrowser.gpg differ
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/0…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/0…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][main] 2 commits: Bug 40606: Use Clang to compile NSIS
by Pier Angelo Vendrame (@pierov) 10 Jan '24
by Pier Angelo Vendrame (@pierov) 10 Jan '24
10 Jan '24
Pier Angelo Vendrame pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
3c17b385 by Pier Angelo Vendrame at 2024-01-10T10:10:45+01:00
Bug 40606: Use Clang to compile NSIS
NSIS officially supports only MSVC and GCC as compilers, so it was one
of the two projects forcing us to keep a GCC toolchain for Windows.
With this commit, we adapt the tricks Mozilla uses to build NSIS with
Clang, and remove the dependency on mingw-w64.
The main trick is to use the GNU assembler instead of Clang's internal
one to build NSIS's system plugin. Luckily, it can be found in
binutils, without a full GCC build.
- - - - -
018b7e26 by Pier Angelo Vendrame at 2024-01-10T11:11:19+01:00
Bug 40900: Update NSIS to 3.09.
The update allows us to delete the no-reloc-section patch, and while we
are at it, we can replace the no-insert-timestamp patch with
SOURCE_DATE_EPOCH, which we set as the creation date of the Source
directory form the tarball.
- - - - -
5 changed files:
- projects/nsis/build
- projects/nsis/config
- − projects/nsis/no-insert-timestamp.patch
- − projects/nsis/no-reloc-section.diff
- + projects/nsis/resource-reproducible.diff
Changes:
=====================================
projects/nsis/build
=====================================
@@ -4,21 +4,41 @@
mkdir -p /var/tmp/build
tar -C /var/tmp/build -xf nsis-[% c('version') %].tar.bz2
+# We need the GNU assembler for the system plugin
+tar -C /var/tmp/dist -xf [% c('input_files_by_name/binutils') %]
+
# NSIS requires zlib and we later set the path using ZLIB_W32.
tar -C /var/tmp/build -xf [% c('input_files_by_name/zlib') %]
+# This trick is adapted from Firefox's
+# taskcluster/scripts/misc/build-mingw32-nsis.sh
+compiler_prefix=/var/tmp/dist/mingw-w64-clang/bin/[% c("arch") %]-w64-mingw32
+cat <<'EOF' >"$compiler_prefix-gcc"
+#!/bin/sh
+# SCons ignores the external $PATH, so we add binutils here.
+export PATH=/var/tmp/dist/binutils/bin:$PATH
+case "$@" in
+*/Call*.S)
+ $(dirname $0)/[% c("arch") %]-w64-mingw32-clang -fno-integrated-as "$@"
+ ;;
+*)
+ $(dirname $0)/[% c("arch") %]-w64-mingw32-clang "$@"
+ ;;
+esac
+EOF
+
+chmod +x "$compiler_prefix-gcc"
+ln -s "$compiler_prefix-clang++" "$compiler_prefix-g++"
+
cd /var/tmp/build/nsis-[% c('version') %]-src
-# Adding --no-insert-timestamp to APPEND_LINKFLAGS is not working as it
-# is used for both the host and cross-compiled parts, but this option is
-# only valid for the Windows linker. Therefore we add it using a patch
-# to the cross-compilation part only. Still needed as of 3.06.1, see: #40090.
-patch -p1 < $rootdir/no-insert-timestamp.patch
-# tor-browser-build#40822: NSIS adds a flag to tell it supports ASLR, but it
-# does so only to pass MS certifications. According to the NSIS forums, they
-# intended not to ship the .reloc to save space. But, according to the bug
-# tracker, binutils 2.36 started adding a .reloc section by default, and we need
-# to disable it with this patch.
-patch -p1 < $rootdir/no-reloc-section.diff
+
+# These two sed commands also come from build-mingw32-nsis.sh
+sed -i 's/-Wl,--exclude-libs,msvcrt.a/-Wl,-Xlink=-fixed/' SCons/Config/gnu
+sed -i '2i extern "C"' SCons/Config/{memcpy,memset}.c
+
+export SOURCE_DATE_EPOCH=$(stat -c '%Y' Source)
+# Resource.dll does not obey the source date epoch...
+patch -p1 < "$rootdir/resource-reproducible.diff"
[% IF c("var/windows-x86_64") %]
# Seems like setting TARGET_ARCH is not enough so we need to patch build.cpp
@@ -30,8 +50,7 @@ patch -p1 < $rootdir/no-reloc-section.diff
[% END %]
[% SET scons_args = 'VERSION=' _ c("version")
- _ ' APPEND_CCFLAGS="-fgnu89-inline"'
- _ " SKIPUTILS='NSIS Menu' XGCC_W32_PREFIX=" _ c("arch") _ "-w64-mingw32-"
+ _ " SKIPUTILS='NSIS Menu,Makensisw' XGCC_W32_PREFIX=" _ c("arch") _ "-w64-mingw32-"
_ " TARGET_ARCH=" _ target
_ " ZLIB_W32=/var/tmp/build/zlib/"
_ ' PREFIX=/var/tmp/dist/nsis' -%]
=====================================
projects/nsis/config
=====================================
@@ -1,5 +1,5 @@
# vim: filetype=yaml sw=2
-version: 3.08
+version: 3.09
filename: 'nsis-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]'
container:
use_container: 1
@@ -11,21 +11,16 @@ var:
- zlib1g-dev
- libcppunit-dev
- xsltproc
- # NSIS has an assembly part that cannot be compiled with Clang.
- # Mozilla uses -fno-integrated-as (see
- # taskcluster/scripts/misc/build-mingw32-nsis.sh) but for some reason this
- # does not seem to work for us, so just keep GCC for the moment, since we are
- # already using it for Rust anyway.
- compiler: mingw-w64
input_files:
- project: container-image
- filename: 'nsis-[% c("version") %].tar.bz2'
URL: 'https://downloads.sourceforge.net/nsis/nsis-[% c("version") %]-src.tar.bz2'
- sha256sum: a85270ad5386182abecb2470e3d7e9bec9fe4efd95210b13551cb386830d1e87
- - filename: no-insert-timestamp.patch
- - filename: no-reloc-section.diff
+ sha256sum: 0cd846c6e9c59068020a87bfca556d4c630f2c5d554c1098024425242ddc56e2
- name: '[% c("var/compiler") %]'
project: '[% c("var/compiler") %]'
+ - name: binutils
+ project: binutils
- name: zlib
project: zlib
+ - filename: resource-reproducible.diff
=====================================
projects/nsis/no-insert-timestamp.patch deleted
=====================================
@@ -1,27 +0,0 @@
-diff -ur nsis-3.03-src/SCons/Config/gnu nsis-3.03-src.n/SCons/Config/gnu
---- nsis-3.03-src/SCons/Config/gnu 2017-10-06 15:30:20.000000000 -0400
-+++ nsis-3.03-src.n/SCons/Config/gnu 2018-06-17 13:26:05.945495151 -0400
-@@ -102,6 +102,7 @@
- stub_env.Append(LINKFLAGS = ['$NODEFLIBS_FLAG']) # no standard libraries
- stub_env.Append(LINKFLAGS = ['$ALIGN_FLAG']) # 512 bytes align
- stub_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file
-+stub_env.Append(LINKFLAGS = ['-Wl,--no-insert-timestamp']) # remove timestamps for reproducible builds
-
- stub_uenv = stub_env.Clone()
- stub_uenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE'])
-@@ -142,6 +143,7 @@
- plugin_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file
- plugin_env.Append(LINKFLAGS = ['-static-libgcc']) # remove libgcc*.dll dependency
- plugin_env.Append(LINKFLAGS = ['-static-libstdc++']) # remove libstdc++*.dll dependency
-+plugin_env.Append(LINKFLAGS = ['-Wl,--no-insert-timestamp']) # remove timestamps for reproducible builds
-
- plugin_uenv = plugin_env.Clone()
- plugin_uenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE'])
-@@ -181,6 +183,7 @@
-
- util_env.Append(LINKFLAGS = ['-mwindows']) # build windows executables
- util_env.Append(LINKFLAGS = ['$ALIGN_FLAG']) # 512 bytes align
-+util_env.Append(LINKFLAGS = ['-Wl,--no-insert-timestamp']) # remove timestamps for reproducible builds
-
-
- conf = FlagsConfigure(util_env)
=====================================
projects/nsis/no-reloc-section.diff deleted
=====================================
@@ -1,14 +0,0 @@
-diff -Naur nsis-3.08-orig/SCons/Config/gnu nsis-3.08-src/SCons/Config/gnu
---- nsis-3.08-orig/SCons/Config/gnu 2023-03-23 09:22:46.315471779 +0100
-+++ nsis-3.08-src/SCons/Config/gnu 2023-03-23 09:24:05.260933879 +0100
-@@ -103,6 +103,10 @@
- stub_env.Append(LINKFLAGS = ['$ALIGN_FLAG']) # 512 bytes align
- stub_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file
-
-+# https://sourceforge.net/p/nsis/bugs/1283/?limit=25#e303,
-+# https://sourceforge.net/p/nsis/bugs/1283/?limit=25#e303/e90f
-+stub_env.Append(LINKFLAGS = ['-Wl,--disable-reloc-section'])
-+
- conf = FlagsConfigure(stub_env)
- conf.CheckCompileFlag('-fno-tree-loop-distribute-patterns') # GCC 10: Don't generate msvcrt!memmove calls (bug #1248)
- conf.Finish()
=====================================
projects/nsis/resource-reproducible.diff
=====================================
@@ -0,0 +1,10 @@
+diff '--color=auto' -rupN nsis-3.09-orig/Contrib/System/SConscript nsis-3.09-src/Contrib/System/SConscript
+--- nsis-3.09-orig/Contrib/System/SConscript 2024-01-10 11:07:15.161175520 +0100
++++ nsis-3.09-src/Contrib/System/SConscript 2024-01-10 11:08:47.338628667 +0100
+@@ -76,4 +76,5 @@ resources = Split("""
+
+ env.Depends(res_target, resources)
+
+-env.SharedLibrary('Resource', res_target + res_main)
++resource = env.SharedLibrary('Resource', res_target + res_main)
++env.MakeReproducible(resource)
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] 2 commits: fixup! Bug 1823316 - Use 'Snackbar' themed Dialog to notify on making app full-screen
by ma1 (@ma1) 10 Jan '24
by ma1 (@ma1) 10 Jan '24
10 Jan '24
ma1 pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android
Commits:
a57e5d10 by hackademix at 2024-01-10T08:41:06+01:00
fixup! Bug 1823316 - Use 'Snackbar' themed Dialog to notify on making app full-screen
Fix tor-browser#42355 backporting regression.
- - - - -
c1397e81 by t-p-white at 2024-01-10T08:41:06+01:00
Bug 1864549 - Fix for IllegalStateException in full screen notification dialog
- - - - -
2 changed files:
- android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/FullScreenNotificationDialog.kt
- fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
Changes:
=====================================
android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/FullScreenNotificationDialog.kt
=====================================
@@ -59,11 +59,12 @@ class FullScreenNotificationDialog(@LayoutRes val layout: Int) :
window.setGravity(Gravity.BOTTOM)
window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
}
+ }
- lifecycleScope.launch {
- delay(SNACKBAR_DURATION_LONG_MS)
- dismiss()
- }
+ // Attempt to automatically dismiss the dialog after the given duration.
+ lifecycleScope.launch {
+ delay(SNACKBAR_DURATION_LONG_MS)
+ dialog?.dismiss()
}
}
}
=====================================
fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
=====================================
@@ -1491,6 +1491,7 @@ abstract class BaseBrowserFragment :
parentFragmentManager,
)
+ activity?.enterToImmersiveMode()
(view as? SwipeGestureLayout)?.isSwipeEnabled = false
browserToolbarView.collapse()
browserToolbarView.view.isVisible = false
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/compare/be…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/compare/be…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][maint-13.0] Bug 41058: Update Snowflake to 2.8.1
by richard (@richard) 09 Jan '24
by richard (@richard) 09 Jan '24
09 Jan '24
richard pushed to branch maint-13.0 at The Tor Project / Applications / tor-browser-build
Commits:
d7ba22ea by Richard Pospesel at 2024-01-09T17:39:48+00:00
Bug 41058: Update Snowflake to 2.8.1
(cherry picked from commit 4ea089e41deb39fd5837eca71a29274dcb60c9fc)
- - - - -
1 changed file:
- projects/snowflake/config
Changes:
=====================================
projects/snowflake/config
=====================================
@@ -1,7 +1,9 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
git_url: https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snow…
-git_hash: b5d702f48315ee7dc718496dc6996f266e0ba047 #v2.6.1
+git_hash: v2.8.1
+gpg_keyring: anti-censorship.gpg
+tag_gpg_id: 1
container:
use_container: 1
@@ -20,6 +22,6 @@ steps:
pkg_type: go_vendor
project: snowflake
norec:
- sha256sum: 47ba1520df228ecffcf48ea4d826a365f39f31d9122200dd993c437cf347dc09
+ sha256sum: 6e41846a6d3e94891847d74ac08c6888c1540e0b0680ed3900ca54d7c35e1752
target_replace:
'^torbrowser-(?!testbuild).*': 'torbrowser-linux-x86_64'
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/d…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/d…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][main] Bug 41058: Update Snowflake to 2.8.1
by richard (@richard) 09 Jan '24
by richard (@richard) 09 Jan '24
09 Jan '24
richard pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
4ea089e4 by Richard Pospesel at 2024-01-09T17:38:39+00:00
Bug 41058: Update Snowflake to 2.8.1
- - - - -
1 changed file:
- projects/snowflake/config
Changes:
=====================================
projects/snowflake/config
=====================================
@@ -1,7 +1,9 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
git_url: https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snow…
-git_hash: b5d702f48315ee7dc718496dc6996f266e0ba047 #v2.6.1
+git_hash: v2.8.1
+gpg_keyring: anti-censorship.gpg
+tag_gpg_id: 1
container:
use_container: 1
@@ -20,6 +22,6 @@ steps:
pkg_type: go_vendor
project: snowflake
norec:
- sha256sum: 47ba1520df228ecffcf48ea4d826a365f39f31d9122200dd993c437cf347dc09
+ sha256sum: 6e41846a6d3e94891847d74ac08c6888c1540e0b0680ed3900ca54d7c35e1752
target_replace:
'^torbrowser-(?!testbuild).*': 'torbrowser-linux-x86_64'
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/4…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/4…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.6.0esr-13.5-1] fixup! Bug 40597: Implement TorSettings module
by Pier Angelo Vendrame (@pierov) 09 Jan '24
by Pier Angelo Vendrame (@pierov) 09 Jan '24
09 Jan '24
Pier Angelo Vendrame pushed to branch tor-browser-115.6.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
afe1be79 by Pier Angelo Vendrame at 2024-01-09T17:57:06+01:00
fixup! Bug 40597: Implement TorSettings module
Bug 42359: Handle firewall and proxy in setSettings.
- - - - -
1 changed file:
- toolkit/modules/TorSettings.sys.mjs
Changes:
=====================================
toolkit/modules/TorSettings.sys.mjs
=====================================
@@ -301,8 +301,12 @@ class TorSettingsImpl {
return this.#parsePort(val, false) ?? 0;
},
},
- username: {},
- password: {},
+ username: {
+ transform: val => val ?? "",
+ },
+ password: {
+ transform: val => val ?? "",
+ },
uri: {
getter: () => {
const { type, address, port, username, password } = this.proxy;
@@ -910,7 +914,11 @@ class TorSettingsImpl {
}
/**
- * Set all of our settings at once from a settings object.
+ * Set blocks of settings at once from an object.
+ *
+ * It is possible to set all settings, or only some sections (e.g., only
+ * bridges), but if a key is present, its settings must make sense (e.g., if
+ * bridges are enabled, a valid source must be provided).
*
* @param {object} settings The settings object to set
*/
@@ -924,35 +932,59 @@ class TorSettingsImpl {
// Hold off on lots of notifications until all settings are changed.
this.freezeNotifications();
try {
- this.bridges.enabled = !!settings.bridges.enabled;
- this.bridges.source = settings.bridges.source;
- switch (settings.bridges.source) {
- case TorBridgeSource.BridgeDB:
- case TorBridgeSource.UserProvided:
- this.bridges.bridge_strings = settings.bridges.bridge_strings;
- break;
- case TorBridgeSource.BuiltIn: {
- this.bridges.builtin_type = settings.bridges.builtin_type;
- if (!this.bridges.bridge_strings.length) {
- // No bridges were found when setting the builtin_type.
- throw new Error(
- `No available builtin bridges of type ${settings.bridges.builtin_type}`
- );
- }
- break;
+ if ("bridges" in settings) {
+ this.bridges.enabled = !!settings.bridges.enabled;
+ // Currently, disabling bridges in the UI does not remove the lines,
+ // because we call only the `enabled` setter.
+ // So, if the bridge source is undefined but bridges are disabled,
+ // do not force Invalid. Instead, keep the current source.
+ if (this.bridges.enabled || settings.bridges.source !== undefined) {
+ this.bridges.source = settings.bridges.source;
}
- case TorBridgeSource.Invalid:
- break;
- default:
- if (settings.bridges.enabled) {
- throw new Error(
- `Bridge source '${settings.source}' is not a valid source`
- );
+ switch (settings.bridges.source) {
+ case TorBridgeSource.BridgeDB:
+ case TorBridgeSource.UserProvided:
+ this.bridges.bridge_strings = settings.bridges.bridge_strings;
+ break;
+ case TorBridgeSource.BuiltIn: {
+ this.bridges.builtin_type = settings.bridges.builtin_type;
+ if (!this.bridges.bridge_strings.length) {
+ // No bridges were found when setting the builtin_type.
+ throw new Error(
+ `No available builtin bridges of type ${settings.bridges.builtin_type}`
+ );
+ }
+ break;
}
- break;
+ case TorBridgeSource.Invalid:
+ break;
+ default:
+ if (settings.bridges.enabled) {
+ throw new Error(
+ `Bridge source '${settings.source}' is not a valid source`
+ );
+ }
+ break;
+ }
}
- // TODO: proxy and firewall
+ if ("proxy" in settings) {
+ this.proxy.enabled = !!settings.proxy.enabled;
+ if (this.proxy.enabled) {
+ this.proxy.type = settings.proxy.type;
+ this.proxy.address = settings.proxy.address;
+ this.proxy.port = settings.proxy.port;
+ this.proxy.username = settings.proxy.username;
+ this.proxy.password = settings.proxy.password;
+ }
+ }
+
+ if ("firewall" in settings) {
+ this.firewall.enabled = !!settings.firewall.enabled;
+ if (this.firewall.enabled) {
+ this.firewall.allowed_ports = settings.firewall.allowed_ports;
+ }
+ }
} catch (ex) {
// Restore the old settings without any new notifications generated from
// the above code.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/afe1be7…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/afe1be7…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.6.0esr-13.5-1] fixup! Bug 3455: Add DomainIsolator, for isolating circuit by domain.
by richard (@richard) 09 Jan '24
by richard (@richard) 09 Jan '24
09 Jan '24
richard pushed to branch tor-browser-115.6.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
0ee68de7 by Pier Angelo Vendrame at 2024-01-09T12:39:59+01:00
fixup! Bug 3455: Add DomainIsolator, for isolating circuit by domain.
Bug 42338: Make TorDomainIsolator.newCircuitForDomain public again
- - - - -
1 changed file:
- toolkit/components/tor-launcher/TorDomainIsolator.sys.mjs
Changes:
=====================================
toolkit/components/tor-launcher/TorDomainIsolator.sys.mjs
=====================================
@@ -224,7 +224,7 @@ class TorDomainIsolatorImpl {
newCircuitForBrowser(globalBrowser) {
const browser = globalBrowser.selectedBrowser;
const firstPartyDomain = getDomainForBrowser(browser);
- this.#newCircuitForDomain(firstPartyDomain);
+ this.newCircuitForDomain(firstPartyDomain);
const { username, password } = this.#getSocksProxyCredentials(
firstPartyDomain,
browser.contentPrincipal.originAttributes.userContextId
@@ -329,7 +329,7 @@ class TorDomainIsolatorImpl {
logger.info(
"tor catchall circuit has reached its maximum lifetime. Rotating."
);
- this.#newCircuitForDomain(CATCHALL_DOMAIN);
+ this.newCircuitForDomain(CATCHALL_DOMAIN);
}
}
const { username, password } = this.#getSocksProxyCredentials(
@@ -437,7 +437,7 @@ class TorDomainIsolatorImpl {
* @param {string?} domain The first-party domain to re-create the nonce for.
* If empty or null, the catchall domain will be used.
*/
- #newCircuitForDomain(domain) {
+ newCircuitForDomain(domain) {
if (!domain) {
domain = CATCHALL_DOMAIN;
}
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/0ee68de…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/0ee68de…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][maint-13.0] 2 commits: Bug 41016: Switch from bullseye to bookworm on macOS+Windows.
by Pier Angelo Vendrame (@pierov) 09 Jan '24
by Pier Angelo Vendrame (@pierov) 09 Jan '24
09 Jan '24
Pier Angelo Vendrame pushed to branch maint-13.0 at The Tor Project / Applications / tor-browser-build
Commits:
2dc972fd by Pier Angelo Vendrame at 2024-01-09T14:33:16+01:00
Bug 41016: Switch from bullseye to bookworm on macOS+Windows.
Debian bookworm became the new stable in June 2023, so we should update
our containers to use it.
On macOS the update did not cause any issue, and just updating the
suite name worked.
On Windows, it caused some problems where we used the strip provided by
the OS (only for tor, it seems), because the new version of strip seems
to update the timestamps by default.
We are delaying the process for Android because there are still a
couple of projects that require Java 11, which is not available on
bookworm.
- - - - -
d5376ce1 by Pier Angelo Vendrame at 2024-01-09T14:33:18+01:00
Bug 41015: Enable std::filesystem on libc++ on Windows
We need to do some path manipulation in some Firefox code that is run
before initializing XPCOM.
So, the alternatives are either Path* functions from shlwapi, or
std::filesystem, which is disabled in Firefox 115.
Mozilla enabled it starting from 116, but we have been told it is okay
to enable it also in 115, so we do it with this patch.
- - - - -
6 changed files:
- projects/manual/config
- projects/mingw-w64-clang/build
- projects/mmdebstrap-image/config
- projects/mmdebstrap/config
- projects/tor/build
- rbm.conf
Changes:
=====================================
projects/manual/config
=====================================
@@ -13,7 +13,7 @@ compress_tar: 'gz'
var:
container:
- suite: bullseye
+ suite: bookworm
arch: amd64
deps:
- python3
=====================================
projects/mingw-w64-clang/build
=====================================
@@ -175,7 +175,7 @@ EOF
-DLIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG=TRUE \
-DLIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB=TRUE \
-DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \
- -DLIBCXX_ENABLE_FILESYSTEM=OFF \
+ -DLIBCXX_ENABLE_FILESYSTEM=ON \
-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \
-DLIBCXX_CXX_ABI=libcxxabi \
-DLIBCXX_CXX_ABI_INCLUDE_PATHS=$builddir/clang-source/libcxxabi/include \
=====================================
projects/mmdebstrap-image/config
=====================================
@@ -7,7 +7,7 @@ container:
use_container: 1
var:
- ubuntu_version: 22.04.2
+ ubuntu_version: 22.04.3
pre: |
#!/bin/sh
@@ -50,9 +50,16 @@ targets:
suite: bullseye
arch: amd64
+ bookworm-amd64:
+ var:
+ minimal_apt_version: 2.6.1
+ container:
+ suite: bookworm
+ arch: amd64
+
input_files:
- project: mmdebstrap
name: mmdebstrap
- URL: 'https://cdimage.ubuntu.com/ubuntu-base/releases/[% c("var/ubuntu_version") %]/release/ubuntu-base-[% c("var/ubuntu_version") %]-base-amd64.tar.gz'
filename: 'container-image_ubuntu-base-[% c("var/ubuntu_version") %]-base-amd64.tar.gz'
- sha256sum: 373f064df30519adc3344a08d774f437caabd1479d846fa2ca6fed727ea7a53d
+ sha256sum: ad33b7ae47b75c92c2e2fe21fd4612e15357e67679d8751d6ce892a475be24fe
=====================================
projects/mmdebstrap/config
=====================================
@@ -1,6 +1,6 @@
# vim: filetype=yaml sw=2
filename: '[% project %]-src-[% c("version") %]-[% c("var/build_id") %].tar.gz'
-version: 0.8.6
+version: 1.4.0
git_hash: '[% c("version") %]'
git_url: https://gitlab.mister-muffin.de/josch/mmdebstrap.git
gpg_keyring: mmdebstrap.gpg
=====================================
projects/tor/build
=====================================
@@ -97,8 +97,9 @@ cp $distdir/share/tor/geoip6 "$TORDATADIR"
cd $distdir
[% IF c("var/windows") %]
- install -s $distdir/bin/tor.exe "$TORBINDIR"
- install -s $distdir/bin/tor-gencert.exe "$TORBINDIR"
+ # With Debian bookworm strip changes the date time, llvm-strip doesn't do it.
+ install -s --strip-program=llvm-strip $distdir/bin/tor.exe "$TORBINDIR"
+ install -s --strip-program=llvm-strip $distdir/bin/tor-gencert.exe "$TORBINDIR"
[% END %]
[% IF c("var/linux") %]
=====================================
rbm.conf
=====================================
@@ -578,7 +578,7 @@ targets:
windows: 1
platform: windows
container:
- suite: bullseye
+ suite: bookworm
arch: amd64
configure_opt: '--host=[% c("arch") %]-w64-mingw32 CFLAGS="[% c("var/CFLAGS") %]" LDFLAGS="[% c("var/LDFLAGS") %]" [% c("var/configure_opt_project") %]'
CFLAGS: '-fstack-protector-strong -fno-strict-overflow -Wno-missing-field-initializers -Wformat -Wformat-security [% c("var/flag_mwindows") %]'
@@ -661,7 +661,7 @@ targets:
platform: macos
osname: macos
container:
- suite: bullseye
+ suite: bookworm
arch: amd64
compiler: 'macosx-toolchain'
configure_opt: '--host=[% c("var/build_target") %] CC="[% c("var/build_target") %]-clang [% c("var/FLAGS") %]" CXX="[% c("var/build_target") %]-clang++ [% c("var/FLAGS") %]" [% c("var/configure_opt_project") %]'
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser][mullvad-browser-115.6.0esr-13.0-1] 2 commits: Bug 1865238 - Use One UI Sans KR VF for Korean sans-serif font on Android r=jfkthame
by Pier Angelo Vendrame (@pierov) 09 Jan '24
by Pier Angelo Vendrame (@pierov) 09 Jan '24
09 Jan '24
Pier Angelo Vendrame pushed to branch mullvad-browser-115.6.0esr-13.0-1 at The Tor Project / Applications / Mullvad Browser
Commits:
4f0e3266 by Kagami Sascha Rosylight at 2024-01-09T14:28:40+01:00
Bug 1865238 - Use One UI Sans KR VF for Korean sans-serif font on Android r=jfkthame
Per /etc/fonts.xml, there are now only two `<family lang="ko">` nodes there:
* OneUISansKRVF series
* SECCJK series (but no KR postfix anymore?)
This patch uses One UI Sans KR VF as the replacement as this is newer and is a variable font (tested with https://codepen.io/SaschaNaz/pen/ExrdYXJ)
Differential Revision: https://phabricator.services.mozilla.com/D195078
- - - - -
e99bdee9 by Pier Angelo Vendrame at 2024-01-09T14:28:42+01:00
Bug 1860020 - Remove the assertion on the value of toolkit.telemetry.enabled. r=KrisWright,chutten
Bug 1444275 introduced an assertion on the parent process to check that
the value of toolkit.telemetry.enabled is the expected one.
However, this expected value could be different from the one set and
locked e.g. in some forks. Therefore, the assertion prevented debug
builds from working in these cases.
Differential Revision: https://phabricator.services.mozilla.com/D195080
- - - - -
2 changed files:
- modules/libpref/Preferences.cpp
- modules/libpref/init/all.js
Changes:
=====================================
modules/libpref/Preferences.cpp
=====================================
@@ -3637,16 +3637,6 @@ void Preferences::SetupTelemetryPref() {
Preferences::Lock(kTelemetryPref);
}
-static void CheckTelemetryPref() {
- MOZ_ASSERT(!XRE_IsParentProcess());
-
- // Make sure the children got passed the right telemetry pref details.
- DebugOnly<bool> value;
- MOZ_ASSERT(NS_SUCCEEDED(Preferences::GetBool(kTelemetryPref, &value)) &&
- value == TelemetryPrefValue());
- MOZ_ASSERT(Preferences::IsLocked(kTelemetryPref));
-}
-
#endif // MOZ_WIDGET_ANDROID
/* static */
@@ -3687,11 +3677,6 @@ already_AddRefed<Preferences> Preferences::GetInstanceForService() {
Preferences::SetPreference(gChangedDomPrefs->ElementAt(i));
}
gChangedDomPrefs = nullptr;
-
-#ifndef MOZ_WIDGET_ANDROID
- CheckTelemetryPref();
-#endif
-
} else {
// Check if there is a deployment configuration file. If so, set up the
// pref config machinery, which will actually read the file.
=====================================
modules/libpref/init/all.js
=====================================
@@ -3053,7 +3053,7 @@ pref("font.size.monospace.x-math", 13);
pref("font.name-list.monospace.ja", "MotoyaLMaru, MotoyaLCedar, Noto Sans Mono CJK JP, SEC Mono CJK JP, Droid Sans Mono");
pref("font.name-list.serif.ko", "Charis SIL Compact, Noto Serif CJK KR, Noto Serif, Droid Serif, HYSerif");
- pref("font.name-list.sans-serif.ko", "Roboto, Google Sans, SmartGothic, NanumGothic, Noto Sans KR, Noto Sans CJK KR, SamsungKorean_v2.0, SEC CJK KR, DroidSansFallback, Droid Sans Fallback");
+ pref("font.name-list.sans-serif.ko", "Roboto, Google Sans, SmartGothic, NanumGothic, Noto Sans KR, Noto Sans CJK KR, One UI Sans KR VF, SamsungKorean_v2.0, SEC CJK KR, DroidSansFallback, Droid Sans Fallback");
pref("font.name-list.monospace.ko", "Droid Sans Mono, Noto Sans Mono CJK KR, SEC Mono CJK KR");
pref("font.name-list.serif.th", "Charis SIL Compact, Noto Serif, Noto Serif Thai, Droid Serif");
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/65…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/65…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.6.0esr-13.0-1] Bug 1860020 - Remove the assertion on the value of toolkit.telemetry.enabled. r=KrisWright, chutten
by Pier Angelo Vendrame (@pierov) 09 Jan '24
by Pier Angelo Vendrame (@pierov) 09 Jan '24
09 Jan '24
Pier Angelo Vendrame pushed to branch tor-browser-115.6.0esr-13.0-1 at The Tor Project / Applications / Tor Browser
Commits:
4c246c84 by Pier Angelo Vendrame at 2024-01-09T14:27:30+01:00
Bug 1860020 - Remove the assertion on the value of toolkit.telemetry.enabled. r=KrisWright,chutten
Bug 1444275 introduced an assertion on the parent process to check that
the value of toolkit.telemetry.enabled is the expected one.
However, this expected value could be different from the one set and
locked e.g. in some forks. Therefore, the assertion prevented debug
builds from working in these cases.
Differential Revision: https://phabricator.services.mozilla.com/D195080
- - - - -
1 changed file:
- modules/libpref/Preferences.cpp
Changes:
=====================================
modules/libpref/Preferences.cpp
=====================================
@@ -3637,16 +3637,6 @@ void Preferences::SetupTelemetryPref() {
Preferences::Lock(kTelemetryPref);
}
-static void CheckTelemetryPref() {
- MOZ_ASSERT(!XRE_IsParentProcess());
-
- // Make sure the children got passed the right telemetry pref details.
- DebugOnly<bool> value;
- MOZ_ASSERT(NS_SUCCEEDED(Preferences::GetBool(kTelemetryPref, &value)) &&
- value == TelemetryPrefValue());
- MOZ_ASSERT(Preferences::IsLocked(kTelemetryPref));
-}
-
#endif // MOZ_WIDGET_ANDROID
/* static */
@@ -3687,11 +3677,6 @@ already_AddRefed<Preferences> Preferences::GetInstanceForService() {
Preferences::SetPreference(gChangedDomPrefs->ElementAt(i));
}
gChangedDomPrefs = nullptr;
-
-#ifndef MOZ_WIDGET_ANDROID
- CheckTelemetryPref();
-#endif
-
} else {
// Check if there is a deployment configuration file. If so, set up the
// pref config machinery, which will actually read the file.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/4c246c8…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/4c246c8…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][base-browser-115.6.0esr-13.0-1] Bug 1860020 - Remove the assertion on the value of toolkit.telemetry.enabled. r=KrisWright, chutten
by Pier Angelo Vendrame (@pierov) 09 Jan '24
by Pier Angelo Vendrame (@pierov) 09 Jan '24
09 Jan '24
Pier Angelo Vendrame pushed to branch base-browser-115.6.0esr-13.0-1 at The Tor Project / Applications / Tor Browser
Commits:
ff2a5e97 by Pier Angelo Vendrame at 2024-01-09T14:26:49+01:00
Bug 1860020 - Remove the assertion on the value of toolkit.telemetry.enabled. r=KrisWright,chutten
Bug 1444275 introduced an assertion on the parent process to check that
the value of toolkit.telemetry.enabled is the expected one.
However, this expected value could be different from the one set and
locked e.g. in some forks. Therefore, the assertion prevented debug
builds from working in these cases.
Differential Revision: https://phabricator.services.mozilla.com/D195080
- - - - -
1 changed file:
- modules/libpref/Preferences.cpp
Changes:
=====================================
modules/libpref/Preferences.cpp
=====================================
@@ -3637,16 +3637,6 @@ void Preferences::SetupTelemetryPref() {
Preferences::Lock(kTelemetryPref);
}
-static void CheckTelemetryPref() {
- MOZ_ASSERT(!XRE_IsParentProcess());
-
- // Make sure the children got passed the right telemetry pref details.
- DebugOnly<bool> value;
- MOZ_ASSERT(NS_SUCCEEDED(Preferences::GetBool(kTelemetryPref, &value)) &&
- value == TelemetryPrefValue());
- MOZ_ASSERT(Preferences::IsLocked(kTelemetryPref));
-}
-
#endif // MOZ_WIDGET_ANDROID
/* static */
@@ -3687,11 +3677,6 @@ already_AddRefed<Preferences> Preferences::GetInstanceForService() {
Preferences::SetPreference(gChangedDomPrefs->ElementAt(i));
}
gChangedDomPrefs = nullptr;
-
-#ifndef MOZ_WIDGET_ANDROID
- CheckTelemetryPref();
-#endif
-
} else {
// Check if there is a deployment configuration file. If so, set up the
// pref config machinery, which will actually read the file.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/ff2a5e9…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/ff2a5e9…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][base-browser-115.6.0esr-13.0-1] Bug 1865238 - Use One UI Sans KR VF for Korean sans-serif font on Android r=jfkthame
by Pier Angelo Vendrame (@pierov) 09 Jan '24
by Pier Angelo Vendrame (@pierov) 09 Jan '24
09 Jan '24
Pier Angelo Vendrame pushed to branch base-browser-115.6.0esr-13.0-1 at The Tor Project / Applications / Tor Browser
Commits:
23604adf by Kagami Sascha Rosylight at 2024-01-09T14:24:52+01:00
Bug 1865238 - Use One UI Sans KR VF for Korean sans-serif font on Android r=jfkthame
Per /etc/fonts.xml, there are now only two `<family lang="ko">` nodes there:
* OneUISansKRVF series
* SECCJK series (but no KR postfix anymore?)
This patch uses One UI Sans KR VF as the replacement as this is newer and is a variable font (tested with https://codepen.io/SaschaNaz/pen/ExrdYXJ)
Differential Revision: https://phabricator.services.mozilla.com/D195078
- - - - -
1 changed file:
- modules/libpref/init/all.js
Changes:
=====================================
modules/libpref/init/all.js
=====================================
@@ -3053,7 +3053,7 @@ pref("font.size.monospace.x-math", 13);
pref("font.name-list.monospace.ja", "MotoyaLMaru, MotoyaLCedar, Noto Sans Mono CJK JP, SEC Mono CJK JP, Droid Sans Mono");
pref("font.name-list.serif.ko", "Charis SIL Compact, Noto Serif CJK KR, Noto Serif, Droid Serif, HYSerif");
- pref("font.name-list.sans-serif.ko", "Roboto, Google Sans, SmartGothic, NanumGothic, Noto Sans KR, Noto Sans CJK KR, SamsungKorean_v2.0, SEC CJK KR, DroidSansFallback, Droid Sans Fallback");
+ pref("font.name-list.sans-serif.ko", "Roboto, Google Sans, SmartGothic, NanumGothic, Noto Sans KR, Noto Sans CJK KR, One UI Sans KR VF, SamsungKorean_v2.0, SEC CJK KR, DroidSansFallback, Droid Sans Fallback");
pref("font.name-list.monospace.ko", "Droid Sans Mono, Noto Sans Mono CJK KR, SEC Mono CJK KR");
pref("font.name-list.serif.th", "Charis SIL Compact, Noto Serif, Noto Serif Thai, Droid Serif");
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/23604ad…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/23604ad…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.6.0esr-13.0-1] Bug 1865238 - Use One UI Sans KR VF for Korean sans-serif font on Android r=jfkthame
by Pier Angelo Vendrame (@pierov) 09 Jan '24
by Pier Angelo Vendrame (@pierov) 09 Jan '24
09 Jan '24
Pier Angelo Vendrame pushed to branch tor-browser-115.6.0esr-13.0-1 at The Tor Project / Applications / Tor Browser
Commits:
15bfca64 by Kagami Sascha Rosylight at 2024-01-09T14:24:03+01:00
Bug 1865238 - Use One UI Sans KR VF for Korean sans-serif font on Android r=jfkthame
Per /etc/fonts.xml, there are now only two `<family lang="ko">` nodes there:
* OneUISansKRVF series
* SECCJK series (but no KR postfix anymore?)
This patch uses One UI Sans KR VF as the replacement as this is newer and is a variable font (tested with https://codepen.io/SaschaNaz/pen/ExrdYXJ)
Differential Revision: https://phabricator.services.mozilla.com/D195078
- - - - -
1 changed file:
- modules/libpref/init/all.js
Changes:
=====================================
modules/libpref/init/all.js
=====================================
@@ -3053,7 +3053,7 @@ pref("font.size.monospace.x-math", 13);
pref("font.name-list.monospace.ja", "MotoyaLMaru, MotoyaLCedar, Noto Sans Mono CJK JP, SEC Mono CJK JP, Droid Sans Mono");
pref("font.name-list.serif.ko", "Charis SIL Compact, Noto Serif CJK KR, Noto Serif, Droid Serif, HYSerif");
- pref("font.name-list.sans-serif.ko", "Roboto, Google Sans, SmartGothic, NanumGothic, Noto Sans KR, Noto Sans CJK KR, SamsungKorean_v2.0, SEC CJK KR, DroidSansFallback, Droid Sans Fallback");
+ pref("font.name-list.sans-serif.ko", "Roboto, Google Sans, SmartGothic, NanumGothic, Noto Sans KR, Noto Sans CJK KR, One UI Sans KR VF, SamsungKorean_v2.0, SEC CJK KR, DroidSansFallback, Droid Sans Fallback");
pref("font.name-list.monospace.ko", "Droid Sans Mono, Noto Sans Mono CJK KR, SEC Mono CJK KR");
pref("font.name-list.serif.th", "Charis SIL Compact, Noto Serif, Noto Serif Thai, Droid Serif");
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/15bfca6…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/15bfca6…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.0-1] fixup! Add Tor integration and UI
by Pier Angelo Vendrame (@pierov) 09 Jan '24
by Pier Angelo Vendrame (@pierov) 09 Jan '24
09 Jan '24
Pier Angelo Vendrame pushed to branch firefox-android-115.2.1-13.0-1 at The Tor Project / Applications / firefox-android
Commits:
dadeaa78 by Pier Angelo Vendrame at 2024-01-09T14:20:36+01:00
fixup! Add Tor integration and UI
Bug 42324: Onion location does not work after a browser restart
- - - - -
2 changed files:
- android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt
- fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt
Changes:
=====================================
android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt
=====================================
@@ -798,11 +798,7 @@ class GeckoEngine(
}
override var prioritizeOnions: Boolean
get() = runtime.settings.prioritizeOnions
- set(value) {
- value.let {
- runtime.settings.prioritizeOnions = it
- }
- }
+ set(value) { runtime.settings.prioritizeOnions = value }
}.apply {
defaultSettings?.let {
this.javascriptEnabled = it.javascriptEnabled
=====================================
fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt
=====================================
@@ -485,7 +485,9 @@ class SettingsFragment : PreferenceFragmentCompat() {
}
preferencePrioritizeOnions?.setOnPreferenceChangeListener<Boolean> { preference, newValue ->
- preference.context.components.core.engine.settings.prioritizeOnions = newValue
+ preference.context.settings().preferences.edit()
+ .putBoolean(preference.key, newValue).apply()
+ requireComponents.core.engine.settings.prioritizeOnions = newValue
true
}
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/dad…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/dad…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.6.0esr-13.0-1] fixup! Bug 40458: Implement .tor.onion aliases
by ma1 (@ma1) 08 Jan '24
by ma1 (@ma1) 08 Jan '24
08 Jan '24
ma1 pushed to branch tor-browser-115.6.0esr-13.0-1 at The Tor Project / Applications / Tor Browser
Commits:
e4373331 by hackademix at 2024-01-08T20:09:08+01:00
fixup! Bug 40458: Implement .tor.onion aliases
Bug 42099: Blind cross-site .onion requests.
- - - - -
3 changed files:
- browser/components/onionservices/OnionAliasStore.jsm
- + browser/components/onionservices/TorRequestWatch.sys.mjs
- browser/components/onionservices/moz.build
Changes:
=====================================
browser/components/onionservices/OnionAliasStore.jsm
=====================================
@@ -12,11 +12,10 @@ const { ConsoleAPI } = ChromeUtils.import("resource://gre/modules/Console.jsm");
const lazy = {};
-ChromeUtils.defineModuleGetter(
- lazy,
- "JSONFile",
- "resource://gre/modules/JSONFile.jsm"
-);
+ChromeUtils.defineESModuleGetters(lazy, {
+ JSONFile: "resource://gre/modules/JSONFile.sys.mjs",
+ TorRequestWatch: "resource:///modules/TorRequestWatch.sys.mjs",
+});
/* OnionAliasStore observer topics */
const OnionAliasStoreTopics = Object.freeze({
@@ -281,6 +280,7 @@ class _OnionAliasStore {
}
async init() {
+ lazy.TorRequestWatch.start();
await this._loadSettings();
if (this.enabled) {
await this._startUpdates();
@@ -295,6 +295,7 @@ class _OnionAliasStore {
}
this._rulesetTimeout = null;
Services.prefs.removeObserver(kPrefOnionAliasEnabled, this);
+ lazy.TorRequestWatch.stop();
}
async getChannels() {
=====================================
browser/components/onionservices/TorRequestWatch.sys.mjs
=====================================
@@ -0,0 +1,124 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * This module implements Tor-specific Web Request policies, such as
+ * preventing observable cross-site requests to .tor.onion and .bit.onion sites.
+ */
+
+import { ConsoleAPI } from "resource://gre/modules/Console.sys.mjs";
+
+const log = new ConsoleAPI({
+ maxLogLevel: "warn",
+ maxLogLevelPref: "browser.torRequestWatch.log_level",
+ prefix: "TorRequestWatch",
+});
+
+class RequestObserver {
+ static #topics = [
+ "http-on-modify-request",
+ "http-on-examine-response",
+ "http-on-examine-cached-response",
+ "http-on-examine-merged-response",
+ ];
+ #asObserver(addOrRemove) {
+ const action = Services.obs[`${addOrRemove}Observer`].bind(Services.obs);
+ for (const topic of RequestObserver.#topics) {
+ action(this, topic);
+ }
+ }
+
+ start() {
+ this.#asObserver("add");
+ log.debug("Started");
+ }
+ stop() {
+ this.#asObserver("remove");
+ log.debug("Stopped");
+ }
+
+ // nsIObserver implementation
+ observe(subject, topic, data) {
+ try {
+ let channel = ChannelWrapper.get(
+ subject.QueryInterface(Ci.nsIHttpChannel)
+ );
+ switch (topic) {
+ case "http-on-modify-request":
+ this.onRequest(channel);
+ break;
+ case "http-on-examine-cached-response":
+ case "http-on-examine-merged-response":
+ channel.isCached = true;
+ // falls through
+ case "http-on-examine-response":
+ this.onResponse(channel);
+ break;
+ }
+ } catch (e) {
+ log.error(e);
+ }
+ }
+
+ onRequest(channel) {
+ if (this.shouldBlind(channel, channel.documentURL)) {
+ log.warn(`Blocking cross-site ${channel.finalURL} ${channel.type} load.`);
+ channel.cancel(Cr.NS_ERROR_ABORT);
+ }
+ }
+ onResponse(channel) {
+ if (!channel.documentURL && this.shouldBlind(channel, channel.originURL)) {
+ const COOP = "cross-origin-opener-policy";
+ // we break window.opener references if needed to mitigate XS-Leaks
+ for (let h of channel.getResponseHeaders()) {
+ if (h.name.toLowerCase() === COOP && h.value === "same-origin") {
+ log.debug(`${COOP} is already same-origin, nothing to do.`);
+ return;
+ }
+ }
+ log.warn(`Blinding cross-site ${channel.finalURL} load.`);
+ channel.setResponseHeader(COOP, "same-origin-allow-popups");
+ }
+ }
+
+ isCrossOrigin(url1, url2) {
+ return new URL(url1).origin !== new URL(url2).origin;
+ }
+ shouldBlindCrossOrigin(uri) {
+ try {
+ let { host } = uri;
+ if (host.endsWith(".onion")) {
+ const previousPart = host.slice(-10, -6);
+ return (
+ previousPart && (previousPart === ".tor" || previousPart === ".bit")
+ );
+ }
+ } catch (e) {
+ // no host
+ }
+ return false;
+ }
+ shouldBlind(channel, sourceURL) {
+ return (
+ sourceURL &&
+ this.shouldBlindCrossOrigin(channel.finalURI) &&
+ this.isCrossOrigin(channel.finalURL, sourceURL)
+ );
+ }
+}
+
+let observer;
+export const TorRequestWatch = {
+ start() {
+ if (!observer) {
+ (observer = new RequestObserver()).start();
+ }
+ },
+ stop() {
+ if (observer) {
+ observer.stop();
+ observer = null;
+ }
+ },
+};
=====================================
browser/components/onionservices/moz.build
=====================================
@@ -4,4 +4,5 @@ EXTRA_JS_MODULES += [
"OnionAliasStore.jsm",
"OnionLocationChild.jsm",
"OnionLocationParent.jsm",
+ "TorRequestWatch.sys.mjs",
]
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/e437333…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/e437333…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.0-1] fixup! Modify add-on support
by ma1 (@ma1) 08 Jan '24
by ma1 (@ma1) 08 Jan '24
08 Jan '24
ma1 pushed to branch firefox-android-115.2.1-13.0-1 at The Tor Project / Applications / firefox-android
Commits:
cb98e7b2 by hackademix at 2024-01-08T19:54:56+01:00
fixup! Modify add-on support
Bug 42353: Fix NoScript automatic updates.
- - - - -
1 changed file:
- fenix/app/src/main/java/org/mozilla/fenix/components/TorBrowserFeatures.kt
Changes:
=====================================
fenix/app/src/main/java/org/mozilla/fenix/components/TorBrowserFeatures.kt
=====================================
@@ -136,37 +136,37 @@ object TorBrowserFeatures {
}
/**
- * If we have not done it yet, enable automatic updates for NoScript and force a
+ * Enable automatic updates for NoScript and, if we've not done it yet, force a
* one-time immediate update check, in order to upgrade old profiles and ensure we've got
* the latest stable AMO version available on first startup.
* We will do it as soon as the Tor is connected, to prevent early addonUpdater activation
* causing automatic update checks failures (components.addonUpdater being a lazy prop).
* The extension, from then on, should behave as if the user had installed it manually.
*/
- if (settings.noscriptUpdated == 0) {
- context.components.torController.registerTorListener(object : TorEvents {
- override fun onTorConnected() {
- context.components.torController.unregisterTorListener(this)
- // Enable automatic updates
- context.components.addonUpdater.registerForFutureUpdates(NOSCRIPT_ID)
- // Force an immediate update check
+ context.components.torController.registerTorListener(object : TorEvents {
+ override fun onTorConnected() {
+ context.components.torController.unregisterTorListener(this)
+ // Enable automatic updates. This must be done on every startup (tor-browser#42353)
+ context.components.addonUpdater.registerForFutureUpdates(NOSCRIPT_ID)
+ // Force a one-time immediate update check for older installations
+ if (settings.noscriptUpdated < 2) {
context.components.addonUpdater.update(NOSCRIPT_ID)
- settings.noscriptUpdated = 1
+ settings.noscriptUpdated = 2
}
+ }
- @SuppressWarnings("EmptyFunctionBlock")
- override fun onTorConnecting() {
- }
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorConnecting() {
+ }
- @SuppressWarnings("EmptyFunctionBlock")
- override fun onTorStopped() {
- }
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorStopped() {
+ }
- @SuppressWarnings("EmptyFunctionBlock")
- override fun onTorStatusUpdate(entry: String?, status: String?) {
- }
- })
- }
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorStatusUpdate(entry: String?, status: String?) {
+ }
+ })
}
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/cb9…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/cb9…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][main] Bug 42343 (TB): Pass pt_config.json to the browser
by Pier Angelo Vendrame (@pierov) 08 Jan '24
by Pier Angelo Vendrame (@pierov) 08 Jan '24
08 Jan '24
Pier Angelo Vendrame pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
1c1deba7 by Pier Angelo Vendrame at 2024-01-08T14:42:54+01:00
Bug 42343 (TB): Pass pt_config.json to the browser
We modified TorSettings to handle pt_config.json, so we do not need to
convert it to pref lines anymore, but we need to inject the updated
file to omni.ja.
- - - - -
2 changed files:
- projects/browser/build
- projects/browser/build.android
Changes:
=====================================
projects/browser/build
=====================================
@@ -257,26 +257,6 @@ done
echo "${line/\$\{pt_path\}/${PT_PATH}}" >> "$TORRC_DEFAULTS"
done
done
-
- # Write Default Bridge Prefs
- echo "# Tor Launcher preferences (default bridges):" >> "$GENERATEDPREFSPATH"
- RECOMMMENDED_DEFAULT=$(jq -r .recommendedDefault "${PT_CONFIG}")
- echo "pref(\"extensions.torlauncher.default_bridge_recommended_type\", \"${RECOMMMENDED_DEFAULT}\");" >> "$GENERATEDPREFSPATH"
-
- # Writes bridge-line prefs for a given bridge type
- function bridges_conf {
- local bridge_type="$1"
- local i=1
- jq -r ".bridges.\"$bridge_type\" | .[]" "${PT_CONFIG}" | while read -r line; do
- echo "pref(\"extensions.torlauncher.default_bridge.$bridge_type.$i\", \"$line\");" >> "$GENERATEDPREFSPATH"
- i=$((i + 1))
- done
- }
-
- # Iterate over our bridge types and write default bridgelines for each
- for bridge_type in $(jq -r ".bridges | keys[]" "${PT_CONFIG}"); do
- bridges_conf $bridge_type
- done
[% END -%]
[% IF c("var/linux") && c("var/tor-browser") %]
@@ -293,8 +273,17 @@ PKG_DIR='[% c("var/project-name") %]'
for tbdir in "${TBDIRS[@]}"
do
- tbdir="$tbdir[% IF c('var/macos') %]/Contents/Resources[% END %]/browser/"
- pushd "$tbdir"
+ tbdir="$tbdir[% IF c('var/macos') %]/Contents/Resources[% END %]/"
+ [% IF c("var/tor-browser") -%]
+ pushd "$rootdir"
+ pt_config_dir=chrome/toolkit/content/global
+ mkdir -p "$pt_config_dir"
+ cp "pt_config.json" "$pt_config_dir/"
+ zip -Xm "$tbdir/omni.ja" "$pt_config_dir/pt_config.json"
+ rm -rf chrome
+ popd
+ [% END -%]
+ pushd "$tbdir/browser"
unzip omni.ja defaults/preferences/[% c("var/prefs_file") %] || [ $? -lt 3 ]
# Append our built extension-overrides.js to the preferences file
cat "$GENERATEDPREFSPATH" >> defaults/preferences/[% c("var/prefs_file") %]
=====================================
projects/browser/build.android
=====================================
@@ -14,7 +14,7 @@ sorted_baseline_apk=$(basename $apk .apk)_sorted_baseline.apk
$rootdir/sort-baseline.py --apk $apk $sorted_baseline_apk
mv $sorted_baseline_apk $apk
-# Bundle our extensioni(s).
+# Bundle our extension(s).
# NoScript will be copied over to the profile folder
# as a "regular" browser extension receiving regular AMO updates.
noscript_path="$ext_dir/{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi"
@@ -23,6 +23,21 @@ mkdir -p /var/tmp/build/$ext_dir [% dest_dir _ '/' _ c('filename') %]
cd /var/tmp/build
mv $rootdir/[% c('input_files_by_name/noscript') %] "$noscript_path"
+[%IF c("var/tor-browser") -%]
+ unzip -j "$apk" assets/omni.ja
+ tar -xaf "$rootdir/[% c("input_files_by_name/tor-expert-bundle") %]" tor/pluggable_transports/pt_config.json
+ mkdir omni
+ pushd omni
+ unzip ../omni.ja
+ cp ../tor/pluggable_transports/pt_config.json chrome/toolkit/content/global/pt_config.json
+ [% c('zip', {
+ zip_src => [ '.' ],
+ zip_args => '../assets/omni.ja',
+ }) %]
+ popd
+[% END -%]
+
+
[% IF c("var/verify_allowed_addons") %]
# Check that allowed_addons.json contains the right versions of our bundled extension(s).
# If so, replace the default allowed_addons.json by ours in the apk assets folder.
@@ -32,9 +47,9 @@ mv $rootdir/[% c('input_files_by_name/noscript') %] "$noscript_path"
mv $rootdir/allowed_addons.json $assets_dir/allowed_addons.json
[% c('zip', {
- zip_src => [ '$assets_dir' ],
- zip_args => '$apk',
- }) %]
+ zip_src => [ '$assets_dir' ],
+ zip_args => '$apk',
+ }) %]
aligned_apk=$(basename $apk .apk)_aligned.apk
zipalign -vp 4 $apk $aligned_apk
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/1…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/1…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.6.0esr-13.5-1] 8 commits: fixup! Bug 40597: Implement TorSettings module
by Pier Angelo Vendrame (@pierov) 08 Jan '24
by Pier Angelo Vendrame (@pierov) 08 Jan '24
08 Jan '24
Pier Angelo Vendrame pushed to branch tor-browser-115.6.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
be025b30 by Pier Angelo Vendrame at 2024-01-08T14:38:58+01:00
fixup! Bug 40597: Implement TorSettings module
Convert TorSettings to an ES class.
- - - - -
440a0aae by Pier Angelo Vendrame at 2024-01-08T14:39:01+01:00
fixup! Bug 40597: Implement TorSettings module
Replace _ with # for private stuff in TorSettings.
- - - - -
08bc6b26 by Pier Angelo Vendrame at 2024-01-08T14:39:01+01:00
fixup! Bug 40597: Implement TorSettings module
Bug 42343: Read built-in bridges from pt_config.json instead of
preferences.
- - - - -
28351513 by Pier Angelo Vendrame at 2024-01-08T14:39:02+01:00
fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection
Bug 42343: Read built-in bridges from pt_config.json instead of
preferences.
Update the way in which we query the PTs we have bundled bridge lines
for.
- - - - -
6e7488b0 by Pier Angelo Vendrame at 2024-01-08T14:39:02+01:00
fixup! Bug 40562: Added Tor Browser preferences to 000-tor-browser.js
Bug 42343: Read built-in bridges from pt_config.json instead of
preferences.
Remove some preferences we do not use anymore and their documentation.
- - - - -
8da34d3a by Pier Angelo Vendrame at 2024-01-08T14:39:02+01:00
fixup! Bug 41089: Add tor-browser build scripts + Makefile to tor-browser
Bug 42343: Read built-in bridges from pt_config.json instead of
preferences.
Do not copy the bridges anymore when doing the deploy.
- - - - -
51e8c714 by Pier Angelo Vendrame at 2024-01-08T14:39:03+01:00
fixup! Bug 40597: Implement TorSettings module
Added checks on TorSettings.initialized, and some documentation
improvements.
- - - - -
7272b554 by Pier Angelo Vendrame at 2024-01-08T14:39:03+01:00
fixup! Bug 40597: Implement TorSettings module
Batch of changes requested in the MR.
- - - - -
9 changed files:
- browser/app/profile/000-tor-browser.js
- browser/components/torpreferences/content/builtinBridgeDialog.mjs
- browser/components/torpreferences/content/connectionPane.js
- toolkit/content/jar.mn
- + toolkit/content/pt_config.json
- toolkit/modules/TorConnect.sys.mjs
- toolkit/modules/TorSettings.sys.mjs
- − tools/torbrowser/bridges.js
- tools/torbrowser/deploy.sh
Changes:
=====================================
browser/app/profile/000-tor-browser.js
=====================================
@@ -69,7 +69,6 @@ pref("extensions.torbutton.pref_fixup_version", 0);
pref("extensions.torlauncher.start_tor", true);
pref("extensions.torlauncher.prompt_at_startup", true);
-pref("extensions.torlauncher.quickstart", false);
pref("extensions.torlauncher.max_tor_log_entries", 1000);
@@ -113,11 +112,3 @@ pref("extensions.torlauncher.tordatadir_path", "");
pref("extensions.torlauncher.bridgedb_front", "foursquare.com");
pref("extensions.torlauncher.bridgedb_reflector", "https://moat.torproject.org.global.prod.fastly.net/");
pref("extensions.torlauncher.moat_service", "https://bridges.torproject.org/moat");
-pref("extensions.torlauncher.bridgedb_bridge_type", "obfs4");
-
-// Recommended default bridge type.
-// pref("extensions.torlauncher.default_bridge_recommended_type", "obfs3");
-
-// Default bridges.
-// pref("extensions.torlauncher.default_bridge.TYPE.1", "TYPE x.x.x.x:yy");
-// pref("extensions.torlauncher.default_bridge.TYPE.2", "TYPE x.x.x.x:yy");
=====================================
browser/components/torpreferences/content/builtinBridgeDialog.mjs
=====================================
@@ -3,7 +3,6 @@ import { TorStrings } from "resource://gre/modules/TorStrings.sys.mjs";
import {
TorSettings,
TorBridgeSource,
- TorBuiltinBridgeTypes,
} from "resource://gre/modules/TorSettings.sys.mjs";
import {
@@ -62,7 +61,7 @@ export class BuiltinBridgeDialog {
)) {
const radio = optionEl.querySelector("radio");
const type = radio.value;
- optionEl.hidden = !TorBuiltinBridgeTypes.includes(type);
+ optionEl.hidden = !TorSettings.builtinBridgeTypes.includes(type);
radio.label = typeStrings[type].label;
optionEl.querySelector(
".builtin-bridges-option-description"
=====================================
browser/components/torpreferences/content/connectionPane.js
=====================================
@@ -867,7 +867,7 @@ const gConnectionPane = (function () {
},
init() {
- this._populateXUL();
+ TorSettings.initializedPromise.then(() => this._populateXUL());
const onUnload = () => {
window.removeEventListener("unload", onUnload);
=====================================
toolkit/content/jar.mn
=====================================
@@ -137,3 +137,5 @@ toolkit.jar:
# Third party files
content/global/third_party/d3/d3.js (/third_party/js/d3/d3.js)
content/global/third_party/cfworker/json-schema.js (/third_party/js/cfworker/json-schema.js)
+
+ content/global/pt_config.json (pt_config.json)
=====================================
toolkit/content/pt_config.json
=====================================
@@ -0,0 +1,32 @@
+{
+ "_comment": "Used for dev build, replaced for release builds in tor-browser-build. This file is copied from tor-browser-build cb513eec:tor-expert-bundle/pt_config.json",
+ "recommendedDefault" : "obfs4",
+ "pluggableTransports" : {
+ "lyrebird" : "ClientTransportPlugin meek_lite,obfs2,obfs3,obfs4,scramblesuit exec ${pt_path}lyrebird${pt_extension}",
+ "snowflake" : "ClientTransportPlugin snowflake exec ${pt_path}snowflake-client${pt_extension}",
+ "webtunnel" : "ClientTransportPlugin webtunnel exec ${pt_path}webtunnel-client${pt_extension}",
+ "conjure" : "ClientTransportPlugin conjure exec ${pt_path}conjure-client${pt_extension} -registerURL https://registration.refraction.network/api"
+ },
+ "bridges" : {
+ "meek-azure" : [
+ "meek_lite 192.0.2.18:80 BE776A53492E1E044A26F17306E1BC46A55A1625 url=https://meek.azureedge.net/ front=ajax.aspnetcdn.com"
+ ],
+ "obfs4" : [
+ "obfs4 192.95.36.142:443 CDF2E852BF539B82BD10E27E9115A31734E378C2 cert=qUVQ0srL1JI/vO6V6m/24anYXiJD3QP2HgzUKQtQ7GRqqUvs7P+tG43RtAqdhLOALP7DJQ iat-mode=1",
+ "obfs4 37.218.245.14:38224 D9A82D2F9C2F65A18407B1D2B764F130847F8B5D cert=bjRaMrr1BRiAW8IE9U5z27fQaYgOhX1UCmOpg2pFpoMvo6ZgQMzLsaTzzQNTlm7hNcb+Sg iat-mode=0",
+ "obfs4 85.31.186.98:443 011F2599C0E9B27EE74B353155E244813763C3E5 cert=ayq0XzCwhpdysn5o0EyDUbmSOx3X/oTEbzDMvczHOdBJKlvIdHHLJGkZARtT4dcBFArPPg iat-mode=0",
+ "obfs4 85.31.186.26:443 91A6354697E6B02A386312F68D82CF86824D3606 cert=PBwr+S8JTVZo6MPdHnkTwXJPILWADLqfMGoVvhZClMq/Urndyd42BwX9YFJHZnBB3H0XCw iat-mode=0",
+ "obfs4 193.11.166.194:27015 2D82C2E354D531A68469ADF7F878FA6060C6BACA cert=4TLQPJrTSaDffMK7Nbao6LC7G9OW/NHkUwIdjLSS3KYf0Nv4/nQiiI8dY2TcsQx01NniOg iat-mode=0",
+ "obfs4 193.11.166.194:27020 86AC7B8D430DAC4117E9F42C9EAED18133863AAF cert=0LDeJH4JzMDtkJJrFphJCiPqKx7loozKN7VNfuukMGfHO0Z8OGdzHVkhVAOfo1mUdv9cMg iat-mode=0",
+ "obfs4 193.11.166.194:27025 1AE2C08904527FEA90C4C4F8C1083EA59FBC6FAF cert=ItvYZzW5tn6v3G4UnQa6Qz04Npro6e81AP70YujmK/KXwDFPTs3aHXcHp4n8Vt6w/bv8cA iat-mode=0",
+ "obfs4 209.148.46.65:443 74FAD13168806246602538555B5521A0383A1875 cert=ssH+9rP8dG2NLDN2XuFw63hIO/9MNNinLmxQDpVa+7kTOa9/m+tGWT1SmSYpQ9uTBGa6Hw iat-mode=0",
+ "obfs4 146.57.248.225:22 10A6CD36A537FCE513A322361547444B393989F0 cert=K1gDtDAIcUfeLqbstggjIw2rtgIKqdIhUlHp82XRqNSq/mtAjp1BIC9vHKJ2FAEpGssTPw iat-mode=0",
+ "obfs4 45.145.95.6:27015 C5B7CD6946FF10C5B3E89691A7D3F2C122D2117C cert=TD7PbUO0/0k6xYHMPW3vJxICfkMZNdkRrb63Zhl5j9dW3iRGiCx0A7mPhe5T2EDzQ35+Zw iat-mode=0",
+ "obfs4 51.222.13.177:80 5EDAC3B810E12B01F6FD8050D2FD3E277B289A08 cert=2uplIpLQ0q9+0qMFrK5pkaYRDOe460LL9WHBvatgkuRr/SL31wBOEupaMMJ6koRE6Ld0ew iat-mode=0"
+ ],
+ "snowflake" : [
+ "snowflake 192.0.2.3:80 2B280B23E1107BB62ABFC40DDCC8824814F80A72 fingerprint=2B280B23E1107BB62ABFC40DDCC8824814F80A72 url=https://snowflake-broker.torproject.net.global.prod.fastly.net/ front=foursquare.com ice=stun:stun.l.google.com:19302,stun:stun.antisip.com:3478,stun:stun.bluesip.net:3478,stun:stun.dus.net:3478,stun:stun.epygi.com:3478,stun:stun.sonetel.com:3478,stun:stun.uls.co.za:3478,stun:stun.voipgate.com:3478,stun:stun.voys.nl:3478 utls-imitate=hellorandomizedalpn",
+ "snowflake 192.0.2.4:80 8838024498816A039FCBBAB14E6F40A0843051FA fingerprint=8838024498816A039FCBBAB14E6F40A0843051FA url=https://snowflake-broker.torproject.net.global.prod.fastly.net/ front=foursquare.com ice=stun:stun.l.google.com:19302,stun:stun.antisip.com:3478,stun:stun.bluesip.net:3478,stun:stun.dus.net:3478,stun:stun.epygi.com:3478,stun:stun.sonetel.net:3478,stun:stun.uls.co.za:3478,stun:stun.voipgate.com:3478,stun:stun.voys.nl:3478 utls-imitate=hellorandomizedalpn"
+ ]
+ }
+}
=====================================
toolkit/modules/TorConnect.sys.mjs
=====================================
@@ -23,7 +23,6 @@ import { TorLauncherUtil } from "resource://gre/modules/TorLauncherUtil.sys.mjs"
import {
TorSettings,
TorSettingsTopics,
- TorBuiltinBridgeTypes,
} from "resource://gre/modules/TorSettings.sys.mjs";
import { TorStrings } from "resource://gre/modules/TorStrings.sys.mjs";
@@ -609,7 +608,7 @@ export const TorConnect = (() => {
}
const settings = await this.mrpc.circumvention_settings(
- [...TorBuiltinBridgeTypes, "vanilla"],
+ [...TorSettings.builtinBridgeTypes, "vanilla"],
countryCode
);
@@ -625,7 +624,7 @@ export const TorConnect = (() => {
} else {
try {
this.settings = await this.mrpc.circumvention_defaults([
- ...TorBuiltinBridgeTypes,
+ ...TorSettings.builtinBridgeTypes,
"vanilla",
]);
} catch (err) {
=====================================
toolkit/modules/TorSettings.sys.mjs
=====================================
@@ -67,16 +67,6 @@ const TorSettingsPrefs = Object.freeze({
},
});
-/* Legacy tor-launcher prefs and pref branches*/
-const TorLauncherPrefs = Object.freeze({
- quickstart: "extensions.torlauncher.quickstart",
- default_bridge_type: "extensions.torlauncher.default_bridge_type",
- default_bridge: "extensions.torlauncher.default_bridge.",
- default_bridge_recommended_type:
- "extensions.torlauncher.default_bridge_recommended_type",
- bridgedb_bridge: "extensions.torlauncher.bridgedb_bridge.",
-});
-
/* Config Keys used to configure tor daemon */
const TorConfigKeys = Object.freeze({
useBridges: "UseBridges",
@@ -105,101 +95,41 @@ export const TorProxyType = Object.freeze({
HTTPS: 2,
});
-export const TorBuiltinBridgeTypes = Object.freeze(
- (() => {
- const bridgeListBranch = Services.prefs.getBranch(
- TorLauncherPrefs.default_bridge
- );
- const bridgePrefs = bridgeListBranch.getChildList("");
-
- // an unordered set for shoving bridge types into
- const bridgeTypes = new Set();
- // look for keys ending in ".N" and treat string before that as the bridge type
- const pattern = /\.[0-9]+$/;
- for (const key of bridgePrefs) {
- const offset = key.search(pattern);
- if (offset != -1) {
- const bt = key.substring(0, offset);
- bridgeTypes.add(bt);
- }
- }
-
- // recommended bridge type goes first in the list
- const recommendedBridgeType = Services.prefs.getCharPref(
- TorLauncherPrefs.default_bridge_recommended_type,
- null
- );
-
- const retval = [];
- if (recommendedBridgeType && bridgeTypes.has(recommendedBridgeType)) {
- retval.push(recommendedBridgeType);
- }
-
- for (const bridgeType of bridgeTypes.values()) {
- if (bridgeType != recommendedBridgeType) {
- retval.push(bridgeType);
- }
- }
- return retval;
- })()
-);
-
-/* Parsing Methods */
-
-// expects a '\n' or '\r\n' delimited bridge string, which we split and trim
-// each bridge string can also optionally have 'bridge' at the beginning ie:
-// bridge $(type) $(address):$(port) $(certificate)
-// we strip out the 'bridge' prefix here
-const parseBridgeStrings = function (aBridgeStrings) {
+/**
+ * Split a blob of bridge lines into an array with single lines.
+ * Lines are delimited by \r\n or \n and each bridge string can also optionally
+ * have 'bridge' at the beginning.
+ * We split the text by \r\n, we trim the lines, remove the bridge prefix and
+ * filter out any remaiing empty item.
+ *
+ * @param {string} aBridgeStrings The text with the lines
+ * @returns {string[]} An array where each bridge line is an item
+ */
+function parseBridgeStrings(aBridgeStrings) {
// replace carriage returns ('\r') with new lines ('\n')
aBridgeStrings = aBridgeStrings.replace(/\r/g, "\n");
// then replace contiguous new lines ('\n') with a single one
aBridgeStrings = aBridgeStrings.replace(/[\n]+/g, "\n");
- // split on the newline and for each bridge string: trim, remove starting 'bridge' string
- // finally discard entries that are empty strings; empty strings could occur if we receive
- // a new line containing only whitespace
+ // Split on the newline and for each bridge string: trim, remove starting
+ // 'bridge' string.
+ // Finally, discard entries that are empty strings; empty strings could occur
+ // if we receive a new line containing only whitespace.
const splitStrings = aBridgeStrings.split("\n");
return splitStrings
.map(val => val.trim().replace(/^bridge\s+/i, ""))
- .filter(bridgeString => bridgeString != "");
-};
-
-const getBuiltinBridgeStrings = function (builtinType) {
- if (!builtinType) {
- return [];
- }
-
- const bridgeBranch = Services.prefs.getBranch(
- TorLauncherPrefs.default_bridge
- );
- const bridgeBranchPrefs = bridgeBranch.getChildList("");
- const retval = [];
-
- // regex matches against strings ending in ".N" where N is a positive integer
- const pattern = /\.[0-9]+$/;
- for (const key of bridgeBranchPrefs) {
- // verify the location of the match is the correct offset required for aBridgeType
- // to fit, and that the string begins with aBridgeType
- if (
- key.search(pattern) == builtinType.length &&
- key.startsWith(builtinType)
- ) {
- const bridgeStr = bridgeBranch.getCharPref(key);
- retval.push(bridgeStr);
- }
- }
-
- // shuffle so that Tor Browser users don't all try the built-in bridges in the same order
- arrayShuffle(retval);
-
- return retval;
-};
-
-/* Helper methods */
-
-const arrayShuffle = function (array) {
- // fisher-yates shuffle
+ .filter(bridgeString => bridgeString !== "");
+}
+
+/**
+ * Return a shuffled (Fisher-Yates) copy of an array.
+ *
+ * @template T
+ * @param {T[]} array
+ * @returns {T[]}
+ */
+function arrayShuffle(array) {
+ array = [...array];
for (let i = array.length - 1; i > 0; --i) {
// number n such that 0.0 <= n < 1.0
const n = Math.random();
@@ -211,17 +141,18 @@ const arrayShuffle = function (array) {
array[i] = array[j];
array[j] = tmp;
}
-};
+ return array;
+}
/* TorSettings module */
-export const TorSettings = {
+class TorSettingsImpl {
/**
* The underlying settings values.
*
* @type {object}
*/
- _settings: {
+ #settings = {
quickstart: {
enabled: false,
},
@@ -243,34 +174,207 @@ export const TorSettings = {
enabled: false,
allowed_ports: [],
},
- },
+ };
+
+ /**
+ * The recommended pluggable transport.
+ *
+ * @type {string}
+ */
+ #recommendedPT = "";
+
+ /**
+ * The bridge lines for built-in bridges.
+ * Keys are pluggable transports, and values are arrays of bridge lines.
+ *
+ * @type {Object.<string, string[]>}
+ */
+ #builtinBridges = {};
+
+ /**
+ * Resolve callback of the initializedPromise.
+ */
+ #initComplete;
+ /**
+ * Reject callback of the initializedPromise.
+ */
+ #initFailed;
+ /**
+ * Tell whether the initializedPromise has been resolved.
+ * We keep this additional member to avoid making everything async.
+ *
+ * @type {boolean}
+ */
+ #initialized = false;
+ /**
+ * During some phases of the initialization, allow calling setters and
+ * getters without throwing errors.
+ *
+ * @type {boolean}
+ */
+ #allowUninitialized = false;
+
+ constructor() {
+ this.initializedPromise = new Promise((resolve, reject) => {
+ this.#initComplete = resolve;
+ this.#initFailed = reject;
+ });
+
+ this.#addProperties("quickstart", {
+ enabled: {},
+ });
+ this.#addProperties("bridges", {
+ enabled: {},
+ source: {
+ transform: val => {
+ if (Object.values(TorBridgeSource).includes(val)) {
+ return val;
+ }
+ lazy.logger.error(`Not a valid bridge source: "${val}"`);
+ return TorBridgeSource.Invalid;
+ },
+ },
+ bridge_strings: {
+ transform: val => {
+ if (Array.isArray(val)) {
+ return [...val];
+ }
+ return parseBridgeStrings(val);
+ },
+ copy: val => [...val],
+ equal: (val1, val2) => this.#arrayEqual(val1, val2),
+ },
+ builtin_type: {
+ callback: val => {
+ if (!val) {
+ // Make sure that the source is not BuiltIn
+ if (this.bridges.source === TorBridgeSource.BuiltIn) {
+ this.bridges.source = TorBridgeSource.Invalid;
+ }
+ return;
+ }
+ const bridgeStrings = this.#getBuiltinBridges(val);
+ if (bridgeStrings.length) {
+ this.bridges.bridge_strings = bridgeStrings;
+ return;
+ }
+ lazy.logger.error(`No built-in ${val} bridges found`);
+ // Change to be empty, this will trigger this callback again,
+ // but with val as "".
+ this.bridges.builtin_type == "";
+ },
+ },
+ });
+ this.#addProperties("proxy", {
+ enabled: {
+ callback: val => {
+ if (val) {
+ return;
+ }
+ // Reset proxy settings.
+ this.proxy.type = TorProxyType.Invalid;
+ this.proxy.address = "";
+ this.proxy.port = 0;
+ this.proxy.username = "";
+ this.proxy.password = "";
+ },
+ },
+ type: {
+ transform: val => {
+ if (Object.values(TorProxyType).includes(val)) {
+ return val;
+ }
+ lazy.logger.error(`Not a valid proxy type: "${val}"`);
+ return TorProxyType.Invalid;
+ },
+ },
+ address: {},
+ port: {
+ transform: val => {
+ if (val === 0) {
+ // This is a valid value that "unsets" the port.
+ // Keep this value without giving a warning.
+ // NOTE: In contrast, "0" is not valid.
+ return 0;
+ }
+ // Unset to 0 if invalid null is returned.
+ return this.#parsePort(val, false) ?? 0;
+ },
+ },
+ username: {},
+ password: {},
+ uri: {
+ getter: () => {
+ const { type, address, port, username, password } = this.proxy;
+ switch (type) {
+ case TorProxyType.Socks4:
+ return `socks4a://${address}:${port}`;
+ case TorProxyType.Socks5:
+ if (username) {
+ return `socks5://${username}:${password}@${address}:${port}`;
+ }
+ return `socks5://${address}:${port}`;
+ case TorProxyType.HTTPS:
+ if (username) {
+ return `http://${username}:${password}@${address}:${port}`;
+ }
+ return `http://${address}:${port}`;
+ }
+ return null;
+ },
+ },
+ });
+ this.#addProperties("firewall", {
+ enabled: {
+ callback: val => {
+ if (!val) {
+ this.firewall.allowed_ports = "";
+ }
+ },
+ },
+ allowed_ports: {
+ transform: val => {
+ if (!Array.isArray(val)) {
+ val = val === "" ? [] : val.split(",");
+ }
+ // parse and remove duplicates
+ const portSet = new Set(val.map(p => this.#parsePort(p, true)));
+ // parsePort returns null for failed parses, so remove it.
+ portSet.delete(null);
+ return [...portSet];
+ },
+ copy: val => [...val],
+ equal: (val1, val2) => this.#arrayEqual(val1, val2),
+ },
+ });
+ }
/**
* The current number of freezes applied to the notifications.
*
* @type {integer}
*/
- _freezeNotificationsCount: 0,
+ #freezeNotificationsCount = 0;
/**
* The queue for settings that have changed. To be broadcast in the
* notification when not frozen.
*
* @type {Set<string>}
*/
- _notificationQueue: new Set(),
+ #notificationQueue = new Set();
/**
* Send a notification if we have any queued and we are not frozen.
*/
- _tryNotification() {
- if (this._freezeNotificationsCount || !this._notificationQueue.size) {
+ #tryNotification() {
+ if (this.#freezeNotificationsCount || !this.#notificationQueue.size) {
return;
}
Services.obs.notifyObservers(
- { changes: [...this._notificationQueue] },
+ { changes: [...this.#notificationQueue] },
TorSettingsTopics.SettingsChanged
);
- this._notificationQueue.clear();
- },
+ this.#notificationQueue.clear();
+ }
/**
* Pause notifications for changes in setting values. This is useful if you
* need to make batch changes to settings.
@@ -281,8 +385,8 @@ export const TorSettings = {
* `finally` block.
*/
freezeNotifications() {
- this._freezeNotificationsCount++;
- },
+ this.#freezeNotificationsCount++;
+ }
/**
* Release the hold on notifications so they may be sent out.
*
@@ -290,9 +394,9 @@ export const TorSettings = {
* only release them once it has also called this method.
*/
thawNotifications() {
- this._freezeNotificationsCount--;
- this._tryNotification();
- },
+ this.#freezeNotificationsCount--;
+ this.#tryNotification();
+ }
/**
* @typedef {object} TorSettingProperty
*
@@ -316,22 +420,32 @@ export const TorSettings = {
* @param {string} groupname - The name of the setting group. The given
* settings will be accessible from the TorSettings property of the same
* name.
- * @param {object<string, TorSettingProperty>} propParams - An object that
+ * @param {object.<string, TorSettingProperty>} propParams - An object that
* defines the settings to add to this group. The object property names
* will be mapped to properties of TorSettings under the given groupname
* property. Details about the setting should be described in the
* TorSettingProperty property value.
*/
- _addProperties(groupname, propParams) {
+ #addProperties(groupname, propParams) {
// Create a new object to hold all these settings.
const group = {};
for (const name in propParams) {
const { getter, transform, callback, copy, equal } = propParams[name];
Object.defineProperty(group, name, {
get: getter
- ? getter
+ ? () => {
+ // Allow getting in loadFromPrefs before we are initialized.
+ if (!this.#allowUninitialized) {
+ this.#checkIfInitialized();
+ }
+ return getter();
+ }
: () => {
- let val = this._settings[groupname][name];
+ // Allow getting in loadFromPrefs before we are initialized.
+ if (!this.#allowUninitialized) {
+ this.#checkIfInitialized();
+ }
+ let val = this.#settings[groupname][name];
if (copy) {
val = copy(val);
}
@@ -341,7 +455,11 @@ export const TorSettings = {
set: getter
? undefined
: val => {
- const prevVal = this._settings[groupname][name];
+ // Allow setting in loadFromPrefs before we are initialized.
+ if (!this.#allowUninitialized) {
+ this.#checkIfInitialized();
+ }
+ const prevVal = this.#settings[groupname][name];
this.freezeNotifications();
try {
if (transform) {
@@ -352,8 +470,8 @@ export const TorSettings = {
if (callback) {
callback(val);
}
- this._settings[groupname][name] = val;
- this._notificationQueue.add(`${groupname}.${name}`);
+ this.#settings[groupname][name] = val;
+ this.#notificationQueue.add(`${groupname}.${name}`);
}
} finally {
this.thawNotifications();
@@ -367,14 +485,14 @@ export const TorSettings = {
writable: false,
value: group,
});
- },
+ }
/**
* Regular expression for a decimal non-negative integer.
*
* @type {RegExp}
*/
- _portRegex: /^[0-9]+$/,
+ #portRegex = /^[0-9]+$/;
/**
* Parse a string as a port number.
*
@@ -385,13 +503,13 @@ export const TorSettings = {
* @return {integer?} - The port number, or null if the given value was not
* valid.
*/
- _parsePort(val, trim) {
+ #parsePort(val, trim) {
if (typeof val === "string") {
if (trim) {
val = val.trim();
}
// ensure port string is a valid positive integer
- if (this._portRegex.test(val)) {
+ if (this.#portRegex.test(val)) {
val = Number.parseInt(val, 10);
} else {
lazy.logger.error(`Invalid port string "${val}"`);
@@ -403,7 +521,7 @@ export const TorSettings = {
return null;
}
return val;
- },
+ }
/**
* Test whether two arrays have equal members and order.
*
@@ -412,142 +530,57 @@ export const TorSettings = {
*
* @return {boolean} - Whether the two arrays are equal.
*/
- _arrayEqual(val1, val2) {
+ #arrayEqual(val1, val2) {
if (val1.length !== val2.length) {
return false;
}
return val1.every((v, i) => v === val2[i]);
- },
+ }
+
+ /**
+ * Return the bridge lines associated to a certain pluggable transport.
+ *
+ * @param {string} pt The pluggable transport to return the lines for
+ * @returns {string[]} The bridge lines in random order
+ */
+ #getBuiltinBridges(pt) {
+ // Shuffle so that Tor Browser users do not all try the built-in bridges in
+ // the same order.
+ return arrayShuffle(this.#builtinBridges[pt] ?? []);
+ }
- /* load or init our settings, and register observers */
+ /**
+ * Load or init our settings, and register observers.
+ */
async init() {
- this._addProperties("quickstart", {
- enabled: {},
- });
- this._addProperties("bridges", {
- enabled: {},
- source: {
- transform: val => {
- if (Object.values(TorBridgeSource).includes(val)) {
- return val;
- }
- lazy.logger.error(`Not a valid bridge source: "${val}"`);
- return TorBridgeSource.Invalid;
- },
- },
- bridge_strings: {
- transform: val => {
- if (Array.isArray(val)) {
- return [...val];
- }
- return parseBridgeStrings(val);
- },
- copy: val => [...val],
- equal: (val1, val2) => this._arrayEqual(val1, val2),
- },
- builtin_type: {
- callback: val => {
- if (!val) {
- // Make sure that the source is not BuiltIn
- if (this.bridges.source === TorBridgeSource.BuiltIn) {
- this.bridges.source = TorBridgeSource.Invalid;
- }
- return;
- }
- const bridgeStrings = getBuiltinBridgeStrings(val);
- if (bridgeStrings.length) {
- this.bridges.bridge_strings = bridgeStrings;
- return;
- }
- lazy.logger.error(`No built-in ${val} bridges found`);
- // Change to be empty, this will trigger this callback again,
- // but with val as "".
- this.bridges.builtin_type == "";
- },
- },
- });
- this._addProperties("proxy", {
- enabled: {
- callback: val => {
- if (val) {
- return;
- }
- // Reset proxy settings.
- this.proxy.type = TorProxyType.Invalid;
- this.proxy.address = "";
- this.proxy.port = 0;
- this.proxy.username = "";
- this.proxy.password = "";
- },
- },
- type: {
- transform: val => {
- if (Object.values(TorProxyType).includes(val)) {
- return val;
- }
- lazy.logger.error(`Not a valid proxy type: "${val}"`);
- return TorProxyType.Invalid;
- },
- },
- address: {},
- port: {
- transform: val => {
- if (val === 0) {
- // This is a valid value that "unsets" the port.
- // Keep this value without giving a warning.
- // NOTE: In contrast, "0" is not valid.
- return 0;
- }
- // Unset to 0 if invalid null is returned.
- return this._parsePort(val, false) ?? 0;
- },
- },
- username: {},
- password: {},
- uri: {
- getter: () => {
- const { type, address, port, username, password } = this.proxy;
- switch (type) {
- case TorProxyType.Socks4:
- return `socks4a://${address}:${port}`;
- case TorProxyType.Socks5:
- if (username) {
- return `socks5://${username}:${password}@${address}:${port}`;
- }
- return `socks5://${address}:${port}`;
- case TorProxyType.HTTPS:
- if (username) {
- return `http://${username}:${password}@${address}:${port}`;
- }
- return `http://${address}:${port}`;
- }
- return null;
- },
- },
- });
- this._addProperties("firewall", {
- enabled: {
- callback: val => {
- if (!val) {
- this.firewall.allowed_ports = "";
- }
- },
- },
- allowed_ports: {
- transform: val => {
- if (!Array.isArray(val)) {
- val = val === "" ? [] : val.split(",");
- }
- // parse and remove duplicates
- const portSet = new Set(val.map(p => this._parsePort(p, true)));
- // parsePort returns null for failed parses, so remove it.
- portSet.delete(null);
- return [...portSet];
- },
- copy: val => [...val],
- equal: (val1, val2) => this._arrayEqual(val1, val2),
- },
- });
+ if (this.#initialized) {
+ lazy.logger.warn("Called init twice.");
+ return;
+ }
+ try {
+ await this.#initInternal();
+ this.#initialized = true;
+ this.#initComplete();
+ } catch (e) {
+ this.#initFailed(e);
+ throw e;
+ }
+ }
+
+ /**
+ * The actual implementation of the initialization, which is wrapped to make
+ * it easier to update initializatedPromise.
+ */
+ async #initInternal() {
+ try {
+ const req = await fetch("chrome://global/content/pt_config.json");
+ const config = await req.json();
+ lazy.logger.debug("Loaded pt_config.json", config);
+ this.#recommendedPT = config.recommendedDefault;
+ this.#builtinBridges = config.bridges;
+ } catch (e) {
+ lazy.logger.error("Could not load the built-in PT config.", e);
+ }
// TODO: We could use a shared promise, and wait for it to be fullfilled
// instead of Service.obs.
@@ -557,16 +590,18 @@ export const TorSettings = {
// Do not want notifications for initially loaded prefs.
this.freezeNotifications();
try {
- this.loadFromPrefs();
+ this.#allowUninitialized = true;
+ this.#loadFromPrefs();
} finally {
- this._notificationQueue.clear();
+ this.#allowUninitialized = false;
+ this.#notificationQueue.clear();
this.thawNotifications();
}
}
try {
const provider = await lazy.TorProviderBuilder.build();
if (provider.isRunning) {
- this.handleProcessReady();
+ this.#handleProcessReady();
// No need to add an observer to call this again.
return;
}
@@ -574,9 +609,33 @@ export const TorSettings = {
Services.obs.addObserver(this, lazy.TorProviderTopics.ProcessIsReady);
}
- },
+ }
+
+ /**
+ * Check whether the object has been successfully initialized, and throw if
+ * it has not.
+ */
+ #checkIfInitialized() {
+ if (!this.#initialized) {
+ lazy.logger.trace("Not initialized code path.");
+ throw new Error(
+ "TorSettings has not been initialized yet, or its initialization failed"
+ );
+ }
+ }
+
+ /**
+ * Tell whether TorSettings has been successfully initialized.
+ *
+ * @returns {boolean}
+ */
+ get initialized() {
+ return this.#initialized;
+ }
- /* wait for relevant life-cycle events to apply saved settings */
+ /**
+ * Wait for relevant life-cycle events to apply saved settings.
+ */
async observe(subject, topic, data) {
lazy.logger.debug(`Observed ${topic}`);
@@ -586,21 +645,26 @@ export const TorSettings = {
this,
lazy.TorProviderTopics.ProcessIsReady
);
- await this.handleProcessReady();
+ await this.#handleProcessReady();
break;
}
- },
+ }
- // once the tor daemon is ready, we need to apply our settings
- async handleProcessReady() {
+ /**
+ * Apply the settings once the tor provider is ready and notify any observer
+ * that the settings can be used.
+ */
+ async #handleProcessReady() {
// push down settings to tor
- await this.applySettings();
+ await this.#applySettings(true);
lazy.logger.info("Ready");
Services.obs.notifyObservers(null, TorSettingsTopics.Ready);
- },
+ }
- // load our settings from prefs
- loadFromPrefs() {
+ /**
+ * Load our settings from prefs.
+ */
+ #loadFromPrefs() {
lazy.logger.debug("loadFromPrefs()");
/* Quickstart */
@@ -671,12 +735,16 @@ export const TorSettings = {
""
);
}
- },
+ }
- // save our settings to prefs
+ /**
+ * Save our settings to prefs.
+ */
saveToPrefs() {
lazy.logger.debug("saveToPrefs()");
+ this.#checkIfInitialized();
+
/* Quickstart */
Services.prefs.setBoolPref(
TorSettingsPrefs.quickstart.enabled,
@@ -758,77 +826,100 @@ export const TorSettings = {
Services.prefs.setBoolPref(TorSettingsPrefs.enabled, true);
return this;
- },
+ }
- // push our settings down to the tor daemon
+ /**
+ * Push our settings down to the tor provider.
+ */
async applySettings() {
- lazy.logger.debug("applySettings()");
+ this.#checkIfInitialized();
+ return this.#applySettings(false);
+ }
+
+ /**
+ * Internal implementation of applySettings that does not check if we are
+ * initialized.
+ */
+ async #applySettings(allowUninitialized) {
+ lazy.logger.debug("#applySettings()");
+
const settingsMap = new Map();
- /* Bridges */
- const haveBridges =
- this.bridges.enabled && !!this.bridges.bridge_strings.length;
- settingsMap.set(TorConfigKeys.useBridges, haveBridges);
- if (haveBridges) {
- settingsMap.set(TorConfigKeys.bridgeList, this.bridges.bridge_strings);
- } else {
- settingsMap.set(TorConfigKeys.bridgeList, null);
- }
+ // #applySettings can be called only when #allowUninitialized is false
+ this.#allowUninitialized = allowUninitialized;
- /* Proxy */
- settingsMap.set(TorConfigKeys.socks4Proxy, null);
- settingsMap.set(TorConfigKeys.socks5Proxy, null);
- settingsMap.set(TorConfigKeys.socks5ProxyUsername, null);
- settingsMap.set(TorConfigKeys.socks5ProxyPassword, null);
- settingsMap.set(TorConfigKeys.httpsProxy, null);
- settingsMap.set(TorConfigKeys.httpsProxyAuthenticator, null);
- if (this.proxy.enabled) {
- const address = this.proxy.address;
- const port = this.proxy.port;
- const username = this.proxy.username;
- const password = this.proxy.password;
-
- switch (this.proxy.type) {
- case TorProxyType.Socks4:
- settingsMap.set(TorConfigKeys.socks4Proxy, `${address}:${port}`);
- break;
- case TorProxyType.Socks5:
- settingsMap.set(TorConfigKeys.socks5Proxy, `${address}:${port}`);
- settingsMap.set(TorConfigKeys.socks5ProxyUsername, username);
- settingsMap.set(TorConfigKeys.socks5ProxyPassword, password);
- break;
- case TorProxyType.HTTPS:
- settingsMap.set(TorConfigKeys.httpsProxy, `${address}:${port}`);
- settingsMap.set(
- TorConfigKeys.httpsProxyAuthenticator,
- `${username}:${password}`
- );
- break;
+ try {
+ /* Bridges */
+ const haveBridges =
+ this.bridges.enabled && !!this.bridges.bridge_strings.length;
+ settingsMap.set(TorConfigKeys.useBridges, haveBridges);
+ if (haveBridges) {
+ settingsMap.set(TorConfigKeys.bridgeList, this.bridges.bridge_strings);
+ } else {
+ settingsMap.set(TorConfigKeys.bridgeList, null);
}
- }
- /* Firewall */
- if (this.firewall.enabled) {
- const reachableAddresses = this.firewall.allowed_ports
- .map(port => `*:${port}`)
- .join(",");
- settingsMap.set(TorConfigKeys.reachableAddresses, reachableAddresses);
- } else {
- settingsMap.set(TorConfigKeys.reachableAddresses, null);
+ /* Proxy */
+ settingsMap.set(TorConfigKeys.socks4Proxy, null);
+ settingsMap.set(TorConfigKeys.socks5Proxy, null);
+ settingsMap.set(TorConfigKeys.socks5ProxyUsername, null);
+ settingsMap.set(TorConfigKeys.socks5ProxyPassword, null);
+ settingsMap.set(TorConfigKeys.httpsProxy, null);
+ settingsMap.set(TorConfigKeys.httpsProxyAuthenticator, null);
+ if (this.proxy.enabled) {
+ const address = this.proxy.address;
+ const port = this.proxy.port;
+ const username = this.proxy.username;
+ const password = this.proxy.password;
+
+ switch (this.proxy.type) {
+ case TorProxyType.Socks4:
+ settingsMap.set(TorConfigKeys.socks4Proxy, `${address}:${port}`);
+ break;
+ case TorProxyType.Socks5:
+ settingsMap.set(TorConfigKeys.socks5Proxy, `${address}:${port}`);
+ settingsMap.set(TorConfigKeys.socks5ProxyUsername, username);
+ settingsMap.set(TorConfigKeys.socks5ProxyPassword, password);
+ break;
+ case TorProxyType.HTTPS:
+ settingsMap.set(TorConfigKeys.httpsProxy, `${address}:${port}`);
+ settingsMap.set(
+ TorConfigKeys.httpsProxyAuthenticator,
+ `${username}:${password}`
+ );
+ break;
+ }
+ }
+
+ /* Firewall */
+ if (this.firewall.enabled) {
+ const reachableAddresses = this.firewall.allowed_ports
+ .map(port => `*:${port}`)
+ .join(",");
+ settingsMap.set(TorConfigKeys.reachableAddresses, reachableAddresses);
+ } else {
+ settingsMap.set(TorConfigKeys.reachableAddresses, null);
+ }
+ } finally {
+ this.#allowUninitialized = false;
}
/* Push to Tor */
const provider = await lazy.TorProviderBuilder.build();
await provider.writeSettings(settingsMap);
+ }
- return this;
- },
-
- // set all of our settings at once from a settings object
+ /**
+ * Set all of our settings at once from a settings object.
+ *
+ * @param {object} settings The settings object to set
+ */
setSettings(settings) {
lazy.logger.debug("setSettings()");
+ this.#checkIfInitialized();
+
const backup = this.getSettings();
- const backup_notifications = [...this._notificationQueue];
+ const backupNotifications = [...this.#notificationQueue];
// Hold off on lots of notifications until all settings are changed.
this.freezeNotifications();
@@ -869,10 +960,10 @@ export const TorSettings = {
// some other call to TorSettings to change anything whilst we are
// in this context (other than lower down in this call stack), so it is
// safe to discard all changes to settings and notifications.
- this._settings = backup;
- this._notificationQueue.clear();
- for (const notification of backup_notifications) {
- this._notificationQueue.add(notification);
+ this.#settings = backup;
+ this.#notificationQueue.clear();
+ for (const notification of backupNotifications) {
+ this.#notificationQueue.add(notification);
}
lazy.logger.error("setSettings failed", ex);
@@ -880,12 +971,36 @@ export const TorSettings = {
this.thawNotifications();
}
- lazy.logger.debug("setSettings result", this._settings);
- },
+ lazy.logger.debug("setSettings result", this.#settings);
+ }
- // get a copy of all our settings
+ /**
+ * Get a copy of all our settings.
+ *
+ * @returns {object} A copy of the settings object
+ */
getSettings() {
lazy.logger.debug("getSettings()");
- return structuredClone(this._settings);
- },
-};
+ this.#checkIfInitialized();
+ return structuredClone(this.#settings);
+ }
+
+ /**
+ * Return an array with the pluggable transports for which we have at least a
+ * built-in bridge line.
+ *
+ * @returns {string[]} An array with PT identifiers
+ */
+ get builtinBridgeTypes() {
+ this.#checkIfInitialized();
+ const types = Object.keys(this.#builtinBridges);
+ const recommendedIndex = types.indexOf(this.#recommendedPT);
+ if (recommendedIndex > 0) {
+ types.splice(recommendedIndex, 1);
+ types.unshift(this.#recommendedPT);
+ }
+ return types;
+ }
+}
+
+export const TorSettings = new TorSettingsImpl();
=====================================
tools/torbrowser/bridges.js deleted
=====================================
@@ -1,62 +0,0 @@
-pref("extensions.torlauncher.default_bridge_recommended_type", "obfs4");
-
-// Default bridges.
-pref(
- "extensions.torlauncher.default_bridge.obfs4.1",
- "obfs4 192.95.36.142:443 CDF2E852BF539B82BD10E27E9115A31734E378C2 cert=qUVQ0srL1JI/vO6V6m/24anYXiJD3QP2HgzUKQtQ7GRqqUvs7P+tG43RtAqdhLOALP7DJQ iat-mode=1"
-);
-pref(
- "extensions.torlauncher.default_bridge.obfs4.2",
- "obfs4 37.218.245.14:38224 D9A82D2F9C2F65A18407B1D2B764F130847F8B5D cert=bjRaMrr1BRiAW8IE9U5z27fQaYgOhX1UCmOpg2pFpoMvo6ZgQMzLsaTzzQNTlm7hNcb+Sg iat-mode=0"
-);
-pref(
- "extensions.torlauncher.default_bridge.obfs4.3",
- "obfs4 85.31.186.98:443 011F2599C0E9B27EE74B353155E244813763C3E5 cert=ayq0XzCwhpdysn5o0EyDUbmSOx3X/oTEbzDMvczHOdBJKlvIdHHLJGkZARtT4dcBFArPPg iat-mode=0"
-);
-pref(
- "extensions.torlauncher.default_bridge.obfs4.4",
- "obfs4 85.31.186.26:443 91A6354697E6B02A386312F68D82CF86824D3606 cert=PBwr+S8JTVZo6MPdHnkTwXJPILWADLqfMGoVvhZClMq/Urndyd42BwX9YFJHZnBB3H0XCw iat-mode=0"
-);
-pref(
- "extensions.torlauncher.default_bridge.obfs4.5",
- "obfs4 193.11.166.194:27015 2D82C2E354D531A68469ADF7F878FA6060C6BACA cert=4TLQPJrTSaDffMK7Nbao6LC7G9OW/NHkUwIdjLSS3KYf0Nv4/nQiiI8dY2TcsQx01NniOg iat-mode=0"
-);
-pref(
- "extensions.torlauncher.default_bridge.obfs4.6",
- "obfs4 193.11.166.194:27020 86AC7B8D430DAC4117E9F42C9EAED18133863AAF cert=0LDeJH4JzMDtkJJrFphJCiPqKx7loozKN7VNfuukMGfHO0Z8OGdzHVkhVAOfo1mUdv9cMg iat-mode=0"
-);
-pref(
- "extensions.torlauncher.default_bridge.obfs4.7",
- "obfs4 193.11.166.194:27025 1AE2C08904527FEA90C4C4F8C1083EA59FBC6FAF cert=ItvYZzW5tn6v3G4UnQa6Qz04Npro6e81AP70YujmK/KXwDFPTs3aHXcHp4n8Vt6w/bv8cA iat-mode=0"
-);
-pref(
- "extensions.torlauncher.default_bridge.obfs4.8",
- "obfs4 209.148.46.65:443 74FAD13168806246602538555B5521A0383A1875 cert=ssH+9rP8dG2NLDN2XuFw63hIO/9MNNinLmxQDpVa+7kTOa9/m+tGWT1SmSYpQ9uTBGa6Hw iat-mode=0"
-);
-pref(
- "extensions.torlauncher.default_bridge.obfs4.9",
- "obfs4 146.57.248.225:22 10A6CD36A537FCE513A322361547444B393989F0 cert=K1gDtDAIcUfeLqbstggjIw2rtgIKqdIhUlHp82XRqNSq/mtAjp1BIC9vHKJ2FAEpGssTPw iat-mode=0"
-);
-pref(
- "extensions.torlauncher.default_bridge.obfs4.10",
- "obfs4 45.145.95.6:27015 C5B7CD6946FF10C5B3E89691A7D3F2C122D2117C cert=TD7PbUO0/0k6xYHMPW3vJxICfkMZNdkRrb63Zhl5j9dW3iRGiCx0A7mPhe5T2EDzQ35+Zw iat-mode=0"
-);
-pref(
- "extensions.torlauncher.default_bridge.obfs4.11",
- "obfs4 51.222.13.177:80 5EDAC3B810E12B01F6FD8050D2FD3E277B289A08 cert=2uplIpLQ0q9+0qMFrK5pkaYRDOe460LL9WHBvatgkuRr/SL31wBOEupaMMJ6koRE6Ld0ew iat-mode=0"
-);
-
-pref(
- "extensions.torlauncher.default_bridge.meek-azure.1",
- "meek_lite 192.0.2.18:80 BE776A53492E1E044A26F17306E1BC46A55A1625 url=https://meek.azureedge.net/ front=ajax.aspnetcdn.com"
-);
-
-pref(
- "extensions.torlauncher.default_bridge.snowflake.1",
- "snowflake 192.0.2.3:80 2B280B23E1107BB62ABFC40DDCC8824814F80A72 fingerprint=2B280B23E1107BB62ABFC40DDCC8824814F80A72 url=https://snowflake-broker.torproject.net.global.prod.fastly.net/ front=cdn.sstatic.net ice=stun:stun.l.google.com:19302,stun:stun.antisip.com:3478,stun:stun.bluesip.net:3478,stun:stun.dus.net:3478,stun:stun.epygi.com:3478,stun:stun.sonetel.com:3478,stun:stun.uls.co.za:3478,stun:stun.voipgate.com:3478,stun:stun.voys.nl:3478 utls-imitate=hellorandomizedalpn"
-);
-
-pref(
- "extensions.torlauncher.default_bridge.snowflake.2",
- "snowflake 192.0.2.4:80 8838024498816A039FCBBAB14E6F40A0843051FA fingerprint=8838024498816A039FCBBAB14E6F40A0843051FA url=https://snowflake-broker.torproject.net.global.prod.fastly.net/ front=cdn.sstatic.net ice=stun:stun.l.google.com:19302,stun:stun.antisip.com:3478,stun:stun.bluesip.net:3478,stun:stun.dus.net:3478,stun:stun.epygi.com:3478,stun:stun.sonetel.net:3478,stun:stun.uls.co.za:3478,stun:stun.voipgate.com:3478,stun:stun.voys.nl:3478 utls-imitate=hellorandomizedalpn"
-);
=====================================
tools/torbrowser/deploy.sh
=====================================
@@ -6,17 +6,10 @@ BUILD_OUTPUT="$2"
SCRIPT_DIR="$(realpath "$(dirname "$0")")"
RESDIR="$BUILD_OUTPUT/dist/firefox"
-if [ "$(uname)" = "Darwin" ]; then
+if [ "$(uname)" = "Darwin" ]; then
RESDIR="$RESDIR/Tor Browser.app/Contents/Resources"
fi
-# Add built-in bridges
-mkdir -p "$BUILD_OUTPUT/_omni/defaults/preferences"
-cat "$BUILD_OUTPUT/dist/bin/browser/defaults/preferences/000-tor-browser.js" "$SCRIPT_DIR/bridges.js" >> "$BUILD_OUTPUT/_omni/defaults/preferences/000-tor-browser.js"
-cd "$BUILD_OUTPUT/_omni"
-zip -Xmr "$RESDIR/browser/omni.ja" "defaults/preferences/000-tor-browser.js"
-rm -rf "$BUILD_OUTPUT/_omni"
-
# Repackage the manual
# rm -rf $BUILD_OUTPUT/_omni
# mkdir $BUILD_OUTPUT/_omni
@@ -34,12 +27,12 @@ if [ "$(uname)" = "Darwin" ]; then
cd "$BINARIES/Tor Browser.app/Contents/MacOS"
"$SCRIPT_DIR/browser-self-sign-macos.sh"
- else
+else
# backup the startup script
mv "$BINARIES/dev/Browser/firefox" "$BINARIES/dev/Browser/firefox.bak"
-
- # copy binaries
+
+ # copy binaries
cp -r "$RESDIR/"* "$BINARIES/dev/Browser"
rm -rf "$BINARIES/dev/Browser/TorBrowser/Data/Browser/profile.default/startupCache"
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/0d07d3…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/0d07d3…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/torbrowser-launcher][main] Update share/torbrowser-launcher/tor-browser-developers.asc (#10)
by boklm (@boklm) 08 Jan '24
by boklm (@boklm) 08 Jan '24
08 Jan '24
boklm pushed to branch main at The Tor Project / Applications / torbrowser-launcher
Commits:
9140e6a4 by Nicolas Vigier at 2024-01-08T13:54:51+01:00
Update share/torbrowser-launcher/tor-browser-developers.asc (#10)
Update Tor Browser gpg key, with new expiration date on the current
subkey.
- - - - -
1 changed file:
- share/torbrowser-launcher/tor-browser-developers.asc
Changes:
=====================================
share/torbrowser-launcher/tor-browser-developers.asc
=====================================
@@ -70,40 +70,40 @@ df1B0nicivxYAGb0Nc8ICl89WMfKp+/LMzD08Alzz26Mfmglv6zJx2J0b8puMEtT
iM4ESrDVrMxewibZ4cI9e1g86WXGPlIZ0ApicFlr69bTIPzIYNmYwWqab2tqm0MQ
VRpNDWMIkWJ/r3TTmNN+Fqv827Fo7qR8zjPVi8DyoKmFzfgya2ZoE7od5bGg7lcM
7UhzEPfwZUMqKaawlrnzqy1sGLJi0QZErUhHo3tU9sHYqAtUENvs4LC7dEG5Ag0E
-WwnQdAEQAK8MRUxjsvvZFGt3dScnI20cvlL4LM3ReesedqrFEOcZP8q5kVxiu3n1
-zT64BXRza2EiYPttymbh56ynLk/SxxcM1qdGhn1qwdCEav//TYJK4eE0ZRPbdOL6
-YY9hkfBPZUONBD+YYnohsOUnAYRNaRsSjlAwsaoDauJMSOGl7Fam0E2GDvzAYeCE
-jE9SYFwW1jGGmvEKjAV9zqjeMwH0A7NWYuTo9VXmCyxRPPhAKw/3XsMuJ1WOnL9r
-Pz4yo2ZQlyLf342IFKpvQLw+H3NqRYpJa8P5bi1cKYGHP97UZFHLOu5rzvoyFmTU
-82H0oc2BQDIacZzwmVVwyM0wOg4evdRXmv/2KvtuwxosF58kXZTtCQ7miWRWUPGM
-X4PR71I70KBBDcLWZMptmW8Ey+oE7DjOUMv77sGeBZdF/pBW0Oy4qgNF/tX//Nko
-I2dKBBuEQMikQLgfuEoGF/5zueWJdLjEDESeZB9nXgWEaADwiH+nzcuUYivCYR2y
-szRpRTv2GwcUoYbT1Cb8L3Qy77xq21BiOxs5OWylfUS0yLZN9XOP/qwa5MDPmpS1
-kAw3IcBf9MA825PFxXQY/mv9rvd5gmip+vfwBT8F3ZvXzQHAWBF0bXTONmp/Cxuj
-jE1PkJBQ+mOg5x/wyYEVw+HkfZgSIwfVFFJ+MXkKYeXXVHg5+lubABEBAAGJBHIE
-GAEKACYCGwIWIQTvbiht2oXqKkun3mhOLG6HkymCkAUCYL9srAUJBsp3OAJACRBO
-LG6HkymCkMF0IAQZAQoAHRYhBBEHdbXRAfs2vGyRG+t3RJHZ/wbiBQJbCdB0AAoJ
-EOt3RJHZ/wbi170P/0Rvg0uBdrHsnKOjfqwPZ6k4I1Wwx2tpkrsb4wKVVxoRTZFO
-iF1DE33gZ1Dkf1jczfwdpBZQbC70gkaLz2WpbbBRtg6RIZQO53psM+wmYRO1C4P+
-ByMJ9bf8V28pzKTsBV3jU3ACp2uNWft7wIzUq/6AHHf6RgVvikglC+RcUxLbOHdX
-zLpgM8ItzotD3UBq+g67um3VG1HC3/1RaA+tqvrg/uehEjhiC753XYgz2VkHlRVV
-oM74KoXC3HKxChwArpT5lAfqwUwvcvvOiPL4ZsBivl452tQOPfef9XBgV7LSQnS1
-Wy8x0L+ncClP8OiEdC3DpZSgZKeFJ1V+xsis9V0Bzs/Pv4VH+s7spvm1Al7BwkNX
-Qkxn2csaws1lIuS7cfB6sbdkNNGxAeQSOfCLOCWJU01niy/NVRQiEEjbhCSMHwj1
-AEf6B+sGghmj5BEfCdfB27o4eCrv/xQCJri7g0FlYFypnaxc/lHojNQZZCAHA3Av
-/RCcbEoBQ1JBdR2f9oUQ86ZJtHVbUKU4k39jSA/b8eqSQQB6y/2dkNdW2VnXiM/A
-i8aj1FJQTX4K+j5pCGy/+AR241qfeImr3JtMav2SrkfuD72dUPbKowFeKq3M0p39
-12peoH82PVnLgsD7uhRTYbhLUOefYG8JvoovnhQH6X9RvMEQ3aZyvRfgkNyR8MoP
-/ifP1xddz4quT5XNyrg8z1rwVVDogGigFm2IumnGh/UFNB/dL0JlXV4tmYNeLaKy
-/7YSmNMP1MnMWR+FbY8VWFreFZqWMcsk4AaN+fQXzMFJjZ9hbSyBSOpL1TZ20nnI
-w0Ant8cuH2LSFPJnlE+KZfzneN6n1o9Wo0lvFwswPxYpHJOkrDyDMeLrkDf6/Kfj
-Kq5QujlVJpfOOYgINXUDnvOTotHbOpqRULU6elaKGJbdRByB2cN0lbPJjcOx6GXs
-UNqAGO0VcS7CVn6KByxI0MFPbwmK8sZ/MUiJZnnUuB9x3X+Rf2UPRdOyIl3/jc/s
-8AAQcvWm7fuxcCOgqK6BPP4S7tpiuYaeI44MhW2H6ndwO49KI7jaoIf0Vk2c2OCy
-MsGf5G3djcDnZ70hEEQdr+2h2yaOPkr5j3oAxugA3pRG0rnX7SPol3xnsahkbexW
-VltWIA/ZR6RoZpYDT2nAh4vfTzDGCe7SeNMzhuZhvPvJS62XLQcz4zCBbz9LZgtq
-nRxpaYjCyY7RQXngVHzy98ImiNmdgfxw1FD+qW2FyC5cN2fgLU8X8hpql9/P68eu
-AIA7U6w7fVji3F3Uul0FuqERX6p9ZObfot2LsFZIUoYqUemNt2gqHuzKKZyIjt6Q
-3dAx5AUwZE27KZWfpfNbww/HaNtTPqD6ULtvRdQiXheV
-=GYln
+YUSBvAEQALxuQqEliMOMGpoVXWK7uIPHXmV8U/kUuAtda3Mfo7vySXUgqv3Cgia+
+pszIXa5BYx3GCCx2W+H+EYzyB80Nw/Qz2kAX03+wJ/gaioQfRkNEcZi8cvWS08px
+TVpKkaPMRuhSk0eCXAXmikDOUvzxqeB7U/IPBdsZJJoQk5vfOJX1vA0ZvdHwW+uZ
+C69rJctAqZ+qaEtOO94i9o+MfUq+ovHPflYM5o27w8oC9LKmTJVa6vMg88dLRkJp
+nXHe0Xr8Xq6seJZIfixu1RvFA5OLvxJvEySKwI2HJ+Fn56AnPZKb64YA67PLe/j+
+201w+svGh71FFbjxyrxOTGDdeZ9AMHJ6IRvdhtgvh6ZxceWHKSqDxkZo5BgfKmkK
+Y9V+PNmpa/h7jEA+531L67j1o0B1dgmnvHobiixTiTMI7tPTAs9fsXg2RWs+L+nP
+VHQLTHqOMRRsD0sv/W2cCrydNN3w7e1Fbv1Ka55AAu1uslO+XJehkbqb5GojaAGM
+4DowintgyfEYP4BKl299lD5/w4e1NsO8o7xkU9oswzNT57jocla0P3jFVSdvg75+
+H9qUnp52k0BZO4ynQLreaUpUxax4H9L38iE5ClgX5vJ+4fCEyqyIhAVEhFGpjDJ+
+TG1EB2ljE7PjCKUg+OK+Xf42F5BrZmji1fpAsKiOhSwHs7lj8gcVABEBAAGJBHIE
+GAEKACYCGwIWIQTvbiht2oXqKkun3mhOLG6HkymCkAUCZZmnzAUJBYRfEAJACRBO
+LG6HkymCkMF0IAQZAQoAHRYhBGExiPxb4hduPtVJAeU9mJqeLUe/BQJhRIG8AAoJ
+EOU9mJqeLUe/vKEP/2+AD/ZAqQQRSGbvkh0TIMjLkBpS5lyVA1rHtTOzhAmtCnoi
+0x0Dd6w8d81yjNuvfGhijdxPOjUicA+9tEWHKb3AszV8JL72vC2OJl3Qod+C9N55
+907r+EL41A4Ew7bLYz5DifQBoVt/qzTjUIZdpNbz/oDHr75R3bm8QwKSVrj0mia/
+l1rCCLBVAFAaF59VIS/KjyRo5wPqUaUkxU5A1MH/FXcRXaukO4ontNqaZpV+P1c9
++duQnAI1dXEDpIgCya+4kJDazBKLn3HtPYf758qNj0qAMl+Z3zeGPmdFx5dIV5IQ
+wxjQopnjHg6rBTLqGGQvD9OLpCXsCrahEF0BXrVRHVBL5yJih+XO12eIoMX/PnDT
+Sd3SodO0W3Pfp6MHMx6QSox8r5OJdi+WrrSwZBBg3UQL82+SBdJMDhxFutyGQ6rj
+Wt1EdOOfOLlH97dl2z4jCmstXAc7pPC7XNOFz3zZbJmjBV++Ax9T0Bh5zLfvvzHx
+s0j05wlQTiVJZBlGLAecMosdWzf1J6xqaQY2fOn/psF110iWLQMhrsiIXcjeUrFa
+g17DCVuB5v6lHxYpcy9KnYQQs7AHrSQHbd22Tw7I+bwdtsKNVLgrg+qGxitbW/kc
+/tM17NAHcVrXohP/NUx3QbJ6Ild14EjuFSWlU1Z9TU7PmIzP8TPyiruxv8IqpB0Q
+AIFc7W4zMoYaonNZ10tVLhyjwOUAlDwf2B0Iwy15ctr07Kn6bMeMZULFpXhExCw7
+2mtnAK4jHRphR5m7t7mSYxMwSP5HAffFZpkx8YQHYq2ZSe+yIxXeRwraMdO7POJg
+tPt730xoBB7Cra2t1yQj9KuIewuy1qZhjn+upabH4x6OVox1gZcoj+cxZ5mSV+9C
+Hkypgl9VQZWAjG36Y8rJ//3KFAizJLwGP3XAtUx9cId75mWCz8SJwroadoVrk1dR
+IQ2HPZEjmbhWKXR5InJNg0BgHh3qT1bW1tu8xKHqauukrzgAmDcBjOT50lpuGBzW
+9hU/MuyaqpPLwWH5NFkpgBwvIGwQbW4aq59M4HZhYeTas0YqQL6ju70c6w0ZmCis
+0mn4IaPJCO55HTZvtXxEp4iyyepDoSFbAeOnActKWrOueNlsDshGzfqCbFgCsj+f
+vNetkQSX4CBM4r96RydMaSGm1FX+bAu5RoyxIAxIrotHbGY0x1speXawuJx1H9RH
+vVoQA/PdUZ+06g8vAjBSxKb+gSEhC6iWJ9shPcGg4FV+E7GTD0x1b61jsiM1FX/T
+pIFuTj268C5hCVECxJ8ctClfBdS0if2IDFtJ90NjXijAB6/bPj316h6TKlBBfjjs
+5L6tvQRifoG5c3gJ2H++8Gk7ue5jyE9BwJfsySOgBMDQ
+=pesg
-----END PGP PUBLIC KEY BLOCK-----
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/commit…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/commit…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/torbrowser-launcher][main] Update self.min_version to 13.0 (#9)
by boklm (@boklm) 08 Jan '24
by boklm (@boklm) 08 Jan '24
08 Jan '24
boklm pushed to branch main at The Tor Project / Applications / torbrowser-launcher
Commits:
7b9b5b9c by Nicolas Vigier at 2024-01-08T13:53:33+01:00
Update self.min_version to 13.0 (#9)
- - - - -
1 changed file:
- torbrowser_launcher/launcher.py
Changes:
=====================================
torbrowser_launcher/launcher.py
=====================================
@@ -72,7 +72,7 @@ class Launcher(QtWidgets.QMainWindow):
self.force_redownload = False
# This is the current version of Tor Browser, which should get updated with every release
- self.min_version = "12.0"
+ self.min_version = "13.0"
# Init launcher
self.set_state(None, "", [])
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/commit…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/commit…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/torbrowser-launcher][main] Set the TORBROWSER_LAUNCHER environment variable (#8)
by boklm (@boklm) 08 Jan '24
by boklm (@boklm) 08 Jan '24
08 Jan '24
boklm pushed to branch main at The Tor Project / Applications / torbrowser-launcher
Commits:
f4d2e314 by Nicolas Vigier at 2024-01-08T11:32:06+01:00
Set the TORBROWSER_LAUNCHER environment variable (#8)
Set an environment variable to make it easier for Tor Browser to see
that torbrowser-launcher is being used.
- - - - -
1 changed file:
- torbrowser_launcher/__init__.py
Changes:
=====================================
torbrowser_launcher/__init__.py
=====================================
@@ -64,6 +64,10 @@ def main():
settings = bool(args.settings)
url_list = args.url
+ # Set the TORBROWSER_LAUNCHER env variable to make it easier to
+ # detect that torbrowser-launcher is being used
+ os.environ["TORBROWSER_LAUNCHER"] = "1"
+
# Load the version and print the banner
with open(os.path.join(SHARE, "version")) as buf:
tor_browser_launcher_version = buf.read().strip()
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/commit…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/commit…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Modify add-on support
by ma1 (@ma1) 02 Jan '24
by ma1 (@ma1) 02 Jan '24
02 Jan '24
ma1 pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android
Commits:
be02ec86 by hackademix at 2023-12-30T19:51:11+01:00
fixup! Modify add-on support
Bug 42353: Fix NoScript automatic updates.
- - - - -
1 changed file:
- fenix/app/src/main/java/org/mozilla/fenix/components/TorBrowserFeatures.kt
Changes:
=====================================
fenix/app/src/main/java/org/mozilla/fenix/components/TorBrowserFeatures.kt
=====================================
@@ -136,37 +136,37 @@ object TorBrowserFeatures {
}
/**
- * If we have not done it yet, enable automatic updates for NoScript and force a
+ * Enable automatic updates for NoScript and, if we've not done it yet, force a
* one-time immediate update check, in order to upgrade old profiles and ensure we've got
* the latest stable AMO version available on first startup.
* We will do it as soon as the Tor is connected, to prevent early addonUpdater activation
* causing automatic update checks failures (components.addonUpdater being a lazy prop).
* The extension, from then on, should behave as if the user had installed it manually.
*/
- if (settings.noscriptUpdated == 0) {
- context.components.torController.registerTorListener(object : TorEvents {
- override fun onTorConnected() {
- context.components.torController.unregisterTorListener(this)
- // Enable automatic updates
- context.components.addonUpdater.registerForFutureUpdates(NOSCRIPT_ID)
- // Force an immediate update check
+ context.components.torController.registerTorListener(object : TorEvents {
+ override fun onTorConnected() {
+ context.components.torController.unregisterTorListener(this)
+ // Enable automatic updates. This must be done on every startup (tor-browser#42353)
+ context.components.addonUpdater.registerForFutureUpdates(NOSCRIPT_ID)
+ // Force a one-time immediate update check for older installations
+ if (settings.noscriptUpdated < 2) {
context.components.addonUpdater.update(NOSCRIPT_ID)
- settings.noscriptUpdated = 1
+ settings.noscriptUpdated = 2
}
+ }
- @SuppressWarnings("EmptyFunctionBlock")
- override fun onTorConnecting() {
- }
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorConnecting() {
+ }
- @SuppressWarnings("EmptyFunctionBlock")
- override fun onTorStopped() {
- }
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorStopped() {
+ }
- @SuppressWarnings("EmptyFunctionBlock")
- override fun onTorStatusUpdate(entry: String?, status: String?) {
- }
- })
- }
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorStatusUpdate(entry: String?, status: String?) {
+ }
+ })
}
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/be0…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/be0…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-update-responses][main] alpha: new version, 13.5a3
by richard (@richard) 22 Dec '23
by richard (@richard) 22 Dec '23
22 Dec '23
richard pushed to branch main at The Tor Project / Applications / Tor Browser update responses
Commits:
8a1b3fbe by Richard Pospesel at 2023-12-22T14:00:26+00:00
alpha: new version, 13.5a3
- - - - -
30 changed files:
- update_3/alpha/.htaccess
- − update_3/alpha/13.0a5-13.5a2-linux-i686-ALL.xml
- − update_3/alpha/13.0a5-13.5a2-linux-x86_64-ALL.xml
- − update_3/alpha/13.0a5-13.5a2-macos-ALL.xml
- − update_3/alpha/13.0a5-13.5a2-windows-i686-ALL.xml
- − update_3/alpha/13.0a5-13.5a2-windows-x86_64-ALL.xml
- − update_3/alpha/13.0a6-13.5a2-linux-i686-ALL.xml
- − update_3/alpha/13.0a6-13.5a2-linux-x86_64-ALL.xml
- − update_3/alpha/13.0a6-13.5a2-macos-ALL.xml
- − update_3/alpha/13.0a6-13.5a2-windows-i686-ALL.xml
- − update_3/alpha/13.0a6-13.5a2-windows-x86_64-ALL.xml
- + update_3/alpha/13.0a6-13.5a3-linux-i686-ALL.xml
- + update_3/alpha/13.0a6-13.5a3-linux-x86_64-ALL.xml
- + update_3/alpha/13.0a6-13.5a3-macos-ALL.xml
- + update_3/alpha/13.0a6-13.5a3-windows-i686-ALL.xml
- + update_3/alpha/13.0a6-13.5a3-windows-x86_64-ALL.xml
- − update_3/alpha/13.5a1-13.5a2-linux-i686-ALL.xml
- − update_3/alpha/13.5a1-13.5a2-linux-x86_64-ALL.xml
- − update_3/alpha/13.5a1-13.5a2-macos-ALL.xml
- − update_3/alpha/13.5a1-13.5a2-windows-i686-ALL.xml
- − update_3/alpha/13.5a1-13.5a2-windows-x86_64-ALL.xml
- + update_3/alpha/13.5a1-13.5a3-linux-i686-ALL.xml
- + update_3/alpha/13.5a1-13.5a3-linux-x86_64-ALL.xml
- + update_3/alpha/13.5a1-13.5a3-macos-ALL.xml
- + update_3/alpha/13.5a1-13.5a3-windows-i686-ALL.xml
- + update_3/alpha/13.5a1-13.5a3-windows-x86_64-ALL.xml
- + update_3/alpha/13.5a2-13.5a3-linux-i686-ALL.xml
- + update_3/alpha/13.5a2-13.5a3-linux-x86_64-ALL.xml
- + update_3/alpha/13.5a2-13.5a3-macos-ALL.xml
- + update_3/alpha/13.5a2-13.5a3-windows-i686-ALL.xml
The diff was not included because it is too large.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-update-responses…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-update-responses…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build] Pushed new tag tbb-13.5a3-build2
by richard (@richard) 22 Dec '23
by richard (@richard) 22 Dec '23
22 Dec '23
richard pushed new tag tbb-13.5a3-build2 at The Tor Project / Applications / tor-browser-build
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/tree/tbb…
You're receiving this email because of your account on gitlab.torproject.org.
1
0