tor-commits
Threads by month
- ----- 2025 -----
- 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
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
January 2024
- 1 participants
- 128 discussions

[Git][tpo/applications/tor-browser-build][maint-13.0] Bug 41067: Use Capture::Tiny instead of IO::CaptureOutput
by richard (@richard) 31 Jan '24
by richard (@richard) 31 Jan '24
31 Jan '24
richard pushed to branch maint-13.0 at The Tor Project / Applications / tor-browser-build
Commits:
74602df1 by Nicolas Vigier at 2024-01-31T08:51:48+00:00
Bug 41067: Use Capture::Tiny instead of IO::CaptureOutput
The IO::CaptureOutput perl module is deprecated, so we switch to
Capture::Tiny. We also remove some uses of IO::CaptureOutput where it
was not needed.
- - - - -
8 changed files:
- README
- rbm.conf
- tools/clean-old
- tools/dmg2mar
- tools/download-torbrowser
- tools/signing/machines-setup/setup-signing-machine
- tools/update-responses/README.md
- tools/update-responses/update_responses
Changes:
=====================================
README
=====================================
@@ -21,7 +21,7 @@ You also need a few perl modules installed:
- Getopt::Long
- Template
- IO::Handle
-- IO::CaptureOutput
+- Capture::Tiny
- JSON
- File::Temp
- Path::Tiny
@@ -41,7 +41,7 @@ If you are running Debian or Ubuntu, you can install them with:
# apt-get install libdata-dump-perl libdata-uuid-perl libdatetime-perl \
libdigest-sha-perl libfile-copy-recursive-perl \
- libfile-slurp-perl libio-all-perl libio-captureoutput-perl \
+ libfile-slurp-perl libio-all-perl libcapture-tiny-perl \
libio-handle-util-perl libjson-perl \
libparallel-forkmanager-perl libpath-tiny-perl \
libsort-versions-perl libstring-shellquote-perl \
@@ -51,7 +51,7 @@ If you are running Debian or Ubuntu, you can install them with:
If you are running an Arch based system, you should be able to install them with:
# pacman -S perl-datetime perl-path-tiny perl-yaml perl-yaml-libyaml \
- perl-yaml-tiny perl-template-toolkit perl-io-captureoutput \
+ perl-yaml-tiny perl-template-toolkit perl-capture-tiny \
perl-file-copy-recursive perl-string-shellquote \
perl-sort-versions perl-data-uuid perl-data-dump perl-json \
perl-digest-sha1 perl-io-all perl-file-slurp perl-sys-syscall \
=====================================
rbm.conf
=====================================
@@ -705,7 +705,6 @@ gpg_allow_expired_keys: 1
--- |
# This part of the file contains options written in perl
- use IO::CaptureOutput qw(capture_exec);
(
var_p => {
nightly_torbrowser_version => sub {
=====================================
tools/clean-old
=====================================
@@ -1,6 +1,5 @@
#!/usr/bin/perl -w
use strict;
-use IO::CaptureOutput qw(capture_exec);
use FindBin;
use lib "$FindBin::Bin/../rbm/lib";
use RBM;
=====================================
tools/dmg2mar
=====================================
@@ -29,7 +29,7 @@
# $ export "PATH=$p7zipdir/bin:$PATH"
use strict;
-use IO::CaptureOutput qw(capture_exec);
+use Capture::Tiny qw(capture);
use File::Slurp;
use File::Find;
use Parallel::ForkManager;
@@ -48,6 +48,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 osname {
my ($osname) = capture_exec('uname', '-s');
my ($arch) = capture_exec('uname', '-m');
=====================================
tools/download-torbrowser
=====================================
@@ -6,7 +6,6 @@
use strict;
use English;
use LWP::Simple;
-use IO::CaptureOutput qw(capture_exec);
use File::Temp;
use File::Basename qw(fileparse);
use FindBin;
=====================================
tools/signing/machines-setup/setup-signing-machine
=====================================
@@ -100,7 +100,7 @@ authorized_keys richard richard.pub
# Install rbm deps
install_packages libyaml-libyaml-perl libtemplate-perl libdatetime-perl \
libio-handle-util-perl libio-all-perl \
- libio-captureoutput-perl libjson-perl libpath-tiny-perl \
+ libcapture-tiny-perl libjson-perl libpath-tiny-perl \
libstring-shellquote-perl libsort-versions-perl \
libdigest-sha-perl libdata-uuid-perl libdata-dump-perl \
libfile-copy-recursive-perl libfile-slurp-perl
=====================================
tools/update-responses/README.md
=====================================
@@ -13,14 +13,14 @@ Dependencies
The following perl modules need to be installed to run the script:
FindBin YAML::XS File::Slurp Digest::SHA XML::Writer File::Temp
- IO::CaptureOutput Parallel::ForkManager XML::LibXML LWP JSON
+ Capture::Tiny Parallel::ForkManager XML::LibXML LWP JSON
On Debian / Ubuntu you can install them with:
```
# apt-get install libfindbin-libs-perl libyaml-libyaml-perl \
libfile-slurp-perl libdigest-sha-perl libxml-writer-perl \
- libio-captureoutput-perl libparallel-forkmanager-perl \
+ libcapture-tiny-perl libparallel-forkmanager-perl \
libxml-libxml-perl libwww-perl libjson-perl
```
@@ -28,7 +28,7 @@ On Red Hat / Fedora you can install them with:
```
# for module in FindBin YAML::XS File::Slurp Digest::SHA XML::Writer \
- File::Temp IO::CaptureOutput Parallel::ForkManager \
+ File::Temp Capture::Tiny Parallel::ForkManager \
XML::LibXML LWP JSON
do yum install "perl($module)"; done
```
=====================================
tools/update-responses/update_responses
=====================================
@@ -14,7 +14,7 @@ use File::Copy;
use File::Temp;
use File::Find;
use POSIX qw(setlocale LC_ALL);
-use IO::CaptureOutput qw(capture_exec);
+use Capture::Tiny qw(capture);
use Parallel::ForkManager;
use File::Basename;
use XML::LibXML '1.70';
@@ -265,9 +265,11 @@ sub create_incremental_mar {
local $ENV{MOZ_PRODUCT_VERSION} = $new_version;
local $ENV{MAR_CHANNEL_ID} = get_config($config, $new_version, $os, 'mar_channel_id');
local $ENV{TMPDIR} = $tmpdir;
- my ($out, $err, $success) = capture_exec('make_incremental_update.sh',
- $mar_file_path, "$tmpdir/A", "$tmpdir/B");
- if (!$success) {
+ my ($out, $err, $exit) = capture {
+ system('make_incremental_update.sh',
+ $mar_file_path, "$tmpdir/A", "$tmpdir/B");
+ };
+ if ($exit) {
unlink $mar_file_path if -f $mar_file_path;
exit_error "making incremental mar:\n" . $err;
}
@@ -490,9 +492,11 @@ sub extract_martools {
$martools_tmpdir = get_tmpdir($config);
my $old_cwd = getcwd;
chdir $martools_tmpdir;
- my (undef, undef, $success) = capture_exec('unzip', $marzip);
+ my (undef, undef, $exit) = capture {
+ system('unzip', $marzip);
+ };
chdir $old_cwd;
- exit_error "Error extracting $marzip" unless $success;
+ exit_error "Error extracting $marzip" if $exit;
$ENV{PATH} = "$martools_tmpdir/mar-tools:$initPATH";
if ($initLD_LIBRARY_PATH) {
$ENV{LD_LIBRARY_PATH} = "$initLD_LIBRARY_PATH:$martools_tmpdir/mar-tools";
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/7…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/7…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][main] Bug 41067: Use Capture::Tiny instead of IO::CaptureOutput
by richard (@richard) 30 Jan '24
by richard (@richard) 30 Jan '24
30 Jan '24
richard pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
0ed7a191 by Nicolas Vigier at 2024-01-30T11:49:05+01:00
Bug 41067: Use Capture::Tiny instead of IO::CaptureOutput
The IO::CaptureOutput perl module is deprecated, so we switch to
Capture::Tiny. We also remove some uses of IO::CaptureOutput where it
was not needed.
- - - - -
8 changed files:
- README
- rbm.conf
- tools/clean-old
- tools/dmg2mar
- tools/download-torbrowser
- tools/signing/machines-setup/setup-signing-machine
- tools/update-responses/README.md
- tools/update-responses/update_responses
Changes:
=====================================
README
=====================================
@@ -21,7 +21,7 @@ You also need a few perl modules installed:
- Getopt::Long
- Template
- IO::Handle
-- IO::CaptureOutput
+- Capture::Tiny
- JSON
- File::Temp
- Path::Tiny
@@ -41,7 +41,7 @@ If you are running Debian or Ubuntu, you can install them with:
# apt-get install libdata-dump-perl libdata-uuid-perl libdatetime-perl \
libdigest-sha-perl libfile-copy-recursive-perl \
- libfile-slurp-perl libio-all-perl libio-captureoutput-perl \
+ libfile-slurp-perl libio-all-perl libcapture-tiny-perl \
libio-handle-util-perl libjson-perl \
libparallel-forkmanager-perl libpath-tiny-perl \
libsort-versions-perl libstring-shellquote-perl \
@@ -51,7 +51,7 @@ If you are running Debian or Ubuntu, you can install them with:
If you are running Fedora, CentOS or RHEL, you can install them with:
# dnf install "perl(YAML::XS)" "perl(File::Basename)" "perl(Getopt::Long)" \
- "perl(Template)" "perl(IO::Handle)" "perl(IO::CaptureOutput)" \
+ "perl(Template)" "perl(IO::Handle)" "perl(Capture::Tiny)" \
"perl(JSON)" "perl(File::Temp)" "perl(Path::Tiny)" \
"perl(File::Path)" "perl(File::Slurp)" \
"perl(File::Copy::Recursive)" "perl(String::ShellQuote)"
@@ -62,7 +62,7 @@ If you are running Fedora, CentOS or RHEL, you can install them with:
If you are running an Arch based system, you should be able to install them with:
# pacman -S perl-datetime perl-path-tiny perl-yaml perl-yaml-libyaml \
- perl-yaml-tiny perl-template-toolkit perl-io-captureoutput \
+ perl-yaml-tiny perl-template-toolkit perl-capture-tiny \
perl-file-copy-recursive perl-string-shellquote \
perl-sort-versions perl-data-uuid perl-data-dump perl-json \
perl-digest-sha1 perl-io-all perl-file-slurp perl-sys-syscall \
=====================================
rbm.conf
=====================================
@@ -704,7 +704,6 @@ gpg_allow_expired_keys: 1
--- |
# This part of the file contains options written in perl
- use IO::CaptureOutput qw(capture_exec);
(
var_p => {
nightly_torbrowser_version => sub {
=====================================
tools/clean-old
=====================================
@@ -1,6 +1,5 @@
#!/usr/bin/perl -w
use strict;
-use IO::CaptureOutput qw(capture_exec);
use FindBin;
use lib "$FindBin::Bin/../rbm/lib";
use RBM;
=====================================
tools/dmg2mar
=====================================
@@ -29,7 +29,7 @@
# $ export "PATH=$p7zipdir/bin:$PATH"
use strict;
-use IO::CaptureOutput qw(capture_exec);
+use Capture::Tiny qw(capture);
use File::Slurp;
use File::Find;
use Parallel::ForkManager;
@@ -48,6 +48,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 osname {
my ($osname) = capture_exec('uname', '-s');
my ($arch) = capture_exec('uname', '-m');
=====================================
tools/download-torbrowser
=====================================
@@ -6,7 +6,6 @@
use strict;
use English;
use LWP::Simple;
-use IO::CaptureOutput qw(capture_exec);
use File::Temp;
use File::Basename qw(fileparse);
use FindBin;
=====================================
tools/signing/machines-setup/setup-signing-machine
=====================================
@@ -100,7 +100,7 @@ authorized_keys richard richard.pub
# Install rbm deps
install_packages libyaml-libyaml-perl libtemplate-perl libdatetime-perl \
libio-handle-util-perl libio-all-perl \
- libio-captureoutput-perl libjson-perl libpath-tiny-perl \
+ libcapture-tiny-perl libjson-perl libpath-tiny-perl \
libstring-shellquote-perl libsort-versions-perl \
libdigest-sha-perl libdata-uuid-perl libdata-dump-perl \
libfile-copy-recursive-perl libfile-slurp-perl
=====================================
tools/update-responses/README.md
=====================================
@@ -13,14 +13,14 @@ Dependencies
The following perl modules need to be installed to run the script:
FindBin YAML::XS File::Slurp Digest::SHA XML::Writer File::Temp
- IO::CaptureOutput Parallel::ForkManager XML::LibXML LWP JSON
+ Capture::Tiny Parallel::ForkManager XML::LibXML LWP JSON
On Debian / Ubuntu you can install them with:
```
# apt-get install libfindbin-libs-perl libyaml-libyaml-perl \
libfile-slurp-perl libdigest-sha-perl libxml-writer-perl \
- libio-captureoutput-perl libparallel-forkmanager-perl \
+ libcapture-tiny-perl libparallel-forkmanager-perl \
libxml-libxml-perl libwww-perl libjson-perl
```
@@ -28,7 +28,7 @@ On Red Hat / Fedora you can install them with:
```
# for module in FindBin YAML::XS File::Slurp Digest::SHA XML::Writer \
- File::Temp IO::CaptureOutput Parallel::ForkManager \
+ File::Temp Capture::Tiny Parallel::ForkManager \
XML::LibXML LWP JSON
do yum install "perl($module)"; done
```
=====================================
tools/update-responses/update_responses
=====================================
@@ -14,7 +14,7 @@ use File::Copy;
use File::Temp;
use File::Find;
use POSIX qw(setlocale LC_ALL);
-use IO::CaptureOutput qw(capture_exec);
+use Capture::Tiny qw(capture);
use Parallel::ForkManager;
use File::Basename;
use XML::LibXML '1.70';
@@ -265,9 +265,11 @@ sub create_incremental_mar {
local $ENV{MOZ_PRODUCT_VERSION} = $new_version;
local $ENV{MAR_CHANNEL_ID} = get_config($config, $new_version, $os, 'mar_channel_id');
local $ENV{TMPDIR} = $tmpdir;
- my ($out, $err, $success) = capture_exec('make_incremental_update.sh',
- $mar_file_path, "$tmpdir/A", "$tmpdir/B");
- if (!$success) {
+ my ($out, $err, $exit) = capture {
+ system('make_incremental_update.sh',
+ $mar_file_path, "$tmpdir/A", "$tmpdir/B");
+ };
+ if ($exit) {
unlink $mar_file_path if -f $mar_file_path;
exit_error "making incremental mar:\n" . $err;
}
@@ -490,9 +492,11 @@ sub extract_martools {
$martools_tmpdir = get_tmpdir($config);
my $old_cwd = getcwd;
chdir $martools_tmpdir;
- my (undef, undef, $success) = capture_exec('unzip', $marzip);
+ my (undef, undef, $exit) = capture {
+ system('unzip', $marzip);
+ };
chdir $old_cwd;
- exit_error "Error extracting $marzip" unless $success;
+ exit_error "Error extracting $marzip" if $exit;
$ENV{PATH} = "$martools_tmpdir/mar-tools:$initPATH";
if ($initLD_LIBRARY_PATH) {
$ENV{LD_LIBRARY_PATH} = "$initLD_LIBRARY_PATH:$martools_tmpdir/mar-tools";
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][maint-13.0] Update rbm for rbm#40068 and rbm#40069
by boklm (@boklm) 30 Jan '24
by boklm (@boklm) 30 Jan '24
30 Jan '24
boklm pushed to branch maint-13.0 at The Tor Project / Applications / tor-browser-build
Commits:
cfa73f9c by Nicolas Vigier at 2024-01-30T16:46:23+01:00
Update rbm for rbm#40068 and rbm#40069
- - - - -
1 changed file:
- rbm
Changes:
=====================================
rbm
=====================================
@@ -1 +1 @@
-Subproject commit b5e5b04aaf677c4bacfb5ace45598313286bfdf6
+Subproject commit 067c30ee4cf3baa1c0b7e3674d785cf9e5bec8fe
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/rbm][main] Bug 40069: Fix encoding of stdout and stderr
by richard (@richard) 30 Jan '24
by richard (@richard) 30 Jan '24
30 Jan '24
richard pushed to branch main at The Tor Project / Applications / RBM
Commits:
067c30ee by Nicolas Vigier at 2024-01-30T12:50:32+01:00
Bug 40069: Fix encoding of stdout and stderr
Set stdout and stder encoding based on nl_langinfo, or LC_ALL and LANG
locale environment variables, as suggested on
https://perldoc.perl.org/open.
- - - - -
1 changed file:
- rbm
Changes:
=====================================
rbm
=====================================
@@ -1,6 +1,7 @@
#!/usr/bin/perl -w
use strict;
+use open OUT => ':locale';
use File::Basename;
use lib dirname($0) . '/lib';
use RBM;
View it on GitLab: https://gitlab.torproject.org/tpo/applications/rbm/-/commit/067c30ee4cf3baa…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/rbm/-/commit/067c30ee4cf3baa…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser-update-responses][main] alpha: new version, 13.5a4
by richard (@richard) 30 Jan '24
by richard (@richard) 30 Jan '24
30 Jan '24
richard pushed to branch main at The Tor Project / Applications / mullvad-browser-update-responses
Commits:
4a352531 by Richard Pospesel at 2024-01-30T11:59:07+00:00
alpha: new version, 13.5a4
- - - - -
29 changed files:
- update_1/alpha/.htaccess
- − update_1/alpha/13.0a6-13.5a3-linux-x86_64-ALL.xml
- − update_1/alpha/13.0a6-13.5a3-macos-ALL.xml
- − update_1/alpha/13.0a6-13.5a3-windows-x86_64-ALL.xml
- − update_1/alpha/13.5a1-13.5a3-linux-x86_64-ALL.xml
- − update_1/alpha/13.5a1-13.5a3-macos-ALL.xml
- − update_1/alpha/13.5a1-13.5a3-windows-x86_64-ALL.xml
- + update_1/alpha/13.5a1-13.5a4-linux-x86_64-ALL.xml
- + update_1/alpha/13.5a1-13.5a4-macos-ALL.xml
- + update_1/alpha/13.5a1-13.5a4-windows-x86_64-ALL.xml
- − update_1/alpha/13.5a2-13.5a3-linux-x86_64-ALL.xml
- − update_1/alpha/13.5a2-13.5a3-macos-ALL.xml
- − update_1/alpha/13.5a2-13.5a3-windows-x86_64-ALL.xml
- + update_1/alpha/13.5a2-13.5a4-linux-x86_64-ALL.xml
- + update_1/alpha/13.5a2-13.5a4-macos-ALL.xml
- + update_1/alpha/13.5a2-13.5a4-windows-x86_64-ALL.xml
- + update_1/alpha/13.5a3-13.5a4-linux-x86_64-ALL.xml
- + update_1/alpha/13.5a3-13.5a4-macos-ALL.xml
- + update_1/alpha/13.5a3-13.5a4-windows-x86_64-ALL.xml
- − update_1/alpha/13.5a3-linux-x86_64-ALL.xml
- − update_1/alpha/13.5a3-macos-ALL.xml
- − update_1/alpha/13.5a3-windows-x86_64-ALL.xml
- + update_1/alpha/13.5a4-linux-x86_64-ALL.xml
- + update_1/alpha/13.5a4-macos-ALL.xml
- + update_1/alpha/13.5a4-windows-x86_64-ALL.xml
- update_1/alpha/download-linux-x86_64.json
- update_1/alpha/download-macos.json
- update_1/alpha/download-windows-x86_64.json
- update_1/alpha/downloads.json
Changes:
=====================================
update_1/alpha/.htaccess
=====================================
@@ -1,22 +1,22 @@
RewriteEngine On
-RewriteRule ^[^/]+/13.5a3/ no-update.xml [last]
-RewriteRule ^Linux_x86_64-gcc3/13.0a6/ALL 13.0a6-13.5a3-linux-x86_64-ALL.xml [last]
-RewriteRule ^Linux_x86_64-gcc3/13.5a1/ALL 13.5a1-13.5a3-linux-x86_64-ALL.xml [last]
-RewriteRule ^Linux_x86_64-gcc3/13.5a2/ALL 13.5a2-13.5a3-linux-x86_64-ALL.xml [last]
-RewriteRule ^Linux_x86_64-gcc3/[^/]+/ALL 13.5a3-linux-x86_64-ALL.xml [last]
-RewriteRule ^Linux_x86_64-gcc3/ 13.5a3-linux-x86_64-ALL.xml [last]
-RewriteRule ^Darwin_x86_64-gcc3/13.0a6/ALL 13.0a6-13.5a3-macos-ALL.xml [last]
-RewriteRule ^Darwin_x86_64-gcc3/13.5a1/ALL 13.5a1-13.5a3-macos-ALL.xml [last]
-RewriteRule ^Darwin_x86_64-gcc3/13.5a2/ALL 13.5a2-13.5a3-macos-ALL.xml [last]
-RewriteRule ^Darwin_x86_64-gcc3/[^/]+/ALL 13.5a3-macos-ALL.xml [last]
-RewriteRule ^Darwin_x86_64-gcc3/ 13.5a3-macos-ALL.xml [last]
-RewriteRule ^Darwin_aarch64-gcc3/13.0a6/ALL 13.0a6-13.5a3-macos-ALL.xml [last]
-RewriteRule ^Darwin_aarch64-gcc3/13.5a1/ALL 13.5a1-13.5a3-macos-ALL.xml [last]
-RewriteRule ^Darwin_aarch64-gcc3/13.5a2/ALL 13.5a2-13.5a3-macos-ALL.xml [last]
-RewriteRule ^Darwin_aarch64-gcc3/[^/]+/ALL 13.5a3-macos-ALL.xml [last]
-RewriteRule ^Darwin_aarch64-gcc3/ 13.5a3-macos-ALL.xml [last]
-RewriteRule ^WINNT_x86_64-gcc3-x64/13.0a6/ALL 13.0a6-13.5a3-windows-x86_64-ALL.xml [last]
-RewriteRule ^WINNT_x86_64-gcc3-x64/13.5a1/ALL 13.5a1-13.5a3-windows-x86_64-ALL.xml [last]
-RewriteRule ^WINNT_x86_64-gcc3-x64/13.5a2/ALL 13.5a2-13.5a3-windows-x86_64-ALL.xml [last]
-RewriteRule ^WINNT_x86_64-gcc3-x64/[^/]+/ALL 13.5a3-windows-x86_64-ALL.xml [last]
-RewriteRule ^WINNT_x86_64-gcc3-x64/ 13.5a3-windows-x86_64-ALL.xml [last]
+RewriteRule ^[^/]+/13.5a4/ no-update.xml [last]
+RewriteRule ^Linux_x86_64-gcc3/13.5a1/ALL 13.5a1-13.5a4-linux-x86_64-ALL.xml [last]
+RewriteRule ^Linux_x86_64-gcc3/13.5a2/ALL 13.5a2-13.5a4-linux-x86_64-ALL.xml [last]
+RewriteRule ^Linux_x86_64-gcc3/13.5a3/ALL 13.5a3-13.5a4-linux-x86_64-ALL.xml [last]
+RewriteRule ^Linux_x86_64-gcc3/[^/]+/ALL 13.5a4-linux-x86_64-ALL.xml [last]
+RewriteRule ^Linux_x86_64-gcc3/ 13.5a4-linux-x86_64-ALL.xml [last]
+RewriteRule ^Darwin_x86_64-gcc3/13.5a1/ALL 13.5a1-13.5a4-macos-ALL.xml [last]
+RewriteRule ^Darwin_x86_64-gcc3/13.5a2/ALL 13.5a2-13.5a4-macos-ALL.xml [last]
+RewriteRule ^Darwin_x86_64-gcc3/13.5a3/ALL 13.5a3-13.5a4-macos-ALL.xml [last]
+RewriteRule ^Darwin_x86_64-gcc3/[^/]+/ALL 13.5a4-macos-ALL.xml [last]
+RewriteRule ^Darwin_x86_64-gcc3/ 13.5a4-macos-ALL.xml [last]
+RewriteRule ^Darwin_aarch64-gcc3/13.5a1/ALL 13.5a1-13.5a4-macos-ALL.xml [last]
+RewriteRule ^Darwin_aarch64-gcc3/13.5a2/ALL 13.5a2-13.5a4-macos-ALL.xml [last]
+RewriteRule ^Darwin_aarch64-gcc3/13.5a3/ALL 13.5a3-13.5a4-macos-ALL.xml [last]
+RewriteRule ^Darwin_aarch64-gcc3/[^/]+/ALL 13.5a4-macos-ALL.xml [last]
+RewriteRule ^Darwin_aarch64-gcc3/ 13.5a4-macos-ALL.xml [last]
+RewriteRule ^WINNT_x86_64-gcc3-x64/13.5a1/ALL 13.5a1-13.5a4-windows-x86_64-ALL.xml [last]
+RewriteRule ^WINNT_x86_64-gcc3-x64/13.5a2/ALL 13.5a2-13.5a4-windows-x86_64-ALL.xml [last]
+RewriteRule ^WINNT_x86_64-gcc3-x64/13.5a3/ALL 13.5a3-13.5a4-windows-x86_64-ALL.xml [last]
+RewriteRule ^WINNT_x86_64-gcc3-x64/[^/]+/ALL 13.5a4-windows-x86_64-ALL.xml [last]
+RewriteRule ^WINNT_x86_64-gcc3-x64/ 13.5a4-windows-x86_64-ALL.xml [last]
=====================================
update_1/alpha/13.0a6-13.5a3-linux-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.5a3" appVersion="13.5a3" platformVersion="115.6.0" buildID="20231219113348" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-linux-x86_64-13.5a3_…" hashFunction="SHA512" hashValue="ad2914a4f0c2b78f7d740fc8d1077767e3c42f12857fbda706c87b5f52cb2e4a415aaa0e4e732764f2fe463ae335b73fe52db6943b02e50fafef11fc42864475" size="106795579" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-linux-x86_64--13.0a6…" hashFunction="SHA512" hashValue="d06ef52fb1061cc60e2b4455845cef391a956b12827d6687e80ef82b685dd7e4b08b163426d4692733c8bc8fc0b69d1c32d840d39638eb99866d83c8c716e100" size="9198850" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.0a6-13.5a3-macos-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.5a3" appVersion="13.5a3" platformVersion="115.6.0" buildID="20231219113348" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-macos-13.5a3_ALL.mar" hashFunction="SHA512" hashValue="b3c91729bb0f42aab67440d4119f2574d917c501b0ee958d41eb36914acdf9c2ba40d1aa12755a84744b073941d4ccc1c792e86007fbe05fb545e53dd96aac5f" size="114855415" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-macos--13.0a6-13.5a3…" hashFunction="SHA512" hashValue="ef939f5a129df1a0b253e9ccd5d2d43389d6cdf1883da2cb81e3dd24cb756ba378935630c1234ed5223da078aaf6f980fefdb66ef2cc0b94375dbf61902e06c3" size="14294193" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.0a6-13.5a3-windows-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.5a3" appVersion="13.5a3" platformVersion="115.6.0" buildID="20231219113348" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-windows-x86_64-13.5a…" hashFunction="SHA512" hashValue="a6ce2a3d2ed55b42354f6559e9cf48f5971728d13f83070331bda042a114bb02d0e06b5dd7dad2db6fc3376ec152d0f92a7fb87d21cf00da398a9bb5577dc1f5" size="88815824" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-windows-x86_64--13.0…" hashFunction="SHA512" hashValue="28c5d75219d14249a9363cf42518ea6954dd00f76fa8100d3c7a52c72430eeb8f370176376082fda5df19b62c36f4ed7373979ab2b3f52bb31d118278abdfb45" size="9817942" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.5a1-13.5a3-linux-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.5a3" appVersion="13.5a3" platformVersion="115.6.0" buildID="20231219113348" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-linux-x86_64-13.5a3_…" hashFunction="SHA512" hashValue="ad2914a4f0c2b78f7d740fc8d1077767e3c42f12857fbda706c87b5f52cb2e4a415aaa0e4e732764f2fe463ae335b73fe52db6943b02e50fafef11fc42864475" size="106795579" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-linux-x86_64--13.5a1…" hashFunction="SHA512" hashValue="b60a8436420fc9e904499ca9c073e792c207a6b9ef94433bff2f9895c12f482fdfb70d6511c72d548d597562dda90b59e9afd96c7789785f8e8ac5a342423bd4" size="8508777" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.5a1-13.5a3-macos-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.5a3" appVersion="13.5a3" platformVersion="115.6.0" buildID="20231219113348" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-macos-13.5a3_ALL.mar" hashFunction="SHA512" hashValue="b3c91729bb0f42aab67440d4119f2574d917c501b0ee958d41eb36914acdf9c2ba40d1aa12755a84744b073941d4ccc1c792e86007fbe05fb545e53dd96aac5f" size="114855415" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-macos--13.5a1-13.5a3…" hashFunction="SHA512" hashValue="238d6a426fc36ab8f117032c54198dfcd36272d03f7e2ed0c2e9b139bfa2ffb6197b3082e57dae827226b137305e10a244de4a3619c8b88d4c00799c41cb3505" size="13597253" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.5a1-13.5a3-windows-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.5a3" appVersion="13.5a3" platformVersion="115.6.0" buildID="20231219113348" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-windows-x86_64-13.5a…" hashFunction="SHA512" hashValue="a6ce2a3d2ed55b42354f6559e9cf48f5971728d13f83070331bda042a114bb02d0e06b5dd7dad2db6fc3376ec152d0f92a7fb87d21cf00da398a9bb5577dc1f5" size="88815824" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-windows-x86_64--13.5…" hashFunction="SHA512" hashValue="9e289c8b83afbdd9b09bcadbcd93f3f66c36d2ea7965cfd04a6a4e492d0541f3a652361c8db099e2d11a6db0c07023c2acfae478defbb6660c41deb17e45900c" size="9179529" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.5a1-13.5a4-linux-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.5a4" appVersion="13.5a4" platformVersion="115.7.0" buildID="20240129155630" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-linux-x86_64-13.5a4_…" hashFunction="SHA512" hashValue="f4807be1248046f3115f381dbead91fdf8731f3f3ffc76a7eb7bf32eb58f37e3e4cd76861bf6783c53662de6dfd8e3f5e2e193ae49c2828ca8c70eaad512ae9c" size="107916327" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-linux-x86_64--13.5a1…" hashFunction="SHA512" hashValue="7929965bcf3f97ffe3a856248271d3dcbb5999b228858b75f3e1d993bfcfe5d06efecce70f1325edd1fde4edabd0d556b44e6ee56149a0f73e54c55bd773b34a" size="15875405" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.5a1-13.5a4-macos-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.5a4" appVersion="13.5a4" platformVersion="115.7.0" buildID="20240129155630" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-macos-13.5a4_ALL.mar" hashFunction="SHA512" hashValue="05aa6ee66d4dea52c6fec07d45cb0bc96dc813b3f86db418eb86ecf6dccd44e85c0fb1c7c2450d50b35b1ad8da0a7d16ed16f2083fef7e3e1135774ad278908b" size="115308515" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-macos--13.5a1-13.5a4…" hashFunction="SHA512" hashValue="e49a99198e0046cc0133a69991bc204ec89e4fe07216be40d7a669ecd3b8ac26c889de3a0d161b6be726105369e46d2e92c84177cdde14df968005a5aafe1b1f" size="17266465" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.5a1-13.5a4-windows-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.5a4" appVersion="13.5a4" platformVersion="115.7.0" buildID="20240129155630" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-windows-x86_64-13.5a…" hashFunction="SHA512" hashValue="2681c3052302fa2e791e6c82d2ad48569d8f1622400bd433efe31e7757e8002c0f5c1f2930949f89ee059bc61b2cea2101d56b67f2c506eb6222a0ff709948f6" size="89263680" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-windows-x86_64--13.5…" hashFunction="SHA512" hashValue="69038008b474bf188b13e1c41331de90f0b591f93f961145b744d9df552a423b5e1c17ad36db608e53a68c31249e9c9f31ddba6b7ab066b91ea44aa0c2b17640" size="12871701" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.5a2-13.5a3-linux-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.5a3" appVersion="13.5a3" platformVersion="115.6.0" buildID="20231219113348" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-linux-x86_64-13.5a3_…" hashFunction="SHA512" hashValue="ad2914a4f0c2b78f7d740fc8d1077767e3c42f12857fbda706c87b5f52cb2e4a415aaa0e4e732764f2fe463ae335b73fe52db6943b02e50fafef11fc42864475" size="106795579" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-linux-x86_64--13.5a2…" hashFunction="SHA512" hashValue="8a7d10996b6b801f1d2858c200049ddf95117ccdcaacc3cb8b5e818312f4b195b231f18bd8f61e5cb1513c1f1791ece281fe503209250896c430c1766b1797af" size="5627360" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.5a2-13.5a3-macos-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.5a3" appVersion="13.5a3" platformVersion="115.6.0" buildID="20231219113348" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-macos-13.5a3_ALL.mar" hashFunction="SHA512" hashValue="b3c91729bb0f42aab67440d4119f2574d917c501b0ee958d41eb36914acdf9c2ba40d1aa12755a84744b073941d4ccc1c792e86007fbe05fb545e53dd96aac5f" size="114855415" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-macos--13.5a2-13.5a3…" hashFunction="SHA512" hashValue="e2441d94986928b77ec1606b07cfca59e56f1cba1e6f466e14c8482fff7e33ec0aa78429787b25ba3d0f573060c6bfaad6a6094a26cd28e60c8e2a38891fff18" size="10532560" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.5a2-13.5a3-windows-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.5a3" appVersion="13.5a3" platformVersion="115.6.0" buildID="20231219113348" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-windows-x86_64-13.5a…" hashFunction="SHA512" hashValue="a6ce2a3d2ed55b42354f6559e9cf48f5971728d13f83070331bda042a114bb02d0e06b5dd7dad2db6fc3376ec152d0f92a7fb87d21cf00da398a9bb5577dc1f5" size="88815824" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-windows-x86_64--13.5…" hashFunction="SHA512" hashValue="07b3258657393586dce54e2c508de7e87969fb6516988dd992573ef57585e9f99a0798afdd1c0c5100f4485c42664e2c88f4566c8022c0c7ba3d90a315fd9cbc" size="6257559" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.5a2-13.5a4-linux-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.5a4" appVersion="13.5a4" platformVersion="115.7.0" buildID="20240129155630" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-linux-x86_64-13.5a4_…" hashFunction="SHA512" hashValue="f4807be1248046f3115f381dbead91fdf8731f3f3ffc76a7eb7bf32eb58f37e3e4cd76861bf6783c53662de6dfd8e3f5e2e193ae49c2828ca8c70eaad512ae9c" size="107916327" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-linux-x86_64--13.5a2…" hashFunction="SHA512" hashValue="615a7a213ae930ab0072f3e4f0eb6ff823e371fb2931e6ea50ab82b47a30acbdc2904e790bd186886da8540e2dc89fa5f8383938acb9de3a81a7552f53527577" size="14878410" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.5a2-13.5a4-macos-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.5a4" appVersion="13.5a4" platformVersion="115.7.0" buildID="20240129155630" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-macos-13.5a4_ALL.mar" hashFunction="SHA512" hashValue="05aa6ee66d4dea52c6fec07d45cb0bc96dc813b3f86db418eb86ecf6dccd44e85c0fb1c7c2450d50b35b1ad8da0a7d16ed16f2083fef7e3e1135774ad278908b" size="115308515" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-macos--13.5a2-13.5a4…" hashFunction="SHA512" hashValue="dcabe3438794aae6e64d72bfe836ad65cf8454e6db2aef9acaaa07d83d341912a5bf9ccf1b3125ff0cc00846fe6b79b0d775e0d47c3bf1f5777a97356a7148c7" size="16017493" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.5a2-13.5a4-windows-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.5a4" appVersion="13.5a4" platformVersion="115.7.0" buildID="20240129155630" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-windows-x86_64-13.5a…" hashFunction="SHA512" hashValue="2681c3052302fa2e791e6c82d2ad48569d8f1622400bd433efe31e7757e8002c0f5c1f2930949f89ee059bc61b2cea2101d56b67f2c506eb6222a0ff709948f6" size="89263680" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-windows-x86_64--13.5…" hashFunction="SHA512" hashValue="ffe9a835049d044d17e66bcb06c035f145c7cd6913de0f23755fda6a164406bc86fa9dc5297a9fec7eac1b23014f742e9733bd4ddf7cd89a7a979525b2570657" size="11825429" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.5a3-13.5a4-linux-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.5a4" appVersion="13.5a4" platformVersion="115.7.0" buildID="20240129155630" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-linux-x86_64-13.5a4_…" hashFunction="SHA512" hashValue="f4807be1248046f3115f381dbead91fdf8731f3f3ffc76a7eb7bf32eb58f37e3e4cd76861bf6783c53662de6dfd8e3f5e2e193ae49c2828ca8c70eaad512ae9c" size="107916327" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-linux-x86_64--13.5a3…" hashFunction="SHA512" hashValue="5d8408d9e6e701a3ba9ff4e697b55f23d86e6909aa406b23730772631893cb5b6ca8f472fa5a2ffa448bcbf055375afc0775ad82d583ee45a1a1d64e8a3db761" size="13991539" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.5a3-13.5a4-macos-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.5a4" appVersion="13.5a4" platformVersion="115.7.0" buildID="20240129155630" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-macos-13.5a4_ALL.mar" hashFunction="SHA512" hashValue="05aa6ee66d4dea52c6fec07d45cb0bc96dc813b3f86db418eb86ecf6dccd44e85c0fb1c7c2450d50b35b1ad8da0a7d16ed16f2083fef7e3e1135774ad278908b" size="115308515" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-macos--13.5a3-13.5a4…" hashFunction="SHA512" hashValue="bf3ef67f38db8d9bb85f07dc92c2ee3e70e767c1954c07e9538c1bb6a84a1c98ca1ce280977b78cf90154ceb96e68bb905667e01407de581e1d5556a2ccea26c" size="14099283" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.5a3-13.5a4-windows-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.5a4" appVersion="13.5a4" platformVersion="115.7.0" buildID="20240129155630" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-windows-x86_64-13.5a…" hashFunction="SHA512" hashValue="2681c3052302fa2e791e6c82d2ad48569d8f1622400bd433efe31e7757e8002c0f5c1f2930949f89ee059bc61b2cea2101d56b67f2c506eb6222a0ff709948f6" size="89263680" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-windows-x86_64--13.5…" hashFunction="SHA512" hashValue="55cd47c65f8c38296547bad978c4fae0e51733de4f7970e1ac9f4d01083ebdc06eecee506bf92f6eb2e64c476fa707c5af33ea0c7838acf44217b8706102471e" size="9557366" type="partial"></patch></update></updates>
=====================================
update_1/alpha/13.5a3-linux-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.5a3" appVersion="13.5a3" platformVersion="115.6.0" buildID="20231219113348" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-linux-x86_64-13.5a3_…" hashFunction="SHA512" hashValue="ad2914a4f0c2b78f7d740fc8d1077767e3c42f12857fbda706c87b5f52cb2e4a415aaa0e4e732764f2fe463ae335b73fe52db6943b02e50fafef11fc42864475" size="106795579" type="complete"></patch></update></updates>
=====================================
update_1/alpha/13.5a3-macos-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.5a3" appVersion="13.5a3" platformVersion="115.6.0" buildID="20231219113348" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-macos-13.5a3_ALL.mar" hashFunction="SHA512" hashValue="b3c91729bb0f42aab67440d4119f2574d917c501b0ee958d41eb36914acdf9c2ba40d1aa12755a84744b073941d4ccc1c792e86007fbe05fb545e53dd96aac5f" size="114855415" type="complete"></patch></update></updates>
=====================================
update_1/alpha/13.5a3-windows-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.5a3" appVersion="13.5a3" platformVersion="115.6.0" buildID="20231219113348" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a3" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-windows-x86_64-13.5a…" hashFunction="SHA512" hashValue="a6ce2a3d2ed55b42354f6559e9cf48f5971728d13f83070331bda042a114bb02d0e06b5dd7dad2db6fc3376ec152d0f92a7fb87d21cf00da398a9bb5577dc1f5" size="88815824" type="complete"></patch></update></updates>
=====================================
update_1/alpha/13.5a4-linux-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.5a4" appVersion="13.5a4" platformVersion="115.7.0" buildID="20240129155630" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-linux-x86_64-13.5a4_…" hashFunction="SHA512" hashValue="f4807be1248046f3115f381dbead91fdf8731f3f3ffc76a7eb7bf32eb58f37e3e4cd76861bf6783c53662de6dfd8e3f5e2e193ae49c2828ca8c70eaad512ae9c" size="107916327" type="complete"></patch></update></updates>
=====================================
update_1/alpha/13.5a4-macos-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.5a4" appVersion="13.5a4" platformVersion="115.7.0" buildID="20240129155630" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-macos-13.5a4_ALL.mar" hashFunction="SHA512" hashValue="05aa6ee66d4dea52c6fec07d45cb0bc96dc813b3f86db418eb86ecf6dccd44e85c0fb1c7c2450d50b35b1ad8da0a7d16ed16f2083fef7e3e1135774ad278908b" size="115308515" type="complete"></patch></update></updates>
=====================================
update_1/alpha/13.5a4-windows-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.5a4" appVersion="13.5a4" platformVersion="115.7.0" buildID="20240129155630" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.5a4" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-windows-x86_64-13.5a…" hashFunction="SHA512" hashValue="2681c3052302fa2e791e6c82d2ad48569d8f1622400bd433efe31e7757e8002c0f5c1f2930949f89ee059bc61b2cea2101d56b67f2c506eb6222a0ff709948f6" size="89263680" type="complete"></patch></update></updates>
=====================================
update_1/alpha/download-linux-x86_64.json
=====================================
@@ -1 +1 @@
-{"binary":"https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-linux-x86_64-13.5a3.…","git_tag":"mb-13.5a3-build1","sig":"https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-linux-x86_64-13.5a3.…","version":"13.5a3"}
\ No newline at end of file
+{"binary":"https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-linux-x86_64-13.5a4.…","git_tag":"mb-13.5a4-build1","sig":"https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-linux-x86_64-13.5a4.…","version":"13.5a4"}
\ No newline at end of file
=====================================
update_1/alpha/download-macos.json
=====================================
@@ -1 +1 @@
-{"binary":"https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-macos-13.5a3.dmg","git_tag":"mb-13.5a3-build1","sig":"https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-macos-13.5a3.dmg.asc","version":"13.5a3"}
\ No newline at end of file
+{"binary":"https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-macos-13.5a4.dmg","git_tag":"mb-13.5a4-build1","sig":"https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-macos-13.5a4.dmg.asc","version":"13.5a4"}
\ No newline at end of file
=====================================
update_1/alpha/download-windows-x86_64.json
=====================================
@@ -1 +1 @@
-{"binary":"https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-windows-x86_64-porta…","git_tag":"mb-13.5a3-build1","sig":"https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-windows-x86_64-porta…","version":"13.5a3"}
\ No newline at end of file
+{"binary":"https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-windows-x86_64-porta…","git_tag":"mb-13.5a4-build1","sig":"https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-windows-x86_64-porta…","version":"13.5a4"}
\ No newline at end of file
=====================================
update_1/alpha/downloads.json
=====================================
@@ -1 +1 @@
-{"downloads":{"linux-x86_64":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-linux-x86_64-13.5a3.…","sig":"https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-linux-x86_64-13.5a3.…"}},"macos":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-macos-13.5a3.dmg","sig":"https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-macos-13.5a3.dmg.asc"}},"win64":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-windows-x86_64-porta…","sig":"https://cdn.mullvad.net/browser/13.5a3/mullvad-browser-windows-x86_64-porta…"}}},"tag":"mb-13.5a3-build1","version":"13.5a3"}
\ No newline at end of file
+{"downloads":{"linux-x86_64":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-linux-x86_64-13.5a4.…","sig":"https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-linux-x86_64-13.5a4.…"}},"macos":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-macos-13.5a4.dmg","sig":"https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-macos-13.5a4.dmg.asc"}},"win64":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-windows-x86_64-porta…","sig":"https://cdn.mullvad.net/browser/13.5a4/mullvad-browser-windows-x86_64-porta…"}}},"tag":"mb-13.5a4-build1","version":"13.5a4"}
\ 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/tor-browser-build][main] 2 commits: Fixed indentation in README.
by Pier Angelo Vendrame (@pierov) 30 Jan '24
by Pier Angelo Vendrame (@pierov) 30 Jan '24
30 Jan '24
Pier Angelo Vendrame pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
81929890 by Pier Angelo Vendrame at 2024-01-30T10:34:43+01:00
Fixed indentation in README.
- - - - -
e486334e by NoisyCoil at 2024-01-30T10:34:51+01:00
Bug 41038: Add RPM dependencies to README.
Tested in Fedora 39.
- - - - -
1 changed file:
- README
Changes:
=====================================
README
=====================================
@@ -48,6 +48,17 @@ If you are running Debian or Ubuntu, you can install them with:
libtemplate-perl libxml-libxml-perl libxml-writer-perl \
libyaml-libyaml-perl git mercurial uidmap zstd
+If you are running Fedora, CentOS or RHEL, you can install them with:
+
+# dnf install "perl(YAML::XS)" "perl(File::Basename)" "perl(Getopt::Long)" \
+ "perl(Template)" "perl(IO::Handle)" "perl(IO::CaptureOutput)" \
+ "perl(JSON)" "perl(File::Temp)" "perl(Path::Tiny)" \
+ "perl(File::Path)" "perl(File::Slurp)" \
+ "perl(File::Copy::Recursive)" "perl(String::ShellQuote)"
+ "perl(Sort::Versions)" "perl(Digest::SHA)" "perl(Data::UUID)" \
+ "perl(Data::Dump)" "perl(DateTime)" "perl(XML::Writer)" \
+ "perl(Parallel::ForkManager)" perl-ph mercurial git zstd
+
If you are running an Arch based system, you should be able to install them with:
# pacman -S perl-datetime perl-path-tiny perl-yaml perl-yaml-libyaml \
@@ -228,10 +239,9 @@ be done with the following command:
# apt-get install build-essential python3 automake libtool zip unzip \
autoconf2.13 openjdk-11-jdk gettext-base autotools-dev \
- automake autoconf libtool autopoint libssl-dev \
- pkg-config zlib1g-dev libparallel-forkmanager-perl \
- libfile-slurp-perl bzip2 xz-utils apksigner yasm wget \
- bison gyp tcl python3-venv 7zip jq
+ automake autoconf libtool autopoint libssl-dev pkg-config \
+ zlib1g-dev libparallel-forkmanager-perl libfile-slurp-perl bzip2 \
+ xz-utils apksigner yasm wget bison gyp tcl python3-venv 7zip jq
Note that Debian Bullseye requires the bullseye-backports repository to
get the 7zip package.
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/tor-browser-build][main] Bug 41072: Set correct updater_url for Mullvad Browser nightly builds
by boklm (@boklm) 30 Jan '24
by boklm (@boklm) 30 Jan '24
30 Jan '24
boklm pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
f1ecbc88 by Nicolas Vigier at 2024-01-30T09:05:17+01:00
Bug 41072: Set correct updater_url for Mullvad Browser nightly builds
- - - - -
1 changed file:
- projects/firefox/config
Changes:
=====================================
projects/firefox/config
=====================================
@@ -89,6 +89,7 @@ targets:
branding_directory_prefix: 'mb'
gitlab_project: https://gitlab.torproject.org/tpo/applications/mullvad-browser
updater_url: 'https://cdn.mullvad.net/browser/update_responses/update_1/'
+ nightly_updates_publish_dir_prefix: mullvadbrowser-
linux-x86_64:
var:
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/f…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/f…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser-build][main] Bug 41073: Add required packages for container-less build
by boklm (@boklm) 30 Jan '24
by boklm (@boklm) 30 Jan '24
30 Jan '24
boklm pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
056eeab3 by Mynacol at 2024-01-30T08:38:35+01:00
Bug 41073: Add required packages for container-less build
jq and 7zip are both absolutely required, 7zip just recently.
bison, tcl, gyp and python3-venv are scattered around as dependency.
wget is also definitely required, but it's not available in a minimal
docker image.
Besides this, python3, not python2 is required, similarly jdk 11 instead
of 8.
- - - - -
1 changed file:
- README
Changes:
=====================================
README
=====================================
@@ -222,15 +222,19 @@ of containers: the container-image project is still called, but it will
just create an empty file instead of a real container image.
The build without containers is currently only supported for the Android
-builds, and will require that you run Debian Buster and install build
-dependencies for all the components that are built. This can be done
-with the following command:
+builds, and will require that you run Debian Bullseye or Bookworm and
+install build dependencies for all the components that are built. This can
+be done with the following command:
- # apt-get install build-essential python automake libtool zip unzip \
- autoconf2.13 openjdk-8-jdk gettext-base autotools-dev \
+ # apt-get install build-essential python3 automake libtool zip unzip \
+ autoconf2.13 openjdk-11-jdk gettext-base autotools-dev \
automake autoconf libtool autopoint libssl-dev \
pkg-config zlib1g-dev libparallel-forkmanager-perl \
- libfile-slurp-perl bzip2 xz-utils apksigner yasm
+ libfile-slurp-perl bzip2 xz-utils apksigner yasm wget \
+ bison gyp tcl python3-venv 7zip jq
+
+Note that Debian Bullseye requires the bullseye-backports repository to
+get the 7zip package.
Common Build Errors
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/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Add Tor integration and UI
by Dan Ballard (@dan) 30 Jan '24
by Dan Ballard (@dan) 30 Jan '24
30 Jan '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android
Commits:
faf7e9bd by clairehurst at 2024-01-29T16:07:17-07:00
fixup! Add Tor integration and UI
- - - - -
30 changed files:
- − fenix/app/src/beta/ic_launcher_monochrome-playstore.png
- − fenix/app/src/debug/ic_launcher-web.png
- − fenix/app/src/main/ic_launcher-web.png
- fenix/app/src/main/java/org/mozilla/fenix/experiments/view/ResearchSurfaceSurvey.kt
- − fenix/app/src/main/res/drawable-hdpi/ic_logo_wordmark_normal.png
- − fenix/app/src/main/res/drawable-hdpi/ic_logo_wordmark_private.png
- − fenix/app/src/main/res/drawable-hdpi/onboarding_default_browser.webp
- − fenix/app/src/main/res/drawable-hdpi/onboarding_notification.webp
- − fenix/app/src/main/res/drawable-hdpi/onboarding_sync.webp
- − fenix/app/src/main/res/drawable-ldrtl/onboarding_dark_theme.xml
- − fenix/app/src/main/res/drawable-ldrtl/onboarding_light_theme.xml
- − fenix/app/src/main/res/drawable-mdpi/ic_logo_wordmark_normal.png
- − fenix/app/src/main/res/drawable-mdpi/ic_logo_wordmark_private.png
- − fenix/app/src/main/res/drawable-night/ic_logo_wordmark_normal.xml
- − fenix/app/src/main/res/drawable-xhdpi/ic_logo_wordmark_normal.png
- − fenix/app/src/main/res/drawable-xhdpi/ic_logo_wordmark_private.png
- − fenix/app/src/main/res/drawable-xhdpi/onboarding_default_browser.webp
- − fenix/app/src/main/res/drawable-xhdpi/onboarding_notification.webp
- − fenix/app/src/main/res/drawable-xhdpi/onboarding_sync.webp
- − fenix/app/src/main/res/drawable-xxhdpi/ic_logo_wordmark_normal.png
- − fenix/app/src/main/res/drawable-xxhdpi/ic_logo_wordmark_private.png
- − fenix/app/src/main/res/drawable-xxhdpi/onboarding_default_browser.webp
- − fenix/app/src/main/res/drawable-xxhdpi/onboarding_notification.webp
- − fenix/app/src/main/res/drawable-xxhdpi/onboarding_sync.webp
- − fenix/app/src/main/res/drawable-xxxhdpi/ic_logo_wordmark_normal.png
- − fenix/app/src/main/res/drawable-xxxhdpi/ic_logo_wordmark_private.png
- − fenix/app/src/main/res/drawable/ic_firefox.xml
- − fenix/app/src/main/res/drawable/ic_launcher_monochrome.xml
- − fenix/app/src/main/res/drawable/ic_scan.xml
- − fenix/app/src/main/res/drawable/ic_wordmark_logo.png
The diff was not included because it is too large.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/faf…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/faf…
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] 4 commits: fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in...
by richard (@richard) 29 Jan '24
by richard (@richard) 29 Jan '24
29 Jan '24
richard pushed to branch tor-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
e16caa30 by Henry Wilkes at 2024-01-29T18:34:30+00:00
fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection
Bug 41913: Add basic validation to user provided bridge dialog, and a
confirmation step.
- - - - -
6fe742ee by Henry Wilkes at 2024-01-29T18:34:30+00:00
fixup! Tor Browser strings
Bug 41913: Add strings for user provided bridge dialog.
- - - - -
7abc2cc1 by Henry Wilkes at 2024-01-29T18:34:30+00:00
fixup! Bug 40597: Implement TorSettings module
Bug 41913: Add public validateBridgeLines method.
- - - - -
fd4565d1 by Henry Wilkes at 2024-01-29T18:34:30+00:00
fixup! Add TorStrings module for localization
Bug 41913: Remove old strings for user provided bridge addresses.
- - - - -
12 changed files:
- browser/components/preferences/preferences.xhtml
- + browser/components/torpreferences/content/bridgemoji/BridgeEmoji.js
- 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/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/preferences/preferences.xhtml
=====================================
@@ -70,6 +70,7 @@
<script type="module" src="chrome://global/content/elements/moz-support-link.mjs"/>
<script src="chrome://browser/content/migration/migration-wizard.mjs" type="module"></script>
<script type="module" src="chrome://global/content/elements/moz-toggle.mjs"/>
+ <script src="chrome://browser/content/torpreferences/bridgemoji/BridgeEmoji.js"/>
</head>
<html:body xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
=====================================
browser/components/torpreferences/content/bridgemoji/BridgeEmoji.js
=====================================
@@ -0,0 +1,199 @@
+"use strict";
+
+{
+ /**
+ * Element to display a single bridge emoji, with a localized name.
+ */
+ class BridgeEmoji extends HTMLElement {
+ static #activeInstances = new Set();
+ static #observer(subject, topic, data) {
+ if (topic === "intl:app-locales-changed") {
+ BridgeEmoji.#updateEmojiLangCode();
+ }
+ }
+
+ static #addActiveInstance(inst) {
+ if (this.#activeInstances.size === 0) {
+ Services.obs.addObserver(this.#observer, "intl:app-locales-changed");
+ this.#updateEmojiLangCode();
+ }
+ this.#activeInstances.add(inst);
+ }
+
+ static #removeActiveInstance(inst) {
+ this.#activeInstances.delete(inst);
+ if (this.#activeInstances.size === 0) {
+ Services.obs.removeObserver(this.#observer, "intl:app-locales-changed");
+ }
+ }
+
+ /**
+ * The language code for emoji annotations.
+ *
+ * null if unset.
+ *
+ * @type {string?}
+ */
+ static #emojiLangCode = null;
+ /**
+ * A promise that resolves to two JSON structures for bridge-emojis.json and
+ * annotations.json, respectively.
+ *
+ * @type {Promise}
+ */
+ static #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()),
+ ]);
+
+ static #unknownStringPromise = null;
+
+ /**
+ * Update #emojiLangCode.
+ */
+ static async #updateEmojiLangCode() {
+ let langCode;
+ const emojiAnnotations = (await BridgeEmoji.#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;
+ this.#unknownStringPromise = document.l10n.formatValue(
+ "tor-bridges-emoji-unknown"
+ );
+ for (const inst of this.#activeInstances) {
+ inst.update();
+ }
+ }
+ }
+
+ /**
+ * Update the bridge emoji to show their corresponding emoji with an
+ * annotation that matches the current locale.
+ */
+ async update() {
+ if (!this.#active) {
+ return;
+ }
+
+ if (!BridgeEmoji.#emojiLangCode) {
+ // No lang code yet, wait until it is updated.
+ return;
+ }
+
+ const doc = this.ownerDocument;
+ const [unknownString, [emojiList, emojiAnnotations]] = await Promise.all([
+ BridgeEmoji.#unknownStringPromise,
+ BridgeEmoji.#emojiPromise,
+ ]);
+
+ const emoji = emojiList[this.#index];
+ let emojiName;
+ if (!emoji) {
+ // Unexpected.
+ this.#img.removeAttribute("src");
+ } else {
+ const cp = emoji.codePointAt(0).toString(16);
+ this.#img.setAttribute(
+ "src",
+ `chrome://browser/content/torpreferences/bridgemoji/svgs/${cp}.svg`
+ );
+ emojiName = emojiAnnotations[BridgeEmoji.#emojiLangCode][cp];
+ }
+ if (!emojiName) {
+ doc.defaultView.console.error(`No emoji for index ${this.#index}`);
+ emojiName = unknownString;
+ }
+ doc.l10n.setAttributes(this, "tor-bridges-emoji-cell", {
+ emojiName,
+ });
+ }
+
+ /**
+ * The index for this bridge emoji.
+ *
+ * @type {integer?}
+ */
+ #index = null;
+ /**
+ * Whether we are active (i.e. in the DOM).
+ *
+ * @type {boolean}
+ */
+ #active = false;
+ /**
+ * The image element.
+ *
+ * @type {HTMLImgElement?}
+ */
+ #img = null;
+
+ constructor(index) {
+ super();
+ this.#index = index;
+ }
+
+ connectedCallback() {
+ if (!this.#img) {
+ this.#img = this.ownerDocument.createElement("img");
+ this.#img.classList.add("tor-bridges-emoji-icon");
+ this.#img.setAttribute("alt", "");
+ this.appendChild(this.#img);
+ }
+
+ this.#active = true;
+ BridgeEmoji.#addActiveInstance(this);
+ this.update();
+ }
+
+ disconnectedCallback() {
+ this.#active = false;
+ BridgeEmoji.#removeActiveInstance(this);
+ }
+
+ /**
+ * Create four bridge emojis for the given address.
+ *
+ * @param {string} bridgeLine - The bridge address.
+ *
+ * @returns {BridgeEmoji[4]} - The bridge emoji elements.
+ */
+ static createForAddress(bridgeLine) {
+ // JS uses UTF-16. While most of these emojis are surrogate pairs, a few
+ // ones fit one UTF-16 character. So we could not use neither indices,
+ // nor substr, nor some function to split the string.
+ // FNV-1a implementation that is compatible with other languages
+ const prime = 0x01000193;
+ const offset = 0x811c9dc5;
+ let hash = offset;
+ const encoder = new TextEncoder();
+ for (const byte of encoder.encode(bridgeLine)) {
+ hash = Math.imul(hash ^ byte, prime);
+ }
+
+ return [
+ ((hash & 0x7f000000) >> 24) | (hash < 0 ? 0x80 : 0),
+ (hash & 0x00ff0000) >> 16,
+ (hash & 0x0000ff00) >> 8,
+ hash & 0x000000ff,
+ ].map(index => new BridgeEmoji(index));
+ }
+ }
+
+ customElements.define("tor-bridge-emoji", BridgeEmoji);
+}
=====================================
browser/components/torpreferences/content/connectionPane.js
=====================================
@@ -299,12 +299,10 @@ const gBridgeGrid = {
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();
},
@@ -322,7 +320,6 @@ const gBridgeGrid = {
this._grid.classList.remove("grid-active");
- Services.obs.removeObserver(this, "intl:app-locales-changed");
Services.obs.removeObserver(this, TorProviderTopics.BridgeChanged);
},
@@ -337,9 +334,6 @@ const gBridgeGrid = {
this._updateRows();
}
break;
- case "intl:app-locales-changed":
- this._updateEmojiLangCode();
- break;
case TorProviderTopics.BridgeChanged:
this._updateConnectedBridge();
break;
@@ -573,97 +567,6 @@ const gBridgeGrid = {
}
},
- /**
- * 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.
*
@@ -688,23 +591,14 @@ const gBridgeGrid = {
};
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.
+ const BridgeEmoji = customElements.get("tor-bridge-emoji");
+ for (const cell of BridgeEmoji.createForAddress(bridgeLine)) {
+ // Each emoji is its own cell, we rely on the fact that createForAddress
+ // always returns four elements.
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 };
- });
+ emojiBlock.append(cell);
+ }
for (const [columnIndex, element] of row.element
.querySelectorAll(".tor-bridges-grid-cell")
@@ -735,7 +629,6 @@ const gBridgeGrid = {
this._initRowMenu(row);
this._updateRowStatus(row);
- this._updateRowEmojis(row);
return row;
},
@@ -1870,13 +1763,13 @@ const gBridgeSettings = {
"chrome://browser/content/torpreferences/provideBridgeDialog.xhtml",
{ mode },
result => {
- if (!result.bridgeStrings) {
+ if (!result.bridges?.length) {
return null;
}
return setTorSettings(() => {
TorSettings.bridges.enabled = true;
TorSettings.bridges.source = TorBridgeSource.UserProvided;
- TorSettings.bridges.bridge_strings = result.bridgeStrings;
+ TorSettings.bridges.bridge_strings = result.bridges;
});
}
);
@@ -2292,32 +2185,3 @@ const gConnectionPane = (function () {
};
return retval;
})(); /* gConnectionPane */
-
-/**
- * Convert the given bridgeString into an array of emoji indices between 0 and
- * 255.
- *
- * @param {string} bridgeString - The bridge string.
- *
- * @returns {integer[]} - A list of emoji indices between 0 and 255.
- */
-function makeBridgeId(bridgeString) {
- // JS uses UTF-16. While most of these emojis are surrogate pairs, a few
- // ones fit one UTF-16 character. So we could not use neither indices,
- // nor substr, nor some function to split the string.
- // FNV-1a implementation that is compatible with other languages
- const prime = 0x01000193;
- const offset = 0x811c9dc5;
- let hash = offset;
- const encoder = new TextEncoder();
- for (const byte of encoder.encode(bridgeString)) {
- hash = Math.imul(hash ^ byte, prime);
- }
-
- return [
- ((hash & 0x7f000000) >> 24) | (hash < 0 ? 0x80 : 0),
- (hash & 0x00ff0000) >> 16,
- (hash & 0x0000ff00) >> 8,
- hash & 0x000000ff,
- ];
-}
=====================================
browser/components/torpreferences/content/connectionPane.xhtml
=====================================
@@ -218,6 +218,7 @@
</html:div>
<html:div
id="tor-bridges-grid-display"
+ class="tor-bridges-grid"
role="grid"
aria-labelledby="tor-bridges-current-heading"
></html:div>
=====================================
browser/components/torpreferences/content/provideBridgeDialog.js
=====================================
@@ -4,14 +4,17 @@ const { TorStrings } = ChromeUtils.importESModule(
"resource://gre/modules/TorStrings.sys.mjs"
);
-const { TorSettings, TorBridgeSource } = ChromeUtils.importESModule(
- "resource://gre/modules/TorSettings.sys.mjs"
-);
+const { TorSettings, TorBridgeSource, validateBridgeLines } =
+ ChromeUtils.importESModule("resource://gre/modules/TorSettings.sys.mjs");
const { TorConnect, TorConnectTopics } = ChromeUtils.importESModule(
"resource://gre/modules/TorConnect.sys.mjs"
);
+const { TorParsers } = ChromeUtils.importESModule(
+ "resource://gre/modules/TorParsers.sys.mjs"
+);
+
const gProvideBridgeDialog = {
init() {
this._result = window.arguments[0];
@@ -33,72 +36,264 @@ const gProvideBridgeDialog = {
document.l10n.setAttributes(document.documentElement, titleId);
- 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"
- );
- });
-
- const pieces = TorStrings.settings.provideBridgeDescription.split("%S");
- document
- .getElementById("torPreferences-provideBridge-description")
- .replaceChildren(pieces[0], learnMore, pieces[1] || "");
+ document.l10n.setAttributes(
+ document.getElementById("user-provide-bridge-textarea-label"),
+ // TODO change string when we can also accept Lox share codes.
+ "user-provide-bridge-dialog-textarea-addresses-label"
+ );
- this._textarea = document.getElementById(
- "torPreferences-provideBridge-textarea"
+ this._dialog = document.getElementById("user-provide-bridge-dialog");
+ this._acceptButton = this._dialog.getButton("accept");
+ this._textarea = document.getElementById("user-provide-bridge-textarea");
+ this._errorEl = document.getElementById(
+ "user-provide-bridge-error-message"
+ );
+ this._resultDescription = document.getElementById(
+ "user-provide-result-description"
+ );
+ this._bridgeGrid = document.getElementById(
+ "user-provide-bridge-grid-display"
);
- this._textarea.setAttribute(
- "placeholder",
- TorStrings.settings.provideBridgePlaceholder
+ this._rowTemplate = document.getElementById(
+ "user-provide-bridge-row-template"
);
- this._textarea.addEventListener("input", () => this.onValueChange());
- if (TorSettings.bridges.source == TorBridgeSource.UserProvided) {
- this._textarea.value = TorSettings.bridges.bridge_strings.join("\n");
+ if (mode === "edit") {
+ // Only expected if the bridge source is UseProvided, but verify to be
+ // sure.
+ if (TorSettings.bridges.source == TorBridgeSource.UserProvided) {
+ this._textarea.value = TorSettings.bridges.bridge_strings.join("\n");
+ }
+ } else {
+ // Set placeholder if not editing.
+ document.l10n.setAttributes(
+ this._textarea,
+ // TODO: change string when we can also accept Lox share codes.
+ "user-provide-bridge-dialog-textarea-addresses"
+ );
}
- const dialog = document.getElementById(
- "torPreferences-provideBridge-dialog"
- );
- dialog.addEventListener("dialogaccept", e => {
- this._result.accepted = true;
- });
+ this._textarea.addEventListener("input", () => this.onValueChange());
- this._acceptButton = dialog.getButton("accept");
+ this._dialog.addEventListener("dialogaccept", event =>
+ this.onDialogAccept(event)
+ );
Services.obs.addObserver(this, TorConnectTopics.StateChange);
- this.onValueChange();
- this.onAcceptStateChange();
+ this.setPage("entry");
+ this.checkValue();
},
uninit() {
Services.obs.removeObserver(this, TorConnectTopics.StateChange);
},
+ /**
+ * Set the page to display.
+ *
+ * @param {string} page - The page to show.
+ */
+ setPage(page) {
+ this._page = page;
+ this._dialog.classList.toggle("show-entry-page", page === "entry");
+ this._dialog.classList.toggle("show-result-page", page === "result");
+ if (page === "entry") {
+ this._textarea.focus();
+ } else {
+ // Move focus to the <xul:window> element.
+ // In particular, we do not want to keep the focus on the (same) accept
+ // button (with now different text).
+ document.documentElement.focus();
+ }
+
+ this.updateAcceptDisabled();
+ this.onAcceptStateChange();
+ },
+
+ /**
+ * Callback for whenever the input value changes.
+ */
onValueChange() {
- // TODO: Do some proper value parsing and error reporting. See
- // tor-browser#40552.
- const value = this._textarea.value.trim();
- this._acceptButton.disabled = !value;
- this._result.bridgeStrings = value;
+ this.updateAcceptDisabled();
+ // Reset errors whenever the value changes.
+ this.updateError(null);
},
+ /**
+ * Callback for whenever the accept button may need to change.
+ */
onAcceptStateChange() {
- const connect = TorConnect.canBeginBootstrap;
- this._result.connect = connect;
-
- this._acceptButton.setAttribute(
- "label",
- connect
- ? TorStrings.settings.bridgeButtonConnect
- : TorStrings.settings.bridgeButtonAccept
+ if (this._page === "entry") {
+ document.l10n.setAttributes(
+ this._acceptButton,
+ "user-provide-bridge-dialog-next-button"
+ );
+ this._result.connect = false;
+ } else {
+ this._acceptButton.removeAttribute("data-l10n-id");
+ const connect = TorConnect.canBeginBootstrap;
+ this._result.connect = connect;
+
+ this._acceptButton.setAttribute(
+ "label",
+ connect
+ ? TorStrings.settings.bridgeButtonConnect
+ : TorStrings.settings.bridgeButtonAccept
+ );
+ }
+ },
+
+ /**
+ * Callback for whenever the accept button's might need to be disabled.
+ */
+ updateAcceptDisabled() {
+ this._acceptButton.disabled =
+ this._page === "entry" && validateBridgeLines(this._textarea.value).empty;
+ },
+
+ /**
+ * Callback for when the accept button is pressed.
+ *
+ * @param {Event} event - The dialogaccept event.
+ */
+ onDialogAccept(event) {
+ if (this._page === "result") {
+ this._result.accepted = true;
+ // Continue to close the dialog.
+ return;
+ }
+ // Prevent closing the dialog.
+ event.preventDefault();
+
+ const bridges = this.checkValue();
+ if (!bridges.length) {
+ // Not valid
+ return;
+ }
+ this._result.bridges = bridges;
+ this.updateResult();
+ this.setPage("result");
+ },
+
+ /**
+ * The current timeout for updating the error.
+ *
+ * @type {integer?}
+ */
+ _updateErrorTimeout: null,
+
+ /**
+ * Update the displayed error.
+ *
+ * @param {object?} error - The error to show, or null if no error should be
+ * shown. Should include the "type" property.
+ */
+ updateError(error) {
+ // First clear the existing error.
+ if (this._updateErrorTimeout !== null) {
+ clearTimeout(this._updateErrorTimeout);
+ }
+ this._updateErrorTimeout = null;
+ this._errorEl.removeAttribute("data-l10n-id");
+ this._errorEl.textContent = "";
+ if (error) {
+ this._textarea.setAttribute("aria-invalid", "true");
+ } else {
+ this._textarea.removeAttribute("aria-invalid");
+ }
+ this._textarea.classList.toggle("invalid-input", !!error);
+ this._errorEl.classList.toggle("show-error", !!error);
+
+ if (!error) {
+ return;
+ }
+
+ let errorId;
+ let errorArgs;
+ switch (error.type) {
+ case "invalid-address":
+ errorId = "user-provide-bridge-dialog-address-error";
+ errorArgs = { line: error.line };
+ break;
+ }
+
+ // 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.
+ this._updateErrorTimeout = setTimeout(() => {
+ document.l10n.setAttributes(this._errorEl, errorId, errorArgs);
+ }, 500);
+ },
+
+ /**
+ * Check the current value in the textarea.
+ *
+ * @returns {string[]} - The bridge addresses, if the entry is valid.
+ */
+ checkValue() {
+ let bridges = [];
+ let error = null;
+ const validation = validateBridgeLines(this._textarea.value);
+ if (!validation.empty) {
+ // If empty, we just disable the button, rather than show an error.
+ if (validation.errorLines.length) {
+ // Report first error.
+ error = {
+ type: "invalid-address",
+ line: validation.errorLines[0],
+ };
+ } else {
+ bridges = validation.validBridges;
+ }
+ }
+ this.updateError(error);
+ return bridges;
+ },
+
+ /**
+ * Update the shown result on the last page.
+ */
+ updateResult() {
+ document.l10n.setAttributes(
+ this._resultDescription,
+ // TODO: Use a different id when added through Lox invite.
+ "user-provide-bridge-dialog-result-addresses"
);
+
+ this._bridgeGrid.replaceChildren();
+
+ for (const bridgeLine of this._result.bridges) {
+ let details;
+ try {
+ details = TorParsers.parseBridgeLine(bridgeLine);
+ } catch (e) {
+ console.error(`Detected invalid bridge line: ${bridgeLine}`, e);
+ }
+
+ const rowEl = this._rowTemplate.content.children[0].cloneNode(true);
+
+ const emojiBlock = rowEl.querySelector(".tor-bridges-emojis-block");
+ const BridgeEmoji = customElements.get("tor-bridge-emoji");
+ for (const cell of BridgeEmoji.createForAddress(bridgeLine)) {
+ // Each emoji is its own cell, we rely on the fact that createForAddress
+ // always returns four elements.
+ cell.setAttribute("role", "gridcell");
+ cell.classList.add("tor-bridges-grid-cell", "tor-bridges-emoji-cell");
+ emojiBlock.append(cell);
+ }
+
+ // TODO: properly handle "vanilla" bridges?
+ document.l10n.setAttributes(
+ rowEl.querySelector(".tor-bridges-type-cell"),
+ "tor-bridges-type-prefix",
+ { type: details?.transport ?? "vanilla" }
+ );
+
+ rowEl.querySelector(".tor-bridges-address-cell").textContent = bridgeLine;
+
+ this._bridgeGrid.append(rowEl);
+ }
},
observe(subject, topic, data) {
=====================================
browser/components/torpreferences/content/provideBridgeDialog.xhtml
=====================================
@@ -8,22 +8,77 @@
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:html="http://www.w3.org/1999/xhtml"
>
- <dialog id="torPreferences-provideBridge-dialog" buttons="accept,cancel">
+ <dialog
+ id="user-provide-bridge-dialog"
+ buttons="accept,cancel"
+ class="show-entry-page"
+ >
<linkset>
<html:link rel="localization" href="browser/tor-browser.ftl" />
</linkset>
+ <script src="chrome://browser/content/torpreferences/bridgemoji/BridgeEmoji.js" />
<script src="chrome://browser/content/torpreferences/provideBridgeDialog.js" />
- <description>
- <html:div id="torPreferences-provideBridge-description"
- >​<br />​</html:div
- >
- </description>
- <html:textarea
- id="torPreferences-provideBridge-textarea"
- multiline="true"
- rows="3"
- />
+ <html:div id="user-provide-bridge-entry-page">
+ <description id="user-provide-bridge-description">
+ <html:span
+ class="tail-with-learn-more"
+ data-l10n-id="user-provide-bridge-dialog-description"
+ ></html:span>
+ <label
+ is="text-link"
+ class="learnMore text-link"
+ href="about:manual#bridges"
+ useoriginprincipal="true"
+ data-l10n-id="user-provide-bridge-dialog-learn-more"
+ />
+ </description>
+ <html:label
+ id="user-provide-bridge-textarea-label"
+ for="user-provide-bridge-textarea"
+ ></html:label>
+ <html:textarea
+ id="user-provide-bridge-textarea"
+ multiline="true"
+ rows="3"
+ aria-describedby="user-provide-bridge-description"
+ aria-errormessage="user-provide-bridge-error-message"
+ />
+ <html:div id="user-provide-bridge-message-area">
+ <html:span
+ id="user-provide-bridge-error-message"
+ aria-live="assertive"
+ ></html:span>
+ </html:div>
+ </html:div>
+ <html:div id="user-provide-bridge-result-page">
+ <description id="user-provide-result-description" />
+ <!-- NOTE: Unlike #tor-bridge-grid-display, this element is not
+ - interactive, and not a tab-stop. So we use the "table" role rather
+ - than "grid".
+ - NOTE: Using a <html:table> would not allow us the same structural
+ - freedom, so we use a generic div and add the semantics manually. -->
+ <html:div
+ id="user-provide-bridge-grid-display"
+ class="tor-bridges-grid"
+ role="table"
+ ></html:div>
+ <html:template id="user-provide-bridge-row-template">
+ <html:div class="tor-bridges-grid-row" role="row">
+ <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>
+ </html:div>
+ </html:template>
+ </html:div>
</dialog>
</window>
=====================================
browser/components/torpreferences/content/torPreferences.css
=====================================
@@ -270,11 +270,14 @@
grid-area: description;
}
-#tor-bridges-grid-display {
+.tor-bridges-grid {
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;
+ /* For #tor-bridges-grid-display we want each grid item to have the same
+ * height so that their focus outlines match. */
+ align-items: stretch;
}
#tor-bridges-grid-display:not(.grid-active) {
@@ -283,11 +286,12 @@
.tor-bridges-grid-row {
/* We want each row to act as a row of three items in the
- * #tor-bridges-grid-display grid layout.
+ * .tor-bridges-grid 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.
+ * which are outside the .tor-bridges-grid-cell's border area.
+ *
+ * For #tor-bridges-grid-display this should ensure 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.
*
@@ -311,7 +315,8 @@
padding-block: 8px;
}
-.tor-bridges-grid-cell:focus-visible {
+#tor-bridges-grid-display .tor-bridges-grid-cell:focus-visible {
+ /* #tor-bridges-grid-display has focus management for its cells. */
outline: var(--in-content-focus-outline);
outline-offset: var(--in-content-focus-outline-offset);
}
@@ -662,8 +667,77 @@ groupbox#torPreferences-bridges-group textarea {
}
/* Provide bridge dialog */
-#torPreferences-provideBridge-textarea {
- margin-top: 16px;
+
+#user-provide-bridge-dialog:not(.show-entry-page) #user-provide-bridge-entry-page {
+ display: none;
+}
+
+#user-provide-bridge-dialog:not(.show-result-page) #user-provide-bridge-result-page {
+ display: none;
+}
+
+#user-provide-bridge-entry-page {
+ flex: 1 0 auto;
+ display: flex;
+ flex-direction: column;
+}
+
+#user-provide-bridge-description {
+ flex: 0 0 auto;
+}
+
+#user-provide-bridge-textarea-label {
+ margin-block: 16px 6px;
+ flex: 0 0 auto;
+ align-self: start;
+}
+
+#user-provide-bridge-textarea {
+ flex: 1 0 auto;
+ align-self: stretch;
+ line-height: 1.3;
+ margin: 0;
+}
+
+#user-provide-bridge-message-area {
+ flex: 0 0 auto;
+ margin-block: 8px 12px;
+ align-self: end;
+}
+
+#user-provide-bridge-message-area::after {
+ /* Zero width space, to ensure we are always one line high. */
+ content: "\200B";
+}
+
+#user-provide-bridge-textarea.invalid-input {
+ border-color: var(--in-content-danger-button-background);
+ outline-color: var(--in-content-danger-button-background);
+}
+
+#user-provide-bridge-error-message {
+ color: var(--in-content-error-text-color);
+}
+
+#user-provide-bridge-error-message.not(.show-error) {
+ display: none;
+}
+
+#user-provide-bridge-result-page {
+ flex: 1 1 0;
+ min-height: 0;
+ display: flex;
+ flex-direction: column;
+}
+
+#user-provide-result-description {
+ flex: 0 0 auto;
+}
+
+#user-provide-bridge-grid-display {
+ flex: 0 1 auto;
+ overflow: auto;
+ margin-block: 8px;
}
/* Connection settings dialog */
=====================================
browser/components/torpreferences/jar.mn
=====================================
@@ -22,6 +22,7 @@ browser.jar:
content/browser/torpreferences/connectionPane.xhtml (content/connectionPane.xhtml)
content/browser/torpreferences/torPreferences.css (content/torPreferences.css)
content/browser/torpreferences/bridge-qr-onion-mask.svg (content/bridge-qr-onion-mask.svg)
+ content/browser/torpreferences/bridgemoji/BridgeEmoji.js (content/bridgemoji/BridgeEmoji.js)
content/browser/torpreferences/bridgemoji/bridge-emojis.json (content/bridgemoji/bridge-emojis.json)
content/browser/torpreferences/bridgemoji/annotations.json (content/bridgemoji/annotations.json)
content/browser/torpreferences/bridgemoji/svgs/ (content/bridgemoji/svgs/*.svg)
=====================================
browser/locales/en-US/browser/tor-browser.ftl
=====================================
@@ -176,3 +176,19 @@ user-provide-bridge-dialog-add-title =
# Used when the user is replacing their existing bridges with new ones.
user-provide-bridge-dialog-replace-title =
.title = Replace your bridges
+# Description shown when adding new bridges, replacing existing bridges, or editing existing bridges.
+user-provide-bridge-dialog-description = Use bridges provided by a trusted organisation or someone you know.
+# "Learn more" link shown in the "Add new bridges"/"Replace your bridges" dialog.
+user-provide-bridge-dialog-learn-more = Learn more
+# Short accessible name for the bridge addresses text area.
+user-provide-bridge-dialog-textarea-addresses-label = Bridge addresses
+# Placeholder shown when adding new bridge addresses.
+user-provide-bridge-dialog-textarea-addresses =
+ .placeholder = Paste your bridge addresses here
+# Error shown when one of the address lines is invalid.
+# $line (Number) - The line number for the invalid address.
+user-provide-bridge-dialog-address-error = Incorrectly formatted bridge address on line { $line }.
+
+user-provide-bridge-dialog-result-addresses = The following bridges were entered by you.
+user-provide-bridge-dialog-next-button =
+ .label = Next
=====================================
toolkit/modules/TorSettings.sys.mjs
=====================================
@@ -9,6 +9,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
TorProviderBuilder: "resource://gre/modules/TorProviderBuilder.sys.mjs",
TorProviderTopics: "resource://gre/modules/TorProviderBuilder.sys.mjs",
Lox: "resource://gre/modules/Lox.sys.mjs",
+ TorParsers: "resource://gre/modules/TorParsers.sys.mjs",
});
ChromeUtils.defineLazyGetter(lazy, "logger", () => {
@@ -103,26 +104,61 @@ export const TorProxyType = Object.freeze({
* 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.
+ * We split the text by \r\n, we trim the lines, remove the bridge prefix.
*
- * @param {string} aBridgeStrings The text with the lines
+ * @param {string} bridgeLines 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");
-
+function splitBridgeLines(bridgeLines) {
// 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 !== "");
+ // Replace whitespace with standard " ".
+ // NOTE: We only remove the bridge string part if it is followed by a
+ // non-whitespace.
+ return bridgeLines.split(/\r?\n/).map(val =>
+ val
+ .trim()
+ .replace(/^bridge\s+(\S)/i, "$1")
+ .replace(/\s+/, " ")
+ );
+}
+
+/**
+ * @typedef {Object} BridgeValidationResult
+ *
+ * @property {integer[]} errorLines - The lines that contain errors. Counting
+ * from 1.
+ * @property {boolean} empty - Whether the given string contains no bridges.
+ * @property {string[]} validBridges - The valid bridge lines found.
+ */
+/**
+ * Validate the given bridge lines.
+ *
+ * @param {string} bridgeLines - The bridge lines to validate, separated by
+ * newlines.
+ *
+ * @returns {BridgeValidationResult}
+ */
+export function validateBridgeLines(bridgeLines) {
+ let empty = true;
+ const errorLines = [];
+ const validBridges = [];
+ for (const [index, bridge] of splitBridgeLines(bridgeLines).entries()) {
+ if (!bridge) {
+ // Empty line.
+ continue;
+ }
+ empty = false;
+ try {
+ // TODO: Have a more comprehensive validation parser.
+ lazy.TorParsers.parseBridgeLine(bridge);
+ } catch {
+ errorLines.push(index + 1);
+ continue;
+ }
+ validBridges.push(bridge);
+ }
+ return { empty, errorLines, validBridges };
}
/**
@@ -269,7 +305,8 @@ class TorSettingsImpl {
if (Array.isArray(val)) {
return [...val];
}
- return parseBridgeStrings(val);
+ // Split the bridge strings, discarding empty.
+ return splitBridgeLines(val).filter(val => val);
},
copy: val => [...val],
equal: (val1, val2) => this.#arrayEqual(val1, val2),
=====================================
toolkit/modules/TorStrings.sys.mjs
=====================================
@@ -139,10 +139,6 @@ const Loader = {
solveTheCaptcha: "Solve the CAPTCHA to request a bridge.",
captchaTextboxPlaceholder: "Enter the characters from the image",
incorrectCaptcha: "The solution is not correct. Please try again.",
- // Provide bridge dialog
- 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)",
// Connection settings dialog
connectionSettingsDialogTitle: "Connection Settings",
connectionSettingsDialogHeader:
=====================================
toolkit/torbutton/chrome/locale/en-US/settings.properties
=====================================
@@ -75,10 +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.
-# 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)
-
# Connection settings dialog
settings.connectionSettingsDialogTitle=Connection Settings
settings.connectionSettingsDialogHeader=Configure how Tor Browser connects to the Internet
@@ -126,3 +122,6 @@ settings.bridgeAddManually=Add a Bridge Manually…
# 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)
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/366c81…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/366c81…
You're receiving this email because of your account on gitlab.torproject.org.
1
0