lists.torproject.org
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

tbb-commits

Thread Start a new thread
Download
Threads by month
  • ----- 2025 -----
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2021 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2020 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2019 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2018 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2017 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2016 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2015 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2014 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
tbb-commits@lists.torproject.org

  • 1 participants
  • 18691 discussions
[Git][tpo/applications/tor-browser-build] Pushed new tag mb-13.5a8-build1
by richard (@richard) 16 May '24

16 May '24
richard pushed new tag mb-13.5a8-build1 at The Tor Project / Applications / tor-browser-build -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/tree/mb-… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build] Pushed new tag tbb-13.5a8-build1
by richard (@richard) 16 May '24

16 May '24
richard pushed new tag tbb-13.5a8-build1 at The Tor Project / Applications / tor-browser-build -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/tree/tbb… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] Bug 41125, 41131: Tor, Mullvad Browser 13.5a8 Release Prep
by richard (@richard) 16 May '24

16 May '24
richard pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 6ffbf30c by Richard Pospesel at 2024-05-16T13:09:54+00:00 Bug 41125,41131: Tor,Mullvad Browser 13.5a8 Release Prep - - - - - 10 changed files: - projects/browser/Bundle-Data/Docs-MB/ChangeLog.txt - projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt - projects/browser/allowed_addons.json - projects/firefox-android/config - projects/firefox/config - projects/geckoview/config - projects/go/config - projects/manual/config - projects/translation/config - rbm.conf Changes: ===================================== projects/browser/Bundle-Data/Docs-MB/ChangeLog.txt ===================================== @@ -1,3 +1,48 @@ +Mullvad Browser 13.5a8 - May 16 2024 + * All Platforms + * Updated Firefox to 115.11.0esr + * Bug 222: Hide "List all tabs" when the tabs don't overflow [mullvad-browser] + * Bug 241: Move network.proxy.failover_direct=false pref to base-browser [mullvad-browser] + * Bug 284: Should we reflect the actual channel in about:debugging? [mullvad-browser] + * Bug 290: Add default bookmarks in the alpha channels for testing [mullvad-browser] + * Bug 297: Rebase Mullvad Browser alpha onto 115.11.0esr [mullvad-browser] + * Bug 41930: intl.accept_languages gets into a stuck modifed state [tor-browser] + * Bug 42391: IndexDB's private directory not removed on browser shutdown in global private browsing mode [tor-browser] + * Bug 42405: Fix betterboxing + findbar horizontal bounce if the scrollbar is not an overlay [tor-browser] + * Bug 42565: Backport Android and desktop security fixes from Firefox 126 [tor-browser] + * Bug 42574: Exempt pdf.js from letterboxing [tor-browser] + * Bug 42583: Modify moz-support-link [tor-browser] + * Windows + macOS + * Bug 41405: Win ≤8.1 and macOS ≤10.14 not supported in ESR 128 [tor-browser] + * Bug 42347: Add a banner warning users about the upcoming EOL for Win ≤8.1 and macOS ≤10.14 [tor-browser] + * Windows + * Bug 278: Create asset(s) for the Mullvad Browser installer [mullvad-browser] + * Linux + * Bug 28: deb installation package for Linux [mullvad-browser] + * Bug 295: Filepicker string chars are tofu for the .deb package in Ubuntu 22.04 / Debian 11 [mullvad-browser] + * Bug 41135: 13.5a7's start-tor-browser seems to break KeePassXC-Browser? [tor-browser-build] + * Bug 41136: Include *.deb in the list of files to gpg sign [tor-browser-build] + * Build System + * All Platforms + * Bug 41001: Create Release Prep MR generating script [tor-browser-build] + * Bug 41148: Update projects/browser/Bundle-Data/Docs/Licenses/NoScript.txt [tor-browser-build] + * Bug 40076: Correctly refresh file when computing input_files_id and a file is set as refresh_input [rbm] + * Windows + * Bug 200: Build system installer for Mullvad Browser on Windows [mullvad-browser] + +Mullvad Browser 13.0.15 - May 15 2024 + * All Platforms + * Updated Firefox to 115.11.0esr + * Bug 296: Rebase Mullvad Browser stable onto 115.10.0esr [mullvad-browser] + * Bug 42391: IndexDB's private directory not removed on browser shutdown in global private browsing mode [tor-browser] + * Bug 42532: Use the HomePage module for new identity checks [tor-browser] + * Bug 42565: Backport Android and desktop security fixes from Firefox 126 [tor-browser] + * Build System + * All Platforms + * Bug 41122: Add release date to rbm.conf [tor-browser-build] + * macOS + * Bug 42535: mac: app change to ja doesn't apply ja translations to most (all?) chrome [tor-browser] + Mullvad Browser 13.5a7 - April 25 2024 * All Platforms * Updated Firefox to 115.10.0esr ===================================== projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt ===================================== @@ -1,3 +1,67 @@ +Tor Browser 13.5a8 - May 16 2024 + * All Platforms + * Bug 42290: "DuckDuckGoOnion" is a weird naming format for onion search engines [tor-browser] + * Bug 42549: Remove brand.dtd [tor-browser] + * Bug 42560: Rebase Tor Browser alpha onto 115.11.0esr [tor-browser] + * Bug 42565: Backport Android and desktop security fixes from Firefox 126 [tor-browser] + * Bug 42583: Modify moz-support-link [tor-browser] + * Bug 41137: Build gcc-cross and tor-expert-bundle for linux-aarch64 [tor-browser-build] + * Bug 241: Move network.proxy.failover_direct=false pref to base-browser [mullvad-browser] + * Windows + macOS + Linux + * Updated Firefox to 115.11.0esr + * Bug 41621: Tweak about:torconnect styling [tor-browser] + * Bug 41930: intl.accept_languages gets into a stuck modifed state [tor-browser] + * Bug 42391: IndexDB's private directory not removed on browser shutdown in global private browsing mode [tor-browser] + * Bug 42405: Fix betterboxing + findbar horizontal bounce if the scrollbar is not an overlay [tor-browser] + * Bug 42541: Circuit Display does not work when using Conjure pluggable transport [tor-browser] + * Bug 42542: Quirks when onion authentication prompt is shared between two tabs [tor-browser] + * Bug 42557: Fix regression in Onion Services authentication prompt focus [tor-browser] + * Bug 42573: Tweak language notification to avoid formatValue [tor-browser] + * Bug 42574: Exempt pdf.js from letterboxing [tor-browser] + * Windows + macOS + * Bug 41405: Win ≤8.1 and macOS ≤10.14 not supported in ESR 128 [tor-browser] + * Bug 42347: Add a banner warning users about the upcoming EOL for Win ≤8.1 and macOS ≤10.14 [tor-browser] + * Linux + * Bug 41136: Include *.deb in the list of files to gpg sign [tor-browser-build] + * Android + * Updated GeckoView to 115.11.0esr + * Bug 42317: Update "Security Settings" menu item [tor-browser] + * Bug 42409: TTP-03-011 WP3: Potential DoS due to Deep Link abuse [tor-browser] + * Bug 42552: TBA: formatting APIs are en-US only [tor-browser] + * Bug 42562: Restrict the accepted languages to the ones whose localization is available [tor-browser] + * Bug 42566: Remove 'Enable beta connection features' menu item in stable release channel [tor-browser] + * Bug 42567: Remove 'Enable beta connection features' toggle [tor-browser] + * Bug 42571: The new bootstrap on Android breaks if the browser goes in background [tor-browser] + * Bug 42576: Backport Bug 1885171: use the private keyboard for prompts on Android [tor-browser] + * Bug 42578: Reject Android "open in Tor Browser" intent [tor-browser] + * Bug 42582: Accepted languages should use id and he on Android [tor-browser] + * Bug 41143: Enable multi-locales also on GeckoView [tor-browser-build] + * Build System + * All Platforms + * Updated Go to 1.21.10 + * Bug 41001: Create Release Prep MR generating script [tor-browser-build] + * Bug 41148: Update projects/browser/Bundle-Data/Docs/Licenses/NoScript.txt [tor-browser-build] + * Bug 40076: Correctly refresh file when computing input_files_id and a file is set as refresh_input [rbm] + * Android + * Bug 42568: Remove legacy tor dependencies from firefox-android [tor-browser] + +Tor Browser 13.0.15 - May 14 2024 + * All Platforms + * Bug 42559: Rebase Tor Browser stable onto 115.11.0esr [tor-browser] + * Windows + macOS + Linux + * Updated Firefox to 115.11.0esr + * Bug 42391: IndexDB's private directory not removed on browser shutdown in global private browsing mode [tor-browser] + * Bug 42532: Use the HomePage module for new identity checks [tor-browser] + * Bug 42557: Fix regression in Onion Services authentication prompt focus [tor-browser] + * Bug 42565: Backport Android and desktop security fixes from Firefox 126 [tor-browser] + * Android + * Updated GeckoView to 115.11.0esr + * Bug 42195: Fix "What's new" URL to direct to latest version [tor-browser] + * Bug 42562: Restrict the accepted languages to the ones whose localization is available [tor-browser] + * Build System + * macOS + * Bug 42535: mac: app change to ja doesn't apply ja translations to most (all?) chrome [tor-browser] + Tor Browser 13.5a7 - April 25 2024 * All Platforms * Updated Tor to 0.4.8.11 ===================================== projects/browser/allowed_addons.json ===================================== Binary files a/projects/browser/allowed_addons.json and b/projects/browser/allowed_addons.json differ ===================================== projects/firefox-android/config ===================================== @@ -16,7 +16,7 @@ container: var: fenix_version: 115.2.1 browser_branch: 13.5-1 - browser_build: 9 + browser_build: 10 variant: Beta # This should be updated when the list of gradle dependencies is changed. gradle_dependencies_version: 1 ===================================== projects/firefox/config ===================================== @@ -19,7 +19,7 @@ var: browser_series: '13.5' browser_rebase: 1 browser_branch: '[% c("var/browser_series") %]-[% c("var/browser_rebase") %]' - browser_build: 1 + browser_build: 2 branding_directory_prefix: 'tb' copyright_year: '[% exec("git show -s --format=%ci").remove("-.*") %]' nightly_updates_publish_dir: '[% c("var/nightly_updates_publish_dir_prefix") %]nightly-[% c("var/osname") %]' ===================================== projects/geckoview/config ===================================== @@ -16,7 +16,7 @@ container: var: geckoview_version: 115.11.0esr browser_branch: 13.5-1 - browser_build: 1 + browser_build: 2 copyright_year: '[% exec("git show -s --format=%ci").remove("-.*") %]' gitlab_project: https://gitlab.torproject.org/tpo/applications/tor-browser git_commit: '[% exec("git rev-parse HEAD") %]' ===================================== projects/go/config ===================================== @@ -7,7 +7,7 @@ container: var: use_go_1_20: 0 - go_1_21: 1.21.9 + go_1_21: 1.21.10 go_1_20: 1.20.14 no_crosscompile: 1 setup: | @@ -131,7 +131,7 @@ input_files: enable: '[% ! c("var/linux") %]' - URL: 'https://go.dev/dl/go[% c("var/go_1_21") %].src.tar.gz' name: go - sha256sum: 58f0c5ced45a0012bce2ff7a9df03e128abcc8818ebabe5027bb92bafe20e421 + sha256sum: 900e0afe8900c1ee65a8a8c4f0c5a3ca02dcf85c1d1cb13a652be22c21399394 enable: '[% !c("var/use_go_1_20") %]' - URL: 'https://go.dev/dl/go[% c("var/go_1_20") %].src.tar.gz' name: go ===================================== projects/manual/config ===================================== @@ -1,7 +1,7 @@ # vim: filetype=yaml sw=2 # To update, see doc/how-to-update-the-manual.txt # Remember to update also the package's hash, with the version! -version: 161678 +version: 168690 filename: 'manual-[% c("version") %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]' container: use_container: 1 @@ -23,6 +23,6 @@ input_files: - project: container-image - URL: 'https://build-sources.tbb.torproject.org/manual_[% c("version") %].zip' name: manual - sha256sum: 5ceaec926295a62a946f41ec2e270dfd9d8d2fb3b57d11700ab67ed982ccc6e8 + sha256sum: f2abffe1471ae63046cff06b853685c6614e117cc67bdf51228dc0792344441c - filename: packagemanual.py name: package_script ===================================== projects/translation/config ===================================== @@ -12,13 +12,13 @@ compress_tar: 'gz' steps: base-browser: base-browser: '[% INCLUDE build %]' - git_hash: 76f037ba6fb13fdae3604f2ae4cdf6fcd284812a + git_hash: 02d2dc0ff0ec101c63a125646c3e92cfa80c0b20 targets: nightly: git_hash: 'base-browser' tor-browser: tor-browser: '[% INCLUDE build %]' - git_hash: 03ef36ed51d2ef339c673c607097eb3a4472120c + git_hash: c41ffa18b5fc7e7d40cd98e482a689d727a506eb targets: nightly: git_hash: 'tor-browser' @@ -32,7 +32,7 @@ steps: fenix: '[% INCLUDE build %]' # We need to bump the commit before releasing but just pointing to a branch # might cause too much rebuidling of the Firefox part. - git_hash: 523e656f6baf0977fb798187ab83a308bc34c784 + git_hash: 1a73b419bbfbf792a2d20e26d167d99f9a6cf90f compress_tar: 'zst' targets: nightly: ===================================== rbm.conf ===================================== @@ -73,18 +73,18 @@ buildconf: git_signtag_opt: '-s' var: - torbrowser_version: '13.5a7' - torbrowser_build: 'build2' + torbrowser_version: '13.5a8' + torbrowser_build: 'build1' # This should be the date of when the build is started. For the build # to be reproducible, browser_release_date should always be in the past. - browser_release_date: '2024/04/25 12:00:00' + browser_release_date: '2024/05/16 00:00:00' browser_release_date_timestamp: '[% USE date; date.format(c("var/browser_release_date"), "%s") %]' updater_enabled: 1 build_mar: 1 torbrowser_incremental_from: - - '13.5a6' - - '13.5a5' - - '13.5a4' + - 13.5a7 + - 13.5a6 + - 13.5a5 mar_channel_id: '[% c("var/projectname") %]-torproject-[% c("var/channel") %]' # By default, we sort the list of installed packages. This allows sharing View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/6… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/6… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android] Pushed new tag firefox-android-115.2.1-13.5-1-build10
by richard (@richard) 16 May '24

16 May '24
richard pushed new tag firefox-android-115.2.1-13.5-1-build10 at The Tor Project / Applications / firefox-android -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/tree/firef… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser] Pushed new tag mullvad-browser-115.11.0esr-13.5-1-build2
by richard (@richard) 16 May '24

16 May '24
richard pushed new tag mullvad-browser-115.11.0esr-13.5-1-build2 at The Tor Project / Applications / Mullvad Browser -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/tree/mullv… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser] Pushed new tag tor-browser-115.11.0esr-13.5-1-build2
by richard (@richard) 16 May '24

16 May '24
richard pushed new tag tor-browser-115.11.0esr-13.5-1-build2 at The Tor Project / Applications / Tor Browser -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/tor-brows… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.5-1] 2 commits: fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
by richard (@richard) 16 May '24

16 May '24
richard pushed to branch tor-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 4eca7b01 by Henry Wilkes at 2024-05-16T14:22:43+00:00 fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser Bug 41621: Tweak about:torconnect style. - - - - - 6db4a9b2 by Henry Wilkes at 2024-05-16T14:22:43+00:00 fixup! Temporary changes to about:torconnect for Android. Bug 41621: Make sure button&#39;s layout parent is .button-container when not on android. - - - - - 4 changed files: - toolkit/components/torconnect/content/aboutTorConnect.css - toolkit/components/torconnect/content/aboutTorConnect.html - toolkit/components/torconnect/content/aboutTorConnect.js - toolkit/components/torconnect/content/onion-pattern.svg Changes: ===================================== toolkit/components/torconnect/content/aboutTorConnect.css ===================================== @@ -7,7 +7,6 @@ :root { --onion-opacity: 1; --onion-color: var(--card-outline-color); - --onion-radius: 75px; } html { @@ -236,34 +235,47 @@ input[type="checkbox"]:not(:disabled):active:checked { } } -#progressBar { +#progressBar:not([hidden]) { position: fixed; - top: 0; - inset-inline-start: 0; - width: 0%; - padding: 0; - margin: 0; - animation: progressAnimation 5s ease infinite; + inset-block-start: 0; + inset-inline: 0; + display: grid; + --progress-percent: 0%; + --progress-animation: progressAnimation 5s ease infinite; + --progress-bar-height: 7px; +} + +#progressBar > * { + grid-area: 1 / 1; +} + +#progressBarBackground { + width: 100%; + height: var(--progress-bar-height); + background: var(--in-content-box-info-background); } #progressBackground { + z-index: 1; + width: var(--progress-percent); height: 66px; - margin-top: -26px; + margin-block-start: -26px; background-image: linear-gradient(var(--progressbar-shadow-start), var(--in-content-page-background) 100%), var(--progressbar-gradient); - background-position: inherit; + animation: var(--progress-animation); filter: blur(5px); border-end-end-radius: 33px; } #progressSolid { - position: absolute; - top: 0; - width: 100%; - height: 7px; + z-index: 2; + width: var(--progress-percent); + height: var(--progress-bar-height); + border-start-end-radius: calc(var(--progress-bar-height) / 2); + border-end-end-radius: calc(var(--progress-bar-height) / 2); background-image: var(--progressbar-gradient); - background-position: inherit; + animation: var(--progress-animation); } #progressBackground, #progressSolid { @@ -300,8 +312,8 @@ input[type="checkbox"]:not(:disabled):active:checked { max-width: 45em; } -#quickstartCheckbox, #quickstartCheckboxLabel { - vertical-align: middle; +#quickstartToggle { + width: max-content; } /* mirrors p element spacing */ @@ -309,18 +321,25 @@ input[type="checkbox"]:not(:disabled):active:checked { margin: 1em 0; } -body { - padding: 0px !important; +body.aboutTorConnect { justify-content: space-between; - background-color: var(--in-content-page-background); + background: + local + url("chrome://global/content/torconnect/onion-pattern.svg") + center bottom + repeat-x; + /* Always reserve 150px for the background, plus 15px padding with content. */ + padding-block-end: 175px; } -.title { +body.aboutTorConnect .title { background-image: url("chrome://global/content/torconnect/tor-connect.svg"); -moz-context-properties: stroke, fill, fill-opacity; fill-opacity: var(--onion-opacity); fill: var(--onion-color); stroke: var(--onion-color); + /* Make sure there is no padding between the title and #breadcrumbs. */ + padding-block-start: 0; } .title.offline { @@ -336,35 +355,6 @@ body { stroke: var(--warning-color); } -.onion-pattern-container { - flex: auto; /* grow to consume remaining space on the page */ - display: flex; - margin: 0 auto; - width: 100%; - /* two onions tall, 4x the radius */ - height: calc(4 * var(--onion-radius)); - max-height: calc(4 * var(--onion-radius)); - min-height: calc(4 * var(--onion-radius)); - direction: ltr; -} - -.onion-pattern-crop { - height: 100%; - width: 100%; - - -moz-context-properties: fill; - fill: var(--onion-color, currentColor); - /* opacity of the entire div, not context-opacity */ - opacity: var(--onion-opacity, 1); - - background-image: url("chrome://global/content/torconnect/onion-pattern.svg"); - background-repeat: repeat; - background-attachment: local; - background-position: center; - /* svg source is 6 onions wide and 2 onions tall */ - background-size: calc(6 * 2 * var(--onion-radius)) calc(2 * 2 * var(--onion-radius));; -} - :root { --android-dark-accents-buttons: #9059FF; --android-dark-background-secondary: #E1E0E7; @@ -459,6 +449,11 @@ body.android { flex: 1; } +body:not(.android) #connectButtonContainer { + /* Use the .button-container context */ + display: contents; +} + .android #connectButtonContainer { width: 100%; padding-bottom: 18px; ===================================== toolkit/components/torconnect/content/aboutTorConnect.html ===================================== @@ -6,18 +6,24 @@ http-equiv="Content-Security-Policy" content="default-src chrome:; object-src 'none'" /> - <meta name="viewport" content="width=device-width"> + <meta name="viewport" content="width=device-width" /> <link rel="stylesheet" href="chrome://global/content/torconnect/aboutTorConnect.css" type="text/css" media="all" /> + + <script + type="module" + src="chrome://global/content/elements/moz-toggle.mjs" + ></script> </head> - <body> - <div id="progressBar"> - <div id="progressBackground"></div> + <body class="aboutTorConnect"> + <div id="progressBar" hidden="hidden"> <div id="progressSolid"></div> + <div id="progressBackground"></div> + <div id="progressBarBackground"></div> </div> <div id="connectPageContainer" class="container"> <div id="breadcrumbs" class="hidden"> @@ -56,8 +62,7 @@ <button id="viewLogButton"></button> <div id="quickstartContainer"> - <input id="quickstartCheckbox" type="checkbox" /> - <label id="quickstartCheckboxLabel" for="quickstartCheckbox"></label> + <moz-toggle id="quickstartToggle" label-align-after=""></moz-toggle> </div> <div class="button-container"> @@ -76,9 +81,6 @@ </div> </div> </div> - <div class="onion-pattern-container"> - <div class="onion-pattern-crop"></div> - </div> <script src="chrome://global/content/torconnect/aboutTorConnect.js"></script> </body> </html> ===================================== toolkit/components/torconnect/content/aboutTorConnect.js ===================================== @@ -60,8 +60,7 @@ class AboutTorConnect { }, quickstart: { container: "div#quickstartContainer", - checkbox: "input#quickstartCheckbox", - label: "label#quickstartCheckboxLabel", + toggle: "#quickstartToggle", }, buttons: { restart: "button#restartButton", @@ -116,10 +115,7 @@ class AboutTorConnect { quickstartContainer: document.querySelector( this.selectors.quickstart.container ), - quickstartCheckbox: document.querySelector( - this.selectors.quickstart.checkbox - ), - quickstartLabel: document.querySelector(this.selectors.quickstart.label), + quickstartToggle: document.querySelector(this.selectors.quickstart.toggle), restartButton: document.querySelector(this.selectors.buttons.restart), configureButton: document.querySelector(this.selectors.buttons.configure), cancelButton: document.querySelector(this.selectors.buttons.cancel), @@ -310,7 +306,10 @@ class AboutTorConnect { this.elements.progressDescription.textContent = description; if (visible) { this.show(this.elements.progressMeter); - this.elements.progressMeter.style.width = `${percent}%`; + this.elements.progressMeter.style.setProperty( + "--progress-percent", + `${percent}%` + ); } else { this.hide(this.elements.progressMeter); } @@ -407,7 +406,7 @@ class AboutTorConnect { updateUI(state) { // calls update_$state() this[`update_${state.State}`](state); - this.elements.quickstartCheckbox.checked = state.QuickStartEnabled; + this.elements.quickstartToggle.pressed = state.QuickStartEnabled; } /* Per-state updates */ @@ -762,12 +761,14 @@ class AboutTorConnect { RPMSendAsyncMessage("torconnect:view-tor-logs"); }); - this.elements.quickstartCheckbox.addEventListener("change", () => { - const quickstart = this.elements.quickstartCheckbox.checked; + this.elements.quickstartToggle.addEventListener("toggle", () => { + const quickstart = this.elements.quickstartToggle.pressed; RPMSendAsyncMessage("torconnect:set-quickstart", quickstart); }); - this.elements.quickstartLabel.textContent = - TorStrings.settings.quickstartCheckbox; + this.elements.quickstartToggle.setAttribute( + "label", + TorStrings.settings.quickstartCheckbox + ); this.elements.restartButton.textContent = TorStrings.torConnect.restartTorBrowser; ===================================== toolkit/components/torconnect/content/onion-pattern.svg ===================================== @@ -1,22 +1,30 @@ -<svg fill="context-fill" viewBox="0 0 900 300" width="900" height="300" xmlns="http://www.w3.org/2000/svg"> - <g> - <path d="m825 0c41.421 0 75 33.5786 75 75 0 41.421-33.579 75-75 75z" fill-opacity=".3"/> - <path d="m750 0c41.421 0 75 33.5786 75 75 0 41.421-33.579 75-75 75z" fill-opacity=".15"/> - <path d="m525 225c0-41.421-33.579-75-75-75s-75 33.579-75 75z" fill-opacity=".3"/> - <path d="m525 300c0-41.421-33.579-75-75-75s-75 33.579-75 75z" fill-opacity=".15"/> - <path d="m300 0c0 41.4214-33.579 75-75 75s-75-33.5786-75-75z" fill-opacity=".3"/> - <path d="m300 75c0 41.421-33.579 75-75 75s-75-33.579-75-75z" fill-opacity=".15"/> - <g clip-rule="evenodd" fill-opacity=".3" fill-rule="evenodd"> - <path d="m525 .25c-.176 0-.351.000606-.527.001817-.966.006671-1.744.795563-1.737 1.762033.006.96648.795 1.74455 1.762 1.73788.167-.00115.334-.00173.502-.00173s.335.00058.502.00173c.967.00667 1.756-.7714 1.762-1.73788.007-.96647-.771-1.755363-1.737-1.762033-.176-.001211-.351-.001817-.527-.001817zm7.849.407251c-.962-.100329-1.822.597609-1.923 1.558879-.1.96128.598 1.82188 1.559 1.92221.333.03473.665.07174.996.11103.96.11381 1.83-.57199 1.944-1.53176s-.572-1.830084-1.532-1.943891c-.347-.041214-.695-.080042-1.044-.116468zm-15.334 3.481099c.961-.10034 1.659-.96094 1.559-1.92221-.101-.96128-.961-1.659216-1.923-1.558886-.349.036426-.697.075254-1.044.116468-.96.113808-1.646.984118-1.532 1.943888.114.95978.984 1.64557 1.944 1.53176.331-.03928.663-.0763.996-.11102zm23.612-2.14381c-.944-.2076-1.877.38933-2.085 1.33327-.207.94394.389 1.87744 1.333 2.08504.326.07165.651.14553.975.22162.941.2209 1.883-.36277 2.104-1.30369.221-.94091-.363-1.88275-1.304-2.10366-.34-.07986-.681-.15739-1.023-.23258zm-31.502 3.41832c.944-.2076 1.54-1.14111 1.333-2.08505-.208-.94394-1.141-1.54086-2.085-1.33326-.342.07519-.683.15272-1.023.23257-.941.22091-1.525 1.16276-1.304 2.10367s1.163 1.52459 2.104 1.30368c.324-.07609.649-.14997.975-.22161zm39.576-1.15763c-.914-.31276-1.909.17503-2.222 1.08953-.312.91449.175 1.90938 1.09 2.22214.315.10775.629.21764.942.32966.91.32565 1.912-.14805 2.237-1.05804.326-.90998-.148-1.91166-1.058-2.23731-.328-.11756-.658-.2329-.989-.34598zm-47.27 3.31168c.915-.31277 1.402-1.30766 1.09-2.22215-.313-.91449-1.308-1.40229-2.222-1.08952-.331.11308-.661.22841-.989.34598-.91.32565-1.384 1.32733-1.058 2.23731.325.90999 1.327 1.38369 2.237 1.05804.313-.11202.627-.22191.942-.32966zm55.037-.15521c-.874-.41383-1.917-.04125-2.331.83218-.414.87342-.041 1.91692.832 2.33072.301.1427.601.2875.9.4343.868.426 1.916.0682 2.343-.7993.426-.86751.068-1.91617-.8-2.34226-.313-.15402-.628-.3059-.944-.45564zm-62.437 3.163c.873-.4139 1.246-1.45739.832-2.33082-.414-.87342-1.457-1.246-2.331-.83217-.316.14973-.631.30162-.944.45564-.868.42608-1.226 1.47475-.8 2.34225s1.475 1.2254 2.343.7993c.298-.1468.599-.2916.9-.4342zm69.8.8472c-.822-.5092-1.901-.2561-2.41.5653-.509.8215-.256 1.9002.565 2.4095.284.1756.566.3532.846.5327.815.5207 1.897.2827 2.418-.5315.52-.8143.282-1.8965-.532-2.4172-.294-.1883-.59-.3746-.887-.5588zm-76.817 2.9748c.821-.5092 1.074-1.588.565-2.4095-.509-.8214-1.588-1.0745-2.41-.5653-.297.1843-.593.3705-.887.5588-.814.5207-1.052 1.6029-.532 2.4172.521.8142 1.603 1.0522 2.418.5315.28-.1795.562-.3571.846-.5327zm83.683 1.834c-.759-.5978-1.859-.4668-2.457.2927-.598.7594-.467 1.8597.292 2.4575.262.206.523.4139.781.6235.751.6084 1.853.4927 2.462-.2583.608-.7511.492-1.8531-.259-2.4614-.271-.2199-.544-.4379-.819-.654zm-90.229 2.7502c.759-.5978.89-1.6981.292-2.4575-.598-.7595-1.698-.8905-2.457-.2927-.275.2161-.548.4341-.819.654-.751.6083-.867 1.7103-.259 2.4614.609.751 1.711.8667 2.462.2583.258-.2096.519-.4175.781-.6235zm96.516 2.7935c-.688-.6786-1.796-.6709-2.475.0173-.678.6881-.67 1.7962.018 2.4748.237.2339.473.4695.706.7067.679.6882 1.787.6959 2.475.0173s.696-1.7867.018-2.4748c-.246-.2488-.493-.4959-.742-.7413zm-102.511 2.4921c.688-.6786.696-1.7866.017-2.4748-.678-.6882-1.786-.6959-2.474-.0173-.249.2454-.496.4925-.742.7413-.678.6881-.67 1.7962.018 2.4748s1.796.6709 2.474-.0173c.234-.2372.47-.4728.707-.7067zm108.142 3.7171c-.608-.751-1.71-.8667-2.461-.2583-.751.6083-.867 1.7103-.258 2.4613.209.2588.417.5191.623.7809.598.7595 1.698.8905 2.458.2927.759-.5978.89-1.698.292-2.4575-.216-.2746-.434-.5476-.654-.8191zm-113.511 2.203c.609-.751.493-1.853-.258-2.4613-.751-.6084-1.853-.4927-2.461.2583-.22.2715-.438.5445-.654.8191-.598.7595-.467 1.8598.292 2.4575.76.5978 1.86.4668 2.458-.2927.206-.2618.414-.5221.623-.7809zm118.415 4.5953c-.52-.8142-1.603-1.0522-2.417-.5315s-1.052 1.6029-.531 2.4171c.179.2807.357.5627.532.8461.51.8214 1.588 1.0745 2.41.5653.821-.5092 1.074-1.588.565-2.4094-.184-.2973-.37-.5931-.559-.8876zm-123.09 1.8856c.521-.8142.283-1.8964-.531-2.4171s-1.897-.2827-2.417.5315c-.189.2945-.375.5903-.559.8876-.509.8215-.256 1.9002.565 2.4094.822.5093 1.9.2561 2.41-.5653.175-.2834.353-.5654.532-.8461zm127.204 5.4202c-.426-.8675-1.475-1.2254-2.343-.7993-.867.4261-1.225 1.4748-.799 2.3423.147.2988.292.5988.434.9.414.8734 1.458 1.246 2.331.8322.874-.4139 1.246-1.4574.832-2.3308-.149-.3161-.301-.6309-.455-.9444zm-131.124 1.543c.426-.8675.068-1.9162-.799-2.3423-.868-.4261-1.917-.0682-2.343.7993-.154.3135-.306.6284-.455.9444-.414.8734-.042 1.9169.832 2.3308.873.4138 1.917.0412 2.331-.8322.142-.3012.287-.6012.434-.9zm134.39 6.1791c-.326-.91-1.328-1.3837-2.238-1.0581-.91.3257-1.383 1.3273-1.058 2.2373.112.3131.222.6271.33.9421.313.9145 1.308 1.4023 2.222 1.0896.915-.3128 1.403-1.3077 1.09-2.2222-.113-.3306-.229-.6602-.346-.9887zm-137.502 1.1793c.325-.91-.148-1.9117-1.058-2.2374-.91-.3256-1.912.1481-2.238 1.0581-.117.3285-.233.6581-.346.9887-.313.9145.175 1.9094 1.09 2.2222.914.3127 1.909-.1751 2.222-1.0895.108-.3151.218-.6291.33-.9421zm139.876 6.8607c-.221-.9409-1.163-1.5246-2.104-1.3037s-1.524 1.1628-1.303 2.1037c.076.3241.15.649.221.9748.208.9439 1.141 1.5408 2.085 1.3332s1.541-1.1411 1.333-2.085c-.075-.3419-.152-.6829-.232-1.023zm-142.139.8c.221-.9409-.362-1.8828-1.303-2.1037s-1.883.3628-2.104 1.3037c-.08.3401-.157.6811-.232 1.023-.208.944.389 1.8775 1.333 2.0851s1.877-.3894 2.085-1.3333c.071-.3258.145-.6507.221-.9748zm143.592 7.4568c-.114-.9598-.984-1.6456-1.944-1.5318-.959.1138-1.645.9841-1.531 1.9439.039.3313.076.6634.111.9961.1.9612.961 1.6592 1.922 1.5588.961-.1003 1.659-.9609 1.559-1.9222-.037-.349-.076-.6973-.117-1.0448zm-144.977.4121c.114-.9597-.572-1.8301-1.531-1.9439-.96-.1138-1.83.572-1.944 1.5318-.041.3476-.08.6959-.117 1.0449-.1.9612.598 1.8218 1.559 1.9222.961.1003 1.822-.5976 1.922-1.5589.035-.3327.072-.6647.111-.9961zm145.499 7.9547c-.006-.9665-.795-1.7445-1.762-1.7379-.966.0067-1.744.7956-1.738 1.7621.001.0523.001.1046.001.1569l.001.0826v.2629c0 .1676-.001.3351-.002.5024-.006.9665.772 1.7554 1.738 1.762.967.0067 1.756-.7714 1.762-1.7378.001-.1754.002-.3509.002-.5266s-.001-.3512-.002-.5266zm-145.996.0242c.006-.9665-.772-1.7554-1.738-1.762-.967-.0067-1.756.7714-1.762 1.7378-.001.1754-.002.3509-.002.5266s.001.3512.002.5266c.006.9665.795 1.7445 1.762 1.7379.966-.0067 1.744-.7956 1.738-1.7621-.001-.1673-.002-.3348-.002-.5024s.001-.3351.002-.5024zm145.591 8.3509c.1-.9612-.598-1.8218-1.559-1.9222-.961-.1003-1.822.5976-1.922 1.5589-.035.3327-.072.6647-.111.9961-.114.9597.572 1.83 1.531 1.9439.96.1138 1.83-.572 1.944-1.5318.042-.3476.08-.6959.117-1.0449zm-145.205-.3633c-.1-.9612-.961-1.6592-1.922-1.5588-.961.1003-1.659.9609-1.559 1.9222.037.349.076.6973.117 1.0448.114.9598.984 1.6456 1.944 1.5318.959-.1138 1.645-.9841 1.531-1.9439-.039-.3313-.076-.6634-.111-.9961zm143.867 8.642c.208-.944-.389-1.8775-1.333-2.0851s-1.877.3894-2.085 1.3333c-.071.3258-.145.6507-.221.9748-.221.9409.362 1.8828 1.303 2.1037s1.883-.3628 2.104-1.3037c.08-.3401.157-.6811.232-1.023zm-142.592-.7518c-.208-.9439-1.141-1.5408-2.085-1.3332s-1.541 1.1411-1.333 2.085c.075.3419.152.6829.232 1.023.221.9409 1.163 1.5246 2.104 1.3037s1.524-1.1628 1.303-2.1037c-.076-.3241-.149-.649-.221-.9748zm140.332 8.8261c.313-.9145-.175-1.9094-1.09-2.2222-.914-.3127-1.909.1751-2.222 1.0895-.108.3151-.218.6291-.33.9421-.325.91.148 1.9121 1.058 2.2371.91.326 1.912-.148 2.238-1.058.117-.3283.233-.6579.346-.9885zm-138.178-1.1326c-.313-.9145-1.308-1.4023-2.222-1.0896-.915.3128-1.403 1.3077-1.09 2.2222.113.3306.229.6602.346.9885.326.91 1.328 1.384 2.238 1.058.91-.325 1.383-1.327 1.058-2.237-.112-.3131-.222-.6271-.33-.9421zm135.021 8.8991c.414-.874.042-1.917-.832-2.331-.873-.414-1.917-.041-2.331.832-.142.301-.287.601-.434.9-.426.868-.068 1.916.799 2.343.868.426 1.917.068 2.343-.8.154-.313.306-.628.455-.944zm-132.013-1.499c-.414-.873-1.458-1.246-2.331-.832-.874.414-1.246 1.457-.832 2.331.149.316.301.631.455.944.426.868 1.475 1.226 2.343.8.867-.426 1.225-1.475.799-2.343-.147-.298-.292-.599-.434-.9zm128.003 8.862c.509-.822.256-1.901-.565-2.41-.822-.509-1.9-.256-2.41.565-.175.284-.353.566-.532.846-.521.815-.283 1.897.531 2.418.814.52 1.897.282 2.417-.532.189-.294.375-.59.559-.887zm-124.181-1.845c-.51-.821-1.588-1.074-2.41-.565-.821.509-1.074 1.588-.565 2.41.184.297.37.593.559.887.52.814 1.603 1.052 2.417.532.814-.521 1.052-1.603.531-2.418-.179-.28-.357-.562-.532-.846zm119.372 8.711c.598-.759.467-1.859-.292-2.457-.76-.598-1.86-.467-2.458.292-.206.262-.414.523-.623.781-.609.751-.493 1.853.258 2.462.751.608 1.853.492 2.461-.259.22-.271.438-.544.654-.819zm-114.788-2.165c-.598-.759-1.698-.89-2.458-.292-.759.598-.89 1.698-.292 2.457.216.275.434.548.654.819.608.751 1.71.867 2.461.259.751-.609.867-1.711.258-2.462-.209-.258-.417-.519-.623-.781zm109.245 8.452c.678-.688.67-1.796-.018-2.475-.688-.678-1.796-.67-2.474.018-.234.237-.47.473-.707.706-.688.679-.696 1.787-.017 2.475.678.688 1.786.696 2.474.018.249-.246.496-.493.742-.742zm-103.959-2.457c-.679-.688-1.787-.696-2.475-.017-.688.678-.696 1.786-.018 2.474.246.249.493.496.742.742.688.678 1.796.67 2.474-.018.679-.688.671-1.796-.017-2.474-.237-.234-.473-.47-.706-.707zm5.92 5.369c-.751-.609-1.853-.493-2.462.258-.608.751-.492 1.853.259 2.461.271.22.544.438.819.654.759.598 1.859.467 2.457-.292.598-.76.467-1.86-.292-2.458-.262-.206-.523-.414-.781-.623zm91.829 2.719c.751-.608.867-1.71.259-2.461-.609-.751-1.711-.867-2.462-.258-.258.209-.519.417-.781.623-.759.598-.89 1.698-.292 2.458.598.759 1.698.89 2.457.292.275-.216.548-.434.819-.654zm-6.798 4.904c.814-.52 1.052-1.603.532-2.417-.521-.814-1.603-1.052-2.418-.531-.28.179-.562.357-.846.532-.821.51-1.074 1.588-.565 2.41.509.821 1.588 1.074 2.41.565.297-.184.593-.37.887-.559zm-78.55-2.948c-.815-.521-1.897-.283-2.418.531-.52.814-.282 1.897.532 2.417.294.189.59.375.887.559.822.509 1.901.256 2.41-.565.509-.822.256-1.9-.565-2.41-.284-.175-.566-.353-.846-.532zm6.963 3.92c-.868-.426-1.916-.068-2.343.799-.426.868-.068 1.917.8 2.343.313.154.628.306.944.455.874.414 1.917.042 2.331-.832.414-.873.041-1.917-.832-2.331-.301-.142-.601-.287-.9-.434zm64.281 3.142c.868-.426 1.226-1.475.8-2.343-.426-.867-1.475-1.225-2.343-.799-.298.147-.599.292-.9.434-.873.414-1.246 1.458-.832 2.331.414.874 1.457 1.246 2.331.832.316-.149.631-.301.944-.455zm-7.722 3.266c.91-.326 1.384-1.328 1.058-2.238-.325-.91-1.327-1.383-2.237-1.058-.313.112-.627.222-.942.33-.915.313-1.402 1.308-1.09 2.222.313.915 1.308 1.403 2.222 1.09.331-.113.661-.229.989-.346zm-49.201-3.296c-.91-.325-1.912.148-2.237 1.058-.326.91.148 1.912 1.058 2.238.328.117.658.233.989.346.914.313 1.909-.175 2.222-1.09.312-.914-.175-1.909-1.09-2.222-.315-.108-.629-.218-.942-.33zm41.161 5.67c.941-.221 1.525-1.163 1.304-2.104s-1.163-1.524-2.104-1.303c-.324.076-.649.15-.975.221-.944.208-1.54 1.141-1.333 2.085.208.944 1.141 1.541 2.085 1.333.342-.075.683-.152 1.023-.232zm-33.5-3.407c-.941-.221-1.883.362-2.104 1.303s.363 1.883 1.304 2.104c.34.08.681.157 1.023.232.944.208 1.877-.389 2.085-1.333.207-.944-.389-1.877-1.333-2.085-.326-.071-.651-.145-.975-.221zm7.869 1.385c-.96-.114-1.83.572-1.944 1.531-.114.96.572 1.83 1.532 1.944.347.042.695.08 1.044.117.962.1 1.822-.598 1.923-1.559.1-.961-.598-1.822-1.559-1.922-.333-.035-.665-.072-.996-.111zm17.374 3.475c.96-.114 1.646-.984 1.532-1.944-.114-.959-.984-1.645-1.944-1.531-.331.039-.663.076-.996.111-.961.1-1.659.961-1.559 1.922.101.961.961 1.659 1.923 1.559.349-.037.697-.076 1.044-.117zm-9.395-2.978c-.967-.006-1.756.772-1.762 1.738-.007.967.771 1.756 1.737 1.762.176.001.351.002.527.002s.351-.001.527-.002c.966-.006 1.744-.795 1.737-1.762-.006-.966-.795-1.744-1.762-1.738-.167.001-.334.002-.502.002-.093 0-.185 0-.278-.001-.045 0-.089 0-.134 0-.03 0-.06-.001-.09-.001zm.502-130.998c-.179 0-.357.0008-.536.0024-.966.0084-1.743.7988-1.734 1.7653.008.9664.799 1.743 1.765 1.7345.168-.0015.337-.0022.505-.0022s.337.0007.505.0022c.966.0085 1.757-.7681 1.765-1.7345.009-.9665-.768-1.7569-1.734-1.7653-.179-.0016-.357-.0024-.536-.0024zm-7.515 3.9974c.958-.1279 1.631-1.0081 1.503-1.9661s-1.008-1.631-1.966-1.5031c-.352.047-.703.097-1.053.1501-.956.1449-1.613 1.037-1.468 1.9926s1.037 1.6127 1.993 1.4678c.329-.0499.66-.0971.991-.1413zm15.493-3.4692c-.958-.1279-1.838.5451-1.966 1.5031s.545 1.8382 1.503 1.9661c.331.0442.662.0914.991.1413.956.1449 1.848-.5122 1.993-1.4678s-.512-1.8477-1.468-1.9926c-.35-.0531-.701-.1031-1.053-.1501zm-23.35 5.0976c.929-.2635 1.47-1.231 1.206-2.1609-.264-.9298-1.231-1.47-2.161-1.2064-.342.097-.683.1969-1.023.2998-.925.2803-1.447 1.2573-1.167 2.1823s1.257 1.4476 2.182 1.1674c.32-.0968.641-.1909.963-.2822zm31.699-3.3673c-.93-.2636-1.897.2766-2.161 1.2064-.264.9299.277 1.8974 1.206 2.1609.322.0913.643.1854.963.2822.925.2802 1.902-.2424 2.182-1.1674s-.242-1.902-1.167-2.1823c-.34-.1029-.681-.2028-1.023-.2998zm-39.242 6.1049c.882-.3942 1.278-1.4291.884-2.3116s-1.429-1.2783-2.311-.8842c-.325.1451-.648.293-.97.4436-.875.4099-1.253 1.4518-.843 2.3271.41.8752 1.452 1.2525 2.327.8426.303-.1418.607-.281.913-.4175zm47.257-3.1958c-.882-.3941-1.917.0017-2.311.8842s.002 1.9174.884 2.3116c.306.1365.61.2757.913.4175.875.4099 1.917.0326 2.327-.8426.41-.8753.032-1.9172-.843-2.3271-.322-.1506-.645-.2985-.97-.4436zm7.516 4.0254c-.817-.516-1.898-.2718-2.414.5454s-.271 1.898.546 2.4141c.283.1787.564.3599.844.5436.808.5305 1.893.3056 2.423-.5022.531-.8079.306-1.8929-.502-2.4234-.297-.1951-.596-.3876-.897-.5775zm-61.848 2.9595c.817-.5161 1.062-1.5969.546-2.4141s-1.597-1.0614-2.414-.5454c-.301.1899-.6.3824-.897.5775-.808.5305-1.033 1.6155-.502 2.4234.53.8079 1.615 1.0327 2.423.5022.28-.1837.561-.3649.844-.5436zm68.714 2.0935c-.735-.6268-1.84-.5384-2.467.1974-.626.7357-.538 1.8402.198 2.467.255.2171.508.4364.759.658.724.6397 1.83.5709 2.47-.1536.639-.7245.571-1.8304-.154-2.4701-.266-.2353-.535-.4682-.806-.6987zm-75.179 2.6644c.736-.6268.824-1.7313.198-2.467-.627-.7358-1.732-.8242-2.467-.1974-.271.2305-.54.4634-.806.6987-.725.6397-.793 1.7456-.154 2.4701.64.7245 1.746.7933 2.47.1536.251-.2216.504-.4409.759-.658zm81.26 3.3095c-.639-.7245-1.745-.7933-2.47-.1536-.724.6397-.793 1.7456-.153 2.4701.221.2509.441.5039.658.7587.626.7358 1.731.8242 2.467.1975.735-.6268.824-1.7313.197-2.467-.231-.2707-.463-.5393-.699-.8057zm-86.987 2.3165c.64-.7245.571-1.8304-.153-2.4701-.725-.6397-1.831-.5709-2.47.1536-.236.2664-.468.535-.699.8057-.627.7357-.538 1.8402.197 2.467.736.6267 1.841.5383 2.467-.1975.217-.2548.437-.5078.658-.7587zm92.162 4.4585c-.531-.8079-1.616-1.0327-2.424-.5022s-1.033 1.6155-.502 2.4234c.184.2796.365.5611.544.8442.516.8172 1.596 1.0614 2.414.5453.817-.516 1.061-1.5968.545-2.414-.19-.3007-.382-.5996-.577-.8967zm-97.034 1.9212c.531-.8079.306-1.8929-.502-2.4234s-1.893-.3057-2.424.5022c-.195.2971-.387.596-.577.8967-.516.8172-.272 1.898.545 2.414.818.5161 1.898.2719 2.414-.5453.179-.2831.36-.5646.544-.8442zm-3.915 7.0062c.41-.8753.033-1.9171-.843-2.3271-.875-.4099-1.917-.0326-2.327.8427-.15.3217-.298.6449-.443.9697-.395.8825.001 1.9174.884 2.3116.882.3941 1.917-.0018 2.311-.8842.137-.3057.276-.61.418-.9127zm105.108-1.4844c-.41-.8753-1.452-1.2526-2.327-.8427-.876.41-1.253 1.4518-.843 2.3271.142.3027.281.607.418.9127.394.8824 1.429 1.2783 2.311.8842.883-.3942 1.279-1.4291.884-2.3116-.145-.3248-.293-.648-.443-.9697zm-107.981 8.9773c.28-.925-.242-1.902-1.167-2.1822-.925-.2803-1.902.2424-2.183 1.1674-.103.3396-.203.6805-.3 1.0227-.263.9299.277 1.8973 1.207 2.1609s1.897-.2766 2.161-1.2064c.091-.322.185-.6428.282-.9624zm111.034-1.0148c-.281-.925-1.258-1.4477-2.183-1.1674-.925.2802-1.447 1.2572-1.167 2.1822.097.3196.191.6404.282.9624.264.9298 1.231 1.47 2.161 1.2064s1.47-1.231 1.207-2.1609c-.097-.3422-.197-.6831-.3-1.0227zm-112.803 8.8434c.145-.9556-.513-1.8477-1.468-1.9926-.956-.1449-1.848.5122-1.993 1.4678-.053.3501-.103.7012-.15 1.0532-.128.958.545 1.8383 1.503 1.9661.958.1279 1.839-.5451 1.966-1.5031.045-.3314.092-.6619.142-.9914zm114.683-.5248c-.145-.9556-1.037-1.6127-1.993-1.4678-.955.1449-1.613 1.037-1.468 1.9926.05.3295.097.66.142.9914.127.958 1.008 1.631 1.966 1.5031.958-.1278 1.631-1.0081 1.503-1.9661-.047-.352-.097-.7031-.15-1.0532zm-115.32 8.5262c.009-.9665-.768-1.7568-1.734-1.7653-.967-.0085-1.757.7681-1.766 1.7346-.001.1783-.002.3568-.002.5355s.001.3572.002.5355c.009.9665.799 1.7431 1.766 1.7346.966-.0085 1.743-.7989 1.734-1.7653-.001-.1681-.002-.3364-.002-.5048s.001-.3367.002-.5048zm115.996-.0307c-.009-.9665-.799-1.7431-1.766-1.7346-.966.0085-1.743.7989-1.734 1.7653.001.1016.001.2033.002.305v.1998c0 .1684-.001.3367-.002.5048-.009.9665.768 1.7568 1.734 1.7653.967.0085 1.757-.7681 1.766-1.7346.001-.1783.002-.3568.002-.5355s-.001-.3572-.002-.5355zm-115.501 8.0503c-.127-.958-1.008-1.631-1.966-1.5031-.958.1278-1.631 1.0081-1.503 1.9661.047.352.097.7031.15 1.0532.145.9555 1.037 1.6127 1.993 1.4678.955-.1449 1.613-1.037 1.468-1.9926-.05-.3295-.097-.66-.142-.9914zm114.975.463c.128-.958-.545-1.8383-1.503-1.9661-.958-.1279-1.839.5451-1.966 1.5031-.045.3314-.092.6619-.142.9914-.145.9556.513 1.8477 1.468 1.9926.956.1449 1.848-.5122 1.993-1.4678.053-.3501.103-.7012.15-1.0532zm-113.346 7.3946c-.264-.9298-1.231-1.47-2.161-1.2064s-1.47 1.231-1.207 2.1609c.097.3422.197.6831.3 1.0227.281.925 1.258 1.4477 2.183 1.1674.925-.2802 1.447-1.2572 1.167-2.1822-.097-.3196-.191-.6404-.282-.9624zm111.616.9545c.263-.9299-.277-1.8973-1.207-2.1609s-1.897.2766-2.161 1.2064c-.091.322-.185.6428-.282.9624-.28.925.242 1.902 1.167 2.1822.925.2803 1.902-.2424 2.183-1.1674.103-.3396.203-.6805.3-1.0227zm-108.879 6.5881c-.394-.8824-1.429-1.2783-2.311-.8842-.883.3942-1.279 1.4291-.884 2.3116.145.3248.293.648.443.9696.41.875 1.452 1.253 2.327.843.876-.41 1.253-1.452.843-2.3273-.142-.3027-.281-.607-.418-.9127zm105.969 1.4274c.395-.8825-.001-1.9174-.884-2.3116-.882-.3941-1.917.0018-2.311.8842-.137.3057-.276.61-.418.9127-.41.8753-.033 1.9173.843 2.3273.875.41 1.917.032 2.327-.843.15-.3216.298-.6448.443-.9696zm-102.18 5.6476c-.516-.817-1.596-1.062-2.414-.546-.817.516-1.061 1.597-.545 2.414.19.301.382.6.577.897.531.808 1.616 1.033 2.424.502.808-.53 1.033-1.615.502-2.423-.184-.28-.365-.561-.544-.844zm98.155 1.868c.516-.817.272-1.898-.545-2.414-.818-.516-1.898-.271-2.414.546-.179.283-.36.564-.544.844-.531.808-.306 1.893.502 2.423.808.531 1.893.306 2.424-.502.195-.297.387-.596.577-.897zm-93.397 4.597c-.626-.736-1.731-.824-2.467-.198-.735.627-.824 1.732-.197 2.467.231.271.463.54.699.806.639.725 1.745.793 2.47.154.724-.64.793-1.746.153-2.47-.221-.251-.441-.504-.658-.759zm88.344 2.269c.627-.735.538-1.84-.197-2.467-.736-.626-1.841-.538-2.467.198-.217.255-.437.508-.658.759-.64.724-.571 1.83.153 2.47.725.639 1.831.571 2.47-.154.236-.266.468-.535.699-.806zm-5.974 6.081c.725-.639.793-1.745.154-2.47-.64-.724-1.746-.793-2.47-.153-.251.221-.504.441-.759.658-.736.626-.824 1.731-.198 2.467.627.735 1.732.824 2.467.197.271-.231.54-.463.806-.699zm-76.744-2.623c-.724-.64-1.83-.571-2.47.153-.639.725-.571 1.831.154 2.47.266.236.535.468.806.699.735.627 1.84.538 2.467-.197.626-.736.538-1.841-.198-2.467-.255-.217-.508-.437-.759-.658zm6.38 4.872c-.808-.531-1.893-.306-2.423.502-.531.808-.306 1.893.502 2.424.297.195.596.387.897.577.817.516 1.898.272 2.414-.545.516-.818.271-1.898-.546-2.414-.283-.179-.564-.36-.844-.544zm63.589 2.926c.808-.531 1.033-1.616.502-2.424-.53-.808-1.615-1.033-2.423-.502-.28.184-.561.365-.844.544-.817.516-1.062 1.596-.546 2.414.516.817 1.597 1.061 2.414.545.301-.19.6-.382.897-.577zm-56.583.989c-.875-.41-1.917-.033-2.327.843-.41.875-.032 1.917.843 2.327.322.15.645.298.97.443.882.395 1.917-.001 2.311-.884.394-.882-.002-1.917-.884-2.311-.306-.137-.61-.276-.913-.418zm49.14 3.17c.875-.41 1.253-1.452.843-2.327-.41-.876-1.452-1.253-2.327-.843-.303.142-.607.281-.913.418-.882.394-1.278 1.429-.884 2.311.394.883 1.429 1.279 2.311.884.325-.145.648-.293.97-.443zm-41.647-.297c-.925-.28-1.902.242-2.182 1.167s.242 1.902 1.167 2.183c.34.103.681.203 1.023.3.93.263 1.897-.277 2.161-1.207s-.277-1.897-1.206-2.161c-.322-.091-.643-.185-.963-.282zm33.685 3.35c.925-.281 1.447-1.258 1.167-2.183s-1.257-1.447-2.182-1.167c-.32.097-.641.191-.963.282-.929.264-1.47 1.231-1.206 2.161s1.231 1.47 2.161 1.207c.342-.097.683-.197 1.023-.3zm-25.856-1.581c-.956-.145-1.848.513-1.993 1.468-.145.956.512 1.848 1.468 1.993.35.053.701.103 1.053.15.958.128 1.838-.545 1.966-1.503s-.545-1.839-1.503-1.966c-.331-.045-.662-.092-.991-.142zm17.537 3.461c.956-.145 1.613-1.037 1.468-1.993-.145-.955-1.037-1.613-1.993-1.468-.329.05-.66.097-.991.142-.958.127-1.631 1.008-1.503 1.966s1.008 1.631 1.966 1.503c.352-.047.703-.097 1.053-.15zm-9.536-2.824c-.966-.009-1.757.768-1.765 1.734-.009.967.768 1.757 1.734 1.766h.102l.16.001c.091.001.183.001.274.001.112 0 .225 0 .337-.001h.091l.108-.001c.966-.009 1.743-.799 1.734-1.766-.008-.966-.799-1.743-1.765-1.734-.168.001-.337.002-.505.002-.064 0-.128 0-.192 0-.104-.001-.209-.001-.313-.002zm-.022-98.9948c.176-.0021.351-.0032.527-.0032s.351.0011.527.0032c.966.0117 1.74.8046 1.728 1.771-.011.9664-.804 1.7404-1.771 1.7287-.161-.0019-.322-.0029-.484-.0029s-.323.001-.484.0029c-.967.0117-1.76-.7623-1.771-1.7287-.012-.9664.762-1.7593 1.728-1.771zm-5.261 2.1143c.176.9504-.452 1.8634-1.402 2.0392-.316.0585-.63.1208-.944.1868-.945.1992-1.874-.4059-2.073-1.3517-.199-.9457.406-1.8739 1.352-2.0731.341-.072.684-.1398 1.028-.2035.951-.1759 1.864.4519 2.039 1.4023zm11.576 0c.175-.9504 1.088-1.5782 2.039-1.4023.344.0637.687.1315 1.028.2035.946.1992 1.551 1.1274 1.352 2.0731-.199.9458-1.128 1.5509-2.073 1.3517-.313-.066-.628-.1283-.944-.1868-.95-.1758-1.578-1.0888-1.402-2.0392zm-19.392 1.9036c.359.8973-.077 1.9158-.974 2.275-.299.1193-.595.2423-.89.3687-.888.3812-1.917-.0298-2.298-.9179s.03-1.9171.918-2.2984c.321-.1377.644-.2717.969-.4018.897-.3591 1.916.0771 2.275.9744zm27.208 0c.359-.8973 1.378-1.3335 2.275-.9744.325.1301.648.2641.969.4018.888.3813 1.299 1.4103.918 2.2984-.381.8882-1.41 1.2991-2.298.9179-.295-.1264-.591-.2494-.89-.3687-.897-.3592-1.333-1.3777-.974-2.275zm-34.499 3.4018c.528.8097.3 1.8939-.51 2.4217-.269.1754-.536.3541-.8.5359-.797.5475-1.886.3456-2.434-.4508-.547-.7965-.346-1.886.451-2.4335.288-.198.579-.3926.872-.5836.809-.5278 1.894-.2993 2.421.5103zm41.79 0c.527-.8096 1.612-1.0381 2.421-.5103.293.1911.584.3856.872.5836.797.5475.998 1.637.451 2.4335-.548.7964-1.637.9983-2.434.4508-.264-.1818-.531-.3604-.8-.5359-.81-.5278-1.038-1.612-.51-2.4217zm-48.276 4.7598c.675.6917.662 1.7997-.03 2.4747-.23.2244-.457.4515-.682.6814-.675.6917-1.783.7052-2.474.0302-.692-.675-.705-1.783-.03-2.4747.244-.2502.491-.4975.741-.7417.692-.6751 1.8-.6616 2.475.0301zm54.762 0c.675-.6917 1.783-.7052 2.475-.0301.25.2442.497.4915.741.7417.675.6917.662 1.7997-.03 2.4747-.691.6751-1.799.6615-2.474-.0302-.225-.2299-.452-.457-.682-.6814-.692-.675-.705-1.7829-.03-2.4747zm-60.201 5.9284c.796.5475.998 1.637.451 2.4335-.182.2645-.361.5313-.536.8004-.528.8097-1.612 1.0382-2.422.5104s-1.038-1.6121-.51-2.4217c.191-.2931.385-.5837.583-.8717.548-.7965 1.637-.9984 2.434-.4509zm65.64 0c.797-.5475 1.886-.3456 2.434.4509.198.288.392.5786.583.8717.528.8097.3 1.8939-.51 2.4217s-1.894.2993-2.422-.5103c-.175-.2692-.354-.536-.536-.8005-.547-.7965-.345-1.886.451-2.4335zm-69.823 6.873c.888.3812 1.299 1.4102.918 2.2984-.127.2945-.25.5909-.369.8891-.359.8972-1.378 1.3335-2.275.9743s-1.333-1.3777-.974-2.275c.13-.325.264-.648.402-.9689.381-.8882 1.41-1.2991 2.298-.9179zm74.006 0c.888-.3812 1.917.0297 2.298.9179.138.3209.272.6439.402.9689.359.8973-.077 1.9158-.974 2.275s-1.916-.0771-2.275-.9743c-.119-.2982-.242-.5946-.369-.8891-.381-.8882.03-1.9172.918-2.2984zm-76.761 7.559c.946.1992 1.551 1.1274 1.351 2.0732-.066.3132-.128.6278-.186.9438-.176.9504-1.089 1.5782-2.04 1.4023-.95-.1759-1.578-1.0889-1.402-2.0392.064-.3443.132-.6871.204-1.0285.199-.9457 1.127-1.5509 2.073-1.3516zm79.516 0c.946-.1993 1.874.4059 2.073 1.3516.072.3414.14.6842.204 1.0285.176.9503-.452 1.8633-1.402 2.0392-.951.1759-1.864-.4519-2.04-1.4023-.058-.316-.12-.6306-.186-.9438-.2-.9458.405-1.874 1.351-2.0732zm-80.734 7.9517c.967.0116 1.741.8045 1.729 1.771-.002.1611-.003.3225-.003.4842s.001.3231.003.4842c.012.9665-.762 1.7594-1.729 1.771-.966.0117-1.759-.7622-1.771-1.7287-.002-.1752-.003-.3507-.003-.5265s.001-.3513.003-.5265c.012-.9665.805-1.7404 1.771-1.7287zm81.952 0c.966-.0117 1.759.7622 1.771 1.7287.001.0705.001.1411.002.2117.001.1048.001.2098.001.3148 0 .1318-.001.2635-.002.395l-.001.1315c-.012.9665-.805 1.7404-1.771 1.7287-.967-.0116-1.741-.8045-1.729-1.771.002-.1611.003-.3225.003-.4842s-.001-.3231-.003-.4842c-.012-.9665.762-1.7594 1.729-1.771zm-81.609 8.0428c.951-.1759 1.864.4519 2.04 1.4023.058.316.12.6306.186.9438.2.9458-.405 1.874-1.351 2.0732-.946.1993-1.874-.4059-2.073-1.3516-.072-.3414-.14-.6842-.204-1.0285-.176-.9503.452-1.8633 1.402-2.0392zm81.265 0c.951.1759 1.579 1.0889 1.403 2.0392-.064.3443-.132.6871-.204 1.0285-.199.9457-1.127 1.5509-2.073 1.3516-.946-.1992-1.551-1.1274-1.351-2.0732.066-.3132.128-.6278.186-.9438.176-.9504 1.089-1.5782 2.039-1.4023zm-79.361 7.8165c.897-.3592 1.916.0771 2.275.9743.119.2982.242.5946.369.8891.381.8882-.03 1.9172-.918 2.2984s-1.917-.0297-2.298-.9179c-.138-.3209-.272-.6439-.402-.9689-.359-.8973.077-1.9158.974-2.275zm77.458 0c.897.3592 1.333 1.3777.974 2.275-.13.325-.264.648-.402.9689-.381.8882-1.41 1.2991-2.298.9179s-1.299-1.4102-.918-2.2984c.127-.2945.25-.5909.369-.8891.359-.8972 1.378-1.3335 2.275-.9743zm-74.056 7.2905c.81-.5278 1.894-.2993 2.422.5104.175.2691.354.5359.536.8004.547.7965.345 1.886-.451 2.4335-.797.5471-1.886.3456-2.434-.4509-.198-.288-.392-.5786-.583-.8717-.528-.8097-.3-1.8939.51-2.4217zm70.654 0c.81.5278 1.038 1.6121.51 2.4217-.191.2931-.385.5837-.583.8717-.548.7965-1.637.998-2.434.4509-.796-.5475-.998-1.637-.451-2.4335.182-.2645.361-.5313.536-.8004.528-.8097 1.612-1.0382 2.422-.5104zm-65.894 6.4864c.691-.675 1.799-.662 2.474.03.225.23.452.457.682.682.692.675.705 1.783.03 2.474-.675.692-1.783.705-2.475.03-.25-.244-.497-.491-.741-.741-.675-.692-.662-1.8.03-2.475zm61.134 0c.692.675.705 1.783.03 2.475-.244.25-.491.497-.741.741-.692.675-1.8.662-2.475-.03-.675-.691-.662-1.799.03-2.474.23-.225.457-.452.682-.682.675-.692 1.783-.705 2.474-.03zm-55.206 5.439c.548-.796 1.637-.998 2.434-.451.264.182.531.361.8.536.81.528 1.038 1.612.51 2.422-.527.81-1.612 1.038-2.421.51-.293-.191-.584-.385-.872-.583-.797-.548-.998-1.637-.451-2.434zm49.278 0c.547.797.346 1.886-.451 2.434-.288.198-.579.392-.872.583-.809.528-1.894.3-2.421-.51-.528-.81-.3-1.894.51-2.422.269-.175.536-.354.8-.536.797-.547 1.886-.345 2.434.451zm-42.405 4.183c.381-.888 1.41-1.299 2.298-.918.295.127.591.25.89.369.897.359 1.333 1.378.974 2.275s-1.378 1.333-2.275.974c-.325-.13-.648-.264-.969-.402-.888-.381-1.299-1.41-.918-2.298zm35.532 0c.381.888-.03 1.917-.918 2.298-.321.138-.644.272-.969.402-.897.359-1.916-.077-2.275-.974s.077-1.916.974-2.275c.299-.119.595-.242.89-.369.888-.381 1.917.03 2.298.918zm-27.973 2.755c.199-.946 1.128-1.551 2.073-1.351.313.066.628.128.944.186.95.176 1.578 1.089 1.402 2.039-.175.951-1.088 1.579-2.039 1.403-.344-.064-.687-.132-1.028-.204-.946-.199-1.551-1.127-1.352-2.073zm20.414 0c.199.946-.406 1.874-1.352 2.073-.341.072-.684.14-1.028.204-.951.176-1.864-.452-2.039-1.402-.176-.951.452-1.864 1.402-2.04.316-.058.63-.12.944-.186.945-.2 1.874.405 2.073 1.351zm-12.462 1.218c.011-.967.804-1.741 1.771-1.729.161.002.322.003.484.003s.323-.001.484-.003c.967-.012 1.76.762 1.771 1.729.012.966-.762 1.759-1.728 1.771-.044 0-.088.001-.132.001-.132.001-.263.002-.395.002-.105 0-.21 0-.315-.001-.07-.001-.141-.001-.212-.002-.966-.012-1.74-.805-1.728-1.771zm2.255-66.726c-.169 0-.338.0016-.507.0049-.966.0187-1.734.8172-1.716 1.7835.019.9663.818 1.7345 1.784 1.7158.146-.0028.292-.0042.439-.0042s.293.0014.439.0042c.966.0187 1.765-.7495 1.784-1.7158.018-.9663-.75-1.7648-1.716-1.7835-.169-.0033-.338-.0049-.507-.0049zm7.477 1.1027c-.925-.2802-1.902.2424-2.183 1.1674-.28.925.243 1.902 1.168 2.1822.279.0847.556.1746.831.2698.913.3167 1.91-.1669 2.226-1.0801.317-.9131-.167-1.9101-1.08-2.2267-.318-.1103-.639-.2146-.962-.3126zm-13.939 3.3496c.925-.2802 1.448-1.2572 1.168-2.1822-.281-.925-1.258-1.4476-2.183-1.1674-.323.098-.644.2023-.962.3126-.913.3166-1.397 1.3136-1.08 2.2267.316.9132 1.313 1.3968 2.226 1.0801.275-.0952.552-.1851.831-.2698zm21.188.1714c-.793-.5533-1.884-.3595-2.437.4329-.553.7925-.359 1.8834.433 2.4367.239.1669.475.3384.707.5143.77.5839 1.868.4329 2.451-.3373.584-.7702.433-1.8679-.337-2.4518-.268-.2034-.541-.4018-.817-.5948zm-27.448 2.8696c.792-.5533.986-1.6442.433-2.4367-.553-.7924-1.644-.9862-2.437-.4329-.276.193-.549.3914-.817.5948-.77.5839-.921 1.6816-.337 2.4518.583.7702 1.681.9212 2.451.3373.232-.1759.468-.3474.707-.5143zm33.253 2.7135c-.583-.7701-1.681-.9211-2.451-.3372s-.922 1.6816-.338 2.4518c.176.232.348.4676.515.7066.553.7924 1.644.9862 2.436.4329.793-.5533.987-1.6442.433-2.4367-.193-.2765-.391-.549-.595-.8174zm-38.273 2.1146c.583-.7702.432-1.8679-.338-2.4518s-1.868-.4329-2.451.3373c-.204.2683-.402.5408-.595.8173-.554.7925-.36 1.8834.433 2.4367.792.5533 1.883.3595 2.436-.4329.167-.239.339-.4746.515-.7066zm42.077 4.9894c-.317-.9132-1.314-1.3968-2.227-1.0801-.913.3166-1.397 1.3136-1.08 2.2267.095.2746.185.5515.27.8308.28.925 1.257 1.4477 2.182 1.1674.925-.2802 1.448-1.2572 1.167-2.1822-.098-.3236-.202-.6445-.312-.9626zm-45.363 1.1466c.317-.9131-.167-1.9101-1.08-2.2267-.913-.3167-1.91.1669-2.227 1.0801-.11.3181-.214.639-.312.9626-.281.925.242 1.902 1.167 2.1822.925.2803 1.902-.2424 2.182-1.1674.085-.2793.175-.5562.27-.8308zm46.773 6.7859c-.019-.9664-.817-1.7346-1.783-1.7159-.967.0187-1.735.8172-1.716 1.7835.003.146.004.2924.004.4391s-.001.2931-.004.4391c-.019.9663.749 1.7648 1.716 1.7835.966.0187 1.764-.7495 1.783-1.7159.003-.1685.005-.3374.005-.5067s-.002-.3382-.005-.5067zm-47.991.0676c.019-.9663-.749-1.7648-1.716-1.7835-.966-.0187-1.764.7495-1.783 1.7159-.003.1685-.005.3374-.005.5067s.002.3382.005.5067c.019.9664.817 1.7346 1.783 1.7159.967-.0187 1.735-.8172 1.716-1.7835-.003-.146-.004-.2924-.004-.4391s.001-.2931.004-.4391zm46.893 7.9157c.281-.925-.242-1.902-1.167-2.1822-.925-.2803-1.902.2424-2.182 1.1674-.085.2793-.175.5562-.27.8308-.317.9131.167 1.9101 1.08 2.2267.913.3167 1.91-.1669 2.227-1.0801.11-.3181.214-.639.312-.9626zm-45.945-1.0148c-.28-.925-1.257-1.4477-2.182-1.1674-.925.2802-1.448 1.2572-1.167 2.1822.098.3236.202.6445.312.9626.317.9132 1.314 1.3968 2.227 1.0801.913-.3166 1.397-1.3136 1.08-2.2267-.095-.2746-.185-.5515-.27-.8308zm42.424 8.264c.554-.7925.36-1.8834-.433-2.4367-.792-.5534-1.883-.3595-2.436.4329-.167.239-.339.4746-.515.7066-.583.7702-.432 1.8679.338 2.4518s1.868.4329 2.451-.3372c.204-.2684.402-.5409.595-.8174zm-39.383-2.0038c-.553-.7924-1.644-.9862-2.436-.4329-.793.5533-.987 1.6442-.433 2.4367.193.2765.391.549.595.8174.583.7701 1.681.9211 2.451.3372s.922-1.6816.338-2.4518c-.176-.232-.348-.4676-.515-.7066zm33.8 7.8095c.77-.5839.921-1.6816.337-2.4518-.583-.7702-1.681-.9212-2.451-.3373-.232.1759-.468.3474-.707.5143-.792.5533-.986 1.6442-.433 2.4367.553.7924 1.644.9862 2.437.4329.276-.193.549-.3914.817-.5948zm-28.972-2.7891c-.77-.5839-1.868-.4329-2.451.3373-.584.7702-.433 1.8679.337 2.4518.268.2034.541.4018.817.5948.793.5533 1.884.3595 2.437-.4329.553-.7925.359-1.8834-.433-2.4367-.239-.1669-.475-.3384-.707-.5143zm6.136 3.2855c-.913-.3167-1.91.1669-2.226 1.0801-.317.9131.167 1.9101 1.08 2.2267.318.1103.639.2146.962.3126.925.2802 1.902-.2424 2.183-1.1674.28-.925-.243-1.902-1.168-2.1822-.279-.0847-.556-.1746-.831-.2698zm15.732 3.3068c.913-.3166 1.397-1.3136 1.08-2.2267-.316-.9132-1.313-1.3968-2.226-1.0801-.275.0952-.552.1851-.831.2698-.925.2802-1.448 1.2572-1.168 2.1822.281.925 1.258 1.4476 2.183 1.1674.323-.098.644-.2023.962-.3126zm-8.878-2.0889c-.966-.0187-1.765.7495-1.784 1.7158-.018.9663.75 1.7644 1.716 1.7834.169.003.338.005.507.005s.338-.002.507-.005c.966-.019 1.734-.8171 1.716-1.7834-.019-.9663-.818-1.7345-1.784-1.7158-.146.0028-.292.0042-.439.0042s-.293-.0014-.439-.0042z"/> - <path d="m3.75 75c0-39.3503 31.8997-71.25 71.25-71.25 39.35 0 71.25 31.8997 71.25 71.25 0 39.35-31.9 71.25-71.25 71.25-39.3503 0-71.25-31.9-71.25-71.25zm71.25-74.75c-41.2833 0-74.75 33.4667-74.75 74.75 0 41.283 33.4667 74.75 74.75 74.75 41.283 0 74.75-33.467 74.75-74.75 0-41.2833-33.467-74.75-74.75-74.75zm-55.25 74.75c0-30.5137 24.7363-55.25 55.25-55.25 30.514 0 55.25 24.7363 55.25 55.25 0 30.514-24.736 55.25-55.25 55.25-30.5137 0-55.25-24.736-55.25-55.25zm55.25-58.75c-32.4467 0-58.75 26.3033-58.75 58.75 0 32.447 26.3033 58.75 58.75 58.75 32.447 0 58.75-26.303 58.75-58.75 0-32.4467-26.303-58.75-58.75-58.75zm0 19.5c-21.6772 0-39.25 17.5728-39.25 39.25s17.5728 39.25 39.25 39.25 39.25-17.5728 39.25-39.25-17.5728-39.25-39.25-39.25zm-42.75 39.25c0-23.6102 19.1398-42.75 42.75-42.75s42.75 19.1398 42.75 42.75-19.1398 42.75-42.75 42.75-42.75-19.1398-42.75-42.75zm20.5 0c0-12.2883 9.9617-22.25 22.25-22.25s22.25 9.9617 22.25 22.25-9.9617 22.25-22.25 22.25-22.25-9.9617-22.25-22.25zm22.25-25.75c-14.2213 0-25.75 11.5287-25.75 25.75s11.5287 25.75 25.75 25.75 25.75-11.5287 25.75-25.75-11.5287-25.75-25.75-25.75z"/> - <path d="m228.75 225c0-39.35 31.9-71.25 71.25-71.25s71.25 31.9 71.25 71.25-31.9 71.25-71.25 71.25-71.25-31.9-71.25-71.25zm71.25-74.75c-41.283 0-74.75 33.467-74.75 74.75s33.467 74.75 74.75 74.75 74.75-33.467 74.75-74.75-33.467-74.75-74.75-74.75zm-55.25 74.75c0-30.514 24.736-55.25 55.25-55.25s55.25 24.736 55.25 55.25-24.736 55.25-55.25 55.25-55.25-24.736-55.25-55.25zm55.25-58.75c-32.447 0-58.75 26.303-58.75 58.75s26.303 58.75 58.75 58.75 58.75-26.303 58.75-58.75-26.303-58.75-58.75-58.75zm0 19.5c-21.677 0-39.25 17.573-39.25 39.25s17.573 39.25 39.25 39.25 39.25-17.573 39.25-39.25-17.573-39.25-39.25-39.25zm-42.75 39.25c0-23.61 19.14-42.75 42.75-42.75s42.75 19.14 42.75 42.75-19.14 42.75-42.75 42.75-42.75-19.14-42.75-42.75zm20.5 0c0-12.288 9.962-22.25 22.25-22.25s22.25 9.962 22.25 22.25-9.962 22.25-22.25 22.25-22.25-9.962-22.25-22.25zm22.25-25.75c-14.221 0-25.75 11.529-25.75 25.75s11.529 25.75 25.75 25.75 25.75-11.529 25.75-25.75-11.529-25.75-25.75-25.75z"/> - <path d="m828.75 225c0-39.35 31.9-71.25 71.25-71.25v-3.5c-41.283 0-74.75 33.467-74.75 74.75s33.467 74.75 74.75 74.75v-3.5c-39.35 0-71.25-31.9-71.25-71.25zm16 0c0-30.514 24.736-55.25 55.25-55.25v-3.5c-32.447 0-58.75 26.303-58.75 58.75s26.303 58.75 58.75 58.75v-3.5c-30.514 0-55.25-24.736-55.25-55.25zm55.25-39.25c-21.677 0-39.25 17.573-39.25 39.25s17.573 39.25 39.25 39.25v3.5c-23.61 0-42.75-19.14-42.75-42.75s19.14-42.75 42.75-42.75zm-22.25 39.25c0-12.288 9.962-22.25 22.25-22.25v-3.5c-14.221 0-25.75 11.529-25.75 25.75s11.529 25.75 25.75 25.75v-3.5c-12.288 0-22.25-9.962-22.25-22.25z"/> - <path d="m71.25 225c0-39.35-31.8997-71.25-71.25-71.25v-3.5c41.2833 0 74.75 33.467 74.75 74.75s-33.4667 74.75-74.75 74.75v-3.5c39.3503 0 71.25-31.9 71.25-71.25zm-16 0c0-30.514-24.7363-55.25-55.25-55.25v-3.5c32.4467 0 58.75 26.303 58.75 58.75s-26.3033 58.75-58.75 58.75v-3.5c30.5137 0 55.25-24.736 55.25-55.25zm-55.25-39.25c21.6772 0 39.25 17.573 39.25 39.25s-17.5728 39.25-39.25 39.25v3.5c23.6102 0 42.75-19.14 42.75-42.75s-19.1398-42.75-42.75-42.75zm22.25 39.25c0-12.288-9.9617-22.25-22.25-22.25v-3.5c14.2213 0 25.75 11.529 25.75 25.75s-11.5287 25.75-25.75 25.75v-3.5c12.2883 0 22.25-9.962 22.25-22.25z"/> - <path d="m303.75 75c0-39.3503 31.9-71.25 71.25-71.25s71.25 31.8997 71.25 71.25c0 39.35-31.9 71.25-71.25 71.25s-71.25-31.9-71.25-71.25zm71.25-74.75c-41.283 0-74.75 33.4667-74.75 74.75 0 41.283 33.467 74.75 74.75 74.75s74.75-33.467 74.75-74.75c0-41.2833-33.467-74.75-74.75-74.75zm-55.25 74.75c0-30.5137 24.736-55.25 55.25-55.25s55.25 24.7363 55.25 55.25c0 30.514-24.736 55.25-55.25 55.25s-55.25-24.736-55.25-55.25zm55.25-58.75c-32.447 0-58.75 26.3033-58.75 58.75 0 32.447 26.303 58.75 58.75 58.75s58.75-26.303 58.75-58.75c0-32.4467-26.303-58.75-58.75-58.75zm0 19.5c-21.677 0-39.25 17.5728-39.25 39.25s17.573 39.25 39.25 39.25 39.25-17.5728 39.25-39.25-17.573-39.25-39.25-39.25zm-42.75 39.25c0-23.6102 19.14-42.75 42.75-42.75s42.75 19.1398 42.75 42.75-19.14 42.75-42.75 42.75-42.75-19.1398-42.75-42.75zm20.5 0c0-12.2883 9.962-22.25 22.25-22.25s22.25 9.9617 22.25 22.25-9.962 22.25-22.25 22.25-22.25-9.9617-22.25-22.25zm22.25-25.75c-14.221 0-25.75 11.5287-25.75 25.75s11.529 25.75 25.75 25.75 25.75-11.5287 25.75-25.75-11.529-25.75-25.75-25.75z"/> - <path d="m603.75 75c0-39.3503 31.9-71.25 71.25-71.25s71.25 31.8997 71.25 71.25c0 39.35-31.9 71.25-71.25 71.25s-71.25-31.9-71.25-71.25zm71.25-74.75c-41.283 0-74.75 33.4667-74.75 74.75 0 41.283 33.467 74.75 74.75 74.75s74.75-33.467 74.75-74.75c0-41.2833-33.467-74.75-74.75-74.75zm-55.25 74.75c0-30.5137 24.736-55.25 55.25-55.25s55.25 24.7363 55.25 55.25c0 30.514-24.736 55.25-55.25 55.25s-55.25-24.736-55.25-55.25zm55.25-58.75c-32.447 0-58.75 26.3033-58.75 58.75 0 32.447 26.303 58.75 58.75 58.75s58.75-26.303 58.75-58.75c0-32.4467-26.303-58.75-58.75-58.75zm0 19.5c-21.677 0-39.25 17.5728-39.25 39.25s17.573 39.25 39.25 39.25 39.25-17.5728 39.25-39.25-17.573-39.25-39.25-39.25zm-42.75 39.25c0-23.6102 19.14-42.75 42.75-42.75s42.75 19.1398 42.75 42.75-19.14 42.75-42.75 42.75-42.75-19.1398-42.75-42.75zm20.5 0c0-12.2883 9.962-22.25 22.25-22.25s22.25 9.9617 22.25 22.25-9.962 22.25-22.25 22.25-22.25-9.9617-22.25-22.25zm22.25-25.75c-14.221 0-25.75 11.5287-25.75 25.75s11.529 25.75 25.75 25.75 25.75-11.5287 25.75-25.75-11.529-25.75-25.75-25.75z"/> - <path d="m150 150.25c-.878 0-1.753.015-2.624.045-.966.034-1.722.844-1.689 1.81.033.965.843 1.721 1.809 1.688.831-.029 1.666-.043 2.504-.043s1.673.014 2.504.043c.966.033 1.776-.723 1.809-1.688.033-.966-.723-1.776-1.689-1.81-.871-.03-1.746-.045-2.624-.045zm-11.449 4.415c.954-.154 1.603-1.053 1.449-2.007s-1.053-1.603-2.007-1.449c-1.735.281-3.45.621-5.143 1.018-.941.221-1.525 1.163-1.304 2.104s1.163 1.524 2.104 1.303c1.613-.378 3.248-.702 4.901-.969zm23.456-3.456c-.954-.154-1.853.495-2.007 1.449s.495 1.853 1.449 2.007c1.653.267 3.288.591 4.901.969.941.221 1.883-.362 2.104-1.303s-.363-1.883-1.304-2.104c-1.693-.397-3.408-.737-5.143-1.018zm-36.956 7.031c.905-.339 1.365-1.347 1.026-2.252-.338-.906-1.347-1.365-2.252-1.027-1.642.615-3.258 1.285-4.843 2.009-.879.401-1.266 1.439-.865 2.319.402.879 1.44 1.266 2.319.865 1.511-.69 3.05-1.329 4.615-1.914zm51.124-3.279c-.905-.338-1.914.121-2.252 1.027-.339.905.121 1.913 1.026 2.252 1.565.585 3.104 1.224 4.615 1.914.879.401 1.917.014 2.319-.865.401-.88.014-1.918-.865-2.319-1.585-.724-3.201-1.394-4.843-2.009zm-63.661 9.436c.821-.51 1.074-1.588.565-2.41-.509-.821-1.588-1.074-2.41-.565-1.487.922-2.94 1.895-4.355 2.916-.784.565-.961 1.659-.395 2.443.565.784 1.659.961 2.443.395 1.349-.973 2.734-1.9 4.152-2.779zm76.817-2.975c-.822-.509-1.901-.256-2.41.565-.509.822-.256 1.9.565 2.41 1.418.879 2.803 1.806 4.152 2.779.784.566 1.878.389 2.443-.395.566-.784.389-1.878-.395-2.443-1.415-1.021-2.868-1.994-4.355-2.916zm-87.915 11.461c.707-.659.745-1.767.086-2.474-.659-.706-1.7663-.745-2.4731-.086-1.2779 1.192-2.5139 2.428-3.7057 3.706-.6591.707-.6205 1.814.0863 2.473s1.8142.621 2.4733-.086c1.1363-1.218 2.3152-2.397 3.5332-3.533zm99.555-2.56c-.707-.659-1.814-.62-2.473.086-.659.707-.621 1.815.086 2.474 1.218 1.136 2.397 2.315 3.533 3.533.659.707 1.767.745 2.474.086.706-.659.745-1.766.086-2.473-1.192-1.278-2.428-2.514-3.706-3.706zm-108.7948 13.039c.5655-.784.3884-1.878-.3954-2.443-.7838-.566-1.8776-.389-2.4431.395-1.021 1.415-1.9938 2.868-2.9158 4.355-.5092.822-.2561 1.901.5653 2.41.8215.509 1.9003.256 2.4095-.565.8789-1.418 1.8061-2.803 2.7795-4.152zm118.4858-2.048c-.565-.784-1.659-.961-2.443-.395-.784.565-.961 1.659-.395 2.443.973 1.349 1.9 2.734 2.779 4.152.51.821 1.588 1.074 2.41.565.821-.509 1.074-1.588.565-2.41-.922-1.487-1.895-2.94-2.916-4.355zm-125.5085 14.122c.4015-.879.0143-1.917-.8649-2.319-.8792-.401-1.9173-.014-2.3188.865-.724 1.585-1.3942 3.201-2.0083 4.843-.3385.905.121 1.914 1.0263 2.252.9053.339 1.9135-.121 2.252-1.026.5852-1.565 1.2238-3.104 1.9137-4.615zm132.8765-1.454c-.401-.879-1.439-1.266-2.319-.865-.879.402-1.266 1.44-.865 2.319.69 1.511 1.329 3.05 1.914 4.615.339.905 1.347 1.365 2.252 1.026.906-.338 1.365-1.347 1.027-2.252-.615-1.642-1.285-3.258-2.009-4.843zm-137.3955 14.668c.2209-.941-.3628-1.883-1.3037-2.104s-1.8828.363-2.1037 1.304c-.3975 1.693-.7374 3.408-1.0176 5.143-.1541.954.4944 1.853 1.4486 2.007.9541.154 1.8525-.495 2.0066-1.449.267-1.653.591-3.288.9698-4.901zm142.1385-.8c-.221-.941-1.163-1.525-2.104-1.304s-1.524 1.163-1.303 2.104c.378 1.613.702 3.248.969 4.901.154.954 1.053 1.603 2.007 1.449s1.603-1.053 1.449-2.007c-.281-1.735-.621-3.45-1.018-5.143zm-143.9799 14.646c.0334-.966-.7226-1.776-1.6885-1.809-.966-.033-1.776.723-1.8094 1.689-.03.871-.0452 1.746-.0452 2.624s.0152 1.753.0452 2.624c.0334.966.8434 1.722 1.8094 1.689.9659-.033 1.7219-.843 1.6885-1.809-.0286-.831-.0431-1.666-.0431-2.504s.0145-1.673.0431-2.504zm145.9119-.12c-.034-.966-.844-1.722-1.81-1.689-.965.033-1.721.843-1.688 1.809.029.831.043 1.666.043 2.504s-.014 1.673-.043 2.504c-.033.966.723 1.776 1.688 1.809.966.033 1.776-.723 1.81-1.689.03-.871.045-1.746.045-2.624s-.015-1.753-.045-2.624zm-145.0403 14.073c-.1541-.954-1.0525-1.603-2.0066-1.449-.9542.154-1.6027 1.053-1.4486 2.007.2802 1.735.6201 3.45 1.0176 5.143.2209.941 1.1628 1.525 2.1037 1.304s1.5246-1.163 1.3037-2.104c-.3788-1.613-.7028-3.248-.9698-4.901zm144.1263.558c.154-.954-.495-1.853-1.449-2.007s-1.853.495-2.007 1.449c-.267 1.653-.591 3.288-.969 4.901-.221.941.362 1.883 1.303 2.104s1.883-.363 2.104-1.304c.397-1.693.737-3.408 1.018-5.143zm-140.5512 12.942c-.3385-.905-1.3467-1.365-2.252-1.026-.9053.338-1.3648 1.347-1.0263 2.252.6141 1.642 1.2843 3.258 2.0083 4.843.4015.879 1.4396 1.266 2.3188.865.8792-.402 1.2664-1.44.8649-2.319-.6899-1.511-1.3285-3.05-1.9137-4.615zm136.7992 1.226c.338-.905-.121-1.914-1.027-2.252-.905-.339-1.913.121-2.252 1.026-.585 1.565-1.224 3.104-1.914 4.615-.401.879-.014 1.917.865 2.319.88.401 1.918.014 2.319-.865.724-1.585 1.394-3.201 2.009-4.843zm-130.6423 11.311c-.5093-.821-1.588-1.074-2.4095-.565-.8214.509-1.0745 1.588-.5653 2.41.922 1.487 1.8948 2.94 2.9158 4.355.5655.784 1.6593.961 2.4431.395.7838-.565.9609-1.659.3954-2.443-.9734-1.349-1.9006-2.734-2.7795-4.152zm124.1813 1.845c.509-.822.256-1.901-.565-2.41-.822-.509-1.9-.256-2.41.565-.879 1.418-1.806 2.803-2.779 4.152-.566.784-.389 1.878.395 2.443.784.566 1.878.389 2.443-.395 1.021-1.415 1.994-2.868 2.916-4.355zm-115.6952 9.253c-.6592-.707-1.7665-.745-2.4733-.086s-.7455 1.766-.0863 2.473c1.1918 1.278 2.4278 2.514 3.7057 3.706.7068.659 1.8141.62 2.4731-.086.659-.707.621-1.815-.086-2.474-1.218-1.136-2.3969-2.315-3.5332-3.533zm106.7942 2.387c.659-.707.62-1.814-.086-2.473-.707-.659-1.815-.621-2.474.086-1.136 1.218-2.315 2.397-3.533 3.533-.707.659-.745 1.767-.086 2.474.659.706 1.766.745 2.473.086 1.278-1.192 2.514-2.428 3.706-3.706zm-96.315 6.853c-.784-.566-1.878-.389-2.443.395-.566.784-.389 1.878.395 2.443 1.415 1.021 2.868 1.994 4.355 2.916.822.509 1.901.256 2.41-.565.509-.822.256-1.9-.565-2.41-1.418-.879-2.803-1.806-4.152-2.779zm85.324 2.838c.784-.565.961-1.659.395-2.443-.565-.784-1.659-.961-2.443-.395-1.349.973-2.734 1.9-4.152 2.779-.821.51-1.074 1.588-.565 2.41.509.821 1.588 1.074 2.41.565 1.487-.922 2.94-1.895 4.355-2.916zm-73.25 4.184c-.879-.401-1.917-.014-2.319.865-.401.88-.014 1.918.865 2.319 1.585.724 3.201 1.394 4.843 2.009.905.338 1.914-.121 2.252-1.027.339-.905-.121-1.913-1.026-2.252-1.565-.585-3.104-1.224-4.615-1.914zm60.582 3.184c.879-.401 1.266-1.439.865-2.319-.402-.879-1.44-1.266-2.319-.865-1.511.69-3.05 1.329-4.615 1.914-.905.339-1.365 1.347-1.026 2.252.338.906 1.347 1.365 2.252 1.027 1.642-.615 3.258-1.285 4.843-2.009zm-47.368 1.336c-.941-.221-1.883.362-2.104 1.303s.363 1.883 1.304 2.104c1.693.397 3.408.737 5.143 1.018.954.154 1.853-.495 2.007-1.449s-.495-1.853-1.449-2.007c-1.653-.267-3.288-.591-4.901-.969zm33.5 3.407c.941-.221 1.525-1.163 1.304-2.104s-1.163-1.524-2.104-1.303c-1.613.378-3.248.702-4.901.969-.954.154-1.603 1.053-1.449 2.007s1.053 1.603 2.007 1.449c1.735-.281 3.45-.621 5.143-1.018zm-19.654-1.566c-.966-.033-1.776.723-1.809 1.688-.033.966.723 1.776 1.689 1.81.871.03 1.746.045 2.624.045s1.753-.015 2.624-.045c.966-.034 1.722-.844 1.689-1.81-.033-.965-.843-1.721-1.809-1.688-.831.029-1.666.043-2.504.043s-1.673-.014-2.504-.043zm2.504-130.957c-.802 0-1.601.016-2.396.047-.965.038-1.717.852-1.679 1.818s.852 1.718 1.817 1.679c.749-.029 1.502-.044 2.258-.044s1.509.015 2.258.044c.966.039 1.779-.713 1.817-1.679s-.714-1.78-1.679-1.818c-.795-.031-1.594-.047-2.396-.047zm-10.317 4.444c.95-.176 1.578-1.09 1.402-2.04s-1.089-1.578-2.04-1.402c-1.579.293-3.136.648-4.668 1.062-.933.252-1.485 1.213-1.233 2.146s1.213 1.485 2.146 1.233c1.442-.39 2.907-.724 4.393-.999zm21.272-3.442c-.951-.176-1.864.452-2.04 1.402s.452 1.864 1.402 2.04c1.486.275 2.951.609 4.393.999.933.252 1.894-.3 2.146-1.233s-.3-1.894-1.233-2.146c-1.532-.414-3.089-.769-4.668-1.062zm12.799 3.907c-.887-.385-1.917.022-2.302.909-.384.887.023 1.917.909 2.302 1.383.599 2.737 1.253 4.059 1.958.853.454 1.913.132 2.368-.721.454-.853.132-1.913-.721-2.368-1.405-.749-2.844-1.443-4.313-2.08zm-46.115 3.211c.886-.385 1.293-1.415.909-2.302-.385-.887-1.415-1.294-2.302-.909-1.469.637-2.908 1.331-4.313 2.08-.853.455-1.175 1.515-.721 2.368.455.853 1.515 1.175 2.368.721 1.322-.705 2.676-1.359 4.059-1.958zm-10.921 6.278c.779-.573.946-1.668.373-2.447-.572-.778-1.667-.945-2.446-.373-1.287.946-2.535 1.943-3.741 2.987-.731.633-.81 1.738-.177 2.469.632.73 1.738.81 2.468.177 1.136-.983 2.311-1.922 3.523-2.813zm68.637-2.82c-.779-.572-1.874-.405-2.446.373-.573.779-.406 1.874.373 2.447 1.212.891 2.387 1.83 3.523 2.813.73.633 1.836.553 2.468-.177.633-.731.554-1.836-.177-2.469-1.206-1.044-2.454-2.041-3.741-2.987zm-77.894 11.367c.633-.73.553-1.836-.177-2.468-.731-.633-1.836-.554-2.469.177-1.044 1.206-2.041 2.454-2.987 3.741-.572.779-.405 1.874.373 2.446.779.573 1.874.406 2.447-.373.891-1.212 1.83-2.387 2.813-3.523zm87.724-2.291c-.633-.731-1.738-.81-2.469-.177-.73.632-.81 1.738-.177 2.468.983 1.136 1.922 2.311 2.813 3.523.573.779 1.668.946 2.447.373.778-.572.945-1.667.373-2.446-.946-1.287-1.943-2.535-2.987-3.741zm7.576 11.029c-.455-.853-1.515-1.175-2.368-.721-.853.455-1.175 1.515-.721 2.368.705 1.322 1.359 2.676 1.958 4.059.385.886 1.415 1.293 2.302.909.887-.385 1.294-1.415.909-2.302-.637-1.469-1.331-2.908-2.08-4.313zm-102.433 1.647c.454-.853.132-1.913-.7213-2.368-.8529-.454-1.9128-.132-2.3675.721-.7489 1.405-1.4433 2.844-2.0805 4.313-.3846.887.0224 1.917.9091 2.302.8867.384 1.9173-.023 2.3019-.909.5996-1.383 1.2532-2.737 1.9583-4.059zm-4.6354 11.71c.2521-.933-.2999-1.894-1.233-2.146-.933-.252-1.8937.3-2.1459 1.233-.4141 1.532-.7688 3.089-1.0614 4.668-.1761.951.4515 1.864 1.4018 2.04s1.8635-.452 2.0396-1.402c.2754-1.486.6092-2.951.9989-4.393zm111.9934-.913c-.252-.933-1.213-1.485-2.146-1.233s-1.485 1.213-1.233 2.146c.39 1.442.724 2.907.999 4.393.176.95 1.09 1.578 2.04 1.402s1.578-1.089 1.402-2.04c-.293-1.579-.648-3.136-1.062-4.668zm-113.8915 13.365c.0381-.966-.7139-1.779-1.6797-1.817-.9657-.038-1.7795.714-1.8176 1.679-.0314.795-.0472 1.594-.0472 2.396s.0158 1.601.0472 2.396c.0381.965.8519 1.717 1.8176 1.679.9658-.038 1.7178-.852 1.6797-1.817-.0296-.749-.0445-1.502-.0445-2.258s.0149-1.509.0445-2.258zm115.9085-.138c-.038-.965-.852-1.717-1.818-1.679s-1.718.852-1.679 1.817c.029.749.044 1.502.044 2.258s-.015 1.509-.044 2.258c-.039.966.713 1.779 1.679 1.817s1.78-.714 1.818-1.679c.031-.795.047-1.594.047-2.396s-.016-1.601-.047-2.396zm-115.0093 12.713c-.1761-.95-1.0893-1.578-2.0396-1.402s-1.5779 1.089-1.4018 2.04c.2926 1.579.6473 3.136 1.0614 4.668.2521.933 1.2129 1.485 2.1459 1.233.9331-.252 1.4851-1.213 1.233-2.146-.3897-1.442-.7235-2.907-.9989-4.393zm114.0543.638c.176-.951-.452-1.864-1.402-2.04s-1.864.452-2.04 1.402c-.275 1.486-.609 2.951-.999 4.393-.252.933.3 1.894 1.233 2.146s1.894-.3 2.146-1.233c.414-1.532.769-3.089 1.062-4.668zm-110.3783 11.406c-.3846-.886-1.4152-1.293-2.3019-.909-.8867.385-1.2937 1.415-.9091 2.302.6372 1.469 1.3316 2.908 2.0805 4.313.4547.853 1.5146 1.175 2.3675.721.8533-.455 1.1753-1.515.7213-2.368-.7051-1.322-1.3587-2.676-1.9583-4.059zm106.4713 1.393c.385-.887-.022-1.917-.909-2.302-.887-.384-1.917.023-2.302.909-.599 1.383-1.253 2.737-1.958 4.059-.454.853-.132 1.913.721 2.368.853.454 1.913.132 2.368-.721.749-1.405 1.443-2.844 2.08-4.313zm-100.193 9.528c-.573-.779-1.668-.946-2.447-.373-.778.572-.945 1.667-.373 2.446.946 1.287 1.943 2.535 2.987 3.741.633.731 1.738.81 2.469.177.73-.632.81-1.738.177-2.468-.983-1.136-1.922-2.311-2.813-3.523zm93.524 2.073c.572-.779.405-1.874-.373-2.446-.779-.573-1.874-.406-2.447.373-.891 1.212-1.83 2.387-2.813 3.523-.633.73-.553 1.836.177 2.468.731.633 1.836.554 2.469-.177 1.044-1.206 2.041-2.454 2.987-3.741zm-84.977 7.184c-.73-.633-1.836-.553-2.468.177-.633.731-.554 1.836.177 2.469 1.206 1.044 2.454 2.041 3.741 2.987.779.572 1.874.405 2.446-.373.573-.779.406-1.874-.373-2.447-1.212-.891-2.387-1.83-3.523-2.813zm75.901 2.646c.731-.633.81-1.738.177-2.469-.632-.73-1.738-.81-2.468-.177-1.136.983-2.311 1.922-3.523 2.813-.779.573-.946 1.668-.373 2.447.572.778 1.667.945 2.446.373 1.287-.946 2.535-1.943 3.741-2.987zm-65.516 4.487c-.853-.454-1.913-.132-2.368.721-.454.853-.132 1.913.721 2.368 1.405.749 2.844 1.443 4.313 2.08.887.385 1.917-.022 2.302-.909.384-.887-.023-1.917-.909-2.302-1.383-.599-2.737-1.253-4.059-1.958zm54.487 3.089c.853-.455 1.175-1.515.721-2.368-.455-.853-1.515-1.175-2.368-.721-1.322.705-2.676 1.359-4.059 1.958-.886.385-1.293 1.415-.909 2.302.385.887 1.415 1.294 2.302.909 1.469-.637 2.908-1.331 4.313-2.08zm-42.777 1.546c-.933-.252-1.894.3-2.146 1.233s.3 1.894 1.233 2.146c1.532.414 3.089.769 4.668 1.062.951.176 1.864-.452 2.04-1.402s-.452-1.864-1.402-2.04c-1.486-.275-2.951-.609-4.393-.999zm30.333 3.379c.933-.252 1.485-1.213 1.233-2.146s-1.213-1.485-2.146-1.233c-1.442.39-2.907.724-4.393.999-.95.176-1.578 1.09-1.402 2.04s1.089 1.578 2.04 1.402c1.579-.293 3.136-.648 4.668-1.062zm-17.881-1.48c-.966-.039-1.779.713-1.817 1.679s.714 1.78 1.679 1.818c.795.031 1.594.047 2.396.047s1.601-.016 2.396-.047c.965-.038 1.717-.852 1.679-1.818s-.852-1.718-1.817-1.679c-.749.029-1.502.044-2.258.044s-1.509-.015-2.258-.044zm-.139-98.89c.794-.044 1.593-.066 2.397-.066s1.603.022 2.397.066c.965.053 1.704.879 1.65 1.844-.053.965-.878 1.704-1.843 1.651-.73-.041-1.464-.061-2.204-.061s-1.474.02-2.204.061c-.965.053-1.79-.686-1.843-1.651-.054-.965.685-1.791 1.65-1.844zm-6.378 2.587c.247.934-.312 1.891-1.246 2.137-1.429.377-2.826.831-4.186 1.36-.901.35-1.915-.097-2.265-.998s.097-1.915.997-2.265c1.483-.576 3.005-1.071 4.563-1.481.934-.246 1.891.312 2.137 1.247zm17.55 0c.246-.935 1.203-1.493 2.137-1.247 1.558.41 3.08.905 4.563 1.481.901.35 1.347 1.364.997 2.265s-1.364 1.348-2.265.998c-1.36-.529-2.757-.983-4.186-1.36-.934-.246-1.493-1.203-1.246-2.137zm-29.509 4.675c.525.812.291 1.895-.521 2.419-1.236.798-2.424 1.663-3.559 2.591-.749.611-1.851.5-2.463-.248-.611-.749-.5-1.851.248-2.463 1.236-1.01 2.53-1.952 3.876-2.82.812-.525 1.895-.291 2.419.521zm41.468 0c.524-.812 1.607-1.046 2.419-.521 1.346.868 2.64 1.81 3.876 2.82.748.612.859 1.714.248 2.463-.612.748-1.714.859-2.463.248-1.135-.928-2.323-1.793-3.559-2.591-.812-.524-1.046-1.607-.521-2.419zm-51.394 8.145c.748.612.859 1.714.248 2.463-.928 1.135-1.793 2.323-2.591 3.559-.524.812-1.607 1.046-2.419.521-.812-.524-1.046-1.607-.521-2.419.868-1.346 1.81-2.64 2.82-3.876.612-.748 1.714-.859 2.463-.248zm61.32 0c.749-.611 1.851-.5 2.463.248 1.01 1.236 1.952 2.53 2.82 3.876.525.812.291 1.895-.521 2.419-.812.525-1.895.291-2.419-.521-.798-1.236-1.663-2.424-2.591-3.559-.611-.749-.5-1.851.248-2.463zm-68.258 10.805c.901.35 1.348 1.364.998 2.265-.529 1.36-.983 2.757-1.36 4.186-.246.934-1.203 1.493-2.137 1.246-.935-.246-1.493-1.203-1.247-2.137.41-1.558.905-3.08 1.481-4.563.35-.9 1.364-1.347 2.265-.997zm75.196 0c.901-.35 1.915.097 2.265.997.576 1.483 1.071 3.005 1.481 4.563.246.934-.312 1.891-1.247 2.137-.934.247-1.891-.312-2.137-1.246-.377-1.429-.831-2.826-1.36-4.186-.35-.901.097-1.915.998-2.265zm-78.438 12.425c.965.053 1.704.878 1.651 1.843-.041.73-.061 1.464-.061 2.204s.02 1.474.061 2.204c.053.965-.686 1.79-1.651 1.843-.965.054-1.791-.685-1.844-1.65-.044-.794-.066-1.593-.066-2.397s.022-1.603.066-2.397c.053-.965.879-1.704 1.844-1.65zm81.68 0c.965-.054 1.791.685 1.844 1.65.044.794.066 1.593.066 2.397s-.022 1.603-.066 2.397c-.053.965-.879 1.704-1.844 1.65-.965-.053-1.704-.878-1.651-1.843.041-.73.061-1.464.061-2.204s-.02-1.474-.061-2.204c-.053-.965.686-1.79 1.651-1.843zm-80.937 12.822c.934-.247 1.891.312 2.137 1.246.377 1.429.831 2.826 1.36 4.186.35.901-.097 1.915-.998 2.265s-1.915-.097-2.265-.997c-.576-1.483-1.071-3.005-1.481-4.563-.246-.934.312-1.891 1.247-2.137zm80.194 0c.935.246 1.493 1.203 1.247 2.137-.41 1.558-.905 3.08-1.481 4.563-.35.901-1.364 1.347-2.265.997s-1.348-1.364-.998-2.265c.529-1.36.983-2.757 1.36-4.186.246-.934 1.203-1.493 2.137-1.246zm-75.519 11.959c.812-.525 1.895-.291 2.419.521.798 1.236 1.663 2.424 2.591 3.559.611.749.5 1.851-.248 2.463-.749.611-1.851.5-2.463-.248-1.01-1.236-1.952-2.53-2.82-3.876-.525-.812-.291-1.895.521-2.419zm70.844 0c.812.524 1.046 1.607.521 2.419-.868 1.346-1.81 2.64-2.82 3.876-.612.748-1.714.859-2.463.248-.748-.612-.859-1.714-.248-2.463.928-1.135 1.793-2.323 2.591-3.559.524-.812 1.607-1.046 2.419-.521zm-62.699 9.926c.612-.748 1.714-.859 2.463-.248 1.135.928 2.323 1.793 3.559 2.591.812.524 1.046 1.607.521 2.419-.524.812-1.607 1.046-2.419.521-1.346-.868-2.64-1.81-3.876-2.82-.748-.612-.859-1.714-.248-2.463zm54.554 0c.611.749.5 1.851-.248 2.463-1.236 1.01-2.53 1.952-3.876 2.82-.812.525-1.895.291-2.419-.521-.525-.812-.291-1.895.521-2.419 1.236-.798 2.424-1.663 3.559-2.591.749-.611 1.851-.5 2.463.248zm-43.749 6.938c.35-.901 1.364-1.348 2.265-.998 1.36.529 2.757.983 4.186 1.36.934.246 1.493 1.203 1.246 2.137-.246.935-1.203 1.493-2.137 1.247-1.558-.41-3.08-.905-4.563-1.481-.9-.35-1.347-1.364-.997-2.265zm32.944 0c.35.901-.097 1.915-.997 2.265-1.483.576-3.005 1.071-4.563 1.481-.934.246-1.891-.312-2.137-1.247-.247-.934.312-1.891 1.246-2.137 1.429-.377 2.826-.831 4.186-1.36.901-.35 1.915.097 2.265.998zm-20.519 3.242c.053-.965.878-1.704 1.843-1.651.73.041 1.464.061 2.204.061s1.474-.02 2.204-.061c.965-.053 1.79.686 1.843 1.651.054.965-.685 1.791-1.65 1.844-.794.044-1.593.066-2.397.066s-1.603-.022-2.397-.066c-.965-.053-1.704-.879-1.65-1.844zm4.047-66.59c-.81 0-1.612.037-2.403.111-.963.089-1.671.941-1.582 1.904.09.962.942 1.67 1.904 1.581.685-.064 1.379-.096 2.081-.096s1.396.032 2.081.096c.962.089 1.814-.619 1.904-1.581.089-.963-.619-1.815-1.582-1.904-.791-.074-1.593-.111-2.403-.111zm10.74 2.34c-.878-.403-1.917-.018-2.32.86-.404.878-.019 1.917.859 2.321 1.267.582 2.47 1.28 3.596 2.08.788.56 1.88.375 2.44-.412.56-.788.376-1.881-.412-2.441-1.303-.925-2.695-1.733-4.163-2.408zm-20.019 3.181c.878-.404 1.263-1.443.859-2.321-.403-.878-1.442-1.263-2.32-.86-1.468.675-2.86 1.483-4.163 2.408-.788.56-.972 1.653-.412 2.441.56.787 1.652.972 2.44.412 1.126-.8 2.329-1.498 3.596-2.08zm30.281 5.326c-.56-.788-1.653-.972-2.441-.412s-.972 1.652-.412 2.44c.8 1.126 1.498 2.329 2.08 3.596.404.878 1.443 1.263 2.321.859.878-.403 1.263-1.442.86-2.32-.675-1.468-1.483-2.86-2.408-4.163zm-39.151 2.028c.56-.788.375-1.88-.412-2.44-.788-.56-1.881-.376-2.441.412-.925 1.303-1.733 2.695-2.408 4.163-.403.878-.018 1.917.86 2.32.878.404 1.917.019 2.321-.859.582-1.267 1.28-2.47 2.08-3.596zm-4.005 10.794c.089-.962-.619-1.814-1.581-1.904-.963-.089-1.815.619-1.904 1.582-.074.791-.111 1.593-.111 2.403s.037 1.612.111 2.403c.089.963.941 1.671 1.904 1.582.962-.09 1.67-.942 1.581-1.904-.064-.685-.096-1.379-.096-2.081s.032-1.396.096-2.081zm47.793-.322c-.089-.963-.941-1.671-1.904-1.582-.962.09-1.67.942-1.581 1.904.064.685.096 1.379.096 2.081s-.032 1.396-.096 2.081c-.089.962.619 1.814 1.581 1.904.963.089 1.815-.619 1.904-1.582.074-.791.111-1.593.111-2.403s-.037-1.612-.111-2.403zm-2.229 13.143c.403-.878.018-1.917-.86-2.32-.878-.404-1.917-.019-2.321.859-.582 1.267-1.28 2.47-2.08 3.596-.56.788-.376 1.88.412 2.44s1.881.376 2.441-.412c.925-1.303 1.733-2.695 2.408-4.163zm-43.639-1.461c-.404-.878-1.443-1.263-2.321-.859-.878.403-1.263 1.442-.86 2.32.675 1.468 1.483 2.86 2.408 4.163.56.788 1.653.972 2.441.412.787-.56.972-1.652.412-2.44-.8-1.126-1.498-2.329-2.08-3.596zm7.354 8.87c-.788-.56-1.88-.376-2.44.412s-.376 1.881.412 2.441c1.303.925 2.695 1.733 4.163 2.408.878.403 1.917.018 2.32-.86.404-.878.019-1.917-.859-2.321-1.267-.582-2.47-1.28-3.596-2.08zm27.778 2.853c.788-.56.972-1.653.412-2.441s-1.652-.972-2.44-.412c-1.126.8-2.329 1.498-3.596 2.08-.878.404-1.263 1.443-.859 2.321.403.878 1.442 1.263 2.32.86 1.468-.675 2.86-1.483 4.163-2.408zm-16.984 1.152c-.962-.089-1.814.619-1.904 1.581-.089.963.619 1.815 1.582 1.904.791.074 1.593.111 2.403.111s1.612-.037 2.403-.111c.963-.089 1.671-.941 1.582-1.904-.09-.962-.942-1.67-1.904-1.581-.685.064-1.379.096-2.081.096s-1.396-.032-2.081-.096z"/> - <path d="m750 150.25c-.878 0-1.753.015-2.624.045-.966.034-1.722.844-1.689 1.81.033.965.843 1.721 1.809 1.688.831-.029 1.666-.043 2.504-.043s1.673.014 2.504.043c.966.033 1.776-.723 1.809-1.688.033-.966-.723-1.776-1.689-1.81-.871-.03-1.746-.045-2.624-.045zm-11.449 4.415c.954-.154 1.603-1.053 1.449-2.007s-1.053-1.603-2.007-1.449c-1.735.281-3.45.621-5.143 1.018-.941.221-1.525 1.163-1.304 2.104s1.163 1.524 2.104 1.303c1.613-.378 3.248-.702 4.901-.969zm23.456-3.456c-.954-.154-1.853.495-2.007 1.449s.495 1.853 1.449 2.007c1.653.267 3.288.591 4.901.969.941.221 1.883-.362 2.104-1.303s-.363-1.883-1.304-2.104c-1.693-.397-3.408-.737-5.143-1.018zm-36.956 7.031c.905-.339 1.365-1.347 1.026-2.252-.338-.906-1.347-1.365-2.252-1.027-1.642.615-3.258 1.285-4.843 2.009-.879.401-1.266 1.439-.865 2.319.402.879 1.44 1.266 2.319.865 1.511-.69 3.05-1.329 4.615-1.914zm51.124-3.279c-.905-.338-1.914.121-2.252 1.027-.339.905.121 1.913 1.026 2.252 1.565.585 3.104 1.224 4.615 1.914.879.401 1.917.014 2.319-.865.401-.88.014-1.918-.865-2.319-1.585-.724-3.201-1.394-4.843-2.009zm-63.661 9.436c.821-.51 1.074-1.588.565-2.41-.509-.821-1.588-1.074-2.41-.565-1.487.922-2.94 1.895-4.355 2.916-.784.565-.961 1.659-.395 2.443.565.784 1.659.961 2.443.395 1.349-.973 2.734-1.9 4.152-2.779zm76.817-2.975c-.822-.509-1.901-.256-2.41.565-.509.822-.256 1.9.565 2.41 1.418.879 2.803 1.806 4.152 2.779.784.566 1.878.389 2.443-.395.566-.784.389-1.878-.395-2.443-1.415-1.021-2.868-1.994-4.355-2.916zm-87.915 11.461c.707-.659.745-1.767.086-2.474-.659-.706-1.766-.745-2.473-.086-1.278 1.192-2.514 2.428-3.706 3.706-.659.707-.62 1.814.086 2.473.707.659 1.815.621 2.474-.086 1.136-1.218 2.315-2.397 3.533-3.533zm99.555-2.56c-.707-.659-1.814-.62-2.473.086-.659.707-.621 1.815.086 2.474 1.218 1.136 2.397 2.315 3.533 3.533.659.707 1.767.745 2.474.086.706-.659.745-1.766.086-2.473-1.192-1.278-2.428-2.514-3.706-3.706zm-108.795 13.039c.566-.784.389-1.878-.395-2.443-.784-.566-1.878-.389-2.443.395-1.021 1.415-1.994 2.868-2.916 4.355-.509.822-.256 1.901.565 2.41.822.509 1.9.256 2.41-.565.879-1.418 1.806-2.803 2.779-4.152zm118.486-2.048c-.565-.784-1.659-.961-2.443-.395-.784.565-.961 1.659-.395 2.443.973 1.349 1.9 2.734 2.779 4.152.51.821 1.588 1.074 2.41.565.821-.509 1.074-1.588.565-2.41-.922-1.487-1.895-2.94-2.916-4.355zm-125.508 14.122c.401-.879.014-1.917-.865-2.319-.88-.401-1.918-.014-2.319.865-.724 1.585-1.394 3.201-2.009 4.843-.338.905.121 1.914 1.027 2.252.905.339 1.913-.121 2.252-1.026.585-1.565 1.224-3.104 1.914-4.615zm132.876-1.454c-.401-.879-1.439-1.266-2.319-.865-.879.402-1.266 1.44-.865 2.319.69 1.511 1.329 3.05 1.914 4.615.339.905 1.347 1.365 2.252 1.026.906-.338 1.365-1.347 1.027-2.252-.615-1.642-1.285-3.258-2.009-4.843zm-137.396 14.668c.221-.941-.362-1.883-1.303-2.104s-1.883.363-2.104 1.304c-.397 1.693-.737 3.408-1.018 5.143-.154.954.495 1.853 1.449 2.007s1.853-.495 2.007-1.449c.267-1.653.591-3.288.969-4.901zm142.139-.8c-.221-.941-1.163-1.525-2.104-1.304s-1.524 1.163-1.303 2.104c.378 1.613.702 3.248.969 4.901.154.954 1.053 1.603 2.007 1.449s1.603-1.053 1.449-2.007c-.281-1.735-.621-3.45-1.018-5.143zm-143.98 14.646c.033-.966-.723-1.776-1.688-1.809-.966-.033-1.776.723-1.81 1.689-.03.871-.045 1.746-.045 2.624s.015 1.753.045 2.624c.034.966.844 1.722 1.81 1.689.965-.033 1.721-.843 1.688-1.809-.029-.831-.043-1.666-.043-2.504s.014-1.673.043-2.504zm145.912-.12c-.034-.966-.844-1.722-1.81-1.689-.965.033-1.721.843-1.688 1.809.029.831.043 1.666.043 2.504s-.014 1.673-.043 2.504c-.033.966.723 1.776 1.688 1.809.966.033 1.776-.723 1.81-1.689.03-.871.045-1.746.045-2.624s-.015-1.753-.045-2.624zm-145.04 14.073c-.154-.954-1.053-1.603-2.007-1.449s-1.603 1.053-1.449 2.007c.281 1.735.621 3.45 1.018 5.143.221.941 1.163 1.525 2.104 1.304s1.524-1.163 1.303-2.104c-.378-1.613-.702-3.248-.969-4.901zm144.126.558c.154-.954-.495-1.853-1.449-2.007s-1.853.495-2.007 1.449c-.267 1.653-.591 3.288-.969 4.901-.221.941.362 1.883 1.303 2.104s1.883-.363 2.104-1.304c.397-1.693.737-3.408 1.018-5.143zm-140.551 12.942c-.339-.905-1.347-1.365-2.252-1.026-.906.338-1.365 1.347-1.027 2.252.615 1.642 1.285 3.258 2.009 4.843.401.879 1.439 1.266 2.319.865.879-.402 1.266-1.44.865-2.319-.69-1.511-1.329-3.05-1.914-4.615zm136.799 1.226c.338-.905-.121-1.914-1.027-2.252-.905-.339-1.913.121-2.252 1.026-.585 1.565-1.224 3.104-1.914 4.615-.401.879-.014 1.917.865 2.319.88.401 1.918.014 2.319-.865.724-1.585 1.394-3.201 2.009-4.843zm-130.642 11.311c-.51-.821-1.588-1.074-2.41-.565-.821.509-1.074 1.588-.565 2.41.922 1.487 1.895 2.94 2.916 4.355.565.784 1.659.961 2.443.395.784-.565.961-1.659.395-2.443-.973-1.349-1.9-2.734-2.779-4.152zm124.181 1.845c.509-.822.256-1.901-.565-2.41-.822-.509-1.9-.256-2.41.565-.879 1.418-1.806 2.803-2.779 4.152-.566.784-.389 1.878.395 2.443.784.566 1.878.389 2.443-.395 1.021-1.415 1.994-2.868 2.916-4.355zm-115.695 9.253c-.659-.707-1.767-.745-2.474-.086-.706.659-.745 1.766-.086 2.473 1.192 1.278 2.428 2.514 3.706 3.706.707.659 1.814.62 2.473-.086.659-.707.621-1.815-.086-2.474-1.218-1.136-2.397-2.315-3.533-3.533zm106.794 2.387c.659-.707.62-1.814-.086-2.473-.707-.659-1.815-.621-2.474.086-1.136 1.218-2.315 2.397-3.533 3.533-.707.659-.745 1.767-.086 2.474.659.706 1.766.745 2.473.086 1.278-1.192 2.514-2.428 3.706-3.706zm-96.315 6.853c-.784-.566-1.878-.389-2.443.395-.566.784-.389 1.878.395 2.443 1.415 1.021 2.868 1.994 4.355 2.916.822.509 1.901.256 2.41-.565.509-.822.256-1.9-.565-2.41-1.418-.879-2.803-1.806-4.152-2.779zm85.324 2.838c.784-.565.961-1.659.395-2.443-.565-.784-1.659-.961-2.443-.395-1.349.973-2.734 1.9-4.152 2.779-.821.51-1.074 1.588-.565 2.41.509.821 1.588 1.074 2.41.565 1.487-.922 2.94-1.895 4.355-2.916zm-73.25 4.184c-.879-.401-1.917-.014-2.319.865-.401.88-.014 1.918.865 2.319 1.585.724 3.201 1.394 4.843 2.009.905.338 1.914-.121 2.252-1.027.339-.905-.121-1.913-1.026-2.252-1.565-.585-3.104-1.224-4.615-1.914zm60.582 3.184c.879-.401 1.266-1.439.865-2.319-.402-.879-1.44-1.266-2.319-.865-1.511.69-3.05 1.329-4.615 1.914-.905.339-1.365 1.347-1.026 2.252.338.906 1.347 1.365 2.252 1.027 1.642-.615 3.258-1.285 4.843-2.009zm-47.368 1.336c-.941-.221-1.883.362-2.104 1.303s.363 1.883 1.304 2.104c1.693.397 3.408.737 5.143 1.018.954.154 1.853-.495 2.007-1.449s-.495-1.853-1.449-2.007c-1.653-.267-3.288-.591-4.901-.969zm33.5 3.407c.941-.221 1.525-1.163 1.304-2.104s-1.163-1.524-2.104-1.303c-1.613.378-3.248.702-4.901.969-.954.154-1.603 1.053-1.449 2.007s1.053 1.603 2.007 1.449c1.735-.281 3.45-.621 5.143-1.018zm-19.654-1.566c-.966-.033-1.776.723-1.809 1.688-.033.966.723 1.776 1.689 1.81.871.03 1.746.045 2.624.045s1.753-.015 2.624-.045c.966-.034 1.722-.844 1.689-1.81-.033-.965-.843-1.721-1.809-1.688-.831.029-1.666.043-2.504.043s-1.673-.014-2.504-.043zm2.504-130.957c-.802 0-1.601.016-2.396.047-.965.038-1.717.852-1.679 1.818s.852 1.718 1.817 1.679c.749-.029 1.502-.044 2.258-.044s1.509.015 2.258.044c.966.039 1.779-.713 1.817-1.679s-.714-1.78-1.679-1.818c-.795-.031-1.594-.047-2.396-.047zm-10.317 4.444c.95-.176 1.578-1.09 1.402-2.04s-1.089-1.578-2.04-1.402c-1.579.293-3.136.648-4.668 1.062-.933.252-1.485 1.213-1.233 2.146s1.213 1.485 2.146 1.233c1.442-.39 2.907-.724 4.393-.999zm21.272-3.442c-.951-.176-1.864.452-2.04 1.402s.452 1.864 1.402 2.04c1.486.275 2.951.609 4.393.999.933.252 1.894-.3 2.146-1.233s-.3-1.894-1.233-2.146c-1.532-.414-3.089-.769-4.668-1.062zm12.799 3.907c-.887-.385-1.917.022-2.302.909-.384.887.023 1.917.909 2.302 1.383.599 2.737 1.253 4.059 1.958.853.454 1.913.132 2.368-.721.454-.853.132-1.913-.721-2.368-1.405-.749-2.844-1.443-4.313-2.08zm-46.115 3.211c.886-.385 1.293-1.415.909-2.302-.385-.887-1.415-1.294-2.302-.909-1.469.637-2.908 1.331-4.313 2.08-.853.455-1.175 1.515-.721 2.368.455.853 1.515 1.175 2.368.721 1.322-.705 2.676-1.359 4.059-1.958zm-10.921 6.278c.779-.573.946-1.668.373-2.447-.572-.778-1.667-.945-2.446-.373-1.287.946-2.535 1.943-3.741 2.987-.731.633-.81 1.738-.177 2.469.632.73 1.738.81 2.468.177 1.136-.983 2.311-1.922 3.523-2.813zm68.637-2.82c-.779-.572-1.874-.405-2.446.373-.573.779-.406 1.874.373 2.447 1.212.891 2.387 1.83 3.523 2.813.73.633 1.836.553 2.468-.177.633-.731.554-1.836-.177-2.469-1.206-1.044-2.454-2.041-3.741-2.987zm-77.894 11.367c.633-.73.553-1.836-.177-2.468-.731-.633-1.836-.554-2.469.177-1.044 1.206-2.041 2.454-2.987 3.741-.572.779-.405 1.874.373 2.446.779.573 1.874.406 2.447-.373.891-1.212 1.83-2.387 2.813-3.523zm87.724-2.291c-.633-.731-1.738-.81-2.469-.177-.73.632-.81 1.738-.177 2.468.983 1.136 1.922 2.311 2.813 3.523.573.779 1.668.946 2.447.373.778-.572.945-1.667.373-2.446-.946-1.287-1.943-2.535-2.987-3.741zm7.576 11.029c-.455-.853-1.515-1.175-2.368-.721-.853.455-1.175 1.515-.721 2.368.705 1.322 1.359 2.676 1.958 4.059.385.886 1.415 1.293 2.302.909.887-.385 1.294-1.415.909-2.302-.637-1.469-1.331-2.908-2.08-4.313zm-102.433 1.647c.454-.853.132-1.913-.721-2.368-.853-.454-1.913-.132-2.368.721-.749 1.405-1.443 2.844-2.08 4.313-.385.887.022 1.917.909 2.302.887.384 1.917-.023 2.302-.909.599-1.383 1.253-2.737 1.958-4.059zm-4.635 11.71c.252-.933-.3-1.894-1.233-2.146s-1.894.3-2.146 1.233c-.414 1.532-.769 3.089-1.062 4.668-.176.951.452 1.864 1.402 2.04s1.864-.452 2.04-1.402c.275-1.486.609-2.951.999-4.393zm111.993-.913c-.252-.933-1.213-1.485-2.146-1.233s-1.485 1.213-1.233 2.146c.39 1.442.724 2.907.999 4.393.176.95 1.09 1.578 2.04 1.402s1.578-1.089 1.402-2.04c-.293-1.579-.648-3.136-1.062-4.668zm-113.892 13.365c.039-.966-.713-1.779-1.679-1.817s-1.78.714-1.818 1.679c-.031.795-.047 1.594-.047 2.396s.016 1.601.047 2.396c.038.965.852 1.717 1.818 1.679s1.718-.852 1.679-1.817c-.029-.749-.044-1.502-.044-2.258s.015-1.509.044-2.258zm115.909-.138c-.038-.965-.852-1.717-1.818-1.679s-1.718.852-1.679 1.817c.029.749.044 1.502.044 2.258s-.015 1.509-.044 2.258c-.039.966.713 1.779 1.679 1.817s1.78-.714 1.818-1.679c.031-.795.047-1.594.047-2.396s-.016-1.601-.047-2.396zm-115.009 12.713c-.176-.95-1.09-1.578-2.04-1.402s-1.578 1.089-1.402 2.04c.293 1.579.648 3.136 1.062 4.668.252.933 1.213 1.485 2.146 1.233s1.485-1.213 1.233-2.146c-.39-1.442-.724-2.907-.999-4.393zm114.054.638c.176-.951-.452-1.864-1.402-2.04s-1.864.452-2.04 1.402c-.275 1.486-.609 2.951-.999 4.393-.252.933.3 1.894 1.233 2.146s1.894-.3 2.146-1.233c.414-1.532.769-3.089 1.062-4.668zm-110.378 11.406c-.385-.886-1.415-1.293-2.302-.909-.887.385-1.294 1.415-.909 2.302.637 1.469 1.331 2.908 2.08 4.313.455.853 1.515 1.175 2.368.721.853-.455 1.175-1.515.721-2.368-.705-1.322-1.359-2.676-1.958-4.059zm106.471 1.393c.385-.887-.022-1.917-.909-2.302-.887-.384-1.917.023-2.302.909-.599 1.383-1.253 2.737-1.958 4.059-.454.853-.132 1.913.721 2.368.853.454 1.913.132 2.368-.721.749-1.405 1.443-2.844 2.08-4.313zm-100.193 9.528c-.573-.779-1.668-.946-2.447-.373-.778.572-.945 1.667-.373 2.446.946 1.287 1.943 2.535 2.987 3.741.633.731 1.738.81 2.469.177.73-.632.81-1.738.177-2.468-.983-1.136-1.922-2.311-2.813-3.523zm93.524 2.073c.572-.779.405-1.874-.373-2.446-.779-.573-1.874-.406-2.447.373-.891 1.212-1.83 2.387-2.813 3.523-.633.73-.553 1.836.177 2.468.731.633 1.836.554 2.469-.177 1.044-1.206 2.041-2.454 2.987-3.741zm-84.977 7.184c-.73-.633-1.836-.553-2.468.177-.633.731-.554 1.836.177 2.469 1.206 1.044 2.454 2.041 3.741 2.987.779.572 1.874.405 2.446-.373.573-.779.406-1.874-.373-2.447-1.212-.891-2.387-1.83-3.523-2.813zm75.901 2.646c.731-.633.81-1.738.177-2.469-.632-.73-1.738-.81-2.468-.177-1.136.983-2.311 1.922-3.523 2.813-.779.573-.946 1.668-.373 2.447.572.778 1.667.945 2.446.373 1.287-.946 2.535-1.943 3.741-2.987zm-65.516 4.487c-.853-.454-1.913-.132-2.368.721-.454.853-.132 1.913.721 2.368 1.405.749 2.844 1.443 4.313 2.08.887.385 1.917-.022 2.302-.909.384-.887-.023-1.917-.909-2.302-1.383-.599-2.737-1.253-4.059-1.958zm54.487 3.089c.853-.455 1.175-1.515.721-2.368-.455-.853-1.515-1.175-2.368-.721-1.322.705-2.676 1.359-4.059 1.958-.886.385-1.293 1.415-.909 2.302.385.887 1.415 1.294 2.302.909 1.469-.637 2.908-1.331 4.313-2.08zm-42.777 1.546c-.933-.252-1.894.3-2.146 1.233s.3 1.894 1.233 2.146c1.532.414 3.089.769 4.668 1.062.951.176 1.864-.452 2.04-1.402s-.452-1.864-1.402-2.04c-1.486-.275-2.951-.609-4.393-.999zm30.333 3.379c.933-.252 1.485-1.213 1.233-2.146s-1.213-1.485-2.146-1.233c-1.442.39-2.907.724-4.393.999-.95.176-1.578 1.09-1.402 2.04s1.089 1.578 2.04 1.402c1.579-.293 3.136-.648 4.668-1.062zm-17.881-1.48c-.966-.039-1.779.713-1.817 1.679s.714 1.78 1.679 1.818c.795.031 1.594.047 2.396.047s1.601-.016 2.396-.047c.965-.038 1.717-.852 1.679-1.818s-.852-1.718-1.817-1.679c-.749.029-1.502.044-2.258.044s-1.509-.015-2.258-.044zm-.139-98.89c.794-.044 1.593-.066 2.397-.066s1.603.022 2.397.066c.965.053 1.704.879 1.65 1.844-.053.965-.878 1.704-1.843 1.651-.73-.041-1.464-.061-2.204-.061s-1.474.02-2.204.061c-.965.053-1.79-.686-1.843-1.651-.054-.965.685-1.791 1.65-1.844zm-6.378 2.587c.247.934-.312 1.891-1.246 2.137-1.429.377-2.826.831-4.186 1.36-.901.35-1.915-.097-2.265-.998s.097-1.915.997-2.265c1.483-.576 3.005-1.071 4.563-1.481.934-.246 1.891.312 2.137 1.247zm17.55 0c.246-.935 1.203-1.493 2.137-1.247 1.558.41 3.08.905 4.563 1.481.901.35 1.347 1.364.997 2.265s-1.364 1.348-2.265.998c-1.36-.529-2.757-.983-4.186-1.36-.934-.246-1.493-1.203-1.246-2.137zm-29.509 4.675c.525.812.291 1.895-.521 2.419-1.236.798-2.424 1.663-3.559 2.591-.749.611-1.851.5-2.463-.248-.611-.749-.5-1.851.248-2.463 1.236-1.01 2.53-1.952 3.876-2.82.812-.525 1.895-.291 2.419.521zm41.468 0c.524-.812 1.607-1.046 2.419-.521 1.346.868 2.64 1.81 3.876 2.82.748.612.859 1.714.248 2.463-.612.748-1.714.859-2.463.248-1.135-.928-2.323-1.793-3.559-2.591-.812-.524-1.046-1.607-.521-2.419zm-51.394 8.145c.748.612.859 1.714.248 2.463-.928 1.135-1.793 2.323-2.591 3.559-.524.812-1.607 1.046-2.419.521-.812-.524-1.046-1.607-.521-2.419.868-1.346 1.81-2.64 2.82-3.876.612-.748 1.714-.859 2.463-.248zm61.32 0c.749-.611 1.851-.5 2.463.248 1.01 1.236 1.952 2.53 2.82 3.876.525.812.291 1.895-.521 2.419-.812.525-1.895.291-2.419-.521-.798-1.236-1.663-2.424-2.591-3.559-.611-.749-.5-1.851.248-2.463zm-68.258 10.805c.901.35 1.348 1.364.998 2.265-.529 1.36-.983 2.757-1.36 4.186-.246.934-1.203 1.493-2.137 1.246-.935-.246-1.493-1.203-1.247-2.137.41-1.558.905-3.08 1.481-4.563.35-.9 1.364-1.347 2.265-.997zm75.196 0c.901-.35 1.915.097 2.265.997.576 1.483 1.071 3.005 1.481 4.563.246.934-.312 1.891-1.247 2.137-.934.247-1.891-.312-2.137-1.246-.377-1.429-.831-2.826-1.36-4.186-.35-.901.097-1.915.998-2.265zm-78.438 12.425c.965.053 1.704.878 1.651 1.843-.041.73-.061 1.464-.061 2.204s.02 1.474.061 2.204c.053.965-.686 1.79-1.651 1.843-.965.054-1.791-.685-1.844-1.65-.044-.794-.066-1.593-.066-2.397s.022-1.603.066-2.397c.053-.965.879-1.704 1.844-1.65zm81.68 0c.965-.054 1.791.685 1.844 1.65.044.794.066 1.593.066 2.397s-.022 1.603-.066 2.397c-.053.965-.879 1.704-1.844 1.65-.965-.053-1.704-.878-1.651-1.843.041-.73.061-1.464.061-2.204s-.02-1.474-.061-2.204c-.053-.965.686-1.79 1.651-1.843zm-80.937 12.822c.934-.247 1.891.312 2.137 1.246.377 1.429.831 2.826 1.36 4.186.35.901-.097 1.915-.998 2.265s-1.915-.097-2.265-.997c-.576-1.483-1.071-3.005-1.481-4.563-.246-.934.312-1.891 1.247-2.137zm80.194 0c.935.246 1.493 1.203 1.247 2.137-.41 1.558-.905 3.08-1.481 4.563-.35.901-1.364 1.347-2.265.997s-1.348-1.364-.998-2.265c.529-1.36.983-2.757 1.36-4.186.246-.934 1.203-1.493 2.137-1.246zm-75.519 11.959c.812-.525 1.895-.291 2.419.521.798 1.236 1.663 2.424 2.591 3.559.611.749.5 1.851-.248 2.463-.749.611-1.851.5-2.463-.248-1.01-1.236-1.952-2.53-2.82-3.876-.525-.812-.291-1.895.521-2.419zm70.844 0c.812.524 1.046 1.607.521 2.419-.868 1.346-1.81 2.64-2.82 3.876-.612.748-1.714.859-2.463.248-.748-.612-.859-1.714-.248-2.463.928-1.135 1.793-2.323 2.591-3.559.524-.812 1.607-1.046 2.419-.521zm-62.699 9.926c.612-.748 1.714-.859 2.463-.248 1.135.928 2.323 1.793 3.559 2.591.812.524 1.046 1.607.521 2.419-.524.812-1.607 1.046-2.419.521-1.346-.868-2.64-1.81-3.876-2.82-.748-.612-.859-1.714-.248-2.463zm54.554 0c.611.749.5 1.851-.248 2.463-1.236 1.01-2.53 1.952-3.876 2.82-.812.525-1.895.291-2.419-.521-.525-.812-.291-1.895.521-2.419 1.236-.798 2.424-1.663 3.559-2.591.749-.611 1.851-.5 2.463.248zm-43.749 6.938c.35-.901 1.364-1.348 2.265-.998 1.36.529 2.757.983 4.186 1.36.934.246 1.493 1.203 1.246 2.137-.246.935-1.203 1.493-2.137 1.247-1.558-.41-3.08-.905-4.563-1.481-.9-.35-1.347-1.364-.997-2.265zm32.944 0c.35.901-.097 1.915-.997 2.265-1.483.576-3.005 1.071-4.563 1.481-.934.246-1.891-.312-2.137-1.247-.247-.934.312-1.891 1.246-2.137 1.429-.377 2.826-.831 4.186-1.36.901-.35 1.915.097 2.265.998zm-20.519 3.242c.053-.965.878-1.704 1.843-1.651.73.041 1.464.061 2.204.061s1.474-.02 2.204-.061c.965-.053 1.79.686 1.843 1.651.054.965-.685 1.791-1.65 1.844-.794.044-1.593.066-2.397.066s-1.603-.022-2.397-.066c-.965-.053-1.704-.879-1.65-1.844zm4.047-66.59c-.81 0-1.612.037-2.403.111-.963.089-1.671.941-1.582 1.904.09.962.942 1.67 1.904 1.581.685-.064 1.379-.096 2.081-.096s1.396.032 2.081.096c.962.089 1.814-.619 1.904-1.581.089-.963-.619-1.815-1.582-1.904-.791-.074-1.593-.111-2.403-.111zm10.74 2.34c-.878-.403-1.917-.018-2.32.86-.404.878-.019 1.917.859 2.321 1.267.582 2.47 1.28 3.596 2.08.788.56 1.88.375 2.44-.412.56-.788.376-1.881-.412-2.441-1.303-.925-2.695-1.733-4.163-2.408zm-20.019 3.181c.878-.404 1.263-1.443.859-2.321-.403-.878-1.442-1.263-2.32-.86-1.468.675-2.86 1.483-4.163 2.408-.788.56-.972 1.653-.412 2.441.56.787 1.652.972 2.44.412 1.126-.8 2.329-1.498 3.596-2.08zm30.281 5.326c-.56-.788-1.653-.972-2.441-.412s-.972 1.652-.412 2.44c.8 1.126 1.498 2.329 2.08 3.596.404.878 1.443 1.263 2.321.859.878-.403 1.263-1.442.86-2.32-.675-1.468-1.483-2.86-2.408-4.163zm-39.151 2.028c.56-.788.375-1.88-.412-2.44-.788-.56-1.881-.376-2.441.412-.925 1.303-1.733 2.695-2.408 4.163-.403.878-.018 1.917.86 2.32.878.404 1.917.019 2.321-.859.582-1.267 1.28-2.47 2.08-3.596zm-4.005 10.794c.089-.962-.619-1.814-1.581-1.904-.963-.089-1.815.619-1.904 1.582-.074.791-.111 1.593-.111 2.403s.037 1.612.111 2.403c.089.963.941 1.671 1.904 1.582.962-.09 1.67-.942 1.581-1.904-.064-.685-.096-1.379-.096-2.081s.032-1.396.096-2.081zm47.793-.322c-.089-.963-.941-1.671-1.904-1.582-.962.09-1.67.942-1.581 1.904.064.685.096 1.379.096 2.081s-.032 1.396-.096 2.081c-.089.962.619 1.814 1.581 1.904.963.089 1.815-.619 1.904-1.582.074-.791.111-1.593.111-2.403s-.037-1.612-.111-2.403zm-2.229 13.143c.403-.878.018-1.917-.86-2.32-.878-.404-1.917-.019-2.321.859-.582 1.267-1.28 2.47-2.08 3.596-.56.788-.376 1.88.412 2.44s1.881.376 2.441-.412c.925-1.303 1.733-2.695 2.408-4.163zm-43.639-1.461c-.404-.878-1.443-1.263-2.321-.859-.878.403-1.263 1.442-.86 2.32.675 1.468 1.483 2.86 2.408 4.163.56.788 1.653.972 2.441.412.787-.56.972-1.652.412-2.44-.8-1.126-1.498-2.329-2.08-3.596zm7.354 8.87c-.788-.56-1.88-.376-2.44.412s-.376 1.881.412 2.441c1.303.925 2.695 1.733 4.163 2.408.878.403 1.917.018 2.32-.86.404-.878.019-1.917-.859-2.321-1.267-.582-2.47-1.28-3.596-2.08zm27.778 2.853c.788-.56.972-1.653.412-2.441s-1.652-.972-2.44-.412c-1.126.8-2.329 1.498-3.596 2.08-.878.404-1.263 1.443-.859 2.321.403.878 1.442 1.263 2.32.86 1.468-.675 2.86-1.483 4.163-2.408zm-16.984 1.152c-.962-.089-1.814.619-1.904 1.581-.089.963.619 1.815 1.582 1.904.791.074 1.593.111 2.403.111s1.612-.037 2.403-.111c.963-.089 1.671-.941 1.582-1.904-.09-.962-.942-1.67-1.904-1.581-.685.064-1.379.096-2.081.096s-1.396-.032-2.081-.096z"/> - <path d="m528.75 225c0-39.35 31.9-71.25 71.25-71.25s71.25 31.9 71.25 71.25-31.9 71.25-71.25 71.25-71.25-31.9-71.25-71.25zm71.25-74.75c-41.283 0-74.75 33.467-74.75 74.75s33.467 74.75 74.75 74.75 74.75-33.467 74.75-74.75-33.467-74.75-74.75-74.75zm-55.25 74.75c0-30.514 24.736-55.25 55.25-55.25s55.25 24.736 55.25 55.25-24.736 55.25-55.25 55.25-55.25-24.736-55.25-55.25zm55.25-58.75c-32.447 0-58.75 26.303-58.75 58.75s26.303 58.75 58.75 58.75 58.75-26.303 58.75-58.75-26.303-58.75-58.75-58.75zm0 19.5c-21.677 0-39.25 17.573-39.25 39.25s17.573 39.25 39.25 39.25 39.25-17.573 39.25-39.25-17.573-39.25-39.25-39.25zm-42.75 39.25c0-23.61 19.14-42.75 42.75-42.75s42.75 19.14 42.75 42.75-19.14 42.75-42.75 42.75-42.75-19.14-42.75-42.75zm20.5 0c0-12.288 9.962-22.25 22.25-22.25s22.25 9.962 22.25 22.25-9.962 22.25-22.25 22.25-22.25-9.962-22.25-22.25zm22.25-25.75c-14.221 0-25.75 11.529-25.75 25.75s11.529 25.75 25.75 25.75 25.75-11.529 25.75-25.75-11.529-25.75-25.75-25.75z"/> - </g> - </g> -</svg> \ No newline at end of file +<svg width="1200" height="150" viewBox="0 0 1200 150" fill="none" xmlns="http://www.w3.org/2000/svg"> +<circle cx="3" cy="75" r="72.5" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<circle cx="3" cy="75" r="53.75" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<circle cx="3" cy="75" r="35" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<circle cx="3" cy="75" r="16.25" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<path d="M223 0C225.761 0 228.017 2.24554 227.836 5.001C225.262 44.0907 192.741 75 153 75C113.259 75 80.7375 44.0907 78.1641 5.001C77.9827 2.24554 80.2386 0 83 0H223Z" fill="#D7D7DB" fill-opacity="0.3"/> +<path d="M223 75C225.761 75 228.017 77.2455 227.836 80.001C225.262 119.091 192.741 150 153 150C113.259 150 80.7375 119.091 78.1641 80.001C77.9827 77.2455 80.2386 75 83 75H223Z" fill="#D7D7DB" fill-opacity="0.2"/> +<circle cx="303" cy="75" r="72.5" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<circle cx="303" cy="75" r="53.75" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<circle cx="303" cy="75" r="35" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<circle cx="303" cy="75" r="16.25" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<path d="M378 5C378 2.23859 380.246 -0.0173187 383.001 0.164093C422.091 2.7375 453 35.2591 453 75C453 114.741 422.091 147.262 383.001 149.836C380.246 150.017 378 147.761 378 145V5Z" fill="#D7D7DB" fill-opacity="0.3"/> +<path d="M453 5C453 2.23859 455.246 -0.0173187 458.001 0.164093C497.091 2.7375 528 35.2591 528 75C528 114.741 497.091 147.262 458.001 149.836C455.246 150.017 453 147.761 453 145V5Z" fill="#D7D7DB" fill-opacity="0.2"/> +<circle cx="603" cy="75" r="72.5" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<circle cx="603" cy="75" r="53.75" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<circle cx="603" cy="75" r="35" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<circle cx="603" cy="75" r="16.25" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<path d="M823 0C825.761 0 828.017 2.24554 827.836 5.001C825.262 44.0907 792.741 75 753 75C713.259 75 680.738 44.0907 678.164 5.001C677.983 2.24554 680.239 0 683 0H823Z" fill="#D7D7DB" fill-opacity="0.3"/> +<path d="M823 75C825.761 75 828.017 77.2455 827.836 80.001C825.262 119.091 792.741 150 753 150C713.259 150 680.738 119.091 678.164 80.001C677.983 77.2455 680.239 75 683 75H823Z" fill="#D7D7DB" fill-opacity="0.2"/> +<circle cx="903" cy="75" r="72.5" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<circle cx="903" cy="75" r="53.75" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<circle cx="903" cy="75" r="35" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<circle cx="903" cy="75" r="16.25" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<path d="M1128 145C1128 147.761 1125.75 150.017 1123 149.836C1083.91 147.262 1053 114.741 1053 75C1053 35.2591 1083.91 2.73751 1123 0.164089C1125.75 -0.0173134 1128 2.23858 1128 5V145Z" fill="#D7D7DB" fill-opacity="0.3"/> +<path d="M1053 145C1053 147.761 1050.75 150.017 1048 149.836C1008.91 147.262 978 114.741 978 75C978 35.2591 1008.91 2.73751 1048 0.164089C1050.75 -0.0173134 1053 2.23858 1053 5V145Z" fill="#D7D7DB" fill-opacity="0.2"/> +<circle cx="1203" cy="75" r="72.5" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<circle cx="1203" cy="75" r="53.75" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<circle cx="1203" cy="75" r="35" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +<circle cx="1203" cy="75" r="16.25" stroke="#D7D7DB" stroke-opacity="0.3" stroke-width="5"/> +</svg> View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/c5ee42… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/c5ee42… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][base-browser-115.11.0esr-13.5-1] 2 commits: fixup! Bug 40925: Implemented the Security Level component
by ma1 (@ma1) 16 May '24

16 May '24
ma1 pushed to branch base-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: b6dc6774 by Henry Wilkes at 2024-05-16T16:13:07+02:00 fixup! Bug 40925: Implemented the Security Level component Bug 42583: Use moz-support-link for the security level &quot;Learn more&quot; links. These take you to the tor project web link in base browser. - - - - - cb6a91ea by Henry Wilkes at 2024-05-16T16:13:08+02:00 Bug 42583: Modify moz-support-link for Base Browser. - - - - - 4 changed files: - browser/components/securitylevel/content/securityLevel.js - browser/components/securitylevel/content/securityLevelPanel.inc.xhtml - browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml - toolkit/content/widgets/moz-support-link/moz-support-link.mjs Changes: ===================================== browser/components/securitylevel/content/securityLevel.js ===================================== @@ -157,6 +157,9 @@ var SecurityLevelPanel = { _populated: false, _populateXUL() { + // TODO: Used for #securityLevel-learnMore. Remove with esr 128. + window.ensureCustomElements("moz-support-link"); + this._elements = { panel: document.getElementById("securityLevel-panel"), background: document.getElementById("securityLevel-background"), @@ -171,9 +174,7 @@ var SecurityLevelPanel = { const learnMoreEl = document.getElementById("securityLevel-learnMore"); learnMoreEl.addEventListener("click", event => { - window.openTrustedLinkIn(learnMoreEl.href, "tab"); this.hide(); - event.preventDefault(); }); this._elements.restoreDefaultsButton.addEventListener("command", () => { ===================================== browser/components/securitylevel/content/securityLevelPanel.inc.xhtml ===================================== @@ -23,9 +23,10 @@ </html:p> <html:p id="securityLevel-summary"></html:p> <html:a + is="moz-support-link" id="securityLevel-learnMore" + tor-manual-page="security-settings" data-l10n-id="security-level-panel-learn-more-link" - href="about:manual#security-settings" ></html:a> </vbox> <hbox class="panel-footer"> ===================================== browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml ===================================== @@ -12,14 +12,11 @@ class="tail-with-learn-more" data-l10n-id="security-level-preferences-overview" ></html:span> - <label - id="securityLevel-learnMore" - class="learnMore text-link" - is="text-link" + <html:a + is="moz-support-link" + tor-manual-page="security-settings" data-l10n-id="security-level-preferences-learn-more-link" - href="about:manual#security-settings" - useoriginprincipal="true" - /> + ></html:a> </description> <hbox id="securityLevel-customNotification" ===================================== toolkit/content/widgets/moz-support-link/moz-support-link.mjs ===================================== @@ -17,7 +17,9 @@ MozXULElement.insertFTLIfNeeded("browser/components/mozSupportLink.ftl"); export default class MozSupportLink extends HTMLAnchorElement { static SUPPORT_URL = "https://www.mozilla.org/"; static get observedAttributes() { - return ["support-page", "utm-content"]; + // We add tor-manual-page for pages hosted at tor project. Also shared with + // base-browser/mullvad-browser. See tor-browser#42583. + return ["support-page", "utm-content", "tor-manual-page"]; } /** @@ -96,12 +98,33 @@ export default class MozSupportLink extends HTMLAnchorElement { } attributeChangedCallback(attrName, oldVal, newVal) { - if (attrName === "support-page" || attrName === "utm-content") { + if ( + attrName === "support-page" || + attrName === "utm-content" || + attrName === "tor-manual-page" + ) { this.#setHref(); } } #setHref() { + let torManualPage = this.getAttribute("tor-manual-page"); + if (torManualPage) { + const [page, anchor] = torManualPage.split("_", 2); + + let locale = Services.locale.appLocaleAsBCP47; + if (locale === "ja-JP-macos") { + // Convert quirk-locale to the locale used for tor project. + locale = "ja"; + } + + let href = `https://tb-manual.torproject.org/${locale}/${page}/`; + if (anchor) { + href = `${href}#${anchor}`; + } + this.href = href; + return; + } let supportPage = this.getAttribute("support-page") ?? ""; let base = MozSupportLink.SUPPORT_URL + supportPage; this.href = this.hasAttribute("utm-content") @@ -122,21 +145,7 @@ customElements.define("moz-support-link", MozSupportLink, { extends: "a" }); * Otherwise the url in unmodified form. */ export function formatUTMParams(contentAttribute, url) { - if (!contentAttribute) { - return url; - } - let parsedUrl = new URL(url); - let domain = `.${parsedUrl.hostname}`; - if ( - !domain.endsWith(".mozilla.org") && - // For testing: addons-dev.allizom.org and addons.allizom.org - !domain.endsWith(".allizom.org") - ) { - return url; - } - - parsedUrl.searchParams.set("utm_source", "firefox-browser"); - parsedUrl.searchParams.set("utm_medium", "firefox-browser"); - parsedUrl.searchParams.set("utm_content", contentAttribute); - return parsedUrl.href; + // Do not add utm parameters. See tor-browser#42583. + // NOTE: This method is also present in about:addons. + return url; } View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/4384bb… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/4384bb… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-115.11.0esr-13.5-1] 3 commits: fixup! Bug 41916: Letterboxing preferences UI
by ma1 (@ma1) 16 May '24

16 May '24
ma1 pushed to branch mullvad-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser Commits: 334f5c22 by Henry Wilkes at 2024-05-16T15:56:19+02:00 fixup! Bug 41916: Letterboxing preferences UI Bug 42583: Use moz-support-link for the letterboxing preference. Also update the url. - - - - - cfddacb5 by Henry Wilkes at 2024-05-16T16:11:27+02:00 fixup! Bug 40925: Implemented the Security Level component Bug 42583: Use moz-support-link for the security level &quot;Learn more&quot; links. These take you to the tor project web link in base browser. - - - - - adcbe40d by Henry Wilkes at 2024-05-16T16:12:08+02:00 Bug 42583: Modify moz-support-link for Base Browser. - - - - - 5 changed files: - browser/components/preferences/letterboxing.inc.xhtml - browser/components/securitylevel/content/securityLevel.js - browser/components/securitylevel/content/securityLevelPanel.inc.xhtml - browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml - toolkit/content/widgets/moz-support-link/moz-support-link.mjs Changes: ===================================== browser/components/preferences/letterboxing.inc.xhtml ===================================== @@ -11,13 +11,11 @@ data-l10n-id="letterboxing-overview" class="tail-with-learn-more" ></html:span> - <label + <html:a + is="moz-support-link" + tor-manual-page="anti-fingerprinting_letterboxing" data-l10n-id="letterboxing-learn-more" - class="learnMore text-link" - is="text-link" - href="about:manual#letterboxing" - useoriginprincipal="true" - /> + ></html:a> </description> </vbox> <groupbox @@ -32,13 +30,11 @@ data-l10n-id="letterboxing-overview" class="tail-with-learn-more" ></html:span> - <label + <html:a + is="moz-support-link" + tor-manual-page="anti-fingerprinting_letterboxing" data-l10n-id="letterboxing-learn-more" - class="learnMore text-link" - is="text-link" - href="about:manual#letterboxing" - useoriginprincipal="true" - /> + ></html:a> </description> <checkbox id="letterboxingRememberSize" @@ -59,13 +55,11 @@ data-l10n-id="letterboxing-overview" class="tail-with-learn-more" ></html:span> - <label + <html:a + is="moz-support-link" + tor-manual-page="anti-fingerprinting_letterboxing" data-l10n-id="letterboxing-learn-more" - class="learnMore text-link" - is="text-link" - href="about:manual#letterboxing" - useoriginprincipal="true" - /> + ></html:a> </description> <description id="letterboxingAlignmentDesc" @@ -110,13 +104,11 @@ data-l10n-id="letterboxing-overview" class="tail-with-learn-more" ></html:span> - <label + <html:a + is="moz-support-link" + tor-manual-page="anti-fingerprinting_letterboxing" data-l10n-id="letterboxing-learn-more" - class="learnMore text-link" - is="text-link" - href="about:manual#letterboxing" - useoriginprincipal="true" - /> + ></html:a> </description> <hbox align="center"> <label ===================================== browser/components/securitylevel/content/securityLevel.js ===================================== @@ -157,6 +157,9 @@ var SecurityLevelPanel = { _populated: false, _populateXUL() { + // TODO: Used for #securityLevel-learnMore. Remove with esr 128. + window.ensureCustomElements("moz-support-link"); + this._elements = { panel: document.getElementById("securityLevel-panel"), background: document.getElementById("securityLevel-background"), @@ -171,9 +174,7 @@ var SecurityLevelPanel = { const learnMoreEl = document.getElementById("securityLevel-learnMore"); learnMoreEl.addEventListener("click", event => { - window.openTrustedLinkIn(learnMoreEl.href, "tab"); this.hide(); - event.preventDefault(); }); this._elements.restoreDefaultsButton.addEventListener("command", () => { ===================================== browser/components/securitylevel/content/securityLevelPanel.inc.xhtml ===================================== @@ -23,9 +23,10 @@ </html:p> <html:p id="securityLevel-summary"></html:p> <html:a + is="moz-support-link" id="securityLevel-learnMore" + tor-manual-page="security-settings" data-l10n-id="security-level-panel-learn-more-link" - href="https://mullvad.net/en/browser/hard-facts#security-levels" ></html:a> </vbox> <hbox class="panel-footer"> ===================================== browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml ===================================== @@ -12,13 +12,11 @@ class="tail-with-learn-more" data-l10n-id="security-level-preferences-overview" ></html:span> - <label - id="securityLevel-learnMore" - class="learnMore text-link" - is="text-link" + <html:a + is="moz-support-link" + tor-manual-page="security-settings" data-l10n-id="security-level-preferences-learn-more-link" - href="https://mullvad.net/en/browser/hard-facts#security-levels" - /> + ></html:a> </description> <hbox id="securityLevel-customNotification" ===================================== toolkit/content/widgets/moz-support-link/moz-support-link.mjs ===================================== @@ -17,7 +17,9 @@ MozXULElement.insertFTLIfNeeded("browser/components/mozSupportLink.ftl"); export default class MozSupportLink extends HTMLAnchorElement { static SUPPORT_URL = "https://www.mozilla.org/"; static get observedAttributes() { - return ["support-page", "utm-content"]; + // We add tor-manual-page for pages hosted at tor project. Also shared with + // base-browser/mullvad-browser. See tor-browser#42583. + return ["support-page", "utm-content", "tor-manual-page"]; } /** @@ -96,12 +98,33 @@ export default class MozSupportLink extends HTMLAnchorElement { } attributeChangedCallback(attrName, oldVal, newVal) { - if (attrName === "support-page" || attrName === "utm-content") { + if ( + attrName === "support-page" || + attrName === "utm-content" || + attrName === "tor-manual-page" + ) { this.#setHref(); } } #setHref() { + let torManualPage = this.getAttribute("tor-manual-page"); + if (torManualPage) { + const [page, anchor] = torManualPage.split("_", 2); + + let locale = Services.locale.appLocaleAsBCP47; + if (locale === "ja-JP-macos") { + // Convert quirk-locale to the locale used for tor project. + locale = "ja"; + } + + let href = `https://tb-manual.torproject.org/${locale}/${page}/`; + if (anchor) { + href = `${href}#${anchor}`; + } + this.href = href; + return; + } let supportPage = this.getAttribute("support-page") ?? ""; // Customize the link in about:preferences. // See mullvad-browser#244 and tor-browser#41910. @@ -128,21 +151,7 @@ customElements.define("moz-support-link", MozSupportLink, { extends: "a" }); * Otherwise the url in unmodified form. */ export function formatUTMParams(contentAttribute, url) { - if (!contentAttribute) { - return url; - } - let parsedUrl = new URL(url); - let domain = `.${parsedUrl.hostname}`; - if ( - !domain.endsWith(".mozilla.org") && - // For testing: addons-dev.allizom.org and addons.allizom.org - !domain.endsWith(".allizom.org") - ) { - return url; - } - - parsedUrl.searchParams.set("utm_source", "firefox-browser"); - parsedUrl.searchParams.set("utm_medium", "firefox-browser"); - parsedUrl.searchParams.set("utm_content", contentAttribute); - return parsedUrl.href; + // Do not add utm parameters. See tor-browser#42583. + // NOTE: This method is also present in about:addons. + return url; } View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/90… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/90… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.5-1] 5 commits: fixup! Bug 41916: Letterboxing preferences UI
by ma1 (@ma1) 16 May '24

16 May '24
ma1 pushed to branch tor-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: d018a7b3 by Henry Wilkes at 2024-05-16T13:03:37+00:00 fixup! Bug 41916: Letterboxing preferences UI Bug 42583: Use moz-support-link for the letterboxing preference. Also update the url. - - - - - db143d45 by Henry Wilkes at 2024-05-16T13:03:37+00:00 fixup! Bug 40925: Implemented the Security Level component Bug 42583: Use moz-support-link for the security level &quot;Learn more&quot; links. These take you to the tor project web link in base browser. - - - - - 7c7573c4 by Henry Wilkes at 2024-05-16T13:03:37+00:00 Bug 42583: Modify moz-support-link for Base Browser. - - - - - c6a32aa5 by Henry Wilkes at 2024-05-16T13:03:37+00:00 fixup! Bug 2176: Rebrand Firefox to TorBrowser Bug 42583: Move moz-support-link change out of the branding commit. - - - - - c5ee42b4 by Henry Wilkes at 2024-05-16T13:03:37+00:00 Bug 42583: Modify moz-support-link for Tor Browser. - - - - - 5 changed files: - browser/components/preferences/letterboxing.inc.xhtml - browser/components/securitylevel/content/securityLevel.js - browser/components/securitylevel/content/securityLevelPanel.inc.xhtml - browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml - toolkit/content/widgets/moz-support-link/moz-support-link.mjs Changes: ===================================== browser/components/preferences/letterboxing.inc.xhtml ===================================== @@ -11,13 +11,11 @@ data-l10n-id="letterboxing-overview" class="tail-with-learn-more" ></html:span> - <label + <html:a + is="moz-support-link" + tor-manual-page="anti-fingerprinting_letterboxing" data-l10n-id="letterboxing-learn-more" - class="learnMore text-link" - is="text-link" - href="about:manual#letterboxing" - useoriginprincipal="true" - /> + ></html:a> </description> </vbox> <groupbox @@ -32,13 +30,11 @@ data-l10n-id="letterboxing-overview" class="tail-with-learn-more" ></html:span> - <label + <html:a + is="moz-support-link" + tor-manual-page="anti-fingerprinting_letterboxing" data-l10n-id="letterboxing-learn-more" - class="learnMore text-link" - is="text-link" - href="about:manual#letterboxing" - useoriginprincipal="true" - /> + ></html:a> </description> <checkbox id="letterboxingRememberSize" @@ -59,13 +55,11 @@ data-l10n-id="letterboxing-overview" class="tail-with-learn-more" ></html:span> - <label + <html:a + is="moz-support-link" + tor-manual-page="anti-fingerprinting_letterboxing" data-l10n-id="letterboxing-learn-more" - class="learnMore text-link" - is="text-link" - href="about:manual#letterboxing" - useoriginprincipal="true" - /> + ></html:a> </description> <description id="letterboxingAlignmentDesc" @@ -110,13 +104,11 @@ data-l10n-id="letterboxing-overview" class="tail-with-learn-more" ></html:span> - <label + <html:a + is="moz-support-link" + tor-manual-page="anti-fingerprinting_letterboxing" data-l10n-id="letterboxing-learn-more" - class="learnMore text-link" - is="text-link" - href="about:manual#letterboxing" - useoriginprincipal="true" - /> + ></html:a> </description> <hbox align="center"> <label ===================================== browser/components/securitylevel/content/securityLevel.js ===================================== @@ -157,6 +157,9 @@ var SecurityLevelPanel = { _populated: false, _populateXUL() { + // TODO: Used for #securityLevel-learnMore. Remove with esr 128. + window.ensureCustomElements("moz-support-link"); + this._elements = { panel: document.getElementById("securityLevel-panel"), background: document.getElementById("securityLevel-background"), @@ -171,9 +174,7 @@ var SecurityLevelPanel = { const learnMoreEl = document.getElementById("securityLevel-learnMore"); learnMoreEl.addEventListener("click", event => { - window.openTrustedLinkIn(learnMoreEl.href, "tab"); this.hide(); - event.preventDefault(); }); this._elements.restoreDefaultsButton.addEventListener("command", () => { ===================================== browser/components/securitylevel/content/securityLevelPanel.inc.xhtml ===================================== @@ -23,9 +23,10 @@ </html:p> <html:p id="securityLevel-summary"></html:p> <html:a + is="moz-support-link" id="securityLevel-learnMore" + tor-manual-page="security-settings" data-l10n-id="security-level-panel-learn-more-link" - href="about:manual#security-settings" ></html:a> </vbox> <hbox class="panel-footer"> ===================================== browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml ===================================== @@ -12,14 +12,11 @@ class="tail-with-learn-more" data-l10n-id="security-level-preferences-overview" ></html:span> - <label - id="securityLevel-learnMore" - class="learnMore text-link" - is="text-link" + <html:a + is="moz-support-link" + tor-manual-page="security-settings" data-l10n-id="security-level-preferences-learn-more-link" - href="about:manual#security-settings" - useoriginprincipal="true" - /> + ></html:a> </description> <hbox id="securityLevel-customNotification" ===================================== toolkit/content/widgets/moz-support-link/moz-support-link.mjs ===================================== @@ -17,7 +17,9 @@ MozXULElement.insertFTLIfNeeded("browser/components/mozSupportLink.ftl"); export default class MozSupportLink extends HTMLAnchorElement { static SUPPORT_URL = "https://www.mozilla.org/"; static get observedAttributes() { - return ["support-page", "utm-content"]; + // We add tor-manual-page for pages hosted at tor project. Also shared with + // base-browser/mullvad-browser. See tor-browser#42583. + return ["support-page", "utm-content", "tor-manual-page"]; } /** @@ -96,12 +98,21 @@ export default class MozSupportLink extends HTMLAnchorElement { } attributeChangedCallback(attrName, oldVal, newVal) { - if (attrName === "support-page" || attrName === "utm-content") { + if ( + attrName === "support-page" || + attrName === "utm-content" || + attrName === "tor-manual-page" + ) { this.#setHref(); } } #setHref() { + let torManualPage = this.getAttribute("tor-manual-page"); + if (torManualPage) { + this.href = `about:manual#${torManualPage}`; + return; + } let supportPage = this.getAttribute("support-page") ?? ""; // For tor-browser we sometimes want to override firefox support links with // our own. @@ -112,7 +123,7 @@ export default class MozSupportLink extends HTMLAnchorElement { // Instead of directing to support for preferences, we link to general // tor browser support. // See tor-browser#32092. - this.href = "https://support.torproject.org/tbb" + this.href = "https://support.torproject.org/tbb"; return; // Fall through to support.mozilla.org } @@ -135,21 +146,7 @@ customElements.define("moz-support-link", MozSupportLink, { extends: "a" }); * Otherwise the url in unmodified form. */ export function formatUTMParams(contentAttribute, url) { - if (!contentAttribute) { - return url; - } - let parsedUrl = new URL(url); - let domain = `.${parsedUrl.hostname}`; - if ( - !domain.endsWith(".mozilla.org") && - // For testing: addons-dev.allizom.org and addons.allizom.org - !domain.endsWith(".allizom.org") - ) { - return url; - } - - parsedUrl.searchParams.set("utm_source", "firefox-browser"); - parsedUrl.searchParams.set("utm_medium", "firefox-browser"); - parsedUrl.searchParams.set("utm_content", contentAttribute); - return parsedUrl.href; + // Do not add utm parameters. See tor-browser#42583. + // NOTE: This method is also present in about:addons. + return url; } View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/4a1e3b… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/4a1e3b… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.5-1] 2 commits: fixup! Base Browser strings
by richard (@richard) 16 May '24

16 May '24
richard pushed to branch tor-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 900fb923 by Henry Wilkes at 2024-05-16T12:56:28+01:00 fixup! Base Browser strings Bug 42347: Add a notification for dropped OS version support. - - - - - 4a1e3ba3 by Henry Wilkes at 2024-05-16T12:56:28+01:00 Bug 42347: Add a notification for dropped OS version support. - - - - - 4 changed files: - browser/base/content/browser.xhtml - + browser/base/content/droppedSupportNotification.js - browser/base/jar.mn - toolkit/locales/en-US/toolkit/global/base-browser.ftl Changes: ===================================== browser/base/content/browser.xhtml ===================================== @@ -132,6 +132,7 @@ Services.scriptloader.loadSubScript("chrome://browser/content/search/autocomplete-popup.js", this); Services.scriptloader.loadSubScript("chrome://browser/content/search/searchbar.js", this); Services.scriptloader.loadSubScript("chrome://browser/content/languageNotification.js", this); + Services.scriptloader.loadSubScript("chrome://browser/content/droppedSupportNotification.js", this); window.onload = gBrowserInit.onLoad.bind(gBrowserInit); window.onunload = gBrowserInit.onUnload.bind(gBrowserInit); ===================================== browser/base/content/droppedSupportNotification.js ===================================== @@ -0,0 +1,69 @@ +"use strict"; + +// Show a prompt that a user's system will no longer be supported. +window.addEventListener("load", () => { + let labelId; + // Expire date is 2024-10-01 (1st October 2024). + const isExpired = Date.now() > Date.UTC(2024, 9, 1); + + if ( + AppConstants.platform === "macosx" && + Services.vc.compare( + Services.sysinfo.getProperty("version"), + "19.0" // MacOS 10.15 begins with Darwin 19.0 + ) < 0 + ) { + labelId = isExpired + ? "dropped-support-notification-macos-version-less-than-10-15-expired" + : "dropped-support-notification-macos-version-less-than-10-15"; + } else if ( + AppConstants.platform === "win" && + Services.vc.compare(Services.sysinfo.getProperty("version"), "10.0") < 0 + ) { + labelId = isExpired + ? "dropped-support-notification-win-os-version-less-than-10-expired" + : "dropped-support-notification-win-os-version-less-than-10"; + } + + const dismissedPref = + "browser.dropped_support_notification_v14.dismiss_version"; + + if (!labelId) { + // Avoid setting any preferences for supported versions, and clean up any + // old values if the user ported their profile. + Services.prefs.clearUserPref(dismissedPref); + return; + } + + if ( + !isExpired && + Services.prefs.getStringPref(dismissedPref, "") === + AppConstants.BASE_BROWSER_VERSION + ) { + // Already dismissed since the last update. + return; + } + + const buttons = isExpired + ? undefined + : [ + { + "l10n-id": "dropped-support-notification-dismiss-button", + callback: () => { + Services.prefs.setStringPref( + dismissedPref, + AppConstants.BASE_BROWSER_VERSION + ); + }, + }, + ]; + + gNotificationBox.appendNotification( + "dropped-support-notification", + { + label: { "l10n-id": labelId }, + priority: gNotificationBox.PRIORITY_WARNING_HIGH, + }, + buttons + ); +}); ===================================== browser/base/jar.mn ===================================== @@ -111,4 +111,5 @@ browser.jar: content/browser/spotlight.js (content/spotlight.js) * content/browser/default-bookmarks.html (content/default-bookmarks.html) + content/browser/droppedSupportNotification.js (content/droppedSupportNotification.js) content/browser/languageNotification.js (content/languageNotification.js) ===================================== toolkit/locales/en-US/toolkit/global/base-browser.ftl ===================================== @@ -166,3 +166,21 @@ security-level-summary-custom = Your custom browser preferences have resulted in # Button to undo custom changes to the security level and place the user in one of the standard security levels. # Shown in the security level panel and settings. security-level-restore-defaults-button = Restore defaults + +## Notification for dropped operating system support. + +# "{ -brand-short-name }" will be replaced with the localized name of the browser, e.g. "Tor Browser". +# "14.0" refers to the browser versions number: Tor Browser 14.0. +# "macOS" is a brand name, and 10.15 is the macOS version number. +dropped-support-notification-macos-version-less-than-10-15 = The next major version of { -brand-short-name } (14.0) will no longer support this version of macOS. Please upgrade to macOS 10.15 or later by October 1st 2024 to continue receiving important security updates. +# "{ -brand-short-name }" will be replaced with the localized name of the browser, e.g. "Tor Browser". +# "macOS" is a brand name, and 10.15 is the macOS version number. +dropped-support-notification-macos-version-less-than-10-15-expired = { -brand-short-name } no longer supports this version of macOS. Please upgrade to macOS 10.15 or later to continue receiving important security updates. +# "{ -brand-short-name }" will be replaced with the localized name of the browser, e.g. "Tor Browser". +# "14.0" refers to the browser versions number: Tor Browser 14.0. +# "Windows" is a brand name, and "Windows 10" is the version. +dropped-support-notification-win-os-version-less-than-10 = The next major version of { -brand-short-name } (14.0) will no longer support this version of Windows. Please upgrade to Windows 10 or later by October 1st 2024 to continue receiving important security updates. +# "{ -brand-short-name }" will be replaced with the localized name of the browser, e.g. "Tor Browser". +# "Windows" is a brand name, and "Windows 10" is the version. +dropped-support-notification-win-os-version-less-than-10-expired = { -brand-short-name } no longer supports this version of Windows. Please upgrade to Windows 10 or later to continue receiving important security updates. +dropped-support-notification-dismiss-button = Got it View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/c67ac1… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/c67ac1… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] Bug 41148: Update NoScript license to GPL V3.
by ma1 (@ma1) 16 May '24

16 May '24
ma1 pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 1dc061f3 by hackademix at 2024-05-16T12:45:58+02:00 Bug 41148: Update NoScript license to GPL V3. - - - - - 1 changed file: - projects/browser/Bundle-Data/Docs/Licenses/NoScript.txt Changes: ===================================== projects/browser/Bundle-Data/Docs/Licenses/NoScript.txt ===================================== @@ -1,9 +1,9 @@ NoScript - a Firefox extension for whitelist driven safe JavaScript execution -Copyright (C) 2005-2023 Giorgio Maone - https://maone.net +Copyright (C) 2005-2024 Giorgio Maone - https://maone.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or +the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/1… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/1… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.5-1] fixup! Omnibox: Add DDG, Startpage, Disconnect, Youtube, Twitter; remove Amazon, eBay, bing
by richard (@richard) 16 May '24

16 May '24
richard pushed to branch tor-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: c67ac157 by Dan Ballard at 2024-05-16T10:30:16+00:00 fixup! Omnibox: Add DDG, Startpage, Disconnect, Youtube, Twitter; remove Amazon, eBay, bing bug 42290: change duckduckgoonion to duckduckgo onion and same for startpageonion - - - - - 2 changed files: - browser/components/search/extensions/ddg-onion/manifest.json - browser/components/search/extensions/startpage-onion/manifest.json Changes: ===================================== browser/components/search/extensions/ddg-onion/manifest.json ===================================== @@ -1,5 +1,5 @@ { - "name": "DuckDuckGoOnion", + "name": "DuckDuckGo (.onion)", "description": "Duck Duck Go Onion", "manifest_version": 2, "version": "1.0", @@ -17,7 +17,7 @@ ], "chrome_settings_overrides": { "search_provider": { - "name": "DuckDuckGoOnion", + "name": "DuckDuckGo (.onion)", "search_url": "https://duckduckgogg42xjoc72x3sjasowoarfbgcmvfimaftt6twagswzczad.onion", "search_form": "https://duckduckgogg42xjoc72x3sjasowoarfbgcmvfimaftt6twagswzczad.onion/?q={…", "search_url_get_params": "q={searchTerms}", ===================================== browser/components/search/extensions/startpage-onion/manifest.json ===================================== @@ -1,5 +1,5 @@ { - "name": "StartpageOnion", + "name": "Startpage (.onion)", "description": "Startpage Onion", "manifest_version": 2, "version": "1.0", @@ -17,7 +17,7 @@ ], "chrome_settings_overrides": { "search_provider": { - "name": "StartpageOnion", + "name": "Startpage (.onion)", "search_url": "http://startpagel6srwcjlue4zgq3zevrujfaow726kjytqbbjyrswwmjzcqd.onion/sp/se…", "search_form": "http://startpagel6srwcjlue4zgq3zevrujfaow726kjytqbbjyrswwmjzcqd.onion/sp/se…", "search_url_post_params": "q={searchTerms}" View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/c67ac15… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/c67ac15… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.5-1] fixup! Bug 42562: Normalized the Accepted Languages on Android.
by Pier Angelo Vendrame (@pierov) 15 May '24

15 May '24
Pier Angelo Vendrame pushed to branch tor-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 66370dbe by Pier Angelo Vendrame at 2024-05-15T10:59:36+02:00 fixup! Bug 42562: Normalized the Accepted Languages on Android. Bug 42582: Use toLanguageTag() instead of toString() - - - - - 1 changed file: - mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java Changes: ===================================== mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java ===================================== @@ -850,7 +850,7 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { } } } - String acceptLanguages = locale != null ? locale.toString().replace('_', '-') : "en-US"; + String acceptLanguages = locale != null ? locale.toLanguageTag().replace('_', '-') : "en-US"; if (acceptLanguages.equals("en-US")) { // For consistency with spoof English. acceptLanguages += ", en"; View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/66370db… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/66370db… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Add Tor integration and UI
by Dan Ballard (@dan) 15 May '24

15 May '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: 110d8f18 by clairehurst at 2024-05-15T19:04:04+00:00 fixup! Add Tor integration and UI - - - - - 4 changed files: - fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt - fenix/app/src/main/java/org/mozilla/fenix/settings/TorSecurityLevelFragment.kt - fenix/app/src/main/res/navigation/nav_graph.xml - fenix/app/src/main/res/xml/preferences.xml Changes: ===================================== fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt ===================================== @@ -65,6 +65,7 @@ import org.mozilla.fenix.nimbus.FxNimbus import org.mozilla.fenix.perf.ProfilerViewModel import org.mozilla.fenix.settings.account.AccountUiView import org.mozilla.fenix.tor.QuickStartPreference +import org.mozilla.fenix.tor.SecurityLevel import org.mozilla.fenix.tor.TorBridgeTransportConfig import org.mozilla.fenix.tor.TorEvents import org.mozilla.fenix.utils.Settings @@ -537,6 +538,7 @@ class SettingsFragment : PreferenceFragmentCompat() { setupAmoCollectionOverridePreference(requireContext().settings()) setupGeckoLogsPreference(requireContext().settings()) setupAllowDomesticChinaFxaServerPreference() + setupSecurityLevelPreference() setupHttpsOnlyPreferences() setupNotificationPreference() setupSearchPreference() @@ -772,6 +774,19 @@ class SettingsFragment : PreferenceFragmentCompat() { } } + @VisibleForTesting + internal fun setupSecurityLevelPreference() { + val securityLevelPreference = + requirePreference<Preference>(R.string.pref_key_tor_security_level_settings) + securityLevelPreference.summary = context?.settings()?.torSecurityLevel()?.let { + when (it) { + SecurityLevel.STANDARD -> getString(R.string.tor_security_level_standard_option) + SecurityLevel.SAFER -> getString(R.string.tor_security_level_safer_option) + SecurityLevel.SAFEST -> getString(R.string.tor_security_level_safest_option) + } + } + } + @VisibleForTesting internal fun setupHttpsOnlyPreferences() { val httpsOnlyPreference = ===================================== fenix/app/src/main/java/org/mozilla/fenix/settings/TorSecurityLevelFragment.kt ===================================== @@ -24,11 +24,6 @@ class TorSecurityLevelFragment : PreferenceFragmentCompat() { private val securityLevelRadioGroups = mutableListOf<GroupableRadioButton>() private var previousSecurityLevel: SecurityLevel? = null - override fun onResume() { - super.onResume() - showToolbar(getString(R.string.preferences_tor_security_level_options)) - } - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.tor_security_level_preferences, rootKey) ===================================== fenix/app/src/main/res/navigation/nav_graph.xml ===================================== @@ -956,7 +956,7 @@ <fragment android:id="@+id/torSecurityLevelFragment" android:name="org.mozilla.fenix.settings.TorSecurityLevelFragment" - android:label="@string/preferences_tor_security_level_settings" /> + android:label="@string/preferences_tor_security_level_options" /> <fragment android:id="@+id/privateBrowsingFragment" android:name="org.mozilla.fenix.settings.PrivateBrowsingFragment" ===================================== fenix/app/src/main/res/xml/preferences.xml ===================================== @@ -99,7 +99,7 @@ <androidx.preference.Preference android:key="@string/pref_key_tor_security_level_settings" app:iconSpaceReserved="false" - android:title="@string/preferences_tor_security_level_settings" /> + android:title="@string/preferences_tor_security_level_options" /> <androidx.preference.Preference android:key="@string/pref_key_private_browsing" View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/110… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/110… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] Bug 41143: Add Firefox's localization files also to GeckoView.
by Pier Angelo Vendrame (@pierov) 15 May '24

15 May '24
Pier Angelo Vendrame pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 84219469 by Pier Angelo Vendrame at 2024-05-15T10:19:02+02:00 Bug 41143: Add Firefox&#39;s localization files also to GeckoView. They are needed for formatting APIs to work as expected. - - - - - 3 changed files: - projects/firefox-l10n/config - projects/geckoview/config - projects/geckoview/merge_aars Changes: ===================================== projects/firefox-l10n/config ===================================== @@ -21,11 +21,17 @@ steps: input_files => sub { my ($project, $options) = @_; my @input_files; - my $changesets_json = project_config('firefox', 'var/l10n-changesets', { %$options, origin_project => $project }); + my $is_android = project_config($project, 'var/android', $options); + my $source_project = $is_android ? 'geckoview' : 'firefox'; + my $locales_key = $is_android ? 'var/locales_mobile' : 'var/locales'; + my $changesets_json = project_config($source_project, 'var/l10n-changesets', { %$options, origin_project => $project }); my $d = decode_json $changesets_json; - my $locales = project_config($project, 'var/locales', $options); + my $locales = project_config($project, $locales_key, $options); foreach my $loc (@$locales) { my $locale = process_template($project, $loc, '.'); + $locale =~ s/-r/-/; + $locale = "id" if ($is_android && $locale eq "in"); + $locale = "he" if ($is_android && $locale eq "iw"); next unless my $revision = $d->{$locale}{revision}; my $input_file = { name => $locale, ===================================== projects/geckoview/config ===================================== @@ -33,6 +33,8 @@ var: gradle_dependencies_version: 12 gradle_version: 7.5.1 variant: beta + has_l10n: '[% !c("var/testbuild") && !c("var/locales").empty %]' + l10n-changesets: '[% exec("cat browser/locales/l10n-changesets.json") %]' targets: release: @@ -84,6 +86,12 @@ steps: pkg_type: build target_prepend: - torbrowser-android-x86_64 + - project: firefox-l10n + name: firefox-l10n + enable: '[% c("var/has_l10n") %]' + pkg_type: build + target_prepend: + - torbrowser-android-armv7 list_toolchain_updates: git_url: https://github.com/mozilla/gecko-dev.git ===================================== projects/geckoview/merge_aars ===================================== @@ -49,6 +49,19 @@ cp -rl $gradle_repo/maven2/* $gradle_repo || true export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE=system # Create .mozbuild to avoid interactive prompt in configure mkdir "$HOME/.mozbuild" + +[% IF c("var/has_l10n") -%] + supported_locales="[% tmpl(c('var/locales_mobile').join(' ')).replace('-r', '-').replace('in', 'id').replace('iw', 'he') %]" + l10ncentral="$HOME/.mozbuild/l10n-central" + mkdir "$l10ncentral" + for tarball in $rootdir/[% c('input_files_by_name/firefox-l10n') %]/*; do + tar -C "$l10ncentral" -xf "$tarball" + done + + # Do not setup our localization files, as we do not provide any frontend + # through GeckoView. +[% END -%] + # We still need to specify --tor-browser-version due to bug 34005. ./mach configure \ --with-base-browser-version=[% c("var/torbrowser_version") %] \ @@ -56,6 +69,12 @@ mkdir "$HOME/.mozbuild" [% IF !c("var/rlbox") -%]--without-wasm-sandboxed-libraries[% END %] ./mach build --verbose + +[% IF c('var/has_l10n') -%] + # No quotes on purpose, to pass each locale as an additional argument. + ./mach package-multi-locale --locales en-US $supported_locales +[% END -%] + # We prepare an archive to then extract it as we were using a local Maven # repository. # See also https://github.com/mozilla-mobile/firefox-android/blob/main/fenix/docs/subs… View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/8… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/8… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Disable features and functionality
by ma1 (@ma1) 15 May '24

15 May '24
ma1 pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: 6eaa81ce by hackademix at 2024-05-15T07:39:36+02:00 fixup! Disable features and functionality Bug 42578: Reject Android &quot;open in Tor Browser&quot; intent - - - - - 1 changed file: - fenix/app/src/main/java/org/mozilla/fenix/home/intent/HomeDeepLinkIntentProcessor.kt Changes: ===================================== fenix/app/src/main/java/org/mozilla/fenix/home/intent/HomeDeepLinkIntentProcessor.kt ===================================== @@ -90,6 +90,15 @@ class HomeDeepLinkIntentProcessor( logger.info("Not opening deep link: $url") return } + if (BuildConfig.DEEP_LINK_SCHEME.startsWith("torbrowser")) { + // tor-browser#42578 + // TODO: + // Maybe just warn users about linkability but + // give them the choice to open anyway, once + // the other deep link related issues are fixed. + logger.info("Tor Browser rejects open intent deep link: $deepLink") + return + } activity.openToBrowserAndLoad( url, View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/6ea… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/6ea… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Add Tor integration and UI
by richard (@richard) 14 May '24

14 May '24
richard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: 6abe2084 by Richard Pospesel at 2024-05-14T18:44:55+00:00 fixup! Add Tor integration and UI removed vestigal comment - - - - - 1 changed file: - fenix/app/src/main/AndroidManifest.xml Changes: ===================================== fenix/app/src/main/AndroidManifest.xml ===================================== @@ -366,7 +366,6 @@ android:value="androidx.startup" tools:node="remove" /> </provider> - <!-- Define Orbotservice's TorService --> </application> </manifest> View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/6ab… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/6ab… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Bug 40009: Change the default search engines
by Dan Ballard (@dan) 14 May '24

14 May '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: e8c1e87b by Dan Ballard at 2024-05-14T16:04:35+00:00 fixup! Bug 40009: Change the default search engines Bug 42290: update Duckduckgoonion to duckduckgo (.onion) and startpage - - - - - 3 changed files: - android-components/components/feature/search/src/main/assets/search/list.json - android-components/components/feature/search/src/main/assets/searchplugins/ddg-onion.xml - android-components/components/feature/search/src/main/assets/searchplugins/startpage-onion.xml Changes: ===================================== android-components/components/feature/search/src/main/assets/search/list.json ===================================== @@ -1,7 +1,7 @@ { "default": { "searchDefault": "DuckDuckGo", - "searchOrder": ["DuckDuckGo", "DuckDuckGo Onion", "Startpage", "Startpage Onion","Wikipedia"], + "searchOrder": ["DuckDuckGo", "DuckDuckGo (.onion)", "Startpage", "Startpage (.onion)","Wikipedia"], "visibleDefaultEngines": [ "ddg", "ddg-onion", "startpage", "startpage-onion", "wikipedia" ] ===================================== android-components/components/feature/search/src/main/assets/searchplugins/ddg-onion.xml ===================================== @@ -1,5 +1,5 @@ <SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"> -<ShortName>DuckDuckGo Onion</ShortName> +<ShortName>DuckDuckGo (.onion)</ShortName> <Description>Duck Duck Go Onion</Description> <InputEncoding>UTF-8</InputEncoding> <Image height="16" width="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAB8lBMVEUAAADkRQzjPwPjQQXkRQ3iPwTiQQXgPQPeQgrcOwPVNgDVNQDWOgbTMwDRMgDQMwDSMwDRNwTQLgDRJgDSJwDSLgDSNwTjOgDiOADjOQDkPADhQAXzs5v+/fv////0vKbiRQvgPQHpdUr85NzuknPdKgDcIwDnZzj2w7HqeU/gPQLsimb/+PftjWn97Obpb0LdJQDeLQDtjmvsi2jgSBDnbULgOQD/39HgLQDeMgDpeFLgSBH0v670uqbaJQD2qImWvP/G1Ob5+/3u//+fvvXyp47dMwDaLwD0u6v0v6/aNQDiXi/aKQD3qozU7/8gSY2vvtg0ZK/OqLDaKQHYKgLgWTfaNADZMgDZMADZLADzqpD7//+xwdz//9H/5Bn/7Bn//ADofADYMADYMQDZOgPXLgDiZDj//97/0AD3tQDvlgHZOgbXLATXMADWMgDfXjLVLQD///z+0AD/3Rn/yRnwnQDcVjbVMQDyv67wuKTSJwDRHQD+8O/tg3/iQQDwhAHnawHWMADvtKfyva7XQxHga0bQGQD2vbH/u8LXIQCmPQzja07XQxLliGn99fPkcVHvhnGZ5VguvUU5wktBwCcAgxzydVv/8/XmiGngdlL+ysi3+I8LtCE80V6P3YmX4sDleljSNQLzr6D7sKPXNQTSIwAEAbMrAAAAF3RSTlMARqSkRvPz80PTpKRG3fPe3hio9/eoGP50jNsAAAABYktHRB5yCiArAAAAyElEQVQYGQXBvUqCYRiA4fu2V9Tn+UQddI3aCpxaOoU6iU4gcqqpoYbALXBuCuoYmttamqJDiEoh4YP+MOi6BNCh+uYKEGiOVNCXXxA2XDVV/UyfKbRCXTLQWAxbP2vt8Ue/uYDvfim91615sb2um6rqtrr/NFb1cUf1Ybd06areU6lSlYpK79jzK1SyJOkfhOl8JGEcqV5zoKrTRqO6yUzIzNu46ijdM1VV9bhuUJ/nZURExLRzUiPQm3kKXHi4BAEGOmOi78A/L1QoU/VHoTsAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTQtMDEtMTlUMjA6MDE6MTEtMDU6MDAuET6cAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE0LTAxLTE5VDIwOjAxOjExLTA1OjAwX0yGIAAAAABJRU5ErkJggg==</Image> ===================================== android-components/components/feature/search/src/main/assets/searchplugins/startpage-onion.xml ===================================== @@ -1,5 +1,5 @@ <SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"> -<ShortName>Startpage Onion</ShortName> +<ShortName>Startpage (.onion)</ShortName> <Description>Start Page Onion</Description> <InputEncoding>UTF-8</InputEncoding> <Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAASsUlEQVR42qSXXWoCQRCElzxKTiOeSMBLhuAZgscQAR/dXU2aBfnggykaIpTTU9aU3fO3OtXro7C1y/LcFY7zvH4Xbsuy/lZ/wzwTgxWIG2rpqxXy+L4u51+89G2soe/vft6rPRdO6/r6fM/3hndQHx5K+IORk9yM3sUoebSMYTLQo8EPrvoFPODXOIH4AHjGhlg52ROu4AUd1EMsr0thzyLUqwT7Iq8qhsJVcNgNWhgVKA06ChfgKdq8NZ4QeBYZvTSatKQJ34V24HMtHLYFeDxen/XBxRP+HlwIhVmjogQKt6fjcVs69RlPzoAxWUMtLDy8a8BLebj+MHa7bXZTdU7hDvUJsMY8eiF4tjR4DxEW2SfMnj6VQHXJX2jw8jxO9XYOiScT0DqSGXnX+JnSf3ZYj681juUvfS//AYfn11TB3XeWJ9JHzn34NRz3yNPCA1090vmaCt72NWfPkW94FihP8Z7n2+RdTCuT/NNS0A7KC5fAjst5mnfuLt65CT1PanHN8PYyPw0mV6tMrCNtTXpgd+KwCI77z5LC6GpreMKHuttXkjFx/FKy8P04JIPGY80L0sJ3Y+Mf9dlTdcf/EGzwqXNcQG/HEftEdTzQ3/94NQsey2EYCPfHHjMzMzMzMzMzMzMzM1HsOyvqKoo+PW+PJFnPTbPJBjyZcfou6JNnQe89DHrzzi+7HfT+Qyuzd9ReIIZDRmKsIpup0T+zLqxbgAJ0pDxQu5yj88GEB3xa/+6DoDv2BZ2+QLT3cNF2vUWbdRZt2F60gVk7860svus1TNTq7tof9N4D3OEwaT+A1QSqD9HnQo/7Po+mAk5+EmPOhAL7gPYofJ+/DLphW9Dew0SbdLJJjlZOesP4HBcg95OFsb/tO0J04/agL16FPNQdRsT/Mws8H9o4QpgZFbUPM/8g4br+e9ux0xaUO1zrrIH9/olZhHQRnbNU9MGjAJTQ27EY3b4+YshyWVXBGJ51Ds/McHy28uZt0KVr4iQ1bFc3+eWONj+Wt4tl+bsYBeSr5uUtuor1ZX3CjgQm5pIDWKg/PMwLDp28w6wcfumUz9s7fzlojyEZlJRw0y61EnrA2gMEpX8Hz10Hip67mOM/CsMMSsj3oYi1D58thRNClK10cuKsBdZtDdrU4KadDyMMSXFn+3W5vvW9ZnPQr19rwoVzsFKmt0LikSGIGmfOy8KkrM/Zws+fg85eInFnlvCSQA1ObgYl7GvFOuaLTpoj+ukzirT6wocjQtnnqEhoKHcCUIP2A2Hn06egMxfahLjwYZPO5clzUk7PXB/aHTdD9MNHTE/TJGZ1kOl5rNGMUuiQimCYYeNbsLjzvwSdu1Q8ePgPxsxq8hzRj59C1WtRj/H5Io2FGB2edP3IORHKpm7aEcrBI7yk0FBCk/1GS+qY385ftNiG+Va/9MmkDgaXrBE+E6LhbvYXgJgVlpcLkIUgYppPzdL3F6+GUlT9qSWUlNkRl2tZhvXLhWzUQfTw8aB8fuFuBtjxoKt8Zis4xPyQ4nvgmKMx2ldBWGU7Pv4ahx88TnTBCtEtu4LuPRR03+Ggm3cGnb9cdMBo0eZd0ogQiBAf5lr3EH36HFiKn1rwYco3oqGcH/EvpqO/dK3HcJLJycptRw4cI7rnUEwn5JGZ+0+f2YKYtoC+KvgTZwv3xT7Dj79gWF5kDaO48G/6Y/nDx0FbdkvDXDn8gf10HiB65GSwwxvZCV/GR3v3Pi5Eq+65MmaxZpZS3cYdRC9c9oQk53KYFdX71i5NR3up55Tzkx907jJh9tGuNiuZOEv05eua4W/mvIvZ1J5Ds2hz/Vjf4O7rV0wdcyqG56nSTZtZ4Sk4Fh15hxEODLdzAcQwJBoXQWzRTKxB+Hqsg9+9fhPsfLBJTvqGhW9nJnV+446il6/57TNT+n2/AMWbVCIRxtCwYXsAeGH2UtLF6Qts8pN2mNK6H0Tl59TLV8HuE0DUKfrlppg+XxzqmZW7F/e+cC2q5UX42bh0v5HiCqDU+gwXw273do3f+f6tu3YmVBN7bXqKRRDMh8cQ/4gFBWVhFQj3acXt8DUG47AOKf1fdVWvXPcv25l1oGbBOhujGIyRaL8JNKZ+Ckknz1K/3L4v0DwDCHJui9JFKMvsSjANdVcEjZ8pGI7R5wVhsZjVy8Lckm49BmcCDZhYujlMd/gQYv0hbFY/A/zP6PikT/3pC6qF+oUr3F/1jwJ8ArH7YHD/nzQS7ACP6QnOhrJeqgRXeSqCuS03wrdkvYaWOyoNccrViHYbFJNgHMKQWUU4oPcYHXbOGDvjSU9yTZEwmDKOmVL6+jrf/f5OT/6GP3nML+V/eFicQ5OxGEsJ2GCcmy57VouWfJKIWSEL4sHVVqpmk2aX8JOkPtLUdZa+KFMTDD98PvlwxYtWMLTQd/gMSc+eB+PQJY56Zoq1FuxAH39u2/eGShB57eaf5Hf81H46pwVdMnNalS9rbt+LDCiKK/tlAVaWHz6RsS341DHzcedxOde3BOGVG/W3SI/99pmRVRdimFb2GUn8u+u34gKkjMIwt1M/UdMGY6eLzlosumiV6Ir1P5s7B5hLliyOdzbevNh+tm3btm3btm3btm1LY+OzdCe1de5MZTv5Tf1zUuPkbJ+tru66X3fX/wivniqSSOTlYE1PyjeuwXheiykoCsH9wMu8pEoYYC4aEQ0e8yY+9+q08NnX01MIp0ydZoLWYcSR95OEsrJrdT0arhHz3GtXdCJxIrcXHHSZr1DXDNCVkKsdA2E9PQ7eoSryA9GZgCIzW3hYkRmX9f1wu6qCC5BOZxTrymv1uK4VK78n749cV/d4hcRcfAWebamznI10bZa37pc8DbAMD2I6DpHAVx+n19K/IUEQ3A0+oZItzMgE8LXxxPmMzOn8HdYv9/cPhocffznc99DzLvrks+/d9+ccV+DKCAUa+GKFcaS2OBYQBpfY5i4DR8JhOn7z3W9hwSU3/T8ttVk8GtX+f42/6bZHZfql1mzgtJSyz6gSW0uVn2KcQovnBwaG4hc5ZEeupbWlIrI1Tz/nOnuwbnrz7U+dmd/ZsldVvI5rKiaqqtLMhswM7unpD1OmtIU//xoR3nzns3D/wy+ES668Mxx3ymVhrwNPC9vtekzYfLtDw/GnXj7jJeisPPKqfIrz/x0+Jiy54jbp4aavPcsvscLWYeSo8bi/r8CwUcRXOf96Im4dZkm8Eb+avQ88PWy01UFhmVW3T9u89scl2rR5XGSZLcIPP/3JFwCVUkGTjel8nBNOuyLBS1ofVP+tW+14RPRtDQAedUW+zv3RcoJpKQ4PKOHmsy9+dGzv2tcWae+DTrdd4NCusAsSyTov24GLLrdldv36eDp3xbX3qixoVahd2DkAFTIiDCh8LT29/fHrP5B/bOKXrPPTzy209Gbh3gefUxnFAo40/++wMWG19fYA1Ch+kWW3DN/98EfhuuV8lSu71BXsNN5uu+sJbPMZfyQgKG37JSI+v/Xu5zLVUfth+PLGjp0UNtv20Pp6aU1AkfGJdtj92LQjeX+qoq48KkKkESDImwGtgyITJ7WEldfeNVDgaThaZpXtw2tvfCyEWm6c5v8//46OQv4wrOehx596TbhecohgBNvJrVEmLYg3oBvaVRt1wy0PA1cJSaTFltsqXHPDA6GjozvdU6m3GLcv99U3PgprbLBn0cNfd5N9Q2dnj1cbEy0PRF8j3AdaEOFFGxEMuU2OKui6m+6XtnWiuvED7ah+tK/3hZffM03E7Sf6/Y9h4egTL4kYvsXMNBwX/+CjL2r4peVv5PNr6TFHgQZ4Pefl1z4IC0c1068VcXesE7/Ii6+4M3z48TfRtd0eY7R9sdpmIPTGF9Pd3dfU1Z9+7q1w4OHnmPDE9Xo9rtXV1ev4u43g/3Jfk3P5VMq6TbzOXKPFe9LpV+XwX42Dt6O9TNNoNtrywKadsdJau8w4J65z8kZPPvNGifYieuGBpMOxypRrQtDQ7503OFpaOurCMEEPtCBqJ+DTXEAH5lPzktfacdtdjrYdBYjw18NhTLZ8I8+AjMiIloYGzv3598iw6nq7Kwjg+Owntaa5Rkzwy0igf5y8vo6GGIuYyatSTfBffPVTWGGNnYofuh9SyiHonAtvgkUu3PCe5n1FlfJYIOukI58rRDCylwDcNoKfSGJ68+iHsaU4x4jzzSLfPDz74jsCKlRigoJoldOEgIzcWunmaivJ63/7fVjYYIsDhDD2jGP3SM2K44l4zbKr7RB+/f1fqQkRkksiYezMWClJrRtw4GVIN+74CVPCwUeeaz4gPDDBzzXacocjwtSWDpEOqcbLqRLuUxXxSnPFeW7R3ui0e+jRl0wu5CJU1GyW0scmUdvCXMynhhVOOuMqC2ESZgkxSivU7ZV1qwIjfv0MNfKYiPUGXHjU6Anh5DOvNheEgJG5TwtFeuCRFx2FIcXBevBITcw06cBXLnpEO9PyGuHnX/4OZ553fdwRO88WLWj51XdsWtBX33C/CdfcLpHjS628ncWRXUaZTl/UXSKpBdFVSmjSEt9hzBG6knx49MlXw0FHnGMaE2AEcFTj7YHtvNcJ4a77ngmjx0y0+zV9SSeefmWaU6ckzDFWW8sUBvNrAT5EwoKI0tGDUB+vdDWkL/9Fa0j+fv/JirYv0FJJLrv6rhg/vqIpvPc95MxwyFHnxfjy5eGiy28P9zzwbPjgo6/DxIkthtv4LS2tHdHQOrrYCDziuAvjixwU8V+k9Od6XUvNsYJ7OePnAP5jYeNL++eoOeX8sOFjw6rr7lYCZwZhFmTyuKYBv+R1UJ7SWTfqED4RGmNaZcs7+HROjj/V0Tyqiy+/FbQtusrJW8Tuo0++FXBcUiNmvxVBeboZSMiMwLgPhijg+VKyaY8Y5xg9liYf6vYHKckVGnRrb7yPyRZHdjXX5zh/byXaxIu8HPq3Ne47Glxwjib/fBPKpuMXq6f7HnyGxSPU+p4SWxWU123jncaa7p/DOSKQzW1NaOQHoRyLbW1dFnifadSMWhENtmtufAAQ44BDPAcVlHcGxlU3cu4m3WNI3F82T2XuDs/z9w8fOc7ixgUu8k0t8mYZHFifMezcruZvNb6iDeDpuY86L4dA4rieXwo7es7Hn34XFl9ha48qijkWmbOcIynj/BVA6QXMVL8FEZ5YcOB/4JxDyJKalS6Q0AaUJYTBhV2DIuE23zTsus9JseivB+s7C0EAs5Wjr40YU5oOrhUE2CCv0wKFLUIIMMPt1LOvhbvaa6hdeNntdj+t6fh7RyOoLoUaH65uAa9lhCPcV0wajtrau8Iue51Q5rSzIM4L78yu1ERZjCAgiEV1frVMQIvISypIB5S5TiOiUF5ro73toaqEACOMr7jmzpYyI7S4hlML0lADnpR7AfpFcA7y8OXa2gDzw6qVJC250rYlLnFLy+ffR/iRNRYVBB21IglPumM4eKTtOQS00/gp15osM441DTo0anTnvU/L6hz+Nn6oFaFE14SRz5UrqRqwEkNGV63r++sIlmVFnHHu9ZmcosQz7+jaGx8ocEcrCNK8hgU97pzbKLi3V/PS45YfZComv/ichpTqG8QajvHK0ZI3TRaYjmt1hTphhu3RtJMP17pc3BoqLOfUckUJP9wRzeqbP/4cAYPV7YpOL0D4LIQhJoPzYq4ytvBScOR53T+O62Mc8z/74ocklKU8OOv8G+EJSCQgHOOV16ynAC3QOvQc/zh3jfY16XvCs/vamx+HpVfZvp7oVU/2ssicQZa7pZtu1qG3rTMArb9I8mK+XsvbxxpqL8bltVZnNjqcFmuMLR5giVvmBzrmpEvDl1//LFzw0AJVR10644x02zDhHqafSLqu6W4WvEoP1B+FKHvFHKyZqm9a2zpDX/8g1hJQU9IvqMz092swLqGkzpH3+2Kc/1lDrCnWKno+oEpbr9qq1V3FBa+/fCGDClRl37Ug/bJ1VxnhX8Muq0QQvGDbN9yQItb19CzSc8rHC3jRrAP//TGOVwUuaDWuoUT3IHUeRTQO6xWOk/BVS9jTBS9oXdzi8Pkrw0s9GKG9ZHNQFSarB6ITx7QM0vP9YVPhmsF8O3bYC3gv0y8IhPPC8ICsUBBDEvgpHYRcQ8ooDaVaNdYRQ8I15tp9PrAXcHBBt0RvDpBf8PnTGP3ndUazKrSQvHhenKv5w80X9N/4Rn4CbMgsOUCJ2w2tx3lfrdU452i+/P4U5qKdDhLPfmk0pi1Q2b84edVIU7C1RNW4q5EHYU3BE+fwmtnEGznm6Plunw+P9qwbK1f1f3Fw5Ui/iC0+G6kxr++pr/HbCCXX/WQffFVV/2lS+h/7F/vmLxBPHh7pg0gdiOpo3ki4kItly3zL+w3NRkukd+ILONgg3551eu7/AxK2F7WQPNQ+AAAAAElFTkSuQmCC</Image> View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/e8c… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/e8c… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Add Tor integration and UI
by Pier Angelo Vendrame (@pierov) 14 May '24

14 May '24
Pier Angelo Vendrame pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: 7b6f9fcc by Pier Angelo Vendrame at 2024-05-14T10:14:58+02:00 fixup! Add Tor integration and UI Bug 41111 (Build): Use Lyrebird to provide WebTunnel PT Client - - - - - 1 changed file: - fenix/app/src/main/assets/common/torrc-defaults Changes: ===================================== fenix/app/src/main/assets/common/torrc-defaults ===================================== @@ -4,7 +4,6 @@ AvoidDiskWrites 1 Log notice stdout CookieAuthentication 1 DormantCanceledByStartup 1 -ClientTransportPlugin meek_lite,obfs2,obfs3,obfs4,scramblesuit exec ./libObfs4proxy.so +ClientTransportPlugin meek_lite,obfs2,obfs3,obfs4,scramblesuit,webtunnel exec ./libObfs4proxy.so ClientTransportPlugin snowflake exec ./libSnowflake.so -ClientTransportPlugin webtunnel exec ./libWebtunnel.so ClientTransportPlugin conjure exec ./libConjure.so -registerURL https://registration.refraction.network/api View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/7b6… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/7b6… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] MB 278: Add assets for Mullvad Browser's Windows installer.
by richard (@richard) 14 May '24

14 May '24
richard pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 623fc4a5 by Pier Angelo Vendrame at 2024-05-14T16:43:04+02:00 MB 278: Add assets for Mullvad Browser&#39;s Windows installer. - - - - - 6 changed files: - projects/browser/windows-installer/browser-install.nsi - projects/browser/windows-installer/defines.nsh.in - + projects/browser/windows-installer/mullvadbrowser-alpha.bmp - + projects/browser/windows-installer/mullvadbrowser-nightly.bmp - + projects/browser/windows-installer/mullvadbrowser-release.bmp - − projects/browser/windows-installer/mullvadbrowser.bmp Changes: ===================================== projects/browser/windows-installer/browser-install.nsi ===================================== @@ -84,9 +84,9 @@ Function SetupType ${EndIf} SetCtlColors $0 "" "${MUI_BGCOLOR}" - ${NSD_CreateBitmap} 0 0 100% 100% "" + ${NSD_CreateBitmap} 0u 0u 109u 193u "" Pop $0 - ${NSD_SetBitmap} $0 $PLUGINSDIR\${WELCOME_IMAGE} $1 + !insertmacro MUI_INTERNAL_FULLWINDOW_LOADWIZARDIMAGE "" $0 $PLUGINSDIR\${WELCOME_IMAGE} $1 ${NSD_CreateLabel} 120u 10u 195u 28u "Welcome to the ${DISPLAY_NAME} Installer" Pop $0 ===================================== projects/browser/windows-installer/defines.nsh.in ===================================== @@ -22,7 +22,7 @@ [% ELSE -%] !define ICON_NAME "[% c('var/projectname') %].ico" [% END -%] - !define WELCOME_IMAGE "[% c('var/projectname') %].bmp" + !define WELCOME_IMAGE "[% c('var/projectname') %]-[% c('var/channel') %].bmp" [% IF c('var/mullvad-browser') -%] ; Firefox's --with-user-appdir ===================================== projects/browser/windows-installer/mullvadbrowser-alpha.bmp ===================================== Binary files /dev/null and b/projects/browser/windows-installer/mullvadbrowser-alpha.bmp differ ===================================== projects/browser/windows-installer/mullvadbrowser-nightly.bmp ===================================== Binary files /dev/null and b/projects/browser/windows-installer/mullvadbrowser-nightly.bmp differ ===================================== projects/browser/windows-installer/mullvadbrowser-release.bmp ===================================== Binary files /dev/null and b/projects/browser/windows-installer/mullvadbrowser-release.bmp differ ===================================== projects/browser/windows-installer/mullvadbrowser.bmp deleted ===================================== Binary files a/projects/browser/windows-installer/mullvadbrowser.bmp and /dev/null differ View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/6… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/6… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] Add jwilde entry to reviewers in default merge request template
by richard (@richard) 14 May '24

14 May '24
richard pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 70f537ab by Richard Pospesel at 2024-05-14T12:14:44+00:00 Add jwilde entry to reviewers in default merge request template - - - - - 1 changed file: - .gitlab/merge_request_templates/default.md Changes: ===================================== .gitlab/merge_request_templates/default.md ===================================== @@ -36,17 +36,18 @@ - **android** : clairehurst, dan - **build system** : boklm - **extensions** : ma1 - - **firefox internals (XUL/JS/XPCOM)** : ma1 + - **firefox internals (XUL/JS/XPCOM)** : jwilde, ma1 - **fonts** : pierov - **frontend (implementation)** : henry - **frontend (review)** : donuts, richard - **localization** : henry, pierov - - **macos** : clairehurst, dan + - **macOS** : clairehurst, dan - **nightly builds** : boklm - **rebases/release-prep** : boklm, dan, ma1, pierov, richard - - **security** : ma1 + - **security** : jwilde, ma1 - **signing** : boklm, richard - **updater** : pierov + - **windows** : jwilde, richard - **misc/other** : pierov, richard ### Change Description View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/7… -- This project does not include diff previews in email notifications. 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
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-115.11.0esr-13.5-1] fixup! Adding issue and merge request templates
by richard (@richard) 14 May '24

14 May '24
richard pushed to branch mullvad-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser Commits: 904de2aa by Richard Pospesel at 2024-05-14T11:57:43+00:00 fixup! Adding issue and merge request templates add jwilde to reviewer list - - - - - 1 changed file: - .gitlab/merge_request_templates/default.md Changes: ===================================== .gitlab/merge_request_templates/default.md ===================================== @@ -41,17 +41,18 @@ - **android** : clairehurst, dan - **build system** : boklm - **extensions** : ma1 - - **firefox internals (XUL/JS/XPCOM)** : ma1 + - **firefox internals (XUL/JS/XPCOM)** : jwilde, ma1 - **fonts** : pierov - **frontend (implementation)** : henry - **frontend (review)** : donuts, richard - **localization** : henry, pierov - - **macos** : clairehurst, dan + - **macOS** : clairehurst, dan - **nightly builds** : boklm - **rebases/release-prep** : dan, ma1, pierov, richard - - **security** : ma1 + - **security** : jwilde, ma1 - **signing** : boklm, richard - **updater** : pierov + - **windows** : jwilde, richard - **misc/other** : pierov, richard #### Change Description View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/904… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/904… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][base-browser-115.11.0esr-13.5-1] fixup! Adding issue and merge request templates
by richard (@richard) 14 May '24

14 May '24
richard pushed to branch base-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 4384bb33 by Richard Pospesel at 2024-05-14T11:56:56+00:00 fixup! Adding issue and merge request templates add jwilde to reviewer list - - - - - 1 changed file: - .gitlab/merge_request_templates/default.md Changes: ===================================== .gitlab/merge_request_templates/default.md ===================================== @@ -42,17 +42,18 @@ - **android** : clairehurst, dan - **build system** : boklm - **extensions** : ma1 - - **firefox internals (XUL/JS/XPCOM)** : ma1 + - **firefox internals (XUL/JS/XPCOM)** : jwilde, ma1 - **fonts** : pierov - **frontend (implementation)** : henry - **frontend (review)** : donuts, richard - **localization** : henry, pierov - - **macos** : clairehurst, dan + - **macOS** : clairehurst, dan - **nightly builds** : boklm - **rebases/release-prep** : dan, ma1, pierov, richard - - **security** : ma1 + - **security** : jwilde, ma1 - **signing** : boklm, richard - **updater** : pierov + - **windows** : jwilde, richard - **misc/other** : pierov, richard #### Change Description View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/4384bb3… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/4384bb3… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.5-1] fixup! Adding issue and merge request templates
by richard (@richard) 14 May '24

14 May '24
richard pushed to branch tor-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 51caba94 by Richard Pospesel at 2024-05-14T11:54:30+00:00 fixup! Adding issue and merge request templates add jwilde to reviewer list - - - - - 1 changed file: - .gitlab/merge_request_templates/default.md Changes: ===================================== .gitlab/merge_request_templates/default.md ===================================== @@ -42,17 +42,18 @@ - **android** : clairehurst, dan - **build system** : boklm - **extensions** : ma1 - - **firefox internals (XUL/JS/XPCOM)** : ma1 + - **firefox internals (XUL/JS/XPCOM)** : jwilde, ma1 - **fonts** : pierov - **frontend (implementation)** : henry - **frontend (review)** : donuts, richard - **localization** : henry, pierov - - **macos** : clairehurst, dan + - **macOS** : clairehurst, dan - **nightly builds** : boklm - **rebases/release-prep** : dan, ma1, pierov, richard - - **security** : ma1 + - **security** : jwilde, ma1 - **signing** : boklm, richard - **updater** : pierov + - **windows** : jwilde, richard - **misc/other** : pierov, richard #### Change Description View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/51caba9… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/51caba9… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] Comment differences between locales and locales_mobile.
by Pier Angelo Vendrame (@pierov) 14 May '24

14 May '24
Pier Angelo Vendrame pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 35a864ab by Pier Angelo Vendrame at 2024-05-14T13:32:40+02:00 Comment differences between locales and locales_mobile. See tor-browser-build!967. - - - - - 1 changed file: - rbm.conf Changes: ===================================== rbm.conf ===================================== @@ -162,9 +162,11 @@ var: - fr - ga-rIE - hu + # Indonesian (id in var/locales) - in - is - it + # Modern Hebrew (he in var/locales) - iw - ja - ka View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/3… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/3… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Implement Android-native Connection Assist UI
by Dan Ballard (@dan) 14 May '24

14 May '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: e2bd6fda by clairehurst at 2024-05-14T00:00:14+00:00 fixup! Implement Android-native Connection Assist UI - - - - - 2 changed files: - fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistFragment.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistViewModel.kt Changes: ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistFragment.kt ===================================== @@ -62,6 +62,7 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler { override fun onResume() { super.onResume() hideToolbar() + viewModel.handleTorConnectStateToScreen() // Covers the case where the app is backgrounded when the bootstrap finishes } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -86,6 +87,7 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler { viewModel.shouldOpenHome().observe( viewLifecycleOwner, ) { + Log.d(TAG, "shouldOpenHome() = $it") if (it) { openHome() } ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistViewModel.kt ===================================== @@ -46,6 +46,7 @@ class TorConnectionAssistViewModel( init { Log.d(TAG, "initiating TorConnectionAssistViewModel") _torController.registerTorListener(this) + handleTorConnectStateToScreen() // should cover the case of when we have an onBootStrapStateChange() event before this is initialized, which lead to being stuck on the splash screen } private fun handleConnect( @@ -95,6 +96,10 @@ class TorConnectionAssistViewModel( _progress.value = progress.toInt() } + handleTorConnectStateToScreen() + } + + fun handleTorConnectStateToScreen() { when (_torController.lastKnownStatus) { TorConnectState.Initial -> _torConnectScreen.value = ConnectAssistUiState.Splash TorConnectState.Configuring -> handleConfiguring() @@ -144,7 +149,11 @@ class TorConnectionAssistViewModel( /** stay here */ } - else -> _torConnectScreen.value = ConnectAssistUiState.Connecting + else -> _torConnectScreen.value = + ConnectAssistUiState.Connecting.also { connectAssistUiState -> + // covers the case of when the bootstrap is already in progress when the UiState "catches up" + connectAssistUiState.progress = _progress.value ?: 0 + } } } View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/e2b… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/e2b… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Enable the connect assist experiments on alpha
by Dan Ballard (@dan) 13 May '24

13 May '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: 89ac6134 by clairehurst at 2024-05-13T23:56:04+00:00 fixup! Enable the connect assist experiments on alpha - - - - - 1 changed file: - fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt Changes: ===================================== fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt ===================================== @@ -13,6 +13,7 @@ import android.os.Build import android.os.Bundle import android.os.Handler import android.os.Looper +import android.util.Log import android.view.LayoutInflater import android.view.WindowManager import android.widget.Toast @@ -40,7 +41,6 @@ import mozilla.components.concept.sync.Profile import mozilla.components.service.glean.private.NoExtras import mozilla.components.support.ktx.android.view.showKeyboard import org.mozilla.fenix.BrowserDirection -import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.Config import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.GleanMetrics.Addons @@ -49,6 +49,7 @@ import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.GleanMetrics.TrackingProtection import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R +import org.mozilla.fenix.ReleaseChannel import org.mozilla.fenix.components.accounts.FenixFxAEntryPoint import org.mozilla.fenix.databinding.AmoCollectionOverrideDialogBinding import org.mozilla.fenix.ext.application @@ -59,6 +60,7 @@ import org.mozilla.fenix.ext.openSetDefaultBrowserOption import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar +import org.mozilla.fenix.gecko.GeckoProvider import org.mozilla.fenix.nimbus.FxNimbus import org.mozilla.fenix.perf.ProfilerViewModel import org.mozilla.fenix.settings.account.AccountUiView @@ -66,6 +68,7 @@ import org.mozilla.fenix.tor.QuickStartPreference import org.mozilla.fenix.tor.TorBridgeTransportConfig import org.mozilla.fenix.tor.TorEvents import org.mozilla.fenix.utils.Settings +import org.mozilla.geckoview.BuildConfig import kotlin.system.exitProcess @Suppress("LargeClass", "TooManyFunctions") @@ -741,7 +744,7 @@ class SettingsFragment : PreferenceFragmentCompat() { requirePreference<Preference>(R.string.pref_key_use_html_connection_ui).apply { onPreferenceChangeListener = object : SharedPreferenceUpdater() {} - isVisible = BuildConfig.DEBUG + isVisible = Config.channel != ReleaseChannel.Release } requirePreference<Preference>(R.string.pref_key_tor_logs).apply { View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/89a… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/89a… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Add Tor integration and UI
by Dan Ballard (@dan) 13 May '24

13 May '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: cf78d7f5 by clairehurst at 2024-05-13T14:35:02-07:00 fixup! Add Tor integration and UI - - - - - 18 changed files: - fenix/app/src/main/AndroidManifest.xml - fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt - fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt - − fenix/app/src/main/java/org/mozilla/fenix/tor/TorBootstrapFragment.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorController.kt - − fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerTAS.kt - − fenix/app/src/main/java/org/mozilla/fenix/tor/controller/TorBootstrapController.kt - − fenix/app/src/main/java/org/mozilla/fenix/tor/interactor/TorBootstrapInteractor.kt - − fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapAdapter.kt - − fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapConnectViewHolder.kt - − fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapLoggerViewHolder.kt - − fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapPagerAdapter.kt - − fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapPagerViewHolder.kt - − fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapView.kt - − fenix/app/src/main/res/drawable/ic_tor_connect_computer_graphic.xml - − fenix/app/src/main/res/layout/tor_bootstrap_connect.xml - − fenix/app/src/main/res/layout/tor_bootstrap_logger.xml - − fenix/app/src/main/res/layout/tor_bootstrap_pager.xml Changes: ===================================== fenix/app/src/main/AndroidManifest.xml ===================================== @@ -367,12 +367,6 @@ tools:node="remove" /> </provider> <!-- Define Orbotservice's TorService --> - <service - android:name="org.torproject.android.service.TorService" - android:enabled="true" - android:exported="false" - android:stopWithTask="true"> - </service> </application> </manifest> ===================================== fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt ===================================== @@ -103,7 +103,6 @@ import org.mozilla.fenix.utils.Settings.Companion.TOP_SITES_PROVIDER_MAX_THRESHO import org.mozilla.fenix.wallpapers.Wallpaper import java.util.UUID import java.util.concurrent.TimeUnit -import org.torproject.android.service.util.Prefs /** *The main application class for Fenix. Records data to measure initialization performance. @@ -234,8 +233,8 @@ open class FenixApplication : LocaleAwareApplication(), Provider { Log.addSink(FenixLogSink(logsDebug = Config.channel.isDebug, AndroidLogSink())) } - @OptIn(DelicateCoroutinesApi::class) // GlobalScope usage - open fun setupInMainProcessOnly() { + @VisibleForTesting + protected open fun setupInMainProcessOnly() { ProfilerMarkerFactProcessor.create { components.core.engine.profiler }.register() run { @@ -273,11 +272,6 @@ open class FenixApplication : LocaleAwareApplication(), Provider { if (!megazordSetup.isCompleted) { runBlockingIncrement { megazordSetup.await() } } - - GlobalScope.launch(Dispatchers.IO) { - // Give TAS the base Context - Prefs.setContext(applicationContext) - } } setupLeakCanary() ===================================== fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt ===================================== @@ -44,7 +44,6 @@ import org.mozilla.fenix.perf.StartupStateProvider import org.mozilla.fenix.perf.StrictModeManager import org.mozilla.fenix.perf.lazyMonitored import org.mozilla.fenix.tor.TorControllerGV -import org.mozilla.fenix.tor.TorControllerTAS import org.mozilla.fenix.utils.ClipboardHandler import org.mozilla.fenix.utils.Settings import org.mozilla.fenix.wifi.WifiConnectionMonitor ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorBootstrapFragment.kt deleted ===================================== @@ -1,197 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.tor - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.core.view.children -import androidx.fragment.app.Fragment -import androidx.lifecycle.lifecycleScope -import org.mozilla.fenix.BuildConfig -import org.mozilla.fenix.databinding.FragmentHomeBinding -import org.mozilla.fenix.ext.requireComponents -import org.mozilla.fenix.tor.interactor.DefaultTorBootstrapInteractor -import org.mozilla.fenix.tor.interactor.TorBootstrapInteractor -import androidx.navigation.fragment.findNavController -import com.google.android.material.appbar.AppBarLayout -import org.mozilla.fenix.HomeActivity -import org.mozilla.fenix.R -import org.mozilla.fenix.ext.components -import org.mozilla.fenix.ext.hideToolbar -import org.mozilla.fenix.ext.settings -import org.mozilla.fenix.tor.controller.DefaultTorBootstrapController -import org.mozilla.fenix.tor.view.TorBootstrapView - - -@Suppress("TooManyFunctions", "LargeClass") -class TorBootstrapFragment : Fragment() { - - internal var _binding: FragmentHomeBinding? = null - private val binding get() = _binding!! - - - private var torBootstrapView: TorBootstrapView? = null - - private var _torBootstrapInteractor: TorBootstrapInteractor? = null - private val torBootstrapInteractor: TorBootstrapInteractor - get() = _torBootstrapInteractor!! - - private lateinit var torBootstrapStatus: TorBootstrapStatus - - - @Suppress("LongMethod") - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle?, - ): View { - _binding = FragmentHomeBinding.inflate(inflater, container, false) - val components = requireComponents - - torBootstrapStatus = TorBootstrapStatus( - !BuildConfig.DISABLE_TOR, - components.torController, - ::dispatchModeChanges - ) - - if (!torBootstrapStatus.isBootstrapping()) { - openHome() - } - - // Was _sessionControlInteractor - _torBootstrapInteractor = DefaultTorBootstrapInteractor( - controller = DefaultTorBootstrapController( - handleTorBootstrapConnect = ::handleTorBootstrapConnect, - cancelTorBootstrap = ::cancelTorBootstrap, - initiateTorBootstrap = ::initiateTorBootstrap, - openTorNetworkSettings = ::openTorNetworkSettings - ), - ) - - torBootstrapView = TorBootstrapView( - containerView = binding.sessionControlRecyclerView, - viewLifecycleOwner = viewLifecycleOwner, - interactor = torBootstrapInteractor, - ) - - adjustHomeFragmentView() - updateSessionControlView() - showSessionControlView() - - return binding.root - } - - private fun updateSessionControlView() { - torBootstrapView?.update(requireContext().components.appStore.state) - } - - // This function should be paired with showSessionControlView() - private fun adjustHomeFragmentView() { - binding.sessionControlRecyclerView.apply { - visibility = View.INVISIBLE - } - - binding.sessionControlRecyclerView.apply { - setPadding(0, 0, 0, 0) - (layoutParams as ViewGroup.MarginLayoutParams).setMargins(0, 0, 0, 0) - } - - binding.homeAppBar.apply { - visibility = View.GONE - - // Reset this as SCROLL in case it was previously set as NO_SCROLL after bootstrap - children.forEach { - (it.layoutParams as AppBarLayout.LayoutParams).scrollFlags = - AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL - } - } - binding.onionPatternImage.apply { - visibility = View.GONE - } - binding.toolbarLayout.apply { - visibility = View.GONE - } - } - - // This function should be paired with adjustHomeFragmentView() - private fun showSessionControlView() { - binding.sessionControlRecyclerView.apply { - visibility = View.VISIBLE - } - } - - private fun dispatchModeChanges(isBootstrapping: Boolean) { - //requireComponents.appStore.dispatch(AppAction.ModeChange(mode)) - if (!isBootstrapping) { - openHome() - } else { - adjustHomeFragmentView() - updateSessionControlView() - showSessionControlView() - } - } - - override fun onStop() { - super.onStop() - torBootstrapStatus.unregisterTorListener() - } - - override fun onResume() { - super.onResume() - - torBootstrapStatus.registerTorListener() - - // fenix#40176: Ensure the Home fragment is rendered correctly when we resume. - val isBootstraping = torBootstrapStatus.isBootstrapping() - - if (!isBootstraping) { - openHome() - } - - adjustHomeFragmentView() - updateSessionControlView() - showSessionControlView() - - hideToolbar() - - // Whenever a tab is selected its last access timestamp is automatically updated by A-C. - // However, in the case of resuming the app to the home fragment, we already have an - // existing selected tab, but its last access timestamp is outdated. No action is - // triggered to cause an automatic update on warm start (no tab selection occurs). So we - // update it manually here. - requireComponents.useCases.sessionUseCases.updateLastAccess() - (requireActivity() as HomeActivity).navigateToHome() - } - - private fun handleTorBootstrapConnect() { - requireComponents.torController.onTorConnecting() - } - - private fun cancelTorBootstrap() { - requireComponents.torController.stopTor() - } - - private fun initiateTorBootstrap(withDebugLogging: Boolean = false) { - requireComponents.torController.initiateTorBootstrap(lifecycleScope, withDebugLogging) - } - - private fun openTorNetworkSettings() { - val directions = - TorBootstrapFragmentDirections.actionTorbootstrapFragmentToSettingsFragment( - requireContext().getString(R.string.pref_key_connection) - ) - findNavController().navigate(directions) - } - - private fun openHome() { - val directions = - TorBootstrapFragmentDirections - .actionStartupHome() - findNavController().navigate(directions) - } - -} ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorController.kt ===================================== @@ -29,25 +29,6 @@ internal enum class TorStatus(val status: String) { ON("ON"), STOPPING("STOPPING"), UNKNOWN("UNKNOWN"); - - companion object { - fun fromString(status: String): TorStatus { - return when (status) { - "ON" -> ON - "STARTING" -> STARTING - "STOPPING" -> STOPPING - "OFF" -> OFF - else -> UNKNOWN - } - } - } - - fun isOff() = this == OFF - fun isOn() = this == ON - fun isStarting() = this == STARTING - fun isStarted() = ((this == STARTING) || (this == ON)) - fun isStopping() = this == STOPPING - fun isUnknown() = this == UNKNOWN } interface TorController: TorEvents { ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerTAS.kt deleted ===================================== @@ -1,342 +0,0 @@ -package org.mozilla.fenix.tor - -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.content.IntentFilter -import androidx.lifecycle.LifecycleCoroutineScope -import androidx.localbroadcastmanager.content.LocalBroadcastManager -import kotlinx.coroutines.channels.Channel -import kotlinx.coroutines.launch -import kotlinx.coroutines.withTimeoutOrNull -import org.mozilla.fenix.BuildConfig -import org.torproject.android.service.TorService -import org.torproject.android.service.TorServiceConstants -import org.torproject.android.service.util.Prefs - -@SuppressWarnings("TooManyFunctions") -class TorControllerTAS (private val context: Context): TorController { - private val lbm: LocalBroadcastManager = LocalBroadcastManager.getInstance(context) - private val entries = mutableListOf<Pair<String?, String?>>() - override val logEntries get() = entries - override var quickstart: Boolean = false // Stub, is never used - - private var torListeners = mutableListOf<TorEvents>() - - private var pendingRegisterChangeList = mutableListOf<Pair<TorEvents, Boolean>>() - private var lockTorListenersMutation = false - - private var lastKnownStatus = TorStatus.OFF - private var wasTorBootstrapped = false - private var isTorRestarting = false - - // This may be a lie - private var isTorBootstrapped = false - get() = ((lastKnownStatus == TorStatus.ON) && wasTorBootstrapped) - - val isDebugLoggingEnabled get() = - context - .getSharedPreferences("org.torproject.android_preferences", Context.MODE_PRIVATE) - .getBoolean("pref_enable_logging", false) - - override val isStarting get() = lastKnownStatus.isStarting() - override val isRestarting get() = isTorRestarting - override val isBootstrapped get() = isTorBootstrapped - override val isConnected get() = (lastKnownStatus.isStarted() && !isTorRestarting) - - override var bridgesEnabled: Boolean - get() = Prefs.bridgesEnabled() - set(value) { Prefs.putBridgesEnabled(value) } - - override var bridgeTransport: TorBridgeTransportConfig - get() { - return TorBridgeTransportConfigUtil.getStringToBridgeTransport( - Prefs.getBridgesList() - ) - } - set(value) { - if (value == TorBridgeTransportConfig.USER_PROVIDED) { - // Don't set the pref when the value is USER_PROVIDED because - // "user_provided" is not a valid bridge or transport type. - // This call should be followed by setting userProvidedBridges. - return - } - Prefs.setBridgesList(value.transportName) - } - - override var userProvidedBridges: String? - get() { - val bridges = Prefs.getBridgesList() - val bridgeType = - TorBridgeTransportConfigUtil.getStringToBridgeTransport(bridges) - return when (bridgeType) { - TorBridgeTransportConfig.USER_PROVIDED -> bridges - else -> null - } - } - set(value) { - Prefs.setBridgesList(value) - } - - override fun start() { - // Register receiver - lbm.registerReceiver( - persistentBroadcastReceiver, - IntentFilter(TorServiceConstants.ACTION_STATUS) - ) - lbm.registerReceiver( - persistentBroadcastReceiver, - IntentFilter(TorServiceConstants.LOCAL_ACTION_LOG) - ) - } - - override fun stop() { - lbm.unregisterReceiver(persistentBroadcastReceiver) - } - - private val persistentBroadcastReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - if (intent.action == null || - (intent.action != TorServiceConstants.ACTION_STATUS && - intent.action != TorServiceConstants.LOCAL_ACTION_LOG) - ) { - return - } - val action = intent.action - - val logentry: String? - val status: String? - if (action == TorServiceConstants.LOCAL_ACTION_LOG) { - logentry = intent.getExtras() - ?.getCharSequence(TorServiceConstants.LOCAL_EXTRA_LOG) as? String? - } else { - logentry = null - } - - status = intent.getExtras() - ?.getCharSequence(TorServiceConstants.EXTRA_STATUS) as? String? - - if (logentry == null && status == null) { - return - } - - onTorStatusUpdate(logentry, status) - - if (status == null) { - return - } - - val newStatus = TorStatus.fromString(status) - - if (newStatus.isUnknown() && wasTorBootstrapped) { - stopTor() - } - - entries.add(Pair(logentry, status)) - - if (logentry != null && logentry.contains(TorServiceConstants.TOR_CONTROL_PORT_MSG_BOOTSTRAP_DONE)) { - wasTorBootstrapped = true - onTorConnected() - } - - if (lastKnownStatus.isStopping() && newStatus.isOff()) { - if (isTorRestarting) { - initiateTorBootstrap() - } else { - onTorStopped() - } - } - - if (lastKnownStatus.isOff() && newStatus.isStarting()) { - isTorRestarting = false - } - - lastKnownStatus = newStatus - } - } - - override fun onTorConnecting() { - lockTorListenersMutation = true - torListeners.forEach { it.onTorConnecting() } - lockTorListenersMutation = false - - handlePendingRegistrationChanges() - } - - override fun onTorConnected() { - lockTorListenersMutation = true - torListeners.forEach { it.onTorConnected() } - lockTorListenersMutation = false - - handlePendingRegistrationChanges() - } - - override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) { - lockTorListenersMutation = true - torListeners.forEach { it.onTorStatusUpdate(entry, status) } - lockTorListenersMutation = false - - handlePendingRegistrationChanges() - } - - override fun onTorStopped() { - lockTorListenersMutation = true - torListeners.forEach { it.onTorStopped() } - lockTorListenersMutation = false - - handlePendingRegistrationChanges() - } - - override fun registerTorListener(l: TorEvents) { - if (torListeners.contains(l)) { - return - } - - if (lockTorListenersMutation) { - pendingRegisterChangeList.add(Pair(l, true)) - } else { - torListeners.add(l) - } - } - - override fun unregisterTorListener(l: TorEvents) { - if (!torListeners.contains(l)) { - return - } - - if (lockTorListenersMutation) { - pendingRegisterChangeList.add(Pair(l, false)) - } else { - torListeners.remove(l) - } - } - - override fun registerTorLogListener(l: TorLogs) {} - override fun unregisterTorLogListener(l: TorLogs) {} - - private fun handlePendingRegistrationChanges() { - pendingRegisterChangeList.forEach { - if (it.second) { - registerTorListener(it.first) - } else { - unregisterTorListener(it.first) - } - } - - pendingRegisterChangeList.clear() - } - - /** - * Receive the current Tor status. - * - * Send a request for the current status and receive the response. - * Returns true if Tor is running, false otherwise. - * - */ - private suspend fun checkTorIsStarted(): Boolean { - val channel = Channel<Boolean>() - - // Register receiver - val lbm: LocalBroadcastManager = LocalBroadcastManager.getInstance(context) - val localBroadcastReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - val action = intent.action ?: return - // We only want ACTION_STATUS messages - if (action != TorServiceConstants.ACTION_STATUS) { - return - } - // The current status has the EXTRA_STATUS key - val currentStatus = - intent.getStringExtra(TorServiceConstants.EXTRA_STATUS) - channel.trySend(currentStatus === TorServiceConstants.STATUS_ON) - } - } - lbm.registerReceiver( - localBroadcastReceiver, - IntentFilter(TorServiceConstants.ACTION_STATUS) - ) - - // Request service status - sendServiceAction(TorServiceConstants.ACTION_STATUS) - - // Wait for response and unregister receiver - var torIsStarted = false - withTimeoutOrNull(torServiceResponseTimeout) { - torIsStarted = channel.receive() - } - lbm.unregisterReceiver(localBroadcastReceiver) - return torIsStarted - } - - override fun initiateTorBootstrap(lifecycleScope: LifecycleCoroutineScope?, withDebugLogging: Boolean) { - if (BuildConfig.DISABLE_TOR) { - return - } - - context.getSharedPreferences("org.torproject.android_preferences", Context.MODE_PRIVATE) - .edit().putBoolean("pref_enable_logging", withDebugLogging).apply() - - if (lifecycleScope == null) { - sendServiceAction(TorServiceConstants.ACTION_START) - } else { - lifecycleScope.launch { - val torNeedsStart = !checkTorIsStarted() - if (torNeedsStart) { - sendServiceAction(TorServiceConstants.ACTION_START) - } - } - } - } - - override fun stopTor() { - if (BuildConfig.DISABLE_TOR) { - return - } - - val torService = Intent(context, TorService::class.java) - context.stopService(torService) - } - - override fun setTorStopped() { - lastKnownStatus = TorStatus.OFF - onTorStopped() - } - - override fun restartTor() { - // tor-android-service doesn't dynamically update the torrc file, - // and it doesn't use SETCONF, so we completely restart the service. - // However, don't restart if we aren't started and we weren't - // previously started. - if (!lastKnownStatus.isStarted() && !wasTorBootstrapped) { - return - } - - if (!lastKnownStatus.isStarted() && wasTorBootstrapped) { - // If we aren't started, but we were previously bootstrapped, - // then we handle a "restart" request as a "start" restart - initiateTorBootstrap() - } else { - // |isTorRestarting| tracks the state of restart. When we receive an |OFF| state - // from TorService in persistentBroadcastReceiver::onReceive we restart the Tor - // service. - isTorRestarting = true - stopTor() - } - } - - private fun sendServiceAction(action: String) { - val torServiceStatus = Intent(context, TorService::class.java) - torServiceStatus.action = action - context.startService(torServiceStatus) - } - - companion object { - const val torServiceResponseTimeout = 5000L - } - - // Compat with TorControlGV Stubs - - override fun getLastErrorState() : TorError? { - return null; - } -} ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/controller/TorBootstrapController.kt deleted ===================================== @@ -1,63 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.tor.controller - -import org.mozilla.fenix.tor.interactor.TorBootstrapInteractor - -interface TorBootstrapController { - /** - * @see [TorBootstrapInteractor.onTorBootstrapConnectClicked] - */ - fun handleTorBootstrapConnectClicked() - - /** - * @see [TorBootstrapInteractor.onTorStopBootstrapping] - */ - fun handleTorStopBootstrapping() - - /** - * @see [TorBootstrapInteractor.onTorStartBootstrapping] - */ - fun handleTorStartBootstrapping() - - /** - * @see [TorBootstrapInteractor.onTorStartDebugBootstrapping] - */ - fun handleTorStartDebugBootstrapping() - - /** - * @see [TorBootstrapInteractor.onTorBootstrapNetworkSettingsClicked] - */ - fun handleTorNetworkSettingsClicked() - - -} - -class DefaultTorBootstrapController( - private val handleTorBootstrapConnect: () -> Unit, - private val initiateTorBootstrap: (Boolean) -> Unit, - private val cancelTorBootstrap: () -> Unit, - private val openTorNetworkSettings: () -> Unit -) : TorBootstrapController { - override fun handleTorBootstrapConnectClicked() { - handleTorBootstrapConnect() - } - - override fun handleTorStopBootstrapping() { - cancelTorBootstrap() - } - - override fun handleTorStartBootstrapping() { - initiateTorBootstrap(false) - } - - override fun handleTorStartDebugBootstrapping() { - initiateTorBootstrap(true) - } - - override fun handleTorNetworkSettingsClicked() { - openTorNetworkSettings() - } -} ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/interactor/TorBootstrapInteractor.kt deleted ===================================== @@ -1,60 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.tor.interactor - -import org.mozilla.fenix.tor.controller.TorBootstrapController - -interface TorBootstrapInteractor { - /** - * Initiates Tor bootstrapping. Called when a user clicks on the "Connect" button. - */ - fun onTorBootstrapConnectClicked() - - /** - * Initiates Tor bootstrapping. Called when a user clicks on the "Connect" button. - */ - fun onTorStartBootstrapping() - - /** - * Stop Tor bootstrapping. Called when a user clicks on the "settings" cog/button. - */ - fun onTorStopBootstrapping() - - /** - * Initiates Tor bootstrapping with debug logging. Called when bootstrapping fails with - * the control.txt file not existing. - */ - fun onTorStartDebugBootstrapping() - - /** - * Open Tor Network Settings preference screen - */ - fun onTorBootstrapNetworkSettingsClicked() -} - -class DefaultTorBootstrapInteractor( - private val controller: TorBootstrapController, -) : TorBootstrapInteractor { - - override fun onTorBootstrapConnectClicked() { - controller.handleTorBootstrapConnectClicked() - } - - override fun onTorStopBootstrapping() { - controller.handleTorStopBootstrapping() - } - - override fun onTorStartBootstrapping() { - controller.handleTorStartBootstrapping() - } - - override fun onTorStartDebugBootstrapping() { - controller.handleTorStartDebugBootstrapping() - } - - override fun onTorBootstrapNetworkSettingsClicked() { - controller.handleTorNetworkSettingsClicked() - } -} ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapAdapter.kt deleted ===================================== @@ -1,83 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.tor.view - -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.annotation.LayoutRes -import androidx.lifecycle.LifecycleOwner -import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.ListAdapter -import androidx.recyclerview.widget.RecyclerView -import org.mozilla.fenix.components.Components -import org.mozilla.fenix.home.topsites.TopSitePagerViewHolder -import org.mozilla.fenix.tor.interactor.TorBootstrapInteractor - -sealed class AdapterItem(@LayoutRes val viewType: Int) { - object TorBootstrap : AdapterItem(TorBootstrapPagerViewHolder.LAYOUT_ID) - - - open fun sameAs(other: AdapterItem) = this::class == other::class - open fun getChangePayload(newItem: AdapterItem): Any? = null - open fun contentsSameAs(other: AdapterItem) = this::class == other::class - -} - -class AdapterItemDiffCallback : DiffUtil.ItemCallback<AdapterItem>() { - override fun areItemsTheSame(oldItem: AdapterItem, newItem: AdapterItem) = - oldItem.sameAs(newItem) - - @Suppress("DiffUtilEquals") - override fun areContentsTheSame(oldItem: AdapterItem, newItem: AdapterItem) = - oldItem.contentsSameAs(newItem) - - override fun getChangePayload(oldItem: AdapterItem, newItem: AdapterItem): Any? { - return oldItem.getChangePayload(newItem) ?: return super.getChangePayload(oldItem, newItem) - } -} - - - -class TorBootstrapAdapter( - private val interactor: TorBootstrapInteractor, - private val viewLifecycleOwner: LifecycleOwner, - private val components: Components, -) : ListAdapter<AdapterItem, RecyclerView.ViewHolder>(AdapterItemDiffCallback()) { - - // This method triggers the ComplexMethod lint error when in fact it's quite simple. - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - val view = LayoutInflater.from(parent.context).inflate(viewType, parent, false) - return when (viewType) { - TorBootstrapPagerViewHolder.LAYOUT_ID -> TorBootstrapPagerViewHolder( - view, - components, - interactor - ) - else -> throw IllegalStateException() - } - } - - override fun getItemViewType(position: Int) = getItem(position).viewType - - override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int, payloads: MutableList<Any>) { - if (payloads.isEmpty()) { - onBindViewHolder(holder, position) - } else { - when (holder) { - is TopSitePagerViewHolder -> { - if (payloads[0] is org.mozilla.fenix.home.sessioncontrol.AdapterItem.TopSitePagerPayload) { - val payload = payloads[0] as org.mozilla.fenix.home.sessioncontrol.AdapterItem.TopSitePagerPayload - holder.update(payload) - } - } - } - } - } - - override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - // no-op. This ViewHolder receives the HomeStore as argument and will observe that - // without the need for us to manually update from here the data to be displayed. - } -} ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapConnectViewHolder.kt deleted ===================================== @@ -1,89 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.tor.view - -import android.view.View -import androidx.recyclerview.widget.RecyclerView -import org.mozilla.fenix.R -import org.mozilla.fenix.components.Components -import org.mozilla.fenix.databinding.TorBootstrapConnectBinding -import org.mozilla.fenix.tor.TorEvents -import org.mozilla.fenix.tor.interactor.TorBootstrapInteractor - -class TorBootstrapConnectViewHolder( - private val view: View, - private val components: Components, - private val interactor: TorBootstrapInteractor -) : RecyclerView.ViewHolder(view), TorEvents { - - var binding: TorBootstrapConnectBinding - - init { - binding = TorBootstrapConnectBinding.bind(view) - - with(binding.torBootstrapNetworkSettingsButton) { - setOnClickListener { - interactor.onTorStopBootstrapping() - interactor.onTorBootstrapNetworkSettingsClicked() - - with(binding.torBootstrapProgress) { - visibility = View.INVISIBLE - } - - with(binding.torBootstrapConnectButton) { - visibility = View.VISIBLE - } - } - } - - with(binding.torBootstrapConnectButton) { - setOnClickListener { - interactor.onTorBootstrapConnectClicked() - interactor.onTorStartBootstrapping() - - visibility = View.INVISIBLE - - with(binding.torBootstrapProgress) { - visibility = View.VISIBLE - } - } - } - - components.torController.registerTorListener(this) - } - - @SuppressWarnings("EmptyFunctionBlock") - override fun onTorConnecting() { - } - - override fun onTorConnected() { - components.torController.unregisterTorListener(this) - } - - @SuppressWarnings("EmptyFunctionBlock") - override fun onTorStopped() { - } - - override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) { - if (entry == null) return - - binding.torBootstrapStatusMessage.text = entry - if (entry.startsWith(BOOTSTRAPPED_PREFIX)) { - val percentIdx = entry.indexOf("%") - val percent = entry.substring( - BOOTSTRAPPED_PREFIX.length, - percentIdx - ) - with(binding.torBootstrapProgress) { - this.progress = percent.toInt() - } - } - } - - companion object { - const val LAYOUT_ID = R.layout.tor_bootstrap_connect - const val BOOTSTRAPPED_PREFIX = "NOTICE: Bootstrapped " - } -} ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapLoggerViewHolder.kt deleted ===================================== @@ -1,76 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.tor.view - -import android.text.method.ScrollingMovementMethod -import android.view.View -import androidx.recyclerview.widget.RecyclerView -import org.mozilla.fenix.R -import org.mozilla.fenix.components.Components -import org.mozilla.fenix.databinding.TorBootstrapLoggerBinding -import org.mozilla.fenix.tor.TorEvents - -class TorBootstrapLoggerViewHolder( - private val view: View, - private val components: Components - ) : RecyclerView.ViewHolder(view), TorEvents { - - private var entries = mutableListOf<String>() - private var binding: TorBootstrapLoggerBinding - - init { - binding = TorBootstrapLoggerBinding.bind(view) - components.torController.registerTorListener(this) - - val currentEntries = components.torController.logEntries - .filter { it.first != null } - .filter { !(it.first!!.startsWith("Circuit") && it.second == "ON") } - // Keep synchronized with format in onTorStatusUpdate - .flatMap { listOf("(${it.second}) '${it.first}'") } - val entriesLen = currentEntries.size - val subListOffset = if (entriesLen > MAX_NEW_ENTRIES) MAX_NEW_ENTRIES else entriesLen - entries = currentEntries.subList((entriesLen - subListOffset), entriesLen) as MutableList<String> - val initLog = "---------------" + view.resources.getString(R.string.tor_initializing_log) + "---------------" - entries.add(0, initLog) - - with(binding.torBootstrapLogEntries) { - movementMethod = ScrollingMovementMethod() - text = formatLogEntries(entries) - } - } - - private fun formatLogEntries(entries: List<String>) = entries.joinToString("\n") - - @SuppressWarnings("EmptyFunctionBlock") - override fun onTorConnecting() { - } - - override fun onTorConnected() { - components.torController.unregisterTorListener(this) - } - - @SuppressWarnings("EmptyFunctionBlock") - override fun onTorStopped() { - } - - override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) { - if (status == null || entry == null) return - if (status == "ON" && entry.startsWith("Circuit")) return - - if (entries.size > MAX_LINES) { - entries = entries.drop(1) as MutableList<String> - } - entries.add("($status) '$entry'") - - binding.torBootstrapLogEntries.text = formatLogEntries(entries) - } - - companion object { - const val LAYOUT_ID = R.layout.tor_bootstrap_logger - const val MAX_NEW_ENTRIES = 24 - const val MAX_LINES = 25 - } - -} ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapPagerAdapter.kt deleted ===================================== @@ -1,43 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.tor.view - -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView -import org.mozilla.fenix.components.Components -import org.mozilla.fenix.tor.interactor.TorBootstrapInteractor - -class TorBootstrapPagerAdapter( - private val components: Components, - private val interactor: TorBootstrapInteractor -) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - if (viewType == BOOTSTRAP_UI_PAGE_TYPE) { - val viewDVH = LayoutInflater.from(parent.context) - .inflate(TorBootstrapConnectViewHolder.LAYOUT_ID, parent, false) - return TorBootstrapConnectViewHolder(viewDVH, components, interactor) - } else { - val viewLVH = LayoutInflater.from(parent.context) - .inflate(TorBootstrapLoggerViewHolder.LAYOUT_ID, parent, false) - return TorBootstrapLoggerViewHolder(viewLVH, components) - } - } - - @SuppressWarnings("EmptyFunctionBlock") - override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - } - - override fun getItemViewType(position: Int): Int = position - - override fun getItemCount(): Int = BOOTSTRAP_PAGE_COUNT - - companion object { - const val BOOTSTRAP_UI_PAGE_TYPE = 0 - const val BOOTSTRAP_LOG_PAGE_TYPE = 1 - const val BOOTSTRAP_PAGE_COUNT = 2 - } -} ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapPagerViewHolder.kt deleted ===================================== @@ -1,32 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.tor.view - -import android.view.View -import androidx.recyclerview.widget.RecyclerView -import org.mozilla.fenix.R -import org.mozilla.fenix.components.Components -import org.mozilla.fenix.databinding.TorBootstrapPagerBinding -import org.mozilla.fenix.tor.interactor.TorBootstrapInteractor - -class TorBootstrapPagerViewHolder( - view: View, - components: Components, - interactor: TorBootstrapInteractor - ) : RecyclerView.ViewHolder(view) { - - private val bootstrapPagerAdapter = TorBootstrapPagerAdapter(components, interactor) - - init { - val binding = TorBootstrapPagerBinding.bind(view) - binding.bootstrapPager.apply { - adapter = bootstrapPagerAdapter - } - } - - companion object { - const val LAYOUT_ID = R.layout.tor_bootstrap_pager - } -} ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapView.kt deleted ===================================== @@ -1,49 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.tor.view - -import androidx.lifecycle.LifecycleOwner -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import org.mozilla.fenix.components.appstate.AppState -import org.mozilla.fenix.ext.components -import org.mozilla.fenix.tor.interactor.TorBootstrapInteractor - - -class TorBootstrapView( - containerView: RecyclerView, - viewLifecycleOwner: LifecycleOwner, - interactor: TorBootstrapInteractor, -) { - - val view: RecyclerView = containerView //as RecyclerView - - private fun bootstrapAdapterItems() = listOf(AdapterItem.TorBootstrap) - - private val torBootstrapAdapter = TorBootstrapAdapter( - interactor, - viewLifecycleOwner, - containerView.context.components, - ) - - //private val torBootstrapAdapter = - // TorBootstrapAdapter(interactor, containerView.context.components) - //private val torBootstrapAdapter = TorBootstrapPagerAdapter(containerView.context.components, interactor) - - init { - containerView.apply { - adapter = torBootstrapAdapter - layoutManager = LinearLayoutManager(containerView.context) - } - } - - private fun AppState.toAdapterList(): List<AdapterItem> { - return bootstrapAdapterItems() - } - - fun update(state: AppState) { - torBootstrapAdapter.submitList(state.toAdapterList()) - } -} ===================================== fenix/app/src/main/res/drawable/ic_tor_connect_computer_graphic.xml deleted ===================================== @@ -1,506 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:aapt="http://schemas.android.com/aapt" - android:width="302dp" - android:height="263dp" - android:viewportWidth="302" - android:viewportHeight="263"> - <path - android:pathData="M279.49,222.64l-94.22,-0l-0,-79.61l94.22,-0z" - android:strokeWidth="1" - android:fillType="nonZero" - android:strokeColor="#00000000"> - <aapt:attr name="android:fillColor"> - <gradient - android:startY="203.70642" - android:startX="231.9" - android:endY="160.04314" - android:endX="232.90999" - android:type="linear"> - <item android:offset="0.08" android:color="#FF7E4696"/> - <item android:offset="0.39" android:color="#9B7E4696"/> - <item android:offset="0.85" android:color="#007E4696"/> - </gradient> - </aapt:attr> - </path> - <path - android:pathData="M112.74,217.05l-102.32,-0l-0,-102.32l102.32,-0z" - android:strokeWidth="1" - android:fillType="nonZero" - android:strokeColor="#00000000"> - <aapt:attr name="android:fillColor"> - <gradient - android:startY="203.36" - android:startX="60.96" - android:endY="124.990005" - android:endX="62.249996" - android:type="linear"> - <item android:offset="0.08" android:color="#FF00D9B5"/> - <item android:offset="0.3" android:color="#BA00D9B5"/> - <item android:offset="0.8" android:color="#1100D9B5"/> - <item android:offset="0.85" android:color="#0000D9B5"/> - </gradient> - </aapt:attr> - </path> - <path - android:pathData="M58,1L183.49,1C186.526,1.016 188.984,3.474 189,6.51L189,100.25L52.47,100.25L52.47,6.51C52.486,3.466 54.956,1.005 58,1Z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#F0D4FD" - android:strokeColor="#65318E" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M60.55,8.87h120.41v108.53h-120.41z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#FFFFFF" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M60.55,8.87h120.41v108.53h-120.41z" - android:strokeWidth="1" - android:fillType="nonZero" - android:strokeColor="#00000000"> - <aapt:attr name="android:fillColor"> - <gradient - android:startY="-56.010002" - android:startX="120.75" - android:endY="120.520004" - android:endX="120.75" - android:type="linear"> - <item android:offset="0.08" android:color="#FF00D9B5"/> - <item android:offset="0.12" android:color="#F700D9B5"/> - <item android:offset="0.19" android:color="#E200D9B5"/> - <item android:offset="0.26" android:color="#BF00D9B5"/> - <item android:offset="0.35" android:color="#8E00D9B5"/> - <item android:offset="0.44" android:color="#5100D9B5"/> - <item android:offset="0.54" android:color="#0700D9B5"/> - <item android:offset="0.54" android:color="#0000D9B5"/> - </gradient> - </aapt:attr> - </path> - <path - android:pathData="M77.5,120.83h134.33v10.38h-134.33z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#F0D4FD" - android:strokeColor="#65318E" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M52.47,100.25l0,10.29l25.03,20.67l0,-10.38z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#65318E" - android:strokeColor="#F0D4FD" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M60.33,33.17h43.89v37.87h-43.89z" - android:strokeWidth="1.76" - android:fillColor="#FFFFFF" - android:strokeColor="#65318E" - android:fillType="nonZero"/> - <path - android:pathData="M178.05,170.61L61.43,170.61L61.43,87C61.43,85.895 62.325,85 63.43,85L176,85C177.105,85 178,85.895 178,87L178.05,170.61Z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#00D9B5" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M66.88,89.57h105.71v76.37h-105.71z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#F0D4FD" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M177.06,170.61l-115.63,0l21.37,17.75l115.64,0z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#65318E" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M82.8,188.36h115.11v8.96h-115.11z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#00D9B5" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M61.43,170.61l0,7.04l21.37,19.67l0,-8.96z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#FFFFFF" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M190.59,183L74,183L74,99.29C74.027,98.177 74.937,97.29 76.05,97.29L188.54,97.29C189.653,97.29 190.563,98.177 190.59,99.29L190.59,183Z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#00D9B5" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M79.42,101.91h105.71v76.37h-105.71z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#F0D4FD" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M189.73,182.95l-115.77,0l21.37,17.75l115.77,0z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#65318E" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M95.33,200.7h115.38v8.96h-115.38z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#00D9B5" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M73.96,182.95l0,6.78l21.37,19.93l0,-8.96z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#FFFFFF" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M203.12,195.29L86.5,195.29L86.5,111.63C86.5,110.525 87.395,109.63 88.5,109.63L201.08,109.63C202.185,109.63 203.08,110.525 203.08,111.63L203.12,195.29Z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#00D9B5" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M91.95,114.25h105.71v76.37h-105.71z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#F0D4FD" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M202.4,195.29l-115.9,0l21.37,17.75l115.9,0z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#65318E" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M107.87,213.04h115.64v8.96h-115.64z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#00D9B5" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M86.5,195.29l0,6.51l21.37,20.2l0,-8.96z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#FFFFFF" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M215.66,207.63L99,207.63L99,124C99,122.895 99.895,122 101,122L213.61,122C214.715,122 215.61,122.895 215.61,124L215.66,207.63Z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#00D9B5" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M104.49,126.59h105.71v76.37h-105.71z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#F0D4FD" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M215.06,207.63l-116.03,0l21.37,17.75l116.03,0z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#65318E" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M120.4,225.38h115.9v8.96h-115.9z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#00D9B5" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M99.03,207.63l0,6.25l21.37,20.46l0,-8.96z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#FFFFFF" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M228.19,220L111.57,220L111.57,136.31C111.57,135.205 112.465,134.31 113.57,134.31L226.15,134.31C227.255,134.31 228.15,135.205 228.15,136.31L228.19,220Z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#00D9B5" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M117.02,138.93h105.71v76.37h-105.71z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#F0D4FD" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M227.73,219.97l-116.16,0l21.37,17.75l116.16,0z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#65318E" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M132.94,237.72h116.16v8.96h-116.16z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#00D9B5" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M111.57,219.97l0,5.99l21.37,19.72l0,-7.96z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#FFFFFF" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M245.52,234.67L128.9,234.67L128.9,151C128.9,149.895 129.795,149 130.9,149L243.48,149C244.585,149 245.48,149.895 245.48,151L245.52,234.67Z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#00D9B5" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M134.36,153.64h105.71v76.37h-105.71z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#F0D4FD" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M245.06,234.67l-116.16,0l21.37,17.76l116.16,0z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#65318E" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M150.27,252.43h116.16v8.96h-116.16z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#00D9B5" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M60.33,33.89h41.01v38.59h-41.01z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#65318E" - android:strokeColor="#65318E" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M67.24,33.89h34.1v30.04h-34.1z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#65318E" - android:strokeColor="#65318E" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M150.62,58.81L150.62,151L279.49,151L279.49,58.81C279.49,55.01 276.41,51.93 272.61,51.93L157.5,51.93C153.7,51.93 150.62,55.01 150.62,58.81ZM273.46,142.2L156.65,142.2L156.65,61.41L273.46,61.41L273.46,142.2Z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#00D9B5" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M277.38,150.95l-126.76,0l23.62,19.62l126.76,0z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#F0D4FD" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M174.24,170.57h126.76v9.9h-126.76z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#00D9B5" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M150.62,150.95l0,9.81l23.62,19.71l0,-9.9z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#490260" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M157.37,61.41h116.09v80.79h-116.09z" - android:strokeWidth="1.76" - android:fillColor="#FFFFFF" - android:strokeColor="#65318E" - android:fillType="nonZero"/> - <path - android:pathData="M157.37,61.41h116.09v80.79h-116.09z" - android:strokeWidth="1" - android:fillType="nonZero" - android:strokeColor="#00000000"> - <aapt:attr name="android:fillColor"> - <gradient - android:startY="18.45" - android:startX="215.42" - android:endY="112.96" - android:endX="215.42" - android:type="linear"> - <item android:offset="0.08" android:color="#FFF0D4FD"/> - <item android:offset="0.27" android:color="#C4F0D4FD"/> - <item android:offset="0.7" android:color="#33F0D4FD"/> - <item android:offset="0.85" android:color="#00F0D4FD"/> - </gradient> - </aapt:attr> - </path> - <path - android:pathData="M157.37,61.41h1.72v80.79h-1.72z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#490260" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M5.78,27.13L119,27.13C121.64,27.13 123.78,29.27 123.78,31.91L123.78,119.64L1,119.64L1,31.9C1.006,29.264 3.144,27.13 5.78,27.13Z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#00D9B5" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M9.05,34.34h106.66v76.63h-106.66z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#FFFFFF" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M121.75,119.63l-120.75,0l22.5,18.69l120.74,0z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#F0D4FD" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M23.5,138.32h120.75v9.43h-120.75z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#00D9B5" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M1,119.63l0,9.34l22.5,18.78l0,-9.43z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#490260" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M9.82,35.75h104.98v74.01h-104.98z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#FFFFFF" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M9.82,35.75h104.98v74.01h-104.98z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#FFFFFF" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M58.1,35.75L115.36,35.75L115.36,102.15L65.3,102.15C61.341,102.156 58.122,98.959 58.1,95L58.1,35.75Z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#F0D4FD" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M69.28,35.43h46.09v53.39h-46.09z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#F0D4FD" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M9.05,110.21L9.05,34.34L12.25,34.34L12.25,107C12.253,107.85 11.917,108.667 11.316,109.269C10.716,109.871 9.9,110.21 9.05,110.21Z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#490260" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> - <path - android:pathData="M132.94,246.68l17.33,14.71l0,-8.96l-17.33,-14.71z" - android:strokeLineJoin="round" - android:strokeWidth="1.76" - android:fillColor="#FFFFFF" - android:strokeColor="#490260" - android:fillType="nonZero" - android:strokeLineCap="round"/> -</vector> ===================================== fenix/app/src/main/res/layout/tor_bootstrap_connect.xml deleted ===================================== @@ -1,100 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_gravity="bottom" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" > - - <ImageView - android:id="@+id/tor_bootstrap_network_settings_button" - app:srcCompat="@drawable/mozac_ic_settings" - android:scaleType="fitCenter" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:layout_marginTop="20dp" - android:layout_alignParentTop="true" - android:layout_alignParentEnd="true" - tools:ignore="ContentDescription" /> - - <ImageView - android:id="@+id/tor_bootstrap_image" - app:srcCompat="@drawable/ic_tor_connect_computer_graphic" - android:scaleType="fitCenter" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:layout_marginTop="80dp" - android:layout_marginBottom="10dp" - android:layout_centerHorizontal="true" - android:layout_below="@id/tor_bootstrap_network_settings_button" - android:layout_above="@id/tor_bootstrap_connect_button" - android:gravity="center" - tools:ignore="ContentDescription" /> - - <androidx.appcompat.widget.SwitchCompat - android:id="@+id/quick_start_toggle" - android:visibility="gone" - android:checked="false" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_above="@id/tor_bootstrap_connect_button" /> - - <Button - android:id="@+id/tor_bootstrap_connect_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:width="160dp" - android:height="36dp" - android:layout_marginBottom="10dp" - android:layout_centerHorizontal="true" - android:layout_above="@id/tor_bootstrap_status_message" - android:gravity="center|center_vertical" - android:text="@string/tor_bootstrap_connect" - android:fontFamily="Roboto-Medium" - android:textColor="#FF000000" - android:textSize="18sp" - android:lineSpacingMultiplier="0.89" - android:background="@drawable/rounded_corners" /> - - <TextView - android:id="@+id/tor_bootstrap_status_message" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginBottom="32dp" - android:layout_centerHorizontal="true" - android:paddingStart="8dp" - android:paddingEnd="8dp" - android:gravity="center" - android:lines="3" - android:layout_above="@id/tor_bootstrap_swipe_log" /> - - <TextView - android:id="@+id/tor_bootstrap_swipe_log" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:width="360dp" - android:height="24dp" - android:layout_marginBottom="15dp" - android:layout_centerHorizontal="true" - android:layout_alignParentBottom="true" - android:gravity="center" - android:textSize="14sp" - android:textColor="#FFFFFFFF" - android:fontFamily="Roboto-Regular" - android:lineSpacingMultiplier="1.71" - android:text="@string/tor_bootstrap_swipe_for_logs" - android:layout_above="@id/tor_bootstrap_progress" /> - - <ProgressBar - android:id="@+id/tor_bootstrap_progress" - style="?android:attr/progressBarStyleHorizontal" - android:layout_width="match_parent" - android:layout_height="3dp" - android:visibility="invisible" - android:layout_alignParentBottom="true" /> -</RelativeLayout> ===================================== fenix/app/src/main/res/layout/tor_bootstrap_logger.xml deleted ===================================== @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> -<FrameLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent"> - <TextView - android:id="@+id/tor_bootstrap_log_entries" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:gravity="bottom" - android:textColor="@android:color/white" - android:fontFamily="RobotoMono-Regular" - android:textSize="12sp" - android:textIsSelectable="true" - android:layout_marginLeft="20dp" - android:layout_marginRight="20dp" - android:layout_marginBottom="20dp" /> -</FrameLayout> ===================================== fenix/app/src/main/res/layout/tor_bootstrap_pager.xml deleted ===================================== @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - -<com.google.android.material.appbar.AppBarLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:background="?torBootstrapBackground"> - - <androidx.viewpager2.widget.ViewPager2 - android:id="@+id/bootstrap_pager" - android:layout_width="match_parent" - android:layout_height="match_parent" /> -</com.google.android.material.appbar.AppBarLayout> View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/cf7… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/cf7… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-115.11.0esr-13.5-1] 2 commits: Revert "Bug 41881: Don't persist custom network requests on private windows"
by richard (@richard) 13 May '24

13 May '24
richard pushed to branch mullvad-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser Commits: bea39ca4 by Pier Angelo Vendrame at 2024-05-13T20:40:44+00:00 Revert &quot;Bug 41881: Don&#39;t persist custom network requests on private windows&quot; This reverts commit 6450a4e62e810832f35ee8732a4630ec2c2ba6f6. - - - - - 400cba03 by cypherpunks1 at 2024-05-13T20:40:45+00:00 Bug 1892052 - Do not persist custom network requests on PBM. r=devtools-reviewers,bomsy,nchevobbe Differential Revision: https://phabricator.services.mozilla.com/D207762 - - - - - 3 changed files: - devtools/client/netmonitor/src/components/new-request/HTTPCustomRequestPanel.js - devtools/client/netmonitor/test/browser_net_new_request_panel_persisted_content.js - devtools/client/netmonitor/test/head.js Changes: ===================================== devtools/client/netmonitor/src/components/new-request/HTTPCustomRequestPanel.js ===================================== @@ -4,11 +4,6 @@ "use strict"; -const lazy = {}; -ChromeUtils.defineESModuleGetters(lazy, { - PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs", -}); - const { Component, createFactory, @@ -127,7 +122,7 @@ class HTTPCustomRequestPanel extends Component { async componentDidMount() { let { connector, request } = this.props; - if (!lazy.PrivateBrowsingUtils.isWindowPrivate(window)) { + if (!connector.currentTarget?.targetForm?.isPrivate) { const persistedCustomRequest = await asyncStorage.getItem( "devtools.netmonitor.customRequest" ); @@ -198,7 +193,7 @@ class HTTPCustomRequestPanel extends Component { } componentWillUnmount() { - if (!lazy.PrivateBrowsingUtils.isWindowPrivate(window)) { + if (!this.props.connector.currentTarget?.targetForm?.isPrivate) { asyncStorage.setItem("devtools.netmonitor.customRequest", this.state); } } ===================================== devtools/client/netmonitor/test/browser_net_new_request_panel_persisted_content.js ===================================== @@ -9,30 +9,14 @@ const asyncStorage = require("resource://devtools/shared/async-storage.js"); * Test if content is still persisted after the panel is closed */ -add_task(async function () { - // Turn true the pref - await pushPref("devtools.netmonitor.features.newEditAndResend", true); - // Reset the storage for the persisted custom request - await asyncStorage.removeItem("devtools.netmonitor.customRequest"); - - const { monitor } = await initNetMonitor(HTTPS_CUSTOM_GET_URL, { - requestCount: 1, - }); - info("Starting test... "); - - const { document, store, windowRequire } = monitor.panelWin; - - // Action should be processed synchronously in tests. - const Actions = windowRequire("devtools/client/netmonitor/src/actions/index"); - store.dispatch(Actions.batchEnable(false)); - - info("open the left panel"); - let waitForPanels = waitForDOM( +async function addCustomRequestTestContent(tab, monitor, document) { + info("Open the left panel"); + const waitForPanels = waitForDOM( document, ".monitor-panel .network-action-bar" ); - let HTTPCustomRequestButton = document.querySelector( + const HTTPCustomRequestButton = document.querySelector( "#netmonitor-toolbar-container .devtools-http-custom-request-icon" ); HTTPCustomRequestButton.click(); @@ -59,91 +43,166 @@ add_task(async function () { "#http-custom-query .map-add-new-inputs .http-custom-input-name" ); newParameterName.focus(); - EventUtils.sendString("My-param"); + EventUtils.sendString("My-param", monitor.panelWin); info("Adding new headers"); const newHeaderName = document.querySelector( "#http-custom-headers .map-add-new-inputs .http-custom-input-name" ); newHeaderName.focus(); - EventUtils.sendString("My-header"); + EventUtils.sendString("My-header", monitor.panelWin); const newHeaderValue = Array.from( document.querySelectorAll( "#http-custom-headers .http-custom-input .http-custom-input-value" ) - ).pop(); + ).at(-1); newHeaderValue.focus(); - EventUtils.sendString("my-value"); + EventUtils.sendString("my-value", monitor.panelWin); const postValue = document.querySelector("#http-custom-postdata-value"); postValue.focus(); - EventUtils.sendString("{'Name': 'Value'}"); + EventUtils.sendString("{'Name': 'Value'}", monitor.panelWin); - // Close the panel + info("Close the panel"); const closePanel = document.querySelector( ".network-action-bar .tabs-navigation .sidebar-toggle" ); closePanel.click(); +} - // Open the panel again to see if the content is still there - waitForPanels = waitUntil( +async function runTests(tab, monitor, document, isPrivate = false) { + info("Open the panel again to see if the content is still there"); + const waitForPanels = waitFor( () => document.querySelector(".http-custom-request-panel") && document.querySelector("#http-custom-request-send-button").disabled === - false + isPrivate ); - HTTPCustomRequestButton = document.querySelector( + const HTTPCustomRequestButton = document.querySelector( "#netmonitor-toolbar-container .devtools-http-custom-request-icon" ); HTTPCustomRequestButton.click(); await waitForPanels; - is( - methodValue.value, - "POST", - "The content should still be there after the user close the panel and re-opened" - ); - - is( - url.value, - "https://www.example.com?My-param=", - "The url should still be there after the user close the panel and re-opened" - ); + // Wait a few seconds to make sure all the fields have been updated + await wait(1500); + + const customMethod = document.querySelector("#http-custom-method-value"); + const customUrl = document.querySelector(".http-custom-url-value"); + const customQuery = document.querySelectorAll( + "#http-custom-query .tabpanel-summary-container.http-custom-input textarea" + ); + const customHeaders = document.querySelectorAll( + "#http-custom-headers .tabpanel-summary-container.http-custom-input textarea" + ); + const postDataValue = document.querySelector("#http-custom-postdata-value"); + + if (isPrivate) { + is( + customMethod.value, + "GET", + "The method should not be persisted after the user close the panel and re-opened in PBM" + ); + + is( + customUrl.value, + "", + "The url should not be there after the user close the panel and re-opened in PBM" + ); + + is( + customQuery.length, + 0, + "The Parameter should not be there after the user close the panel and re-opened in PBM" + ); + + is( + customHeaders.length, + 0, + "There should be no custom headers after the user close the panel and re-opened in PBM" + ); + + is( + postDataValue.value, + "", + "The post data should still be reset after the user close the panel and re-opened in PBM" + ); + } else { + is( + customMethod.value, + "POST", + "The method should be persisted after the user close the panel and re-opened" + ); + + is( + customUrl.value, + "https://www.example.com?My-param=", + "The url should still be there after the user close the panel and re-opened" + ); + + const [nameParam] = Array.from(customQuery); + is( + nameParam.value, + "My-param", + "The Parameter name should still be there after the user close the panel and re-opened" + ); + + const [name, value] = Array.from(customHeaders); + is( + name.value, + "My-header", + "The header name should still be there after the user close the panel and re-opened" + ); + is( + value.value, + "my-value", + "The header value should still be there after the user close the panel and re-opened" + ); + + is( + postDataValue.value, + "{'Name': 'Value'}", + "The content should still be there after the user close the panel and re-opened" + ); + } +} + +add_task(async function testRequestPanelPersistedContent() { + // Turn true the pref + await pushPref("devtools.netmonitor.features.newEditAndResend", true); + // Reset the storage for the persisted custom request + await asyncStorage.removeItem("devtools.netmonitor.customRequest"); - const [nameParam] = Array.from( - document.querySelectorAll( - "#http-custom-query .tabpanel-summary-container.http-custom-input textarea" - ) - ); - is( - nameParam.value, - "My-param", - "The Parameter name should still be there after the user close the panel and re-opened" - ); + const { tab, monitor } = await initNetMonitor(HTTPS_CUSTOM_GET_URL, { + requestCount: 1, + }); + const { document, store, windowRequire } = monitor.panelWin; + const Actions = windowRequire("devtools/client/netmonitor/src/actions/index"); + store.dispatch(Actions.batchEnable(false)); - const [name, value] = Array.from( - document.querySelectorAll( - "#http-custom-headers .tabpanel-summary-container.http-custom-input textarea" - ) - ); - is( - name.value, - "My-header", - "The header name should still be there after the user close the panel and re-opened" - ); - is( - value.value, - "my-value", - "The header value should still be there after the user close the panel and re-opened" - ); + info("Starting test... "); + info("Add initial custom request test content"); + await addCustomRequestTestContent(tab, monitor, document); + await runTests(tab, monitor, document); + await teardown(monitor); +}); - is( - postValue.value, - "{'Name': 'Value'}", - "The content should still be there after the user close the panel and re-opened" +add_task(async function testRequestPanelPersistedContentInPrivateWindow() { + await pushPref("devtools.netmonitor.features.newEditAndResend", true); + const { tab, monitor, privateWindow } = await initNetMonitor( + HTTPS_CUSTOM_GET_URL, + { + requestCount: 1, + openInPrivateWindow: true, + } ); + const { document, store, windowRequire } = monitor.panelWin; + const Actions = windowRequire("devtools/client/netmonitor/src/actions/index"); + store.dispatch(Actions.batchEnable(false)); - await teardown(monitor); + info("Starting test in private window... "); + await runTests(tab, monitor, document, true); + await teardown(monitor, privateWindow); }); ===================================== devtools/client/netmonitor/test/head.js ===================================== @@ -321,6 +321,7 @@ function initNetMonitor( expectedEventTimings, waitForLoad = true, enableCache = false, + openInPrivateWindow = false, } ) { info("Initializing a network monitor pane."); @@ -341,7 +342,22 @@ function initNetMonitor( ], }); - const tab = await addTab(url, { waitForLoad }); + let tab = null; + let privateWindow = null; + + if (openInPrivateWindow) { + privateWindow = await BrowserTestUtils.openNewBrowserWindow({ + private: true, + }); + ok( + PrivateBrowsingUtils.isContentWindowPrivate(privateWindow), + "window is private" + ); + tab = BrowserTestUtils.addTab(privateWindow.gBrowser, url); + } else { + tab = await addTab(url, { waitForLoad }); + } + info("Net tab added successfully: " + url); const toolbox = await gDevTools.showToolboxForTab(tab, { @@ -371,7 +387,7 @@ function initNetMonitor( await clearNetworkEvents(monitor); } - return { tab, monitor, toolbox }; + return { tab, monitor, toolbox, privateWindow }; })(); } @@ -408,7 +424,7 @@ async function clearNetworkEvents(monitor) { store.dispatch(Actions.clearRequests()); } -function teardown(monitor) { +function teardown(monitor, privateWindow) { info("Destroying the specified network monitor."); return (async function () { @@ -419,6 +435,12 @@ function teardown(monitor) { await monitor.toolbox.destroy(); await removeTab(tab); + + if (privateWindow) { + const closed = BrowserTestUtils.windowClosed(privateWindow); + privateWindow.BrowserCommands.tryToCloseWindow(); + await closed; + } })(); } View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/be… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/be… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][base-browser-115.11.0esr-13.5-1] 2 commits: Revert "Bug 41881: Don't persist custom network requests on private windows"
by richard (@richard) 13 May '24

13 May '24
richard pushed to branch base-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 1e2cec74 by Pier Angelo Vendrame at 2024-05-13T20:39:35+00:00 Revert &quot;Bug 41881: Don&#39;t persist custom network requests on private windows&quot; This reverts commit 6450a4e62e810832f35ee8732a4630ec2c2ba6f6. - - - - - fa7dafa6 by cypherpunks1 at 2024-05-13T20:39:43+00:00 Bug 1892052 - Do not persist custom network requests on PBM. r=devtools-reviewers,bomsy,nchevobbe Differential Revision: https://phabricator.services.mozilla.com/D207762 - - - - - 3 changed files: - devtools/client/netmonitor/src/components/new-request/HTTPCustomRequestPanel.js - devtools/client/netmonitor/test/browser_net_new_request_panel_persisted_content.js - devtools/client/netmonitor/test/head.js Changes: ===================================== devtools/client/netmonitor/src/components/new-request/HTTPCustomRequestPanel.js ===================================== @@ -4,11 +4,6 @@ "use strict"; -const lazy = {}; -ChromeUtils.defineESModuleGetters(lazy, { - PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs", -}); - const { Component, createFactory, @@ -127,7 +122,7 @@ class HTTPCustomRequestPanel extends Component { async componentDidMount() { let { connector, request } = this.props; - if (!lazy.PrivateBrowsingUtils.isWindowPrivate(window)) { + if (!connector.currentTarget?.targetForm?.isPrivate) { const persistedCustomRequest = await asyncStorage.getItem( "devtools.netmonitor.customRequest" ); @@ -198,7 +193,7 @@ class HTTPCustomRequestPanel extends Component { } componentWillUnmount() { - if (!lazy.PrivateBrowsingUtils.isWindowPrivate(window)) { + if (!this.props.connector.currentTarget?.targetForm?.isPrivate) { asyncStorage.setItem("devtools.netmonitor.customRequest", this.state); } } ===================================== devtools/client/netmonitor/test/browser_net_new_request_panel_persisted_content.js ===================================== @@ -9,30 +9,14 @@ const asyncStorage = require("resource://devtools/shared/async-storage.js"); * Test if content is still persisted after the panel is closed */ -add_task(async function () { - // Turn true the pref - await pushPref("devtools.netmonitor.features.newEditAndResend", true); - // Reset the storage for the persisted custom request - await asyncStorage.removeItem("devtools.netmonitor.customRequest"); - - const { monitor } = await initNetMonitor(HTTPS_CUSTOM_GET_URL, { - requestCount: 1, - }); - info("Starting test... "); - - const { document, store, windowRequire } = monitor.panelWin; - - // Action should be processed synchronously in tests. - const Actions = windowRequire("devtools/client/netmonitor/src/actions/index"); - store.dispatch(Actions.batchEnable(false)); - - info("open the left panel"); - let waitForPanels = waitForDOM( +async function addCustomRequestTestContent(tab, monitor, document) { + info("Open the left panel"); + const waitForPanels = waitForDOM( document, ".monitor-panel .network-action-bar" ); - let HTTPCustomRequestButton = document.querySelector( + const HTTPCustomRequestButton = document.querySelector( "#netmonitor-toolbar-container .devtools-http-custom-request-icon" ); HTTPCustomRequestButton.click(); @@ -59,91 +43,166 @@ add_task(async function () { "#http-custom-query .map-add-new-inputs .http-custom-input-name" ); newParameterName.focus(); - EventUtils.sendString("My-param"); + EventUtils.sendString("My-param", monitor.panelWin); info("Adding new headers"); const newHeaderName = document.querySelector( "#http-custom-headers .map-add-new-inputs .http-custom-input-name" ); newHeaderName.focus(); - EventUtils.sendString("My-header"); + EventUtils.sendString("My-header", monitor.panelWin); const newHeaderValue = Array.from( document.querySelectorAll( "#http-custom-headers .http-custom-input .http-custom-input-value" ) - ).pop(); + ).at(-1); newHeaderValue.focus(); - EventUtils.sendString("my-value"); + EventUtils.sendString("my-value", monitor.panelWin); const postValue = document.querySelector("#http-custom-postdata-value"); postValue.focus(); - EventUtils.sendString("{'Name': 'Value'}"); + EventUtils.sendString("{'Name': 'Value'}", monitor.panelWin); - // Close the panel + info("Close the panel"); const closePanel = document.querySelector( ".network-action-bar .tabs-navigation .sidebar-toggle" ); closePanel.click(); +} - // Open the panel again to see if the content is still there - waitForPanels = waitUntil( +async function runTests(tab, monitor, document, isPrivate = false) { + info("Open the panel again to see if the content is still there"); + const waitForPanels = waitFor( () => document.querySelector(".http-custom-request-panel") && document.querySelector("#http-custom-request-send-button").disabled === - false + isPrivate ); - HTTPCustomRequestButton = document.querySelector( + const HTTPCustomRequestButton = document.querySelector( "#netmonitor-toolbar-container .devtools-http-custom-request-icon" ); HTTPCustomRequestButton.click(); await waitForPanels; - is( - methodValue.value, - "POST", - "The content should still be there after the user close the panel and re-opened" - ); - - is( - url.value, - "https://www.example.com?My-param=", - "The url should still be there after the user close the panel and re-opened" - ); + // Wait a few seconds to make sure all the fields have been updated + await wait(1500); + + const customMethod = document.querySelector("#http-custom-method-value"); + const customUrl = document.querySelector(".http-custom-url-value"); + const customQuery = document.querySelectorAll( + "#http-custom-query .tabpanel-summary-container.http-custom-input textarea" + ); + const customHeaders = document.querySelectorAll( + "#http-custom-headers .tabpanel-summary-container.http-custom-input textarea" + ); + const postDataValue = document.querySelector("#http-custom-postdata-value"); + + if (isPrivate) { + is( + customMethod.value, + "GET", + "The method should not be persisted after the user close the panel and re-opened in PBM" + ); + + is( + customUrl.value, + "", + "The url should not be there after the user close the panel and re-opened in PBM" + ); + + is( + customQuery.length, + 0, + "The Parameter should not be there after the user close the panel and re-opened in PBM" + ); + + is( + customHeaders.length, + 0, + "There should be no custom headers after the user close the panel and re-opened in PBM" + ); + + is( + postDataValue.value, + "", + "The post data should still be reset after the user close the panel and re-opened in PBM" + ); + } else { + is( + customMethod.value, + "POST", + "The method should be persisted after the user close the panel and re-opened" + ); + + is( + customUrl.value, + "https://www.example.com?My-param=", + "The url should still be there after the user close the panel and re-opened" + ); + + const [nameParam] = Array.from(customQuery); + is( + nameParam.value, + "My-param", + "The Parameter name should still be there after the user close the panel and re-opened" + ); + + const [name, value] = Array.from(customHeaders); + is( + name.value, + "My-header", + "The header name should still be there after the user close the panel and re-opened" + ); + is( + value.value, + "my-value", + "The header value should still be there after the user close the panel and re-opened" + ); + + is( + postDataValue.value, + "{'Name': 'Value'}", + "The content should still be there after the user close the panel and re-opened" + ); + } +} + +add_task(async function testRequestPanelPersistedContent() { + // Turn true the pref + await pushPref("devtools.netmonitor.features.newEditAndResend", true); + // Reset the storage for the persisted custom request + await asyncStorage.removeItem("devtools.netmonitor.customRequest"); - const [nameParam] = Array.from( - document.querySelectorAll( - "#http-custom-query .tabpanel-summary-container.http-custom-input textarea" - ) - ); - is( - nameParam.value, - "My-param", - "The Parameter name should still be there after the user close the panel and re-opened" - ); + const { tab, monitor } = await initNetMonitor(HTTPS_CUSTOM_GET_URL, { + requestCount: 1, + }); + const { document, store, windowRequire } = monitor.panelWin; + const Actions = windowRequire("devtools/client/netmonitor/src/actions/index"); + store.dispatch(Actions.batchEnable(false)); - const [name, value] = Array.from( - document.querySelectorAll( - "#http-custom-headers .tabpanel-summary-container.http-custom-input textarea" - ) - ); - is( - name.value, - "My-header", - "The header name should still be there after the user close the panel and re-opened" - ); - is( - value.value, - "my-value", - "The header value should still be there after the user close the panel and re-opened" - ); + info("Starting test... "); + info("Add initial custom request test content"); + await addCustomRequestTestContent(tab, monitor, document); + await runTests(tab, monitor, document); + await teardown(monitor); +}); - is( - postValue.value, - "{'Name': 'Value'}", - "The content should still be there after the user close the panel and re-opened" +add_task(async function testRequestPanelPersistedContentInPrivateWindow() { + await pushPref("devtools.netmonitor.features.newEditAndResend", true); + const { tab, monitor, privateWindow } = await initNetMonitor( + HTTPS_CUSTOM_GET_URL, + { + requestCount: 1, + openInPrivateWindow: true, + } ); + const { document, store, windowRequire } = monitor.panelWin; + const Actions = windowRequire("devtools/client/netmonitor/src/actions/index"); + store.dispatch(Actions.batchEnable(false)); - await teardown(monitor); + info("Starting test in private window... "); + await runTests(tab, monitor, document, true); + await teardown(monitor, privateWindow); }); ===================================== devtools/client/netmonitor/test/head.js ===================================== @@ -321,6 +321,7 @@ function initNetMonitor( expectedEventTimings, waitForLoad = true, enableCache = false, + openInPrivateWindow = false, } ) { info("Initializing a network monitor pane."); @@ -341,7 +342,22 @@ function initNetMonitor( ], }); - const tab = await addTab(url, { waitForLoad }); + let tab = null; + let privateWindow = null; + + if (openInPrivateWindow) { + privateWindow = await BrowserTestUtils.openNewBrowserWindow({ + private: true, + }); + ok( + PrivateBrowsingUtils.isContentWindowPrivate(privateWindow), + "window is private" + ); + tab = BrowserTestUtils.addTab(privateWindow.gBrowser, url); + } else { + tab = await addTab(url, { waitForLoad }); + } + info("Net tab added successfully: " + url); const toolbox = await gDevTools.showToolboxForTab(tab, { @@ -371,7 +387,7 @@ function initNetMonitor( await clearNetworkEvents(monitor); } - return { tab, monitor, toolbox }; + return { tab, monitor, toolbox, privateWindow }; })(); } @@ -408,7 +424,7 @@ async function clearNetworkEvents(monitor) { store.dispatch(Actions.clearRequests()); } -function teardown(monitor) { +function teardown(monitor, privateWindow) { info("Destroying the specified network monitor."); return (async function () { @@ -419,6 +435,12 @@ function teardown(monitor) { await monitor.toolbox.destroy(); await removeTab(tab); + + if (privateWindow) { + const closed = BrowserTestUtils.windowClosed(privateWindow); + privateWindow.BrowserCommands.tryToCloseWindow(); + await closed; + } })(); } View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/3bed85… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/3bed85… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.5-1] 2 commits: Revert "Bug 41881: Don't persist custom network requests on private windows"
by richard (@richard) 13 May '24

13 May '24
richard pushed to branch tor-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 55da4b57 by Pier Angelo Vendrame at 2024-05-13T20:38:15+00:00 Revert &quot;Bug 41881: Don&#39;t persist custom network requests on private windows&quot; This reverts commit 6450a4e62e810832f35ee8732a4630ec2c2ba6f6. - - - - - 894dc8df by cypherpunks1 at 2024-05-13T20:38:15+00:00 Bug 1892052 - Do not persist custom network requests on PBM. r=devtools-reviewers,bomsy,nchevobbe Differential Revision: https://phabricator.services.mozilla.com/D207762 - - - - - 3 changed files: - devtools/client/netmonitor/src/components/new-request/HTTPCustomRequestPanel.js - devtools/client/netmonitor/test/browser_net_new_request_panel_persisted_content.js - devtools/client/netmonitor/test/head.js Changes: ===================================== devtools/client/netmonitor/src/components/new-request/HTTPCustomRequestPanel.js ===================================== @@ -4,11 +4,6 @@ "use strict"; -const lazy = {}; -ChromeUtils.defineESModuleGetters(lazy, { - PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs", -}); - const { Component, createFactory, @@ -127,7 +122,7 @@ class HTTPCustomRequestPanel extends Component { async componentDidMount() { let { connector, request } = this.props; - if (!lazy.PrivateBrowsingUtils.isWindowPrivate(window)) { + if (!connector.currentTarget?.targetForm?.isPrivate) { const persistedCustomRequest = await asyncStorage.getItem( "devtools.netmonitor.customRequest" ); @@ -198,7 +193,7 @@ class HTTPCustomRequestPanel extends Component { } componentWillUnmount() { - if (!lazy.PrivateBrowsingUtils.isWindowPrivate(window)) { + if (!this.props.connector.currentTarget?.targetForm?.isPrivate) { asyncStorage.setItem("devtools.netmonitor.customRequest", this.state); } } ===================================== devtools/client/netmonitor/test/browser_net_new_request_panel_persisted_content.js ===================================== @@ -9,30 +9,14 @@ const asyncStorage = require("resource://devtools/shared/async-storage.js"); * Test if content is still persisted after the panel is closed */ -add_task(async function () { - // Turn true the pref - await pushPref("devtools.netmonitor.features.newEditAndResend", true); - // Reset the storage for the persisted custom request - await asyncStorage.removeItem("devtools.netmonitor.customRequest"); - - const { monitor } = await initNetMonitor(HTTPS_CUSTOM_GET_URL, { - requestCount: 1, - }); - info("Starting test... "); - - const { document, store, windowRequire } = monitor.panelWin; - - // Action should be processed synchronously in tests. - const Actions = windowRequire("devtools/client/netmonitor/src/actions/index"); - store.dispatch(Actions.batchEnable(false)); - - info("open the left panel"); - let waitForPanels = waitForDOM( +async function addCustomRequestTestContent(tab, monitor, document) { + info("Open the left panel"); + const waitForPanels = waitForDOM( document, ".monitor-panel .network-action-bar" ); - let HTTPCustomRequestButton = document.querySelector( + const HTTPCustomRequestButton = document.querySelector( "#netmonitor-toolbar-container .devtools-http-custom-request-icon" ); HTTPCustomRequestButton.click(); @@ -59,91 +43,166 @@ add_task(async function () { "#http-custom-query .map-add-new-inputs .http-custom-input-name" ); newParameterName.focus(); - EventUtils.sendString("My-param"); + EventUtils.sendString("My-param", monitor.panelWin); info("Adding new headers"); const newHeaderName = document.querySelector( "#http-custom-headers .map-add-new-inputs .http-custom-input-name" ); newHeaderName.focus(); - EventUtils.sendString("My-header"); + EventUtils.sendString("My-header", monitor.panelWin); const newHeaderValue = Array.from( document.querySelectorAll( "#http-custom-headers .http-custom-input .http-custom-input-value" ) - ).pop(); + ).at(-1); newHeaderValue.focus(); - EventUtils.sendString("my-value"); + EventUtils.sendString("my-value", monitor.panelWin); const postValue = document.querySelector("#http-custom-postdata-value"); postValue.focus(); - EventUtils.sendString("{'Name': 'Value'}"); + EventUtils.sendString("{'Name': 'Value'}", monitor.panelWin); - // Close the panel + info("Close the panel"); const closePanel = document.querySelector( ".network-action-bar .tabs-navigation .sidebar-toggle" ); closePanel.click(); +} - // Open the panel again to see if the content is still there - waitForPanels = waitUntil( +async function runTests(tab, monitor, document, isPrivate = false) { + info("Open the panel again to see if the content is still there"); + const waitForPanels = waitFor( () => document.querySelector(".http-custom-request-panel") && document.querySelector("#http-custom-request-send-button").disabled === - false + isPrivate ); - HTTPCustomRequestButton = document.querySelector( + const HTTPCustomRequestButton = document.querySelector( "#netmonitor-toolbar-container .devtools-http-custom-request-icon" ); HTTPCustomRequestButton.click(); await waitForPanels; - is( - methodValue.value, - "POST", - "The content should still be there after the user close the panel and re-opened" - ); - - is( - url.value, - "https://www.example.com?My-param=", - "The url should still be there after the user close the panel and re-opened" - ); + // Wait a few seconds to make sure all the fields have been updated + await wait(1500); + + const customMethod = document.querySelector("#http-custom-method-value"); + const customUrl = document.querySelector(".http-custom-url-value"); + const customQuery = document.querySelectorAll( + "#http-custom-query .tabpanel-summary-container.http-custom-input textarea" + ); + const customHeaders = document.querySelectorAll( + "#http-custom-headers .tabpanel-summary-container.http-custom-input textarea" + ); + const postDataValue = document.querySelector("#http-custom-postdata-value"); + + if (isPrivate) { + is( + customMethod.value, + "GET", + "The method should not be persisted after the user close the panel and re-opened in PBM" + ); + + is( + customUrl.value, + "", + "The url should not be there after the user close the panel and re-opened in PBM" + ); + + is( + customQuery.length, + 0, + "The Parameter should not be there after the user close the panel and re-opened in PBM" + ); + + is( + customHeaders.length, + 0, + "There should be no custom headers after the user close the panel and re-opened in PBM" + ); + + is( + postDataValue.value, + "", + "The post data should still be reset after the user close the panel and re-opened in PBM" + ); + } else { + is( + customMethod.value, + "POST", + "The method should be persisted after the user close the panel and re-opened" + ); + + is( + customUrl.value, + "https://www.example.com?My-param=", + "The url should still be there after the user close the panel and re-opened" + ); + + const [nameParam] = Array.from(customQuery); + is( + nameParam.value, + "My-param", + "The Parameter name should still be there after the user close the panel and re-opened" + ); + + const [name, value] = Array.from(customHeaders); + is( + name.value, + "My-header", + "The header name should still be there after the user close the panel and re-opened" + ); + is( + value.value, + "my-value", + "The header value should still be there after the user close the panel and re-opened" + ); + + is( + postDataValue.value, + "{'Name': 'Value'}", + "The content should still be there after the user close the panel and re-opened" + ); + } +} + +add_task(async function testRequestPanelPersistedContent() { + // Turn true the pref + await pushPref("devtools.netmonitor.features.newEditAndResend", true); + // Reset the storage for the persisted custom request + await asyncStorage.removeItem("devtools.netmonitor.customRequest"); - const [nameParam] = Array.from( - document.querySelectorAll( - "#http-custom-query .tabpanel-summary-container.http-custom-input textarea" - ) - ); - is( - nameParam.value, - "My-param", - "The Parameter name should still be there after the user close the panel and re-opened" - ); + const { tab, monitor } = await initNetMonitor(HTTPS_CUSTOM_GET_URL, { + requestCount: 1, + }); + const { document, store, windowRequire } = monitor.panelWin; + const Actions = windowRequire("devtools/client/netmonitor/src/actions/index"); + store.dispatch(Actions.batchEnable(false)); - const [name, value] = Array.from( - document.querySelectorAll( - "#http-custom-headers .tabpanel-summary-container.http-custom-input textarea" - ) - ); - is( - name.value, - "My-header", - "The header name should still be there after the user close the panel and re-opened" - ); - is( - value.value, - "my-value", - "The header value should still be there after the user close the panel and re-opened" - ); + info("Starting test... "); + info("Add initial custom request test content"); + await addCustomRequestTestContent(tab, monitor, document); + await runTests(tab, monitor, document); + await teardown(monitor); +}); - is( - postValue.value, - "{'Name': 'Value'}", - "The content should still be there after the user close the panel and re-opened" +add_task(async function testRequestPanelPersistedContentInPrivateWindow() { + await pushPref("devtools.netmonitor.features.newEditAndResend", true); + const { tab, monitor, privateWindow } = await initNetMonitor( + HTTPS_CUSTOM_GET_URL, + { + requestCount: 1, + openInPrivateWindow: true, + } ); + const { document, store, windowRequire } = monitor.panelWin; + const Actions = windowRequire("devtools/client/netmonitor/src/actions/index"); + store.dispatch(Actions.batchEnable(false)); - await teardown(monitor); + info("Starting test in private window... "); + await runTests(tab, monitor, document, true); + await teardown(monitor, privateWindow); }); ===================================== devtools/client/netmonitor/test/head.js ===================================== @@ -321,6 +321,7 @@ function initNetMonitor( expectedEventTimings, waitForLoad = true, enableCache = false, + openInPrivateWindow = false, } ) { info("Initializing a network monitor pane."); @@ -341,7 +342,22 @@ function initNetMonitor( ], }); - const tab = await addTab(url, { waitForLoad }); + let tab = null; + let privateWindow = null; + + if (openInPrivateWindow) { + privateWindow = await BrowserTestUtils.openNewBrowserWindow({ + private: true, + }); + ok( + PrivateBrowsingUtils.isContentWindowPrivate(privateWindow), + "window is private" + ); + tab = BrowserTestUtils.addTab(privateWindow.gBrowser, url); + } else { + tab = await addTab(url, { waitForLoad }); + } + info("Net tab added successfully: " + url); const toolbox = await gDevTools.showToolboxForTab(tab, { @@ -371,7 +387,7 @@ function initNetMonitor( await clearNetworkEvents(monitor); } - return { tab, monitor, toolbox }; + return { tab, monitor, toolbox, privateWindow }; })(); } @@ -408,7 +424,7 @@ async function clearNetworkEvents(monitor) { store.dispatch(Actions.clearRequests()); } -function teardown(monitor) { +function teardown(monitor, privateWindow) { info("Destroying the specified network monitor."); return (async function () { @@ -419,6 +435,12 @@ function teardown(monitor) { await monitor.toolbox.destroy(); await removeTab(tab); + + if (privateWindow) { + const closed = BrowserTestUtils.windowClosed(privateWindow); + privateWindow.BrowserCommands.tryToCloseWindow(); + await closed; + } })(); } View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/32a6f9… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/32a6f9… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-115.11.0esr-13.5-1] 2 commits: Revert "Bug 41740: Change the RFP value of devicePixelRatio to 2"
by richard (@richard) 13 May '24

13 May '24
richard pushed to branch mullvad-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser Commits: 532087af by Pier Angelo Vendrame at 2024-05-13T19:56:57+00:00 Revert &quot;Bug 41740: Change the RFP value of devicePixelRatio to 2&quot; This reverts commit 94c39de65acb82efc7ecabbd7125f8d2aeb46d02. - - - - - bed64b83 by Fatih at 2024-05-13T19:56:57+00:00 Bug 1830629: Remove unnecessary checks for pdf.js for RFP. r=tjr resource:// is exempt from RFP, so we no longer need to check pdf.js specifically. Differential Revision: https://phabricator.services.mozilla.com/D209359 - - - - - 1 changed file: - dom/base/nsGlobalWindowInner.cpp Changes: ===================================== dom/base/nsGlobalWindowInner.cpp ===================================== @@ -3604,20 +3604,9 @@ double nsGlobalWindowInner::GetDevicePixelRatio(CallerType aCallerType, return 1.0; } - if (nsIGlobalObject::ShouldResistFingerprinting(aCallerType, - RFPTarget::Unknown)) { - // Spoofing the DevicePixelRatio causes blurriness in some situations - // on HiDPI displays. pdf.js is a non-system caller; but it can't - // expose the fingerprintable information, so we can safely disable - // spoofing in this situation. It doesn't address the issue for - // web-rendered content (including pdf.js instances on the web.) - // In the future we hope to have a better solution to fix all HiDPI - // blurriness... - nsAutoCString origin; - nsresult rv = this->GetPrincipal()->GetOrigin(origin); - if (NS_FAILED(rv) || origin != "resource://pdf.js"_ns) { - return 2.0; - } + if (nsIGlobalObject::ShouldResistFingerprinting( + aCallerType, RFPTarget::Unknown)) { + return 2.0; } if (aCallerType == CallerType::NonSystem) { View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/5e… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/5e… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][base-browser-115.11.0esr-13.5-1] 2 commits: Revert "Bug 41740: Change the RFP value of devicePixelRatio to 2"
by richard (@richard) 13 May '24

13 May '24
richard pushed to branch base-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: be35122b by Pier Angelo Vendrame at 2024-05-13T19:56:00+00:00 Revert &quot;Bug 41740: Change the RFP value of devicePixelRatio to 2&quot; This reverts commit 94c39de65acb82efc7ecabbd7125f8d2aeb46d02. - - - - - 3bed85e2 by Fatih at 2024-05-13T19:56:00+00:00 Bug 1830629: Remove unnecessary checks for pdf.js for RFP. r=tjr resource:// is exempt from RFP, so we no longer need to check pdf.js specifically. Differential Revision: https://phabricator.services.mozilla.com/D209359 - - - - - 1 changed file: - dom/base/nsGlobalWindowInner.cpp Changes: ===================================== dom/base/nsGlobalWindowInner.cpp ===================================== @@ -3604,20 +3604,9 @@ double nsGlobalWindowInner::GetDevicePixelRatio(CallerType aCallerType, return 1.0; } - if (nsIGlobalObject::ShouldResistFingerprinting(aCallerType, - RFPTarget::Unknown)) { - // Spoofing the DevicePixelRatio causes blurriness in some situations - // on HiDPI displays. pdf.js is a non-system caller; but it can't - // expose the fingerprintable information, so we can safely disable - // spoofing in this situation. It doesn't address the issue for - // web-rendered content (including pdf.js instances on the web.) - // In the future we hope to have a better solution to fix all HiDPI - // blurriness... - nsAutoCString origin; - nsresult rv = this->GetPrincipal()->GetOrigin(origin); - if (NS_FAILED(rv) || origin != "resource://pdf.js"_ns) { - return 2.0; - } + if (nsIGlobalObject::ShouldResistFingerprinting( + aCallerType, RFPTarget::Unknown)) { + return 2.0; } if (aCallerType == CallerType::NonSystem) { View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/1f7194… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/1f7194… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.5-1] 2 commits: Revert "Bug 41740: Change the RFP value of devicePixelRatio to 2"
by richard (@richard) 13 May '24

13 May '24
richard pushed to branch tor-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 736fba53 by Pier Angelo Vendrame at 2024-05-13T17:49:22+02:00 Revert &quot;Bug 41740: Change the RFP value of devicePixelRatio to 2&quot; This reverts commit 94c39de65acb82efc7ecabbd7125f8d2aeb46d02. - - - - - 32a6f98c by Fatih at 2024-05-13T17:52:54+02:00 Bug 1830629: Remove unnecessary checks for pdf.js for RFP. r=tjr resource:// is exempt from RFP, so we no longer need to check pdf.js specifically. Differential Revision: https://phabricator.services.mozilla.com/D209359 - - - - - 1 changed file: - dom/base/nsGlobalWindowInner.cpp Changes: ===================================== dom/base/nsGlobalWindowInner.cpp ===================================== @@ -3604,20 +3604,9 @@ double nsGlobalWindowInner::GetDevicePixelRatio(CallerType aCallerType, return 1.0; } - if (nsIGlobalObject::ShouldResistFingerprinting(aCallerType, - RFPTarget::Unknown)) { - // Spoofing the DevicePixelRatio causes blurriness in some situations - // on HiDPI displays. pdf.js is a non-system caller; but it can't - // expose the fingerprintable information, so we can safely disable - // spoofing in this situation. It doesn't address the issue for - // web-rendered content (including pdf.js instances on the web.) - // In the future we hope to have a better solution to fix all HiDPI - // blurriness... - nsAutoCString origin; - nsresult rv = this->GetPrincipal()->GetOrigin(origin); - if (NS_FAILED(rv) || origin != "resource://pdf.js"_ns) { - return 2.0; - } + if (nsIGlobalObject::ShouldResistFingerprinting( + aCallerType, RFPTarget::Unknown)) { + return 2.0; } if (aCallerType == CallerType::NonSystem) { View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/8e9d5e… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/8e9d5e… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-update-responses][main] release: new version, 13.0.15
by richard (@richard) 13 May '24

13 May '24
richard pushed to branch main at The Tor Project / Applications / Tor Browser update responses Commits: e8782cea by Richard Pospesel at 2024-05-13T15:17:52+00:00 release: new version, 13.0.15 - - - - - 30 changed files: - update_3/release/.htaccess - − update_3/release/13.0.11-13.0.14-linux-i686-ALL.xml - − update_3/release/13.0.11-13.0.14-linux-x86_64-ALL.xml - − update_3/release/13.0.11-13.0.14-macos-ALL.xml - − update_3/release/13.0.11-13.0.14-windows-i686-ALL.xml - − update_3/release/13.0.11-13.0.14-windows-x86_64-ALL.xml - − update_3/release/13.0.12-13.0.14-linux-i686-ALL.xml - − update_3/release/13.0.12-13.0.14-linux-x86_64-ALL.xml - − update_3/release/13.0.12-13.0.14-macos-ALL.xml - − update_3/release/13.0.12-13.0.14-windows-i686-ALL.xml - − update_3/release/13.0.12-13.0.14-windows-x86_64-ALL.xml - + update_3/release/13.0.12-13.0.15-linux-i686-ALL.xml - + update_3/release/13.0.12-13.0.15-linux-x86_64-ALL.xml - + update_3/release/13.0.12-13.0.15-macos-ALL.xml - + update_3/release/13.0.12-13.0.15-windows-i686-ALL.xml - + update_3/release/13.0.12-13.0.15-windows-x86_64-ALL.xml - − update_3/release/13.0.13-13.0.14-linux-i686-ALL.xml - − update_3/release/13.0.13-13.0.14-linux-x86_64-ALL.xml - − update_3/release/13.0.13-13.0.14-macos-ALL.xml - − update_3/release/13.0.13-13.0.14-windows-i686-ALL.xml - − update_3/release/13.0.13-13.0.14-windows-x86_64-ALL.xml - + update_3/release/13.0.13-13.0.15-linux-i686-ALL.xml - + update_3/release/13.0.13-13.0.15-linux-x86_64-ALL.xml - + update_3/release/13.0.13-13.0.15-macos-ALL.xml - + update_3/release/13.0.13-13.0.15-windows-i686-ALL.xml - + update_3/release/13.0.13-13.0.15-windows-x86_64-ALL.xml - + update_3/release/13.0.14-13.0.15-linux-i686-ALL.xml - + update_3/release/13.0.14-13.0.15-linux-x86_64-ALL.xml - + update_3/release/13.0.14-13.0.15-macos-ALL.xml - + update_3/release/13.0.14-13.0.15-windows-i686-ALL.xml The diff was not included because it is too large. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-update-responses… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-update-responses… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][base-browser-115.11.0esr-13.5-1] fixup! Firefox preference overrides.
by richard (@richard) 13 May '24

13 May '24
richard pushed to branch base-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 1f7194f4 by Richard Pospesel at 2024-05-13T13:50:25+00:00 fixup! Firefox preference overrides. Bug 241: Move network.proxy.failover_direct=false pref to base-browser - - - - - 1 changed file: - browser/app/profile/001-base-profile.js Changes: ===================================== browser/app/profile/001-base-profile.js ===================================== @@ -455,6 +455,8 @@ pref("network.protocol-handler.warn-external.snews", true); pref("network.protocol-handler.warn-external.ms-windows-store", true); #endif pref("network.proxy.allow_bypass", false, locked); // #40682 +// Bug 40548: Disable proxy-bypass +pref("network.proxy.failover_direct", false, locked); // Lock to 'true', which is already the firefox default, to prevent users // from making themselves fingerprintable by disabling. This pref // alters content load order in a page. See tor-browser#24686 View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/1f7194f… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/1f7194f… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-115.11.0esr-13.5-1] fixup! Firefox preference overrides.
by richard (@richard) 13 May '24

13 May '24
richard pushed to branch mullvad-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser Commits: 5ee488b0 by Richard Pospesel at 2024-05-13T13:48:40+00:00 fixup! Firefox preference overrides. Bug 241: Move network.proxy.failover_direct=false pref to base-browser - - - - - 1 changed file: - browser/app/profile/001-base-profile.js Changes: ===================================== browser/app/profile/001-base-profile.js ===================================== @@ -454,6 +454,8 @@ pref("network.protocol-handler.warn-external.snews", true); pref("network.protocol-handler.warn-external.ms-windows-store", true); #endif pref("network.proxy.allow_bypass", false, locked); // #40682 +// Bug 40548: Disable proxy-bypass +pref("network.proxy.failover_direct", false, locked); // Lock to 'true', which is already the firefox default, to prevent users // from making themselves fingerprintable by disabling. This pref // alters content load order in a page. See tor-browser#24686 View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/5ee… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/5ee… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.5-1] 2 commits: fixup! Bug 40562: Added Tor Browser preferences to 000-tor-browser.js
by richard (@richard) 13 May '24

13 May '24
richard pushed to branch tor-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: b04fa658 by Richard Pospesel at 2024-05-13T13:18:28+00:00 fixup! Bug 40562: Added Tor Browser preferences to 000-tor-browser.js Bug 241: Move network.proxy.failover_direct=false pref to base-browser - - - - - 8e9d5e49 by Richard Pospesel at 2024-05-13T13:18:28+00:00 fixup! Firefox preference overrides. Bug 241: Move network.proxy.failover_direct=false pref to base-browser - - - - - 2 changed files: - browser/app/profile/000-tor-browser.js - browser/app/profile/001-base-profile.js Changes: ===================================== browser/app/profile/000-tor-browser.js ===================================== @@ -21,8 +21,6 @@ pref("network.proxy.socks_remote_dns", true); pref("network.proxy.no_proxies_on", ""); // For fingerprinting and local service vulns (#10419) pref("network.proxy.allow_hijacking_localhost", true); // Allow proxies for localhost (#31065) pref("network.proxy.type", 1); -// Bug 40548: Disable proxy-bypass -pref("network.proxy.failover_direct", false); // localhost is already blocked by setting `network.proxy.allow_hijacking_localhost` to // true, allowing users to explicitly block ports makes them fingerprintable; for details, see // Bug 41317: Tor Browser leaks banned ports in network.security.ports.banned ===================================== browser/app/profile/001-base-profile.js ===================================== @@ -455,6 +455,8 @@ pref("network.protocol-handler.warn-external.snews", true); pref("network.protocol-handler.warn-external.ms-windows-store", true); #endif pref("network.proxy.allow_bypass", false, locked); // #40682 +// Bug 40548: Disable proxy-bypass +pref("network.proxy.failover_direct", false, locked); // Lock to 'true', which is already the firefox default, to prevent users // from making themselves fingerprintable by disabling. This pref // alters content load order in a page. See tor-browser#24686 View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/ca21ab… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/ca21ab… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-115.11.0esr-13.5-1] fixup! MB 38: Mullvad Browser configuration
by richard (@richard) 13 May '24

13 May '24
richard pushed to branch mullvad-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser Commits: cce4482c by Richard Pospesel at 2024-05-13T12:37:21+00:00 fixup! MB 38: Mullvad Browser configuration Bug 222: Hide &#39;List all tabs&#39; when the tabs don&#39;t overflow - - - - - 1 changed file: - browser/app/profile/000-mullvad-browser.js Changes: ===================================== browser/app/profile/000-mullvad-browser.js ===================================== @@ -48,3 +48,6 @@ pref("app.feedback.baseURL", "https://mullvad.net/help/tag/browser/"); // mullvad-browser#234: Do not spoof the OS in the User-Agent header pref("privacy.resistFingerprinting.spoofOsInUserAgentHeader", false); + +// mullvad-browser#222: Hide "List all tabs" when the tabs don't overflow +pref("browser.tabs.tabmanager.enabled", false); View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/cce… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/cce… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build] Pushed new tag tbb-13.0.15-build2
by richard (@richard) 13 May '24

13 May '24
richard pushed new tag tbb-13.0.15-build2 at The Tor Project / Applications / tor-browser-build -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/tree/tbb… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][maint-13.0] Bug 41119: Prepare Tor Browser 13.0.15 (build2).
by richard (@richard) 13 May '24

13 May '24
richard pushed to branch maint-13.0 at The Tor Project / Applications / tor-browser-build Commits: bdc8cfc3 by Pier Angelo Vendrame at 2024-05-13T11:20:54+00:00 Bug 41119: Prepare Tor Browser 13.0.15 (build2). We bumped tags to include a fix for tor-browser#42562. - - - - - 3 changed files: - projects/firefox-android/config - projects/geckoview/config - rbm.conf Changes: ===================================== projects/firefox-android/config ===================================== @@ -16,7 +16,7 @@ container: var: fenix_version: 115.2.1 browser_branch: 13.0-1 - browser_build: 16 + browser_build: 17 variant: Beta # This should be updated when the list of gradle dependencies is changed. gradle_dependencies_version: 1 ===================================== projects/geckoview/config ===================================== @@ -16,7 +16,9 @@ container: var: geckoview_version: 115.11.0esr browser_branch: 13.0-1 - browser_build: 2 + # GeckoView and Firefox are out-of-sync because we needed to build a + # 13.0.15-build2 with Java-only changes. + browser_build: 3 copyright_year: '[% exec("git show -s --format=%ci").remove("-.*") %]' gitlab_project: https://gitlab.torproject.org/tpo/applications/tor-browser git_commit: '[% exec("git rev-parse HEAD") %]' ===================================== rbm.conf ===================================== @@ -74,7 +74,7 @@ buildconf: var: torbrowser_version: '13.0.15' - torbrowser_build: 'build1' + torbrowser_build: 'build2' torbrowser_incremental_from: - '13.0.14' - '13.0.13' View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/b… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/b… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][maint-13.0] Bug 41119: Prepare Tor Browser 13.0.15 (build2).
by richard (@richard) 13 May '24

13 May '24
richard pushed to branch maint-13.0 at The Tor Project / Applications / tor-browser-build Commits: 6db45bce by Pier Angelo Vendrame at 2024-05-13T12:10:33+02:00 Bug 41119: Prepare Tor Browser 13.0.15 (build2). We bumped tags to include a fix for tor-browser#42562. - - - - - 2 changed files: - projects/firefox-android/config - projects/geckoview/config Changes: ===================================== projects/firefox-android/config ===================================== @@ -16,7 +16,7 @@ container: var: fenix_version: 115.2.1 browser_branch: 13.0-1 - browser_build: 16 + browser_build: 17 variant: Beta # This should be updated when the list of gradle dependencies is changed. gradle_dependencies_version: 1 ===================================== projects/geckoview/config ===================================== @@ -16,7 +16,9 @@ container: var: geckoview_version: 115.11.0esr browser_branch: 13.0-1 - browser_build: 2 + # GeckoView and Firefox are out-of-sync because we needed to build a + # 13.0.15-build2 with Java-only changes. + browser_build: 3 copyright_year: '[% exec("git show -s --format=%ci").remove("-.*") %]' gitlab_project: https://gitlab.torproject.org/tpo/applications/tor-browser git_commit: '[% exec("git rev-parse HEAD") %]' View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/6… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/6… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser-update-responses][main] release: new version, 13.0.15
by richard (@richard) 13 May '24

13 May '24
richard pushed to branch main at The Tor Project / Applications / mullvad-browser-update-responses Commits: 3e9fb07d by Richard Pospesel at 2024-05-13T10:14:13+00:00 release: new version, 13.0.15 - - - - - 29 changed files: - update_1/release/.htaccess - − update_1/release/13.0.10-13.0.14-linux-x86_64-ALL.xml - − update_1/release/13.0.10-13.0.14-macos-ALL.xml - − update_1/release/13.0.10-13.0.14-windows-x86_64-ALL.xml - − update_1/release/13.0.12-13.0.14-linux-x86_64-ALL.xml - − update_1/release/13.0.12-13.0.14-macos-ALL.xml - − update_1/release/13.0.12-13.0.14-windows-x86_64-ALL.xml - + update_1/release/13.0.12-13.0.15-linux-x86_64-ALL.xml - + update_1/release/13.0.12-13.0.15-macos-ALL.xml - + update_1/release/13.0.12-13.0.15-windows-x86_64-ALL.xml - − update_1/release/13.0.13-13.0.14-linux-x86_64-ALL.xml - − update_1/release/13.0.13-13.0.14-macos-ALL.xml - − update_1/release/13.0.13-13.0.14-windows-x86_64-ALL.xml - + update_1/release/13.0.13-13.0.15-linux-x86_64-ALL.xml - + update_1/release/13.0.13-13.0.15-macos-ALL.xml - + update_1/release/13.0.13-13.0.15-windows-x86_64-ALL.xml - + update_1/release/13.0.14-13.0.15-linux-x86_64-ALL.xml - + update_1/release/13.0.14-13.0.15-macos-ALL.xml - + update_1/release/13.0.14-13.0.15-windows-x86_64-ALL.xml - − update_1/release/13.0.14-linux-x86_64-ALL.xml - − update_1/release/13.0.14-macos-ALL.xml - − update_1/release/13.0.14-windows-x86_64-ALL.xml - + update_1/release/13.0.15-linux-x86_64-ALL.xml - + update_1/release/13.0.15-macos-ALL.xml - + update_1/release/13.0.15-windows-x86_64-ALL.xml - update_1/release/download-linux-x86_64.json - update_1/release/download-macos.json - update_1/release/download-windows-x86_64.json - update_1/release/downloads.json Changes: ===================================== update_1/release/.htaccess ===================================== @@ -1,22 +1,22 @@ RewriteEngine On -RewriteRule ^[^/]+/13.0.14/ no-update.xml [last] -RewriteRule ^Linux_x86_64-gcc3/13.0.10/ALL 13.0.10-13.0.14-linux-x86_64-ALL.xml [last] -RewriteRule ^Linux_x86_64-gcc3/13.0.12/ALL 13.0.12-13.0.14-linux-x86_64-ALL.xml [last] -RewriteRule ^Linux_x86_64-gcc3/13.0.13/ALL 13.0.13-13.0.14-linux-x86_64-ALL.xml [last] -RewriteRule ^Linux_x86_64-gcc3/[^/]+/ALL 13.0.14-linux-x86_64-ALL.xml [last] -RewriteRule ^Linux_x86_64-gcc3/ 13.0.14-linux-x86_64-ALL.xml [last] -RewriteRule ^Darwin_x86_64-gcc3/13.0.10/ALL 13.0.10-13.0.14-macos-ALL.xml [last] -RewriteRule ^Darwin_x86_64-gcc3/13.0.12/ALL 13.0.12-13.0.14-macos-ALL.xml [last] -RewriteRule ^Darwin_x86_64-gcc3/13.0.13/ALL 13.0.13-13.0.14-macos-ALL.xml [last] -RewriteRule ^Darwin_x86_64-gcc3/[^/]+/ALL 13.0.14-macos-ALL.xml [last] -RewriteRule ^Darwin_x86_64-gcc3/ 13.0.14-macos-ALL.xml [last] -RewriteRule ^Darwin_aarch64-gcc3/13.0.10/ALL 13.0.10-13.0.14-macos-ALL.xml [last] -RewriteRule ^Darwin_aarch64-gcc3/13.0.12/ALL 13.0.12-13.0.14-macos-ALL.xml [last] -RewriteRule ^Darwin_aarch64-gcc3/13.0.13/ALL 13.0.13-13.0.14-macos-ALL.xml [last] -RewriteRule ^Darwin_aarch64-gcc3/[^/]+/ALL 13.0.14-macos-ALL.xml [last] -RewriteRule ^Darwin_aarch64-gcc3/ 13.0.14-macos-ALL.xml [last] -RewriteRule ^WINNT_x86_64-gcc3-x64/13.0.10/ALL 13.0.10-13.0.14-windows-x86_64-ALL.xml [last] -RewriteRule ^WINNT_x86_64-gcc3-x64/13.0.12/ALL 13.0.12-13.0.14-windows-x86_64-ALL.xml [last] -RewriteRule ^WINNT_x86_64-gcc3-x64/13.0.13/ALL 13.0.13-13.0.14-windows-x86_64-ALL.xml [last] -RewriteRule ^WINNT_x86_64-gcc3-x64/[^/]+/ALL 13.0.14-windows-x86_64-ALL.xml [last] -RewriteRule ^WINNT_x86_64-gcc3-x64/ 13.0.14-windows-x86_64-ALL.xml [last] +RewriteRule ^[^/]+/13.0.15/ no-update.xml [last] +RewriteRule ^Linux_x86_64-gcc3/13.0.12/ALL 13.0.12-13.0.15-linux-x86_64-ALL.xml [last] +RewriteRule ^Linux_x86_64-gcc3/13.0.13/ALL 13.0.13-13.0.15-linux-x86_64-ALL.xml [last] +RewriteRule ^Linux_x86_64-gcc3/13.0.14/ALL 13.0.14-13.0.15-linux-x86_64-ALL.xml [last] +RewriteRule ^Linux_x86_64-gcc3/[^/]+/ALL 13.0.15-linux-x86_64-ALL.xml [last] +RewriteRule ^Linux_x86_64-gcc3/ 13.0.15-linux-x86_64-ALL.xml [last] +RewriteRule ^Darwin_x86_64-gcc3/13.0.12/ALL 13.0.12-13.0.15-macos-ALL.xml [last] +RewriteRule ^Darwin_x86_64-gcc3/13.0.13/ALL 13.0.13-13.0.15-macos-ALL.xml [last] +RewriteRule ^Darwin_x86_64-gcc3/13.0.14/ALL 13.0.14-13.0.15-macos-ALL.xml [last] +RewriteRule ^Darwin_x86_64-gcc3/[^/]+/ALL 13.0.15-macos-ALL.xml [last] +RewriteRule ^Darwin_x86_64-gcc3/ 13.0.15-macos-ALL.xml [last] +RewriteRule ^Darwin_aarch64-gcc3/13.0.12/ALL 13.0.12-13.0.15-macos-ALL.xml [last] +RewriteRule ^Darwin_aarch64-gcc3/13.0.13/ALL 13.0.13-13.0.15-macos-ALL.xml [last] +RewriteRule ^Darwin_aarch64-gcc3/13.0.14/ALL 13.0.14-13.0.15-macos-ALL.xml [last] +RewriteRule ^Darwin_aarch64-gcc3/[^/]+/ALL 13.0.15-macos-ALL.xml [last] +RewriteRule ^Darwin_aarch64-gcc3/ 13.0.15-macos-ALL.xml [last] +RewriteRule ^WINNT_x86_64-gcc3-x64/13.0.12/ALL 13.0.12-13.0.15-windows-x86_64-ALL.xml [last] +RewriteRule ^WINNT_x86_64-gcc3-x64/13.0.13/ALL 13.0.13-13.0.15-windows-x86_64-ALL.xml [last] +RewriteRule ^WINNT_x86_64-gcc3-x64/13.0.14/ALL 13.0.14-13.0.15-windows-x86_64-ALL.xml [last] +RewriteRule ^WINNT_x86_64-gcc3-x64/[^/]+/ALL 13.0.15-windows-x86_64-ALL.xml [last] +RewriteRule ^WINNT_x86_64-gcc3-x64/ 13.0.15-windows-x86_64-ALL.xml [last] ===================================== update_1/release/13.0.10-13.0.14-linux-x86_64-ALL.xml deleted ===================================== @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<updates><update type="minor" displayVersion="13.0.14" appVersion="13.0.14" platformVersion="115.10.0" buildID="20240408204645" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-linux-x86_64-13.0.1…" hashFunction="SHA512" hashValue="40fda8d5eb0ddd6b5e516e686ba88f7ea57fb7b7c70868ca11f19b198911eb83acab8057f7cd2b107be46e5ab60dac8ac3e8df7f10f37d7309767830defb2f42" size="107492923" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-linux-x86_64--13.0.…" hashFunction="SHA512" hashValue="ebeaebec06f3cf9f075524b43167b2d5ea69d8e3137763212a2ed3b96ee91d46e08edb62ac6ad3c075e477446fe3a7dcff956bbd1eba14c6879bfc29c1e10a3d" size="9369512" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.10-13.0.14-macos-ALL.xml deleted ===================================== @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<updates><update type="minor" displayVersion="13.0.14" appVersion="13.0.14" platformVersion="115.10.0" buildID="20240408204645" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-macos-13.0.14_ALL.m…" hashFunction="SHA512" hashValue="444609f144bbcc48b7226465078772e8d78d96fda177453aada2f75cb14edc9481dd13948f7313d953ce1ebb858f56884b938cddb7b9252de67db961c9bfc434" size="115543851" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-macos--13.0.10-13.0…" hashFunction="SHA512" hashValue="2e82745bc649b6000fe13c2d0f72df555d7f1c0a00a14b7abdada8c56381b690ac54f0cb02b53438d18f9cc2621bbf186da33580dbb53b74109d8f25d6c721d3" size="14070463" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.10-13.0.14-windows-x86_64-ALL.xml deleted ===================================== @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<updates><update type="minor" displayVersion="13.0.14" appVersion="13.0.14" platformVersion="115.10.0" buildID="20240408204645" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-windows-x86_64-13.0…" hashFunction="SHA512" hashValue="bc0c7b7a2054a16f96832f44b9bd35ebb8486d08aebb7fc749f0bb24006830aa566d887bb253e6b297bfeb6ff442b56b18adb773309ba887fa3e12a1b9f25362" size="89463392" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-windows-x86_64--13.…" hashFunction="SHA512" hashValue="1d3924edf03ceab4963b97bc1df3ff94ecf784f517870b5e777a4a746332b73724621a0239c577a026f1c88a5256746219203c34c266cc77c3b2af0558a3fd44" size="9905751" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.12-13.0.14-linux-x86_64-ALL.xml deleted ===================================== @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<updates><update type="minor" displayVersion="13.0.14" appVersion="13.0.14" platformVersion="115.10.0" buildID="20240408204645" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-linux-x86_64-13.0.1…" hashFunction="SHA512" hashValue="40fda8d5eb0ddd6b5e516e686ba88f7ea57fb7b7c70868ca11f19b198911eb83acab8057f7cd2b107be46e5ab60dac8ac3e8df7f10f37d7309767830defb2f42" size="107492923" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-linux-x86_64--13.0.…" hashFunction="SHA512" hashValue="926f32fc4c3eb64935364f20a18cae93a8e928227c81826e2e280c97e3a2aed0342883298c20733b4f5fdf9aa2c0a6c4e73a6768b0e5b639cf624a949ec1f2e6" size="7893763" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.12-13.0.14-macos-ALL.xml deleted ===================================== @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<updates><update type="minor" displayVersion="13.0.14" appVersion="13.0.14" platformVersion="115.10.0" buildID="20240408204645" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-macos-13.0.14_ALL.m…" hashFunction="SHA512" hashValue="444609f144bbcc48b7226465078772e8d78d96fda177453aada2f75cb14edc9481dd13948f7313d953ce1ebb858f56884b938cddb7b9252de67db961c9bfc434" size="115543851" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-macos--13.0.12-13.0…" hashFunction="SHA512" hashValue="607c56a15fbbb39a22c9f62ec928d7a2239537fe56a441394403ed8cfd86b7b1cd9722e4932a74fd45ffbdc54bfd9b119481fb8fb24cf0d6603b6f5f8f0ca46f" size="12156659" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.12-13.0.14-windows-x86_64-ALL.xml deleted ===================================== @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<updates><update type="minor" displayVersion="13.0.14" appVersion="13.0.14" platformVersion="115.10.0" buildID="20240408204645" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-windows-x86_64-13.0…" hashFunction="SHA512" hashValue="bc0c7b7a2054a16f96832f44b9bd35ebb8486d08aebb7fc749f0bb24006830aa566d887bb253e6b297bfeb6ff442b56b18adb773309ba887fa3e12a1b9f25362" size="89463392" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-windows-x86_64--13.…" hashFunction="SHA512" hashValue="a2baf03471f3da3478fdcb031c5d3405b687a06e01704dc278e6c27b5e21d0c60c9a441b1f0d2e727585c5fe7cfbfe138f488333644ea248b2cb0426a54b6fb9" size="8547030" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.12-13.0.15-linux-x86_64-ALL.xml ===================================== @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<updates><update type="minor" displayVersion="13.0.15" appVersion="13.0.15" platformVersion="115.11.0" buildID="20240510150000" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-linux-x86_64-13.0.1…" hashFunction="SHA512" hashValue="323694bc40a76a24b4d69b9df390ac48606f90d227d80e0a97aab6288a847ae7bab65be67e906f9112dc2dea0e666572d619af8d579bf812b286e8877ec2332d" size="107673007" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-linux-x86_64--13.0.…" hashFunction="SHA512" hashValue="21cbf614ca7aa7ff762edcb649dc78f8e3f5b029a256aec803db62b43cfa2a8d16c7fd726e98403d2ef1b0886c0bdcb161bae75c24a657cf3d23eb6c7a1bee1f" size="11567243" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.12-13.0.15-macos-ALL.xml ===================================== @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<updates><update type="minor" displayVersion="13.0.15" appVersion="13.0.15" platformVersion="115.11.0" buildID="20240510150000" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-macos-13.0.15_ALL.m…" hashFunction="SHA512" hashValue="57edeaafb75299f5aa44d0a20bbd4d7c79e0099e26dea85e643ea300bc2550f199e9c5d171a005798c9fef3f0a6972cfebd9253dbeb7f296500e0ff5a28b52e8" size="115725843" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-macos--13.0.12-13.0…" hashFunction="SHA512" hashValue="3c0f41110076beaa49a05522bb4ea77fb7a2a2fa1004f4d37c3fface43c40e44a7ee537a212724b6cfae65d1ab7f3c6ca7b0749f7050153402d678410c0467f3" size="16022791" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.12-13.0.15-windows-x86_64-ALL.xml ===================================== @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<updates><update type="minor" displayVersion="13.0.15" appVersion="13.0.15" platformVersion="115.11.0" buildID="20240510150000" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-windows-x86_64-13.0…" hashFunction="SHA512" hashValue="6ad0c70f119de1df459387eaf98784be153dbe5533291c3e6c579593ca072c59c7a17f565d8b834f2a1ea5e02bb21305fff46b1ad73912dd472ecf12c20fe70d" size="89632164" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-windows-x86_64--13.…" hashFunction="SHA512" hashValue="d706d64c3385e541efe25113005ef38f5f8448643902bc4f752368b7d8f0db32867c715fadbaf5592dfb4ffcc6bb54560d85537a309d06f60ea1fb13fc2c9d4a" size="12114390" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.13-13.0.14-linux-x86_64-ALL.xml deleted ===================================== @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<updates><update type="minor" displayVersion="13.0.14" appVersion="13.0.14" platformVersion="115.10.0" buildID="20240408204645" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-linux-x86_64-13.0.1…" hashFunction="SHA512" hashValue="40fda8d5eb0ddd6b5e516e686ba88f7ea57fb7b7c70868ca11f19b198911eb83acab8057f7cd2b107be46e5ab60dac8ac3e8df7f10f37d7309767830defb2f42" size="107492923" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-linux-x86_64--13.0.…" hashFunction="SHA512" hashValue="dfb8a3923a430e331a72d43fc1379a67cf996aeb1a05212e98192838cd2f8fe3988a8e058539da56838f1027583c6d619a7463e818dcdfc2b4a1b8fb473ab717" size="7843771" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.13-13.0.14-macos-ALL.xml deleted ===================================== @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<updates><update type="minor" displayVersion="13.0.14" appVersion="13.0.14" platformVersion="115.10.0" buildID="20240408204645" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-macos-13.0.14_ALL.m…" hashFunction="SHA512" hashValue="444609f144bbcc48b7226465078772e8d78d96fda177453aada2f75cb14edc9481dd13948f7313d953ce1ebb858f56884b938cddb7b9252de67db961c9bfc434" size="115543851" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-macos--13.0.13-13.0…" hashFunction="SHA512" hashValue="4165cfdcb22dd1238758f3bb2121ec69706d9e05ad02475f2d640a4616e38b24f927132f80ab816ce1681120843acde24ffbafc60d717e96755e72aa9fa8af83" size="12090823" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.13-13.0.14-windows-x86_64-ALL.xml deleted ===================================== @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<updates><update type="minor" displayVersion="13.0.14" appVersion="13.0.14" platformVersion="115.10.0" buildID="20240408204645" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-windows-x86_64-13.0…" hashFunction="SHA512" hashValue="bc0c7b7a2054a16f96832f44b9bd35ebb8486d08aebb7fc749f0bb24006830aa566d887bb253e6b297bfeb6ff442b56b18adb773309ba887fa3e12a1b9f25362" size="89463392" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-windows-x86_64--13.…" hashFunction="SHA512" hashValue="37386c86850adc40423ec5bb57341b3c0054316e58ecbb8066369174d8e89a301317746ee05d76b8db019cc9f17317537730f54146ee3ebe1e708ad3af8387ee" size="8495958" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.13-13.0.15-linux-x86_64-ALL.xml ===================================== @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<updates><update type="minor" displayVersion="13.0.15" appVersion="13.0.15" platformVersion="115.11.0" buildID="20240510150000" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-linux-x86_64-13.0.1…" hashFunction="SHA512" hashValue="323694bc40a76a24b4d69b9df390ac48606f90d227d80e0a97aab6288a847ae7bab65be67e906f9112dc2dea0e666572d619af8d579bf812b286e8877ec2332d" size="107673007" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-linux-x86_64--13.0.…" hashFunction="SHA512" hashValue="87039e194e0600d8b66de42ca34b6090287647265c17ba8d0cb7ca7f3f84451b71d2bdac46508660419fc1428824650bb004317cbd93113c354422dfb3132160" size="11566627" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.13-13.0.15-macos-ALL.xml ===================================== @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<updates><update type="minor" displayVersion="13.0.15" appVersion="13.0.15" platformVersion="115.11.0" buildID="20240510150000" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-macos-13.0.15_ALL.m…" hashFunction="SHA512" hashValue="57edeaafb75299f5aa44d0a20bbd4d7c79e0099e26dea85e643ea300bc2550f199e9c5d171a005798c9fef3f0a6972cfebd9253dbeb7f296500e0ff5a28b52e8" size="115725843" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-macos--13.0.13-13.0…" hashFunction="SHA512" hashValue="8e8ec045f0ba41efd6cf598a66a68817aa1a5e9004afe66cd3b34ecb0ca50db90735fcd9922327eb1883c022ff6e33cd46d8a5cd0fab614e2f25d73cebec161d" size="16016015" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.13-13.0.15-windows-x86_64-ALL.xml ===================================== @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<updates><update type="minor" displayVersion="13.0.15" appVersion="13.0.15" platformVersion="115.11.0" buildID="20240510150000" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-windows-x86_64-13.0…" hashFunction="SHA512" hashValue="6ad0c70f119de1df459387eaf98784be153dbe5533291c3e6c579593ca072c59c7a17f565d8b834f2a1ea5e02bb21305fff46b1ad73912dd472ecf12c20fe70d" size="89632164" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-windows-x86_64--13.…" hashFunction="SHA512" hashValue="96528211e5e70e8a6b05c6f66a990b29d99c39e17ff64000c78de9e7a431721dc067c62b690bddd1ac74051d6d1c53393d8cd700df641147463b61eaa91056f4" size="12116094" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.14-13.0.15-linux-x86_64-ALL.xml ===================================== @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<updates><update type="minor" displayVersion="13.0.15" appVersion="13.0.15" platformVersion="115.11.0" buildID="20240510150000" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-linux-x86_64-13.0.1…" hashFunction="SHA512" hashValue="323694bc40a76a24b4d69b9df390ac48606f90d227d80e0a97aab6288a847ae7bab65be67e906f9112dc2dea0e666572d619af8d579bf812b286e8877ec2332d" size="107673007" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-linux-x86_64--13.0.…" hashFunction="SHA512" hashValue="9407841bdc920a152f872a869c63a719a38a4557523b1f4717fa2f884d1d4bb80d171e8e5ca8edd20e37792902b81c7bb3b16011ef9c1ffa2e98955de313b30b" size="7766785" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.14-13.0.15-macos-ALL.xml ===================================== @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<updates><update type="minor" displayVersion="13.0.15" appVersion="13.0.15" platformVersion="115.11.0" buildID="20240510150000" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-macos-13.0.15_ALL.m…" hashFunction="SHA512" hashValue="57edeaafb75299f5aa44d0a20bbd4d7c79e0099e26dea85e643ea300bc2550f199e9c5d171a005798c9fef3f0a6972cfebd9253dbeb7f296500e0ff5a28b52e8" size="115725843" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-macos--13.0.14-13.0…" hashFunction="SHA512" hashValue="809e12f26b584be7de0f170003442dc1ce44695d875e7c06d29d9eb3d810992c7610a03fdd9abcff48bd65a643ff75397692c4529616d083c7aa62743e84d3a4" size="11648462" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.14-13.0.15-windows-x86_64-ALL.xml ===================================== @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<updates><update type="minor" displayVersion="13.0.15" appVersion="13.0.15" platformVersion="115.11.0" buildID="20240510150000" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-windows-x86_64-13.0…" hashFunction="SHA512" hashValue="6ad0c70f119de1df459387eaf98784be153dbe5533291c3e6c579593ca072c59c7a17f565d8b834f2a1ea5e02bb21305fff46b1ad73912dd472ecf12c20fe70d" size="89632164" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-windows-x86_64--13.…" hashFunction="SHA512" hashValue="2308dde306b3b03100beace98b6aa2f2aa1bbe5f3032307e8678ebada669881a718491c3af469400e4ac302f32b272efbb6f5f2a54694e69bd98ab3537783894" size="8252168" type="partial"></patch></update></updates> ===================================== update_1/release/13.0.14-linux-x86_64-ALL.xml deleted ===================================== @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<updates><update type="minor" displayVersion="13.0.14" appVersion="13.0.14" platformVersion="115.10.0" buildID="20240408204645" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-linux-x86_64-13.0.1…" hashFunction="SHA512" hashValue="40fda8d5eb0ddd6b5e516e686ba88f7ea57fb7b7c70868ca11f19b198911eb83acab8057f7cd2b107be46e5ab60dac8ac3e8df7f10f37d7309767830defb2f42" size="107492923" type="complete"></patch></update></updates> ===================================== update_1/release/13.0.14-macos-ALL.xml deleted ===================================== @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<updates><update type="minor" displayVersion="13.0.14" appVersion="13.0.14" platformVersion="115.10.0" buildID="20240408204645" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-macos-13.0.14_ALL.m…" hashFunction="SHA512" hashValue="444609f144bbcc48b7226465078772e8d78d96fda177453aada2f75cb14edc9481dd13948f7313d953ce1ebb858f56884b938cddb7b9252de67db961c9bfc434" size="115543851" type="complete"></patch></update></updates> ===================================== update_1/release/13.0.14-windows-x86_64-ALL.xml deleted ===================================== @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<updates><update type="minor" displayVersion="13.0.14" appVersion="13.0.14" platformVersion="115.10.0" buildID="20240408204645" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.14" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-windows-x86_64-13.0…" hashFunction="SHA512" hashValue="bc0c7b7a2054a16f96832f44b9bd35ebb8486d08aebb7fc749f0bb24006830aa566d887bb253e6b297bfeb6ff442b56b18adb773309ba887fa3e12a1b9f25362" size="89463392" type="complete"></patch></update></updates> ===================================== update_1/release/13.0.15-linux-x86_64-ALL.xml ===================================== @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<updates><update type="minor" displayVersion="13.0.15" appVersion="13.0.15" platformVersion="115.11.0" buildID="20240510150000" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-linux-x86_64-13.0.1…" hashFunction="SHA512" hashValue="323694bc40a76a24b4d69b9df390ac48606f90d227d80e0a97aab6288a847ae7bab65be67e906f9112dc2dea0e666572d619af8d579bf812b286e8877ec2332d" size="107673007" type="complete"></patch></update></updates> ===================================== update_1/release/13.0.15-macos-ALL.xml ===================================== @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<updates><update type="minor" displayVersion="13.0.15" appVersion="13.0.15" platformVersion="115.11.0" buildID="20240510150000" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-macos-13.0.15_ALL.m…" hashFunction="SHA512" hashValue="57edeaafb75299f5aa44d0a20bbd4d7c79e0099e26dea85e643ea300bc2550f199e9c5d171a005798c9fef3f0a6972cfebd9253dbeb7f296500e0ff5a28b52e8" size="115725843" type="complete"></patch></update></updates> ===================================== update_1/release/13.0.15-windows-x86_64-ALL.xml ===================================== @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<updates><update type="minor" displayVersion="13.0.15" appVersion="13.0.15" platformVersion="115.11.0" buildID="20240510150000" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.15" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-windows-x86_64-13.0…" hashFunction="SHA512" hashValue="6ad0c70f119de1df459387eaf98784be153dbe5533291c3e6c579593ca072c59c7a17f565d8b834f2a1ea5e02bb21305fff46b1ad73912dd472ecf12c20fe70d" size="89632164" type="complete"></patch></update></updates> ===================================== update_1/release/download-linux-x86_64.json ===================================== @@ -1 +1 @@ -{"binary":"https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-linux-x86_64-13.0.1…","git_tag":"mb-13.0.14-build1","sig":"https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-linux-x86_64-13.0.1…","version":"13.0.14"} \ No newline at end of file +{"binary":"https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-linux-x86_64-13.0.1…","git_tag":"mb-13.0.15-build1","sig":"https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-linux-x86_64-13.0.1…","version":"13.0.15"} \ No newline at end of file ===================================== update_1/release/download-macos.json ===================================== @@ -1 +1 @@ -{"binary":"https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-macos-13.0.14.dmg","git_tag":"mb-13.0.14-build1","sig":"https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-macos-13.0.14.dmg.a…","version":"13.0.14"} \ No newline at end of file +{"binary":"https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-macos-13.0.15.dmg","git_tag":"mb-13.0.15-build1","sig":"https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-macos-13.0.15.dmg.a…","version":"13.0.15"} \ No newline at end of file ===================================== update_1/release/download-windows-x86_64.json ===================================== @@ -1 +1 @@ -{"binary":"https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-windows-x86_64-port…","git_tag":"mb-13.0.14-build1","sig":"https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-windows-x86_64-port…","version":"13.0.14"} \ No newline at end of file +{"binary":"https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-windows-x86_64-port…","git_tag":"mb-13.0.15-build1","sig":"https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-windows-x86_64-port…","version":"13.0.15"} \ No newline at end of file ===================================== update_1/release/downloads.json ===================================== @@ -1 +1 @@ -{"downloads":{"linux-x86_64":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-linux-x86_64-13.0.1…","sig":"https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-linux-x86_64-13.0.1…"}},"macos":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-macos-13.0.14.dmg","sig":"https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-macos-13.0.14.dmg.a…"}},"win64":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-windows-x86_64-port…","sig":"https://cdn.mullvad.net/browser/13.0.14/mullvad-browser-windows-x86_64-port…"}}},"tag":"mb-13.0.14-build1","version":"13.0.14"} \ No newline at end of file +{"downloads":{"linux-x86_64":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-linux-x86_64-13.0.1…","sig":"https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-linux-x86_64-13.0.1…"}},"macos":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-macos-13.0.15.dmg","sig":"https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-macos-13.0.15.dmg.a…"}},"win64":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-windows-x86_64-port…","sig":"https://cdn.mullvad.net/browser/13.0.15/mullvad-browser-windows-x86_64-port…"}}},"tag":"mb-13.0.15-build1","version":"13.0.15"} \ No newline at end of file View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser-update-respo… -- This project does not include diff previews in email notifications. 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
0 0
[Git][tpo/applications/firefox-android] Pushed new tag firefox-android-115.2.1-13.0-1-build17
by Pier Angelo Vendrame (@pierov) 13 May '24

13 May '24
Pier Angelo Vendrame pushed new tag firefox-android-115.2.1-13.0-1-build17 at The Tor Project / Applications / firefox-android -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/tree/firef… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser] Pushed new tag tor-browser-115.11.0esr-13.0-1-build3
by Pier Angelo Vendrame (@pierov) 13 May '24

13 May '24
Pier Angelo Vendrame pushed new tag tor-browser-115.11.0esr-13.0-1-build3 at The Tor Project / Applications / Tor Browser -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/tor-brows… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-115.11.0esr-13.0-1] 2 commits: fixup! Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView
by Pier Angelo Vendrame (@pierov) 13 May '24

13 May '24
Pier Angelo Vendrame pushed to branch mullvad-browser-115.11.0esr-13.0-1 at The Tor Project / Applications / Mullvad Browser Commits: 16ff0199 by Pier Angelo Vendrame at 2024-05-13T11:49:04+02:00 fixup! Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView Revert &quot;Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView&quot; This reverts commit ff97b6fb06850784785e6993c256bef315b2525f. - - - - - 9d8bcd60 by Pier Angelo Vendrame at 2024-05-13T11:49:06+02:00 Bug 42562: Normalized the Accepted Languages on Android. The OS language might be outside the list of actually supported languages and it might leak the user&#39;s region. Therefore, we force the locale reported in Accept-Language to match one we support with translations, even when it means using a not exact region tag. - - - - - 1 changed file: - mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java Changes: ===================================== mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java ===================================== @@ -22,7 +22,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.Locale; import org.mozilla.gecko.EventDispatcher; import org.mozilla.gecko.GeckoSystemStateListener; @@ -455,6 +456,16 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { return this; } + public @NonNull Builder supportedLocales(final Collection<String> locales) { + getSettings().mSupportedLocales.clear(); + for (String tag : locales) { + Locale locale = Locale.forLanguageTag(tag); + getSettings().mSupportedLocales.put(locale, locale); + getSettings().mSupportedLocales.put(new Locale(locale.getLanguage()), locale); + } + return this; + } + /** * Sets whether we should spoof locale to English for webpages. * @@ -539,6 +550,7 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { /* package */ int mScreenHeightOverride; /* package */ Class<? extends Service> mCrashHandler; /* package */ String[] mRequestedLocales; + /* package */ HashMap<Locale, Locale> mSupportedLocales = new HashMap<>(); /* package */ RuntimeTelemetry.Proxy mTelemetryProxy; /** @@ -595,6 +607,7 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { mRequestedLocales = settings.mRequestedLocales; mConfigFilePath = settings.mConfigFilePath; mTelemetryProxy = settings.mTelemetryProxy; + mSupportedLocales = settings.mSupportedLocales; } /* package */ void commit() { @@ -803,30 +816,39 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { EventDispatcher.getInstance().dispatch("GeckoView:SetLocale", data); } + private Locale getLocaleIfSupported(String tag) { + Locale exact = Locale.forLanguageTag(tag); + if (mSupportedLocales.containsKey(exact)) { + return exact; + } + Locale fallback = new Locale(exact.getLanguage()); + return mSupportedLocales.get(fallback); + } + private String computeAcceptLanguages() { - final ArrayList<String> locales = new ArrayList<String>(); - - // In Desktop, these are defined in the `intl.accept_languages` localized property. - // At some point we should probably use the same values here, but for now we use a simple - // strategy which will hopefully result in reasonable acceptLanguage values. - if (mRequestedLocales != null && mRequestedLocales.length > 0) { - String locale = mRequestedLocales[0].toLowerCase(Locale.ROOT); - // No need to include `en-us` twice. - if (!locale.equals("en-us")) { - locales.add(locale); - if (locale.contains("-")) { - String lang = locale.split("-")[0]; - // No need to include `en` twice. - if (!lang.equals("en")) { - locales.add(lang); - } + Locale locale = null; + if (mRequestedLocales != null) { + for (String tag : mRequestedLocales) { + locale = getLocaleIfSupported(tag); + if (locale != null) { + break; } } } - locales.add("en-us"); - locales.add("en"); - - return TextUtils.join(",", locales); + if (locale == null) { + for (final String tag : getDefaultLocales()) { + locale = getLocaleIfSupported(tag); + if (locale != null) { + break; + } + } + } + String acceptLanguages = locale != null ? locale.toString().replace('_', '-') : "en-US"; + if (acceptLanguages.equals("en-US")) { + // For consistency with spoof English. + acceptLanguages += ", en"; + } + return acceptLanguages; } private static String[] getDefaultLocales() { View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/0d… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/0d… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.0-1] Bug 42652: Pass the list of supported languages to GeckoView.
by Pier Angelo Vendrame (@pierov) 13 May '24

13 May '24
Pier Angelo Vendrame pushed to branch firefox-android-115.2.1-13.0-1 at The Tor Project / Applications / firefox-android Commits: f7d9fabc by Pier Angelo Vendrame at 2024-05-13T11:46:53+02:00 Bug 42652: Pass the list of supported languages to GeckoView. It will be used to prevent leaks about regional preferences. - - - - - 1 changed file: - fenix/app/src/main/java/org/mozilla/fenix/gecko/GeckoProvider.kt Changes: ===================================== fenix/app/src/main/java/org/mozilla/fenix/gecko/GeckoProvider.kt ===================================== @@ -14,6 +14,7 @@ import mozilla.components.concept.storage.LoginsStorage import mozilla.components.lib.crash.handler.CrashHandlerService import mozilla.components.service.sync.autofill.GeckoCreditCardsAddressesStorageDelegate import mozilla.components.service.sync.logins.GeckoLoginStorageDelegate +import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.Config import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings @@ -58,6 +59,7 @@ object GeckoProvider { .contentBlocking(policy.toContentBlockingSetting()) .debugLogging(Config.channel.isDebug || context.components.settings.enableGeckoLogs) .aboutConfigEnabled(Config.channel.isBeta || Config.channel.isNightlyOrDebug) + .supportedLocales(BuildConfig.SUPPORTED_LOCALE_ARRAY.toList()) .build() val settings = context.components.settings View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/f7d… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/f7d… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.0-1] 2 commits: fixup! Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView
by Pier Angelo Vendrame (@pierov) 13 May '24

13 May '24
Pier Angelo Vendrame pushed to branch tor-browser-115.11.0esr-13.0-1 at The Tor Project / Applications / Tor Browser Commits: eb5afe56 by Pier Angelo Vendrame at 2024-05-13T11:45:28+02:00 fixup! Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView Revert &quot;Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView&quot; This reverts commit ff97b6fb06850784785e6993c256bef315b2525f. - - - - - 970e6b90 by Pier Angelo Vendrame at 2024-05-13T11:45:30+02:00 Bug 42562: Normalized the Accepted Languages on Android. The OS language might be outside the list of actually supported languages and it might leak the user&#39;s region. Therefore, we force the locale reported in Accept-Language to match one we support with translations, even when it means using a not exact region tag. - - - - - 1 changed file: - mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java Changes: ===================================== mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java ===================================== @@ -22,7 +22,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.Locale; import org.mozilla.gecko.EventDispatcher; import org.mozilla.gecko.GeckoSystemStateListener; @@ -455,6 +456,16 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { return this; } + public @NonNull Builder supportedLocales(final Collection<String> locales) { + getSettings().mSupportedLocales.clear(); + for (String tag : locales) { + Locale locale = Locale.forLanguageTag(tag); + getSettings().mSupportedLocales.put(locale, locale); + getSettings().mSupportedLocales.put(new Locale(locale.getLanguage()), locale); + } + return this; + } + /** * Sets whether we should spoof locale to English for webpages. * @@ -539,6 +550,7 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { /* package */ int mScreenHeightOverride; /* package */ Class<? extends Service> mCrashHandler; /* package */ String[] mRequestedLocales; + /* package */ HashMap<Locale, Locale> mSupportedLocales = new HashMap<>(); /* package */ RuntimeTelemetry.Proxy mTelemetryProxy; /** @@ -595,6 +607,7 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { mRequestedLocales = settings.mRequestedLocales; mConfigFilePath = settings.mConfigFilePath; mTelemetryProxy = settings.mTelemetryProxy; + mSupportedLocales = settings.mSupportedLocales; } /* package */ void commit() { @@ -803,30 +816,39 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { EventDispatcher.getInstance().dispatch("GeckoView:SetLocale", data); } + private Locale getLocaleIfSupported(String tag) { + Locale exact = Locale.forLanguageTag(tag); + if (mSupportedLocales.containsKey(exact)) { + return exact; + } + Locale fallback = new Locale(exact.getLanguage()); + return mSupportedLocales.get(fallback); + } + private String computeAcceptLanguages() { - final ArrayList<String> locales = new ArrayList<String>(); - - // In Desktop, these are defined in the `intl.accept_languages` localized property. - // At some point we should probably use the same values here, but for now we use a simple - // strategy which will hopefully result in reasonable acceptLanguage values. - if (mRequestedLocales != null && mRequestedLocales.length > 0) { - String locale = mRequestedLocales[0].toLowerCase(Locale.ROOT); - // No need to include `en-us` twice. - if (!locale.equals("en-us")) { - locales.add(locale); - if (locale.contains("-")) { - String lang = locale.split("-")[0]; - // No need to include `en` twice. - if (!lang.equals("en")) { - locales.add(lang); - } + Locale locale = null; + if (mRequestedLocales != null) { + for (String tag : mRequestedLocales) { + locale = getLocaleIfSupported(tag); + if (locale != null) { + break; } } } - locales.add("en-us"); - locales.add("en"); - - return TextUtils.join(",", locales); + if (locale == null) { + for (final String tag : getDefaultLocales()) { + locale = getLocaleIfSupported(tag); + if (locale != null) { + break; + } + } + } + String acceptLanguages = locale != null ? locale.toString().replace('_', '-') : "en-US"; + if (acceptLanguages.equals("en-US")) { + // For consistency with spoof English. + acceptLanguages += ", en"; + } + return acceptLanguages; } private static String[] getDefaultLocales() { View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/f87ae3… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/f87ae3… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] Bug 1885171 - set private keyboard on Javascript prompts in private browsing...
by Pier Angelo Vendrame (@pierov) 13 May '24

13 May '24
Pier Angelo Vendrame pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: 8e9aca94 by Titouan Thibaud at 2024-05-13T09:31:35+02:00 Bug 1885171 - set private keyboard on Javascript prompts in private browsing r=android-reviewers,boek Differential Revision: https://phabricator.services.mozilla.com/D208135 - - - - - 3 changed files: - android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/PromptFeature.kt - android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragment.kt - android-components/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragmentTest.kt Changes: ===================================== android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/PromptFeature.kt ===================================== @@ -17,6 +17,7 @@ import kotlinx.coroutines.flow.map import mozilla.components.browser.state.action.ContentAction import mozilla.components.browser.state.selector.findTabOrCustomTab import mozilla.components.browser.state.selector.findTabOrCustomTabOrSelectedTab +import mozilla.components.browser.state.selector.selectedTab import mozilla.components.browser.state.state.SessionState import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.engine.prompt.Choice @@ -772,6 +773,7 @@ class PromptFeature private constructor( inputLabel, inputValue, promptAbuserDetector.areDialogsBeingAbused(), + store.state.selectedTab?.content?.private == true, ) } } ===================================== android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragment.kt ===================================== @@ -11,14 +11,17 @@ import android.os.Bundle import android.text.Editable import android.text.TextWatcher import android.view.LayoutInflater +import android.view.inputmethod.EditorInfo.IME_NULL import android.widget.EditText import android.widget.TextView import androidx.appcompat.app.AlertDialog +import androidx.core.view.inputmethod.EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING import mozilla.components.feature.prompts.R private const val KEY_USER_EDIT_TEXT = "KEY_USER_EDIT_TEXT" private const val KEY_LABEL_INPUT = "KEY_LABEL_INPUT" private const val KEY_DEFAULT_INPUT_VALUE = "KEY_DEFAULT_INPUT_VALUE" +private const val KEY_PRIVATE = "KEY_PRIVATE" /** * [androidx.fragment.app.DialogFragment] implementation to display a @@ -37,6 +40,11 @@ internal class TextPromptDialogFragment : AbstractPromptTextDialogFragment(), Te */ internal val labelInput: String? by lazy { safeArguments.getString(KEY_LABEL_INPUT) } + /** + * Tells if the Dialog is shown from private browsing + */ + internal val private: Boolean? by lazy { safeArguments.getBoolean(KEY_PRIVATE) } + private var userSelectionEditText: String get() = safeArguments.getString(KEY_USER_EDIT_TEXT, defaultInputValue) set(value) { @@ -72,6 +80,7 @@ internal class TextPromptDialogFragment : AbstractPromptTextDialogFragment(), Te label.text = labelInput editText.setText(defaultInputValue) editText.addTextChangedListener(this) + editText.imeOptions = if (private == true) IME_FLAG_NO_PERSONALIZED_LEARNING else IME_NULL addCheckBoxIfNeeded(view) @@ -99,6 +108,7 @@ internal class TextPromptDialogFragment : AbstractPromptTextDialogFragment(), Te * @param hasShownManyDialogs tells if this [sessionId] has shown many dialogs * in a short period of time, if is true a checkbox will be part of the dialog, for the user * to choose if wants to prevent this [sessionId] continuing showing dialogs. + * @param private tells if this dialog is triggered from private browsing */ @Suppress("LongParameterList") fun newInstance( @@ -109,6 +119,7 @@ internal class TextPromptDialogFragment : AbstractPromptTextDialogFragment(), Te inputLabel: String, defaultInputValue: String, hasShownManyDialogs: Boolean, + private: Boolean, ): TextPromptDialogFragment { val fragment = TextPromptDialogFragment() val arguments = fragment.arguments ?: Bundle() @@ -121,6 +132,7 @@ internal class TextPromptDialogFragment : AbstractPromptTextDialogFragment(), Te putString(KEY_LABEL_INPUT, inputLabel) putString(KEY_DEFAULT_INPUT_VALUE, defaultInputValue) putBoolean(KEY_MANY_ALERTS, hasShownManyDialogs) + putBoolean(KEY_PRIVATE, private) } fragment.arguments = arguments ===================================== android-components/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragmentTest.kt ===================================== @@ -6,9 +6,11 @@ package mozilla.components.feature.prompts.dialog import android.content.DialogInterface.BUTTON_POSITIVE import android.os.Looper.getMainLooper +import android.view.inputmethod.EditorInfo.IME_NULL import android.widget.CheckBox import android.widget.TextView import androidx.appcompat.app.AlertDialog +import androidx.core.view.inputmethod.EditorInfoCompat import androidx.core.view.isVisible import androidx.test.ext.junit.runners.AndroidJUnit4 import mozilla.components.feature.prompts.R.id @@ -41,7 +43,7 @@ class TextPromptDialogFragmentTest { @Test fun `build dialog`() { val fragment = spy( - TextPromptDialogFragment.newInstance("sessionId", "uid", true, "title", "label", "defaultValue", true), + TextPromptDialogFragment.newInstance("sessionId", "uid", true, "title", "label", "defaultValue", true, false), ) doReturn(appCompatContext).`when`(fragment).requireContext() @@ -73,12 +75,14 @@ class TextPromptDialogFragmentTest { inputValue.text = "NewValue" assertEquals(inputValue.text.toString(), "NewValue") + + assertEquals(IME_NULL, inputValue.imeOptions) } @Test fun `TextPrompt with hasShownManyDialogs equals false should not have a checkbox`() { val fragment = spy( - TextPromptDialogFragment.newInstance("sessionId", "uid", false, "title", "label", "defaultValue", false), + TextPromptDialogFragment.newInstance("sessionId", "uid", false, "title", "label", "defaultValue", false, false), ) doReturn(appCompatContext).`when`(fragment).requireContext() @@ -95,7 +99,7 @@ class TextPromptDialogFragmentTest { @Test fun `Clicking on positive button notifies the feature`() { val fragment = spy( - TextPromptDialogFragment.newInstance("sessionId", "uid", true, "title", "label", "defaultValue", false), + TextPromptDialogFragment.newInstance("sessionId", "uid", true, "title", "label", "defaultValue", false, false), ) fragment.feature = mockFeature @@ -115,7 +119,7 @@ class TextPromptDialogFragmentTest { @Test fun `After checking no more dialogs checkbox feature onNoMoreDialogsChecked must be called`() { val fragment = spy( - TextPromptDialogFragment.newInstance("sessionId", "uid", false, "title", "label", "defaultValue", true), + TextPromptDialogFragment.newInstance("sessionId", "uid", false, "title", "label", "defaultValue", true, false), ) fragment.feature = mockFeature @@ -139,7 +143,7 @@ class TextPromptDialogFragmentTest { @Test fun `touching outside of the dialog must notify the feature onCancel`() { val fragment = spy( - TextPromptDialogFragment.newInstance("sessionId", "uid", true, "title", "label", "defaultValue", true), + TextPromptDialogFragment.newInstance("sessionId", "uid", true, "title", "label", "defaultValue", true, false), ) fragment.feature = mockFeature @@ -150,4 +154,19 @@ class TextPromptDialogFragmentTest { verify(mockFeature).onCancel("sessionId", "uid") } + + @Test + fun `when TextPromptDialogFragment is created in private mode then keyboard is in private mode`() { + val fragment = spy( + TextPromptDialogFragment.newInstance("sessionId", "uid", true, "title", "label", "defaultValue", true, true), + ) + + fragment.feature = mockFeature + doReturn(appCompatContext).`when`(fragment).requireContext() + + val dialog = fragment.onCreateDialog(null).also { it.show() } + val editText = dialog.findViewById<TextView>(id.input_value) + + assertEquals(EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING, editText.imeOptions) + } } View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/8e9… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/8e9… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build] Pushed new tag mb-13.0.15-build1
by richard (@richard) 10 May '24

10 May '24
richard pushed new tag mb-13.0.15-build1 at The Tor Project / Applications / tor-browser-build -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/tree/mb-… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build] Pushed new tag tbb-13.0.15-build1
by richard (@richard) 10 May '24

10 May '24
richard pushed new tag tbb-13.0.15-build1 at The Tor Project / Applications / tor-browser-build -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/tree/tbb… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][maint-13.0] Bug 41119, 41120: Prepare Tor and Mullvad Browser Stable 13.0.15
by richard (@richard) 10 May '24

10 May '24
richard pushed to branch maint-13.0 at The Tor Project / Applications / tor-browser-build Commits: 73306567 by Richard Pospesel at 2024-05-10T20:32:51+00:00 Bug 41119, 41120: Prepare Tor and Mullvad Browser Stable 13.0.15 - - - - - 11 changed files: - projects/browser/Bundle-Data/Docs-MB/ChangeLog.txt - projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt - projects/browser/allowed_addons.json - projects/firefox-android/config - projects/firefox/config - projects/geckoview/config - projects/go/config - projects/manual/config - projects/translation/config - projects/zstd/config - rbm.conf Changes: ===================================== projects/browser/Bundle-Data/Docs-MB/ChangeLog.txt ===================================== @@ -1,3 +1,49 @@ +Mullvad Browser 13.0.15 - May 15 2024 + * All Platforms + * Updated Firefox to 115.11.0esr + * Bug 296: Rebase Mullvad Browser stable onto 115.10.0esr [mullvad-browser] + * Bug 42391: IndexDB's private directory not removed on browser shutdown in global private browsing mode [tor-browser] + * Bug 42532: Use the HomePage module for new identity checks [tor-browser] + * Bug 42565: Backport Android and desktop security fixes from Firefox 126 [tor-browser] + * Build System + * All Platforms + * Bug 41122: Add release date to rbm.conf [tor-browser-build] + * macOS + * Bug 42535: mac: app change to ja doesn't apply ja translations to most (all?) chrome [tor-browser] + +Mullvad Browser 13.5a7 - April 25 2024 + * All Platforms + * Updated Firefox to 115.10.0esr + * Updated uBlock Origin to 1.57.2 + * Bug 283: New identity complains about about:mullvad-browser [mullvad-browser] + * Bug 289: The Letterboxing>Content Alignment heading doesn't follow the Firefox design document capitalization [mullvad-browser] + * Bug 291: Rebase Mullvad Browser Alpha onto 115.10.0esr [mullvad-browser] + * Bug 40919: Consider dropping protection against line-height introduced in #23104 [tor-browser] + * Bug 42172: browser.startup.homepage and TOR_DEFAULT_HOMEPAGE are ignored for the new window opened by New Identity [tor-browser] + * Bug 42192: Correctly round new windows when bookmarks toolbar is set to "Only Show on New Tab" [tor-browser] + * Bug 42315: compat: why is eventCounts undefined? [tor-browser] + * Bug 42490: Install svg from branding theme to browser/chrome/icons/default [tor-browser] + * Bug 42500: When startup window is maximized per letterboxing.rememberSize on startup, the restore button shrinks it to its minimum size [tor-browser] + * Bug 42520: Correctly record new initial window size after auto-shrinking [tor-browser] + * Bug 42529: Try not to spoof system-ui in contexts exempt from RFP [tor-browser] + * Bug 42532: Use the HomePage module for new identity checks [tor-browser] + * Bug 42537: Move Fluent files from "browser" to "toolkit" [tor-browser] + * Windows + * Bug 41901: windows: FontSubstitutes can leak system locale [tor-browser] + * Linux + * Bug 41112: Fix indentation of projects/browser/RelativeLink/start-browser [tor-browser-build] + * Build System + * All Platforms + * Bug 282: Move `--disable-eme` to OS- and architecture-specific mozconfigs [mullvad-browser] + * Bug 42519: Update the profile directory patch to check both for `system-install` and for `is-packaged-app` file [tor-browser] + * Bug 41122: Add release date to rbm.conf [tor-browser-build] + * macOS + * Bug 42535: mac: app change to ja doesn't apply ja translations to most (all?) chrome [tor-browser] + * Bug 41124: Since TB/MB 13.5a5 macos signed installers contain all .DS_Store [tor-browser-build] + * Linux + * Bug 42491: Add mozconfig-linux-aarch64 [tor-browser] + * Bug 41083: Make deb package for Mullvad Browser [tor-browser-build] + Mullvad Browser 13.0.14 - April 16 2024 * All Platforms * Updated Firefox to 115.10.0esr ===================================== projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt ===================================== @@ -1,3 +1,84 @@ +Tor Browser 13.0.15 - May 14 2024 + * All Platforms + * Bug 42559: Rebase Tor Browser stable onto 115.11.0esr [tor-browser] + * Windows + macOS + Linux + * Updated Firefox to 115.11.0esr + * Bug 42391: IndexDB's private directory not removed on browser shutdown in global private browsing mode [tor-browser] + * Bug 42532: Use the HomePage module for new identity checks [tor-browser] + * Bug 42557: Fix regression in Onion Services authentication prompt focus [tor-browser] + * Bug 42565: Backport Android and desktop security fixes from Firefox 126 [tor-browser] + * Android + * Updated GeckoView to 115.11.0esr + * Bug 42195: Fix "What's new" URL to direct to latest version [tor-browser] + * Bug 42562: Restrict the accepted languages to the ones whose localization is available [tor-browser] + * Build System + * macOS + * Bug 42535: mac: app change to ja doesn't apply ja translations to most (all?) chrome [tor-browser] + +Tor Browser 13.5a7 - April 25 2024 + * All Platforms + * Updated Tor to 0.4.8.11 + * Bug 40919: Consider dropping protection against line-height introduced in #23104 [tor-browser] + * Bug 42315: compat: why is eventCounts undefined? [tor-browser] + * Bug 42476: Only allow Lox (invites) in alpha and nightly builds [tor-browser] + * Bug 42479: Switch from localized strings to error codes in TorConnect errors [tor-browser] + * Bug 42512: Rebase Tor Browser alpha onto 115.10.0esr [tor-browser] + * Bug 42521: Remove unused onboarding strings [tor-browser] + * Bug 42529: Try not to spoof system-ui in contexts exempt from RFP [tor-browser] + * Bug 42537: Move Fluent files from "browser" to "toolkit" [tor-browser] + * Bug 42538: Move onion icons to toolkit [tor-browser] + * Bug 41111: Use Lyrebird to provide WebTunnel PT Client [tor-browser-build] + * Windows + macOS + Linux + * Updated Firefox to 115.10.0esr + * Bug 40843: Add a working state to the Internet test button in connection settings [tor-browser] + * Bug 41622: Convert onion site errors to the new neterror template [tor-browser] + * Bug 41966: Cannot remove locales from the locale alternatives list [tor-browser] + * Bug 42192: Correctly round new windows when bookmarks toolbar is set to "Only Show on New Tab" [tor-browser] + * Bug 42202: Fluent migration: crypto safety [tor-browser] + * Bug 42206: Fluent migration: about:rulesets [tor-browser] + * Bug 42207: Fluent migration: preferences [tor-browser] + * Bug 42210: Fluent migration: download warning [tor-browser] + * Bug 42457: Loading icon for bridge pass (Lox) invites [tor-browser] + * Bug 42489: Lox module notifications [tor-browser] + * Bug 42490: Install svg from branding theme to browser/chrome/icons/default [tor-browser] + * Bug 42496: Moat refresh bug [tor-browser] + * Bug 42500: When startup window is maximized per letterboxing.rememberSize on startup, the restore button shrinks it to its minimum size [tor-browser] + * Bug 42504: TB Bookmarks: Add the Tor forum .onion to the bookmarks [tor-browser] + * Bug 42510: SETCONF Tor control protocol command should not be used when system Tor is configured / TOR_SKIP_LAUNCH=1 is not honored [tor-browser] + * Bug 42511: false positive message: browser tab bar shows "Not connected" even though connected in a system Tor etc. context [tor-browser] + * Bug 42520: Correctly record new initial window size after auto-shrinking [tor-browser] + * Bug 42532: Use the HomePage module for new identity checks [tor-browser] + * Bug 42533: Add Lox notification for activeLoxId [tor-browser] + * Bug 42540: Fix gNetworkStatus.deinint typo [tor-browser] + * Bug 289: The Letterboxing>Content Alignment heading doesn't follow the Firefox design document capitalization [mullvad-browser] + * Windows + * Bug 41901: windows: FontSubstitutes can leak system locale [tor-browser] + * Linux + * Bug 41112: Fix indentation of projects/browser/RelativeLink/start-browser [tor-browser-build] + * Android + * Updated GeckoView to 115.10.0esr + * Updated zstd to 1.5.6 + * Bug 42017: TBA13: system/widget font tests: font-family not returned in getComputedStyle [tor-browser] + * Bug 42195: Fix "What's new" URL to direct to latest version [tor-browser] + * Bug 42486: firefox-android bridge settings sometimes dont save [tor-browser] + * Bug 42522: The quick connect switch on Android seems too much on the right side [tor-browser] + * Build System + * All Platforms + * Updated Go to 1.21.9 + * Bug 42516: Make tb-dev worktree-compatible [tor-browser] + * Bug 41122: Add release date to rbm.conf [tor-browser-build] + * Windows + macOS + Linux + * Bug 42501: Move `--disable-eme` to OS- and architecture-specific mozconfigs [tor-browser] + * Bug 42519: Update the profile directory patch to check both for `system-install` and for `is-packaged-app` file [tor-browser] + * macOS + * Bug 42535: mac: app change to ja doesn't apply ja translations to most (all?) chrome [tor-browser] + * Bug 41124: Since TB/MB 13.5a5 macos signed installers contain all .DS_Store [tor-browser-build] + * Linux + * Bug 42491: Add mozconfig-linux-aarch64 [tor-browser] + * Android + * Bug 40992: Updated torbrowser_version number is not enough to change firefox-android versionCode number [tor-browser-build] + * Bug 41127: Android testbuilds fail because of the too early MOZ_BUILD_DATE [tor-browser-build] + Tor Browser 13.0.14 - April 16 2024 * All Platforms * Updated Tor to 0.4.8.11 ===================================== projects/browser/allowed_addons.json ===================================== Binary files a/projects/browser/allowed_addons.json and b/projects/browser/allowed_addons.json differ ===================================== projects/firefox-android/config ===================================== @@ -16,7 +16,7 @@ container: var: fenix_version: 115.2.1 browser_branch: 13.0-1 - browser_build: 15 + browser_build: 16 variant: Beta # This should be updated when the list of gradle dependencies is changed. gradle_dependencies_version: 1 ===================================== projects/firefox/config ===================================== @@ -14,11 +14,11 @@ container: use_container: 1 var: - firefox_platform_version: 115.10.0 + firefox_platform_version: 115.11.0 firefox_version: '[% c("var/firefox_platform_version") %]esr' browser_series: '13.0' browser_branch: '[% c("var/browser_series") %]-1' - browser_build: 1 + browser_build: 2 branding_directory_prefix: 'tb' copyright_year: '[% exec("git show -s --format=%ci").remove("-.*") %]' nightly_updates_publish_dir: '[% c("var/nightly_updates_publish_dir_prefix") %]nightly-[% c("var/osname") %]' ===================================== projects/geckoview/config ===================================== @@ -14,9 +14,9 @@ container: use_container: 1 var: - geckoview_version: 115.10.0esr + geckoview_version: 115.11.0esr browser_branch: 13.0-1 - browser_build: 1 + browser_build: 2 copyright_year: '[% exec("git show -s --format=%ci").remove("-.*") %]' gitlab_project: https://gitlab.torproject.org/tpo/applications/tor-browser git_commit: '[% exec("git rev-parse HEAD") %]' ===================================== projects/go/config ===================================== @@ -1,5 +1,5 @@ # vim: filetype=yaml sw=2 -version: '[% IF c("var/use_go_1_20") %]1.20.14[% ELSE %]1.21.9[% END %]' +version: '[% IF c("var/use_go_1_20") %]1.20.14[% ELSE %]1.21.10[% END %]' filename: '[% project %]-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]' container: use_container: 1 @@ -121,7 +121,7 @@ input_files: enable: '[% ! c("var/linux") %]' - URL: 'https://go.dev/dl/go[% c("version") %].src.tar.gz' name: go - sha256sum: 58f0c5ced45a0012bce2ff7a9df03e128abcc8818ebabe5027bb92bafe20e421 + sha256sum: 900e0afe8900c1ee65a8a8c4f0c5a3ca02dcf85c1d1cb13a652be22c21399394 enable: '[% !c("var/use_go_1_20") %]' - URL: 'https://go.dev/dl/go[% c("version") %].src.tar.gz' name: go ===================================== projects/manual/config ===================================== @@ -1,7 +1,7 @@ # vim: filetype=yaml sw=2 # To update, see doc/how-to-update-the-manual.txt # Remember to update also the package's hash, with the version! -version: 150100 +version: 167329 filename: 'manual-[% c("version") %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]' container: use_container: 1 @@ -23,6 +23,6 @@ input_files: - project: container-image - URL: 'https://build-sources.tbb.torproject.org/manual_[% c("version") %].zip' name: manual - sha256sum: 039bdb04f97b803f0db2f12a6ba0a03a2091e8d8bd794e178c297e571f04eb7f + sha256sum: b9a2b219018cb41a1c524c9105d75fcec11861ecafdd00a49b191bad09dc8f49 - filename: packagemanual.py name: package_script ===================================== projects/translation/config ===================================== @@ -12,13 +12,13 @@ compress_tar: 'gz' steps: base-browser: base-browser: '[% INCLUDE build %]' - git_hash: d31e6b16c372e2eb235c4f2b0eae0b573a5515ba + git_hash: a28a8b2cb9e207d12fca11181818c0a0694b56af targets: nightly: git_hash: 'base-browser' tor-browser: tor-browser: '[% INCLUDE build %]' - git_hash: d37455a56f966b4f87f5f326b534a91f71fd5c88 + git_hash: e03ffdea5b74ad280616dccd21744cba7b2d4565 targets: nightly: git_hash: 'tor-browser' @@ -32,7 +32,7 @@ steps: fenix: '[% INCLUDE build %]' # We need to bump the commit before releasing but just pointing to a branch # might cause too much rebuidling of the Firefox part. - git_hash: aa60141af05cd3cabf2479de52da46d436822d61 + git_hash: d4f4bc1c8cb788450b17801edc0c22fc76f3b16c compress_tar: 'zst' targets: nightly: ===================================== projects/zstd/config ===================================== @@ -1,7 +1,7 @@ # vim: filetype=yaml sw=2 -version: 1.4.8 +version: 1.5.6 git_url: https://github.com/facebook/zstd.git -git_hash: 97a3da1df009d4dc67251de0c4b1c9d7fe286fc1 +git_hash: 794ea1b0afca0f020f4e57b6732332231fb23c70 filename: '[% project %]-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]' container: ===================================== rbm.conf ===================================== @@ -73,14 +73,13 @@ buildconf: git_signtag_opt: '-s' var: - torbrowser_version: '13.0.14' + torbrowser_version: '13.0.15' torbrowser_build: 'build1' torbrowser_incremental_from: + - '13.0.14' - '13.0.13' - '13.0.12' - - '[% IF c("var/tor-browser") %]13.0.11[% END %]' - - '[% IF c("var/mullvad-browser") %]13.0.10[% END %]' - browser_release_date: '2024/04/16 15:00:00' + browser_release_date: '2024/05/10 15:00:00' browser_release_date_timestamp: '[% USE date; date.format(c("var/browser_release_date"), "%s") %]' updater_enabled: 1 build_mar: 1 View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/7… -- This project does not include diff previews in email notifications. 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
0 0
[Git][tpo/applications/firefox-android] Pushed new tag firefox-android-115.2.1-13.0-1-build16
by ma1 (@ma1) 10 May '24

10 May '24
ma1 pushed new tag firefox-android-115.2.1-13.0-1-build16 at The Tor Project / Applications / firefox-android -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/tree/firef… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-115.11.0esr-13.5-1] 4 commits: Bug 1892449 - Set network.http.digest_auth_cnonce_length to 16, a=dmeehan
by ma1 (@ma1) 10 May '24

10 May '24
ma1 pushed to branch mullvad-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser Commits: 60bae6b6 by Kershaw Chang at 2024-05-11T00:28:11+02:00 Bug 1892449 - Set network.http.digest_auth_cnonce_length to 16, a=dmeehan Apparently, setting this value to 64 breaks some sites. We should use the same length as Chrome. Original Revision: https://phabricator.services.mozilla.com/D208103 Differential Revision: https://phabricator.services.mozilla.com/D208119 - - - - - ebdf71f2 by Nika Layzell at 2024-05-11T00:28:14+02:00 Bug 1875248 - Check for network error preventing ExternalHelperAppService before DONT_RETARGET, r=smaug This reverts the change from 30cde47f9364e5c7da78fd08fa8ab21737d22399, and instead re-orders the NS_ERROR_FILE_NOT_FOUND check before DONT_RETARGET. Testing suggests that a-download-click-404.html behaviour isn&#39;t impacted, and this improves the handling of this edge-case when doing process switching. Differential Revision: https://phabricator.services.mozilla.com/D202007 - - - - - d1a143b3 by Jonathan Kew at 2024-05-11T00:28:15+02:00 Bug 1886598 - Struct with Pointer member may not be memmove-able. r=gfx-reviewers,lsalzman Differential Revision: https://phabricator.services.mozilla.com/D206633 - - - - - f6ebda2a by alwu at 2024-05-11T00:28:16+02:00 Bug 1644383 - add mutexs to avoid data race. r=media-playback-reviewers,padenot Differential Revision: https://phabricator.services.mozilla.com/D206943 - - - - - 7 changed files: - dom/media/ipc/RemoteMediaDataDecoder.cpp - dom/media/ipc/RemoteMediaDataDecoder.h - dom/media/platforms/wrappers/MediaChangeMonitor.cpp - dom/media/platforms/wrappers/MediaChangeMonitor.h - gfx/thebes/gfxPlatformFontList.h - modules/libpref/init/StaticPrefList.yaml - uriloader/base/nsURILoader.cpp Changes: ===================================== dom/media/ipc/RemoteMediaDataDecoder.cpp ===================================== @@ -18,7 +18,12 @@ namespace mozilla { ##__VA_ARGS__) RemoteMediaDataDecoder::RemoteMediaDataDecoder(RemoteDecoderChild* aChild) - : mChild(aChild) { + : mChild(aChild), + mDescription("RemoteMediaDataDecoder"_ns), + mProcessName("unknown"_ns), + mCodecName("unknown"_ns), + mIsHardwareAccelerated(false), + mConversion(ConversionRequired::kNeedNone) { LOG("%p is created", this); } @@ -48,6 +53,7 @@ RefPtr<MediaDataDecoder::InitPromise> RemoteMediaDataDecoder::Init() { ->Then( RemoteDecoderManagerChild::GetManagerThread(), __func__, [self, this](TrackType aTrack) { + MutexAutoLock lock(mMutex); // If shutdown has started in the meantime shutdown promise may // be resloved before this task. In this case mChild will be null // and the init promise has to be canceled. @@ -127,6 +133,7 @@ RefPtr<ShutdownPromise> RemoteMediaDataDecoder::Shutdown() { bool RemoteMediaDataDecoder::IsHardwareAccelerated( nsACString& aFailureReason) const { + MutexAutoLock lock(mMutex); aFailureReason = mHardwareAcceleratedReason; return mIsHardwareAccelerated; } @@ -145,18 +152,24 @@ void RemoteMediaDataDecoder::SetSeekThreshold(const media::TimeUnit& aTime) { MediaDataDecoder::ConversionRequired RemoteMediaDataDecoder::NeedsConversion() const { + MutexAutoLock lock(mMutex); return mConversion; } nsCString RemoteMediaDataDecoder::GetDescriptionName() const { + MutexAutoLock lock(mMutex); return mDescription; } nsCString RemoteMediaDataDecoder::GetProcessName() const { + MutexAutoLock lock(mMutex); return mProcessName; } -nsCString RemoteMediaDataDecoder::GetCodecName() const { return mCodecName; } +nsCString RemoteMediaDataDecoder::GetCodecName() const { + MutexAutoLock lock(mMutex); + return mCodecName; +} #undef LOG ===================================== dom/media/ipc/RemoteMediaDataDecoder.h ===================================== @@ -53,14 +53,16 @@ class RemoteMediaDataDecoder final // destructor when we can guarantee no other threads are accessing it). Only // read from the manager thread. RefPtr<RemoteDecoderChild> mChild; + + mutable Mutex mMutex{"RemoteMediaDataDecoder"}; + // Only ever written/modified during decoder initialisation. - // As such can be accessed from any threads after that. - nsCString mDescription = "RemoteMediaDataDecoder"_ns; - nsCString mProcessName = "unknown"_ns; - nsCString mCodecName = "unknown"_ns; - bool mIsHardwareAccelerated = false; - nsCString mHardwareAcceleratedReason; - ConversionRequired mConversion = ConversionRequired::kNeedNone; + nsCString mDescription MOZ_GUARDED_BY(mMutex); + nsCString mProcessName MOZ_GUARDED_BY(mMutex); + nsCString mCodecName MOZ_GUARDED_BY(mMutex); + bool mIsHardwareAccelerated MOZ_GUARDED_BY(mMutex); + nsCString mHardwareAcceleratedReason MOZ_GUARDED_BY(mMutex); + ConversionRequired mConversion MOZ_GUARDED_BY(mMutex); }; } // namespace mozilla ===================================== dom/media/platforms/wrappers/MediaChangeMonitor.cpp ===================================== @@ -668,6 +668,7 @@ RefPtr<ShutdownPromise> MediaChangeMonitor::ShutdownDecoder() { AssertOnThread(); mConversionRequired.reset(); if (mDecoder) { + MutexAutoLock lock(mMutex); RefPtr<MediaDataDecoder> decoder = std::move(mDecoder); return decoder->Shutdown(); } @@ -715,6 +716,7 @@ MediaChangeMonitor::CreateDecoder() { ->Then( GetCurrentSerialEventTarget(), __func__, [self = RefPtr{this}, this](RefPtr<MediaDataDecoder>&& aDecoder) { + MutexAutoLock lock(mMutex); mDecoder = std::move(aDecoder); DDLINKCHILD("decoder", mDecoder.get()); return CreateDecoderPromise::CreateAndResolve(true, __func__); @@ -963,6 +965,11 @@ void MediaChangeMonitor::FlushThenShutdownDecoder( ->Track(mFlushRequest); } +MediaDataDecoder* MediaChangeMonitor::GetDecoderOnNonOwnerThread() const { + MutexAutoLock lock(mMutex); + return mDecoder; +} + #undef LOG } // namespace mozilla ===================================== dom/media/platforms/wrappers/MediaChangeMonitor.h ===================================== @@ -41,34 +41,34 @@ class MediaChangeMonitor final RefPtr<ShutdownPromise> Shutdown() override; bool IsHardwareAccelerated(nsACString& aFailureReason) const override; nsCString GetDescriptionName() const override { - if (mDecoder) { - return mDecoder->GetDescriptionName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetDescriptionName(); } return "MediaChangeMonitor decoder (pending)"_ns; } nsCString GetProcessName() const override { - if (mDecoder) { - return mDecoder->GetProcessName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetProcessName(); } return "MediaChangeMonitor"_ns; } nsCString GetCodecName() const override { - if (mDecoder) { - return mDecoder->GetCodecName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetCodecName(); } return "MediaChangeMonitor"_ns; } void SetSeekThreshold(const media::TimeUnit& aTime) override; bool SupportDecoderRecycling() const override { - if (mDecoder) { - return mDecoder->SupportDecoderRecycling(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->SupportDecoderRecycling(); } return false; } ConversionRequired NeedsConversion() const override { - if (mDecoder) { - return mDecoder->NeedsConversion(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->NeedsConversion(); } // Default so no conversion is performed. return ConversionRequired::kNeedNone; @@ -97,6 +97,9 @@ class MediaChangeMonitor final MOZ_ASSERT(!mThread || mThread->IsOnCurrentThread()); } + // This is used for getting decoder debug info on other threads. Thread-safe. + MediaDataDecoder* GetDecoderOnNonOwnerThread() const; + bool CanRecycleDecoder() const; typedef MozPromise<bool, MediaResult, true /* exclusive */> @@ -137,6 +140,13 @@ class MediaChangeMonitor final const CreateDecoderParamsForAsync mParams; // Keep any seek threshold set for after decoder creation and initialization. Maybe<media::TimeUnit> mPendingSeekThreshold; + + // This lock is used for mDecoder specifically, but it doens't need to be used + // for every places accessing mDecoder which is mostly on the owner thread. + // However, when requesting decoder debug info, it can happen on other + // threads, so we need this mutex to avoid the data race of + // creating/destroying decoder and accessing decoder's debug info. + mutable Mutex MOZ_ANNOTATED mMutex{"MediaChangeMonitor"}; }; } // namespace mozilla ===================================== gfx/thebes/gfxPlatformFontList.h ===================================== @@ -124,7 +124,7 @@ class ShmemCharMapHashEntry final : public PLDHashEntryHdr { return aCharMap->GetChecksum(); } - enum { ALLOW_MEMMOVE = true }; + enum { ALLOW_MEMMOVE = false }; // because of the Pointer member private: // charMaps are stored in the shared memory that FontList objects point to, ===================================== modules/libpref/init/StaticPrefList.yaml ===================================== @@ -12779,6 +12779,18 @@ value: true mirror: always + # The length of cnonce string used in HTTP digest auth. +- name: network.http.digest_auth_cnonce_length + type: uint32_t + value: 16 + mirror: always + + # If true, HTTP response content-type headers will be parsed using the standards-compliant MimeType parser +- name: network.standard_content_type_parsing.response_headers + type: RelaxedAtomicBool + value: true + mirror: always + # The maximum count that we allow socket prrocess to crash. If this count is # reached, we won't use networking over socket process. - name: network.max_socket_process_failed_count ===================================== uriloader/base/nsURILoader.cpp ===================================== @@ -414,28 +414,28 @@ nsresult nsDocumentOpenInfo::DispatchContent(nsIRequest* request) { NS_ASSERTION(!m_targetStreamListener, "If we found a listener, why are we not using it?"); - if (mFlags & nsIURILoader::DONT_RETARGET) { - LOG( - (" External handling forced or (listener not interested and no " - "stream converter exists), and retargeting disallowed -> aborting")); - return NS_ERROR_WONT_HANDLE_CONTENT; - } - // Before dispatching to the external helper app service, check for an HTTP // error page. If we got one, we don't want to handle it with a helper app, // really. - // The WPT a-download-click-404.html requires us to silently handle this - // without displaying an error page, so we just return early here. - // See bug 1604308 for discussion around what the ideal behaviour is. nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(request)); if (httpChannel) { bool requestSucceeded; rv = httpChannel->GetRequestSucceeded(&requestSucceeded); if (NS_FAILED(rv) || !requestSucceeded) { - return NS_OK; + LOG( + (" Returning NS_ERROR_FILE_NOT_FOUND from " + "nsDocumentOpenInfo::DispatchContent due to failed HTTP response")); + return NS_ERROR_FILE_NOT_FOUND; } } + if (mFlags & nsIURILoader::DONT_RETARGET) { + LOG( + (" External handling forced or (listener not interested and no " + "stream converter exists), and retargeting disallowed -> aborting")); + return NS_ERROR_WONT_HANDLE_CONTENT; + } + // Fifth step: // // All attempts to dispatch this content have failed. Just pass it off to View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/da… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/da… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][base-browser-115.11.0esr-13.5-1] 4 commits: Bug 1892449 - Set network.http.digest_auth_cnonce_length to 16, a=dmeehan
by ma1 (@ma1) 10 May '24

10 May '24
ma1 pushed to branch base-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 8584ab91 by Kershaw Chang at 2024-05-11T00:21:58+02:00 Bug 1892449 - Set network.http.digest_auth_cnonce_length to 16, a=dmeehan Apparently, setting this value to 64 breaks some sites. We should use the same length as Chrome. Original Revision: https://phabricator.services.mozilla.com/D208103 Differential Revision: https://phabricator.services.mozilla.com/D208119 - - - - - 328452de by Nika Layzell at 2024-05-11T00:22:00+02:00 Bug 1875248 - Check for network error preventing ExternalHelperAppService before DONT_RETARGET, r=smaug This reverts the change from 30cde47f9364e5c7da78fd08fa8ab21737d22399, and instead re-orders the NS_ERROR_FILE_NOT_FOUND check before DONT_RETARGET. Testing suggests that a-download-click-404.html behaviour isn&#39;t impacted, and this improves the handling of this edge-case when doing process switching. Differential Revision: https://phabricator.services.mozilla.com/D202007 - - - - - a593aa4b by Jonathan Kew at 2024-05-11T00:22:01+02:00 Bug 1886598 - Struct with Pointer member may not be memmove-able. r=gfx-reviewers,lsalzman Differential Revision: https://phabricator.services.mozilla.com/D206633 - - - - - 45188fff by alwu at 2024-05-11T00:22:02+02:00 Bug 1644383 - add mutexs to avoid data race. r=media-playback-reviewers,padenot Differential Revision: https://phabricator.services.mozilla.com/D206943 - - - - - 7 changed files: - dom/media/ipc/RemoteMediaDataDecoder.cpp - dom/media/ipc/RemoteMediaDataDecoder.h - dom/media/platforms/wrappers/MediaChangeMonitor.cpp - dom/media/platforms/wrappers/MediaChangeMonitor.h - gfx/thebes/gfxPlatformFontList.h - modules/libpref/init/StaticPrefList.yaml - uriloader/base/nsURILoader.cpp Changes: ===================================== dom/media/ipc/RemoteMediaDataDecoder.cpp ===================================== @@ -18,7 +18,12 @@ namespace mozilla { ##__VA_ARGS__) RemoteMediaDataDecoder::RemoteMediaDataDecoder(RemoteDecoderChild* aChild) - : mChild(aChild) { + : mChild(aChild), + mDescription("RemoteMediaDataDecoder"_ns), + mProcessName("unknown"_ns), + mCodecName("unknown"_ns), + mIsHardwareAccelerated(false), + mConversion(ConversionRequired::kNeedNone) { LOG("%p is created", this); } @@ -48,6 +53,7 @@ RefPtr<MediaDataDecoder::InitPromise> RemoteMediaDataDecoder::Init() { ->Then( RemoteDecoderManagerChild::GetManagerThread(), __func__, [self, this](TrackType aTrack) { + MutexAutoLock lock(mMutex); // If shutdown has started in the meantime shutdown promise may // be resloved before this task. In this case mChild will be null // and the init promise has to be canceled. @@ -127,6 +133,7 @@ RefPtr<ShutdownPromise> RemoteMediaDataDecoder::Shutdown() { bool RemoteMediaDataDecoder::IsHardwareAccelerated( nsACString& aFailureReason) const { + MutexAutoLock lock(mMutex); aFailureReason = mHardwareAcceleratedReason; return mIsHardwareAccelerated; } @@ -145,18 +152,24 @@ void RemoteMediaDataDecoder::SetSeekThreshold(const media::TimeUnit& aTime) { MediaDataDecoder::ConversionRequired RemoteMediaDataDecoder::NeedsConversion() const { + MutexAutoLock lock(mMutex); return mConversion; } nsCString RemoteMediaDataDecoder::GetDescriptionName() const { + MutexAutoLock lock(mMutex); return mDescription; } nsCString RemoteMediaDataDecoder::GetProcessName() const { + MutexAutoLock lock(mMutex); return mProcessName; } -nsCString RemoteMediaDataDecoder::GetCodecName() const { return mCodecName; } +nsCString RemoteMediaDataDecoder::GetCodecName() const { + MutexAutoLock lock(mMutex); + return mCodecName; +} #undef LOG ===================================== dom/media/ipc/RemoteMediaDataDecoder.h ===================================== @@ -53,14 +53,16 @@ class RemoteMediaDataDecoder final // destructor when we can guarantee no other threads are accessing it). Only // read from the manager thread. RefPtr<RemoteDecoderChild> mChild; + + mutable Mutex mMutex{"RemoteMediaDataDecoder"}; + // Only ever written/modified during decoder initialisation. - // As such can be accessed from any threads after that. - nsCString mDescription = "RemoteMediaDataDecoder"_ns; - nsCString mProcessName = "unknown"_ns; - nsCString mCodecName = "unknown"_ns; - bool mIsHardwareAccelerated = false; - nsCString mHardwareAcceleratedReason; - ConversionRequired mConversion = ConversionRequired::kNeedNone; + nsCString mDescription MOZ_GUARDED_BY(mMutex); + nsCString mProcessName MOZ_GUARDED_BY(mMutex); + nsCString mCodecName MOZ_GUARDED_BY(mMutex); + bool mIsHardwareAccelerated MOZ_GUARDED_BY(mMutex); + nsCString mHardwareAcceleratedReason MOZ_GUARDED_BY(mMutex); + ConversionRequired mConversion MOZ_GUARDED_BY(mMutex); }; } // namespace mozilla ===================================== dom/media/platforms/wrappers/MediaChangeMonitor.cpp ===================================== @@ -668,6 +668,7 @@ RefPtr<ShutdownPromise> MediaChangeMonitor::ShutdownDecoder() { AssertOnThread(); mConversionRequired.reset(); if (mDecoder) { + MutexAutoLock lock(mMutex); RefPtr<MediaDataDecoder> decoder = std::move(mDecoder); return decoder->Shutdown(); } @@ -715,6 +716,7 @@ MediaChangeMonitor::CreateDecoder() { ->Then( GetCurrentSerialEventTarget(), __func__, [self = RefPtr{this}, this](RefPtr<MediaDataDecoder>&& aDecoder) { + MutexAutoLock lock(mMutex); mDecoder = std::move(aDecoder); DDLINKCHILD("decoder", mDecoder.get()); return CreateDecoderPromise::CreateAndResolve(true, __func__); @@ -963,6 +965,11 @@ void MediaChangeMonitor::FlushThenShutdownDecoder( ->Track(mFlushRequest); } +MediaDataDecoder* MediaChangeMonitor::GetDecoderOnNonOwnerThread() const { + MutexAutoLock lock(mMutex); + return mDecoder; +} + #undef LOG } // namespace mozilla ===================================== dom/media/platforms/wrappers/MediaChangeMonitor.h ===================================== @@ -41,34 +41,34 @@ class MediaChangeMonitor final RefPtr<ShutdownPromise> Shutdown() override; bool IsHardwareAccelerated(nsACString& aFailureReason) const override; nsCString GetDescriptionName() const override { - if (mDecoder) { - return mDecoder->GetDescriptionName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetDescriptionName(); } return "MediaChangeMonitor decoder (pending)"_ns; } nsCString GetProcessName() const override { - if (mDecoder) { - return mDecoder->GetProcessName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetProcessName(); } return "MediaChangeMonitor"_ns; } nsCString GetCodecName() const override { - if (mDecoder) { - return mDecoder->GetCodecName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetCodecName(); } return "MediaChangeMonitor"_ns; } void SetSeekThreshold(const media::TimeUnit& aTime) override; bool SupportDecoderRecycling() const override { - if (mDecoder) { - return mDecoder->SupportDecoderRecycling(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->SupportDecoderRecycling(); } return false; } ConversionRequired NeedsConversion() const override { - if (mDecoder) { - return mDecoder->NeedsConversion(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->NeedsConversion(); } // Default so no conversion is performed. return ConversionRequired::kNeedNone; @@ -97,6 +97,9 @@ class MediaChangeMonitor final MOZ_ASSERT(!mThread || mThread->IsOnCurrentThread()); } + // This is used for getting decoder debug info on other threads. Thread-safe. + MediaDataDecoder* GetDecoderOnNonOwnerThread() const; + bool CanRecycleDecoder() const; typedef MozPromise<bool, MediaResult, true /* exclusive */> @@ -137,6 +140,13 @@ class MediaChangeMonitor final const CreateDecoderParamsForAsync mParams; // Keep any seek threshold set for after decoder creation and initialization. Maybe<media::TimeUnit> mPendingSeekThreshold; + + // This lock is used for mDecoder specifically, but it doens't need to be used + // for every places accessing mDecoder which is mostly on the owner thread. + // However, when requesting decoder debug info, it can happen on other + // threads, so we need this mutex to avoid the data race of + // creating/destroying decoder and accessing decoder's debug info. + mutable Mutex MOZ_ANNOTATED mMutex{"MediaChangeMonitor"}; }; } // namespace mozilla ===================================== gfx/thebes/gfxPlatformFontList.h ===================================== @@ -124,7 +124,7 @@ class ShmemCharMapHashEntry final : public PLDHashEntryHdr { return aCharMap->GetChecksum(); } - enum { ALLOW_MEMMOVE = true }; + enum { ALLOW_MEMMOVE = false }; // because of the Pointer member private: // charMaps are stored in the shared memory that FontList objects point to, ===================================== modules/libpref/init/StaticPrefList.yaml ===================================== @@ -12779,6 +12779,18 @@ value: true mirror: always + # The length of cnonce string used in HTTP digest auth. +- name: network.http.digest_auth_cnonce_length + type: uint32_t + value: 16 + mirror: always + + # If true, HTTP response content-type headers will be parsed using the standards-compliant MimeType parser +- name: network.standard_content_type_parsing.response_headers + type: RelaxedAtomicBool + value: true + mirror: always + # The maximum count that we allow socket prrocess to crash. If this count is # reached, we won't use networking over socket process. - name: network.max_socket_process_failed_count ===================================== uriloader/base/nsURILoader.cpp ===================================== @@ -414,28 +414,28 @@ nsresult nsDocumentOpenInfo::DispatchContent(nsIRequest* request) { NS_ASSERTION(!m_targetStreamListener, "If we found a listener, why are we not using it?"); - if (mFlags & nsIURILoader::DONT_RETARGET) { - LOG( - (" External handling forced or (listener not interested and no " - "stream converter exists), and retargeting disallowed -> aborting")); - return NS_ERROR_WONT_HANDLE_CONTENT; - } - // Before dispatching to the external helper app service, check for an HTTP // error page. If we got one, we don't want to handle it with a helper app, // really. - // The WPT a-download-click-404.html requires us to silently handle this - // without displaying an error page, so we just return early here. - // See bug 1604308 for discussion around what the ideal behaviour is. nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(request)); if (httpChannel) { bool requestSucceeded; rv = httpChannel->GetRequestSucceeded(&requestSucceeded); if (NS_FAILED(rv) || !requestSucceeded) { - return NS_OK; + LOG( + (" Returning NS_ERROR_FILE_NOT_FOUND from " + "nsDocumentOpenInfo::DispatchContent due to failed HTTP response")); + return NS_ERROR_FILE_NOT_FOUND; } } + if (mFlags & nsIURILoader::DONT_RETARGET) { + LOG( + (" External handling forced or (listener not interested and no " + "stream converter exists), and retargeting disallowed -> aborting")); + return NS_ERROR_WONT_HANDLE_CONTENT; + } + // Fifth step: // // All attempts to dispatch this content have failed. Just pass it off to View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/d69874… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/d69874… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.5-1] 4 commits: Bug 1892449 - Set network.http.digest_auth_cnonce_length to 16, a=dmeehan
by ma1 (@ma1) 10 May '24

10 May '24
ma1 pushed to branch tor-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 9dec2654 by Kershaw Chang at 2024-05-11T00:17:10+02:00 Bug 1892449 - Set network.http.digest_auth_cnonce_length to 16, a=dmeehan Apparently, setting this value to 64 breaks some sites. We should use the same length as Chrome. Original Revision: https://phabricator.services.mozilla.com/D208103 Differential Revision: https://phabricator.services.mozilla.com/D208119 - - - - - 8e8da2bf by Nika Layzell at 2024-05-11T00:17:15+02:00 Bug 1875248 - Check for network error preventing ExternalHelperAppService before DONT_RETARGET, r=smaug This reverts the change from 30cde47f9364e5c7da78fd08fa8ab21737d22399, and instead re-orders the NS_ERROR_FILE_NOT_FOUND check before DONT_RETARGET. Testing suggests that a-download-click-404.html behaviour isn&#39;t impacted, and this improves the handling of this edge-case when doing process switching. Differential Revision: https://phabricator.services.mozilla.com/D202007 - - - - - 4fd209ef by Jonathan Kew at 2024-05-11T00:17:16+02:00 Bug 1886598 - Struct with Pointer member may not be memmove-able. r=gfx-reviewers,lsalzman Differential Revision: https://phabricator.services.mozilla.com/D206633 - - - - - ca21ab0c by alwu at 2024-05-11T00:17:17+02:00 Bug 1644383 - add mutexs to avoid data race. r=media-playback-reviewers,padenot Differential Revision: https://phabricator.services.mozilla.com/D206943 - - - - - 7 changed files: - dom/media/ipc/RemoteMediaDataDecoder.cpp - dom/media/ipc/RemoteMediaDataDecoder.h - dom/media/platforms/wrappers/MediaChangeMonitor.cpp - dom/media/platforms/wrappers/MediaChangeMonitor.h - gfx/thebes/gfxPlatformFontList.h - modules/libpref/init/StaticPrefList.yaml - uriloader/base/nsURILoader.cpp Changes: ===================================== dom/media/ipc/RemoteMediaDataDecoder.cpp ===================================== @@ -18,7 +18,12 @@ namespace mozilla { ##__VA_ARGS__) RemoteMediaDataDecoder::RemoteMediaDataDecoder(RemoteDecoderChild* aChild) - : mChild(aChild) { + : mChild(aChild), + mDescription("RemoteMediaDataDecoder"_ns), + mProcessName("unknown"_ns), + mCodecName("unknown"_ns), + mIsHardwareAccelerated(false), + mConversion(ConversionRequired::kNeedNone) { LOG("%p is created", this); } @@ -48,6 +53,7 @@ RefPtr<MediaDataDecoder::InitPromise> RemoteMediaDataDecoder::Init() { ->Then( RemoteDecoderManagerChild::GetManagerThread(), __func__, [self, this](TrackType aTrack) { + MutexAutoLock lock(mMutex); // If shutdown has started in the meantime shutdown promise may // be resloved before this task. In this case mChild will be null // and the init promise has to be canceled. @@ -127,6 +133,7 @@ RefPtr<ShutdownPromise> RemoteMediaDataDecoder::Shutdown() { bool RemoteMediaDataDecoder::IsHardwareAccelerated( nsACString& aFailureReason) const { + MutexAutoLock lock(mMutex); aFailureReason = mHardwareAcceleratedReason; return mIsHardwareAccelerated; } @@ -145,18 +152,24 @@ void RemoteMediaDataDecoder::SetSeekThreshold(const media::TimeUnit& aTime) { MediaDataDecoder::ConversionRequired RemoteMediaDataDecoder::NeedsConversion() const { + MutexAutoLock lock(mMutex); return mConversion; } nsCString RemoteMediaDataDecoder::GetDescriptionName() const { + MutexAutoLock lock(mMutex); return mDescription; } nsCString RemoteMediaDataDecoder::GetProcessName() const { + MutexAutoLock lock(mMutex); return mProcessName; } -nsCString RemoteMediaDataDecoder::GetCodecName() const { return mCodecName; } +nsCString RemoteMediaDataDecoder::GetCodecName() const { + MutexAutoLock lock(mMutex); + return mCodecName; +} #undef LOG ===================================== dom/media/ipc/RemoteMediaDataDecoder.h ===================================== @@ -53,14 +53,16 @@ class RemoteMediaDataDecoder final // destructor when we can guarantee no other threads are accessing it). Only // read from the manager thread. RefPtr<RemoteDecoderChild> mChild; + + mutable Mutex mMutex{"RemoteMediaDataDecoder"}; + // Only ever written/modified during decoder initialisation. - // As such can be accessed from any threads after that. - nsCString mDescription = "RemoteMediaDataDecoder"_ns; - nsCString mProcessName = "unknown"_ns; - nsCString mCodecName = "unknown"_ns; - bool mIsHardwareAccelerated = false; - nsCString mHardwareAcceleratedReason; - ConversionRequired mConversion = ConversionRequired::kNeedNone; + nsCString mDescription MOZ_GUARDED_BY(mMutex); + nsCString mProcessName MOZ_GUARDED_BY(mMutex); + nsCString mCodecName MOZ_GUARDED_BY(mMutex); + bool mIsHardwareAccelerated MOZ_GUARDED_BY(mMutex); + nsCString mHardwareAcceleratedReason MOZ_GUARDED_BY(mMutex); + ConversionRequired mConversion MOZ_GUARDED_BY(mMutex); }; } // namespace mozilla ===================================== dom/media/platforms/wrappers/MediaChangeMonitor.cpp ===================================== @@ -668,6 +668,7 @@ RefPtr<ShutdownPromise> MediaChangeMonitor::ShutdownDecoder() { AssertOnThread(); mConversionRequired.reset(); if (mDecoder) { + MutexAutoLock lock(mMutex); RefPtr<MediaDataDecoder> decoder = std::move(mDecoder); return decoder->Shutdown(); } @@ -715,6 +716,7 @@ MediaChangeMonitor::CreateDecoder() { ->Then( GetCurrentSerialEventTarget(), __func__, [self = RefPtr{this}, this](RefPtr<MediaDataDecoder>&& aDecoder) { + MutexAutoLock lock(mMutex); mDecoder = std::move(aDecoder); DDLINKCHILD("decoder", mDecoder.get()); return CreateDecoderPromise::CreateAndResolve(true, __func__); @@ -963,6 +965,11 @@ void MediaChangeMonitor::FlushThenShutdownDecoder( ->Track(mFlushRequest); } +MediaDataDecoder* MediaChangeMonitor::GetDecoderOnNonOwnerThread() const { + MutexAutoLock lock(mMutex); + return mDecoder; +} + #undef LOG } // namespace mozilla ===================================== dom/media/platforms/wrappers/MediaChangeMonitor.h ===================================== @@ -41,34 +41,34 @@ class MediaChangeMonitor final RefPtr<ShutdownPromise> Shutdown() override; bool IsHardwareAccelerated(nsACString& aFailureReason) const override; nsCString GetDescriptionName() const override { - if (mDecoder) { - return mDecoder->GetDescriptionName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetDescriptionName(); } return "MediaChangeMonitor decoder (pending)"_ns; } nsCString GetProcessName() const override { - if (mDecoder) { - return mDecoder->GetProcessName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetProcessName(); } return "MediaChangeMonitor"_ns; } nsCString GetCodecName() const override { - if (mDecoder) { - return mDecoder->GetCodecName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetCodecName(); } return "MediaChangeMonitor"_ns; } void SetSeekThreshold(const media::TimeUnit& aTime) override; bool SupportDecoderRecycling() const override { - if (mDecoder) { - return mDecoder->SupportDecoderRecycling(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->SupportDecoderRecycling(); } return false; } ConversionRequired NeedsConversion() const override { - if (mDecoder) { - return mDecoder->NeedsConversion(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->NeedsConversion(); } // Default so no conversion is performed. return ConversionRequired::kNeedNone; @@ -97,6 +97,9 @@ class MediaChangeMonitor final MOZ_ASSERT(!mThread || mThread->IsOnCurrentThread()); } + // This is used for getting decoder debug info on other threads. Thread-safe. + MediaDataDecoder* GetDecoderOnNonOwnerThread() const; + bool CanRecycleDecoder() const; typedef MozPromise<bool, MediaResult, true /* exclusive */> @@ -137,6 +140,13 @@ class MediaChangeMonitor final const CreateDecoderParamsForAsync mParams; // Keep any seek threshold set for after decoder creation and initialization. Maybe<media::TimeUnit> mPendingSeekThreshold; + + // This lock is used for mDecoder specifically, but it doens't need to be used + // for every places accessing mDecoder which is mostly on the owner thread. + // However, when requesting decoder debug info, it can happen on other + // threads, so we need this mutex to avoid the data race of + // creating/destroying decoder and accessing decoder's debug info. + mutable Mutex MOZ_ANNOTATED mMutex{"MediaChangeMonitor"}; }; } // namespace mozilla ===================================== gfx/thebes/gfxPlatformFontList.h ===================================== @@ -124,7 +124,7 @@ class ShmemCharMapHashEntry final : public PLDHashEntryHdr { return aCharMap->GetChecksum(); } - enum { ALLOW_MEMMOVE = true }; + enum { ALLOW_MEMMOVE = false }; // because of the Pointer member private: // charMaps are stored in the shared memory that FontList objects point to, ===================================== modules/libpref/init/StaticPrefList.yaml ===================================== @@ -12787,6 +12787,18 @@ value: true mirror: always + # The length of cnonce string used in HTTP digest auth. +- name: network.http.digest_auth_cnonce_length + type: uint32_t + value: 16 + mirror: always + + # If true, HTTP response content-type headers will be parsed using the standards-compliant MimeType parser +- name: network.standard_content_type_parsing.response_headers + type: RelaxedAtomicBool + value: true + mirror: always + # The maximum count that we allow socket prrocess to crash. If this count is # reached, we won't use networking over socket process. - name: network.max_socket_process_failed_count ===================================== uriloader/base/nsURILoader.cpp ===================================== @@ -414,28 +414,28 @@ nsresult nsDocumentOpenInfo::DispatchContent(nsIRequest* request) { NS_ASSERTION(!m_targetStreamListener, "If we found a listener, why are we not using it?"); - if (mFlags & nsIURILoader::DONT_RETARGET) { - LOG( - (" External handling forced or (listener not interested and no " - "stream converter exists), and retargeting disallowed -> aborting")); - return NS_ERROR_WONT_HANDLE_CONTENT; - } - // Before dispatching to the external helper app service, check for an HTTP // error page. If we got one, we don't want to handle it with a helper app, // really. - // The WPT a-download-click-404.html requires us to silently handle this - // without displaying an error page, so we just return early here. - // See bug 1604308 for discussion around what the ideal behaviour is. nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(request)); if (httpChannel) { bool requestSucceeded; rv = httpChannel->GetRequestSucceeded(&requestSucceeded); if (NS_FAILED(rv) || !requestSucceeded) { - return NS_OK; + LOG( + (" Returning NS_ERROR_FILE_NOT_FOUND from " + "nsDocumentOpenInfo::DispatchContent due to failed HTTP response")); + return NS_ERROR_FILE_NOT_FOUND; } } + if (mFlags & nsIURILoader::DONT_RETARGET) { + LOG( + (" External handling forced or (listener not interested and no " + "stream converter exists), and retargeting disallowed -> aborting")); + return NS_ERROR_WONT_HANDLE_CONTENT; + } + // Fifth step: // // All attempts to dispatch this content have failed. Just pass it off to View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/e6f7f1… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/e6f7f1… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser] Pushed new tag mullvad-browser-115.11.0esr-13.0-1-build2
by richard (@richard) 10 May '24

10 May '24
richard pushed new tag mullvad-browser-115.11.0esr-13.0-1-build2 at The Tor Project / Applications / Mullvad Browser -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/tree/mullv… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser] Deleted tag mullvad-browser-115.11.0esr-13.0-1-build2
by richard (@richard) 10 May '24

10 May '24
richard deleted tag mullvad-browser-115.11.0esr-13.0-1-build2 at The Tor Project / Applications / Mullvad Browser -- This project does not include diff previews in email notifications. You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser] Pushed new tag base-browser-115.11.0esr-13.0-1-build2
by richard (@richard) 10 May '24

10 May '24
richard pushed new tag base-browser-115.11.0esr-13.0-1-build2 at The Tor Project / Applications / Tor Browser -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/base-brow… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser] Pushed new tag tor-browser-115.11.0esr-13.0-1-build2
by richard (@richard) 10 May '24

10 May '24
richard pushed new tag tor-browser-115.11.0esr-13.0-1-build2 at The Tor Project / Applications / Tor Browser -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/tor-brows… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser] Pushed new tag mullvad-browser-115.11.0esr-13.0-1-build2
by richard (@richard) 10 May '24

10 May '24
richard pushed new tag mullvad-browser-115.11.0esr-13.0-1-build2 at The Tor Project / Applications / Mullvad Browser -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/tree/mullv… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-115.11.0esr-13.0-1] 5 commits: Bug 1870579 - Use PK11_GenerateRandom to generate random number, r=necko-reviewers, valentin
by richard (@richard) 10 May '24

10 May '24
richard pushed to branch mullvad-browser-115.11.0esr-13.0-1 at The Tor Project / Applications / Mullvad Browser Commits: a87825b0 by Kershaw Chang at 2024-05-10T22:07:35+00:00 Bug 1870579 - Use PK11_GenerateRandom to generate random number, r=necko-reviewers,valentin Differential Revision: https://phabricator.services.mozilla.com/D204755 - - - - - f98bc25e by Kershaw Chang at 2024-05-10T22:07:35+00:00 Bug 1892449 - Set network.http.digest_auth_cnonce_length to 16, a=dmeehan Apparently, setting this value to 64 breaks some sites. We should use the same length as Chrome. Original Revision: https://phabricator.services.mozilla.com/D208103 Differential Revision: https://phabricator.services.mozilla.com/D208119 - - - - - e1f9025e by Nika Layzell at 2024-05-10T22:07:35+00:00 Bug 1875248 - Check for network error preventing ExternalHelperAppService before DONT_RETARGET, r=smaug This reverts the change from 30cde47f9364e5c7da78fd08fa8ab21737d22399, and instead re-orders the NS_ERROR_FILE_NOT_FOUND check before DONT_RETARGET. Testing suggests that a-download-click-404.html behaviour isn&#39;t impacted, and this improves the handling of this edge-case when doing process switching. Differential Revision: https://phabricator.services.mozilla.com/D202007 - - - - - a04f2066 by Jonathan Kew at 2024-05-10T22:07:35+00:00 Bug 1886598 - Struct with Pointer member may not be memmove-able. r=gfx-reviewers,lsalzman Differential Revision: https://phabricator.services.mozilla.com/D206633 - - - - - 0d13381c by alwu at 2024-05-10T22:07:36+00:00 Bug 1644383 - add mutexs to avoid data race. r=media-playback-reviewers,padenot Differential Revision: https://phabricator.services.mozilla.com/D206943 - - - - - 8 changed files: - dom/media/ipc/RemoteMediaDataDecoder.cpp - dom/media/ipc/RemoteMediaDataDecoder.h - dom/media/platforms/wrappers/MediaChangeMonitor.cpp - dom/media/platforms/wrappers/MediaChangeMonitor.h - gfx/thebes/gfxPlatformFontList.h - modules/libpref/init/StaticPrefList.yaml - netwerk/protocol/http/nsHttpDigestAuth.cpp - uriloader/base/nsURILoader.cpp Changes: ===================================== dom/media/ipc/RemoteMediaDataDecoder.cpp ===================================== @@ -18,7 +18,12 @@ namespace mozilla { ##__VA_ARGS__) RemoteMediaDataDecoder::RemoteMediaDataDecoder(RemoteDecoderChild* aChild) - : mChild(aChild) { + : mChild(aChild), + mDescription("RemoteMediaDataDecoder"_ns), + mProcessName("unknown"_ns), + mCodecName("unknown"_ns), + mIsHardwareAccelerated(false), + mConversion(ConversionRequired::kNeedNone) { LOG("%p is created", this); } @@ -48,6 +53,7 @@ RefPtr<MediaDataDecoder::InitPromise> RemoteMediaDataDecoder::Init() { ->Then( RemoteDecoderManagerChild::GetManagerThread(), __func__, [self, this](TrackType aTrack) { + MutexAutoLock lock(mMutex); // If shutdown has started in the meantime shutdown promise may // be resloved before this task. In this case mChild will be null // and the init promise has to be canceled. @@ -127,6 +133,7 @@ RefPtr<ShutdownPromise> RemoteMediaDataDecoder::Shutdown() { bool RemoteMediaDataDecoder::IsHardwareAccelerated( nsACString& aFailureReason) const { + MutexAutoLock lock(mMutex); aFailureReason = mHardwareAcceleratedReason; return mIsHardwareAccelerated; } @@ -145,18 +152,24 @@ void RemoteMediaDataDecoder::SetSeekThreshold(const media::TimeUnit& aTime) { MediaDataDecoder::ConversionRequired RemoteMediaDataDecoder::NeedsConversion() const { + MutexAutoLock lock(mMutex); return mConversion; } nsCString RemoteMediaDataDecoder::GetDescriptionName() const { + MutexAutoLock lock(mMutex); return mDescription; } nsCString RemoteMediaDataDecoder::GetProcessName() const { + MutexAutoLock lock(mMutex); return mProcessName; } -nsCString RemoteMediaDataDecoder::GetCodecName() const { return mCodecName; } +nsCString RemoteMediaDataDecoder::GetCodecName() const { + MutexAutoLock lock(mMutex); + return mCodecName; +} #undef LOG ===================================== dom/media/ipc/RemoteMediaDataDecoder.h ===================================== @@ -53,14 +53,16 @@ class RemoteMediaDataDecoder final // destructor when we can guarantee no other threads are accessing it). Only // read from the manager thread. RefPtr<RemoteDecoderChild> mChild; + + mutable Mutex mMutex{"RemoteMediaDataDecoder"}; + // Only ever written/modified during decoder initialisation. - // As such can be accessed from any threads after that. - nsCString mDescription = "RemoteMediaDataDecoder"_ns; - nsCString mProcessName = "unknown"_ns; - nsCString mCodecName = "unknown"_ns; - bool mIsHardwareAccelerated = false; - nsCString mHardwareAcceleratedReason; - ConversionRequired mConversion = ConversionRequired::kNeedNone; + nsCString mDescription MOZ_GUARDED_BY(mMutex); + nsCString mProcessName MOZ_GUARDED_BY(mMutex); + nsCString mCodecName MOZ_GUARDED_BY(mMutex); + bool mIsHardwareAccelerated MOZ_GUARDED_BY(mMutex); + nsCString mHardwareAcceleratedReason MOZ_GUARDED_BY(mMutex); + ConversionRequired mConversion MOZ_GUARDED_BY(mMutex); }; } // namespace mozilla ===================================== dom/media/platforms/wrappers/MediaChangeMonitor.cpp ===================================== @@ -668,6 +668,7 @@ RefPtr<ShutdownPromise> MediaChangeMonitor::ShutdownDecoder() { AssertOnThread(); mConversionRequired.reset(); if (mDecoder) { + MutexAutoLock lock(mMutex); RefPtr<MediaDataDecoder> decoder = std::move(mDecoder); return decoder->Shutdown(); } @@ -715,6 +716,7 @@ MediaChangeMonitor::CreateDecoder() { ->Then( GetCurrentSerialEventTarget(), __func__, [self = RefPtr{this}, this](RefPtr<MediaDataDecoder>&& aDecoder) { + MutexAutoLock lock(mMutex); mDecoder = std::move(aDecoder); DDLINKCHILD("decoder", mDecoder.get()); return CreateDecoderPromise::CreateAndResolve(true, __func__); @@ -963,6 +965,11 @@ void MediaChangeMonitor::FlushThenShutdownDecoder( ->Track(mFlushRequest); } +MediaDataDecoder* MediaChangeMonitor::GetDecoderOnNonOwnerThread() const { + MutexAutoLock lock(mMutex); + return mDecoder; +} + #undef LOG } // namespace mozilla ===================================== dom/media/platforms/wrappers/MediaChangeMonitor.h ===================================== @@ -41,34 +41,34 @@ class MediaChangeMonitor final RefPtr<ShutdownPromise> Shutdown() override; bool IsHardwareAccelerated(nsACString& aFailureReason) const override; nsCString GetDescriptionName() const override { - if (mDecoder) { - return mDecoder->GetDescriptionName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetDescriptionName(); } return "MediaChangeMonitor decoder (pending)"_ns; } nsCString GetProcessName() const override { - if (mDecoder) { - return mDecoder->GetProcessName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetProcessName(); } return "MediaChangeMonitor"_ns; } nsCString GetCodecName() const override { - if (mDecoder) { - return mDecoder->GetCodecName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetCodecName(); } return "MediaChangeMonitor"_ns; } void SetSeekThreshold(const media::TimeUnit& aTime) override; bool SupportDecoderRecycling() const override { - if (mDecoder) { - return mDecoder->SupportDecoderRecycling(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->SupportDecoderRecycling(); } return false; } ConversionRequired NeedsConversion() const override { - if (mDecoder) { - return mDecoder->NeedsConversion(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->NeedsConversion(); } // Default so no conversion is performed. return ConversionRequired::kNeedNone; @@ -97,6 +97,9 @@ class MediaChangeMonitor final MOZ_ASSERT(!mThread || mThread->IsOnCurrentThread()); } + // This is used for getting decoder debug info on other threads. Thread-safe. + MediaDataDecoder* GetDecoderOnNonOwnerThread() const; + bool CanRecycleDecoder() const; typedef MozPromise<bool, MediaResult, true /* exclusive */> @@ -137,6 +140,13 @@ class MediaChangeMonitor final const CreateDecoderParamsForAsync mParams; // Keep any seek threshold set for after decoder creation and initialization. Maybe<media::TimeUnit> mPendingSeekThreshold; + + // This lock is used for mDecoder specifically, but it doens't need to be used + // for every places accessing mDecoder which is mostly on the owner thread. + // However, when requesting decoder debug info, it can happen on other + // threads, so we need this mutex to avoid the data race of + // creating/destroying decoder and accessing decoder's debug info. + mutable Mutex MOZ_ANNOTATED mMutex{"MediaChangeMonitor"}; }; } // namespace mozilla ===================================== gfx/thebes/gfxPlatformFontList.h ===================================== @@ -124,7 +124,7 @@ class ShmemCharMapHashEntry final : public PLDHashEntryHdr { return aCharMap->GetChecksum(); } - enum { ALLOW_MEMMOVE = true }; + enum { ALLOW_MEMMOVE = false }; // because of the Pointer member private: // charMaps are stored in the shared memory that FontList objects point to, ===================================== modules/libpref/init/StaticPrefList.yaml ===================================== @@ -12779,6 +12779,18 @@ value: true mirror: always + # The length of cnonce string used in HTTP digest auth. +- name: network.http.digest_auth_cnonce_length + type: uint32_t + value: 16 + mirror: always + + # If true, HTTP response content-type headers will be parsed using the standards-compliant MimeType parser +- name: network.standard_content_type_parsing.response_headers + type: RelaxedAtomicBool + value: true + mirror: always + # The maximum count that we allow socket prrocess to crash. If this count is # reached, we won't use networking over socket process. - name: network.max_socket_process_failed_count ===================================== netwerk/protocol/http/nsHttpDigestAuth.cpp ===================================== @@ -9,6 +9,7 @@ #include "mozilla/ClearOnShutdown.h" #include "mozilla/Sprintf.h" +#include "mozilla/StaticPrefs_network.h" #include "mozilla/Unused.h" #include "nsHttp.h" @@ -22,6 +23,7 @@ #include "nsCRT.h" #include "nsICryptoHash.h" #include "nsComponentManagerUtils.h" +#include "pk11pub.h" constexpr uint16_t DigestLength(uint16_t aAlgorithm) { if (aAlgorithm & (ALGO_SHA256 | ALGO_SHA256_SESS)) { @@ -321,9 +323,13 @@ nsHttpDigestAuth::GenerateCredentials( // returned Authentication-Info header). also used for session info. // nsAutoCString cnonce; - static const char hexChar[] = "0123456789abcdef"; - for (int i = 0; i < 16; ++i) { - cnonce.Append(hexChar[(int)(15.0 * rand() / (RAND_MAX + 1.0))]); + nsTArray<uint8_t> cnonceBuf; + cnonceBuf.SetLength(StaticPrefs::network_http_digest_auth_cnonce_length() / + 2); + PK11_GenerateRandom(reinterpret_cast<unsigned char*>(cnonceBuf.Elements()), + cnonceBuf.Length()); + for (auto byte : cnonceBuf) { + cnonce.AppendPrintf("%02x", byte); } LOG((" cnonce=%s\n", cnonce.get())); ===================================== uriloader/base/nsURILoader.cpp ===================================== @@ -414,28 +414,28 @@ nsresult nsDocumentOpenInfo::DispatchContent(nsIRequest* request) { NS_ASSERTION(!m_targetStreamListener, "If we found a listener, why are we not using it?"); - if (mFlags & nsIURILoader::DONT_RETARGET) { - LOG( - (" External handling forced or (listener not interested and no " - "stream converter exists), and retargeting disallowed -> aborting")); - return NS_ERROR_WONT_HANDLE_CONTENT; - } - // Before dispatching to the external helper app service, check for an HTTP // error page. If we got one, we don't want to handle it with a helper app, // really. - // The WPT a-download-click-404.html requires us to silently handle this - // without displaying an error page, so we just return early here. - // See bug 1604308 for discussion around what the ideal behaviour is. nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(request)); if (httpChannel) { bool requestSucceeded; rv = httpChannel->GetRequestSucceeded(&requestSucceeded); if (NS_FAILED(rv) || !requestSucceeded) { - return NS_OK; + LOG( + (" Returning NS_ERROR_FILE_NOT_FOUND from " + "nsDocumentOpenInfo::DispatchContent due to failed HTTP response")); + return NS_ERROR_FILE_NOT_FOUND; } } + if (mFlags & nsIURILoader::DONT_RETARGET) { + LOG( + (" External handling forced or (listener not interested and no " + "stream converter exists), and retargeting disallowed -> aborting")); + return NS_ERROR_WONT_HANDLE_CONTENT; + } + // Fifth step: // // All attempts to dispatch this content have failed. Just pass it off to View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/b4… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/b4… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][base-browser-115.11.0esr-13.0-1] 5 commits: Bug 1870579 - Use PK11_GenerateRandom to generate random number, r=necko-reviewers, valentin
by richard (@richard) 10 May '24

10 May '24
richard pushed to branch base-browser-115.11.0esr-13.0-1 at The Tor Project / Applications / Tor Browser Commits: f7e4ecc5 by Kershaw Chang at 2024-05-10T22:02:56+00:00 Bug 1870579 - Use PK11_GenerateRandom to generate random number, r=necko-reviewers,valentin Differential Revision: https://phabricator.services.mozilla.com/D204755 - - - - - 950e0948 by Kershaw Chang at 2024-05-10T22:02:56+00:00 Bug 1892449 - Set network.http.digest_auth_cnonce_length to 16, a=dmeehan Apparently, setting this value to 64 breaks some sites. We should use the same length as Chrome. Original Revision: https://phabricator.services.mozilla.com/D208103 Differential Revision: https://phabricator.services.mozilla.com/D208119 - - - - - e774ee7b by Nika Layzell at 2024-05-10T22:02:56+00:00 Bug 1875248 - Check for network error preventing ExternalHelperAppService before DONT_RETARGET, r=smaug This reverts the change from 30cde47f9364e5c7da78fd08fa8ab21737d22399, and instead re-orders the NS_ERROR_FILE_NOT_FOUND check before DONT_RETARGET. Testing suggests that a-download-click-404.html behaviour isn&#39;t impacted, and this improves the handling of this edge-case when doing process switching. Differential Revision: https://phabricator.services.mozilla.com/D202007 - - - - - 6b293703 by Jonathan Kew at 2024-05-10T22:02:57+00:00 Bug 1886598 - Struct with Pointer member may not be memmove-able. r=gfx-reviewers,lsalzman Differential Revision: https://phabricator.services.mozilla.com/D206633 - - - - - 8eb85f10 by alwu at 2024-05-10T22:02:57+00:00 Bug 1644383 - add mutexs to avoid data race. r=media-playback-reviewers,padenot Differential Revision: https://phabricator.services.mozilla.com/D206943 - - - - - 8 changed files: - dom/media/ipc/RemoteMediaDataDecoder.cpp - dom/media/ipc/RemoteMediaDataDecoder.h - dom/media/platforms/wrappers/MediaChangeMonitor.cpp - dom/media/platforms/wrappers/MediaChangeMonitor.h - gfx/thebes/gfxPlatformFontList.h - modules/libpref/init/StaticPrefList.yaml - netwerk/protocol/http/nsHttpDigestAuth.cpp - uriloader/base/nsURILoader.cpp Changes: ===================================== dom/media/ipc/RemoteMediaDataDecoder.cpp ===================================== @@ -18,7 +18,12 @@ namespace mozilla { ##__VA_ARGS__) RemoteMediaDataDecoder::RemoteMediaDataDecoder(RemoteDecoderChild* aChild) - : mChild(aChild) { + : mChild(aChild), + mDescription("RemoteMediaDataDecoder"_ns), + mProcessName("unknown"_ns), + mCodecName("unknown"_ns), + mIsHardwareAccelerated(false), + mConversion(ConversionRequired::kNeedNone) { LOG("%p is created", this); } @@ -48,6 +53,7 @@ RefPtr<MediaDataDecoder::InitPromise> RemoteMediaDataDecoder::Init() { ->Then( RemoteDecoderManagerChild::GetManagerThread(), __func__, [self, this](TrackType aTrack) { + MutexAutoLock lock(mMutex); // If shutdown has started in the meantime shutdown promise may // be resloved before this task. In this case mChild will be null // and the init promise has to be canceled. @@ -127,6 +133,7 @@ RefPtr<ShutdownPromise> RemoteMediaDataDecoder::Shutdown() { bool RemoteMediaDataDecoder::IsHardwareAccelerated( nsACString& aFailureReason) const { + MutexAutoLock lock(mMutex); aFailureReason = mHardwareAcceleratedReason; return mIsHardwareAccelerated; } @@ -145,18 +152,24 @@ void RemoteMediaDataDecoder::SetSeekThreshold(const media::TimeUnit& aTime) { MediaDataDecoder::ConversionRequired RemoteMediaDataDecoder::NeedsConversion() const { + MutexAutoLock lock(mMutex); return mConversion; } nsCString RemoteMediaDataDecoder::GetDescriptionName() const { + MutexAutoLock lock(mMutex); return mDescription; } nsCString RemoteMediaDataDecoder::GetProcessName() const { + MutexAutoLock lock(mMutex); return mProcessName; } -nsCString RemoteMediaDataDecoder::GetCodecName() const { return mCodecName; } +nsCString RemoteMediaDataDecoder::GetCodecName() const { + MutexAutoLock lock(mMutex); + return mCodecName; +} #undef LOG ===================================== dom/media/ipc/RemoteMediaDataDecoder.h ===================================== @@ -53,14 +53,16 @@ class RemoteMediaDataDecoder final // destructor when we can guarantee no other threads are accessing it). Only // read from the manager thread. RefPtr<RemoteDecoderChild> mChild; + + mutable Mutex mMutex{"RemoteMediaDataDecoder"}; + // Only ever written/modified during decoder initialisation. - // As such can be accessed from any threads after that. - nsCString mDescription = "RemoteMediaDataDecoder"_ns; - nsCString mProcessName = "unknown"_ns; - nsCString mCodecName = "unknown"_ns; - bool mIsHardwareAccelerated = false; - nsCString mHardwareAcceleratedReason; - ConversionRequired mConversion = ConversionRequired::kNeedNone; + nsCString mDescription MOZ_GUARDED_BY(mMutex); + nsCString mProcessName MOZ_GUARDED_BY(mMutex); + nsCString mCodecName MOZ_GUARDED_BY(mMutex); + bool mIsHardwareAccelerated MOZ_GUARDED_BY(mMutex); + nsCString mHardwareAcceleratedReason MOZ_GUARDED_BY(mMutex); + ConversionRequired mConversion MOZ_GUARDED_BY(mMutex); }; } // namespace mozilla ===================================== dom/media/platforms/wrappers/MediaChangeMonitor.cpp ===================================== @@ -668,6 +668,7 @@ RefPtr<ShutdownPromise> MediaChangeMonitor::ShutdownDecoder() { AssertOnThread(); mConversionRequired.reset(); if (mDecoder) { + MutexAutoLock lock(mMutex); RefPtr<MediaDataDecoder> decoder = std::move(mDecoder); return decoder->Shutdown(); } @@ -715,6 +716,7 @@ MediaChangeMonitor::CreateDecoder() { ->Then( GetCurrentSerialEventTarget(), __func__, [self = RefPtr{this}, this](RefPtr<MediaDataDecoder>&& aDecoder) { + MutexAutoLock lock(mMutex); mDecoder = std::move(aDecoder); DDLINKCHILD("decoder", mDecoder.get()); return CreateDecoderPromise::CreateAndResolve(true, __func__); @@ -963,6 +965,11 @@ void MediaChangeMonitor::FlushThenShutdownDecoder( ->Track(mFlushRequest); } +MediaDataDecoder* MediaChangeMonitor::GetDecoderOnNonOwnerThread() const { + MutexAutoLock lock(mMutex); + return mDecoder; +} + #undef LOG } // namespace mozilla ===================================== dom/media/platforms/wrappers/MediaChangeMonitor.h ===================================== @@ -41,34 +41,34 @@ class MediaChangeMonitor final RefPtr<ShutdownPromise> Shutdown() override; bool IsHardwareAccelerated(nsACString& aFailureReason) const override; nsCString GetDescriptionName() const override { - if (mDecoder) { - return mDecoder->GetDescriptionName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetDescriptionName(); } return "MediaChangeMonitor decoder (pending)"_ns; } nsCString GetProcessName() const override { - if (mDecoder) { - return mDecoder->GetProcessName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetProcessName(); } return "MediaChangeMonitor"_ns; } nsCString GetCodecName() const override { - if (mDecoder) { - return mDecoder->GetCodecName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetCodecName(); } return "MediaChangeMonitor"_ns; } void SetSeekThreshold(const media::TimeUnit& aTime) override; bool SupportDecoderRecycling() const override { - if (mDecoder) { - return mDecoder->SupportDecoderRecycling(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->SupportDecoderRecycling(); } return false; } ConversionRequired NeedsConversion() const override { - if (mDecoder) { - return mDecoder->NeedsConversion(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->NeedsConversion(); } // Default so no conversion is performed. return ConversionRequired::kNeedNone; @@ -97,6 +97,9 @@ class MediaChangeMonitor final MOZ_ASSERT(!mThread || mThread->IsOnCurrentThread()); } + // This is used for getting decoder debug info on other threads. Thread-safe. + MediaDataDecoder* GetDecoderOnNonOwnerThread() const; + bool CanRecycleDecoder() const; typedef MozPromise<bool, MediaResult, true /* exclusive */> @@ -137,6 +140,13 @@ class MediaChangeMonitor final const CreateDecoderParamsForAsync mParams; // Keep any seek threshold set for after decoder creation and initialization. Maybe<media::TimeUnit> mPendingSeekThreshold; + + // This lock is used for mDecoder specifically, but it doens't need to be used + // for every places accessing mDecoder which is mostly on the owner thread. + // However, when requesting decoder debug info, it can happen on other + // threads, so we need this mutex to avoid the data race of + // creating/destroying decoder and accessing decoder's debug info. + mutable Mutex MOZ_ANNOTATED mMutex{"MediaChangeMonitor"}; }; } // namespace mozilla ===================================== gfx/thebes/gfxPlatformFontList.h ===================================== @@ -124,7 +124,7 @@ class ShmemCharMapHashEntry final : public PLDHashEntryHdr { return aCharMap->GetChecksum(); } - enum { ALLOW_MEMMOVE = true }; + enum { ALLOW_MEMMOVE = false }; // because of the Pointer member private: // charMaps are stored in the shared memory that FontList objects point to, ===================================== modules/libpref/init/StaticPrefList.yaml ===================================== @@ -12779,6 +12779,18 @@ value: true mirror: always + # The length of cnonce string used in HTTP digest auth. +- name: network.http.digest_auth_cnonce_length + type: uint32_t + value: 16 + mirror: always + + # If true, HTTP response content-type headers will be parsed using the standards-compliant MimeType parser +- name: network.standard_content_type_parsing.response_headers + type: RelaxedAtomicBool + value: true + mirror: always + # The maximum count that we allow socket prrocess to crash. If this count is # reached, we won't use networking over socket process. - name: network.max_socket_process_failed_count ===================================== netwerk/protocol/http/nsHttpDigestAuth.cpp ===================================== @@ -9,6 +9,7 @@ #include "mozilla/ClearOnShutdown.h" #include "mozilla/Sprintf.h" +#include "mozilla/StaticPrefs_network.h" #include "mozilla/Unused.h" #include "nsHttp.h" @@ -22,6 +23,7 @@ #include "nsCRT.h" #include "nsICryptoHash.h" #include "nsComponentManagerUtils.h" +#include "pk11pub.h" constexpr uint16_t DigestLength(uint16_t aAlgorithm) { if (aAlgorithm & (ALGO_SHA256 | ALGO_SHA256_SESS)) { @@ -321,9 +323,13 @@ nsHttpDigestAuth::GenerateCredentials( // returned Authentication-Info header). also used for session info. // nsAutoCString cnonce; - static const char hexChar[] = "0123456789abcdef"; - for (int i = 0; i < 16; ++i) { - cnonce.Append(hexChar[(int)(15.0 * rand() / (RAND_MAX + 1.0))]); + nsTArray<uint8_t> cnonceBuf; + cnonceBuf.SetLength(StaticPrefs::network_http_digest_auth_cnonce_length() / + 2); + PK11_GenerateRandom(reinterpret_cast<unsigned char*>(cnonceBuf.Elements()), + cnonceBuf.Length()); + for (auto byte : cnonceBuf) { + cnonce.AppendPrintf("%02x", byte); } LOG((" cnonce=%s\n", cnonce.get())); ===================================== uriloader/base/nsURILoader.cpp ===================================== @@ -414,28 +414,28 @@ nsresult nsDocumentOpenInfo::DispatchContent(nsIRequest* request) { NS_ASSERTION(!m_targetStreamListener, "If we found a listener, why are we not using it?"); - if (mFlags & nsIURILoader::DONT_RETARGET) { - LOG( - (" External handling forced or (listener not interested and no " - "stream converter exists), and retargeting disallowed -> aborting")); - return NS_ERROR_WONT_HANDLE_CONTENT; - } - // Before dispatching to the external helper app service, check for an HTTP // error page. If we got one, we don't want to handle it with a helper app, // really. - // The WPT a-download-click-404.html requires us to silently handle this - // without displaying an error page, so we just return early here. - // See bug 1604308 for discussion around what the ideal behaviour is. nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(request)); if (httpChannel) { bool requestSucceeded; rv = httpChannel->GetRequestSucceeded(&requestSucceeded); if (NS_FAILED(rv) || !requestSucceeded) { - return NS_OK; + LOG( + (" Returning NS_ERROR_FILE_NOT_FOUND from " + "nsDocumentOpenInfo::DispatchContent due to failed HTTP response")); + return NS_ERROR_FILE_NOT_FOUND; } } + if (mFlags & nsIURILoader::DONT_RETARGET) { + LOG( + (" External handling forced or (listener not interested and no " + "stream converter exists), and retargeting disallowed -> aborting")); + return NS_ERROR_WONT_HANDLE_CONTENT; + } + // Fifth step: // // All attempts to dispatch this content have failed. Just pass it off to View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/8a728a… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/8a728a… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.0-1] 5 commits: Bug 1870579 - Use PK11_GenerateRandom to generate random number, r=necko-reviewers, valentin
by richard (@richard) 10 May '24

10 May '24
richard pushed to branch tor-browser-115.11.0esr-13.0-1 at The Tor Project / Applications / Tor Browser Commits: 51f80eb6 by Kershaw Chang at 2024-05-10T22:22:15+02:00 Bug 1870579 - Use PK11_GenerateRandom to generate random number, r=necko-reviewers,valentin Differential Revision: https://phabricator.services.mozilla.com/D204755 - - - - - cb7f8ec0 by Kershaw Chang at 2024-05-10T22:22:56+02:00 Bug 1892449 - Set network.http.digest_auth_cnonce_length to 16, a=dmeehan Apparently, setting this value to 64 breaks some sites. We should use the same length as Chrome. Original Revision: https://phabricator.services.mozilla.com/D208103 Differential Revision: https://phabricator.services.mozilla.com/D208119 - - - - - 2e33d3b5 by Nika Layzell at 2024-05-10T22:37:57+02:00 Bug 1875248 - Check for network error preventing ExternalHelperAppService before DONT_RETARGET, r=smaug This reverts the change from 30cde47f9364e5c7da78fd08fa8ab21737d22399, and instead re-orders the NS_ERROR_FILE_NOT_FOUND check before DONT_RETARGET. Testing suggests that a-download-click-404.html behaviour isn&#39;t impacted, and this improves the handling of this edge-case when doing process switching. Differential Revision: https://phabricator.services.mozilla.com/D202007 - - - - - bbb3af71 by Jonathan Kew at 2024-05-10T23:19:01+02:00 Bug 1886598 - Struct with Pointer member may not be memmove-able. r=gfx-reviewers,lsalzman Differential Revision: https://phabricator.services.mozilla.com/D206633 - - - - - f87ae3f1 by alwu at 2024-05-10T23:34:34+02:00 Bug 1644383 - add mutexs to avoid data race. r=media-playback-reviewers,padenot Differential Revision: https://phabricator.services.mozilla.com/D206943 - - - - - 8 changed files: - dom/media/ipc/RemoteMediaDataDecoder.cpp - dom/media/ipc/RemoteMediaDataDecoder.h - dom/media/platforms/wrappers/MediaChangeMonitor.cpp - dom/media/platforms/wrappers/MediaChangeMonitor.h - gfx/thebes/gfxPlatformFontList.h - modules/libpref/init/StaticPrefList.yaml - netwerk/protocol/http/nsHttpDigestAuth.cpp - uriloader/base/nsURILoader.cpp Changes: ===================================== dom/media/ipc/RemoteMediaDataDecoder.cpp ===================================== @@ -18,7 +18,12 @@ namespace mozilla { ##__VA_ARGS__) RemoteMediaDataDecoder::RemoteMediaDataDecoder(RemoteDecoderChild* aChild) - : mChild(aChild) { + : mChild(aChild), + mDescription("RemoteMediaDataDecoder"_ns), + mProcessName("unknown"_ns), + mCodecName("unknown"_ns), + mIsHardwareAccelerated(false), + mConversion(ConversionRequired::kNeedNone) { LOG("%p is created", this); } @@ -48,6 +53,7 @@ RefPtr<MediaDataDecoder::InitPromise> RemoteMediaDataDecoder::Init() { ->Then( RemoteDecoderManagerChild::GetManagerThread(), __func__, [self, this](TrackType aTrack) { + MutexAutoLock lock(mMutex); // If shutdown has started in the meantime shutdown promise may // be resloved before this task. In this case mChild will be null // and the init promise has to be canceled. @@ -127,6 +133,7 @@ RefPtr<ShutdownPromise> RemoteMediaDataDecoder::Shutdown() { bool RemoteMediaDataDecoder::IsHardwareAccelerated( nsACString& aFailureReason) const { + MutexAutoLock lock(mMutex); aFailureReason = mHardwareAcceleratedReason; return mIsHardwareAccelerated; } @@ -145,18 +152,24 @@ void RemoteMediaDataDecoder::SetSeekThreshold(const media::TimeUnit& aTime) { MediaDataDecoder::ConversionRequired RemoteMediaDataDecoder::NeedsConversion() const { + MutexAutoLock lock(mMutex); return mConversion; } nsCString RemoteMediaDataDecoder::GetDescriptionName() const { + MutexAutoLock lock(mMutex); return mDescription; } nsCString RemoteMediaDataDecoder::GetProcessName() const { + MutexAutoLock lock(mMutex); return mProcessName; } -nsCString RemoteMediaDataDecoder::GetCodecName() const { return mCodecName; } +nsCString RemoteMediaDataDecoder::GetCodecName() const { + MutexAutoLock lock(mMutex); + return mCodecName; +} #undef LOG ===================================== dom/media/ipc/RemoteMediaDataDecoder.h ===================================== @@ -53,14 +53,16 @@ class RemoteMediaDataDecoder final // destructor when we can guarantee no other threads are accessing it). Only // read from the manager thread. RefPtr<RemoteDecoderChild> mChild; + + mutable Mutex mMutex{"RemoteMediaDataDecoder"}; + // Only ever written/modified during decoder initialisation. - // As such can be accessed from any threads after that. - nsCString mDescription = "RemoteMediaDataDecoder"_ns; - nsCString mProcessName = "unknown"_ns; - nsCString mCodecName = "unknown"_ns; - bool mIsHardwareAccelerated = false; - nsCString mHardwareAcceleratedReason; - ConversionRequired mConversion = ConversionRequired::kNeedNone; + nsCString mDescription MOZ_GUARDED_BY(mMutex); + nsCString mProcessName MOZ_GUARDED_BY(mMutex); + nsCString mCodecName MOZ_GUARDED_BY(mMutex); + bool mIsHardwareAccelerated MOZ_GUARDED_BY(mMutex); + nsCString mHardwareAcceleratedReason MOZ_GUARDED_BY(mMutex); + ConversionRequired mConversion MOZ_GUARDED_BY(mMutex); }; } // namespace mozilla ===================================== dom/media/platforms/wrappers/MediaChangeMonitor.cpp ===================================== @@ -668,6 +668,7 @@ RefPtr<ShutdownPromise> MediaChangeMonitor::ShutdownDecoder() { AssertOnThread(); mConversionRequired.reset(); if (mDecoder) { + MutexAutoLock lock(mMutex); RefPtr<MediaDataDecoder> decoder = std::move(mDecoder); return decoder->Shutdown(); } @@ -715,6 +716,7 @@ MediaChangeMonitor::CreateDecoder() { ->Then( GetCurrentSerialEventTarget(), __func__, [self = RefPtr{this}, this](RefPtr<MediaDataDecoder>&& aDecoder) { + MutexAutoLock lock(mMutex); mDecoder = std::move(aDecoder); DDLINKCHILD("decoder", mDecoder.get()); return CreateDecoderPromise::CreateAndResolve(true, __func__); @@ -963,6 +965,11 @@ void MediaChangeMonitor::FlushThenShutdownDecoder( ->Track(mFlushRequest); } +MediaDataDecoder* MediaChangeMonitor::GetDecoderOnNonOwnerThread() const { + MutexAutoLock lock(mMutex); + return mDecoder; +} + #undef LOG } // namespace mozilla ===================================== dom/media/platforms/wrappers/MediaChangeMonitor.h ===================================== @@ -41,34 +41,34 @@ class MediaChangeMonitor final RefPtr<ShutdownPromise> Shutdown() override; bool IsHardwareAccelerated(nsACString& aFailureReason) const override; nsCString GetDescriptionName() const override { - if (mDecoder) { - return mDecoder->GetDescriptionName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetDescriptionName(); } return "MediaChangeMonitor decoder (pending)"_ns; } nsCString GetProcessName() const override { - if (mDecoder) { - return mDecoder->GetProcessName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetProcessName(); } return "MediaChangeMonitor"_ns; } nsCString GetCodecName() const override { - if (mDecoder) { - return mDecoder->GetCodecName(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->GetCodecName(); } return "MediaChangeMonitor"_ns; } void SetSeekThreshold(const media::TimeUnit& aTime) override; bool SupportDecoderRecycling() const override { - if (mDecoder) { - return mDecoder->SupportDecoderRecycling(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->SupportDecoderRecycling(); } return false; } ConversionRequired NeedsConversion() const override { - if (mDecoder) { - return mDecoder->NeedsConversion(); + if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) { + return decoder->NeedsConversion(); } // Default so no conversion is performed. return ConversionRequired::kNeedNone; @@ -97,6 +97,9 @@ class MediaChangeMonitor final MOZ_ASSERT(!mThread || mThread->IsOnCurrentThread()); } + // This is used for getting decoder debug info on other threads. Thread-safe. + MediaDataDecoder* GetDecoderOnNonOwnerThread() const; + bool CanRecycleDecoder() const; typedef MozPromise<bool, MediaResult, true /* exclusive */> @@ -137,6 +140,13 @@ class MediaChangeMonitor final const CreateDecoderParamsForAsync mParams; // Keep any seek threshold set for after decoder creation and initialization. Maybe<media::TimeUnit> mPendingSeekThreshold; + + // This lock is used for mDecoder specifically, but it doens't need to be used + // for every places accessing mDecoder which is mostly on the owner thread. + // However, when requesting decoder debug info, it can happen on other + // threads, so we need this mutex to avoid the data race of + // creating/destroying decoder and accessing decoder's debug info. + mutable Mutex MOZ_ANNOTATED mMutex{"MediaChangeMonitor"}; }; } // namespace mozilla ===================================== gfx/thebes/gfxPlatformFontList.h ===================================== @@ -124,7 +124,7 @@ class ShmemCharMapHashEntry final : public PLDHashEntryHdr { return aCharMap->GetChecksum(); } - enum { ALLOW_MEMMOVE = true }; + enum { ALLOW_MEMMOVE = false }; // because of the Pointer member private: // charMaps are stored in the shared memory that FontList objects point to, ===================================== modules/libpref/init/StaticPrefList.yaml ===================================== @@ -12787,6 +12787,18 @@ value: true mirror: always + # The length of cnonce string used in HTTP digest auth. +- name: network.http.digest_auth_cnonce_length + type: uint32_t + value: 16 + mirror: always + + # If true, HTTP response content-type headers will be parsed using the standards-compliant MimeType parser +- name: network.standard_content_type_parsing.response_headers + type: RelaxedAtomicBool + value: true + mirror: always + # The maximum count that we allow socket prrocess to crash. If this count is # reached, we won't use networking over socket process. - name: network.max_socket_process_failed_count ===================================== netwerk/protocol/http/nsHttpDigestAuth.cpp ===================================== @@ -9,6 +9,7 @@ #include "mozilla/ClearOnShutdown.h" #include "mozilla/Sprintf.h" +#include "mozilla/StaticPrefs_network.h" #include "mozilla/Unused.h" #include "nsHttp.h" @@ -22,6 +23,7 @@ #include "nsCRT.h" #include "nsICryptoHash.h" #include "nsComponentManagerUtils.h" +#include "pk11pub.h" constexpr uint16_t DigestLength(uint16_t aAlgorithm) { if (aAlgorithm & (ALGO_SHA256 | ALGO_SHA256_SESS)) { @@ -321,9 +323,13 @@ nsHttpDigestAuth::GenerateCredentials( // returned Authentication-Info header). also used for session info. // nsAutoCString cnonce; - static const char hexChar[] = "0123456789abcdef"; - for (int i = 0; i < 16; ++i) { - cnonce.Append(hexChar[(int)(15.0 * rand() / (RAND_MAX + 1.0))]); + nsTArray<uint8_t> cnonceBuf; + cnonceBuf.SetLength(StaticPrefs::network_http_digest_auth_cnonce_length() / + 2); + PK11_GenerateRandom(reinterpret_cast<unsigned char*>(cnonceBuf.Elements()), + cnonceBuf.Length()); + for (auto byte : cnonceBuf) { + cnonce.AppendPrintf("%02x", byte); } LOG((" cnonce=%s\n", cnonce.get())); ===================================== uriloader/base/nsURILoader.cpp ===================================== @@ -414,28 +414,28 @@ nsresult nsDocumentOpenInfo::DispatchContent(nsIRequest* request) { NS_ASSERTION(!m_targetStreamListener, "If we found a listener, why are we not using it?"); - if (mFlags & nsIURILoader::DONT_RETARGET) { - LOG( - (" External handling forced or (listener not interested and no " - "stream converter exists), and retargeting disallowed -> aborting")); - return NS_ERROR_WONT_HANDLE_CONTENT; - } - // Before dispatching to the external helper app service, check for an HTTP // error page. If we got one, we don't want to handle it with a helper app, // really. - // The WPT a-download-click-404.html requires us to silently handle this - // without displaying an error page, so we just return early here. - // See bug 1604308 for discussion around what the ideal behaviour is. nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(request)); if (httpChannel) { bool requestSucceeded; rv = httpChannel->GetRequestSucceeded(&requestSucceeded); if (NS_FAILED(rv) || !requestSucceeded) { - return NS_OK; + LOG( + (" Returning NS_ERROR_FILE_NOT_FOUND from " + "nsDocumentOpenInfo::DispatchContent due to failed HTTP response")); + return NS_ERROR_FILE_NOT_FOUND; } } + if (mFlags & nsIURILoader::DONT_RETARGET) { + LOG( + (" External handling forced or (listener not interested and no " + "stream converter exists), and retargeting disallowed -> aborting")); + return NS_ERROR_WONT_HANDLE_CONTENT; + } + // Fifth step: // // All attempts to dispatch this content have failed. Just pass it off to View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/e4ed3f… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/e4ed3f… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Bug 40009: Change the default search engines
by richard (@richard) 10 May '24

10 May '24
richard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: 2cde370f by Dan Ballard at 2024-05-10T21:15:26+00:00 fixup! Bug 40009: Change the default search engines Bug 42290: update Duckduckgoonion to duckduckgo onion and startpage - - - - - 3 changed files: - android-components/components/feature/search/src/main/assets/search/list.json - android-components/components/feature/search/src/main/assets/searchplugins/ddg-onion.xml - android-components/components/feature/search/src/main/assets/searchplugins/startpage-onion.xml Changes: ===================================== android-components/components/feature/search/src/main/assets/search/list.json ===================================== @@ -1,7 +1,7 @@ { "default": { "searchDefault": "DuckDuckGo", - "searchOrder": ["DuckDuckGo", "DuckDuckGoOnion", "Startpage", "StartpageOnion","Wikipedia"], + "searchOrder": ["DuckDuckGo", "DuckDuckGo Onion", "Startpage", "Startpage Onion","Wikipedia"], "visibleDefaultEngines": [ "ddg", "ddg-onion", "startpage", "startpage-onion", "wikipedia" ] ===================================== android-components/components/feature/search/src/main/assets/searchplugins/ddg-onion.xml ===================================== @@ -1,5 +1,5 @@ <SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"> -<ShortName>DuckDuckGoOnion</ShortName> +<ShortName>DuckDuckGo Onion</ShortName> <Description>Duck Duck Go Onion</Description> <InputEncoding>UTF-8</InputEncoding> <Image height="16" width="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAB8lBMVEUAAADkRQzjPwPjQQXkRQ3iPwTiQQXgPQPeQgrcOwPVNgDVNQDWOgbTMwDRMgDQMwDSMwDRNwTQLgDRJgDSJwDSLgDSNwTjOgDiOADjOQDkPADhQAXzs5v+/fv////0vKbiRQvgPQHpdUr85NzuknPdKgDcIwDnZzj2w7HqeU/gPQLsimb/+PftjWn97Obpb0LdJQDeLQDtjmvsi2jgSBDnbULgOQD/39HgLQDeMgDpeFLgSBH0v670uqbaJQD2qImWvP/G1Ob5+/3u//+fvvXyp47dMwDaLwD0u6v0v6/aNQDiXi/aKQD3qozU7/8gSY2vvtg0ZK/OqLDaKQHYKgLgWTfaNADZMgDZMADZLADzqpD7//+xwdz//9H/5Bn/7Bn//ADofADYMADYMQDZOgPXLgDiZDj//97/0AD3tQDvlgHZOgbXLATXMADWMgDfXjLVLQD///z+0AD/3Rn/yRnwnQDcVjbVMQDyv67wuKTSJwDRHQD+8O/tg3/iQQDwhAHnawHWMADvtKfyva7XQxHga0bQGQD2vbH/u8LXIQCmPQzja07XQxLliGn99fPkcVHvhnGZ5VguvUU5wktBwCcAgxzydVv/8/XmiGngdlL+ysi3+I8LtCE80V6P3YmX4sDleljSNQLzr6D7sKPXNQTSIwAEAbMrAAAAF3RSTlMARqSkRvPz80PTpKRG3fPe3hio9/eoGP50jNsAAAABYktHRB5yCiArAAAAyElEQVQYGQXBvUqCYRiA4fu2V9Tn+UQddI3aCpxaOoU6iU4gcqqpoYbALXBuCuoYmttamqJDiEoh4YP+MOi6BNCh+uYKEGiOVNCXXxA2XDVV/UyfKbRCXTLQWAxbP2vt8Ue/uYDvfim91615sb2um6rqtrr/NFb1cUf1Ybd06areU6lSlYpK79jzK1SyJOkfhOl8JGEcqV5zoKrTRqO6yUzIzNu46ijdM1VV9bhuUJ/nZURExLRzUiPQm3kKXHi4BAEGOmOi78A/L1QoU/VHoTsAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTQtMDEtMTlUMjA6MDE6MTEtMDU6MDAuET6cAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE0LTAxLTE5VDIwOjAxOjExLTA1OjAwX0yGIAAAAABJRU5ErkJggg==</Image> ===================================== android-components/components/feature/search/src/main/assets/searchplugins/startpage-onion.xml ===================================== @@ -1,5 +1,5 @@ <SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"> -<ShortName>StartpageOnion</ShortName> +<ShortName>Startpage Onion</ShortName> <Description>Start Page Onion</Description> <InputEncoding>UTF-8</InputEncoding> <Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAASsUlEQVR42qSXXWoCQRCElzxKTiOeSMBLhuAZgscQAR/dXU2aBfnggykaIpTTU9aU3fO3OtXro7C1y/LcFY7zvH4Xbsuy/lZ/wzwTgxWIG2rpqxXy+L4u51+89G2soe/vft6rPRdO6/r6fM/3hndQHx5K+IORk9yM3sUoebSMYTLQo8EPrvoFPODXOIH4AHjGhlg52ROu4AUd1EMsr0thzyLUqwT7Iq8qhsJVcNgNWhgVKA06ChfgKdq8NZ4QeBYZvTSatKQJ34V24HMtHLYFeDxen/XBxRP+HlwIhVmjogQKt6fjcVs69RlPzoAxWUMtLDy8a8BLebj+MHa7bXZTdU7hDvUJsMY8eiF4tjR4DxEW2SfMnj6VQHXJX2jw8jxO9XYOiScT0DqSGXnX+JnSf3ZYj681juUvfS//AYfn11TB3XeWJ9JHzn34NRz3yNPCA1090vmaCt72NWfPkW94FihP8Z7n2+RdTCuT/NNS0A7KC5fAjst5mnfuLt65CT1PanHN8PYyPw0mV6tMrCNtTXpgd+KwCI77z5LC6GpreMKHuttXkjFx/FKy8P04JIPGY80L0sJ3Y+Mf9dlTdcf/EGzwqXNcQG/HEftEdTzQ3/94NQsey2EYCPfHHjMzMzMzMzMzMzMzM1HsOyvqKoo+PW+PJFnPTbPJBjyZcfou6JNnQe89DHrzzi+7HfT+Qyuzd9ReIIZDRmKsIpup0T+zLqxbgAJ0pDxQu5yj88GEB3xa/+6DoDv2BZ2+QLT3cNF2vUWbdRZt2F60gVk7860svus1TNTq7tof9N4D3OEwaT+A1QSqD9HnQo/7Po+mAk5+EmPOhAL7gPYofJ+/DLphW9Dew0SbdLJJjlZOesP4HBcg95OFsb/tO0J04/agL16FPNQdRsT/Mws8H9o4QpgZFbUPM/8g4br+e9ux0xaUO1zrrIH9/olZhHQRnbNU9MGjAJTQ27EY3b4+YshyWVXBGJ51Ds/McHy28uZt0KVr4iQ1bFc3+eWONj+Wt4tl+bsYBeSr5uUtuor1ZX3CjgQm5pIDWKg/PMwLDp28w6wcfumUz9s7fzlojyEZlJRw0y61EnrA2gMEpX8Hz10Hip67mOM/CsMMSsj3oYi1D58thRNClK10cuKsBdZtDdrU4KadDyMMSXFn+3W5vvW9ZnPQr19rwoVzsFKmt0LikSGIGmfOy8KkrM/Zws+fg85eInFnlvCSQA1ObgYl7GvFOuaLTpoj+ukzirT6wocjQtnnqEhoKHcCUIP2A2Hn06egMxfahLjwYZPO5clzUk7PXB/aHTdD9MNHTE/TJGZ1kOl5rNGMUuiQimCYYeNbsLjzvwSdu1Q8ePgPxsxq8hzRj59C1WtRj/H5Io2FGB2edP3IORHKpm7aEcrBI7yk0FBCk/1GS+qY385ftNiG+Va/9MmkDgaXrBE+E6LhbvYXgJgVlpcLkIUgYppPzdL3F6+GUlT9qSWUlNkRl2tZhvXLhWzUQfTw8aB8fuFuBtjxoKt8Zis4xPyQ4nvgmKMx2ldBWGU7Pv4ahx88TnTBCtEtu4LuPRR03+Ggm3cGnb9cdMBo0eZd0ogQiBAf5lr3EH36HFiKn1rwYco3oqGcH/EvpqO/dK3HcJLJycptRw4cI7rnUEwn5JGZ+0+f2YKYtoC+KvgTZwv3xT7Dj79gWF5kDaO48G/6Y/nDx0FbdkvDXDn8gf10HiB65GSwwxvZCV/GR3v3Pi5Eq+65MmaxZpZS3cYdRC9c9oQk53KYFdX71i5NR3up55Tzkx907jJh9tGuNiuZOEv05eua4W/mvIvZ1J5Ds2hz/Vjf4O7rV0wdcyqG56nSTZtZ4Sk4Fh15hxEODLdzAcQwJBoXQWzRTKxB+Hqsg9+9fhPsfLBJTvqGhW9nJnV+446il6/57TNT+n2/AMWbVCIRxtCwYXsAeGH2UtLF6Qts8pN2mNK6H0Tl59TLV8HuE0DUKfrlppg+XxzqmZW7F/e+cC2q5UX42bh0v5HiCqDU+gwXw273do3f+f6tu3YmVBN7bXqKRRDMh8cQ/4gFBWVhFQj3acXt8DUG47AOKf1fdVWvXPcv25l1oGbBOhujGIyRaL8JNKZ+Ckknz1K/3L4v0DwDCHJui9JFKMvsSjANdVcEjZ8pGI7R5wVhsZjVy8Lckm49BmcCDZhYujlMd/gQYv0hbFY/A/zP6PikT/3pC6qF+oUr3F/1jwJ8ArH7YHD/nzQS7ACP6QnOhrJeqgRXeSqCuS03wrdkvYaWOyoNccrViHYbFJNgHMKQWUU4oPcYHXbOGDvjSU9yTZEwmDKOmVL6+jrf/f5OT/6GP3nML+V/eFicQ5OxGEsJ2GCcmy57VouWfJKIWSEL4sHVVqpmk2aX8JOkPtLUdZa+KFMTDD98PvlwxYtWMLTQd/gMSc+eB+PQJY56Zoq1FuxAH39u2/eGShB57eaf5Hf81H46pwVdMnNalS9rbt+LDCiKK/tlAVaWHz6RsS341DHzcedxOde3BOGVG/W3SI/99pmRVRdimFb2GUn8u+u34gKkjMIwt1M/UdMGY6eLzlosumiV6Ir1P5s7B5hLliyOdzbevNh+tm3btm3btm3btm1LY+OzdCe1de5MZTv5Tf1zUuPkbJ+tru66X3fX/wivniqSSOTlYE1PyjeuwXheiykoCsH9wMu8pEoYYC4aEQ0e8yY+9+q08NnX01MIp0ydZoLWYcSR95OEsrJrdT0arhHz3GtXdCJxIrcXHHSZr1DXDNCVkKsdA2E9PQ7eoSryA9GZgCIzW3hYkRmX9f1wu6qCC5BOZxTrymv1uK4VK78n749cV/d4hcRcfAWebamznI10bZa37pc8DbAMD2I6DpHAVx+n19K/IUEQ3A0+oZItzMgE8LXxxPmMzOn8HdYv9/cPhocffznc99DzLvrks+/d9+ccV+DKCAUa+GKFcaS2OBYQBpfY5i4DR8JhOn7z3W9hwSU3/T8ttVk8GtX+f42/6bZHZfql1mzgtJSyz6gSW0uVn2KcQovnBwaG4hc5ZEeupbWlIrI1Tz/nOnuwbnrz7U+dmd/ZsldVvI5rKiaqqtLMhswM7unpD1OmtIU//xoR3nzns3D/wy+ES668Mxx3ymVhrwNPC9vtekzYfLtDw/GnXj7jJeisPPKqfIrz/x0+Jiy54jbp4aavPcsvscLWYeSo8bi/r8CwUcRXOf96Im4dZkm8Eb+avQ88PWy01UFhmVW3T9u89scl2rR5XGSZLcIPP/3JFwCVUkGTjel8nBNOuyLBS1ofVP+tW+14RPRtDQAedUW+zv3RcoJpKQ4PKOHmsy9+dGzv2tcWae+DTrdd4NCusAsSyTov24GLLrdldv36eDp3xbX3qixoVahd2DkAFTIiDCh8LT29/fHrP5B/bOKXrPPTzy209Gbh3gefUxnFAo40/++wMWG19fYA1Ch+kWW3DN/98EfhuuV8lSu71BXsNN5uu+sJbPMZfyQgKG37JSI+v/Xu5zLVUfth+PLGjp0UNtv20Pp6aU1AkfGJdtj92LQjeX+qoq48KkKkESDImwGtgyITJ7WEldfeNVDgaThaZpXtw2tvfCyEWm6c5v8//46OQv4wrOehx596TbhecohgBNvJrVEmLYg3oBvaVRt1wy0PA1cJSaTFltsqXHPDA6GjozvdU6m3GLcv99U3PgprbLBn0cNfd5N9Q2dnj1cbEy0PRF8j3AdaEOFFGxEMuU2OKui6m+6XtnWiuvED7ah+tK/3hZffM03E7Sf6/Y9h4egTL4kYvsXMNBwX/+CjL2r4peVv5PNr6TFHgQZ4Pefl1z4IC0c1068VcXesE7/Ii6+4M3z48TfRtd0eY7R9sdpmIPTGF9Pd3dfU1Z9+7q1w4OHnmPDE9Xo9rtXV1ev4u43g/3Jfk3P5VMq6TbzOXKPFe9LpV+XwX42Dt6O9TNNoNtrywKadsdJau8w4J65z8kZPPvNGifYieuGBpMOxypRrQtDQ7503OFpaOurCMEEPtCBqJ+DTXEAH5lPzktfacdtdjrYdBYjw18NhTLZ8I8+AjMiIloYGzv3598iw6nq7Kwjg+Owntaa5Rkzwy0igf5y8vo6GGIuYyatSTfBffPVTWGGNnYofuh9SyiHonAtvgkUu3PCe5n1FlfJYIOukI58rRDCylwDcNoKfSGJ68+iHsaU4x4jzzSLfPDz74jsCKlRigoJoldOEgIzcWunmaivJ63/7fVjYYIsDhDD2jGP3SM2K44l4zbKr7RB+/f1fqQkRkksiYezMWClJrRtw4GVIN+74CVPCwUeeaz4gPDDBzzXacocjwtSWDpEOqcbLqRLuUxXxSnPFeW7R3ui0e+jRl0wu5CJU1GyW0scmUdvCXMynhhVOOuMqC2ESZgkxSivU7ZV1qwIjfv0MNfKYiPUGXHjU6Anh5DOvNheEgJG5TwtFeuCRFx2FIcXBevBITcw06cBXLnpEO9PyGuHnX/4OZ553fdwRO88WLWj51XdsWtBX33C/CdfcLpHjS628ncWRXUaZTl/UXSKpBdFVSmjSEt9hzBG6knx49MlXw0FHnGMaE2AEcFTj7YHtvNcJ4a77ngmjx0y0+zV9SSeefmWaU6ckzDFWW8sUBvNrAT5EwoKI0tGDUB+vdDWkL/9Fa0j+fv/JirYv0FJJLrv6rhg/vqIpvPc95MxwyFHnxfjy5eGiy28P9zzwbPjgo6/DxIkthtv4LS2tHdHQOrrYCDziuAvjixwU8V+k9Od6XUvNsYJ7OePnAP5jYeNL++eoOeX8sOFjw6rr7lYCZwZhFmTyuKYBv+R1UJ7SWTfqED4RGmNaZcs7+HROjj/V0Tyqiy+/FbQtusrJW8Tuo0++FXBcUiNmvxVBeboZSMiMwLgPhijg+VKyaY8Y5xg9liYf6vYHKckVGnRrb7yPyRZHdjXX5zh/byXaxIu8HPq3Ne47Glxwjib/fBPKpuMXq6f7HnyGxSPU+p4SWxWU123jncaa7p/DOSKQzW1NaOQHoRyLbW1dFnifadSMWhENtmtufAAQ44BDPAcVlHcGxlU3cu4m3WNI3F82T2XuDs/z9w8fOc7ixgUu8k0t8mYZHFifMezcruZvNb6iDeDpuY86L4dA4rieXwo7es7Hn34XFl9ha48qijkWmbOcIynj/BVA6QXMVL8FEZ5YcOB/4JxDyJKalS6Q0AaUJYTBhV2DIuE23zTsus9JseivB+s7C0EAs5Wjr40YU5oOrhUE2CCv0wKFLUIIMMPt1LOvhbvaa6hdeNntdj+t6fh7RyOoLoUaH65uAa9lhCPcV0wajtrau8Iue51Q5rSzIM4L78yu1ERZjCAgiEV1frVMQIvISypIB5S5TiOiUF5ro73toaqEACOMr7jmzpYyI7S4hlML0lADnpR7AfpFcA7y8OXa2gDzw6qVJC250rYlLnFLy+ffR/iRNRYVBB21IglPumM4eKTtOQS00/gp15osM441DTo0anTnvU/L6hz+Nn6oFaFE14SRz5UrqRqwEkNGV63r++sIlmVFnHHu9ZmcosQz7+jaGx8ocEcrCNK8hgU97pzbKLi3V/PS45YfZComv/ichpTqG8QajvHK0ZI3TRaYjmt1hTphhu3RtJMP17pc3BoqLOfUckUJP9wRzeqbP/4cAYPV7YpOL0D4LIQhJoPzYq4ytvBScOR53T+O62Mc8z/74ocklKU8OOv8G+EJSCQgHOOV16ynAC3QOvQc/zh3jfY16XvCs/vamx+HpVfZvp7oVU/2ssicQZa7pZtu1qG3rTMArb9I8mK+XsvbxxpqL8bltVZnNjqcFmuMLR5giVvmBzrmpEvDl1//LFzw0AJVR10644x02zDhHqafSLqu6W4WvEoP1B+FKHvFHKyZqm9a2zpDX/8g1hJQU9IvqMz092swLqGkzpH3+2Kc/1lDrCnWKno+oEpbr9qq1V3FBa+/fCGDClRl37Ug/bJ1VxnhX8Muq0QQvGDbN9yQItb19CzSc8rHC3jRrAP//TGOVwUuaDWuoUT3IHUeRTQO6xWOk/BVS9jTBS9oXdzi8Pkrw0s9GKG9ZHNQFSarB6ITx7QM0vP9YVPhmsF8O3bYC3gv0y8IhPPC8ICsUBBDEvgpHYRcQ8ooDaVaNdYRQ8I15tp9PrAXcHBBt0RvDpBf8PnTGP3ndUazKrSQvHhenKv5w80X9N/4Rn4CbMgsOUCJ2w2tx3lfrdU452i+/P4U5qKdDhLPfmk0pi1Q2b84edVIU7C1RNW4q5EHYU3BE+fwmtnEGznm6Plunw+P9qwbK1f1f3Fw5Ui/iC0+G6kxr++pr/HbCCXX/WQffFVV/2lS+h/7F/vmLxBPHh7pg0gdiOpo3ki4kItly3zL+w3NRkukd+ILONgg3551eu7/AxK2F7WQPNQ+AAAAAElFTkSuQmCC</Image> View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/2cd… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/2cd… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Enable the connect assist experiments on alpha
by Dan Ballard (@dan) 09 May '24

09 May '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: 50c4fb9d by clairehurst at 2024-05-09T14:51:05-06:00 fixup! Enable the connect assist experiments on alpha - - - - - 13 changed files: - fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt - fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt - fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt - fenix/app/src/main/java/org/mozilla/fenix/components/Core.kt - fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt - − fenix/app/src/main/java/org/mozilla/fenix/tor/TorBetaConnectionFeaturesFragment.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorBootstrapFragment.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistViewModel.kt - fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt - − fenix/app/src/main/res/layout/tor_network_settings_beta_connection_features.xml - fenix/app/src/main/res/navigation/nav_graph.xml - fenix/app/src/main/res/values/preference_keys.xml - fenix/app/src/main/res/xml/preferences.xml Changes: ===================================== fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt ===================================== @@ -1186,19 +1186,15 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity, TorIn } open fun navigateToHome() { - if (settings().useNewBootstrap) { - if (settings().useNewBootstrapNativeUi) { - navHost.navController.navigate(NavGraphDirections.actionStartupTorConnectionAssist()) - } else { - navHost.navController.navigate(NavGraphDirections.actionStartupHome()) - openToBrowserAndLoad( - searchTermOrURL = "about:torconnect", - newTab = true, - from = BrowserDirection.FromHome, - ) - } + if (!settings().useHtmlConnectionUi) { + navHost.navController.navigate(NavGraphDirections.actionStartupTorConnectionAssist()) } else { - navHost.navController.navigate(NavGraphDirections.actionStartupTorbootstrap()) + navHost.navController.navigate(NavGraphDirections.actionStartupHome()) + openToBrowserAndLoad( + searchTermOrURL = "about:torconnect", + newTab = true, + from = BrowserDirection.FromHome, + ) } } ===================================== fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt ===================================== @@ -1217,12 +1217,7 @@ abstract class BaseBrowserFragment : private fun handleBetaHtmlTorConnect() { val currentTab = getCurrentTab() ?: return if (currentTab.content.url == "about:torconnect") { - if (!requireActivity().settings().useNewBootstrap) { - requireContext().components.useCases.tabsUseCases.removeTab(currentTab.id) - (requireActivity() as HomeActivity).navHost.navController.navigate( - NavGraphDirections.actionStartupTorbootstrap(), - ) - } else if (!requireActivity().settings().useNewBootstrapHtmlUi) { + if (!requireActivity().settings().useHtmlConnectionUi) { requireContext().components.useCases.tabsUseCases.removeTab(currentTab.id) (requireActivity() as HomeActivity).navigateToHome() } else { ===================================== fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt ===================================== @@ -202,7 +202,7 @@ class Components(private val context: Context) { ), ) } - val torController by lazyMonitored { if (settings.useNewBootstrap) TorControllerGV(context) else TorControllerTAS(context) } + val torController by lazyMonitored { TorControllerGV(context) } } /** ===================================== fenix/app/src/main/java/org/mozilla/fenix/components/Core.kt ===================================== @@ -145,7 +145,6 @@ class Core( .shouldShowCookieBannerReEngagementDialog(), torSecurityLevel = context.settings().torSecurityLevel().intRepresentation, spoofEnglish = context.settings().spoofEnglish, - useNewBootstrap = context.settings().useNewBootstrap, ) GeckoEngine( ===================================== fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt ===================================== @@ -40,6 +40,7 @@ import mozilla.components.concept.sync.Profile import mozilla.components.service.glean.private.NoExtras import mozilla.components.support.ktx.android.view.showKeyboard import org.mozilla.fenix.BrowserDirection +import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.Config import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.GleanMetrics.Addons @@ -738,13 +739,9 @@ class SettingsFragment : PreferenceFragmentCompat() { } } - requirePreference<Preference>(R.string.pref_key_use_new_bootstrap).apply { - setOnPreferenceClickListener { - val directions = - SettingsFragmentDirections.actionSettingsFragmentToBetaConnectionFeaturesFragment() - requireView().findNavController().navigate(directions) - true - } + requirePreference<Preference>(R.string.pref_key_use_html_connection_ui).apply { + onPreferenceChangeListener = object : SharedPreferenceUpdater() {} + isVisible = BuildConfig.DEBUG } requirePreference<Preference>(R.string.pref_key_tor_logs).apply { ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorBetaConnectionFeaturesFragment.kt deleted ===================================== @@ -1,66 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.tor - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.core.view.children -import androidx.fragment.app.Fragment -import org.mozilla.fenix.databinding.TorNetworkSettingsBetaConnectionFeaturesBinding -import org.mozilla.fenix.ext.components -import org.mozilla.fenix.ext.settings - -/** - * Lets the user customize beta connection features mode. - */ -class TorBetaConnectionFeaturesFragment : Fragment() { - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle?, - ): View { - val binding = TorNetworkSettingsBetaConnectionFeaturesBinding.inflate(inflater) - - binding.enableBetaConnectionFeaturesSwitch.run { - isChecked = context.settings().useNewBootstrap - setConnectionAssistUI(binding, isChecked) - - setOnCheckedChangeListener { _, isConnectionAssistEnabled -> - context.settings().useNewBootstrap = isConnectionAssistEnabled - setConnectionAssistUI(binding, isConnectionAssistEnabled) - updateEngineConnectionAssistMode() - } - } - - // Since the beta connection features modes are in a RadioGroup we only need one listener to know of all their changes. - binding.useNewBootstrapWithNativeUiRadioButton.setOnCheckedChangeListener { _, _ -> - updateEngineConnectionAssistMode() - } - - return binding.root - } - - private fun setConnectionAssistUI( - binding: TorNetworkSettingsBetaConnectionFeaturesBinding, - isBetaConnectionAssistEnabled: Boolean, - ) { - if (!isBetaConnectionAssistEnabled) { - binding.enableBetaConnectionFeaturesModes.apply { - clearCheck() - children.forEach { it.isEnabled = false } - } - } else { - binding.enableBetaConnectionFeaturesModes.children.forEach { it.isEnabled = true } - } - } - - private fun updateEngineConnectionAssistMode() { - requireContext().components.core.engine.settings.useNewBootstrap = - requireContext().settings().useNewBootstrap - } - -} ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorBootstrapFragment.kt ===================================== @@ -164,9 +164,7 @@ class TorBootstrapFragment : Fragment() { // triggered to cause an automatic update on warm start (no tab selection occurs). So we // update it manually here. requireComponents.useCases.sessionUseCases.updateLastAccess() - if (requireContext().settings().useNewBootstrap){ - (requireActivity() as HomeActivity).navigateToHome() - } + (requireActivity() as HomeActivity).navigateToHome() } private fun handleTorBootstrapConnect() { ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistViewModel.kt ===================================== @@ -21,7 +21,7 @@ class TorConnectionAssistViewModel( private val TAG = "torConnectionAssistVM" private val components = getApplication<Application>().components - private val _torController: TorControllerGV = components.torController as TorControllerGV + private val _torController: TorControllerGV = components.torController private val _torConnectScreen = MutableStateFlow(ConnectAssistUiState.Splash) internal val torConnectScreen: StateFlow<ConnectAssistUiState> = _torConnectScreen ===================================== fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt ===================================== @@ -1855,18 +1855,8 @@ class Settings(private val appContext: Context) : PreferencesHolder { */ var enableUnifiedSearchSettingsUI: Boolean = showUnifiedSearchFeature && FeatureFlags.unifiedSearchSettings - var useNewBootstrap by booleanPreference( - appContext.getPreferenceKey(R.string.pref_key_use_new_bootstrap), - default = true, - ) - - var useNewBootstrapNativeUi by booleanPreference( - appContext.getPreferenceKey(R.string.pref_key_use_new_bootstrap_with_android_native), - default = true, - ) - - var useNewBootstrapHtmlUi by booleanPreference( - appContext.getPreferenceKey(R.string.pref_key_use_new_bootstrap_with_html), - default = false + var useHtmlConnectionUi by booleanPreference( + appContext.getPreferenceKey(R.string.pref_key_use_html_connection_ui), + default = false, ) } ===================================== fenix/app/src/main/res/layout/tor_network_settings_beta_connection_features.xml deleted ===================================== @@ -1,99 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <TextView - android:id="@+id/enable_beta_connection_features_title" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="16dp" - android:layout_marginTop="16dp" - android:layout_marginBottom="2dp" - android:clickable="false" - android:text="Enable beta connection features" - android:textAppearance="@style/ListItemTextStyle" - android:textSize="16sp" - app:layout_constraintBottom_toTopOf="@id/enable_beta_connection_features_summary" - app:layout_constraintEnd_toStartOf="@id/enable_beta_connection_features_switch" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:lineHeight="24.sp" /> - - <TextView - android:id="@+id/enable_beta_connection_features_summary" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:text="Help us test our new connection assist features which focuses on a streamlined connection with better integration with bridges" - android:textColor="?attr/textSecondary" - android:textColorLink="?attr/textSecondary" - android:textSize="12sp" - app:layout_constraintBottom_toTopOf="@id/enable_beta_connection_features_modes" - app:layout_constraintEnd_toEndOf="@id/enable_beta_connection_features_title" - app:layout_constraintStart_toStartOf="@id/enable_beta_connection_features_title" - app:layout_constraintTop_toBottomOf="@id/enable_beta_connection_features_title" - app:lineHeight="16.sp" /> - - <androidx.appcompat.widget.SwitchCompat - android:id="@+id/enable_beta_connection_features_switch" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:minHeight="48dp" - android:paddingStart="18dp" - android:paddingEnd="18dp" - android:textColor="@color/state_list_text_color" - android:textOff="@string/studies_off" - android:textOn="@string/studies_on" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="@id/enable_beta_connection_features_title" /> - - <RadioGroup - android:id="@+id/enable_beta_connection_features_modes" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="10dp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/enable_beta_connection_features_summary"> - - <org.mozilla.fenix.settings.PreferenceBackedRadioButton - android:id="@+id/use_new_bootstrap_with_native_ui_radio_button" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="?android:attr/selectableItemBackground" - android:button="@null" - android:drawablePadding="@dimen/radio_button_preference_drawable_padding" - android:paddingStart="@dimen/radio_button_preference_horizontal" - android:paddingTop="@dimen/radio_button_preference_vertical" - android:paddingEnd="@dimen/radio_button_preference_horizontal" - android:paddingBottom="@dimen/radio_button_preference_vertical" - android:text="Native Android UI" - android:textAppearance="?android:attr/textAppearanceListItem" - android:textSize="16sp" - app:drawableStartCompat="?android:attr/listChoiceIndicatorSingle" - app:preferenceKey="@string/pref_key_use_new_bootstrap_with_android_native" - app:preferenceKeyDefaultValue="true" /> - - <org.mozilla.fenix.settings.PreferenceBackedRadioButton - android:id="@+id/use_new_bootstrap_with_html_ui_radio_button" - android:layout_width="match_parent" - android:layout_height="48dp" - android:background="?android:attr/selectableItemBackground" - android:button="@null" - android:drawablePadding="@dimen/radio_button_preference_drawable_padding" - android:paddingStart="@dimen/radio_button_preference_horizontal" - android:paddingTop="@dimen/radio_button_preference_vertical" - android:paddingEnd="@dimen/radio_button_preference_horizontal" - android:paddingBottom="@dimen/radio_button_preference_vertical" - android:text="HTML UI" - android:textAppearance="?android:attr/textAppearanceListItem" - android:textSize="16sp" - app:drawableStartCompat="?android:attr/listChoiceIndicatorSingle" - app:preferenceKey="@string/pref_key_use_new_bootstrap_with_html" - app:preferenceKeyDefaultValue="false" /> - </RadioGroup> - -</androidx.constraintlayout.widget.ConstraintLayout> ===================================== fenix/app/src/main/res/navigation/nav_graph.xml ===================================== @@ -977,11 +977,6 @@ android:id="@+id/torBridgeConfigFragment" android:name="org.mozilla.fenix.settings.TorBridgeConfigFragment" android:label="@string/preferences_tor_network_settings_bridge_config" /> - <fragment - android:id="@+id/torBetaConnectionFeaturesFragment" - android:name="org.mozilla.fenix.tor.TorBetaConnectionFeaturesFragment" - android:label="Enable beta connection features" - tools:layout="@layout/tor_network_settings_beta_connection_features" /> <fragment android:id="@+id/torLogsFragment" android:name="org.mozilla.fenix.tor.TorLogsComposeFragment" ===================================== fenix/app/src/main/res/values/preference_keys.xml ===================================== @@ -378,10 +378,8 @@ <string name="pref_key_tor_network_settings_explanation" translatable="false">pref_key_tor_network_settings_explanation</string> <string name="pref_key_tor_network_settings_bridge_config" translatable="false">pref_key_tor_network_settings_bridge_config</string> - <string name="pref_key_use_new_bootstrap" translatable="false">pref_key_use_new_bootstrap</string> <string name="pref_key_tor_logs" translatable="false">pref_key_tor_logs</string> - <string name="pref_key_use_new_bootstrap_with_android_native" translatable="false">pref_key_use_new_bootstrap_with_android_native</string> - <string name="pref_key_use_new_bootstrap_with_html" translatable="false">pref_key_use_new_bootstrap_with_html</string> + <string name="pref_key_use_html_connection_ui" translatable="false">pref_key_use_html_connection_ui</string> <!-- Changing the pref_key should reset it to off for users that had it enabled --> <string name="pref_key_tor_network_settings_bridge_config_explanation" translatable="false">pref_key_tor_network_settings_bridge_config_explanation</string> <string name="pref_key_tor_network_settings_bridge_config_toggle" translatable="false">pref_key_tor_network_settings_bridge_config_toggle</string> <string name="pref_key_tor_network_settings_bridge_config_builtin_bridge_obfs4" translatable="false">pref_key_tor_network_settings_bridge_config_builtin_bridge_obfs4</string> ===================================== fenix/app/src/main/res/xml/preferences.xml ===================================== @@ -176,10 +176,12 @@ android:title="@string/tor_bootstrap_quick_start_label" app:iconSpaceReserved="false" /> - <Preference - android:key="@string/pref_key_use_new_bootstrap" - app:iconSpaceReserved="false" - android:title="Enable beta connection features" /> + <SwitchPreference + android:defaultValue="false" + android:key="@string/pref_key_use_html_connection_ui" + android:summary="Recommended only for debugging" + android:title="Enable HTML connection UI" + app:iconSpaceReserved="false" /> <Preference android:key="@string/pref_key_tor_logs" View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/50c… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/50c… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Implement Android-native Connection Assist UI
by Dan Ballard (@dan) 09 May '24

09 May '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: a00861a6 by clairehurst at 2024-05-09T14:47:16-06:00 fixup! Implement Android-native Connection Assist UI - - - - - 4 changed files: - fenix/app/src/main/java/org/mozilla/fenix/tor/ConnectAssistUiState.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistFragment.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistViewModel.kt - fenix/app/src/main/res/layout/fragment_tor_connection_assist.xml Changes: ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/ConnectAssistUiState.kt ===================================== @@ -31,7 +31,8 @@ enum class ConnectAssistUiState( val torBootstrapButton2Visible: Boolean, @StringRes val torBootstrapButton2TextStringResource: Int? = R.string.connection_assist_configure_connection_button, val torBootstrapButton2ShouldOpenSettings: Boolean = true, - val wordmarkLogoVisible: Boolean, + val wordmarkLogoVisible: Boolean = false, + val torBootstrapButton2ShouldRestartApp: Boolean = false, ) { Splash( progressBarVisible = false, @@ -65,9 +66,8 @@ enum class ConnectAssistUiState( torBootstrapButton2Visible = true, torBootstrapButton2TextStringResource = R.string.connection_assist_configure_connection_button, torBootstrapButton2ShouldOpenSettings = true, - wordmarkLogoVisible = false, ), - Bootstrapping( + Connecting( progressBarVisible = true, progress = 0, backButtonVisible = false, @@ -85,7 +85,6 @@ enum class ConnectAssistUiState( torBootstrapButton2Visible = true, torBootstrapButton2TextStringResource = R.string.btn_cancel, torBootstrapButton2ShouldOpenSettings = false, - wordmarkLogoVisible = false, ), InternetError( progressBarVisible = true, @@ -109,7 +108,6 @@ enum class ConnectAssistUiState( torBootstrapButton2Visible = true, torBootstrapButton2TextStringResource = R.string.connection_assist_configure_connection_button, torBootstrapButton2ShouldOpenSettings = true, - wordmarkLogoVisible = false, ), TryingAgain( progressBarVisible = true, @@ -132,9 +130,8 @@ enum class ConnectAssistUiState( torBootstrapButton2Visible = true, torBootstrapButton2TextStringResource = R.string.btn_cancel, torBootstrapButton2ShouldOpenSettings = false, - wordmarkLogoVisible = false, ), - TryABridge( + ConnectionAssist( progressBarVisible = true, progress = 100, progressTintColorResource = R.color.warning_yellow, @@ -157,7 +154,6 @@ enum class ConnectAssistUiState( torBootstrapButton2Visible = false, torBootstrapButton2TextStringResource = null, torBootstrapButton2ShouldOpenSettings = true, - wordmarkLogoVisible = false, ), TryingABridge( progressBarVisible = true, @@ -180,7 +176,6 @@ enum class ConnectAssistUiState( torBootstrapButton2Visible = true, torBootstrapButton2TextStringResource = R.string.btn_cancel, torBootstrapButton2ShouldOpenSettings = false, - wordmarkLogoVisible = false, ), LocationError( progressBarVisible = true, @@ -207,7 +202,6 @@ enum class ConnectAssistUiState( torBootstrapButton2Visible = false, torBootstrapButton2TextStringResource = null, torBootstrapButton2ShouldOpenSettings = true, - wordmarkLogoVisible = false, ), LocationCheck( progressBarVisible = true, @@ -234,7 +228,6 @@ enum class ConnectAssistUiState( torBootstrapButton2Visible = false, torBootstrapButton2TextStringResource = null, torBootstrapButton2ShouldOpenSettings = true, - wordmarkLogoVisible = false, ), LastTry( progressBarVisible = true, @@ -258,7 +251,6 @@ enum class ConnectAssistUiState( torBootstrapButton2Visible = true, torBootstrapButton2TextStringResource = R.string.btn_cancel, torBootstrapButton2ShouldOpenSettings = false, - wordmarkLogoVisible = false, ), FinalError( progressBarVisible = true, @@ -279,10 +271,10 @@ enum class ConnectAssistUiState( unblockTheInternetInCountryDescriptionVisible = false, countryDropDownVisible = false, torBootstrapButton1Visible = true, - torBootstrapButton1TextStringResource = R.string.connection_assist_internet_error_try_again, + torBootstrapButton1TextStringResource = R.string.connection_assist_configure_connection_button, torBootstrapButton2Visible = true, - torBootstrapButton2TextStringResource = R.string.connection_assist_configure_connection_button, - torBootstrapButton2ShouldOpenSettings = true, - wordmarkLogoVisible = false, + torBootstrapButton2TextStringResource = R.string.mozac_lib_crash_dialog_button_restart, + torBootstrapButton2ShouldOpenSettings = false, + torBootstrapButton2ShouldRestartApp = true, ) } ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistFragment.kt ===================================== @@ -4,6 +4,7 @@ package org.mozilla.fenix.tor +import android.content.Intent import android.graphics.Color import android.os.Build import android.os.Bundle @@ -25,6 +26,7 @@ import androidx.lifecycle.repeatOnLifecycle import androidx.navigation.fragment.findNavController import kotlinx.coroutines.launch import mozilla.components.support.base.feature.UserInteractionHandler +import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.databinding.FragmentTorConnectionAssistBinding import org.mozilla.fenix.ext.hideToolbar @@ -33,14 +35,15 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler { private val TAG = "TorConnectionAssistFrag" private val viewModel: TorConnectionAssistViewModel by viewModels() - private lateinit var binding: FragmentTorConnectionAssistBinding + private var _binding: FragmentTorConnectionAssistBinding? = null + private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, ): View { - binding = FragmentTorConnectionAssistBinding.inflate( + _binding = FragmentTorConnectionAssistBinding.inflate( inflater, container, false, ) @@ -90,96 +93,148 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler { } - override fun onDestroyView() { - super.onDestroyView() - } - private fun showScreen(screen: ConnectAssistUiState) { - binding.apply { - torBootstrapProgressBar.visibility = if (screen.progressBarVisible) View.VISIBLE else View.GONE - torBootstrapProgressBar.progress = screen.progress - torBootstrapProgressBar.progressTintList = - screen.progressTintColorResource?.let { - AppCompatResources.getColorStateList(requireContext(), - it - ) - } - - settingsButton.visibility = if (screen.settingsButtonVisible) View.VISIBLE else View.GONE - settingsButton.setOnClickListener { - viewModel.cancelTorBootstrap() - openSettings() - } + setProgressBar(screen) + setSettingsButton(screen) + setBackButton(screen) + setTorConnectImage(screen) + setTitle(screen) + setQuickStart(screen) + setCountryDropDown(screen) + setButton1(screen) + setButton2(screen) + setSplashLogo(screen) + } - backButton.visibility = if (screen.backButtonVisible) View.VISIBLE else View.INVISIBLE - backButton.setOnClickListener { - viewModel.handleBackButtonPressed() + private fun setProgressBar(screen: ConnectAssistUiState) { + binding.torBootstrapProgressBar.visibility = + if (screen.progressBarVisible) View.VISIBLE else View.GONE + binding.torBootstrapProgressBar.progress = screen.progress + binding.torBootstrapProgressBar.progressTintList = + screen.progressTintColorResource?.let { + AppCompatResources.getColorStateList( + requireContext(), + it, + ) } + } - torConnectImage.visibility = if (screen.torConnectImageVisible) View.VISIBLE else View.GONE - torConnectImage.setImageResource(screen.torConnectImageResource) - - titleLargeTextView.visibility = if (screen.titleLargeTextViewVisible) View.VISIBLE else View.GONE - titleLargeTextView.text = getString(screen.titleLargeTextViewTextStringResource) - titleDescription.visibility = if (screen.titleDescriptionVisible) View.VISIBLE else View.GONE - if (screen.learnMoreStringResource != null && screen.internetErrorDescription != null) { - val learnMore: String = getString(screen.learnMoreStringResource) - val internetErrorDescription: String = - if (screen.internetErrorDescription1 == null) { - getString( - screen.internetErrorDescription, - learnMore, - ) - } else if (screen.internetErrorDescription2 == null) { - getString( - screen.internetErrorDescription, - getString(screen.internetErrorDescription1), - learnMore, - ) - } else { - getString( - screen.internetErrorDescription, - getString(screen.internetErrorDescription1), - getString(screen.internetErrorDescription2), - learnMore, - ) - } - handleDescriptionWithClickable(internetErrorDescription, learnMore) - } else if (screen.titleDescriptionTextStringResource != null) { - titleDescription.text = getString(screen.titleDescriptionTextStringResource) - } - quickstartSwitch.visibility = if (screen.quickstartSwitchVisible) View.VISIBLE else View.GONE - quickstartSwitch.isChecked = viewModel.quickstartToggle().value == true - quickstartSwitch.setOnCheckedChangeListener { _, isChecked -> - viewModel.handleQuickstartChecked(isChecked) - } + private fun setSettingsButton(screen: ConnectAssistUiState) { + binding.settingsButton.visibility = if (screen.settingsButtonVisible) View.VISIBLE else View.GONE + binding.settingsButton.setOnClickListener { + viewModel.cancelTorBootstrap() + openSettings() + } + } - unblockTheInternetInCountryDescription.visibility = if (screen.unblockTheInternetInCountryDescriptionVisible) View.VISIBLE else View.GONE - countryDropDown.visibility = if (screen.countryDropDownVisible) View.VISIBLE else View.GONE + private fun setBackButton(screen: ConnectAssistUiState) { + binding.backButton.visibility = if (screen.backButtonVisible) View.VISIBLE else View.INVISIBLE + binding.backButton.setOnClickListener { + viewModel.handleBackButtonPressed() + } + } - torBootstrapButton1.visibility = if (screen.torBootstrapButton1Visible) View.VISIBLE else View.GONE - torBootstrapButton1.text = getString(screen.torBootstrapButton1TextStringResource) - torBootstrapButton1.setOnClickListener { viewModel.handleButton1Pressed(screen, lifecycleScope) } + private fun setTorConnectImage(screen: ConnectAssistUiState) { + binding.torConnectImage.visibility = if (screen.torConnectImageVisible) View.VISIBLE else View.GONE + binding.torConnectImage.setImageResource(screen.torConnectImageResource) + } - torBootstrapButton2.visibility = if (screen.torBootstrapButton2Visible) View.VISIBLE else View.GONE - torBootstrapButton2.text = screen.torBootstrapButton2TextStringResource?.let { - getString( - it - ) - } - torBootstrapButton2.setOnClickListener { - viewModel.cancelTorBootstrap() - if (screen.torBootstrapButton2ShouldOpenSettings){ - openTorConnectionSettings() + private fun setTitle(screen: ConnectAssistUiState) { + binding.titleLargeTextView.visibility = + if (screen.titleLargeTextViewVisible) View.VISIBLE else View.GONE + binding.titleLargeTextView.text = getString(screen.titleLargeTextViewTextStringResource) + binding.titleDescription.visibility = + if (screen.titleDescriptionVisible) View.VISIBLE else View.GONE + if (screen.learnMoreStringResource != null && screen.internetErrorDescription != null) { + val learnMore: String = getString(screen.learnMoreStringResource) + val internetErrorDescription: String = + if (screen.internetErrorDescription1 == null) { + getString( + screen.internetErrorDescription, + learnMore, + ) + } else if (screen.internetErrorDescription2 == null) { + getString( + screen.internetErrorDescription, + getString(screen.internetErrorDescription1), + learnMore, + ) } else { - showScreen(ConnectAssistUiState.Configuring) + getString( + screen.internetErrorDescription, + getString(screen.internetErrorDescription1), + getString(screen.internetErrorDescription2), + learnMore, + ) } - } + handleDescriptionWithClickable(internetErrorDescription, learnMore) + } else if (screen.titleDescriptionTextStringResource != null) { + binding.titleDescription.text = getString(screen.titleDescriptionTextStringResource) + } + } + + private fun setQuickStart(screen: ConnectAssistUiState) { + binding.quickstartSwitch.visibility = + if (screen.quickstartSwitchVisible) View.VISIBLE else View.GONE + binding.quickstartSwitch.isChecked = viewModel.quickstartToggle().value == true + binding.quickstartSwitch.setOnCheckedChangeListener { _, isChecked -> + viewModel.handleQuickstartChecked(isChecked) + } + } + + private fun setCountryDropDown(screen: ConnectAssistUiState) { + binding.unblockTheInternetInCountryDescription.visibility = + if (screen.unblockTheInternetInCountryDescriptionVisible) View.VISIBLE else View.GONE + binding.countryDropDown.visibility = if (screen.countryDropDownVisible) View.VISIBLE else View.GONE + } - wordmarkLogo.visibility = if(screen.wordmarkLogoVisible) View.VISIBLE else View.GONE + private fun setButton1(screen: ConnectAssistUiState) { + binding.torBootstrapButton1.visibility = + if (screen.torBootstrapButton1Visible) View.VISIBLE else View.GONE + binding.torBootstrapButton1.text = getString(screen.torBootstrapButton1TextStringResource) + binding.torBootstrapButton1.setOnClickListener { + viewModel.handleButton1Pressed( + screen, + lifecycleScope, + ) + } + } + + private fun setButton2(screen: ConnectAssistUiState) { + binding.torBootstrapButton2.visibility = + if (screen.torBootstrapButton2Visible) View.VISIBLE else View.GONE + if (screen.torBootstrapButton2ShouldRestartApp) { + binding.torBootstrapButton2.text = + screen.torBootstrapButton2TextStringResource?.let { + getString( + it, + getString(R.string.app_name), + ) + } + } else { + binding.torBootstrapButton2.text = + screen.torBootstrapButton2TextStringResource?.let { + getString( + it, + ) + } + } + binding.torBootstrapButton2.setOnClickListener { + viewModel.cancelTorBootstrap() + if (screen.torBootstrapButton2ShouldOpenSettings) { + openTorConnectionSettings() + } else if (screen.torBootstrapButton2ShouldRestartApp) { + restartApplication() + } else { + showScreen(ConnectAssistUiState.Configuring) + } } } + private fun setSplashLogo(screen: ConnectAssistUiState) { + binding.wordmarkLogo.visibility = if (screen.wordmarkLogoVisible) View.VISIBLE else View.GONE + } + /** * from https://stackoverflow.com/questions/10696986/how-to-set-the-part-of-the-tex… */ @@ -207,6 +262,7 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler { } private fun showLearnMore() { + Log.d(TAG, "showLearnMore() tapped") //TODO("Not yet implemented") } @@ -231,6 +287,15 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler { ) } + private fun restartApplication() { + startActivity( + Intent(requireContext(), HomeActivity::class.java).addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK, + ), + ) + Runtime.getRuntime().exit(0) + } + override fun onBackPressed(): Boolean { return viewModel.handleBackButtonPressed() } ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistViewModel.kt ===================================== @@ -124,7 +124,7 @@ class TorConnectionAssistViewModel( /** stay here */ } - ConnectAssistUiState.TryABridge -> { + ConnectAssistUiState.ConnectionAssist -> { _torConnectScreen.value = ConnectAssistUiState.TryingABridge } @@ -144,7 +144,7 @@ class TorConnectionAssistViewModel( /** stay here */ } - else -> _torConnectScreen.value = ConnectAssistUiState.Bootstrapping + else -> _torConnectScreen.value = ConnectAssistUiState.Connecting } } @@ -155,28 +155,58 @@ class TorConnectionAssistViewModel( "TorError(message = $message, details = $details, phase = $phase, reason = $reason", ) // TODO better error handling - _torConnectScreen.value = ConnectAssistUiState.InternetError + when (reason) { +// "noroute" -> handleNoRoute() TODO re-add when working better + else -> handleUnknownError() + } + } + } + + private fun handleNoRoute() { + Log.d(TAG, "handleNoRoute(), _torConnectScreen.value = ${_torConnectScreen.value}") + when (_torConnectScreen.value) { + ConnectAssistUiState.Connecting -> _torConnectScreen.value = ConnectAssistUiState.ConnectionAssist + ConnectAssistUiState.ConnectionAssist -> {/** no op, likely a duplicate error */} + ConnectAssistUiState.TryingABridge -> _torConnectScreen.value = ConnectAssistUiState.LocationCheck + ConnectAssistUiState.LocationCheck -> {/** no op, likely a duplicate error */} + ConnectAssistUiState.LastTry -> _torConnectScreen.value = ConnectAssistUiState.FinalError + ConnectAssistUiState.FinalError -> {/** no op, likely a duplicate error */} + else -> _torConnectScreen.value = ConnectAssistUiState.InternetError } } + private fun handleUnknownError() { + // TODO should we have a dedicated screen for unknown errors? + _torConnectScreen.value = ConnectAssistUiState.InternetError + } + override fun onTorStopped() { Log.d(TAG, "onTorStopped()") } private fun tryABridge() { + if (!locationFound()) { + _torConnectScreen.value = ConnectAssistUiState.LocationError + return + } if (!_torController.bridgesEnabled) { _torController.bridgesEnabled = true _torController.bridgeTransport = - TorBridgeTransportConfig.BUILTIN_OBFS4 // TODO select based on country + TorBridgeTransportConfig.BUILTIN_SNOWFLAKE // TODO select based on country } handleConnect(withDebugLogging = true) } + private fun locationFound(): Boolean { + // TODO try to find location + return true + } + fun handleBackButtonPressed(): Boolean { when (torConnectScreen.value) { ConnectAssistUiState.Splash -> return false ConnectAssistUiState.Configuring -> return false - ConnectAssistUiState.Bootstrapping -> cancelTorBootstrap() + ConnectAssistUiState.Connecting -> cancelTorBootstrap() ConnectAssistUiState.InternetError -> { _torController.lastKnownError = null _torConnectScreen.value = ConnectAssistUiState.Configuring @@ -186,18 +216,18 @@ class TorConnectionAssistViewModel( cancelTorBootstrap() } - ConnectAssistUiState.TryABridge -> { + ConnectAssistUiState.ConnectionAssist -> { _torController.lastKnownError = null _torConnectScreen.value = ConnectAssistUiState.Configuring } ConnectAssistUiState.TryingABridge -> { _torController.stopTor() - _torConnectScreen.value = ConnectAssistUiState.TryABridge + _torConnectScreen.value = ConnectAssistUiState.ConnectionAssist } ConnectAssistUiState.LocationError -> { - _torConnectScreen.value = ConnectAssistUiState.TryABridge + _torConnectScreen.value = ConnectAssistUiState.ConnectionAssist } ConnectAssistUiState.LocationCheck -> { ===================================== fenix/app/src/main/res/layout/fragment_tor_connection_assist.xml ===================================== @@ -126,7 +126,6 @@ android:layout_marginTop="8dp" android:layout_marginEnd="24dp" android:textColor="@color/photonLightGrey05" - android:tooltipText="@string/connection_assist_share_my_location_country_or_region" android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/a00… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/a00… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-115.11.0esr-13.5-1] 2 commits: fixup! Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView
by Pier Angelo Vendrame (@pierov) 09 May '24

09 May '24
Pier Angelo Vendrame pushed to branch mullvad-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser Commits: 489664d9 by Pier Angelo Vendrame at 2024-05-09T18:12:51+02:00 fixup! Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView Revert &quot;Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView&quot; This reverts commit ff97b6fb06850784785e6993c256bef315b2525f. - - - - - daf16c70 by Pier Angelo Vendrame at 2024-05-09T18:12:52+02:00 Bug 42562: Normalized the Accepted Languages on Android. The OS language might be outside the list of actually supported languages and it might leak the user&#39;s region. Therefore, we force the locale reported in Accept-Language to match one we support with translations, even when it means using a not exact region tag. - - - - - 1 changed file: - mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java Changes: ===================================== mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java ===================================== @@ -22,7 +22,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.Locale; import org.mozilla.gecko.EventDispatcher; import org.mozilla.gecko.GeckoSystemStateListener; @@ -455,6 +456,16 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { return this; } + public @NonNull Builder supportedLocales(final Collection<String> locales) { + getSettings().mSupportedLocales.clear(); + for (String tag : locales) { + Locale locale = Locale.forLanguageTag(tag); + getSettings().mSupportedLocales.put(locale, locale); + getSettings().mSupportedLocales.put(new Locale(locale.getLanguage()), locale); + } + return this; + } + /** * Sets whether we should spoof locale to English for webpages. * @@ -539,6 +550,7 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { /* package */ int mScreenHeightOverride; /* package */ Class<? extends Service> mCrashHandler; /* package */ String[] mRequestedLocales; + /* package */ HashMap<Locale, Locale> mSupportedLocales = new HashMap<>(); /* package */ RuntimeTelemetry.Proxy mTelemetryProxy; /** @@ -595,6 +607,7 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { mRequestedLocales = settings.mRequestedLocales; mConfigFilePath = settings.mConfigFilePath; mTelemetryProxy = settings.mTelemetryProxy; + mSupportedLocales = settings.mSupportedLocales; } /* package */ void commit() { @@ -803,30 +816,39 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { EventDispatcher.getInstance().dispatch("GeckoView:SetLocale", data); } + private Locale getLocaleIfSupported(String tag) { + Locale exact = Locale.forLanguageTag(tag); + if (mSupportedLocales.containsKey(exact)) { + return exact; + } + Locale fallback = new Locale(exact.getLanguage()); + return mSupportedLocales.get(fallback); + } + private String computeAcceptLanguages() { - final ArrayList<String> locales = new ArrayList<String>(); - - // In Desktop, these are defined in the `intl.accept_languages` localized property. - // At some point we should probably use the same values here, but for now we use a simple - // strategy which will hopefully result in reasonable acceptLanguage values. - if (mRequestedLocales != null && mRequestedLocales.length > 0) { - String locale = mRequestedLocales[0].toLowerCase(Locale.ROOT); - // No need to include `en-us` twice. - if (!locale.equals("en-us")) { - locales.add(locale); - if (locale.contains("-")) { - String lang = locale.split("-")[0]; - // No need to include `en` twice. - if (!lang.equals("en")) { - locales.add(lang); - } + Locale locale = null; + if (mRequestedLocales != null) { + for (String tag : mRequestedLocales) { + locale = getLocaleIfSupported(tag); + if (locale != null) { + break; } } } - locales.add("en-us"); - locales.add("en"); - - return TextUtils.join(",", locales); + if (locale == null) { + for (final String tag : getDefaultLocales()) { + locale = getLocaleIfSupported(tag); + if (locale != null) { + break; + } + } + } + String acceptLanguages = locale != null ? locale.toString().replace('_', '-') : "en-US"; + if (acceptLanguages.equals("en-US")) { + // For consistency with spoof English. + acceptLanguages += ", en"; + } + return acceptLanguages; } private static String[] getDefaultLocales() { View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/29… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/29… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][base-browser-115.11.0esr-13.5-1] 2 commits: fixup! Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView
by Pier Angelo Vendrame (@pierov) 09 May '24

09 May '24
Pier Angelo Vendrame pushed to branch base-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: df723884 by Pier Angelo Vendrame at 2024-05-09T18:12:13+02:00 fixup! Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView Revert &quot;Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView&quot; This reverts commit ff97b6fb06850784785e6993c256bef315b2525f. - - - - - d6987499 by Pier Angelo Vendrame at 2024-05-09T18:12:14+02:00 Bug 42562: Normalized the Accepted Languages on Android. The OS language might be outside the list of actually supported languages and it might leak the user&#39;s region. Therefore, we force the locale reported in Accept-Language to match one we support with translations, even when it means using a not exact region tag. - - - - - 1 changed file: - mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java Changes: ===================================== mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java ===================================== @@ -22,7 +22,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.Locale; import org.mozilla.gecko.EventDispatcher; import org.mozilla.gecko.GeckoSystemStateListener; @@ -455,6 +456,16 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { return this; } + public @NonNull Builder supportedLocales(final Collection<String> locales) { + getSettings().mSupportedLocales.clear(); + for (String tag : locales) { + Locale locale = Locale.forLanguageTag(tag); + getSettings().mSupportedLocales.put(locale, locale); + getSettings().mSupportedLocales.put(new Locale(locale.getLanguage()), locale); + } + return this; + } + /** * Sets whether we should spoof locale to English for webpages. * @@ -539,6 +550,7 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { /* package */ int mScreenHeightOverride; /* package */ Class<? extends Service> mCrashHandler; /* package */ String[] mRequestedLocales; + /* package */ HashMap<Locale, Locale> mSupportedLocales = new HashMap<>(); /* package */ RuntimeTelemetry.Proxy mTelemetryProxy; /** @@ -595,6 +607,7 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { mRequestedLocales = settings.mRequestedLocales; mConfigFilePath = settings.mConfigFilePath; mTelemetryProxy = settings.mTelemetryProxy; + mSupportedLocales = settings.mSupportedLocales; } /* package */ void commit() { @@ -803,30 +816,39 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { EventDispatcher.getInstance().dispatch("GeckoView:SetLocale", data); } + private Locale getLocaleIfSupported(String tag) { + Locale exact = Locale.forLanguageTag(tag); + if (mSupportedLocales.containsKey(exact)) { + return exact; + } + Locale fallback = new Locale(exact.getLanguage()); + return mSupportedLocales.get(fallback); + } + private String computeAcceptLanguages() { - final ArrayList<String> locales = new ArrayList<String>(); - - // In Desktop, these are defined in the `intl.accept_languages` localized property. - // At some point we should probably use the same values here, but for now we use a simple - // strategy which will hopefully result in reasonable acceptLanguage values. - if (mRequestedLocales != null && mRequestedLocales.length > 0) { - String locale = mRequestedLocales[0].toLowerCase(Locale.ROOT); - // No need to include `en-us` twice. - if (!locale.equals("en-us")) { - locales.add(locale); - if (locale.contains("-")) { - String lang = locale.split("-")[0]; - // No need to include `en` twice. - if (!lang.equals("en")) { - locales.add(lang); - } + Locale locale = null; + if (mRequestedLocales != null) { + for (String tag : mRequestedLocales) { + locale = getLocaleIfSupported(tag); + if (locale != null) { + break; } } } - locales.add("en-us"); - locales.add("en"); - - return TextUtils.join(",", locales); + if (locale == null) { + for (final String tag : getDefaultLocales()) { + locale = getLocaleIfSupported(tag); + if (locale != null) { + break; + } + } + } + String acceptLanguages = locale != null ? locale.toString().replace('_', '-') : "en-US"; + if (acceptLanguages.equals("en-US")) { + // For consistency with spoof English. + acceptLanguages += ", en"; + } + return acceptLanguages; } private static String[] getDefaultLocales() { View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/e74305… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/e74305… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] Bug 42652: Pass the list of supported languages to GeckoView.
by Pier Angelo Vendrame (@pierov) 09 May '24

09 May '24
Pier Angelo Vendrame pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: c11e7b38 by Pier Angelo Vendrame at 2024-05-09T18:06:03+02:00 Bug 42652: Pass the list of supported languages to GeckoView. It will be used to prevent leaks about regional preferences. - - - - - 1 changed file: - fenix/app/src/main/java/org/mozilla/fenix/gecko/GeckoProvider.kt Changes: ===================================== fenix/app/src/main/java/org/mozilla/fenix/gecko/GeckoProvider.kt ===================================== @@ -14,6 +14,7 @@ import mozilla.components.concept.storage.LoginsStorage import mozilla.components.lib.crash.handler.CrashHandlerService import mozilla.components.service.sync.autofill.GeckoCreditCardsAddressesStorageDelegate import mozilla.components.service.sync.logins.GeckoLoginStorageDelegate +import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.Config import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings @@ -58,6 +59,7 @@ object GeckoProvider { .contentBlocking(policy.toContentBlockingSetting()) .debugLogging(Config.channel.isDebug || context.components.settings.enableGeckoLogs) .aboutConfigEnabled(Config.channel.isBeta || Config.channel.isNightlyOrDebug) + .supportedLocales(BuildConfig.SUPPORTED_LOCALE_ARRAY.toList()) .build() val settings = context.components.settings View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/c11… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/c11… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.5-1] 2 commits: fixup! Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView
by Pier Angelo Vendrame (@pierov) 09 May '24

09 May '24
Pier Angelo Vendrame pushed to branch tor-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 83a3762f by Pier Angelo Vendrame at 2024-05-09T18:04:04+02:00 fixup! Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView Revert &quot;Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView&quot; This reverts commit ff97b6fb06850784785e6993c256bef315b2525f. - - - - - e6f7f151 by Pier Angelo Vendrame at 2024-05-09T18:04:07+02:00 Bug 42562: Normalized the Accepted Languages on Android. The OS language might be outside the list of actually supported languages and it might leak the user&#39;s region. Therefore, we force the locale reported in Accept-Language to match one we support with translations, even when it means using a not exact region tag. - - - - - 1 changed file: - mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java Changes: ===================================== mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java ===================================== @@ -22,7 +22,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.Locale; import org.mozilla.gecko.EventDispatcher; import org.mozilla.gecko.GeckoSystemStateListener; @@ -455,6 +456,16 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { return this; } + public @NonNull Builder supportedLocales(final Collection<String> locales) { + getSettings().mSupportedLocales.clear(); + for (String tag : locales) { + Locale locale = Locale.forLanguageTag(tag); + getSettings().mSupportedLocales.put(locale, locale); + getSettings().mSupportedLocales.put(new Locale(locale.getLanguage()), locale); + } + return this; + } + /** * Sets whether we should spoof locale to English for webpages. * @@ -546,6 +557,7 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { /* package */ int mScreenHeightOverride; /* package */ Class<? extends Service> mCrashHandler; /* package */ String[] mRequestedLocales; + /* package */ HashMap<Locale, Locale> mSupportedLocales = new HashMap<>(); /* package */ RuntimeTelemetry.Proxy mTelemetryProxy; /** @@ -602,6 +614,7 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { mRequestedLocales = settings.mRequestedLocales; mConfigFilePath = settings.mConfigFilePath; mTelemetryProxy = settings.mTelemetryProxy; + mSupportedLocales = settings.mSupportedLocales; } /* package */ void commit() { @@ -810,30 +823,39 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { EventDispatcher.getInstance().dispatch("GeckoView:SetLocale", data); } + private Locale getLocaleIfSupported(String tag) { + Locale exact = Locale.forLanguageTag(tag); + if (mSupportedLocales.containsKey(exact)) { + return exact; + } + Locale fallback = new Locale(exact.getLanguage()); + return mSupportedLocales.get(fallback); + } + private String computeAcceptLanguages() { - final ArrayList<String> locales = new ArrayList<String>(); - - // In Desktop, these are defined in the `intl.accept_languages` localized property. - // At some point we should probably use the same values here, but for now we use a simple - // strategy which will hopefully result in reasonable acceptLanguage values. - if (mRequestedLocales != null && mRequestedLocales.length > 0) { - String locale = mRequestedLocales[0].toLowerCase(Locale.ROOT); - // No need to include `en-us` twice. - if (!locale.equals("en-us")) { - locales.add(locale); - if (locale.contains("-")) { - String lang = locale.split("-")[0]; - // No need to include `en` twice. - if (!lang.equals("en")) { - locales.add(lang); - } + Locale locale = null; + if (mRequestedLocales != null) { + for (String tag : mRequestedLocales) { + locale = getLocaleIfSupported(tag); + if (locale != null) { + break; } } } - locales.add("en-us"); - locales.add("en"); - - return TextUtils.join(",", locales); + if (locale == null) { + for (final String tag : getDefaultLocales()) { + locale = getLocaleIfSupported(tag); + if (locale != null) { + break; + } + } + } + String acceptLanguages = locale != null ? locale.toString().replace('_', '-') : "en-US"; + if (acceptLanguages.equals("en-US")) { + // For consistency with spoof English. + acceptLanguages += ", en"; + } + return acceptLanguages; } private static String[] getDefaultLocales() { View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/66e2e3… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/66e2e3… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.0-1] fixup! Bug 30237: Add v3 onion services client authentication prompt
by ma1 (@ma1) 09 May '24

09 May '24
ma1 pushed to branch tor-browser-115.11.0esr-13.0-1 at The Tor Project / Applications / Tor Browser Commits: e4ed3f35 by hackademix at 2024-05-09T17:49:50+02:00 fixup! Bug 30237: Add v3 onion services client authentication prompt Bug 42557: Fix regression in Onion Services authentication prompt focus - - - - - 1 changed file: - browser/components/onionservices/content/authPrompt.js Changes: ===================================== browser/components/onionservices/content/authPrompt.js ===================================== @@ -81,8 +81,18 @@ const OnionAuthPrompt = (function () { ); }, + _autoFocus(event) { + event.target.ownerGlobal.focus(); + }, + _onPromptShowing(aWarningMessage) { let xulDoc = this._browser.ownerDocument; + + // Force back focus: tor-browser#41856 + (this._popupElem = xulDoc.getElementById( + "tor-clientauth-notification" + ))?.addEventListener("click", this._autoFocus); + let descElem = xulDoc.getElementById("tor-clientauth-notification-desc"); if (descElem) { // Handle replacement of the onion name within the localized @@ -153,6 +163,7 @@ const OnionAuthPrompt = (function () { this._boundOnKeyFieldInput = undefined; } } + this._popupElem?.removeEventListener("click", this._autoFocus); }, _onKeyFieldKeyPress(aEvent) { View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/e4ed3f3… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/e4ed3f3… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] 3 commits: Bug 1846306 - Do not throw IllegalStateException when unable to find a session...
by ma1 (@ma1) 09 May '24

09 May '24
ma1 pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: ccabd9ad by Arturo Mejia at 2024-05-09T15:58:16+02:00 Bug 1846306 - Do not throw IllegalStateException when unable to find a session for given prompt request in onContentPermissionRequested - - - - - 40cae60d by hackademix at 2024-05-09T15:58:20+02:00 Bug 1871217: Improve permission handling in Fullscreen - BP, tor-browser#42656 - - - - - 46475c73 by hackademix at 2024-05-09T15:58:20+02:00 Bug 1892296 - improve webauthn experience - BP, tor-browser#42656 - - - - - 5 changed files: - android-components/components/feature/sitepermissions/src/main/java/mozilla/components/feature/sitepermissions/SitePermissionsFeature.kt - android-components/components/feature/sitepermissions/src/test/java/mozilla/components/feature/sitepermissions/SitePermissionsFeatureTest.kt - android-components/components/feature/webauthn/src/main/java/mozilla/components/feature/webauthn/WebAuthnFeature.kt - android-components/components/feature/webauthn/src/test/java/mozilla/components/feature/webauthn/WebAuthnFeatureTest.kt - fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt Changes: ===================================== android-components/components/feature/sitepermissions/src/main/java/mozilla/components/feature/sitepermissions/SitePermissionsFeature.kt ===================================== @@ -56,12 +56,14 @@ import mozilla.components.concept.engine.permission.SitePermissions import mozilla.components.concept.engine.permission.SitePermissions.Status.ALLOWED import mozilla.components.concept.engine.permission.SitePermissions.Status.BLOCKED import mozilla.components.concept.engine.permission.SitePermissionsStorage +import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.sitepermissions.SitePermissionsFeature.DialogConfig import mozilla.components.feature.tabs.TabsUseCases.SelectOrAddUseCase import mozilla.components.lib.state.ext.flowScoped import mozilla.components.support.base.feature.LifecycleAwareFeature import mozilla.components.support.base.feature.OnNeedToRequestPermissions import mozilla.components.support.base.feature.PermissionsFeature +import mozilla.components.support.base.log.logger.Logger import mozilla.components.support.ktx.android.content.isPermissionGranted import mozilla.components.support.ktx.kotlin.getOrigin import mozilla.components.support.ktx.kotlin.stripDefaultPort @@ -72,8 +74,6 @@ import mozilla.components.ui.icons.R as iconsR internal const val PROMPT_FRAGMENT_TAG = "mozac_feature_sitepermissions_prompt_dialog" -private const val FULL_SCREEN_NOTIFICATION_TAG = "mozac_feature_prompts_full_screen_notification_dialog" - @VisibleForTesting internal const val STORAGE_ACCESS_DOCUMENTATION_URL = "https://developer.mozilla.org/en-US/docs/Web/API/Storage_Access_API" @@ -94,13 +94,15 @@ internal const val STORAGE_ACCESS_DOCUMENTATION_URL = * need to be requested. Once the request is completed, [onPermissionsResult] needs to be invoked. * @property onShouldShowRequestPermissionRationale a callback that allows the feature to query * the ActivityCompat.shouldShowRequestPermissionRationale or the Fragment.shouldShowRequestPermissionRationale values. + * @property exitFullscreenUseCase optional the use case in charge of exiting fullscreen * @property shouldShowDoNotAskAgainCheckBox optional Visibility for Do not ask again Checkbox **/ @Suppress("TooManyFunctions", "LargeClass", "LongParameterList") class SitePermissionsFeature( private val context: Context, - private var sessionId: String? = null, + @set:VisibleForTesting + internal var sessionId: String? = null, private val storage: SitePermissionsStorage = OnDiskSitePermissionsStorage(context), var sitePermissionsRules: SitePermissionsRules? = null, private val fragmentManager: FragmentManager, @@ -109,6 +111,7 @@ class SitePermissionsFeature( override val onNeedToRequestPermissions: OnNeedToRequestPermissions, val onShouldShowRequestPermissionRationale: (permission: String) -> Boolean, private val store: BrowserStore, + private val exitFullscreenUseCase: SessionUseCases.ExitFullScreenUseCase = SessionUseCases(store).exitFullscreen, private val shouldShowDoNotAskAgainCheckBox: Boolean = true, ) : LifecycleAwareFeature, PermissionsFeature { @VisibleForTesting @@ -116,6 +119,8 @@ class SitePermissionsFeature( SelectOrAddUseCase(store) } + private val logger = Logger("SitePermissionsFeature") + internal val ioCoroutineScope by lazy { coroutineScopeInitializer() } internal var coroutineScopeInitializer = { @@ -428,26 +433,29 @@ class SitePermissionsFeature( consumePermissionRequest(permissionRequest) return null } - - val private: Boolean = store.state.findTabOrCustomTabOrSelectedTab(sessionId)?.content?.private - ?: throw IllegalStateException("Unable to find session for $sessionId or selected session") + val tab = store.state.findTabOrCustomTabOrSelectedTab(sessionId) + if (tab == null) { + logger.error("Unable to find a tab for $sessionId rejecting the prompt request") + permissionRequest.reject() + consumePermissionRequest(permissionRequest) + return null + } val permissionFromStorage = withContext(coroutineScope.coroutineContext) { - storage.findSitePermissionsBy(origin, private = private) + storage.findSitePermissionsBy(origin, private = tab.content.private) } - val prompt = if (shouldApplyRules(permissionFromStorage)) { handleRuledFlow(permissionRequest, origin) } else { handleNoRuledFlow(permissionFromStorage, permissionRequest, origin) } - val fullScreenNotificationDisplayed = - fragmentManager.fragments.any { fragment -> fragment.tag == FULL_SCREEN_NOTIFICATION_TAG } - - return if (fullScreenNotificationDisplayed || prompt == null) { + return if (prompt == null) { null } else { + // If we are in fullscreen, then exit to show the permission prompt. + // This won't have any effect if we are not in fullscreen. + exitFullscreenUseCase.invoke(tab.id) prompt.show(fragmentManager, PROMPT_FRAGMENT_TAG) prompt } ===================================== android-components/components/feature/sitepermissions/src/test/java/mozilla/components/feature/sitepermissions/SitePermissionsFeatureTest.kt ===================================== @@ -600,6 +600,24 @@ class SitePermissionsFeatureTest { verify(sitePermissionFeature).consumePermissionRequest(mockPermissionRequest) } + @Test + fun `GIVEN sessionId which does not match a selected or custom tab WHEN onContentPermissionRequested() THEN reject, consumePermissionRequest are called `() { + val mockPermissionRequest: PermissionRequest = mock { + whenever(permissions).thenReturn(listOf(ContentVideoCamera(id = "permission"))) + } + + doNothing().`when`(mockPermissionRequest).reject() + + sitePermissionFeature.sessionId = null + + runTestOnMain { + sitePermissionFeature.onContentPermissionRequested(mockPermissionRequest, URL) + } + + verify(mockPermissionRequest).reject() + verify(sitePermissionFeature).consumePermissionRequest(mockPermissionRequest) + } + @Test fun `GIVEN location permissionRequest and shouldApplyRules is true WHEN onContentPermissionRequested() THEN handleRuledFlow is called`() = runTestOnMain { // given ===================================== android-components/components/feature/webauthn/src/main/java/mozilla/components/feature/webauthn/WebAuthnFeature.kt ===================================== @@ -20,6 +20,8 @@ import mozilla.components.support.base.log.logger.Logger class WebAuthnFeature( private val engine: Engine, private val activity: Activity, + private val exitFullScreen: (String?) -> Unit, + private val currentTab: () -> String?, ) : LifecycleAwareFeature, ActivityResultHandler, ActivityDelegate { private val logger = Logger("WebAuthnFeature") private var requestCodeCounter = ACTIVITY_REQUEST_CODE @@ -53,6 +55,7 @@ class WebAuthnFeature( override fun startIntentSenderForResult(intent: IntentSender, onResult: (Intent?) -> Unit) { logger.info("Received activity delegate request with code: $requestCodeCounter") + exitFullScreen(currentTab()) activity.startIntentSenderForResult(intent, requestCodeCounter, null, 0, 0, 0) callbackRef = onResult } ===================================== android-components/components/feature/webauthn/src/test/java/mozilla/components/feature/webauthn/WebAuthnFeatureTest.kt ===================================== @@ -22,6 +22,8 @@ import org.mockito.Mockito.verify class WebAuthnFeatureTest { private lateinit var engine: Engine private lateinit var activity: Activity + private val exitFullScreen: (String?) -> Unit = { _ -> exitFullScreenUseCaseCalled = true } + private var exitFullScreenUseCaseCalled = false @Before fun setup() { @@ -31,7 +33,7 @@ class WebAuthnFeatureTest { @Test fun `feature registers itself on start`() { - val feature = WebAuthnFeature(engine, activity) + val feature = webAuthnFeature() feature.start() @@ -40,7 +42,7 @@ class WebAuthnFeatureTest { @Test fun `feature unregisters itself on stop`() { - val feature = WebAuthnFeature(engine, activity) + val feature = webAuthnFeature() feature.stop() @@ -49,7 +51,7 @@ class WebAuthnFeatureTest { @Test fun `activity delegate starts intent sender`() { - val feature = WebAuthnFeature(engine, activity) + val feature = webAuthnFeature() val callback: ((Intent?) -> Unit) = { } val intentSender: IntentSender = mock() @@ -60,7 +62,7 @@ class WebAuthnFeatureTest { @Test fun `callback is invoked`() { - val feature = WebAuthnFeature(engine, activity) + val feature = webAuthnFeature() var callbackInvoked = false val callback: ((Intent?) -> Unit) = { callbackInvoked = true } val intentSender: IntentSender = mock() @@ -77,10 +79,14 @@ class WebAuthnFeatureTest { @Test fun `feature won't process results with the wrong request code`() { - val feature = WebAuthnFeature(engine, activity) + val feature = webAuthnFeature() val result = feature.onActivityResult(ACTIVITY_REQUEST_CODE - 5, Intent(), 0) assertFalse(result) } + + private fun webAuthnFeature(): WebAuthnFeature { + return WebAuthnFeature(engine, activity, { exitFullScreen("") }) { "" } + } } ===================================== fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt ===================================== @@ -830,6 +830,8 @@ abstract class BaseBrowserFragment : feature = WebAuthnFeature( engine = requireComponents.core.engine, activity = requireActivity(), + exitFullScreen = requireComponents.useCases.sessionUseCases.exitFullscreen::invoke, + currentTab = { store.state.selectedTabId }, ), owner = this, view = view, View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/compare/fe… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/compare/fe… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][base-browser-115.11.0esr-13.5-1] 3 commits: Bug 1871109 - generateHash in Manifest.sys.mjs should use sha256 r=peterv, a=dmeehan
by ma1 (@ma1) 09 May '24

09 May '24
ma1 pushed to branch base-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 6d5a0677 by Nuohan Li at 2024-05-09T13:38:19+02:00 Bug 1871109 - generateHash in Manifest.sys.mjs should use sha256 r=peterv, a=dmeehan Differential Revision: https://phabricator.services.mozilla.com/D204928 - - - - - 58dc31a0 by Jonathan Kew at 2024-05-09T13:38:20+02:00 Bug 1890204 - Ensure font entry&#39;s unitsPerEm and font extents are initialized when gfxFont is created. r=gfx-reviewers,lsalzman This means that by the time we potentially call GetFontExtents() when drawing, the extents fields are guaranteed to have been been initialized, and there&#39;s no risk of the (read-only) access here racing with setting them in UnitsPerEm(). Differential Revision: https://phabricator.services.mozilla.com/D206920 - - - - - e7430547 by Jonathan Kew at 2024-05-09T13:38:21+02:00 Bug 1893891 - Clear mSharedBlobData if blob creation failed. a=dmeehan Original Revision: https://phabricator.services.mozilla.com/D208983 Differential Revision: https://phabricator.services.mozilla.com/D209209 - - - - - 5 changed files: - dom/manifest/Manifest.sys.mjs - dom/manifest/test/browser_Manifest_install.js - gfx/thebes/gfxFont.cpp - gfx/thebes/gfxFontEntry.cpp - gfx/thebes/gfxFontEntry.h Changes: ===================================== dom/manifest/Manifest.sys.mjs ===================================== @@ -29,11 +29,11 @@ ChromeUtils.defineESModuleGetters(lazy, { * @note The generated hash is returned in base64 form. Mind the fact base64 * is case-sensitive if you are going to reuse this code. */ -function generateHash(aString) { +function generateHash(aString, hashAlg) { const cryptoHash = Cc["@mozilla.org/security/hash;1"].createInstance( Ci.nsICryptoHash ); - cryptoHash.init(Ci.nsICryptoHash.MD5); + cryptoHash.init(hashAlg); const stringStream = Cc[ "@mozilla.org/io/string-input-stream;1" ].createInstance(Ci.nsIStringInputStream); @@ -66,11 +66,39 @@ class Manifest { this._manifestUrl = manifestUrl; // The key for this is the manifests URL that is required to be unique. // However arbitrary urls are not safe file paths so lets hash it. - const fileName = generateHash(manifestUrl) + ".json"; - this._path = PathUtils.join(MANIFESTS_DIR, fileName); + const filename = + generateHash(manifestUrl, Ci.nsICryptoHash.SHA256) + ".json"; + this._path = PathUtils.join(MANIFESTS_DIR, filename); this.browser = browser; } + /** + * See Bug 1871109 + * This function is called at the beginning of initialize() to check if a given + * manifest has MD5 based filename, if so we remove it and migrate the content to + * a new file with SHA256 based name. + * This is done due to security concern, as MD5 is an outdated hashing algorithm and + * shouldn't be used anymore + */ + async removeMD5BasedFilename() { + const filenameMD5 = + generateHash(this._manifestUrl, Ci.nsICryptoHash.MD5) + ".json"; + const MD5Path = PathUtils.join(MANIFESTS_DIR, filenameMD5); + try { + await IOUtils.copy(MD5Path, this._path, { noOverwrite: true }); + } catch (error) { + // we are ignoring the failures returned from copy as it should not stop us from + // installing a new manifest + } + + // Remove the old MD5 based file unconditionally to ensure it's no longer used + try { + await IOUtils.remove(MD5Path); + } catch { + // ignore the error in case MD5 based file does not exist + } + } + get browser() { return this._browser; } @@ -80,6 +108,7 @@ class Manifest { } async initialize() { + await this.removeMD5BasedFilename(); this._store = new lazy.JSONFile({ path: this._path, saveDelayMs: 100 }); await this._store.load(); } ===================================== dom/manifest/test/browser_Manifest_install.js ===================================== @@ -23,18 +23,59 @@ function makeTestURL() { return url.href; } +function generateHash(aString, hashAlg) { + const cryptoHash = Cc["@mozilla.org/security/hash;1"].createInstance( + Ci.nsICryptoHash + ); + cryptoHash.init(hashAlg); + const stringStream = Cc[ + "@mozilla.org/io/string-input-stream;1" + ].createInstance(Ci.nsIStringInputStream); + stringStream.data = aString; + cryptoHash.updateFromStream(stringStream, -1); + // base64 allows the '/' char, but we can't use it for filenames. + return cryptoHash.finish(true).replace(/\//g, "-"); +} + +const MANIFESTS_DIR = PathUtils.join(PathUtils.profileDir, "manifests"); + add_task(async function () { const tabOptions = { gBrowser, url: makeTestURL() }; + const filenameMD5 = generateHash(manifestUrl, Ci.nsICryptoHash.MD5) + ".json"; + const filenameSHA = + generateHash(manifestUrl, Ci.nsICryptoHash.SHA256) + ".json"; + const manifestMD5Path = PathUtils.join(MANIFESTS_DIR, filenameMD5); + const manifestSHAPath = PathUtils.join(MANIFESTS_DIR, filenameSHA); + await BrowserTestUtils.withNewTab(tabOptions, async function (browser) { - let manifest = await Manifests.getManifest(browser, manifestUrl); - is(manifest.installed, false, "We haven't installed this manifest yet"); + let tmpManifest = await Manifests.getManifest(browser, manifestUrl); + is(tmpManifest.installed, false, "We haven't installed this manifest yet"); + + await tmpManifest.install(); + // making sure the manifest is actually installed before proceeding + await tmpManifest._store._save(); + await IOUtils.move(tmpManifest.path, manifestMD5Path); + + let exists = await IOUtils.exists(tmpManifest.path); + is( + exists, + false, + "Manually moved manifest from SHA256 based path to MD5 based path" + ); + Manifests.manifestObjs.delete(manifestUrl); + + let manifest = await Manifests.getManifest(browser, manifestUrl); await manifest.install(browser); is(manifest.name, "hello World", "Manifest has correct name"); is(manifest.installed, true, "Manifest is installed"); is(manifest.url, manifestUrl, "has correct url"); is(manifest.browser, browser, "has correct browser"); + is(manifest.path, manifestSHAPath, "has correct path"); + + exists = await IOUtils.exists(manifestMD5Path); + is(exists, false, "MD5 based manifest removed"); manifest = await Manifests.getManifest(browser, manifestUrl); is(manifest.installed, true, "New instances are installed"); ===================================== gfx/thebes/gfxFont.cpp ===================================== @@ -952,6 +952,10 @@ gfxFont::gfxFont(const RefPtr<UnscaledFont>& aUnscaledFont, } mKerningSet = HasFeatureSet(HB_TAG('k', 'e', 'r', 'n'), mKerningEnabled); + + // Ensure the gfxFontEntry's unitsPerEm and extents fields are initialized, + // so that GetFontExtents can use them without risk of races. + Unused << mFontEntry->UnitsPerEm(); } gfxFont::~gfxFont() { ===================================== gfx/thebes/gfxFontEntry.cpp ===================================== @@ -262,14 +262,22 @@ already_AddRefed<gfxFont> gfxFontEntry::FindOrMakeFont( } uint16_t gfxFontEntry::UnitsPerEm() { + { + AutoReadLock lock(mLock); + if (mUnitsPerEm) { + return mUnitsPerEm; + } + } + + AutoTable headTable(this, TRUETYPE_TAG('h', 'e', 'a', 'd')); + AutoWriteLock lock(mLock); + if (!mUnitsPerEm) { - AutoTable headTable(this, TRUETYPE_TAG('h', 'e', 'a', 'd')); if (headTable) { uint32_t len; const HeadTable* head = reinterpret_cast<const HeadTable*>(hb_blob_get_data(headTable, &len)); if (len >= sizeof(HeadTable)) { - mUnitsPerEm = head->unitsPerEm; if (int16_t(head->xMax) > int16_t(head->xMin) && int16_t(head->yMax) > int16_t(head->yMin)) { mXMin = head->xMin; @@ -277,6 +285,7 @@ uint16_t gfxFontEntry::UnitsPerEm() { mXMax = head->xMax; mYMax = head->yMax; } + mUnitsPerEm = head->unitsPerEm; } } @@ -286,12 +295,13 @@ uint16_t gfxFontEntry::UnitsPerEm() { mUnitsPerEm = kInvalidUPEM; } } + return mUnitsPerEm; } bool gfxFontEntry::HasSVGGlyph(uint32_t aGlyphId) { - NS_ASSERTION(mSVGInitialized, - "SVG data has not yet been loaded. TryGetSVGData() first."); + MOZ_ASSERT(mSVGInitialized, + "SVG data has not yet been loaded. TryGetSVGData() first."); return GetSVGGlyphs()->HasSVGGlyph(aGlyphId); } @@ -309,8 +319,8 @@ bool gfxFontEntry::GetSVGGlyphExtents(DrawTarget* aDrawTarget, void gfxFontEntry::RenderSVGGlyph(gfxContext* aContext, uint32_t aGlyphId, SVGContextPaint* aContextPaint) { - NS_ASSERTION(mSVGInitialized, - "SVG data has not yet been loaded. TryGetSVGData() first."); + MOZ_ASSERT(mSVGInitialized, + "SVG data has not yet been loaded. TryGetSVGData() first."); GetSVGGlyphs()->RenderGlyph(aContext, aGlyphId, aContextPaint); } @@ -467,8 +477,9 @@ hb_blob_t* gfxFontEntry::FontTableHashEntry::ShareTableAndGetBlob( HB_MEMORY_MODE_READONLY, mSharedBlobData, DeleteFontTableBlobData); if (mBlob == hb_blob_get_empty()) { // The FontTableBlobData was destroyed during hb_blob_create(). - // The (empty) blob is still be held in the hashtable with a strong + // The (empty) blob will still be held in the hashtable with a strong // reference. + mSharedBlobData = nullptr; return hb_blob_reference(mBlob); } ===================================== gfx/thebes/gfxFontEntry.h ===================================== @@ -538,6 +538,9 @@ class gfxFontEntry { mozilla::gfx::Rect GetFontExtents(float aFUnitScaleFactor) const { // Flip the y-axis here to match the orientation of Gecko's coordinates. + // We don't need to take a lock here because the min/max fields are inert + // after initialization, and we make sure to initialize them at gfxFont- + // creation time. return mozilla::gfx::Rect(float(mXMin) * aFUnitScaleFactor, float(-mYMax) * aFUnitScaleFactor, float(mXMax - mXMin) * aFUnitScaleFactor, View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/98625d… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/98625d… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.5-1] 3 commits: Bug 1871109 - generateHash in Manifest.sys.mjs should use sha256 r=peterv, a=dmeehan
by ma1 (@ma1) 09 May '24

09 May '24
ma1 pushed to branch tor-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 62619558 by Nuohan Li at 2024-05-09T13:37:32+02:00 Bug 1871109 - generateHash in Manifest.sys.mjs should use sha256 r=peterv, a=dmeehan Differential Revision: https://phabricator.services.mozilla.com/D204928 - - - - - 4846c1da by Jonathan Kew at 2024-05-09T13:37:33+02:00 Bug 1890204 - Ensure font entry&#39;s unitsPerEm and font extents are initialized when gfxFont is created. r=gfx-reviewers,lsalzman This means that by the time we potentially call GetFontExtents() when drawing, the extents fields are guaranteed to have been been initialized, and there&#39;s no risk of the (read-only) access here racing with setting them in UnitsPerEm(). Differential Revision: https://phabricator.services.mozilla.com/D206920 - - - - - 66e2e3ef by Jonathan Kew at 2024-05-09T13:37:34+02:00 Bug 1893891 - Clear mSharedBlobData if blob creation failed. a=dmeehan Original Revision: https://phabricator.services.mozilla.com/D208983 Differential Revision: https://phabricator.services.mozilla.com/D209209 - - - - - 5 changed files: - dom/manifest/Manifest.sys.mjs - dom/manifest/test/browser_Manifest_install.js - gfx/thebes/gfxFont.cpp - gfx/thebes/gfxFontEntry.cpp - gfx/thebes/gfxFontEntry.h Changes: ===================================== dom/manifest/Manifest.sys.mjs ===================================== @@ -29,11 +29,11 @@ ChromeUtils.defineESModuleGetters(lazy, { * @note The generated hash is returned in base64 form. Mind the fact base64 * is case-sensitive if you are going to reuse this code. */ -function generateHash(aString) { +function generateHash(aString, hashAlg) { const cryptoHash = Cc["@mozilla.org/security/hash;1"].createInstance( Ci.nsICryptoHash ); - cryptoHash.init(Ci.nsICryptoHash.MD5); + cryptoHash.init(hashAlg); const stringStream = Cc[ "@mozilla.org/io/string-input-stream;1" ].createInstance(Ci.nsIStringInputStream); @@ -66,11 +66,39 @@ class Manifest { this._manifestUrl = manifestUrl; // The key for this is the manifests URL that is required to be unique. // However arbitrary urls are not safe file paths so lets hash it. - const fileName = generateHash(manifestUrl) + ".json"; - this._path = PathUtils.join(MANIFESTS_DIR, fileName); + const filename = + generateHash(manifestUrl, Ci.nsICryptoHash.SHA256) + ".json"; + this._path = PathUtils.join(MANIFESTS_DIR, filename); this.browser = browser; } + /** + * See Bug 1871109 + * This function is called at the beginning of initialize() to check if a given + * manifest has MD5 based filename, if so we remove it and migrate the content to + * a new file with SHA256 based name. + * This is done due to security concern, as MD5 is an outdated hashing algorithm and + * shouldn't be used anymore + */ + async removeMD5BasedFilename() { + const filenameMD5 = + generateHash(this._manifestUrl, Ci.nsICryptoHash.MD5) + ".json"; + const MD5Path = PathUtils.join(MANIFESTS_DIR, filenameMD5); + try { + await IOUtils.copy(MD5Path, this._path, { noOverwrite: true }); + } catch (error) { + // we are ignoring the failures returned from copy as it should not stop us from + // installing a new manifest + } + + // Remove the old MD5 based file unconditionally to ensure it's no longer used + try { + await IOUtils.remove(MD5Path); + } catch { + // ignore the error in case MD5 based file does not exist + } + } + get browser() { return this._browser; } @@ -80,6 +108,7 @@ class Manifest { } async initialize() { + await this.removeMD5BasedFilename(); this._store = new lazy.JSONFile({ path: this._path, saveDelayMs: 100 }); await this._store.load(); } ===================================== dom/manifest/test/browser_Manifest_install.js ===================================== @@ -23,18 +23,59 @@ function makeTestURL() { return url.href; } +function generateHash(aString, hashAlg) { + const cryptoHash = Cc["@mozilla.org/security/hash;1"].createInstance( + Ci.nsICryptoHash + ); + cryptoHash.init(hashAlg); + const stringStream = Cc[ + "@mozilla.org/io/string-input-stream;1" + ].createInstance(Ci.nsIStringInputStream); + stringStream.data = aString; + cryptoHash.updateFromStream(stringStream, -1); + // base64 allows the '/' char, but we can't use it for filenames. + return cryptoHash.finish(true).replace(/\//g, "-"); +} + +const MANIFESTS_DIR = PathUtils.join(PathUtils.profileDir, "manifests"); + add_task(async function () { const tabOptions = { gBrowser, url: makeTestURL() }; + const filenameMD5 = generateHash(manifestUrl, Ci.nsICryptoHash.MD5) + ".json"; + const filenameSHA = + generateHash(manifestUrl, Ci.nsICryptoHash.SHA256) + ".json"; + const manifestMD5Path = PathUtils.join(MANIFESTS_DIR, filenameMD5); + const manifestSHAPath = PathUtils.join(MANIFESTS_DIR, filenameSHA); + await BrowserTestUtils.withNewTab(tabOptions, async function (browser) { - let manifest = await Manifests.getManifest(browser, manifestUrl); - is(manifest.installed, false, "We haven't installed this manifest yet"); + let tmpManifest = await Manifests.getManifest(browser, manifestUrl); + is(tmpManifest.installed, false, "We haven't installed this manifest yet"); + + await tmpManifest.install(); + // making sure the manifest is actually installed before proceeding + await tmpManifest._store._save(); + await IOUtils.move(tmpManifest.path, manifestMD5Path); + + let exists = await IOUtils.exists(tmpManifest.path); + is( + exists, + false, + "Manually moved manifest from SHA256 based path to MD5 based path" + ); + Manifests.manifestObjs.delete(manifestUrl); + + let manifest = await Manifests.getManifest(browser, manifestUrl); await manifest.install(browser); is(manifest.name, "hello World", "Manifest has correct name"); is(manifest.installed, true, "Manifest is installed"); is(manifest.url, manifestUrl, "has correct url"); is(manifest.browser, browser, "has correct browser"); + is(manifest.path, manifestSHAPath, "has correct path"); + + exists = await IOUtils.exists(manifestMD5Path); + is(exists, false, "MD5 based manifest removed"); manifest = await Manifests.getManifest(browser, manifestUrl); is(manifest.installed, true, "New instances are installed"); ===================================== gfx/thebes/gfxFont.cpp ===================================== @@ -952,6 +952,10 @@ gfxFont::gfxFont(const RefPtr<UnscaledFont>& aUnscaledFont, } mKerningSet = HasFeatureSet(HB_TAG('k', 'e', 'r', 'n'), mKerningEnabled); + + // Ensure the gfxFontEntry's unitsPerEm and extents fields are initialized, + // so that GetFontExtents can use them without risk of races. + Unused << mFontEntry->UnitsPerEm(); } gfxFont::~gfxFont() { ===================================== gfx/thebes/gfxFontEntry.cpp ===================================== @@ -262,14 +262,22 @@ already_AddRefed<gfxFont> gfxFontEntry::FindOrMakeFont( } uint16_t gfxFontEntry::UnitsPerEm() { + { + AutoReadLock lock(mLock); + if (mUnitsPerEm) { + return mUnitsPerEm; + } + } + + AutoTable headTable(this, TRUETYPE_TAG('h', 'e', 'a', 'd')); + AutoWriteLock lock(mLock); + if (!mUnitsPerEm) { - AutoTable headTable(this, TRUETYPE_TAG('h', 'e', 'a', 'd')); if (headTable) { uint32_t len; const HeadTable* head = reinterpret_cast<const HeadTable*>(hb_blob_get_data(headTable, &len)); if (len >= sizeof(HeadTable)) { - mUnitsPerEm = head->unitsPerEm; if (int16_t(head->xMax) > int16_t(head->xMin) && int16_t(head->yMax) > int16_t(head->yMin)) { mXMin = head->xMin; @@ -277,6 +285,7 @@ uint16_t gfxFontEntry::UnitsPerEm() { mXMax = head->xMax; mYMax = head->yMax; } + mUnitsPerEm = head->unitsPerEm; } } @@ -286,12 +295,13 @@ uint16_t gfxFontEntry::UnitsPerEm() { mUnitsPerEm = kInvalidUPEM; } } + return mUnitsPerEm; } bool gfxFontEntry::HasSVGGlyph(uint32_t aGlyphId) { - NS_ASSERTION(mSVGInitialized, - "SVG data has not yet been loaded. TryGetSVGData() first."); + MOZ_ASSERT(mSVGInitialized, + "SVG data has not yet been loaded. TryGetSVGData() first."); return GetSVGGlyphs()->HasSVGGlyph(aGlyphId); } @@ -309,8 +319,8 @@ bool gfxFontEntry::GetSVGGlyphExtents(DrawTarget* aDrawTarget, void gfxFontEntry::RenderSVGGlyph(gfxContext* aContext, uint32_t aGlyphId, SVGContextPaint* aContextPaint) { - NS_ASSERTION(mSVGInitialized, - "SVG data has not yet been loaded. TryGetSVGData() first."); + MOZ_ASSERT(mSVGInitialized, + "SVG data has not yet been loaded. TryGetSVGData() first."); GetSVGGlyphs()->RenderGlyph(aContext, aGlyphId, aContextPaint); } @@ -467,8 +477,9 @@ hb_blob_t* gfxFontEntry::FontTableHashEntry::ShareTableAndGetBlob( HB_MEMORY_MODE_READONLY, mSharedBlobData, DeleteFontTableBlobData); if (mBlob == hb_blob_get_empty()) { // The FontTableBlobData was destroyed during hb_blob_create(). - // The (empty) blob is still be held in the hashtable with a strong + // The (empty) blob will still be held in the hashtable with a strong // reference. + mSharedBlobData = nullptr; return hb_blob_reference(mBlob); } ===================================== gfx/thebes/gfxFontEntry.h ===================================== @@ -538,6 +538,9 @@ class gfxFontEntry { mozilla::gfx::Rect GetFontExtents(float aFUnitScaleFactor) const { // Flip the y-axis here to match the orientation of Gecko's coordinates. + // We don't need to take a lock here because the min/max fields are inert + // after initialization, and we make sure to initialize them at gfxFont- + // creation time. return mozilla::gfx::Rect(float(mXMin) * aFUnitScaleFactor, float(-mYMax) * aFUnitScaleFactor, float(mXMax - mXMin) * aFUnitScaleFactor, View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/410bb2… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/410bb2… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-115.11.0esr-13.5-1] 3 commits: Bug 1871109 - generateHash in Manifest.sys.mjs should use sha256 r=peterv, a=dmeehan
by ma1 (@ma1) 09 May '24

09 May '24
ma1 pushed to branch mullvad-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser Commits: ac1e73ce by Nuohan Li at 2024-05-09T13:36:35+02:00 Bug 1871109 - generateHash in Manifest.sys.mjs should use sha256 r=peterv, a=dmeehan Differential Revision: https://phabricator.services.mozilla.com/D204928 - - - - - f0b17745 by Jonathan Kew at 2024-05-09T13:36:36+02:00 Bug 1890204 - Ensure font entry&#39;s unitsPerEm and font extents are initialized when gfxFont is created. r=gfx-reviewers,lsalzman This means that by the time we potentially call GetFontExtents() when drawing, the extents fields are guaranteed to have been been initialized, and there&#39;s no risk of the (read-only) access here racing with setting them in UnitsPerEm(). Differential Revision: https://phabricator.services.mozilla.com/D206920 - - - - - 29322606 by Jonathan Kew at 2024-05-09T13:36:37+02:00 Bug 1893891 - Clear mSharedBlobData if blob creation failed. a=dmeehan Original Revision: https://phabricator.services.mozilla.com/D208983 Differential Revision: https://phabricator.services.mozilla.com/D209209 - - - - - 5 changed files: - dom/manifest/Manifest.sys.mjs - dom/manifest/test/browser_Manifest_install.js - gfx/thebes/gfxFont.cpp - gfx/thebes/gfxFontEntry.cpp - gfx/thebes/gfxFontEntry.h Changes: ===================================== dom/manifest/Manifest.sys.mjs ===================================== @@ -29,11 +29,11 @@ ChromeUtils.defineESModuleGetters(lazy, { * @note The generated hash is returned in base64 form. Mind the fact base64 * is case-sensitive if you are going to reuse this code. */ -function generateHash(aString) { +function generateHash(aString, hashAlg) { const cryptoHash = Cc["@mozilla.org/security/hash;1"].createInstance( Ci.nsICryptoHash ); - cryptoHash.init(Ci.nsICryptoHash.MD5); + cryptoHash.init(hashAlg); const stringStream = Cc[ "@mozilla.org/io/string-input-stream;1" ].createInstance(Ci.nsIStringInputStream); @@ -66,11 +66,39 @@ class Manifest { this._manifestUrl = manifestUrl; // The key for this is the manifests URL that is required to be unique. // However arbitrary urls are not safe file paths so lets hash it. - const fileName = generateHash(manifestUrl) + ".json"; - this._path = PathUtils.join(MANIFESTS_DIR, fileName); + const filename = + generateHash(manifestUrl, Ci.nsICryptoHash.SHA256) + ".json"; + this._path = PathUtils.join(MANIFESTS_DIR, filename); this.browser = browser; } + /** + * See Bug 1871109 + * This function is called at the beginning of initialize() to check if a given + * manifest has MD5 based filename, if so we remove it and migrate the content to + * a new file with SHA256 based name. + * This is done due to security concern, as MD5 is an outdated hashing algorithm and + * shouldn't be used anymore + */ + async removeMD5BasedFilename() { + const filenameMD5 = + generateHash(this._manifestUrl, Ci.nsICryptoHash.MD5) + ".json"; + const MD5Path = PathUtils.join(MANIFESTS_DIR, filenameMD5); + try { + await IOUtils.copy(MD5Path, this._path, { noOverwrite: true }); + } catch (error) { + // we are ignoring the failures returned from copy as it should not stop us from + // installing a new manifest + } + + // Remove the old MD5 based file unconditionally to ensure it's no longer used + try { + await IOUtils.remove(MD5Path); + } catch { + // ignore the error in case MD5 based file does not exist + } + } + get browser() { return this._browser; } @@ -80,6 +108,7 @@ class Manifest { } async initialize() { + await this.removeMD5BasedFilename(); this._store = new lazy.JSONFile({ path: this._path, saveDelayMs: 100 }); await this._store.load(); } ===================================== dom/manifest/test/browser_Manifest_install.js ===================================== @@ -23,18 +23,59 @@ function makeTestURL() { return url.href; } +function generateHash(aString, hashAlg) { + const cryptoHash = Cc["@mozilla.org/security/hash;1"].createInstance( + Ci.nsICryptoHash + ); + cryptoHash.init(hashAlg); + const stringStream = Cc[ + "@mozilla.org/io/string-input-stream;1" + ].createInstance(Ci.nsIStringInputStream); + stringStream.data = aString; + cryptoHash.updateFromStream(stringStream, -1); + // base64 allows the '/' char, but we can't use it for filenames. + return cryptoHash.finish(true).replace(/\//g, "-"); +} + +const MANIFESTS_DIR = PathUtils.join(PathUtils.profileDir, "manifests"); + add_task(async function () { const tabOptions = { gBrowser, url: makeTestURL() }; + const filenameMD5 = generateHash(manifestUrl, Ci.nsICryptoHash.MD5) + ".json"; + const filenameSHA = + generateHash(manifestUrl, Ci.nsICryptoHash.SHA256) + ".json"; + const manifestMD5Path = PathUtils.join(MANIFESTS_DIR, filenameMD5); + const manifestSHAPath = PathUtils.join(MANIFESTS_DIR, filenameSHA); + await BrowserTestUtils.withNewTab(tabOptions, async function (browser) { - let manifest = await Manifests.getManifest(browser, manifestUrl); - is(manifest.installed, false, "We haven't installed this manifest yet"); + let tmpManifest = await Manifests.getManifest(browser, manifestUrl); + is(tmpManifest.installed, false, "We haven't installed this manifest yet"); + + await tmpManifest.install(); + // making sure the manifest is actually installed before proceeding + await tmpManifest._store._save(); + await IOUtils.move(tmpManifest.path, manifestMD5Path); + + let exists = await IOUtils.exists(tmpManifest.path); + is( + exists, + false, + "Manually moved manifest from SHA256 based path to MD5 based path" + ); + Manifests.manifestObjs.delete(manifestUrl); + + let manifest = await Manifests.getManifest(browser, manifestUrl); await manifest.install(browser); is(manifest.name, "hello World", "Manifest has correct name"); is(manifest.installed, true, "Manifest is installed"); is(manifest.url, manifestUrl, "has correct url"); is(manifest.browser, browser, "has correct browser"); + is(manifest.path, manifestSHAPath, "has correct path"); + + exists = await IOUtils.exists(manifestMD5Path); + is(exists, false, "MD5 based manifest removed"); manifest = await Manifests.getManifest(browser, manifestUrl); is(manifest.installed, true, "New instances are installed"); ===================================== gfx/thebes/gfxFont.cpp ===================================== @@ -952,6 +952,10 @@ gfxFont::gfxFont(const RefPtr<UnscaledFont>& aUnscaledFont, } mKerningSet = HasFeatureSet(HB_TAG('k', 'e', 'r', 'n'), mKerningEnabled); + + // Ensure the gfxFontEntry's unitsPerEm and extents fields are initialized, + // so that GetFontExtents can use them without risk of races. + Unused << mFontEntry->UnitsPerEm(); } gfxFont::~gfxFont() { ===================================== gfx/thebes/gfxFontEntry.cpp ===================================== @@ -262,14 +262,22 @@ already_AddRefed<gfxFont> gfxFontEntry::FindOrMakeFont( } uint16_t gfxFontEntry::UnitsPerEm() { + { + AutoReadLock lock(mLock); + if (mUnitsPerEm) { + return mUnitsPerEm; + } + } + + AutoTable headTable(this, TRUETYPE_TAG('h', 'e', 'a', 'd')); + AutoWriteLock lock(mLock); + if (!mUnitsPerEm) { - AutoTable headTable(this, TRUETYPE_TAG('h', 'e', 'a', 'd')); if (headTable) { uint32_t len; const HeadTable* head = reinterpret_cast<const HeadTable*>(hb_blob_get_data(headTable, &len)); if (len >= sizeof(HeadTable)) { - mUnitsPerEm = head->unitsPerEm; if (int16_t(head->xMax) > int16_t(head->xMin) && int16_t(head->yMax) > int16_t(head->yMin)) { mXMin = head->xMin; @@ -277,6 +285,7 @@ uint16_t gfxFontEntry::UnitsPerEm() { mXMax = head->xMax; mYMax = head->yMax; } + mUnitsPerEm = head->unitsPerEm; } } @@ -286,12 +295,13 @@ uint16_t gfxFontEntry::UnitsPerEm() { mUnitsPerEm = kInvalidUPEM; } } + return mUnitsPerEm; } bool gfxFontEntry::HasSVGGlyph(uint32_t aGlyphId) { - NS_ASSERTION(mSVGInitialized, - "SVG data has not yet been loaded. TryGetSVGData() first."); + MOZ_ASSERT(mSVGInitialized, + "SVG data has not yet been loaded. TryGetSVGData() first."); return GetSVGGlyphs()->HasSVGGlyph(aGlyphId); } @@ -309,8 +319,8 @@ bool gfxFontEntry::GetSVGGlyphExtents(DrawTarget* aDrawTarget, void gfxFontEntry::RenderSVGGlyph(gfxContext* aContext, uint32_t aGlyphId, SVGContextPaint* aContextPaint) { - NS_ASSERTION(mSVGInitialized, - "SVG data has not yet been loaded. TryGetSVGData() first."); + MOZ_ASSERT(mSVGInitialized, + "SVG data has not yet been loaded. TryGetSVGData() first."); GetSVGGlyphs()->RenderGlyph(aContext, aGlyphId, aContextPaint); } @@ -467,8 +477,9 @@ hb_blob_t* gfxFontEntry::FontTableHashEntry::ShareTableAndGetBlob( HB_MEMORY_MODE_READONLY, mSharedBlobData, DeleteFontTableBlobData); if (mBlob == hb_blob_get_empty()) { // The FontTableBlobData was destroyed during hb_blob_create(). - // The (empty) blob is still be held in the hashtable with a strong + // The (empty) blob will still be held in the hashtable with a strong // reference. + mSharedBlobData = nullptr; return hb_blob_reference(mBlob); } ===================================== gfx/thebes/gfxFontEntry.h ===================================== @@ -538,6 +538,9 @@ class gfxFontEntry { mozilla::gfx::Rect GetFontExtents(float aFUnitScaleFactor) const { // Flip the y-axis here to match the orientation of Gecko's coordinates. + // We don't need to take a lock here because the min/max fields are inert + // after initialization, and we make sure to initialize them at gfxFont- + // creation time. return mozilla::gfx::Rect(float(mXMin) * aFUnitScaleFactor, float(-mYMax) * aFUnitScaleFactor, float(mXMax - mXMin) * aFUnitScaleFactor, View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/d5… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/d5… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-115.11.0esr-13.0-1] 3 commits: Bug 1871109 - generateHash in Manifest.sys.mjs should use sha256 r=peterv, a=dmeehan
by ma1 (@ma1) 09 May '24

09 May '24
ma1 pushed to branch mullvad-browser-115.11.0esr-13.0-1 at The Tor Project / Applications / Mullvad Browser Commits: 50b53983 by Nuohan Li at 2024-05-09T13:04:13+02:00 Bug 1871109 - generateHash in Manifest.sys.mjs should use sha256 r=peterv, a=dmeehan Differential Revision: https://phabricator.services.mozilla.com/D204928 - - - - - 7269657b by Jonathan Kew at 2024-05-09T13:04:14+02:00 Bug 1890204 - Ensure font entry&#39;s unitsPerEm and font extents are initialized when gfxFont is created. r=gfx-reviewers,lsalzman This means that by the time we potentially call GetFontExtents() when drawing, the extents fields are guaranteed to have been been initialized, and there&#39;s no risk of the (read-only) access here racing with setting them in UnitsPerEm(). Differential Revision: https://phabricator.services.mozilla.com/D206920 - - - - - b4147595 by Jonathan Kew at 2024-05-09T13:04:15+02:00 Bug 1893891 - Clear mSharedBlobData if blob creation failed. a=dmeehan Original Revision: https://phabricator.services.mozilla.com/D208983 Differential Revision: https://phabricator.services.mozilla.com/D209209 - - - - - 5 changed files: - dom/manifest/Manifest.sys.mjs - dom/manifest/test/browser_Manifest_install.js - gfx/thebes/gfxFont.cpp - gfx/thebes/gfxFontEntry.cpp - gfx/thebes/gfxFontEntry.h Changes: ===================================== dom/manifest/Manifest.sys.mjs ===================================== @@ -29,11 +29,11 @@ ChromeUtils.defineESModuleGetters(lazy, { * @note The generated hash is returned in base64 form. Mind the fact base64 * is case-sensitive if you are going to reuse this code. */ -function generateHash(aString) { +function generateHash(aString, hashAlg) { const cryptoHash = Cc["@mozilla.org/security/hash;1"].createInstance( Ci.nsICryptoHash ); - cryptoHash.init(Ci.nsICryptoHash.MD5); + cryptoHash.init(hashAlg); const stringStream = Cc[ "@mozilla.org/io/string-input-stream;1" ].createInstance(Ci.nsIStringInputStream); @@ -66,11 +66,39 @@ class Manifest { this._manifestUrl = manifestUrl; // The key for this is the manifests URL that is required to be unique. // However arbitrary urls are not safe file paths so lets hash it. - const fileName = generateHash(manifestUrl) + ".json"; - this._path = PathUtils.join(MANIFESTS_DIR, fileName); + const filename = + generateHash(manifestUrl, Ci.nsICryptoHash.SHA256) + ".json"; + this._path = PathUtils.join(MANIFESTS_DIR, filename); this.browser = browser; } + /** + * See Bug 1871109 + * This function is called at the beginning of initialize() to check if a given + * manifest has MD5 based filename, if so we remove it and migrate the content to + * a new file with SHA256 based name. + * This is done due to security concern, as MD5 is an outdated hashing algorithm and + * shouldn't be used anymore + */ + async removeMD5BasedFilename() { + const filenameMD5 = + generateHash(this._manifestUrl, Ci.nsICryptoHash.MD5) + ".json"; + const MD5Path = PathUtils.join(MANIFESTS_DIR, filenameMD5); + try { + await IOUtils.copy(MD5Path, this._path, { noOverwrite: true }); + } catch (error) { + // we are ignoring the failures returned from copy as it should not stop us from + // installing a new manifest + } + + // Remove the old MD5 based file unconditionally to ensure it's no longer used + try { + await IOUtils.remove(MD5Path); + } catch { + // ignore the error in case MD5 based file does not exist + } + } + get browser() { return this._browser; } @@ -80,6 +108,7 @@ class Manifest { } async initialize() { + await this.removeMD5BasedFilename(); this._store = new lazy.JSONFile({ path: this._path, saveDelayMs: 100 }); await this._store.load(); } ===================================== dom/manifest/test/browser_Manifest_install.js ===================================== @@ -23,18 +23,59 @@ function makeTestURL() { return url.href; } +function generateHash(aString, hashAlg) { + const cryptoHash = Cc["@mozilla.org/security/hash;1"].createInstance( + Ci.nsICryptoHash + ); + cryptoHash.init(hashAlg); + const stringStream = Cc[ + "@mozilla.org/io/string-input-stream;1" + ].createInstance(Ci.nsIStringInputStream); + stringStream.data = aString; + cryptoHash.updateFromStream(stringStream, -1); + // base64 allows the '/' char, but we can't use it for filenames. + return cryptoHash.finish(true).replace(/\//g, "-"); +} + +const MANIFESTS_DIR = PathUtils.join(PathUtils.profileDir, "manifests"); + add_task(async function () { const tabOptions = { gBrowser, url: makeTestURL() }; + const filenameMD5 = generateHash(manifestUrl, Ci.nsICryptoHash.MD5) + ".json"; + const filenameSHA = + generateHash(manifestUrl, Ci.nsICryptoHash.SHA256) + ".json"; + const manifestMD5Path = PathUtils.join(MANIFESTS_DIR, filenameMD5); + const manifestSHAPath = PathUtils.join(MANIFESTS_DIR, filenameSHA); + await BrowserTestUtils.withNewTab(tabOptions, async function (browser) { - let manifest = await Manifests.getManifest(browser, manifestUrl); - is(manifest.installed, false, "We haven't installed this manifest yet"); + let tmpManifest = await Manifests.getManifest(browser, manifestUrl); + is(tmpManifest.installed, false, "We haven't installed this manifest yet"); + + await tmpManifest.install(); + // making sure the manifest is actually installed before proceeding + await tmpManifest._store._save(); + await IOUtils.move(tmpManifest.path, manifestMD5Path); + + let exists = await IOUtils.exists(tmpManifest.path); + is( + exists, + false, + "Manually moved manifest from SHA256 based path to MD5 based path" + ); + Manifests.manifestObjs.delete(manifestUrl); + + let manifest = await Manifests.getManifest(browser, manifestUrl); await manifest.install(browser); is(manifest.name, "hello World", "Manifest has correct name"); is(manifest.installed, true, "Manifest is installed"); is(manifest.url, manifestUrl, "has correct url"); is(manifest.browser, browser, "has correct browser"); + is(manifest.path, manifestSHAPath, "has correct path"); + + exists = await IOUtils.exists(manifestMD5Path); + is(exists, false, "MD5 based manifest removed"); manifest = await Manifests.getManifest(browser, manifestUrl); is(manifest.installed, true, "New instances are installed"); ===================================== gfx/thebes/gfxFont.cpp ===================================== @@ -952,6 +952,10 @@ gfxFont::gfxFont(const RefPtr<UnscaledFont>& aUnscaledFont, } mKerningSet = HasFeatureSet(HB_TAG('k', 'e', 'r', 'n'), mKerningEnabled); + + // Ensure the gfxFontEntry's unitsPerEm and extents fields are initialized, + // so that GetFontExtents can use them without risk of races. + Unused << mFontEntry->UnitsPerEm(); } gfxFont::~gfxFont() { ===================================== gfx/thebes/gfxFontEntry.cpp ===================================== @@ -262,14 +262,22 @@ already_AddRefed<gfxFont> gfxFontEntry::FindOrMakeFont( } uint16_t gfxFontEntry::UnitsPerEm() { + { + AutoReadLock lock(mLock); + if (mUnitsPerEm) { + return mUnitsPerEm; + } + } + + AutoTable headTable(this, TRUETYPE_TAG('h', 'e', 'a', 'd')); + AutoWriteLock lock(mLock); + if (!mUnitsPerEm) { - AutoTable headTable(this, TRUETYPE_TAG('h', 'e', 'a', 'd')); if (headTable) { uint32_t len; const HeadTable* head = reinterpret_cast<const HeadTable*>(hb_blob_get_data(headTable, &len)); if (len >= sizeof(HeadTable)) { - mUnitsPerEm = head->unitsPerEm; if (int16_t(head->xMax) > int16_t(head->xMin) && int16_t(head->yMax) > int16_t(head->yMin)) { mXMin = head->xMin; @@ -277,6 +285,7 @@ uint16_t gfxFontEntry::UnitsPerEm() { mXMax = head->xMax; mYMax = head->yMax; } + mUnitsPerEm = head->unitsPerEm; } } @@ -286,12 +295,13 @@ uint16_t gfxFontEntry::UnitsPerEm() { mUnitsPerEm = kInvalidUPEM; } } + return mUnitsPerEm; } bool gfxFontEntry::HasSVGGlyph(uint32_t aGlyphId) { - NS_ASSERTION(mSVGInitialized, - "SVG data has not yet been loaded. TryGetSVGData() first."); + MOZ_ASSERT(mSVGInitialized, + "SVG data has not yet been loaded. TryGetSVGData() first."); return GetSVGGlyphs()->HasSVGGlyph(aGlyphId); } @@ -309,8 +319,8 @@ bool gfxFontEntry::GetSVGGlyphExtents(DrawTarget* aDrawTarget, void gfxFontEntry::RenderSVGGlyph(gfxContext* aContext, uint32_t aGlyphId, SVGContextPaint* aContextPaint) { - NS_ASSERTION(mSVGInitialized, - "SVG data has not yet been loaded. TryGetSVGData() first."); + MOZ_ASSERT(mSVGInitialized, + "SVG data has not yet been loaded. TryGetSVGData() first."); GetSVGGlyphs()->RenderGlyph(aContext, aGlyphId, aContextPaint); } @@ -467,8 +477,9 @@ hb_blob_t* gfxFontEntry::FontTableHashEntry::ShareTableAndGetBlob( HB_MEMORY_MODE_READONLY, mSharedBlobData, DeleteFontTableBlobData); if (mBlob == hb_blob_get_empty()) { // The FontTableBlobData was destroyed during hb_blob_create(). - // The (empty) blob is still be held in the hashtable with a strong + // The (empty) blob will still be held in the hashtable with a strong // reference. + mSharedBlobData = nullptr; return hb_blob_reference(mBlob); } ===================================== gfx/thebes/gfxFontEntry.h ===================================== @@ -538,6 +538,9 @@ class gfxFontEntry { mozilla::gfx::Rect GetFontExtents(float aFUnitScaleFactor) const { // Flip the y-axis here to match the orientation of Gecko's coordinates. + // We don't need to take a lock here because the min/max fields are inert + // after initialization, and we make sure to initialize them at gfxFont- + // creation time. return mozilla::gfx::Rect(float(mXMin) * aFUnitScaleFactor, float(-mYMax) * aFUnitScaleFactor, float(mXMax - mXMin) * aFUnitScaleFactor, View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/d3… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/d3… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][base-browser-115.11.0esr-13.0-1] 3 commits: Bug 1871109 - generateHash in Manifest.sys.mjs should use sha256 r=peterv, a=dmeehan
by ma1 (@ma1) 09 May '24

09 May '24
ma1 pushed to branch base-browser-115.11.0esr-13.0-1 at The Tor Project / Applications / Tor Browser Commits: ac2c9355 by Nuohan Li at 2024-05-09T13:01:34+02:00 Bug 1871109 - generateHash in Manifest.sys.mjs should use sha256 r=peterv, a=dmeehan Differential Revision: https://phabricator.services.mozilla.com/D204928 - - - - - 9d85032c by Jonathan Kew at 2024-05-09T13:01:39+02:00 Bug 1890204 - Ensure font entry&#39;s unitsPerEm and font extents are initialized when gfxFont is created. r=gfx-reviewers,lsalzman This means that by the time we potentially call GetFontExtents() when drawing, the extents fields are guaranteed to have been been initialized, and there&#39;s no risk of the (read-only) access here racing with setting them in UnitsPerEm(). Differential Revision: https://phabricator.services.mozilla.com/D206920 - - - - - 8a728aa8 by Jonathan Kew at 2024-05-09T13:01:40+02:00 Bug 1893891 - Clear mSharedBlobData if blob creation failed. a=dmeehan Original Revision: https://phabricator.services.mozilla.com/D208983 Differential Revision: https://phabricator.services.mozilla.com/D209209 - - - - - 5 changed files: - dom/manifest/Manifest.sys.mjs - dom/manifest/test/browser_Manifest_install.js - gfx/thebes/gfxFont.cpp - gfx/thebes/gfxFontEntry.cpp - gfx/thebes/gfxFontEntry.h Changes: ===================================== dom/manifest/Manifest.sys.mjs ===================================== @@ -29,11 +29,11 @@ ChromeUtils.defineESModuleGetters(lazy, { * @note The generated hash is returned in base64 form. Mind the fact base64 * is case-sensitive if you are going to reuse this code. */ -function generateHash(aString) { +function generateHash(aString, hashAlg) { const cryptoHash = Cc["@mozilla.org/security/hash;1"].createInstance( Ci.nsICryptoHash ); - cryptoHash.init(Ci.nsICryptoHash.MD5); + cryptoHash.init(hashAlg); const stringStream = Cc[ "@mozilla.org/io/string-input-stream;1" ].createInstance(Ci.nsIStringInputStream); @@ -66,11 +66,39 @@ class Manifest { this._manifestUrl = manifestUrl; // The key for this is the manifests URL that is required to be unique. // However arbitrary urls are not safe file paths so lets hash it. - const fileName = generateHash(manifestUrl) + ".json"; - this._path = PathUtils.join(MANIFESTS_DIR, fileName); + const filename = + generateHash(manifestUrl, Ci.nsICryptoHash.SHA256) + ".json"; + this._path = PathUtils.join(MANIFESTS_DIR, filename); this.browser = browser; } + /** + * See Bug 1871109 + * This function is called at the beginning of initialize() to check if a given + * manifest has MD5 based filename, if so we remove it and migrate the content to + * a new file with SHA256 based name. + * This is done due to security concern, as MD5 is an outdated hashing algorithm and + * shouldn't be used anymore + */ + async removeMD5BasedFilename() { + const filenameMD5 = + generateHash(this._manifestUrl, Ci.nsICryptoHash.MD5) + ".json"; + const MD5Path = PathUtils.join(MANIFESTS_DIR, filenameMD5); + try { + await IOUtils.copy(MD5Path, this._path, { noOverwrite: true }); + } catch (error) { + // we are ignoring the failures returned from copy as it should not stop us from + // installing a new manifest + } + + // Remove the old MD5 based file unconditionally to ensure it's no longer used + try { + await IOUtils.remove(MD5Path); + } catch { + // ignore the error in case MD5 based file does not exist + } + } + get browser() { return this._browser; } @@ -80,6 +108,7 @@ class Manifest { } async initialize() { + await this.removeMD5BasedFilename(); this._store = new lazy.JSONFile({ path: this._path, saveDelayMs: 100 }); await this._store.load(); } ===================================== dom/manifest/test/browser_Manifest_install.js ===================================== @@ -23,18 +23,59 @@ function makeTestURL() { return url.href; } +function generateHash(aString, hashAlg) { + const cryptoHash = Cc["@mozilla.org/security/hash;1"].createInstance( + Ci.nsICryptoHash + ); + cryptoHash.init(hashAlg); + const stringStream = Cc[ + "@mozilla.org/io/string-input-stream;1" + ].createInstance(Ci.nsIStringInputStream); + stringStream.data = aString; + cryptoHash.updateFromStream(stringStream, -1); + // base64 allows the '/' char, but we can't use it for filenames. + return cryptoHash.finish(true).replace(/\//g, "-"); +} + +const MANIFESTS_DIR = PathUtils.join(PathUtils.profileDir, "manifests"); + add_task(async function () { const tabOptions = { gBrowser, url: makeTestURL() }; + const filenameMD5 = generateHash(manifestUrl, Ci.nsICryptoHash.MD5) + ".json"; + const filenameSHA = + generateHash(manifestUrl, Ci.nsICryptoHash.SHA256) + ".json"; + const manifestMD5Path = PathUtils.join(MANIFESTS_DIR, filenameMD5); + const manifestSHAPath = PathUtils.join(MANIFESTS_DIR, filenameSHA); + await BrowserTestUtils.withNewTab(tabOptions, async function (browser) { - let manifest = await Manifests.getManifest(browser, manifestUrl); - is(manifest.installed, false, "We haven't installed this manifest yet"); + let tmpManifest = await Manifests.getManifest(browser, manifestUrl); + is(tmpManifest.installed, false, "We haven't installed this manifest yet"); + + await tmpManifest.install(); + // making sure the manifest is actually installed before proceeding + await tmpManifest._store._save(); + await IOUtils.move(tmpManifest.path, manifestMD5Path); + + let exists = await IOUtils.exists(tmpManifest.path); + is( + exists, + false, + "Manually moved manifest from SHA256 based path to MD5 based path" + ); + Manifests.manifestObjs.delete(manifestUrl); + + let manifest = await Manifests.getManifest(browser, manifestUrl); await manifest.install(browser); is(manifest.name, "hello World", "Manifest has correct name"); is(manifest.installed, true, "Manifest is installed"); is(manifest.url, manifestUrl, "has correct url"); is(manifest.browser, browser, "has correct browser"); + is(manifest.path, manifestSHAPath, "has correct path"); + + exists = await IOUtils.exists(manifestMD5Path); + is(exists, false, "MD5 based manifest removed"); manifest = await Manifests.getManifest(browser, manifestUrl); is(manifest.installed, true, "New instances are installed"); ===================================== gfx/thebes/gfxFont.cpp ===================================== @@ -952,6 +952,10 @@ gfxFont::gfxFont(const RefPtr<UnscaledFont>& aUnscaledFont, } mKerningSet = HasFeatureSet(HB_TAG('k', 'e', 'r', 'n'), mKerningEnabled); + + // Ensure the gfxFontEntry's unitsPerEm and extents fields are initialized, + // so that GetFontExtents can use them without risk of races. + Unused << mFontEntry->UnitsPerEm(); } gfxFont::~gfxFont() { ===================================== gfx/thebes/gfxFontEntry.cpp ===================================== @@ -262,14 +262,22 @@ already_AddRefed<gfxFont> gfxFontEntry::FindOrMakeFont( } uint16_t gfxFontEntry::UnitsPerEm() { + { + AutoReadLock lock(mLock); + if (mUnitsPerEm) { + return mUnitsPerEm; + } + } + + AutoTable headTable(this, TRUETYPE_TAG('h', 'e', 'a', 'd')); + AutoWriteLock lock(mLock); + if (!mUnitsPerEm) { - AutoTable headTable(this, TRUETYPE_TAG('h', 'e', 'a', 'd')); if (headTable) { uint32_t len; const HeadTable* head = reinterpret_cast<const HeadTable*>(hb_blob_get_data(headTable, &len)); if (len >= sizeof(HeadTable)) { - mUnitsPerEm = head->unitsPerEm; if (int16_t(head->xMax) > int16_t(head->xMin) && int16_t(head->yMax) > int16_t(head->yMin)) { mXMin = head->xMin; @@ -277,6 +285,7 @@ uint16_t gfxFontEntry::UnitsPerEm() { mXMax = head->xMax; mYMax = head->yMax; } + mUnitsPerEm = head->unitsPerEm; } } @@ -286,12 +295,13 @@ uint16_t gfxFontEntry::UnitsPerEm() { mUnitsPerEm = kInvalidUPEM; } } + return mUnitsPerEm; } bool gfxFontEntry::HasSVGGlyph(uint32_t aGlyphId) { - NS_ASSERTION(mSVGInitialized, - "SVG data has not yet been loaded. TryGetSVGData() first."); + MOZ_ASSERT(mSVGInitialized, + "SVG data has not yet been loaded. TryGetSVGData() first."); return GetSVGGlyphs()->HasSVGGlyph(aGlyphId); } @@ -309,8 +319,8 @@ bool gfxFontEntry::GetSVGGlyphExtents(DrawTarget* aDrawTarget, void gfxFontEntry::RenderSVGGlyph(gfxContext* aContext, uint32_t aGlyphId, SVGContextPaint* aContextPaint) { - NS_ASSERTION(mSVGInitialized, - "SVG data has not yet been loaded. TryGetSVGData() first."); + MOZ_ASSERT(mSVGInitialized, + "SVG data has not yet been loaded. TryGetSVGData() first."); GetSVGGlyphs()->RenderGlyph(aContext, aGlyphId, aContextPaint); } @@ -467,8 +477,9 @@ hb_blob_t* gfxFontEntry::FontTableHashEntry::ShareTableAndGetBlob( HB_MEMORY_MODE_READONLY, mSharedBlobData, DeleteFontTableBlobData); if (mBlob == hb_blob_get_empty()) { // The FontTableBlobData was destroyed during hb_blob_create(). - // The (empty) blob is still be held in the hashtable with a strong + // The (empty) blob will still be held in the hashtable with a strong // reference. + mSharedBlobData = nullptr; return hb_blob_reference(mBlob); } ===================================== gfx/thebes/gfxFontEntry.h ===================================== @@ -538,6 +538,9 @@ class gfxFontEntry { mozilla::gfx::Rect GetFontExtents(float aFUnitScaleFactor) const { // Flip the y-axis here to match the orientation of Gecko's coordinates. + // We don't need to take a lock here because the min/max fields are inert + // after initialization, and we make sure to initialize them at gfxFont- + // creation time. return mozilla::gfx::Rect(float(mXMin) * aFUnitScaleFactor, float(-mYMax) * aFUnitScaleFactor, float(mXMax - mXMin) * aFUnitScaleFactor, View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/5cc512… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/5cc512… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.0-1] 3 commits: Bug 1871109 - generateHash in Manifest.sys.mjs should use sha256 r=peterv, a=dmeehan
by ma1 (@ma1) 09 May '24

09 May '24
ma1 pushed to branch tor-browser-115.11.0esr-13.0-1 at The Tor Project / Applications / Tor Browser Commits: a52dc31b by Nuohan Li at 2024-05-09T10:55:04+00:00 Bug 1871109 - generateHash in Manifest.sys.mjs should use sha256 r=peterv, a=dmeehan Differential Revision: https://phabricator.services.mozilla.com/D204928 - - - - - 88affd4a by Jonathan Kew at 2024-05-09T10:55:04+00:00 Bug 1890204 - Ensure font entry&#39;s unitsPerEm and font extents are initialized when gfxFont is created. r=gfx-reviewers,lsalzman This means that by the time we potentially call GetFontExtents() when drawing, the extents fields are guaranteed to have been been initialized, and there&#39;s no risk of the (read-only) access here racing with setting them in UnitsPerEm(). Differential Revision: https://phabricator.services.mozilla.com/D206920 - - - - - fc0ee191 by Jonathan Kew at 2024-05-09T10:55:04+00:00 Bug 1893891 - Clear mSharedBlobData if blob creation failed. a=dmeehan Original Revision: https://phabricator.services.mozilla.com/D208983 Differential Revision: https://phabricator.services.mozilla.com/D209209 - - - - - 5 changed files: - dom/manifest/Manifest.sys.mjs - dom/manifest/test/browser_Manifest_install.js - gfx/thebes/gfxFont.cpp - gfx/thebes/gfxFontEntry.cpp - gfx/thebes/gfxFontEntry.h Changes: ===================================== dom/manifest/Manifest.sys.mjs ===================================== @@ -29,11 +29,11 @@ ChromeUtils.defineESModuleGetters(lazy, { * @note The generated hash is returned in base64 form. Mind the fact base64 * is case-sensitive if you are going to reuse this code. */ -function generateHash(aString) { +function generateHash(aString, hashAlg) { const cryptoHash = Cc["@mozilla.org/security/hash;1"].createInstance( Ci.nsICryptoHash ); - cryptoHash.init(Ci.nsICryptoHash.MD5); + cryptoHash.init(hashAlg); const stringStream = Cc[ "@mozilla.org/io/string-input-stream;1" ].createInstance(Ci.nsIStringInputStream); @@ -66,11 +66,39 @@ class Manifest { this._manifestUrl = manifestUrl; // The key for this is the manifests URL that is required to be unique. // However arbitrary urls are not safe file paths so lets hash it. - const fileName = generateHash(manifestUrl) + ".json"; - this._path = PathUtils.join(MANIFESTS_DIR, fileName); + const filename = + generateHash(manifestUrl, Ci.nsICryptoHash.SHA256) + ".json"; + this._path = PathUtils.join(MANIFESTS_DIR, filename); this.browser = browser; } + /** + * See Bug 1871109 + * This function is called at the beginning of initialize() to check if a given + * manifest has MD5 based filename, if so we remove it and migrate the content to + * a new file with SHA256 based name. + * This is done due to security concern, as MD5 is an outdated hashing algorithm and + * shouldn't be used anymore + */ + async removeMD5BasedFilename() { + const filenameMD5 = + generateHash(this._manifestUrl, Ci.nsICryptoHash.MD5) + ".json"; + const MD5Path = PathUtils.join(MANIFESTS_DIR, filenameMD5); + try { + await IOUtils.copy(MD5Path, this._path, { noOverwrite: true }); + } catch (error) { + // we are ignoring the failures returned from copy as it should not stop us from + // installing a new manifest + } + + // Remove the old MD5 based file unconditionally to ensure it's no longer used + try { + await IOUtils.remove(MD5Path); + } catch { + // ignore the error in case MD5 based file does not exist + } + } + get browser() { return this._browser; } @@ -80,6 +108,7 @@ class Manifest { } async initialize() { + await this.removeMD5BasedFilename(); this._store = new lazy.JSONFile({ path: this._path, saveDelayMs: 100 }); await this._store.load(); } ===================================== dom/manifest/test/browser_Manifest_install.js ===================================== @@ -23,18 +23,59 @@ function makeTestURL() { return url.href; } +function generateHash(aString, hashAlg) { + const cryptoHash = Cc["@mozilla.org/security/hash;1"].createInstance( + Ci.nsICryptoHash + ); + cryptoHash.init(hashAlg); + const stringStream = Cc[ + "@mozilla.org/io/string-input-stream;1" + ].createInstance(Ci.nsIStringInputStream); + stringStream.data = aString; + cryptoHash.updateFromStream(stringStream, -1); + // base64 allows the '/' char, but we can't use it for filenames. + return cryptoHash.finish(true).replace(/\//g, "-"); +} + +const MANIFESTS_DIR = PathUtils.join(PathUtils.profileDir, "manifests"); + add_task(async function () { const tabOptions = { gBrowser, url: makeTestURL() }; + const filenameMD5 = generateHash(manifestUrl, Ci.nsICryptoHash.MD5) + ".json"; + const filenameSHA = + generateHash(manifestUrl, Ci.nsICryptoHash.SHA256) + ".json"; + const manifestMD5Path = PathUtils.join(MANIFESTS_DIR, filenameMD5); + const manifestSHAPath = PathUtils.join(MANIFESTS_DIR, filenameSHA); + await BrowserTestUtils.withNewTab(tabOptions, async function (browser) { - let manifest = await Manifests.getManifest(browser, manifestUrl); - is(manifest.installed, false, "We haven't installed this manifest yet"); + let tmpManifest = await Manifests.getManifest(browser, manifestUrl); + is(tmpManifest.installed, false, "We haven't installed this manifest yet"); + + await tmpManifest.install(); + // making sure the manifest is actually installed before proceeding + await tmpManifest._store._save(); + await IOUtils.move(tmpManifest.path, manifestMD5Path); + + let exists = await IOUtils.exists(tmpManifest.path); + is( + exists, + false, + "Manually moved manifest from SHA256 based path to MD5 based path" + ); + Manifests.manifestObjs.delete(manifestUrl); + + let manifest = await Manifests.getManifest(browser, manifestUrl); await manifest.install(browser); is(manifest.name, "hello World", "Manifest has correct name"); is(manifest.installed, true, "Manifest is installed"); is(manifest.url, manifestUrl, "has correct url"); is(manifest.browser, browser, "has correct browser"); + is(manifest.path, manifestSHAPath, "has correct path"); + + exists = await IOUtils.exists(manifestMD5Path); + is(exists, false, "MD5 based manifest removed"); manifest = await Manifests.getManifest(browser, manifestUrl); is(manifest.installed, true, "New instances are installed"); ===================================== gfx/thebes/gfxFont.cpp ===================================== @@ -952,6 +952,10 @@ gfxFont::gfxFont(const RefPtr<UnscaledFont>& aUnscaledFont, } mKerningSet = HasFeatureSet(HB_TAG('k', 'e', 'r', 'n'), mKerningEnabled); + + // Ensure the gfxFontEntry's unitsPerEm and extents fields are initialized, + // so that GetFontExtents can use them without risk of races. + Unused << mFontEntry->UnitsPerEm(); } gfxFont::~gfxFont() { ===================================== gfx/thebes/gfxFontEntry.cpp ===================================== @@ -262,14 +262,22 @@ already_AddRefed<gfxFont> gfxFontEntry::FindOrMakeFont( } uint16_t gfxFontEntry::UnitsPerEm() { + { + AutoReadLock lock(mLock); + if (mUnitsPerEm) { + return mUnitsPerEm; + } + } + + AutoTable headTable(this, TRUETYPE_TAG('h', 'e', 'a', 'd')); + AutoWriteLock lock(mLock); + if (!mUnitsPerEm) { - AutoTable headTable(this, TRUETYPE_TAG('h', 'e', 'a', 'd')); if (headTable) { uint32_t len; const HeadTable* head = reinterpret_cast<const HeadTable*>(hb_blob_get_data(headTable, &len)); if (len >= sizeof(HeadTable)) { - mUnitsPerEm = head->unitsPerEm; if (int16_t(head->xMax) > int16_t(head->xMin) && int16_t(head->yMax) > int16_t(head->yMin)) { mXMin = head->xMin; @@ -277,6 +285,7 @@ uint16_t gfxFontEntry::UnitsPerEm() { mXMax = head->xMax; mYMax = head->yMax; } + mUnitsPerEm = head->unitsPerEm; } } @@ -286,12 +295,13 @@ uint16_t gfxFontEntry::UnitsPerEm() { mUnitsPerEm = kInvalidUPEM; } } + return mUnitsPerEm; } bool gfxFontEntry::HasSVGGlyph(uint32_t aGlyphId) { - NS_ASSERTION(mSVGInitialized, - "SVG data has not yet been loaded. TryGetSVGData() first."); + MOZ_ASSERT(mSVGInitialized, + "SVG data has not yet been loaded. TryGetSVGData() first."); return GetSVGGlyphs()->HasSVGGlyph(aGlyphId); } @@ -309,8 +319,8 @@ bool gfxFontEntry::GetSVGGlyphExtents(DrawTarget* aDrawTarget, void gfxFontEntry::RenderSVGGlyph(gfxContext* aContext, uint32_t aGlyphId, SVGContextPaint* aContextPaint) { - NS_ASSERTION(mSVGInitialized, - "SVG data has not yet been loaded. TryGetSVGData() first."); + MOZ_ASSERT(mSVGInitialized, + "SVG data has not yet been loaded. TryGetSVGData() first."); GetSVGGlyphs()->RenderGlyph(aContext, aGlyphId, aContextPaint); } @@ -467,8 +477,9 @@ hb_blob_t* gfxFontEntry::FontTableHashEntry::ShareTableAndGetBlob( HB_MEMORY_MODE_READONLY, mSharedBlobData, DeleteFontTableBlobData); if (mBlob == hb_blob_get_empty()) { // The FontTableBlobData was destroyed during hb_blob_create(). - // The (empty) blob is still be held in the hashtable with a strong + // The (empty) blob will still be held in the hashtable with a strong // reference. + mSharedBlobData = nullptr; return hb_blob_reference(mBlob); } ===================================== gfx/thebes/gfxFontEntry.h ===================================== @@ -538,6 +538,9 @@ class gfxFontEntry { mozilla::gfx::Rect GetFontExtents(float aFUnitScaleFactor) const { // Flip the y-axis here to match the orientation of Gecko's coordinates. + // We don't need to take a lock here because the min/max fields are inert + // after initialization, and we make sure to initialize them at gfxFont- + // creation time. return mozilla::gfx::Rect(float(mXMin) * aFUnitScaleFactor, float(-mYMax) * aFUnitScaleFactor, float(mXMax - mXMin) * aFUnitScaleFactor, View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/10474e… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/10474e… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.0-1] 4 commits: Bug 1871214 - improve share interaction with fullscreen - BP, tor-browser#42656
by ma1 (@ma1) 09 May '24

09 May '24
ma1 pushed to branch firefox-android-115.2.1-13.0-1 at The Tor Project / Applications / firefox-android Commits: d3aa11b9 by hackademix at 2024-05-08T18:01:13+02:00 Bug 1871214 - improve share interaction with fullscreen - BP, tor-browser#42656 - - - - - 43756a25 by Arturo Mejia at 2024-05-08T19:23:07+02:00 Bug 1846306 - Do not throw IllegalStateException when unable to find a session for given prompt request in onContentPermissionRequested - - - - - 44c271d8 by hackademix at 2024-05-08T19:29:05+02:00 Bug 1871217: Improve permission handling in Fullscreen - BP, tor-browser#42656 - - - - - f72ebb33 by hackademix at 2024-05-08T20:40:25+02:00 Bug 1892296 - improve webauthn experience - BP, tor-browser#42656 - - - - - 6 changed files: - android-components/components/feature/sitepermissions/src/main/java/mozilla/components/feature/sitepermissions/SitePermissionsFeature.kt - android-components/components/feature/sitepermissions/src/test/java/mozilla/components/feature/sitepermissions/SitePermissionsFeatureTest.kt - android-components/components/feature/webauthn/src/main/java/mozilla/components/feature/webauthn/WebAuthnFeature.kt - android-components/components/feature/webauthn/src/test/java/mozilla/components/feature/webauthn/WebAuthnFeatureTest.kt - fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt - fenix/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt Changes: ===================================== android-components/components/feature/sitepermissions/src/main/java/mozilla/components/feature/sitepermissions/SitePermissionsFeature.kt ===================================== @@ -56,12 +56,14 @@ import mozilla.components.concept.engine.permission.SitePermissions import mozilla.components.concept.engine.permission.SitePermissions.Status.ALLOWED import mozilla.components.concept.engine.permission.SitePermissions.Status.BLOCKED import mozilla.components.concept.engine.permission.SitePermissionsStorage +import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.sitepermissions.SitePermissionsFeature.DialogConfig import mozilla.components.feature.tabs.TabsUseCases.SelectOrAddUseCase import mozilla.components.lib.state.ext.flowScoped import mozilla.components.support.base.feature.LifecycleAwareFeature import mozilla.components.support.base.feature.OnNeedToRequestPermissions import mozilla.components.support.base.feature.PermissionsFeature +import mozilla.components.support.base.log.logger.Logger import mozilla.components.support.ktx.android.content.isPermissionGranted import mozilla.components.support.ktx.kotlin.getOrigin import mozilla.components.support.ktx.kotlin.stripDefaultPort @@ -72,8 +74,6 @@ import mozilla.components.ui.icons.R as iconsR internal const val PROMPT_FRAGMENT_TAG = "mozac_feature_sitepermissions_prompt_dialog" -private const val FULL_SCREEN_NOTIFICATION_TAG = "mozac_feature_prompts_full_screen_notification_dialog" - @VisibleForTesting internal const val STORAGE_ACCESS_DOCUMENTATION_URL = "https://developer.mozilla.org/en-US/docs/Web/API/Storage_Access_API" @@ -94,13 +94,15 @@ internal const val STORAGE_ACCESS_DOCUMENTATION_URL = * need to be requested. Once the request is completed, [onPermissionsResult] needs to be invoked. * @property onShouldShowRequestPermissionRationale a callback that allows the feature to query * the ActivityCompat.shouldShowRequestPermissionRationale or the Fragment.shouldShowRequestPermissionRationale values. + * @property exitFullscreenUseCase optional the use case in charge of exiting fullscreen * @property shouldShowDoNotAskAgainCheckBox optional Visibility for Do not ask again Checkbox **/ @Suppress("TooManyFunctions", "LargeClass", "LongParameterList") class SitePermissionsFeature( private val context: Context, - private var sessionId: String? = null, + @set:VisibleForTesting + internal var sessionId: String? = null, private val storage: SitePermissionsStorage = OnDiskSitePermissionsStorage(context), var sitePermissionsRules: SitePermissionsRules? = null, private val fragmentManager: FragmentManager, @@ -109,6 +111,7 @@ class SitePermissionsFeature( override val onNeedToRequestPermissions: OnNeedToRequestPermissions, val onShouldShowRequestPermissionRationale: (permission: String) -> Boolean, private val store: BrowserStore, + private val exitFullscreenUseCase: SessionUseCases.ExitFullScreenUseCase = SessionUseCases(store).exitFullscreen, private val shouldShowDoNotAskAgainCheckBox: Boolean = true, ) : LifecycleAwareFeature, PermissionsFeature { @VisibleForTesting @@ -116,6 +119,8 @@ class SitePermissionsFeature( SelectOrAddUseCase(store) } + private val logger = Logger("SitePermissionsFeature") + internal val ioCoroutineScope by lazy { coroutineScopeInitializer() } internal var coroutineScopeInitializer = { @@ -428,26 +433,29 @@ class SitePermissionsFeature( consumePermissionRequest(permissionRequest) return null } - - val private: Boolean = store.state.findTabOrCustomTabOrSelectedTab(sessionId)?.content?.private - ?: throw IllegalStateException("Unable to find session for $sessionId or selected session") + val tab = store.state.findTabOrCustomTabOrSelectedTab(sessionId) + if (tab == null) { + logger.error("Unable to find a tab for $sessionId rejecting the prompt request") + permissionRequest.reject() + consumePermissionRequest(permissionRequest) + return null + } val permissionFromStorage = withContext(coroutineScope.coroutineContext) { - storage.findSitePermissionsBy(origin, private = private) + storage.findSitePermissionsBy(origin, private = tab.content.private) } - val prompt = if (shouldApplyRules(permissionFromStorage)) { handleRuledFlow(permissionRequest, origin) } else { handleNoRuledFlow(permissionFromStorage, permissionRequest, origin) } - val fullScreenNotificationDisplayed = - fragmentManager.fragments.any { fragment -> fragment.tag == FULL_SCREEN_NOTIFICATION_TAG } - - return if (fullScreenNotificationDisplayed || prompt == null) { + return if (prompt == null) { null } else { + // If we are in fullscreen, then exit to show the permission prompt. + // This won't have any effect if we are not in fullscreen. + exitFullscreenUseCase.invoke(tab.id) prompt.show(fragmentManager, PROMPT_FRAGMENT_TAG) prompt } ===================================== android-components/components/feature/sitepermissions/src/test/java/mozilla/components/feature/sitepermissions/SitePermissionsFeatureTest.kt ===================================== @@ -600,6 +600,24 @@ class SitePermissionsFeatureTest { verify(sitePermissionFeature).consumePermissionRequest(mockPermissionRequest) } + @Test + fun `GIVEN sessionId which does not match a selected or custom tab WHEN onContentPermissionRequested() THEN reject, consumePermissionRequest are called `() { + val mockPermissionRequest: PermissionRequest = mock { + whenever(permissions).thenReturn(listOf(ContentVideoCamera(id = "permission"))) + } + + doNothing().`when`(mockPermissionRequest).reject() + + sitePermissionFeature.sessionId = null + + runTestOnMain { + sitePermissionFeature.onContentPermissionRequested(mockPermissionRequest, URL) + } + + verify(mockPermissionRequest).reject() + verify(sitePermissionFeature).consumePermissionRequest(mockPermissionRequest) + } + @Test fun `GIVEN location permissionRequest and shouldApplyRules is true WHEN onContentPermissionRequested() THEN handleRuledFlow is called`() = runTestOnMain { // given ===================================== android-components/components/feature/webauthn/src/main/java/mozilla/components/feature/webauthn/WebAuthnFeature.kt ===================================== @@ -20,6 +20,8 @@ import mozilla.components.support.base.log.logger.Logger class WebAuthnFeature( private val engine: Engine, private val activity: Activity, + private val exitFullScreen: (String?) -> Unit, + private val currentTab: () -> String?, ) : LifecycleAwareFeature, ActivityResultHandler, ActivityDelegate { private val logger = Logger("WebAuthnFeature") private var requestCodeCounter = ACTIVITY_REQUEST_CODE @@ -53,6 +55,7 @@ class WebAuthnFeature( override fun startIntentSenderForResult(intent: IntentSender, onResult: (Intent?) -> Unit) { logger.info("Received activity delegate request with code: $requestCodeCounter") + exitFullScreen(currentTab()) activity.startIntentSenderForResult(intent, requestCodeCounter, null, 0, 0, 0) callbackRef = onResult } ===================================== android-components/components/feature/webauthn/src/test/java/mozilla/components/feature/webauthn/WebAuthnFeatureTest.kt ===================================== @@ -22,6 +22,8 @@ import org.mockito.Mockito.verify class WebAuthnFeatureTest { private lateinit var engine: Engine private lateinit var activity: Activity + private val exitFullScreen: (String?) -> Unit = { _ -> exitFullScreenUseCaseCalled = true } + private var exitFullScreenUseCaseCalled = false @Before fun setup() { @@ -31,7 +33,7 @@ class WebAuthnFeatureTest { @Test fun `feature registers itself on start`() { - val feature = WebAuthnFeature(engine, activity) + val feature = webAuthnFeature() feature.start() @@ -40,7 +42,7 @@ class WebAuthnFeatureTest { @Test fun `feature unregisters itself on stop`() { - val feature = WebAuthnFeature(engine, activity) + val feature = webAuthnFeature() feature.stop() @@ -49,7 +51,7 @@ class WebAuthnFeatureTest { @Test fun `activity delegate starts intent sender`() { - val feature = WebAuthnFeature(engine, activity) + val feature = webAuthnFeature() val callback: ((Intent?) -> Unit) = { } val intentSender: IntentSender = mock() @@ -60,7 +62,7 @@ class WebAuthnFeatureTest { @Test fun `callback is invoked`() { - val feature = WebAuthnFeature(engine, activity) + val feature = webAuthnFeature() var callbackInvoked = false val callback: ((Intent?) -> Unit) = { callbackInvoked = true } val intentSender: IntentSender = mock() @@ -77,10 +79,14 @@ class WebAuthnFeatureTest { @Test fun `feature won't process results with the wrong request code`() { - val feature = WebAuthnFeature(engine, activity) + val feature = webAuthnFeature() val result = feature.onActivityResult(ACTIVITY_REQUEST_CODE - 5, Intent(), 0) assertFalse(result) } + + private fun webAuthnFeature(): WebAuthnFeature { + return WebAuthnFeature(engine, activity, { exitFullScreen("") }) { "" } + } } ===================================== fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt ===================================== @@ -830,6 +830,8 @@ abstract class BaseBrowserFragment : feature = WebAuthnFeature( engine = requireComponents.core.engine, activity = requireActivity(), + exitFullScreen = requireComponents.useCases.sessionUseCases.exitFullscreen::invoke, + currentTab = { store.state.selectedTabId }, ), owner = this, view = view, ===================================== fenix/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt ===================================== @@ -71,6 +71,7 @@ class ShareFragment : AppCompatDialogFragment() { container: ViewGroup?, savedInstanceState: Bundle?, ): View { + requireComponents.useCases.sessionUseCases.exitFullscreen.invoke() val binding = FragmentShareBinding.inflate( inflater, container, View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/compare/f9… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/compare/f9… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-115.11.0esr-13.0-1] fixup! Bug 40926: Implemented the New Identity feature
by Pier Angelo Vendrame (@pierov) 09 May '24

09 May '24
Pier Angelo Vendrame pushed to branch mullvad-browser-115.11.0esr-13.0-1 at The Tor Project / Applications / Mullvad Browser Commits: d383e377 by hackademix at 2024-05-09T12:22:08+02:00 fixup! Bug 40926: Implemented the New Identity feature Bug 42532: Use the HomePage module for new identity checks. - - - - - 1 changed file: - browser/components/newidentity/content/newidentity.js Changes: ===================================== browser/components/newidentity/content/newidentity.js ===================================== @@ -429,15 +429,12 @@ XPCOMUtils.defineLazyGetter(this, "NewIdentityButton", () => { return new Promise(resolve => { // Open a new window forcing the about:privatebrowsing page (tor-browser#41765) // unless user explicitly overrides this policy (tor-browser #42236) - const homePref = "browser.startup.homepage"; const trustedHomePref = "browser.startup.homepage.new_identity"; - const homeURL = Services.prefs.getStringPref(homePref, ""); - const defaultHomeURL = Services.prefs - .getDefaultBranch("") - .getStringPref(homePref, ""); + const homeURL = HomePage.get(); + const defaultHomeURL = HomePage.getDefault(); const isTrustedHome = homeURL === defaultHomeURL || - homeURL.startsWith("chrome://") || // about:blank and other built-ins + homeURL === "chrome://browser/content/blanktab.html" || // about:blank homeURL === Services.prefs.getStringPref(trustedHomePref, ""); const isCustomHome = Services.prefs.getIntPref("browser.startup.page") === 1; View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/d38… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/d38… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.0-1] fixup! Bug 40926: Implemented the New Identity feature
by Pier Angelo Vendrame (@pierov) 09 May '24

09 May '24
Pier Angelo Vendrame pushed to branch tor-browser-115.11.0esr-13.0-1 at The Tor Project / Applications / Tor Browser Commits: 10474e51 by hackademix at 2024-05-09T12:21:45+02:00 fixup! Bug 40926: Implemented the New Identity feature Bug 42532: Use the HomePage module for new identity checks. - - - - - 1 changed file: - browser/components/newidentity/content/newidentity.js Changes: ===================================== browser/components/newidentity/content/newidentity.js ===================================== @@ -429,15 +429,12 @@ XPCOMUtils.defineLazyGetter(this, "NewIdentityButton", () => { return new Promise(resolve => { // Open a new window forcing the about:privatebrowsing page (tor-browser#41765) // unless user explicitly overrides this policy (tor-browser #42236) - const homePref = "browser.startup.homepage"; const trustedHomePref = "browser.startup.homepage.new_identity"; - const homeURL = Services.prefs.getStringPref(homePref, ""); - const defaultHomeURL = Services.prefs - .getDefaultBranch("") - .getStringPref(homePref, ""); + const homeURL = HomePage.get(); + const defaultHomeURL = HomePage.getDefault(); const isTrustedHome = homeURL === defaultHomeURL || - homeURL.startsWith("chrome://") || // about:blank and other built-ins + homeURL === "chrome://browser/content/blanktab.html" || // about:blank homeURL === Services.prefs.getStringPref(trustedHomePref, ""); const isCustomHome = Services.prefs.getIntPref("browser.startup.page") === 1; View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/10474e5… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/10474e5… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][base-browser-115.11.0esr-13.0-1] fixup! Bug 40926: Implemented the New Identity feature
by Pier Angelo Vendrame (@pierov) 09 May '24

09 May '24
Pier Angelo Vendrame pushed to branch base-browser-115.11.0esr-13.0-1 at The Tor Project / Applications / Tor Browser Commits: 5cc51272 by hackademix at 2024-05-09T12:21:19+02:00 fixup! Bug 40926: Implemented the New Identity feature Bug 42532: Use the HomePage module for new identity checks. - - - - - 1 changed file: - browser/components/newidentity/content/newidentity.js Changes: ===================================== browser/components/newidentity/content/newidentity.js ===================================== @@ -429,15 +429,12 @@ XPCOMUtils.defineLazyGetter(this, "NewIdentityButton", () => { return new Promise(resolve => { // Open a new window forcing the about:privatebrowsing page (tor-browser#41765) // unless user explicitly overrides this policy (tor-browser #42236) - const homePref = "browser.startup.homepage"; const trustedHomePref = "browser.startup.homepage.new_identity"; - const homeURL = Services.prefs.getStringPref(homePref, ""); - const defaultHomeURL = Services.prefs - .getDefaultBranch("") - .getStringPref(homePref, ""); + const homeURL = HomePage.get(); + const defaultHomeURL = HomePage.getDefault(); const isTrustedHome = homeURL === defaultHomeURL || - homeURL.startsWith("chrome://") || // about:blank and other built-ins + homeURL === "chrome://browser/content/blanktab.html" || // about:blank homeURL === Services.prefs.getStringPref(trustedHomePref, ""); const isCustomHome = Services.prefs.getIntPref("browser.startup.page") === 1; View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/5cc5127… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/5cc5127… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] 7 commits: Bug 41137: add the linux-aarch64 targets and improve linux-cross
by Pier Angelo Vendrame (@pierov) 09 May '24

09 May '24
Pier Angelo Vendrame pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 08c95509 by NoisyCoil at 2024-05-08T15:40:26+02:00 Bug 41137: add the linux-aarch64 targets and improve linux-cross - - - - - 9c8ed4d1 by NoisyCoil at 2024-05-08T15:43:49+02:00 Bug 41137: &#39;--add-architecture&#39; in containers only when actually cross-compiling Mainly so that the container&#39;s id, which is also determined by &#39;pre&#39;, does not change if we call the project with &#39;linux-cross&#39; but don&#39;t actually need to cross-compile. - - - - - e53ab0d3 by NoisyCoil at 2024-05-08T15:44:51+02:00 Bug 41137: Define distdir and filename for cross-binutils - - - - - af937966 by NoisyCoil at 2024-05-08T15:46:09+02:00 Bug 41137: Separate gcc and gcc-cross Use stretch&#39;s glibc and stretch-security&#39;s linux to maintain compatibility with Debian stretch, add linux-aarch64 glibc patches to avoid build failures - - - - - db06f569 by NoisyCoil at 2024-05-08T15:49:12+02:00 Bug 41137: Add the linux-aarch64 target to OpenSSL - - - - - da1663bd by NoisyCoil at 2024-05-09T11:17:19+02:00 Bug 41137: Add the linux-{aarch64,arm} targets to Tor - - - - - 06de89a5 by NoisyCoil at 2024-05-09T11:17:19+02:00 Bug 41137: Add the linux-{aarch64,arm} targets to Go - - - - - 16 changed files: - projects/binutils/build - projects/binutils/config - projects/container-image/config - + projects/gcc-cross/build - + projects/gcc-cross/config - + projects/gcc-cross/gcc-cross.patch - + projects/gcc-cross/glibc-cross-linux-aarch64-2.patch - + projects/gcc-cross/glibc-cross-linux-aarch64.patch - projects/gcc/build - projects/gcc/config - projects/go-bootstrap/config - projects/go/config - projects/openssl/config - projects/tor/build - projects/tor/config - rbm.conf Changes: ===================================== projects/binutils/build ===================================== @@ -1,7 +1,7 @@ #!/bin/bash [% c("var/set_default_env") -%] mkdir /var/tmp/dist -distdir=/var/tmp/dist/binutils +distdir=/var/tmp/dist/[% c("var/distdir") %] [% IF c("var/linux"); GET c("var/set_hardened_build_flags"); END %] tar xf [% project %]-[% c("version") %].tar.xz @@ -15,6 +15,6 @@ make install MAKEINFO=true cd /var/tmp/dist [% c('tar', { - tar_src => [ project ], + tar_src => [ c('var/distdir') ], tar_args => '-caf ' _ dest_dir _ '/' _ c('filename'), }) %] ===================================== projects/binutils/config ===================================== @@ -1,9 +1,10 @@ # vim: filetype=yaml sw=2 version: 2.39 -filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]' +filename: '[% project %]-[% c("version") %]-[% IF c("var/linux-cross") %]cross-[% c("arch") %]-[% END %][% c("var/build_id") %].tar.[% c("compress_tar") %]' container: use_container: 1 var: + distdir: binutils configure_opt: '--disable-multilib --enable-gold --enable-deterministic-archives --enable-plugins' targets: @@ -12,6 +13,7 @@ targets: configure_opt: '--target=[% c("arch") %]-w64-mingw32 --disable-multilib --enable-deterministic-archives' linux-cross: var: + distdir: 'binutils-cross-[% c("arch") %]' # gold is disabled on cross-compiles until we upgrade to glibc 2.26 and # binutils 2.28 configure_opt: '--target=[% c("var/crosstarget") %] --disable-multilib --enable-deterministic-archives --enable-plugins' ===================================== projects/container-image/config ===================================== @@ -34,7 +34,7 @@ pre: | apt-get update -y -q [% IF pc(c('origin_project'), 'var/pre_pkginst', { step => c('origin_step') }) -%] [% pc(c('origin_project'), 'var/pre_pkginst', { step => c('origin_step') }) %] - [% IF c("var/linux-cross") -%] + [% IF c("var/linux-cross") && ! pc(c('origin_project'), 'var/no_crosscompile', { step => c('origin_step') }) -%] dpkg --add-architecture [% c("var/arch_debian") %] [% END -%] # Update the package cache again because `pre_pkginst` may change the ===================================== projects/gcc-cross/build ===================================== @@ -0,0 +1,96 @@ +#!/bin/sh +[% c("var/set_default_env") -%] +mkdir -p /var/tmp/build +distdir=/var/tmp/dist/[% c("var/distdir") %] + +# Install native gcc +mkdir /var/tmp/dist +cd /var/tmp/dist +tar xf $rootdir/[% c('input_files_by_name/gcc-native') %] +export PATH="$distdir/bin:$PATH" + +# Install cross binutils (needed for cross-compiling) +cd /var/tmp/dist +tar xf $rootdir/[% c('input_files_by_name/binutils') %] +rsync -a binutils-cross-[% c("arch") %]/* $distdir +rm -rf binutils-cross-[% c("arch") %] + +# Install Linux headers, see Step 2 of +# https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/ +# Doing this before gcc configure is intended to solve a limits.h issue +cd /var/tmp/build +mkdir linux +cd linux +tar -xJf $rootdir/linux-[% c("var/linux_version") %].tar.xz +cd linux-[% c("var/linux_version") %] +make ARCH=[% IF c("arch") == "aarch64" %]arm64[% ELSE %][% c("arch") %][% END %] INSTALL_HDR_PATH=$distdir/[% c("var/crosstarget") %] headers_install + +cd /var/tmp/build +mkdir gcc-cross +cd gcc-cross +tar -xJf $rootdir/[% c('input_files_by_name/gcc') %] +cd gcc-[% c("version") %] +patch -p1 <$rootdir/gcc-cross.patch + +cd /var/tmp/build/gcc-cross +gcc-[% c("version") %]/configure --prefix=$distdir --includedir=$distdir/[% c("var/crosstarget") %]/include [% c("var/configure_opt") %] + +# For cross-compiling to work, we need to partially build GCC, then build +# glibc, then come back to finish GCC. + +# Build only the components of GCC that don't need glibc, see Step 3 of +# https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/ +cd /var/tmp/build/gcc-cross +make -j[% c("num_procs") %] all-gcc +make install-gcc + +# Build glibc headers and startup files, see Step 4 of +# https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/ +cd /var/tmp/build +mkdir glibc +cd glibc +tar -xJf $rootdir/glibc-[% c("var/glibc_version") %].tar.xz +[% IF c("var/linux-aarch64") -%] + # Avoid linking issues by backporting glibc patches + cd glibc-[% c("var/glibc_version") %] + patch -p1 <$rootdir/glibc-cross-linux-aarch64.patch + patch -p1 <$rootdir/glibc-cross-linux-aarch64-2.patch + cd /var/tmp/build/glibc +[% END -%] + +# TODO: Remove --disable-werror once glibc is upgraded to a version that's +# designed to work with the GCC version we're using. +glibc-[% c("var/glibc_version") %]/configure --prefix=$distdir/[% c("var/crosstarget") %] --build=$MACHTYPE --host=[% c("var/crosstarget") %] --target=[% c("var/crosstarget") %] --with-headers=$distdir/[% c("var/crosstarget") %]/include --disable-multilib --disable-werror libc_cv_forced_unwind=yes +make install-bootstrap-headers=yes install-headers +make -j[% c("num_procs") %] csu/subdir_lib +install csu/crt1.o csu/crti.o csu/crtn.o $distdir/[% c("var/crosstarget") %]/lib +[% c("var/crosstarget") %]-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o $distdir/[% c("var/crosstarget") %]/lib/libc.so +# stdio_lim.h is intended to solve a limits.h issue +touch $distdir/[% c("var/crosstarget") %]/include/gnu/stubs.h $distdir/[% c("var/crosstarget") %]/include/bits/stdio_lim.h + +# Build compiler support library, see Step 5 of +# https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/ +cd /var/tmp/build/gcc-cross +make -j[% c("num_procs") %] all-target-libgcc +make install-target-libgcc + +# finish building glibc, see Step 6 of +# https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/ +cd /var/tmp/build/glibc +make -j[% c("num_procs") %] +make install + +# We're done with glibc, we can now finish building gcc... +cd /var/tmp/build/gcc-cross +make -j[% c("num_procs") %] +make install + +# Include a working version of limits.h +cd gcc-[% c("version") %] +cat gcc/limitx.h gcc/glimits.h gcc/limity.h >$distdir/lib/gcc/[% c("var/crosstarget") %]/[% c("version") %]/include/limits.h + +cd /var/tmp/dist +[% c('tar', { + tar_src => [ c('var/distdir') ], + tar_args => '-caf ' _ dest_dir _ '/' _ c('filename'), + }) %] ===================================== projects/gcc-cross/config ===================================== @@ -0,0 +1,53 @@ +# vim: filetype=yaml sw=2 +filename: '[% project %]-[% c("version") %]-[% c("arch") %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]' +# Note: When updating the gcc version, if this includes a libstdc++ +# ABI change we should also update projects/firefox/abicheck.cc to +# require the new version. +version: '[% pc("gcc-source", "version") %]' +container: + use_container: 1 +hardened_gcc: 1 +var: + distdir: gcc + deps: + - build-essential + - libmpc-dev + setup: | + mkdir -p /var/tmp/dist + tar -C /var/tmp/dist -xf $rootdir/[% c("compiler_tarfile") %] + export PATH="/var/tmp/dist/[% c("var/distdir") %]/bin:$PATH" + export LD_LIBRARY_PATH=/var/tmp/dist/[% c("var/distdir") %]/lib64:/var/tmp/dist/[% c("var/distdir") %]/lib32 + [% IF c("hardened_gcc"); GET c("var/set_hardened_build_flags"); END %] + configure_opt: '--target=[% c("var/crosstarget") %] --disable-multilib --enable-languages=c,c++ --with-glibc-version=[% c("var/glibc_version") %]' + # Use stretch's glibc and stretch-security's linux + glibc_version: 2.24 + linux_version: 4.19.232 + arch_deps: + - libc6-dev-i386 + - gawk + - rsync + +targets: + linux-arm: + var: + configure_opt: '--target=[% c("var/crosstarget") %] --disable-multilib --enable-languages=c,c++ --with-glibc-version=[% c("var/glibc_version") %] --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb' + +input_files: + - project: container-image + - project: gcc-source + name: gcc + - name: binutils + project: binutils + target_prepend: + - linux-cross + - name: gcc-native + project: gcc + - URL: 'https://ftp.gnu.org/gnu/glibc/glibc-[% c("var/glibc_version") %].tar.xz' + sha256sum: 99d4a3e8efd144d71488e478f62587578c0f4e1fa0b4eed47ee3d4975ebeb5d3 + - URL: 'https://www.kernel.org/pub/linux/kernel/v4.x/linux-[% c("var/linux_version") %].tar.xz' + sha256sum: 4fcfe814780d63dc56e907bf41596ff162e9601978bdc1a60eab64cc3903a22c + - filename: 'gcc-cross.patch' + - filename: 'glibc-cross-linux-aarch64.patch' + enable: '[% c("var/linux-aarch64") -%]' + - filename: 'glibc-cross-linux-aarch64-2.patch' + enable: '[% c("var/linux-aarch64") -%]' ===================================== projects/gcc-cross/gcc-cross.patch ===================================== @@ -0,0 +1,18 @@ +Avoids "../../../gcc-10.3.0/libsanitizer/asan/asan_linux.cpp:217:21: error: +'PATH_MAX' was not declared in this scope". PATH_MAX is in /include/linux/limits.h, +which is usually included by /include/limits.h (indirectly, through posix headers, +etc.). For some reason, when cross-compiling, this inclusion chain is broken and +we must include <linux/limits.h> by hand. + +Index: gcc-10.3.0/libsanitizer/asan/asan_linux.cpp +=================================================================== +--- gcc-10.3.0.orig/libsanitizer/asan/asan_linux.cpp ++++ gcc-10.3.0/libsanitizer/asan/asan_linux.cpp +@@ -32,6 +32,7 @@ + #include <dlfcn.h> + #include <fcntl.h> + #include <limits.h> ++#include <linux/limits.h> + #include <pthread.h> + #include <stdio.h> + #include <unistd.h> ===================================== projects/gcc-cross/glibc-cross-linux-aarch64-2.patch ===================================== @@ -0,0 +1,30 @@ +From e9177fba13549a8e2a6232f46080e5c6d3e467b1 Mon Sep 17 00:00:00 2001 +From: Szabolcs Nagy <szabolcs.nagy(a)arm.com> +Date: Wed, 21 Jun 2017 13:47:07 +0100 +Subject: [PATCH] [AArch64] Use hidden __GI__dl_argv in rtld startup code + +We rely on the symbol being locally defined so using extern symbol +is not correct and the linker may complain about the relocations. +--- + ChangeLog | 5 +++++ + sysdeps/aarch64/dl-machine.h | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +Index: glibc/sysdeps/aarch64/dl-machine.h +=================================================================== +--- glibc.orig/sysdeps/aarch64/dl-machine.h ++++ glibc/sysdeps/aarch64/dl-machine.h +@@ -172,8 +172,8 @@ _dl_start_user: \n\ + cmp x0, #0 \n\ + bne 1b \n\ + // Update _dl_argv \n\ +- adrp x3, _dl_argv \n\ +- str x2, [x3, #:lo12:_dl_argv] \n\ ++ adrp x3, __GI__dl_argv \n\ ++ str x2, [x3, #:lo12:__GI__dl_argv] \n\ + .L_done_stack_adjust: \n\ + // compute envp \n\ + add x3, x2, x1, lsl #3 \n\ +-- +2.43.2 + ===================================== projects/gcc-cross/glibc-cross-linux-aarch64.patch ===================================== @@ -0,0 +1,63 @@ +From a68ba2f3cd3cbe32c1f31e13c20ed13487727b32 Mon Sep 17 00:00:00 2001 +From: Szabolcs Nagy <szabolcs.nagy(a)arm.com> +Date: Wed, 18 Oct 2017 17:26:23 +0100 +Subject: [PATCH] [AARCH64] Rewrite elf_machine_load_address using _DYNAMIC + symbol + +This patch rewrites aarch64 elf_machine_load_address to use special _DYNAMIC +symbol instead of _dl_start. + +The static address of _DYNAMIC symbol is stored in the first GOT entry. +Here is the change which makes this solution work (part of binutils 2.24): +https://sourceware.org/ml/binutils/2013-06/msg00248.html + +i386, x86_64 targets use the same method to do this as well. + +The original implementation relies on a trick that R_AARCH64_ABS32 relocation +being resolved at link time and the static address fits in the 32bits. +However, in LP64, normally, the address is defined to be 64 bit. + +Here is the C version one which should be portable in all cases. + + * sysdeps/aarch64/dl-machine.h (elf_machine_load_address): Use + _DYNAMIC symbol to calculate load address. +--- + ChangeLog | 5 +++++ + sysdeps/aarch64/dl-machine.h | 39 +++++------------------------------- + 2 files changed, 10 insertions(+), 34 deletions(-) + +Index: glibc-2.26/sysdeps/aarch64/dl-machine.h +=================================================================== +--- glibc-2.26.orig/sysdeps/aarch64/dl-machine.h ++++ glibc-2.26/sysdeps/aarch64/dl-machine.h +@@ -51,26 +51,11 @@ elf_machine_load_address (void) + /* To figure out the load address we use the definition that for any symbol: + dynamic_addr(symbol) = static_addr(symbol) + load_addr + +- The choice of symbol is arbitrary. The static address we obtain +- by constructing a non GOT reference to the symbol, the dynamic +- address of the symbol we compute using adrp/add to compute the +- symbol's address relative to the PC. +- This depends on 32bit relocations being resolved at link time +- and that the static address fits in the 32bits. */ ++ _DYNAMIC sysmbol is used here as its link-time address stored in ++ the special unrelocated first GOT entry. */ + +- ElfW(Addr) static_addr; +- ElfW(Addr) dynamic_addr; +- +- asm (" \n" +-" adrp %1, _dl_start; \n" +-" add %1, %1, #:lo12:_dl_start \n" +-" ldr %w0, 1f \n" +-" b 2f \n" +-"1: \n" +-" .word _dl_start \n" +-"2: \n" +- : "=r" (static_addr), "=r" (dynamic_addr)); +- return dynamic_addr - static_addr; ++ extern ElfW(Dyn) _DYNAMIC[] attribute_hidden; ++ return (ElfW(Addr)) &_DYNAMIC - elf_machine_dynamic (); + } + + /* Set up the loaded object described by L so its unrelocated PLT ===================================== projects/gcc/build ===================================== @@ -1,7 +1,8 @@ #!/bin/sh [% c("var/set_default_env") -%] mkdir -p /var/tmp/build -[% IF c("var/linux") && ! c("var/linux-cross") -%] + +[% IF c("var/linux") -%] # Config options for hardening export DEB_BUILD_HARDENING=1 # Since r223796 landed on GCC master enforcing PIE breaks GCC compilation. @@ -19,81 +20,9 @@ mkdir -p /var/tmp/build [% END -%] distdir=/var/tmp/dist/[% c("var/distdir") %] -[% IF c("var/linux-cross") -%] - - # Install binutils (needed for cross-compiling) - mkdir /var/tmp/dist - cd /var/tmp/dist - tar xf $rootdir/[% c('input_files_by_name/binutils') %] - mv binutils $distdir - export PATH="$distdir/bin:$PATH" - - # Install Linux headers, see Step 2 of - # https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/ - # Doing this before gcc configure is intended to solve a limits.h issue - cd /var/tmp/build - mkdir linux - cd linux - tar -xJf $rootdir/linux-[% c("var/linux_version") %].tar.xz - cd linux-[% c("var/linux_version") %] - make ARCH=[% c("arch") %] INSTALL_HDR_PATH=$distdir/[% c("var/crosstarget") %] headers_install - - cd /var/tmp/build - mkdir gcc - cd gcc - tar -xJf $rootdir/[% c('input_files_by_name/gcc') %] - # --with-headers is intended to solve a limits.h issue - [% project %]-[% c("version") %]/configure --prefix=$distdir --with-headers=$distdir/[% c("var/crosstarget") %]/include/linux [% c("var/configure_opt") %] - - # For cross-compiling to work, we need to partially build GCC, then build - # glibc, then come back to finish GCC. - - # Build only the components of GCC that don't need glibc, see Step 3 of - # https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/ - cd /var/tmp/build/gcc - make -j[% c("num_procs") %] all-gcc - make install-gcc - # Removing sys-include is intended to solve a limits.h issue - rm --recursive --force $distdir/[% c("var/crosstarget") %]/sys-include - - # Build glibc headers and startup files, see Step 4 of - # https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/ - cd /var/tmp/build - mkdir glibc - cd glibc - tar -xJf $rootdir/glibc-[% c("var/glibc_version") %].tar.xz - # TODO: Remove --disable-werror once glibc is upgraded to a version that's - # designed to work with the GCC version we're using. - glibc-[% c("var/glibc_version") %]/configure --prefix=$distdir/[% c("var/crosstarget") %] --build=$MACHTYPE --host=[% c("var/crosstarget") %] --target=[% c("var/crosstarget") %] --with-headers=$distdir/[% c("var/crosstarget") %]/include --disable-multilib --disable-werror libc_cv_forced_unwind=yes - make install-bootstrap-headers=yes install-headers - make -j[% c("num_procs") %] csu/subdir_lib - install csu/crt1.o csu/crti.o csu/crtn.o $distdir/[% c("var/crosstarget") %]/lib - [% c("var/crosstarget") %]-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o $distdir/[% c("var/crosstarget") %]/lib/libc.so - # stdio_lim.h is intended to solve a limits.h issue - touch $distdir/[% c("var/crosstarget") %]/include/gnu/stubs.h $distdir/[% c("var/crosstarget") %]/include/bits/stdio_lim.h - - # Build compiler support library, see Step 5 of - # https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/ - cd /var/tmp/build/gcc - make -j[% c("num_procs") %] all-target-libgcc - make install-target-libgcc - - # finish building glibc, see Step 6 of - # https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/ - cd /var/tmp/build/glibc - make -j[% c("num_procs") %] - make install - - # We're done with glibc, we can now finish building gcc... - cd /var/tmp/build/gcc - -[% ELSE -%] - - tar -C /var/tmp/build -xf $rootdir/[% c('input_files_by_name/gcc') %] - cd /var/tmp/build/[% project %]-[% c("version") %] - ./configure --prefix=$distdir [% c("var/configure_opt") %] - -[% END -%] +tar -C /var/tmp/build -xf $rootdir/[% c('input_files_by_name/gcc') %] +cd /var/tmp/build/[% project %]-[% c("version") %] +./configure --prefix=$distdir [% c("var/configure_opt") %] make -j[% c("num_procs") %] make install ===================================== projects/gcc/config ===================================== @@ -1,5 +1,5 @@ # vim: filetype=yaml sw=2 -filename: '[% project %]-[% c("version") %]-[% IF c("var/linux-cross") %][% c("var/osname") %][% ELSE %]x86[% END %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]' +filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]' # Note: When updating the gcc version, if this includes a libstdc++ # ABI change we should also update projects/firefox/abicheck.cc to # require the new version. @@ -7,6 +7,7 @@ version: '[% pc("gcc-source", "version") %]' container: use_container: 1 var: + no_crosscompile: 1 distdir: gcc deps: - build-essential @@ -15,9 +16,7 @@ var: mkdir -p /var/tmp/dist tar -C /var/tmp/dist -xf $rootdir/[% c("compiler_tarfile") %] export PATH="/var/tmp/dist/[% c("var/distdir") %]/bin:$PATH" - [% IF ! c("var/linux-cross") -%] - export LD_LIBRARY_PATH=/var/tmp/dist/[% c("var/distdir") %]/lib64:/var/tmp/dist/[% c("var/distdir") %]/lib32 - [% END -%] + export LD_LIBRARY_PATH=/var/tmp/dist/[% c("var/distdir") %]/lib64:/var/tmp/dist/[% c("var/distdir") %]/lib32 [% IF c("hardened_gcc"); GET c("var/set_hardened_build_flags"); END %] targets: @@ -33,33 +32,8 @@ targets: configure_opt: --enable-multilib --enable-languages=c,c++ --with-arch_32=i686 arch_deps: - libc6-dev-i386 - linux-cross: - var: - target_prefix: '[% c("var/crosstarget") %]-' - distdir: gcc-cross - # TODO: Consider upgrading to a glibc that works out of the box with the - # GCC version we use. However, removing our glibc version workarounds may - # not be desirable since we want to be able to easily bump the GCC - # version without worrying about linux-cross breakage. - glibc_version: 2.26 - linux_version: 4.10.1 - arch_deps: - - libc6-dev-i386 - - gawk - linux-arm: - var: - configure_opt: --disable-multilib --enable-languages=c,c++ --target=arm-linux-gnueabihf --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb input_files: - project: container-image - project: gcc-source name: gcc - - name: binutils - project: binutils - enable: '[% c("var/linux-cross") -%]' - - URL: 'https://ftp.gnu.org/gnu/glibc/glibc-[% c("var/glibc_version") %].tar.xz' - sha256sum: e54e0a934cd2bc94429be79da5e9385898d2306b9eaf3c92d5a77af96190f6bd - enable: '[% c("var/linux-cross") -%]' - - URL: 'https://www.kernel.org/pub/linux/kernel/v4.x/linux-[% c("var/linux_version") %].tar.xz' - sha256sum: 6ca06bb5faf5f83600d7388bb623dae41df2a257de85ad5d1792e03302bc3543 - enable: '[% c("var/linux-cross") -%]' ===================================== projects/go-bootstrap/config ===================================== @@ -4,6 +4,9 @@ filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.[% c("co container: use_container: 1 +var: + no_crosscompile: 1 + input_files: - project: container-image - URL: 'https://golang.org/dl/go[% c("version") %].src.tar.gz' ===================================== projects/go/config ===================================== @@ -9,6 +9,7 @@ var: use_go_1_20: 0 go_1_21: 1.21.9 go_1_20: 1.20.14 + no_crosscompile: 1 setup: | mkdir -p /var/tmp/dist tar -C /var/tmp/dist -xf $rootdir/[% c("go_tarfile") %] @@ -101,6 +102,12 @@ targets: linux-i686: var: GOARCH: 386 + linux-aarch64: + var: + GOARCH: arm64 + linux-arm: + var: + GOARCH: arm android: var: GOOS: android ===================================== projects/openssl/config ===================================== @@ -14,6 +14,9 @@ targets: linux-i686: var: configure_opts: -shared linux-x86 + linux-aarch64: + var: + configure_opts: -shared --cross-compile-prefix=[% c("var/crosstarget") %]- enable-ec_nistp_64_gcc_128 linux-aarch64 linux-arm: var: configure_opts: -shared --cross-compile-prefix=[% c("var/crosstarget") %]- linux-armv4 ===================================== projects/tor/build ===================================== @@ -21,6 +21,20 @@ mkdir $TORBINDIR [% IF c("var/windows") || c("var/android") %] tar -C /var/tmp/dist -xf [% c('input_files_by_name/zlib') %] zlibdir=/var/tmp/dist/zlib +[% ELSIF c("var/linux-cross") %] + # Since 1. we are using Debian's zlib1g-dev:$arch_debian, 2. our + # cross-toolchain's default paths (i.e. -I and -L) are not the same + # as those of Debian's cross-toolchain, and 3. tor's configure does + # not support separate header and library directories for zlib, we + # need to make the headers and $arch_debian library available to + # configure manually. + # DO NOT use CPPFLAGS="-I/usr/include" to include the headers, the + # build will fail (probably because some of our cross-$arch_debian + # headers get masked by the native ones). + CROSS_INCLUDEDIR=/var/tmp/dist/gcc/[% c("var/crosstarget") %]/include + ln -s /usr/include/zconf.h $CROSS_INCLUDEDIR + ln -s /usr/include/zlib.h $CROSS_INCLUDEDIR + export LDFLAGS="-L/usr/lib/[% c("var/crosstarget") %] $LDFLAGS" [% END %] [% IF c("var/android") %] tar -C /var/tmp/dist -xf [% c('input_files_by_name/zstd') %] @@ -44,10 +58,14 @@ openssldir=/var/tmp/dist/openssl # LD_LIBRARY_PATH value to the Tor Browser with the newer one. Thus, we copy # the libstdc++ into the directory with the libs tor depends on, too. See bug # 13359 for further details. - cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libstdc++.so.6 "$TORBINDIR" + libdir=[% c("var/libdir") %] + [% IF c("var/linux-cross") -%] + libdir="[% c("var/crosstarget") %]/$libdir" + [% END -%] + cp "/var/tmp/dist/gcc/$libdir/libstdc++.so.6" "$TORBINDIR" [% IF c("var/asan") -%] - cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libasan.so.6 "$TORBINDIR" - cp /var/tmp/dist/gcc/[% c("var/libdir") %]/libubsan.so.1 "$TORBINDIR" + cp "/var/tmp/dist/gcc/$libdir/libasan.so.6" "$TORBINDIR" + cp "/var/tmp/dist/gcc/$libdir/libubsan.so.1" "$TORBINDIR" [% END -%] chmod 700 "$TORBINDIR"/*.so* # This is needed to make RPATH unavailable. See bug 9150. @@ -73,6 +91,7 @@ find -type f -print0 | xargs -0 [% c("touch") %] [% IF c("var/windows") || c("var/android") %]--with-zlib-dir="$zlibdir"[% END %] \ [% IF c("var/macos") %]--enable-static-openssl[% END %] \ [% IF c("var/windows") %]--enable-static-libevent --enable-static-openssl --enable-static-zlib[% END %] \ + [% IF c("var/linux-cross") %]--build=x86_64-linux-gnu[% END %] \ --enable-gpl --prefix="$distdir" [% c("var/configure_opt") %] [% IF c("var/macos") -%] export LD_PRELOAD=[% c("var/faketime_path") %] @@ -103,10 +122,17 @@ cd $distdir [% END %] [% IF c("var/linux") %] + [% IF c("var/linux-cross") -%] + CROSS_PREFIX=[% c("var/crosstarget") %]- + [% END -%] + + OBJCOPY="${CROSS_PREFIX}objcopy" + STRIP="${CROSS_PREFIX}strip" + # Strip and generate debuginfo for libs - objcopy --only-keep-debug $distdir/bin/tor "$TORDEBUGDIR/tor" - install -s $distdir/bin/tor "$TORBINDIR" - objcopy --add-gnu-debuglink="$TORDEBUGDIR/tor" "$TORBINDIR/tor" + "$OBJCOPY" --only-keep-debug $distdir/bin/tor "$TORDEBUGDIR/tor" + install -s --strip-program="$STRIP" $distdir/bin/tor "$TORBINDIR" + "$OBJCOPY" --add-gnu-debuglink="$TORDEBUGDIR/tor" "$TORBINDIR/tor" for i in "$TORBINDIR"/*so* do LIB=`basename $i` @@ -116,11 +142,11 @@ cd $distdir # treat this the same as the rest (though it seems libstdc++ doesn't come with # any useful debug symbols since we don't build it, so maybe we should figure # out how to package them - strip "$TORBINDIR/$LIB" + "$STRIP" "$TORBINDIR/$LIB" else - objcopy --only-keep-debug "$TORBINDIR/$LIB" "$TORDEBUGDIR/$LIB" - strip "$TORBINDIR/$LIB" - objcopy --add-gnu-debuglink="$TORDEBUGDIR/$LIB" "$TORBINDIR/$LIB" + "$OBJCOPY" --only-keep-debug "$TORBINDIR/$LIB" "$TORDEBUGDIR/$LIB" + "$STRIP" "$TORBINDIR/$LIB" + "$OBJCOPY" --add-gnu-debuglink="$TORDEBUGDIR/$LIB" "$TORBINDIR/$LIB" fi done [% END %] ===================================== projects/tor/config ===================================== @@ -30,6 +30,17 @@ targets: libdir: lib64 arch_deps: - zlib1g-dev + linux-aarch64: + var: + libdir: lib64 + arch_deps: + - zlib1g-dev:arm64 + linux-arm: + var: + libdir: lib + arch_deps: + - zlib1g-dev:armhf + android: var: configure_opt_project: '--enable-android --enable-static-openssl --enable-static-libevent --enable-zstd --disable-tool-name-check --disable-system-torrc' ===================================== rbm.conf ===================================== @@ -468,14 +468,29 @@ targets: - linux-i686 - linux - basebrowser + torbrowser-linux-aarch64: + - linux-cross + - linux-aarch64 + - linux + - torbrowser + basebrowser-linux-aarch64: + - linux-cross + - linux-aarch64 + - linux + - basebrowser + mullvadbrowser-linux-aarch64: + - linux-cross + - linux-aarch64 + - linux + - mullvadbrowser torbrowser-linux-arm: - - linux-arm - linux-cross + - linux-arm - linux - torbrowser basebrowser-linux-arm: - - linux-arm - linux-cross + - linux-arm - linux - basebrowser linux-x86_64: @@ -493,18 +508,26 @@ targets: linux-cross: 0 configure_opt: '--host=i686-linux-gnu CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32 [% c("var/configure_opt_project") %]' arch_debian: i386 + linux-aarch64: + arch: aarch64 + var: + linux-aarch64: 1 + osname: linux-aarch64 + linux-cross: 1 + arch_debian: arm64 + crosstarget: aarch64-linux-gnu linux-arm: arch: arm var: linux-arm: 1 osname: linux-arm - crosstarget: arm-linux-gnueabihf + linux-cross: 1 arch_debian: armhf + crosstarget: arm-linux-gnueabihf linux-cross: var: linux-cross: 1 - container: - arch: amd64 + compiler: 'gcc[% IF ! c("var/no_crosscompile") %]-cross[% END %]' configure_opt: '--host=[% c("var/crosstarget") %] [% c("var/configure_opt_project") %]' linux: # tar in strech does not know how to extract tar.zst files View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/… -- This project does not include diff previews in email notifications. 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
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-115.11.0esr-13.5-1] Bug 42574: Letterboxing, exempt pdf.js.
by ma1 (@ma1) 09 May '24

09 May '24
ma1 pushed to branch mullvad-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser Commits: d53848c0 by hackademix at 2024-05-09T10:52:58+02:00 Bug 42574: Letterboxing, exempt pdf.js. - - - - - 1 changed file: - toolkit/components/resistfingerprinting/RFPHelper.sys.mjs Changes: ===================================== toolkit/components/resistfingerprinting/RFPHelper.sys.mjs ===================================== @@ -475,6 +475,8 @@ class _RFPHelper { return ( // ... privileged pages contentPrincipal.isSystemPrincipal || + // pdf.js + contentPrincipal.origin.startsWith("resource://pdf.js") || // ... about: URIs EXCEPT about:blank (currentURI.schemeIs("about") && currentURI.filePath !== "blank") || // ... source code View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/d53… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/d53… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][base-browser-115.11.0esr-13.5-1] Bug 42574: Letterboxing, exempt pdf.js.
by ma1 (@ma1) 09 May '24

09 May '24
ma1 pushed to branch base-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 98625d72 by hackademix at 2024-05-09T10:50:26+02:00 Bug 42574: Letterboxing, exempt pdf.js. - - - - - 1 changed file: - toolkit/components/resistfingerprinting/RFPHelper.sys.mjs Changes: ===================================== toolkit/components/resistfingerprinting/RFPHelper.sys.mjs ===================================== @@ -475,6 +475,8 @@ class _RFPHelper { return ( // ... privileged pages contentPrincipal.isSystemPrincipal || + // pdf.js + contentPrincipal.origin.startsWith("resource://pdf.js") || // ... about: URIs EXCEPT about:blank (currentURI.schemeIs("about") && currentURI.filePath !== "blank") || // ... source code View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/98625d7… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/98625d7… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.5-1] Bug 42574: Letterboxing, exempt pdf.js.
by ma1 (@ma1) 09 May '24

09 May '24
ma1 pushed to branch tor-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 410bb24f by hackademix at 2024-05-08T22:26:45+02:00 Bug 42574: Letterboxing, exempt pdf.js. - - - - - 1 changed file: - toolkit/components/resistfingerprinting/RFPHelper.sys.mjs Changes: ===================================== toolkit/components/resistfingerprinting/RFPHelper.sys.mjs ===================================== @@ -475,6 +475,8 @@ class _RFPHelper { return ( // ... privileged pages contentPrincipal.isSystemPrincipal || + // pdf.js + contentPrincipal.origin.startsWith("resource://pdf.js") || // ... about: URIs EXCEPT about:blank (currentURI.schemeIs("about") && currentURI.filePath !== "blank") || // ... source code View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/410bb24… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/410bb24… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Implement Android-native Connection Assist UI
by Dan Ballard (@dan) 09 May '24

09 May '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: fe6b5622 by clairehurst at 2024-05-08T15:01:58-06:00 fixup! Implement Android-native Connection Assist UI - - - - - 2 changed files: - fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistFragment.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistViewModel.kt Changes: ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistFragment.kt ===================================== @@ -27,7 +27,6 @@ import kotlinx.coroutines.launch import mozilla.components.support.base.feature.UserInteractionHandler import org.mozilla.fenix.R import org.mozilla.fenix.databinding.FragmentTorConnectionAssistBinding -import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.hideToolbar class TorConnectionAssistFragment : Fragment(), UserInteractionHandler { @@ -75,6 +74,20 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler { } } + viewModel.quickstartToggle().observe( + viewLifecycleOwner, + ) { + binding.quickstartSwitch.isChecked = it == true + } + + viewModel.shouldOpenHome().observe( + viewLifecycleOwner, + ) { + if (it) { + openHome() + } + } + } override fun onDestroyView() { @@ -136,7 +149,7 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler { titleDescription.text = getString(screen.titleDescriptionTextStringResource) } quickstartSwitch.visibility = if (screen.quickstartSwitchVisible) View.VISIBLE else View.GONE - quickstartSwitch.isChecked = requireContext().components.torController.quickstart + quickstartSwitch.isChecked = viewModel.quickstartToggle().value == true quickstartSwitch.setOnCheckedChangeListener { _, isChecked -> viewModel.handleQuickstartChecked(isChecked) } @@ -198,7 +211,7 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler { } private fun openHome() { - Log.d(TAG, "openHome()") //This doesn't seem to be ever called + Log.d(TAG, "openHome()") findNavController().navigate(TorConnectionAssistFragmentDirections.actionStartupHome()) } ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistViewModel.kt ===================================== @@ -26,6 +26,18 @@ class TorConnectionAssistViewModel( private val _torConnectScreen = MutableStateFlow(ConnectAssistUiState.Splash) internal val torConnectScreen: StateFlow<ConnectAssistUiState> = _torConnectScreen + private val _quickStartToggle = MutableLiveData<Boolean>() // don't initialize with quickstart off the bat + fun quickstartToggle(): LiveData<Boolean?> { + _quickStartToggle.value = _torController.quickstart // quickstart isn't ready until torSettings is ready + return _quickStartToggle + } + + + private val _shouldOpenHome = MutableLiveData(false) + fun shouldOpenHome(): LiveData<Boolean> { + return _shouldOpenHome + } + private val _progress = MutableLiveData(0) fun progress(): LiveData<Int> { return _progress @@ -49,6 +61,7 @@ class TorConnectionAssistViewModel( fun handleQuickstartChecked(checked: Boolean) { _torController.quickstart = checked + _quickStartToggle.value = checked } fun handleButton1Pressed( @@ -87,8 +100,9 @@ class TorConnectionAssistViewModel( TorConnectState.Configuring -> handleConfiguring() TorConnectState.AutoBootstrapping -> handleBootstrap() TorConnectState.Bootstrapping -> handleBootstrap() + TorConnectState.Bootstrapped -> _shouldOpenHome.value = true + TorConnectState.Disabled -> _shouldOpenHome.value = true TorConnectState.Error -> handleError() - else -> {} } } View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/fe6… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/fe6… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Implement Android-native Connection Assist UI
by Dan Ballard (@dan) 08 May '24

08 May '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: 3e6fa4e6 by clairehurst at 2024-05-07T17:54:07-06:00 fixup! Implement Android-native Connection Assist UI - - - - - 7 changed files: - fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt - + fenix/app/src/main/java/org/mozilla/fenix/tor/QuickStartPreference.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistFragment.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistViewModel.kt - + fenix/app/src/main/res/layout/preference_quick_start.xml - fenix/app/src/main/res/values/preference_keys.xml - fenix/app/src/main/res/xml/preferences.xml Changes: ===================================== fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt ===================================== @@ -61,6 +61,7 @@ import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.nimbus.FxNimbus import org.mozilla.fenix.perf.ProfilerViewModel import org.mozilla.fenix.settings.account.AccountUiView +import org.mozilla.fenix.tor.QuickStartPreference import org.mozilla.fenix.tor.TorBridgeTransportConfig import org.mozilla.fenix.tor.TorEvents import org.mozilla.fenix.utils.Settings @@ -729,6 +730,14 @@ class SettingsFragment : PreferenceFragmentCompat() { } } + requirePreference<QuickStartPreference>(R.string.pref_key_quick_start).apply { + setOnPreferenceClickListener { + context.components.torController.quickstart = !context.components.torController.quickstart + updateSwitch() + true + } + } + requirePreference<Preference>(R.string.pref_key_use_new_bootstrap).apply { setOnPreferenceClickListener { val directions = ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/QuickStartPreference.kt ===================================== @@ -0,0 +1,32 @@ +package org.mozilla.fenix.tor + +import android.content.Context +import android.util.AttributeSet +import androidx.preference.PreferenceViewHolder +import androidx.preference.SwitchPreference +import com.google.android.material.switchmaterial.SwitchMaterial +import org.mozilla.fenix.R +import org.mozilla.fenix.ext.components + +class QuickStartPreference @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, +) : SwitchPreference(context, attrs) { + + private var switchView: SwitchMaterial? = null + + init { + widgetLayoutResource = R.layout.preference_quick_start + } + + override fun onBindViewHolder(holder: PreferenceViewHolder) { + super.onBindViewHolder(holder) + switchView = holder.findViewById(R.id.switch_widget) as SwitchMaterial + + updateSwitch() + } + + fun updateSwitch() { + switchView?.isChecked = context.components.torController.quickstart + } +} ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistFragment.kt ===================================== @@ -27,6 +27,7 @@ import kotlinx.coroutines.launch import mozilla.components.support.base.feature.UserInteractionHandler import org.mozilla.fenix.R import org.mozilla.fenix.databinding.FragmentTorConnectionAssistBinding +import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.hideToolbar class TorConnectionAssistFragment : Fragment(), UserInteractionHandler { @@ -74,11 +75,6 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler { } } - viewModel.quickstartToggle().observe( - viewLifecycleOwner, - ) { - binding.quickstartSwitch.isChecked = it == true - } } override fun onDestroyView() { @@ -140,7 +136,7 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler { titleDescription.text = getString(screen.titleDescriptionTextStringResource) } quickstartSwitch.visibility = if (screen.quickstartSwitchVisible) View.VISIBLE else View.GONE - quickstartSwitch.isChecked = viewModel.quickstartToggle().value == true + quickstartSwitch.isChecked = requireContext().components.torController.quickstart quickstartSwitch.setOnCheckedChangeListener { _, isChecked -> viewModel.handleQuickstartChecked(isChecked) } ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistViewModel.kt ===================================== @@ -31,12 +31,6 @@ class TorConnectionAssistViewModel( return _progress } - private val _quickStartToggle = MutableLiveData<Boolean>() // don't initialize with quickstart off the bat - fun quickstartToggle(): LiveData<Boolean?> { - _quickStartToggle.value = _torController.quickstart // quickstart isn't ready until torSettings is ready - return _quickStartToggle - } - init { Log.d(TAG, "initiating TorConnectionAssistViewModel") _torController.registerTorListener(this) @@ -55,7 +49,6 @@ class TorConnectionAssistViewModel( fun handleQuickstartChecked(checked: Boolean) { _torController.quickstart = checked - _quickStartToggle.value = checked } fun handleButton1Pressed( ===================================== fenix/app/src/main/res/layout/preference_quick_start.xml ===================================== @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> + +<com.google.android.material.switchmaterial.SwitchMaterial xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/switch_widget" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:clickable="false" + android:focusable="false" + android:gravity="center_vertical" + android:orientation="vertical" /> ===================================== fenix/app/src/main/res/values/preference_keys.xml ===================================== @@ -16,6 +16,7 @@ <string name="pref_key_accessibility_font_scale" translatable="false">pref_key_accessibility_font_scale</string> <string name="pref_key_privacy" translatable="false">pref_key_privacy</string> <string name="pref_key_connection" translatable="false">pref_key_connection</string> + <string name="pref_key_quick_start" translatable="false">pref_key_quick_start</string> <string name="pref_key_accessibility_force_enable_zoom" translatable="false">pref_key_accessibility_force_enable_zoom</string> <string name="pref_key_advanced" translatable="false">pref_key_advanced</string> <string name="pref_key_language" translatable="false">pref_key_language</string> ===================================== fenix/app/src/main/res/xml/preferences.xml ===================================== @@ -170,6 +170,12 @@ android:title="@string/preferences_tor_network_settings_bridge_config" android:summary="@string/preferences_tor_network_settings_bridge_config_description" /> + <org.mozilla.fenix.tor.QuickStartPreference + android:key="@string/pref_key_quick_start" + android:summary="@string/connection_assist_always_connect_automatically_toggle_description" + android:title="@string/tor_bootstrap_quick_start_label" + app:iconSpaceReserved="false" /> + <Preference android:key="@string/pref_key_use_new_bootstrap" app:iconSpaceReserved="false" View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/3e6… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/3e6… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.5-1] fixup! Bug 41369: Improve Firefox language settings for multi-lingual packages
by Pier Angelo Vendrame (@pierov) 08 May '24

08 May '24
Pier Angelo Vendrame pushed to branch tor-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 75ac830c by Henry Wilkes at 2024-05-08T16:05:56+01:00 fixup! Bug 41369: Improve Firefox language settings for multi-lingual packages Bug 42573: Avoid async l10n.formatValue. - - - - - 1 changed file: - browser/base/content/languageNotification.js Changes: ===================================== browser/base/content/languageNotification.js ===================================== @@ -2,7 +2,7 @@ // Show a prompt to suggest to the user that they can change the UI language. // Show it only the first time, and then do not show it anymore -window.addEventListener("load", async () => { +window.addEventListener("load", () => { const PREF_NAME = "intl.language_notification.shown"; if (Services.prefs.getBoolPref(PREF_NAME, false)) { @@ -35,12 +35,12 @@ window.addEventListener("load", async () => { Services.locale.requestedLocales, Services.locale.availableLocales ).length; - const label = await document.l10n.formatValue( - matchingSystem + const label = { + "l10n-id": matchingSystem ? "language-notification-label-system" : "language-notification-label", - { language } - ); + "l10n-args": { language }, + }; const buttons = [ { View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/75ac830… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/75ac830… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.5-1] fixup! Bug 30237: Add v3 onion services client authentication prompt
by ma1 (@ma1) 08 May '24

08 May '24
ma1 pushed to branch tor-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 02b5bf73 by hackademix at 2024-05-08T12:48:22+02:00 fixup! Bug 30237: Add v3 onion services client authentication prompt Bug 42557: Fix regression in Onion Services authentication prompt focus - - - - - 1 changed file: - browser/components/onionservices/content/authPrompt.js Changes: ===================================== browser/components/onionservices/content/authPrompt.js ===================================== @@ -356,6 +356,13 @@ var OnionAuthPrompt = { this._showWarning(undefined); }); + // Force back focus on click: tor-browser#41856 + document + .getElementById("tor-clientauth-notification") + .addEventListener("click", () => { + window.focus(); + }); + Services.obs.addObserver(this, this._topics.clientAuthMissing); Services.obs.addObserver(this, this._topics.clientAuthIncorrect); }, View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/02b5bf7… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/02b5bf7… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser] Pushed new tag mullvad-browser-115.11.0esr-13.0-1-build1
by Pier Angelo Vendrame (@pierov) 08 May '24

08 May '24
Pier Angelo Vendrame pushed new tag mullvad-browser-115.11.0esr-13.0-1-build1 at The Tor Project / Applications / Mullvad Browser -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/tree/mullv… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser] Pushed new tag base-browser-115.11.0esr-13.0-1-build1
by Pier Angelo Vendrame (@pierov) 08 May '24

08 May '24
Pier Angelo Vendrame pushed new tag base-browser-115.11.0esr-13.0-1-build1 at The Tor Project / Applications / Tor Browser -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/base-brow… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser] Pushed new tag tor-browser-115.11.0esr-13.5-1-build1
by Pier Angelo Vendrame (@pierov) 08 May '24

08 May '24
Pier Angelo Vendrame pushed new tag tor-browser-115.11.0esr-13.5-1-build1 at The Tor Project / Applications / Tor Browser -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/tor-brows… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Add Tor integration and UI
by Dan Ballard (@dan) 07 May '24

07 May '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: 737cb590 by clairehurst at 2024-05-06T15:30:26-06:00 fixup! Add Tor integration and UI - - - - - 2 changed files: - fenix/app/src/main/java/org/mozilla/fenix/tor/TorLogsComposeFragment.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorLogsViewModel.kt Changes: ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorLogsComposeFragment.kt ===================================== @@ -8,7 +8,9 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -16,15 +18,20 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.selection.DisableSelection import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.foundation.verticalScroll +import androidx.compose.material.FloatingActionButton +import androidx.compose.material.Icon +import androidx.compose.material.Scaffold import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import mozilla.components.ui.colors.PhotonColors +import org.mozilla.fenix.R class TorLogsComposeFragment : Fragment() { private val viewModel: TorLogsViewModel by viewModels() @@ -36,47 +43,72 @@ class TorLogsComposeFragment : Fragment() { ): View { return ComposeView(requireContext()).apply { setContent { - SelectionContainer { - Column( - // Column instead of LazyColumn so that you can select all the logs, and not just one "screen" at a time - // The logs won't be too big so loading them all instead of just whats visible shouldn't be a big deal - modifier = Modifier - .fillMaxSize() - .verticalScroll(state = rememberScrollState(), reverseScrolling = true), - ) { - for (log in viewModel.torLogs) { - LogRow(log = log) - } - } + Scaffold( + floatingActionButton = { CopyLogsButton() }, + content = { TorLogs(paddingValues = it) }, + ) + } + } + } + + @Composable + private fun TorLogs(paddingValues: PaddingValues) { + SelectionContainer { + Column( + // Column instead of LazyColumn so that you can select all the logs, and not just one "screen" at a time + // The logs won't be too big so loading them all instead of just whats visible shouldn't be a big deal + modifier = Modifier + .fillMaxSize() + .verticalScroll(state = rememberScrollState(), reverseScrolling = true) + .padding(paddingValues) + .background(PhotonColors.Ink50), // Standard background color + ) { + for (log in viewModel.torLogs) { + LogRow(log = log) } } } } -} -@Composable -@Stable -fun LogRow(log: TorLog, modifier: Modifier = Modifier) { - Column( - modifier - .fillMaxWidth() - .padding( - start = 16.dp, - end = 16.dp, - bottom = 16.dp, - ), - ) { - DisableSelection { + @Composable + @Stable + private fun LogRow(log: TorLog, modifier: Modifier = Modifier) { + Column( + modifier + .fillMaxWidth() + .padding( + start = 16.dp, + end = 16.dp, + bottom = 16.dp, + ), + ) { + DisableSelection { + Text( + text = log.timestamp.toString(), + color = PhotonColors.LightGrey40, + modifier = modifier + .padding(bottom = 4.dp), + ) + } Text( - text = log.timestamp.toString(), - color = PhotonColors.LightGrey40, - modifier = modifier - .padding(bottom = 4.dp), + text = log.text, + color = PhotonColors.LightGrey05, ) } - Text( - text = log.text, - color = PhotonColors.LightGrey05, + } + + @Composable + private fun CopyLogsButton() { + FloatingActionButton( + onClick = { viewModel.copyAllLogsToClipboard() }, + content = { + Icon( + painter = painterResource(id = R.drawable.ic_copy), + contentDescription = getString(R.string.share_copy_link_to_clipboard), + ) + }, + backgroundColor = PhotonColors.Violet50, // Same color as connect button + contentColor = PhotonColors.LightGrey05, ) } } ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorLogsViewModel.kt ===================================== @@ -63,10 +63,10 @@ class TorLogsViewModel(application: Application) : AndroidViewModel(application) } } - fun copyAllLogsToClipboard() { // TODO add kebab menu in top right corner which includes option to "Copy all logs" + fun copyAllLogsToClipboard() { clipboardManager.setPrimaryClip( ClipData.newPlainText( - "Copied Text", + getApplication<Application>().getString(R.string.preferences_tor_logs), getAllTorLogs(), ), ) View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/737… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/737… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][base-browser-115.11.0esr-13.5-1] Bug 41930: Remove the UI to customize accept_languages.
by Pier Angelo Vendrame (@pierov) 07 May '24

07 May '24
Pier Angelo Vendrame pushed to branch base-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 220844d2 by Pier Angelo Vendrame at 2024-05-07T18:38:25+02:00 Bug 41930: Remove the UI to customize accept_languages. - - - - - 3 changed files: - browser/components/preferences/main.inc.xhtml - browser/components/preferences/main.js - toolkit/components/resistfingerprinting/RFPHelper.sys.mjs Changes: ===================================== browser/components/preferences/main.inc.xhtml ===================================== @@ -337,6 +337,7 @@ </hbox> <hbox id="languagesBox" align="center"> + <!-- <description flex="1" control="chooseLanguage" data-l10n-id="choose-language-description"/> <button id="chooseLanguage" is="highlightable-button" @@ -351,6 +352,9 @@ languages-customize-select-language.placeholder, languages-customize-add.label, " /> + --> + <checkbox id="spoofEnglish" + data-l10n-id="languages-customize-spoof-english"/> </hbox> <checkbox id="useSystemLocale" hidden="true" ===================================== browser/components/preferences/main.js ===================================== @@ -438,7 +438,23 @@ var gMainPane = { "command", makeDisableControllingExtension(PREF_SETTING_TYPE, CONTAINERS_KEY) ); - setEventListener("chooseLanguage", "command", gMainPane.showLanguages); + // setEventListener("chooseLanguage", "command", gMainPane.showLanguages); + { + const spoofEnglish = document.getElementById("spoofEnglish"); + const kPrefSpoofEnglish = "privacy.spoof_english"; + const preference = Preferences.add({ + id: kPrefSpoofEnglish, + type: "int", + }); + const spoofEnglishChanged = () => { + spoofEnglish.checked = preference.value == 2; + }; + spoofEnglishChanged(); + preference.on("change", spoofEnglishChanged); + setEventListener("spoofEnglish", "command", () => { + preference.value = spoofEnglish.checked ? 2 : 1; + }); + } setEventListener( "translationAttributionImage", "click", ===================================== toolkit/components/resistfingerprinting/RFPHelper.sys.mjs ===================================== @@ -291,9 +291,13 @@ class _RFPHelper { ) { Services.prefs.clearUserPref("javascript.use_us_english_locale"); } - // We don't reset intl.accept_languages. Instead, setting - // privacy.spoof_english to 1 allows user to change preferred language - // settings through Preferences UI. + if (this.rfpEnabled) { + // When RFP is enabled, we force intl.accept_languages to be the + // default, or en-US, en when spoof English is enabled. + // See tor-browser#41930. + Services.prefs.clearUserPref("intl.accept_languages"); + Services.prefs.addObserver("intl.accept_languages", this); + } break; case 2: // spoof Services.prefs.setCharPref("intl.accept_languages", "en-US, en"); View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/220844d… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/220844d… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-115.11.0esr-13.5-1] Bug 41930: Remove the UI to customize accept_languages.
by Pier Angelo Vendrame (@pierov) 07 May '24

07 May '24
Pier Angelo Vendrame pushed to branch mullvad-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser Commits: f5bb3351 by Pier Angelo Vendrame at 2024-05-07T18:37:07+02:00 Bug 41930: Remove the UI to customize accept_languages. - - - - - 3 changed files: - browser/components/preferences/main.inc.xhtml - browser/components/preferences/main.js - toolkit/components/resistfingerprinting/RFPHelper.sys.mjs Changes: ===================================== browser/components/preferences/main.inc.xhtml ===================================== @@ -337,6 +337,7 @@ </hbox> <hbox id="languagesBox" align="center"> + <!-- <description flex="1" control="chooseLanguage" data-l10n-id="choose-language-description"/> <button id="chooseLanguage" is="highlightable-button" @@ -351,6 +352,9 @@ languages-customize-select-language.placeholder, languages-customize-add.label, " /> + --> + <checkbox id="spoofEnglish" + data-l10n-id="languages-customize-spoof-english"/> </hbox> <checkbox id="useSystemLocale" hidden="true" ===================================== browser/components/preferences/main.js ===================================== @@ -438,7 +438,23 @@ var gMainPane = { "command", makeDisableControllingExtension(PREF_SETTING_TYPE, CONTAINERS_KEY) ); - setEventListener("chooseLanguage", "command", gMainPane.showLanguages); + // setEventListener("chooseLanguage", "command", gMainPane.showLanguages); + { + const spoofEnglish = document.getElementById("spoofEnglish"); + const kPrefSpoofEnglish = "privacy.spoof_english"; + const preference = Preferences.add({ + id: kPrefSpoofEnglish, + type: "int", + }); + const spoofEnglishChanged = () => { + spoofEnglish.checked = preference.value == 2; + }; + spoofEnglishChanged(); + preference.on("change", spoofEnglishChanged); + setEventListener("spoofEnglish", "command", () => { + preference.value = spoofEnglish.checked ? 2 : 1; + }); + } setEventListener( "translationAttributionImage", "click", ===================================== toolkit/components/resistfingerprinting/RFPHelper.sys.mjs ===================================== @@ -291,9 +291,13 @@ class _RFPHelper { ) { Services.prefs.clearUserPref("javascript.use_us_english_locale"); } - // We don't reset intl.accept_languages. Instead, setting - // privacy.spoof_english to 1 allows user to change preferred language - // settings through Preferences UI. + if (this.rfpEnabled) { + // When RFP is enabled, we force intl.accept_languages to be the + // default, or en-US, en when spoof English is enabled. + // See tor-browser#41930. + Services.prefs.clearUserPref("intl.accept_languages"); + Services.prefs.addObserver("intl.accept_languages", this); + } break; case 2: // spoof Services.prefs.setCharPref("intl.accept_languages", "en-US, en"); View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/f5b… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/f5b… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-115.11.0esr-13.5-1] Bug 41930: Remove the UI to customize accept_languages.
by Pier Angelo Vendrame (@pierov) 07 May '24

07 May '24
Pier Angelo Vendrame pushed to branch tor-browser-115.11.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: e90710d0 by Pier Angelo Vendrame at 2024-05-07T17:51:02+02:00 Bug 41930: Remove the UI to customize accept_languages. - - - - - 3 changed files: - browser/components/preferences/main.inc.xhtml - browser/components/preferences/main.js - toolkit/components/resistfingerprinting/RFPHelper.sys.mjs Changes: ===================================== browser/components/preferences/main.inc.xhtml ===================================== @@ -337,6 +337,7 @@ </hbox> <hbox id="languagesBox" align="center"> + <!-- <description flex="1" control="chooseLanguage" data-l10n-id="choose-language-description"/> <button id="chooseLanguage" is="highlightable-button" @@ -351,6 +352,9 @@ languages-customize-select-language.placeholder, languages-customize-add.label, " /> + --> + <checkbox id="spoofEnglish" + data-l10n-id="languages-customize-spoof-english"/> </hbox> <checkbox id="useSystemLocale" hidden="true" ===================================== browser/components/preferences/main.js ===================================== @@ -436,7 +436,23 @@ var gMainPane = { "command", makeDisableControllingExtension(PREF_SETTING_TYPE, CONTAINERS_KEY) ); - setEventListener("chooseLanguage", "command", gMainPane.showLanguages); + // setEventListener("chooseLanguage", "command", gMainPane.showLanguages); + { + const spoofEnglish = document.getElementById("spoofEnglish"); + const kPrefSpoofEnglish = "privacy.spoof_english"; + const preference = Preferences.add({ + id: kPrefSpoofEnglish, + type: "int", + }); + const spoofEnglishChanged = () => { + spoofEnglish.checked = preference.value == 2; + }; + spoofEnglishChanged(); + preference.on("change", spoofEnglishChanged); + setEventListener("spoofEnglish", "command", () => { + preference.value = spoofEnglish.checked ? 2 : 1; + }); + } setEventListener( "translationAttributionImage", "click", ===================================== toolkit/components/resistfingerprinting/RFPHelper.sys.mjs ===================================== @@ -291,9 +291,13 @@ class _RFPHelper { ) { Services.prefs.clearUserPref("javascript.use_us_english_locale"); } - // We don't reset intl.accept_languages. Instead, setting - // privacy.spoof_english to 1 allows user to change preferred language - // settings through Preferences UI. + if (this.rfpEnabled) { + // When RFP is enabled, we force intl.accept_languages to be the + // default, or en-US, en when spoof English is enabled. + // See tor-browser#41930. + Services.prefs.clearUserPref("intl.accept_languages"); + Services.prefs.addObserver("intl.accept_languages", this); + } break; case 2: // spoof Services.prefs.setCharPref("intl.accept_languages", "en-US, en"); View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/e90710d… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/e90710d… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-android-service][main] Bug 41111: Use Lyrebird to provide WebTunnel PT Client
by richard (@richard) 07 May '24

07 May '24
richard pushed to branch main at The Tor Project / Applications / tor-android-service Commits: de1e85a0 by Richard Pospesel at 2024-04-22T19:11:38+00:00 Bug 41111: Use Lyrebird to provide WebTunnel PT Client Revert &quot;Bug 40800: Add WebTunnel support&quot; This reverts commit 0438a9a4ce1548be08dd2df891a38987bb313d22. - - - - - 1 changed file: - service/src/main/java/org/torproject/android/service/TorService.java Changes: ===================================== service/src/main/java/org/torproject/android/service/TorService.java ===================================== @@ -379,10 +379,8 @@ public final class TorService extends Service implements TorServiceConstants, Or if(!pluggableTransportSnow.canExecute()) pluggableTransportSnow.setExecutable(true); File pluggableTransportConjure = new File(nativeDir, "libConjure.so"); if(!pluggableTransportConjure.canExecute()) pluggableTransportConjure.setExecutable(true); - File pluggableTransportWebtunnel = new File(nativeDir, "libWebtunnel.so"); - if(!pluggableTransportWebtunnel.canExecute()) pluggableTransportWebtunnel.setExecutable(true); - builder.configurePluggableTransportsFromSettings(pluggableTransportObfs, pluggableTransportSnow, pluggableTransportConjure, pluggableTransportWebtunnel); + builder.configurePluggableTransportsFromSettings(pluggableTransportObfs, pluggableTransportSnow, pluggableTransportConjure); mDataService.updateConfigBuilder(builder); onionProxyManager.getTorInstaller().updateTorConfigCustom (builder.asString()); View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-android-service/-/commit… -- This project does not include diff previews in email notifications. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-android-service/-/commit… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • ...
  • 187
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.