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
  • 18610 discussions
[Git][tpo/applications/tor-browser-build] Pushed new tag mb-13.5a6-build1
by richard (@richard) 27 Mar '24

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

27 Mar '24
richard pushed new tag tbb-13.5a6-build1 at The Tor Project / Applications / tor-browser-build -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/tree/tbb… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] Bug 41094, 41095: Tor, Mullvad Browser 13.5a6 Release Prep
by richard (@richard) 27 Mar '24

27 Mar '24
richard pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: debb3452 by Richard Pospesel at 2024-03-27T17:41:10+00:00 Bug 41094,41095: Tor,Mullvad Browser 13.5a6 Release Prep - - - - - 12 changed files: - projects/browser/Bundle-Data/Docs-MB/ChangeLog.txt - projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt - projects/browser/allowed_addons.json - projects/browser/config - projects/firefox-android/config - projects/firefox/config - projects/geckoview/config - projects/go/config - projects/manual/config - projects/translation/config - rbm.conf - tools/fetch-manual.py Changes: ===================================== projects/browser/Bundle-Data/Docs-MB/ChangeLog.txt ===================================== @@ -1,3 +1,58 @@ +Mullvad Browser 13.5a6 - March 28 2024 + * All Platforms + * Updated Firefox to 115.9.0esr + * Updated mullvad-browser-extension to 0.9.0 + * Bug 234: Make User-Agent request header match RFP's navigator.userAgent [mullvad-browser] + * Bug 271: After update, don't open the release page on Github. Instead link it in the startpage, like in Tor Browser [mullvad-browser] + * Bug 274: Rebase Mullvad Browser alpha onto Firefox 115.9.0esr [mullvad-browser] + * Bug 41676: Set privacy.resistFingerprinting.testing.setTZtoUTC as a defense-in-depth [tor-browser] + * Bug 41916: Letterboxing preferences UI [tor-browser] + * Bug 41918: Add option to reuse last window size when letterboxing is enabled [tor-browser] + * Bug 42211: Fluent migration: new identity [tor-browser] + * Bug 42214: Fluent migration: security level [tor-browser] + * Bug 42236: Let users decide whether to load their home page on new identity. [tor-browser] + * Bug 42428: Timezone offset leak via document.lastModified [tor-browser] + * Bug 42443: Shrink the window to match letterboxing size when the emtpy area is doble-clicked [tor-browser] + * Bug 42472: Timezone May leak from XSLT Date function [tor-browser] + * Bug 42473: ESR 115.9.1 fixes [tor-browser] + * Windows + * Bug 80: Make 'Mullvad your default browser' does not work on Windows [mullvad-browser] + * Bug 42377: Hidden fonts are automatically added to the allow list [tor-browser] + * Bug 41089: Add filetype association to the installer of Mullvad Browser [tor-browser-build] + * Linux + * Bug 42438: Adapt the data import wizard to use the original $HOME on Linux [tor-browser] + * Bug 41110: Avoid Fontconfig warning about "ambiguous path" [tor-browser-build] + * Build System + * All Platforms + * Bug 41088: Remove use of projects/browser/run_scripts [tor-browser-build] + * Bug 41102: src archive does not match likely due to mismatched xz-utils version [tor-browser-build] + * Bug 40073: We should remove ./ when using 7-zip for zip files [rbm] + * Windows + * Bug 41097: authenticode-timestamping.sh fails to run again because tmp-timestamp already exists [tor-browser-build] + +Mullvad Browser 13.0.13 - March 22 2024 + * Windows + macOS + Linux + * Updated Firefox to 115.9.1esr + * Bug 42473: ESR 115.9.1 fixes [tor-browser] + * Bug 277: Rebase Mullvad Browser stable onto Firefox 115.9.1esr [mullvad-browser] + +Mullvad Browser 13.0.12 - March 19 2024 + * All Platforms + * Updated Firefox to 115.9.0esr + * Updated mullvad-browser-extension to 0.9.0 + * Updated uBlock Origin to 1.56.0 + * Bug 270: Mullvad support email has changed from `support(a)mullvad.net` to `support(a)mullvadvpn.net` [mullvad-browser] + * Bug 273: Rebase Mullvad Browser stable onto Firefox 115.9.0esr [mullvad-browser] + * Bug 42376: The placeholder of datetime inputs keeps being localized when spoof English is on [tor-browser] + * Bug 42378: spoof english + htmlform <details> can leak app language [tor-browser] + * Windows + * Bug 42377: Hidden fonts are automatically added to the allow list [tor-browser] + * Build System + * All Platforms + * Bug 41085: kick_devmole_build script prints wrong URL for Mullvad's build hashes [tor-browser-build] + * Bug 41097: authenticode-timestamping.sh fails to run again because tmp-timestamp already exists [tor-browser-build] + * Bug 41102: src archive does not match likely due to mismatched xz-utils version [tor-browser-build] + Mullvad Browser 13.5a5 - February 27 2024 * All Platforms * Updated Firefox to 115.8.0esr ===================================== projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt ===================================== @@ -1,3 +1,90 @@ +Tor Browser 13.5a6 - March 28 2024 + * All Platforms + * Bug 41114: Fix no-async-promise-executor on TorConnect [tor-browser] + * Bug 41676: Set privacy.resistFingerprinting.testing.setTZtoUTC as a defense-in-depth [tor-browser] + * Bug 42336: Review the relationship between TorSettings and the TorProvider [tor-browser] + * Bug 42428: Timezone offset leak via document.lastModified [tor-browser] + * Bug 42435: Update moat domain fronting configuration [tor-browser] + * Bug 42437: Drop "torbrowser.version" preference [tor-browser] + * Bug 42444: Remove the "Prioritize .onion sites when known" option [tor-browser] + * Bug 42449: Rebase Tor Browser alpha onto Firefox 115.9.0esr [tor-browser] + * Bug 42459: Add startpage onion service to list of search providers [tor-browser] + * Bug 42466: Drop the "Onion Logo" from trademark statement [tor-browser] + * Bug 42472: Timezone May leak from XSLT Date function [tor-browser] + * Bug 42473: ESR 115.9.1 fixes [tor-browser] + * Bug 42481: Modularize SecurityLevel [tor-browser] + * Bug 41105: Bump version of snowflake to v2.9.2 [tor-browser-build] + * Windows + macOS + Linux + * Updated Firefox to 115.9.0esr + * Bug 41916: Letterboxing preferences UI [tor-browser] + * Bug 41918: Add option to reuse last window size when letterboxing is enabled [tor-browser] + * Bug 42203: Fluent migration: about dialog [tor-browser] + * Bug 42209: Fluent migration: tor circuit [tor-browser] + * Bug 42211: Fluent migration: new identity [tor-browser] + * Bug 42214: Fluent migration: security level [tor-browser] + * Bug 42236: Let users decide whether to load their home page on new identity. [tor-browser] + * Bug 42443: Shrink the window to match letterboxing size when the emtpy area is doble-clicked [tor-browser] + * Bug 42446: Improve accessible descriptions in built-in dialog [tor-browser] + * Bug 42458: Update the "Submit Feedback" link in "About Tor Browser" [tor-browser] + * Windows + * Bug 42377: Hidden fonts are automatically added to the allow list [tor-browser] + * Linux + * Bug 42438: Adapt the data import wizard to use the original $HOME on Linux [tor-browser] + * Bug 41110: Avoid Fontconfig warning about "ambiguous path" [tor-browser-build] + * Android + * Updated GeckoView to 115.9.0esr + * Bug 41187: Improve Android's bridge settings UI [tor-browser] + * Bug 42427: Do not ship bridges as prefences anymore [tor-browser] + * Build System + * All Platforms + * Updated Go to 1.21.8 + * Bug 41102: src archive does not match likely due to mismatched xz-utils version [tor-browser-build] + * Bug 41107: Update download-unsigned-sha256sums-gpg-signatures-from-people-tpo for new type of URL [tor-browser-build] + * Bug 40073: We should remove ./ when using 7-zip for zip files [rbm] + * Windows + macOS + Linux + * Bug 42305: (Semi-)Automatically merge translation resources across tor browser releases (desktop) [tor-browser] + * Bug 41088: Remove use of projects/browser/run_scripts [tor-browser-build] + * Windows + * Bug 41097: authenticode-timestamping.sh fails to run again because tmp-timestamp already exists [tor-browser-build] + * Android + * Bug 40502: Do not recommend addons on Tor Browser [tor-browser] + * Bug 41082: Package tor expert bundle on android as .aar that firefox-android can use in lieu of tor-android-service with geckoview bootstrap [tor-browser-build] + +Tor Browser 13.0.13 - March 22 2024 + * Windows + macOS + Linux + * Updated Firefox to 115.9.1esr + * Bug 42473: ESR 115.9.1 fixes [tor-browser] + * Bug 42474: Rebase stable browsers on 115.9.1 [tor-browser] + +Tor Browser 13.0.12 - March 19 2024 + * All Platforms + * Updated Snowflake to 2.9.2 + * Bug 42376: The placeholder of datetime inputs keeps being localized when spoof English is on [tor-browser] + * Bug 42378: spoof english + htmlform <details> can leak app language [tor-browser] + * Bug 42444: Remove the "Prioritize .onion sites when known" option [tor-browser] + * Bug 42448: Rebase Tor Browser stable onto Firefox 115.9.0esr [tor-browser] + * Bug 42459: Add startpage onion service to list of search providers [tor-browser] + * Bug 41105: Bump version of snowflake to v2.9.2 [tor-browser-build] + * Windows + macOS + Linux + * Updated Firefox to 115.9.0esr + * Windows + * Bug 42377: Hidden fonts are automatically added to the allow list [tor-browser] + * Android + * Updated GeckoView to 115.9.0esr + * Bug 42407: TTP-03-010 WP3: Potential phishing [tor-browser] + * Build System + * All Platforms + * Updated Go to 1.21.8 + * Bug 41102: src archive does not match likely due to mismatched xz-utils version [tor-browser-build] + +Tor Browser 13.0.11 - March 06 2024 + * All Platforms + * Bug 42435: Update moat domain fronting configuration [tor-browser] + * Build System + * All Platforms + * Bug 41085: kick_devmole_build script prints wrong URL for Mullvad's build hashes [tor-browser-build] + * Bug 41097: authenticode-timestamping.sh fails to run again because tmp-timestamp already exists [tor-browser-build] + Tor Browser 13.5a5 - February 28 2024 * All Platforms * Updated OpenSSL to 3.0.13 ===================================== projects/browser/allowed_addons.json ===================================== @@ -11,13 +11,13 @@ "authors": [ { "id": 13299734, - "name": "Alexander Shutau", + "name": "Dark Reader Ltd", "url": "https://addons.mozilla.org/en-US/firefox/user/13299734/", "username": "alexanderby", - "picture_url": "https://addons.mozilla.org/user-media/userpics/34/9734/13299734/13299734.pn…" + "picture_url": "https://addons.mozilla.org/user-media/userpics/34/9734/13299734/13299734.pn…" } ], - "average_daily_users": 1137843, + "average_daily_users": 1157805, "categories": { "firefox": [ "web-development", @@ -28,18 +28,18 @@ "contributions_url": "https://opencollective.com/darkreader?utm_content=product-page-contribute&u…", "created": "2017-09-19T07:03:00Z", "current_version": { - "id": 5688757, + "id": 5705306, "compatibility": { "firefox": { - "min": "54.0", + "min": "78.0", "max": "*" }, "android": { - "min": "54.0", + "min": "113.0", "max": "*" } }, - "edit_url": "https://addons.mozilla.org/en-US/developers/addon/darkreader/versions/56887…", + "edit_url": "https://addons.mozilla.org/en-US/developers/addon/darkreader/versions/57053…", "is_strict_compatibility_enabled": false, "license": { "id": 22, @@ -50,22 +50,22 @@ "url": "http://www.opensource.org/license/mit" }, "release_notes": { - "en-US": "- Fixed errors when Adopted Stylesheets were not present.\n- Fixed breaking on ::view-transition selectors (Airbnb issue).\n- Users' fixes for websites." + "en-US": "- Analyze inline background images for root elements.\n- Support for \"background\" attribute.\n- Fixed performance for asynchronously resolved inline styles.\n- Fixed freezes and incorrect work on several websites.\n- Dev Tools: Formatting of CSS fixes.\n- Users' fixes for websites." }, - "reviewed": "2024-02-08T08:33:10Z", - "version": "4.9.77", + "reviewed": "2024-03-18T08:14:15Z", + "version": "4.9.80", "files": [ { - "id": 4233074, - "created": "2024-02-07T11:23:55Z", - "hash": "sha256:931de67e9091c69edd9fd3f348a7ed1de1dce7d136017fed641bd10eb0ae8891", + "id": 4249607, + "created": "2024-03-13T17:13:44Z", + "hash": "sha256:a93f1250b72cc27fe4a9b02be062c68fb079e45a1233d562852b48e1e9b99307", "is_restart_required": false, "is_webextension": true, "is_mozilla_signed_extension": false, "platform": "all", - "size": 725369, + "size": 731722, "status": "public", - "url": "https://addons.mozilla.org/firefox/downloads/file/4233074/darkreader-4.9.77…", + "url": "https://addons.mozilla.org/firefox/downloads/file/4249607/darkreader-4.9.80…", "permissions": [ "alarms", "contextMenus", @@ -143,7 +143,7 @@ }, "is_disabled": false, "is_experimental": false, - "last_updated": "2024-02-08T08:33:10Z", + "last_updated": "2024-03-18T08:14:15Z", "name": { "ar": "Dark Reader", "bn": "Dark Reader", @@ -218,10 +218,10 @@ "category": "recommended" }, "ratings": { - "average": 4.5407, - "bayesian_average": 4.539579140237365, - "count": 5441, - "text_count": 1716 + "average": 4.5332, + "bayesian_average": 4.532093960246261, + "count": 5531, + "text_count": 1747 }, "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/darkreader/reviews/", "requires_payment": false, @@ -318,7 +318,7 @@ "type": "extension", "url": "https://addons.mozilla.org/en-US/firefox/addon/darkreader/", "versions_url": "https://addons.mozilla.org/en-US/firefox/addon/darkreader/versions/", - "weekly_downloads": 24267 + "weekly_downloads": 23454 }, "notes": null }, @@ -334,7 +334,7 @@ "picture_url": "https://addons.mozilla.org/user-media/userpics/56/7656/6937656/6937656.png?…" } ], - "average_daily_users": 264838, + "average_daily_users": 266335, "categories": { "firefox": [ "privacy-security" @@ -547,10 +547,10 @@ "category": "recommended" }, "ratings": { - "average": 4.8001, - "bayesian_average": 4.795468550922711, - "count": 1406, - "text_count": 252 + "average": 4.7986, + "bayesian_average": 4.793974484524402, + "count": 1415, + "text_count": 255 }, "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/decentraleyes/reviews/", "requires_payment": false, @@ -635,7 +635,7 @@ "type": "extension", "url": "https://addons.mozilla.org/en-US/firefox/addon/decentraleyes/", "versions_url": "https://addons.mozilla.org/en-US/firefox/addon/decentraleyes/versions/", - "weekly_downloads": 3215 + "weekly_downloads": 3292 }, "notes": null }, @@ -651,7 +651,7 @@ "picture_url": "https://addons.mozilla.org/user-media/userpics/73/4073/5474073/5474073.png?…" } ], - "average_daily_users": 1223061, + "average_daily_users": 1231658, "categories": { "firefox": [ "privacy-security" @@ -1170,10 +1170,10 @@ "category": "recommended" }, "ratings": { - "average": 4.7952, - "bayesian_average": 4.7924799598835, - "count": 2393, - "text_count": 455 + "average": 4.7988, + "bayesian_average": 4.796088382620796, + "count": 2415, + "text_count": 458 }, "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/reviews/", "requires_payment": false, @@ -1197,7 +1197,7 @@ "type": "extension", "url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/", "versions_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/versions/", - "weekly_downloads": 21906 + "weekly_downloads": 22533 }, "notes": null }, @@ -1213,7 +1213,7 @@ "picture_url": null } ], - "average_daily_users": 7691950, + "average_daily_users": 7819848, "categories": { "firefox": [ "privacy-security" @@ -1379,7 +1379,7 @@ }, "is_disabled": false, "is_experimental": false, - "last_updated": "2024-02-20T18:51:52Z", + "last_updated": "2024-03-26T17:25:30Z", "name": { "ar": "uBlock Origin", "bg": "uBlock Origin", @@ -1524,10 +1524,10 @@ "category": "recommended" }, "ratings": { - "average": 4.7887, - "bayesian_average": 4.788323774199536, - "count": 17283, - "text_count": 4511 + "average": 4.7892, + "bayesian_average": 4.788825346990968, + "count": 17455, + "text_count": 4552 }, "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/reviews/", "requires_payment": false, @@ -1590,7 +1590,7 @@ "type": "extension", "url": "https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/", "versions_url": "https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/versions/", - "weekly_downloads": 170114 + "weekly_downloads": 158166 }, "notes": null }, @@ -1606,7 +1606,7 @@ "picture_url": null } ], - "average_daily_users": 177359, + "average_daily_users": 178562, "categories": { "firefox": [ "photos-music-videos", @@ -1702,10 +1702,10 @@ "category": "recommended" }, "ratings": { - "average": 4.4571, - "bayesian_average": 4.452141766560867, - "count": 1201, - "text_count": 460 + "average": 4.4481, + "bayesian_average": 4.443180454772495, + "count": 1214, + "text_count": 467 }, "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/video-background-play-fix/re…", "requires_payment": false, @@ -1727,7 +1727,7 @@ "type": "extension", "url": "https://addons.mozilla.org/en-US/firefox/addon/video-background-play-fix/", "versions_url": "https://addons.mozilla.org/en-US/firefox/addon/video-background-play-fix/ve…", - "weekly_downloads": 466 + "weekly_downloads": 386 }, "notes": null }, @@ -1743,7 +1743,7 @@ "picture_url": null } ], - "average_daily_users": 79283, + "average_daily_users": 77166, "categories": { "firefox": [ "privacy-security", @@ -1853,10 +1853,10 @@ ], "promoted": null, "ratings": { - "average": 4.3787, - "bayesian_average": 4.364570736907983, - "count": 404, - "text_count": 113 + "average": 4.3753, + "bayesian_average": 4.3611016639271964, + "count": 405, + "text_count": 114 }, "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-possum/reviews/", "requires_payment": false, @@ -1878,7 +1878,7 @@ "type": "extension", "url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-possum/", "versions_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-possum/versions/", - "weekly_downloads": 1367 + "weekly_downloads": 1963 }, "notes": null }, @@ -1894,7 +1894,7 @@ "picture_url": "https://addons.mozilla.org/user-media/userpics/64/9064/12929064/12929064.pn…" } ], - "average_daily_users": 302489, + "average_daily_users": 309800, "categories": { "firefox": [ "search-tools", @@ -2111,10 +2111,10 @@ "category": "recommended" }, "ratings": { - "average": 4.6464, - "bayesian_average": 4.641961457940663, - "count": 1411, - "text_count": 273 + "average": 4.6336, + "bayesian_average": 4.629244598584173, + "count": 1441, + "text_count": 284 }, "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/search_by_image/reviews/", "requires_payment": false, @@ -2137,7 +2137,7 @@ "type": "extension", "url": "https://addons.mozilla.org/en-US/firefox/addon/search_by_image/", "versions_url": "https://addons.mozilla.org/en-US/firefox/addon/search_by_image/versions/", - "weekly_downloads": 5867 + "weekly_downloads": 5510 }, "notes": null }, @@ -2160,7 +2160,7 @@ "picture_url": null } ], - "average_daily_users": 124312, + "average_daily_users": 124783, "categories": { "firefox": [ "search-tools", @@ -2441,10 +2441,10 @@ "category": "recommended" }, "ratings": { - "average": 4.3717, - "bayesian_average": 4.36732284678191, - "count": 1329, - "text_count": 376 + "average": 4.3766, + "bayesian_average": 4.372232748328777, + "count": 1341, + "text_count": 379 }, "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/google-search-fixer/reviews/", "requires_payment": false, @@ -2464,7 +2464,7 @@ "type": "extension", "url": "https://addons.mozilla.org/en-US/firefox/addon/google-search-fixer/", "versions_url": "https://addons.mozilla.org/en-US/firefox/addon/google-search-fixer/versions/", - "weekly_downloads": 37 + "weekly_downloads": 26 }, "notes": null }, @@ -2480,12 +2480,11 @@ "picture_url": "https://addons.mozilla.org/user-media/userpics/43/0143/143/143.png?modified…" } ], - "average_daily_users": 308206, + "average_daily_users": 307654, "categories": { "firefox": [ - "web-development", "privacy-security", - "other" + "alerts-updates" ] }, "contributions_url": "https://www.paypal.com/donate/?hosted_button_id=9ERKTU5MBH4EW&utm_content=p…", @@ -2550,20 +2549,20 @@ "default_locale": "en-US", "description": { "da": "Dette værktøj, vinder af \"2006 PC World World Class Award\", giver ekstra beskyttelse til din Firefox.\nDen lader kun JavaScript, Java og andet kørbart indhold køre fra betroede domæner du har valgt, fx din home-banking hjemmeside, og forsvarer \"tillids-grænserne\" mod cross-site scripting angreb (XXS).\nEn sådan forebyggende metode forhindrer udnyttelse af sikkerhedshuller (kendte som ukendte!) uden tab af funktionalitet...\nEksperterne er enige: Firefox er faktisk mere sikker med NoScript ;-)", - "de": "<b>WICHTIG</b>\n<a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/e19d2306e457c98e6c3e03…" rel=\"nofollow\">Eine Anleitung in die Grundlagen von <b>NoScript 10</b></a>\n\nIst die neue Oberfläche von NoScript 10 immer noch ungewohnt?\nSehen Sie sich diese <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/f5ad7f79289d1b2c198593…" rel=\"nofollow\">von Nutzern erstellte NoScript 10 Einführung</a> und diesen <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/4e700d4e76086494b5553f…" rel=\"nofollow\">Vergleich zwischen NoScript 10 \"Quantum\" und NoScript 5 \"Classic\"</a> an.\n\nAls Gewinner des \"PC World World Class Award\" und ausgeliefert als Teil des Tor Browsers bietet Ihnen NoScript den besten verfügbaren Schutz im Internet.\n\nMit NoScript können Sie JavaScript, Flash, Java und andere ausführbare Inhalte bloß auf vertrauenswürdigen Domains Ihrer Wahl zulassen, z.B. beim Online-Banking. Somit verhindern Sie aus der Ferne ausnutzbare Schwachstellen inklusive Spectre und Meltdown.\n\nIhre vertrauenswürdigen Bereiche werden dank der einmaligen ClearClick Technologie gegen seitenübergreifende Scripting-Attacken (XSS), Cross-Zone DNS Rebinding / CSRF Attacken (Router Hacking), und Clickjacking-Versuche geschützt.\n\nDieser präventive Ansatz verhindert das Ausnutzen von (bekannten und unbekannten!) Sicherheitslücken ohne Verlust an Funktionalität, wo Sie diese benötigen.\nExperten sind sich einig: Firefox wird wirklich noch sicherer mithilfe von NoScript ;-)\n\n\nFAQ: <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a4a623eb90a9becd02eed…" rel=\"nofollow\">https://noscript.net/faq</a>\nForum: <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a6b9e607349db8d83719e…" rel=\"nofollow\">https://noscript.net/forum</a>", + "de": "<b>WICHTIG</b>\n<a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/e19d2306e457c98e6c3e03…">Eine Anleitung in die Grundlagen von <b>NoScript 10</b></a>\n\nIst die neue Oberfläche von NoScript 10 immer noch ungewohnt?\nSehen Sie sich diese <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/f5ad7f79289d1b2c198593…">von Nutzern erstellte NoScript 10 Einführung</a> und diesen <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/4e700d4e76086494b5553f…">Vergleich zwischen NoScript 10 \"Quantum\" und NoScript 5 \"Classic\"</a> an.\n\nAls Gewinner des \"PC World World Class Award\" und ausgeliefert als Teil des Tor Browsers bietet Ihnen NoScript den besten verfügbaren Schutz im Internet.\n\nMit NoScript können Sie JavaScript, Flash, Java und andere ausführbare Inhalte bloß auf vertrauenswürdigen Domains Ihrer Wahl zulassen, z.B. beim Online-Banking. Somit verhindern Sie aus der Ferne ausnutzbare Schwachstellen inklusive Spectre und Meltdown.\n\nIhre vertrauenswürdigen Bereiche werden dank der einmaligen ClearClick Technologie gegen seitenübergreifende Scripting-Attacken (XSS), Cross-Zone DNS Rebinding / CSRF Attacken (Router Hacking), und Clickjacking-Versuche geschützt.\n\nDieser präventive Ansatz verhindert das Ausnutzen von (bekannten und unbekannten!) Sicherheitslücken ohne Verlust an Funktionalität, wo Sie diese benötigen.\nExperten sind sich einig: Firefox wird wirklich noch sicherer mithilfe von NoScript ;-)\n\n\nFAQ: <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a4a623eb90a9becd02eed…">https://noscript.net/faq</a>\nForum: <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a6b9e607349db8d83719e…">https://noscript.net/forum</a>", "el": "Αυτό το πρόσθετο που κέρδισε το βραβείο «2006 World Class Award» του περιοδικού PC World, παρέχει πρόσθετη προστασία στον Firefox.\nΕπιτρέπει την εκτέλεση JavaScript, Java και άλλου εκτελέσιμου περιεχομένου, μόνο για έμπιστους τομείς δικτύου της επιλογής σας (π.χ. την δικτυακή υπηρεσία τραπεζικών συναλλαγών σας) και τους προστατεύει από τον κίνδυνο επιθέσεων cross-site scripting (XSS) .\nΑυτή η προσέγγιση προκαταβολικού μπλοκαρίσματος δεν επιτρέπει την εκμετάλλευση κενών ασφαλείας (ήδη γνωστών αλλά και άγνωστων ακόμα!) χωρίς να επηρεάζει την λειτουργικότητα...\nΟι ειδικοί συμφωνούν: Ο Firefox είναι πραγματικά ασφαλέστερος με το NoScript! ;-)", - "en-US": "Winner of the \"PC World - World Class Award\" and bundled with the Tor Browser, NoScript gives you the best available protection on the web. It allows JavaScript, Flash, and other executable content to run only from trusted domains of your choice (e.g. your banking site), thus mitigating remotely exploitable vulnerabilities, such as Spectre and Meltdown.\n\nIt protects your \"trust boundaries\" against cross-site scripting attacks (XSS), cross-zone DNS rebinding / CSRF attacks (router hacking), and Clickjacking attempts, thanks to its unique ClearClick technology.\n\nSuch a preemptive approach prevents exploitation of security vulnerabilities (known and unknown!) with no loss of functionality where you need it. Experts do agree: Firefox is really safer with NoScript ;-)\n\nFAQ: <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a4a623eb90a9becd02eed…" rel=\"nofollow\">https://noscript.net/faq</a>\nForum: <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a6b9e607349db8d83719e…" rel=\"nofollow\">https://noscript.net/forum</a>\n\n<a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/e19d2306e457c98e6c3e03…" rel=\"nofollow\">A Basic <b>NoScript 10 Guide</b></a>\n\nStill confused by NoScript 10's new UI?\nCheck this <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/f5ad7f79289d1b2c198593…" rel=\"nofollow\">user-contributed NoScript 10 primer</a>.\nand this <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/4e700d4e76086494b5553f…" rel=\"nofollow\">NoScript 10 \"Quantum\" vs NoScript 5 \"Classic\" (or \"Legacy\") comparison</a>.", + "en-US": "Winner of the \"PC World - World Class Award\" and bundled with the Tor Browser, NoScript gives you the best available protection on the web. It allows JavaScript, Flash, and other executable content to run only from trusted domains of your choice (e.g. your banking site), thus mitigating remotely exploitable vulnerabilities, such as Spectre and Meltdown.\n\nIt protects your \"trust boundaries\" against cross-site scripting attacks (XSS), cross-zone DNS rebinding / CSRF attacks (router hacking), and Clickjacking attempts, thanks to its unique ClearClick technology.\n\nSuch a preemptive approach prevents exploitation of security vulnerabilities (known and unknown!) with no loss of functionality where you need it. \nExperts do agree: Firefox is really safer with NoScript!\n\nFAQ: <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a4a623eb90a9becd02eed…" rel=\"nofollow\">https://noscript.net/faq</a>\nForum: <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a6b9e607349db8d83719e…" rel=\"nofollow\">https://noscript.net/forum</a>\n\n<a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/e19d2306e457c98e6c3e03…" rel=\"nofollow\">A Basic <b>NoScript 10 Guide</b></a>\n\nStill confused by NoScript 10's new UI?\nCheck this <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/f5ad7f79289d1b2c198593…" rel=\"nofollow\">user-contributed NoScript 10 primer</a>.\nand this <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/4e700d4e76086494b5553f…" rel=\"nofollow\">NoScript 10 \"Quantum\" vs NoScript 5 \"Classic\" (or \"Legacy\") comparison</a>.", "es": "Protección extra para su Firefox: NoScript sólo permite JavaScript, Java y otros plugins en los sitios web de confianza que Ud. elija (como la web de su banco). Este planteamiento preventivo basado en una lista blanca evita que se puedan explotar vulnerabilidades (conocidas o incluso desconocidas) sin pérdida de funcionalidad... Los expertos lo confirmarán: Firefox es realmente más seguro con NoScript :-)", - "fr": "<b>IMPORTANT</b>\n<a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/e19d2306e457c98e6c3e03…" rel=\"nofollow\">Un Guide élémentaire pour <b>NoScript 10</b> (en anglais)</a>\n\nConfus avec la nouvelle interface graphique de NoScript 10 ?\nConsultez cette <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/f5ad7f79289d1b2c198593…" rel=\"nofollow\">introduction à NoScript 10, contribution d’un utilisateur</a> (en anglais)\net cette <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/4e700d4e76086494b5553f…" rel=\"nofollow\">comparaison entre NoScript 10 « Quantum » et NoScript 5 « Classic » (ou « Legacy »)</a> (en anglais).\n\nLauréat du « World Class Award » décerné par PC World et fourni avec le navigateur Tor, NoScript vous offre la meilleure protection disponible pour le Web.\n\nIl autorise le contenu actif JavaScript, Flash, Java et autres à ne s’exécuter que sur les domaines de confiance de votre choix, par exemple le site de votre banque, réduisant le risque d’exploitation à distance de vulnérabilités comme Spectre et Meltdown.\n\nIl protège vos zones de confiance contre les attaques par cross-site scripting (XSS), DNS rebinding / attaque CSRF (Cross Site Request Forgery) (piratage de routeur) et les tentatives de détournement de clic (Clickjacking) grâce à sa propre technologie ClearClick.\n\nCette approche préventive empêche l’exploitation des failles de sécurité (connues mais aussi inconnues) sans perte de fonctionnalités là où vous en avez besoin. Les experts en conviendront : Firefox est réellement plus sûr avec NoScript ;-)\n\nFAQ : <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a4a623eb90a9becd02eed…" rel=\"nofollow\">https://noscript.net/faq</a> (en anglais)\nForum : <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a6b9e607349db8d83719e…" rel=\"nofollow\">https://noscript.net/forum</a> (en anglais)", - "it": "<b>IMPORTANTE</b>\n<a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/e19d2306e457c98e6c3e03…" rel=\"nofollow\">Guida di base a <b>NoScript 10</b></a>\n\nAncora confuso dalla nuova interfaccia di NoScript 10?\nLeggi qui <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/f5ad7f79289d1b2c198593…" rel=\"nofollow\">i contributi degli utenti di NoScript 10</a>.\ne <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/4e700d4e76086494b5553f…" rel=\"nofollow\"> una comparazione tra NoScript 10 \"Quantum\" vs NoScript 5 \"Classic\" (o \"Legacy\")</a>.\n\nVincitore del premio \"PC World World Class Award\" ed incorporato nel browser Tor, NoScript ti offre la migliore protezione possibile per il web.\n\nAttiva JavaScript, Flash, Java e altri eseguibili solo sui domini fidati scelti da te, ad esempio il sito della tua banca, riducendo le possibili conseguenze di vulnerabilità, inclusi Spectre e Meltdown.\n\nProtegge la tua rete dagli attacchi cross-site scripting (XSS), cross-zone DNS rebinding / attacchi CSRF (intrusione nel router) e tentativi di Clickjacking, grazie alla sua tecnologia unica ClearClick. \n\nCon un approccio proattivo previene lo sfruttamento di vulnerabilità di sicurezza (conosciute e ancora sconosciute!) senza perdere le funzionalità necessarie.\nGli esperti sono d'accordo: Firefox è veramente più sicuro con NoScript ;-)\n\nFAQ: <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a4a623eb90a9becd02eed…" rel=\"nofollow\">https://noscript.net/faq</a>\nForum: <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a6b9e607349db8d83719e…" rel=\"nofollow\">https://noscript.net/forum</a>", - "nl": "<b>BELANGRIJK</b>\n<a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/e19d2306e457c98e6c3e03…" rel=\"nofollow\">Een basale <b>Handleiding voor NoScript 10</b></a>\n\nNog steeds in verwarring door de nieuwe UI van NoScript 10?\nBekijk deze <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/f5ad7f79289d1b2c198593…" rel=\"nofollow\">door gebruikers aangeleverde beknopte handleiding voor NoScript 10</a>\nen deze <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/4e700d4e76086494b5553f…" rel=\"nofollow\">vergelijking tussen NoScript 10 ‘Quantum’ en NoScript 5 ‘Classic’ (of ‘Verouderd’)</a>.\n\nAls winnaar van de ‘PC World World Class Award’ en gebundeld met de Tor-browser biedt NoScript de best beschikbare bescherming op het web.\n\nHet zorgt ervoor dat JavaScript, Flash, Java en andere uitvoerbare inhoud alleen wordt uitgevoerd vanaf vertrouwde domeinen van uw keuze, zoals uw website voor thuisbankieren, zodat op afstand te misbruiken kwetsbaarheden, waaronder Spectre en Meltdown, worden verminderd.\n\nHet beschermt uw ‘vertrouwensgrenzen’ tegen cross-site-scripting-aanvallen (XSS), cross-zone-DNS-rebinding / CSRF-aanvallen (routerhacking) en Clickjacking-pogingen, dankzij de unieke ClearClick-technologie ervan. \n\nEen dergelijke preventieve benadering voorkomt exploitatie van beveiligingskwetsbaarheden (bekende en zelfs onbekende!) zonder verlies van functionaliteit waar dat nodig is.\nExperts zijn het ermee eens: Firefox is echt veiliger met NoScript ;-)\n\nFAQ: <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a4a623eb90a9becd02eed…" rel=\"nofollow\">https://noscript.net/faq</a>\nForum: <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a6b9e607349db8d83719e…" rel=\"nofollow\">https://noscript.net/forum</a>", + "fr": "<b>IMPORTANT</b>\n<a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/e19d2306e457c98e6c3e03…">Un Guide élémentaire pour <b>NoScript 10</b> (en anglais)</a>\n\nConfus avec la nouvelle interface graphique de NoScript 10 ?\nConsultez cette <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/f5ad7f79289d1b2c198593…">introduction à NoScript 10, contribution d’un utilisateur</a> (en anglais)\net cette <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/4e700d4e76086494b5553f…">comparaison entre NoScript 10 « Quantum » et NoScript 5 « Classic » (ou « Legacy »)</a> (en anglais).\n\nLauréat du « World Class Award » décerné par PC World et fourni avec le navigateur Tor, NoScript vous offre la meilleure protection disponible pour le Web.\n\nIl autorise le contenu actif JavaScript, Flash, Java et autres à ne s’exécuter que sur les domaines de confiance de votre choix, par exemple le site de votre banque, réduisant le risque d’exploitation à distance de vulnérabilités comme Spectre et Meltdown.\n\nIl protège vos zones de confiance contre les attaques par cross-site scripting (XSS), DNS rebinding / attaque CSRF (Cross Site Request Forgery) (piratage de routeur) et les tentatives de détournement de clic (Clickjacking) grâce à sa propre technologie ClearClick.\n\nCette approche préventive empêche l’exploitation des failles de sécurité (connues mais aussi inconnues) sans perte de fonctionnalités là où vous en avez besoin. Les experts en conviendront : Firefox est réellement plus sûr avec NoScript ;-)\n\nFAQ : <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a4a623eb90a9becd02eed…">https://noscript.net/faq</a> (en anglais)\nForum : <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a6b9e607349db8d83719e…">https://noscript.net/forum</a> (en anglais)", + "it": "<b>IMPORTANTE</b>\n<a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/e19d2306e457c98e6c3e03…">Guida di base a <b>NoScript 10</b></a>\n\nAncora confuso dalla nuova interfaccia di NoScript 10?\nLeggi qui <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/f5ad7f79289d1b2c198593…">i contributi degli utenti di NoScript 10</a>.\ne <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/4e700d4e76086494b5553f…"> una comparazione tra NoScript 10 \"Quantum\" vs NoScript 5 \"Classic\" (o \"Legacy\")</a>.\n\nVincitore del premio \"PC World World Class Award\" ed incorporato nel browser Tor, NoScript ti offre la migliore protezione possibile per il web.\n\nAttiva JavaScript, Flash, Java e altri eseguibili solo sui domini fidati scelti da te, ad esempio il sito della tua banca, riducendo le possibili conseguenze di vulnerabilità, inclusi Spectre e Meltdown.\n\nProtegge la tua rete dagli attacchi cross-site scripting (XSS), cross-zone DNS rebinding / attacchi CSRF (intrusione nel router) e tentativi di Clickjacking, grazie alla sua tecnologia unica ClearClick. \n\nCon un approccio proattivo previene lo sfruttamento di vulnerabilità di sicurezza (conosciute e ancora sconosciute!) senza perdere le funzionalità necessarie.\nGli esperti sono d'accordo: Firefox è veramente più sicuro con NoScript ;-)\n\nFAQ: <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a4a623eb90a9becd02eed…">https://noscript.net/faq</a>\nForum: <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a6b9e607349db8d83719e…">https://noscript.net/forum</a>", + "nl": "<b>BELANGRIJK</b>\n<a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/e19d2306e457c98e6c3e03…">Een basale <b>Handleiding voor NoScript 10</b></a>\n\nNog steeds in verwarring door de nieuwe UI van NoScript 10?\nBekijk deze <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/f5ad7f79289d1b2c198593…">door gebruikers aangeleverde beknopte handleiding voor NoScript 10</a>\nen deze <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/4e700d4e76086494b5553f…">vergelijking tussen NoScript 10 ‘Quantum’ en NoScript 5 ‘Classic’ (of ‘Verouderd’)</a>.\n\nAls winnaar van de ‘PC World World Class Award’ en gebundeld met de Tor-browser biedt NoScript de best beschikbare bescherming op het web.\n\nHet zorgt ervoor dat JavaScript, Flash, Java en andere uitvoerbare inhoud alleen wordt uitgevoerd vanaf vertrouwde domeinen van uw keuze, zoals uw website voor thuisbankieren, zodat op afstand te misbruiken kwetsbaarheden, waaronder Spectre en Meltdown, worden verminderd.\n\nHet beschermt uw ‘vertrouwensgrenzen’ tegen cross-site-scripting-aanvallen (XSS), cross-zone-DNS-rebinding / CSRF-aanvallen (routerhacking) en Clickjacking-pogingen, dankzij de unieke ClearClick-technologie ervan. \n\nEen dergelijke preventieve benadering voorkomt exploitatie van beveiligingskwetsbaarheden (bekende en zelfs onbekende!) zonder verlies van functionaliteit waar dat nodig is.\nExperts zijn het ermee eens: Firefox is echt veiliger met NoScript ;-)\n\nFAQ: <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a4a623eb90a9becd02eed…">https://noscript.net/faq</a>\nForum: <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a6b9e607349db8d83719e…">https://noscript.net/forum</a>", "pl": "Zwycięzca \"2006 PC World World Class Award\". Narzędzie to stanowi dodatkowe\nzabezpieczenie dla wszystkich przeglądarek Mozilli. NoScript pozwala\nwykonywać skrypty JavaScript i aplety Java tylko przez zaufane domeny\nwybrane przez użytkownika np. witryny banków internetowych oraz zabezpiecza\nprzed atakami typu \"cross-site scripting\" (XSS). Takie prewencyjne podejście\nzabezpiecza przed wykorzystaniem luk bezpieczeństwa - znanych i nieznanych -\nbez utraty funkcjonalności.\n\nEksperci są zgodni: Firefox z NoScript jest naprawdę bezpieczniejszy!", - "pt-BR": "IMPORTANTE\n<a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/e19d2306e457c98e6c3e03…" rel=\"nofollow\">Um <b>guia básico do NoScript 10</b></a>\n\nAinda confuso com a nova interface gráfica do NoScript 10?\nConsulte esta <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/f5ad7f79289d1b2c198593…" rel=\"nofollow\">cartilha do NoScript 10 de contribuições de usuários</a>.\ne esta <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/4e700d4e76086494b5553f…" rel=\"nofollow\">comparação entre NoScript 10 \"Quantum\" e NoScript 5 \"Classic\" (ou \"Legado\")</a>.\n\nVencedor do \"PC World World Class Award\" e incorporado ao Navegador Tor, o NoScript lhe oferece a melhor proteção disponível na web.\n\nEle permite que JavaScript, Flash, Java e outros conteúdos executáveis funcionem apenas em domínios de sua confiança, por exemplo no site do seu banco, mitigando vulnerabilidades de exploração remota, incluindo Spectre e Meltdown.\n\nProtege suas \"fronteiras seguras\" contra ataques 'cross-site scripting' (XSS), ataques 'cross-zone DNS rebinding / CSRF' (invasão de roteador) e tentativas de Clickjacking, graças à sua inigualável tecnologia ClearClick. \n\nTal abordagem preemptiva previne exploração de vulnerabilidades de segurança (conhecidas e até mesmo desconhecidas!) sem perda de funcionalidade onde você precisa.\nEspecialistas concordam: o Firefox é realmente mais seguro com o NoScript ;-)\n\nFAQ: <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a4a623eb90a9becd02eed…" rel=\"nofollow\">https://noscript.net/faq</a>\nFórum: <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a6b9e607349db8d83719e…" rel=\"nofollow\">https://noscript.net/forum</a>", + "pt-BR": "IMPORTANTE\n<a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/e19d2306e457c98e6c3e03…">Um <b>guia básico do NoScript 10</b></a>\n\nAinda confuso com a nova interface gráfica do NoScript 10?\nConsulte esta <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/f5ad7f79289d1b2c198593…">cartilha do NoScript 10 de contribuições de usuários</a>.\ne esta <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/4e700d4e76086494b5553f…">comparação entre NoScript 10 \"Quantum\" e NoScript 5 \"Classic\" (ou \"Legado\")</a>.\n\nVencedor do \"PC World World Class Award\" e incorporado ao Navegador Tor, o NoScript lhe oferece a melhor proteção disponível na web.\n\nEle permite que JavaScript, Flash, Java e outros conteúdos executáveis funcionem apenas em domínios de sua confiança, por exemplo no site do seu banco, mitigando vulnerabilidades de exploração remota, incluindo Spectre e Meltdown.\n\nProtege suas \"fronteiras seguras\" contra ataques 'cross-site scripting' (XSS), ataques 'cross-zone DNS rebinding / CSRF' (invasão de roteador) e tentativas de Clickjacking, graças à sua inigualável tecnologia ClearClick. \n\nTal abordagem preemptiva previne exploração de vulnerabilidades de segurança (conhecidas e até mesmo desconhecidas!) sem perda de funcionalidade onde você precisa.\nEspecialistas concordam: o Firefox é realmente mais seguro com o NoScript ;-)\n\nFAQ: <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a4a623eb90a9becd02eed…">https://noscript.net/faq</a>\nFórum: <a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a6b9e607349db8d83719e…">https://noscript.net/forum</a>", "ru": "Победитель \"2006 PC World World Class Award», этот инструмент обеспечивает дополнительную защиту для Вашего Firefox.\nОно позволяет запуск JavaScript, Java и другого активного содержимого только для доверенных доменов по Вашему выбору, например, Ваш личный банковский веб-сайт. Обеспечивает безопасность Вашей работы в \"зоне доверия\", защищает от атак с использованием межузловых сценариев (XSS), кросс-зоны DNS подменой / CSRF-атак (хакерских маршрутизаторов), и атаки ClickJacking, благодаря своей уникальной технологии ClearClick. Он также реализует DoNotTrack защиту по умолчанию, см. <a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/bd4266094d321e473190ea…" rel=\"nofollow\">http://snipurl.com/nsdntrack</a>.\nТакой упреждающий подход предотвращает использование уязвимостей (известных и даже неизвестных!) Без потери функциональности.\nЭксперты едины во мнении: Firefox действительно безопаснее с NoScript ;-)", "sk": "Víťaz ceny \"2006 PC World World Class Award\". Tento nástroj poskytuje špeciálnu ochranu Firefoxu.\nPovoľuje spúšťanie JavaScriptu, Javy a ďalšieho spustiteľného obsahu len na dôveryhodných doménach podľa vášho výberu, napr. na webovej stránke bankingu.\nTakýto preventívny prístup chráni pred zneužitím bezpečnostných dier (známych aj neznámych) bez straty funkčnosti.\nOdborníci by súhlasili: Firefox je s rozšírením NoScript naozaj bezpečnejší ;-)", "vi": "Đã chiến thắng trong \"Giải thưởng Cấp độ Thế giới PC World 2006\", công cụ này cung cấp lớp phòng vệ phụ thêm cho Firefox của bạn.\nNoScript chỉ cho phép JavaScript, Java (và các phần bổ trợ khác) trên những tên miền tin cậy mà bạn chọn (vd., trang web ngân hàng của bạn), canh gác \"vùng biên giới tin cậy\" của bạn chống lại các âm mưu tấn công cross-site scripting (XSS) và Clickjacking, nhờ công nghệ ClearClick của nó.\nPhương thức ngăn chặn trước dựa trên sổ trắng này ngăn chặn việc khai thác các lỗ hổng bảo mật (đã biết hay thậm chí chưa biết!) mà không làm mất đi chức năng...\nCác chuyên gia đều đồng ý rằng: Firefox thật sự an toàn hơn với NoScript :-)", "zh-TW": "這個工具是 2006 PC World 世界級大獎贏家,讓你的 Firefox 更加安全!\n\n使用此套件後,僅有你信任的網站(例如你的銀行)才能執行腳本、Java 與其他動態內容。建立「信任範圍」以抵擋跨網站腳本攻擊(XSS)。\n\n未雨綢繆、使用此套件避開安全漏洞(連未知的漏洞也照擋不誤),而不損失正常功能…\n\n連專家都同意、Firefox 有了 NoScript 後更加安全了 ;-)", - "zh-CN": "重要\n<a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/e19d2306e457c98e6c3e03…" rel=\"nofollow\">一篇基础的<b>NoScript 10 指南</b></a>\n\n仍被 NoScript 10 的新 UI 所困惑?\n看看这篇<a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/f5ad7f79289d1b2c198593…" rel=\"nofollow\">用户贡献的 NoScript 10 入门</a>。\n还有这篇<a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/4e700d4e76086494b5553f…" rel=\"nofollow\"> NoScript 10 \"Quantum\" vs NoScript 5 \"Classic\" (or \"Legacy\") comparison</a>。\n\n作为“PC World World Class Award”大奖的获得者并内置于 Tor 浏览器,NoScript 将为您提供最佳的网络保护。\n\n它只允许在您选择的信任域上执行 JavaScript、Flash、Java 和其他可执行内容,例如您的家庭银行网站,能够缓解包括 Spectre 和 Meltdown 等远程可利用漏洞。\n\n多亏了其独特的 ClearClick 技术,它可以保护您的“信任边界”不受跨站点脚本攻击(XSS),跨区 DNS 重新绑定/ CSRF 攻击(路由器黑客)和点击劫持(Clickjacking)尝试。\n\n这种先发制人的机制在不损失任何功能的前提下,防止利用安全漏洞(已知甚至未知的!)进行攻击。\n专家们一致同意:拥有 NoScript 的 Firefox 更安全 :-)\n\n常见问题解答:<a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a4a623eb90a9becd02eed…" rel=\"nofollow\">https://noscript.net/faq</a>\n论坛:<a href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a6b9e607349db8d83719e…" rel=\"nofollow\">https://noscript.net/forum</a>" + "zh-CN": "重要\n<a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/e19d2306e457c98e6c3e03…">一篇基础的<b>NoScript 10 指南</b></a>\n\n仍被 NoScript 10 的新 UI 所困惑?\n看看这篇<a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/f5ad7f79289d1b2c198593…">用户贡献的 NoScript 10 入门</a>。\n还有这篇<a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/4e700d4e76086494b5553f…"> NoScript 10 \"Quantum\" vs NoScript 5 \"Classic\" (or \"Legacy\") comparison</a>。\n\n作为“PC World World Class Award”大奖的获得者并内置于 Tor 浏览器,NoScript 将为您提供最佳的网络保护。\n\n它只允许在您选择的信任域上执行 JavaScript、Flash、Java 和其他可执行内容,例如您的家庭银行网站,能够缓解包括 Spectre 和 Meltdown 等远程可利用漏洞。\n\n多亏了其独特的 ClearClick 技术,它可以保护您的“信任边界”不受跨站点脚本攻击(XSS),跨区 DNS 重新绑定/ CSRF 攻击(路由器黑客)和点击劫持(Clickjacking)尝试。\n\n这种先发制人的机制在不损失任何功能的前提下,防止利用安全漏洞(已知甚至未知的!)进行攻击。\n专家们一致同意:拥有 NoScript 的 Firefox 更安全 :-)\n\n常见问题解答:<a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a4a623eb90a9becd02eed…">https://noscript.net/faq</a>\n论坛:<a rel=\"nofollow\" href=\"https://prod.outgoing.prod.webservices.mozgcp.net/v1/8a6b9e607349db8d83719e…">https://noscript.net/forum</a>" }, "developer_comments": { "en-US": "Security issues affecting Firefox or the Tor Browser which can be fixed by a NoScript update are guaranteed to be addressed within 24 hours. This sometimes requires many updates to be issued in a short timespan, and when this happens you may notice NoScript UI's asking to \"<em>reload this page in order to operate properly</em>\". This is normal on \"live\" updates, and it just means the UI is out of sync with the page content, but there's no need to worry as <strong>all the restrictions to scripts and active content are still in place</strong>.", @@ -2619,12 +2618,12 @@ 960, 727 ], - "image_url": "https://addons.mozilla.org/user-media/previews/full/267/267408.png?modified…", + "image_url": "https://addons.mozilla.org/user-media/previews/full/267/267408.png?modified…", "thumbnail_size": [ 528, 400 ], - "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/267/267408.jpg?modifi…" + "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/267/267408.jpg?modifi…" }, { "id": 267511, @@ -2635,12 +2634,12 @@ 717, 542 ], - "image_url": "https://addons.mozilla.org/user-media/previews/full/267/267511.png?modified…", + "image_url": "https://addons.mozilla.org/user-media/previews/full/267/267511.png?modified…", "thumbnail_size": [ 529, 400 ], - "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/267/267511.jpg?modifi…" + "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/267/267511.jpg?modifi…" }, { "id": 267512, @@ -2651,12 +2650,12 @@ 717, 542 ], - "image_url": "https://addons.mozilla.org/user-media/previews/full/267/267512.png?modified…", + "image_url": "https://addons.mozilla.org/user-media/previews/full/267/267512.png?modified…", "thumbnail_size": [ 529, 400 ], - "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/267/267512.jpg?modifi…" + "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/267/267512.jpg?modifi…" } ], "promoted": { @@ -2667,10 +2666,10 @@ "category": "recommended" }, "ratings": { - "average": 4.3956, - "bayesian_average": 4.3929050879959695, - "count": 2174, - "text_count": 837 + "average": 4.399, + "bayesian_average": 4.396311536554253, + "count": 2193, + "text_count": 842 }, "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/noscript/reviews/", "requires_payment": false, @@ -2714,7 +2713,7 @@ "type": "extension", "url": "https://addons.mozilla.org/en-US/firefox/addon/noscript/", "versions_url": "https://addons.mozilla.org/en-US/firefox/addon/noscript/versions/", - "weekly_downloads": 7240 + "weekly_downloads": 7405 }, "notes": null }, @@ -2730,7 +2729,7 @@ "picture_url": null } ], - "average_daily_users": 161419, + "average_daily_users": 162666, "categories": { "firefox": [ "photos-music-videos", @@ -2839,10 +2838,10 @@ "category": "recommended" }, "ratings": { - "average": 3.8734, - "bayesian_average": 3.8693074295625123, - "count": 1224, - "text_count": 443 + "average": 3.8694, + "bayesian_average": 3.8653261105375534, + "count": 1233, + "text_count": 447 }, "ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/youtube-high-definition/revi…", "requires_payment": false, @@ -2861,7 +2860,7 @@ "type": "extension", "url": "https://addons.mozilla.org/en-US/firefox/addon/youtube-high-definition/", "versions_url": "https://addons.mozilla.org/en-US/firefox/addon/youtube-high-definition/vers…", - "weekly_downloads": 1652 + "weekly_downloads": 1444 }, "notes": null } ===================================== projects/browser/config ===================================== @@ -100,9 +100,9 @@ input_files: name: ublock-origin sha256sum: f5fbeeac511ca4e10a74723413727fda8e6f9236c726d16eb54ade1fbe7be5be enable: '[% c("var/mullvad-browser") %]' - - URL: https://github.com/mullvad/browser-extension/releases/download/v0.8.5-firef… + - URL: https://github.com/mullvad/browser-extension/releases/download/v0.9.0-firef… name: mullvad-extension - sha256sum: b8208cc73d3c3c87342b25367b1a5fa330cb528f3213a4c4de30512f1662ff45 + sha256sum: 65bf235aa1015054ae0a54a40c5a663e67fe1d0f0799e7b4726f98cccc7f3eab enable: '[% c("var/mullvad-browser") %]' - filename: 'gtk3-settings.ini' enable: '[% c("var/linux") %]' ===================================== projects/firefox-android/config ===================================== @@ -16,7 +16,7 @@ container: var: fenix_version: 115.2.1 browser_branch: 13.5-1 - browser_build: 7 + browser_build: 8 variant: Beta # This should be updated when the list of gradle dependencies is changed. gradle_dependencies_version: 1 ===================================== projects/firefox/config ===================================== @@ -18,7 +18,7 @@ var: firefox_version: '[% c("var/firefox_platform_version") %]esr' browser_series: '13.5' 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 ===================================== @@ -16,7 +16,7 @@ container: var: geckoview_version: 115.9.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 ===================================== @@ -1,5 +1,5 @@ # vim: filetype=yaml sw=2 -version: '[% IF c("var/use_go_1_20") %]1.20.14[% ELSE %]1.21.7[% END %]' +version: '[% IF c("var/use_go_1_20") %]1.20.14[% ELSE %]1.21.8[% END %]' filename: '[% project %]-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]' container: use_container: 1 @@ -120,10 +120,12 @@ input_files: project: '[% c("var/compiler") %]' enable: '[% ! c("var/linux") %]' - URL: 'https://go.dev/dl/go[% c("version") %].src.tar.gz' + # 1.21 series name: go - sha256sum: 00197ab20f33813832bff62fd93cca1c42a08cc689a32a6672ca49591959bff6 + sha256sum: dc806cf75a87e1414b5b4c3dcb9dd3e9cc98f4cfccec42b7af617d5a658a3c43 enable: '[% !c("var/use_go_1_20") %]' - URL: 'https://go.dev/dl/go[% c("version") %].src.tar.gz' + # 1.20 series name: go sha256sum: 1aef321a0e3e38b7e91d2d7eb64040666cabdcc77d383de3c9522d0d69b67f4e enable: '[% c("var/use_go_1_20") %]' ===================================== 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: 136210 +version: 150100 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: 6731381fd992cf65dd01e56e2b924005af633369da5ac9eb905fd8025255b386 + sha256sum: 039bdb04f97b803f0db2f12a6ba0a03a2091e8d8bd794e178c297e571f04eb7f - filename: packagemanual.py name: package_script ===================================== projects/translation/config ===================================== @@ -12,19 +12,19 @@ compress_tar: 'gz' steps: base-browser: base-browser: '[% INCLUDE build %]' - git_hash: 3215fb9ae37cb115b607647122f0984a8a428b16 + git_hash: 891785fda28488bfe599afc8d3b9a155c0130f5f targets: nightly: git_hash: 'base-browser' tor-browser: tor-browser: '[% INCLUDE build %]' - git_hash: f1a4b3d9af145b062b1a5b0cf2b83bd6bfcd03bb + git_hash: 020ff1e1fd29f39a75d1d7f795a4d80996472dd5 targets: nightly: git_hash: 'tor-browser' mullvad-browser: mullvad-browser: '[% INCLUDE build %]' - git_hash: 57de1569da0e2c48fd999a13e555f6b522041993 + git_hash: c5361cb496ae7e047fd9226139537f1fcfc7938d targets: nightly: git_hash: 'mullvad-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: 44409d6f28faf0e332a00d53de67879de41bf07c + git_hash: 4962bd88652169e6a98afbe1d3b25847e909d213 compress_tar: 'zst' targets: nightly: ===================================== rbm.conf ===================================== @@ -73,12 +73,12 @@ buildconf: git_signtag_opt: '-s' var: - torbrowser_version: '13.5a5' - torbrowser_build: 'build2' + torbrowser_version: '13.5a6' + torbrowser_build: 'build1' torbrowser_incremental_from: + - '13.5a5' - '13.5a4' - '13.5a3' - - '13.5a2' updater_enabled: 1 build_mar: 1 mar_channel_id: '[% c("var/projectname") %]-torproject-[% c("var/channel") %]' ===================================== tools/fetch-manual.py ===================================== @@ -75,7 +75,7 @@ else: sha256.update(chunk) print(f"File downloaded as {manual_file}.") print( - "Please upload it to people.torproject.org and then update projects/manual/config:" + "Please upload it to tb-build-02.torproject.org:~tb-builder/public_html/. and then update projects/manual/config:" ) sha256 = sha256.hexdigest() View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/d… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/d… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android] Pushed new tag firefox-android-115.2.1-13.5-1-build8
by Dan Ballard (@dan) 27 Mar '24

27 Mar '24
Dan Ballard pushed new tag firefox-android-115.2.1-13.5-1-build8 at The Tor Project / Applications / firefox-android -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/tree/firef… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser] Pushed new tag tor-browser-115.9.0esr-13.5-1-build2
by richard (@richard) 27 Mar '24

27 Mar '24
richard pushed new tag tor-browser-115.9.0esr-13.5-1-build2 at The Tor Project / Applications / Tor Browser -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/tor-brows… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser] Pushed new tag mullvad-browser-115.9.0esr-13.5-1-build2
by richard (@richard) 27 Mar '24

27 Mar '24
richard pushed new tag mullvad-browser-115.9.0esr-13.5-1-build2 at The Tor Project / Applications / Mullvad Browser -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/tree/mullv… You're receiving this email because of your account on gitlab.torproject.org.
1 0
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) 27 Mar '24

27 Mar '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: dd7c3469 by Dan Ballard at 2024-03-27T13:30:32-07:00 fixup! Add Tor integration and UI Bug 41187: Change settings moving Network Preferences to Connections menu and readd tor logs - - - - - 13 changed files: - fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt - − fenix/app/src/main/java/org/mozilla/fenix/settings/TorNetworkSettingsFragment.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorBootstrapFragment.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistFragment.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorController.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerGV.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerTAS.kt - + fenix/app/src/main/java/org/mozilla/fenix/tor/TorLogsFragment.kt - fenix/app/src/main/res/navigation/nav_graph.xml - fenix/app/src/main/res/values/preference_keys.xml - fenix/app/src/main/res/values/torbrowser_strings.xml - fenix/app/src/main/res/xml/preferences.xml - − fenix/app/src/main/res/xml/tor_network_settings_preferences.xml Changes: ===================================== fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt ===================================== @@ -61,6 +61,8 @@ 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.TorBridgeTransportConfig +import org.mozilla.fenix.tor.TorEvents import org.mozilla.fenix.utils.Settings import kotlin.system.exitProcess @@ -155,6 +157,8 @@ class SettingsFragment : PreferenceFragmentCompat() { } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + //setPreferencesFromResource(R.xml.tor_network_settings_preferences, rootKey) + //setupConnectionPreferences() setPreferencesFromResource(R.xml.preferences, rootKey) } @@ -178,7 +182,10 @@ class SettingsFragment : PreferenceFragmentCompat() { update(shouldUpdateAccountUIState = !creatingFragment) requireView().findViewById<RecyclerView>(R.id.recycler_view) - ?.hideInitialScrollBar(viewLifecycleOwner.lifecycleScope) + .also { + it?.hideInitialScrollBar(viewLifecycleOwner.lifecycleScope) + it?.disableHidingAnimation() + } if (args.preferenceToScrollTo != null) { scrollToPreference(args.preferenceToScrollTo) @@ -277,9 +284,6 @@ class SettingsFragment : PreferenceFragmentCompat() { resources.getString(R.string.pref_key_search_settings) -> { SettingsFragmentDirections.actionSettingsFragmentToSearchEngineFragment() } - resources.getString(R.string.pref_key_tor_network_settings) -> { - SettingsFragmentDirections.actionSettingsFragmentToTorNetworkSettingsFragment() - } resources.getString(R.string.pref_key_tor_security_level_settings) -> { SettingsFragmentDirections.actionSettingsFragmentToTorSecurityLevelFragment() } @@ -523,6 +527,7 @@ class SettingsFragment : PreferenceFragmentCompat() { preferenceStartProfiler?.isVisible = showSecretDebugMenuThisSession && (requireContext().components.core.engine.profiler?.isProfilerActive() != null) } + setupCookieBannerPreference() setupAmoCollectionOverridePreference(requireContext().settings()) setupGeckoLogsPreference(requireContext().settings()) @@ -532,6 +537,7 @@ class SettingsFragment : PreferenceFragmentCompat() { setupSearchPreference() setupHomepagePreference() setupTrackingProtectionPreference() + setupConnectionPreferences() } /** @@ -566,6 +572,10 @@ class SettingsFragment : PreferenceFragmentCompat() { } } + private fun RecyclerView.disableHidingAnimation() { + this.setItemAnimator(null) + this.setLayoutAnimation(null) + } private fun updateFxAAllowDomesticChinaServerMenu() { val settings = requireContext().settings() val preferenceAllowDomesticChinaServer = @@ -705,6 +715,39 @@ class SettingsFragment : PreferenceFragmentCompat() { } } + internal fun setupConnectionPreferences() { + // will be needed for phase2 + //val torController = requireContext().components.torController + + requirePreference<Preference>(R.string.pref_key_tor_network_settings_bridge_config).apply { + setOnPreferenceClickListener { + val directions = + SettingsFragmentDirections + .actionSettingsFragmentToTorBridgeConfigFragment() + requireView().findNavController().navigate(directions) + true + } + } + + 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_tor_logs).apply { + setOnPreferenceClickListener { + val directions = + SettingsFragmentDirections.actionSettingsFragmentToTorLogsFragment() + requireView().findNavController().navigate(directions) + true + } + } + } + @VisibleForTesting internal fun setupCookieBannerPreference() { with(requirePreference<Preference>(R.string.pref_key_cookie_banner_settings)) { ===================================== fenix/app/src/main/java/org/mozilla/fenix/settings/TorNetworkSettingsFragment.kt deleted ===================================== @@ -1,172 +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.settings - -import android.os.Bundle -import androidx.navigation.findNavController -import androidx.preference.Preference -import androidx.preference.PreferenceFragmentCompat -import org.mozilla.fenix.R -import org.mozilla.fenix.ext.components -import org.mozilla.fenix.ext.nav -import org.mozilla.fenix.ext.settings -import org.mozilla.fenix.ext.showToolbar -import org.mozilla.fenix.tor.TorBridgeTransportConfig -import org.mozilla.fenix.tor.TorEvents - -/** - * Lets the user configure Tor network connection settings - */ -class TorNetworkSettingsFragment : PreferenceFragmentCompat(), TorEvents { - override fun onResume() { - super.onResume() - - val torController = requireContext().components.torController - - torController.registerTorListener(this) - - showToolbar(getString(R.string.preferences_tor_network_settings)) - - val yesString = getString(R.string.preferences_tor_network_settings_yes) - val noString = getString(R.string.preferences_tor_network_settings_no) - - requirePreference<Preference>(R.string.pref_key_tor_network_settings_bridge_config).apply { - setOnPreferenceClickListener { - val directions = - TorNetworkSettingsFragmentDirections - .actionTorNetworkSettingsFragmentToTorBridgeConfigFragment() - requireView().findNavController().navigate(directions) - true - } - - if (torController.bridgesEnabled) { - if (torController.bridgeTransport == TorBridgeTransportConfig.USER_PROVIDED) { - summary = - getString( - R - .string - .preferences_tor_network_settings_bridge_config_description_user_provided_enabled - ) - } else { - summary = - getString( - R - .string - .preferences_tor_network_settings_bridge_config_description_builtin_transport_enabled - ) - } - } else { - summary = - getString( - R - .string - .preferences_tor_network_settings_bridge_config_description - ) - } - } - - requirePreference<Preference>(R.string.pref_key_tor_network_settings_bridges_enabled).apply { - val formatStringRes = R.string.preferences_tor_network_settings_bridges_enabled - title = if (torController.bridgesEnabled) { - getString(formatStringRes, yesString) - } else { - getString(formatStringRes, noString) - } - } - - requirePreference<Preference>(R.string.pref_key_use_new_bootstrap).apply { - setOnPreferenceClickListener { - val directions = - TorNetworkSettingsFragmentDirections.actionTorNetworkSettingsFragmentToBetaConnectionFeaturesFragment() - requireView().findNavController().navigate(directions) - true - } - } - - setStatus() - } - - private fun setStatus() { - val torController = requireContext().components.torController - val yesString = getString(R.string.preferences_tor_network_settings_yes) - val noString = getString(R.string.preferences_tor_network_settings_no) - - requirePreference<Preference>(R.string.pref_key_tor_network_settings_tor_ready).apply { - val formatStringRes = R.string.preferences_tor_network_settings_tor_ready - @SuppressWarnings("ComplexCondition") - title = if (!torController.isStarting && - torController.isConnected && - torController.isBootstrapped && - !torController.isRestarting) { - getString(formatStringRes, yesString) - } else { - getString(formatStringRes, noString) - } - } - - requirePreference<Preference>(R.string.pref_key_tor_network_settings_state).apply { - val formatStringRes = R.string.preferences_tor_network_settings_state - - title = if (torController.isRestarting) { - getString(formatStringRes, - getString( - R - .string - .preferences_tor_network_settings_restarting - ) - ) - } else if (torController.isStarting) { - getString(formatStringRes, - getString( - R - .string - .preferences_tor_network_settings_connecting - ) - ) - } else if (torController.isConnected) { - getString(formatStringRes, - getString( - R - .string - .preferences_tor_network_settings_connected - ) - ) - } else { - getString(formatStringRes, - getString( - R - .string - .preferences_tor_network_settings_disconnected - ) - ) - } - } - } - - override fun onStop() { - super.onStop() - requireContext().components.torController.unregisterTorListener(this) - } - - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - setPreferencesFromResource(R.xml.tor_network_settings_preferences, rootKey) - } - - @SuppressWarnings("EmptyFunctionBlock") - override fun onTorConnecting() { - } - - @SuppressWarnings("EmptyFunctionBlock") - override fun onTorConnected() { - } - - @SuppressWarnings("EmptyFunctionBlock") - override fun onTorStopped() { - } - - override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) { - setStatus() - } -} ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorBootstrapFragment.kt ===================================== @@ -19,6 +19,7 @@ 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 @@ -182,7 +183,9 @@ class TorBootstrapFragment : Fragment() { private fun openTorNetworkSettings() { val directions = - TorBootstrapFragmentDirections.actionTorbootstrapFragmentToTorNetworkSettingsFragment() + TorBootstrapFragmentDirections.actionTorbootstrapFragmentToSettingsFragment( + requireContext().getString(R.string.pref_key_connection) + ) findNavController().navigate(directions) } ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistFragment.kt ===================================== @@ -147,7 +147,7 @@ class TorConnectionAssistFragment : Fragment() { getString(R.string.connection_assist_configure_connection_button) binding.torBootstrapButton2.setOnClickListener { viewModel.cancelTorBootstrap() - openTorNetworkSettings() + openTorConnectionSettings() } } @@ -235,7 +235,7 @@ class TorConnectionAssistFragment : Fragment() { binding.torBootstrapButton2.text = getString(R.string.connection_assist_configure_connection_button) binding.torBootstrapButton2.setOnClickListener { - openTorNetworkSettings() + openTorConnectionSettings() } } @@ -376,9 +376,11 @@ class TorConnectionAssistFragment : Fragment() { ) } - private fun openTorNetworkSettings() { + private fun openTorConnectionSettings() { findNavController().navigate( - TorConnectionAssistFragmentDirections.actionTorConnectionAssistFragmentToTorNetworkSettings(), + TorConnectionAssistFragmentDirections.actionTorConnectionAssistFragmentToSettingsFragment( + requireContext().getString(R.string.pref_key_connection) + ), ) } } ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorController.kt ===================================== @@ -17,6 +17,10 @@ class TorError( var details: String ) { } +interface TorLogs { + fun onLog(type: String?, message: String?) +} + internal enum class TorStatus(val status: String) { OFF("OFF"), STARTING("STARTING"), @@ -68,6 +72,9 @@ interface TorController: TorEvents { fun registerTorListener(l: TorEvents) fun unregisterTorListener(l: TorEvents) + fun registerTorLogListener(l: TorLogs) + fun unregisterTorLogListener(l: TorLogs) + fun initiateTorBootstrap(lifecycleScope: LifecycleCoroutineScope? = null, withDebugLogging: Boolean = false) fun stopTor() fun setTorStopped() ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerGV.kt ===================================== @@ -8,6 +8,7 @@ import mozilla.components.browser.engine.gecko.GeckoEngine import org.mozilla.fenix.ext.components import org.mozilla.geckoview.TorIntegrationAndroid import org.mozilla.geckoview.TorIntegrationAndroid.BootstrapStateChangeListener +import org.mozilla.geckoview.TorIntegrationAndroid.TorLogListener import org.mozilla.geckoview.TorSettings import org.mozilla.geckoview.TorSettings.BridgeBuiltinType import org.mozilla.geckoview.TorSettings.BridgeSource @@ -46,11 +47,12 @@ internal enum class TorConnectState(val state: String) { class TorControllerGV( private val context: Context, -) : TorController, TorEvents, BootstrapStateChangeListener { +) : TorController, TorEvents, BootstrapStateChangeListener, TorLogListener { private val TAG = "TorControllerGV" private var torListeners = mutableListOf<TorEvents>() + private var torLogListeners = mutableListOf<TorLogs>() internal var lastKnownStatus = TorConnectState.Initial internal var lastKnownError: TorError? = null @@ -146,10 +148,12 @@ class TorControllerGV( override fun start() { getTorIntegration().registerBootstrapStateChangeListener(this) + getTorIntegration().registerLogListener(this) } override fun stop() { getTorIntegration().unregisterBootstrapStateChangeListener(this) + getTorIntegration().unregisterLogListener(this) } // TorEvents @@ -180,6 +184,13 @@ class TorControllerGV( } } + override fun onLog(type: String?, message: String?) { + synchronized(torLogListeners) { + entries.add(Pair(type, message)) + torLogListeners.toList().forEach { it.onLog(type, message) } + } + } + override fun registerTorListener(l: TorEvents) { synchronized(torListeners) { if (torListeners.contains(l)) { @@ -198,6 +209,23 @@ class TorControllerGV( } } + override fun registerTorLogListener(l: TorLogs) { + synchronized(torLogListeners) { + if (torLogListeners.contains(l)) { + return + } + torLogListeners.add(l) + } + } + override fun unregisterTorLogListener(l: TorLogs) { + synchronized(torLogListeners) { + if (!torLogListeners.contains(l)) { + return + } + torLogListeners.remove(l) + } + } + override fun initiateTorBootstrap( lifecycleScope: LifecycleCoroutineScope?, withDebugLogging: Boolean, @@ -284,7 +312,6 @@ class TorControllerGV( onTorConnecting() } - entries.add(Pair(status, lastKnownStatus.toTorStatus().status)) onTorStatusUpdate(status, lastKnownStatus.toTorStatus().status, progress) } ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerTAS.kt ===================================== @@ -211,6 +211,9 @@ class TorControllerTAS (private val context: Context): TorController { } } + override fun registerTorLogListener(l: TorLogs) {} + override fun unregisterTorLogListener(l: TorLogs) {} + private fun handlePendingRegistrationChanges() { pendingRegisterChangeList.forEach { if (it.second) { ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorLogsFragment.kt ===================================== @@ -0,0 +1,79 @@ +package org.mozilla.fenix.tor + +import android.os.Bundle +import android.text.method.ScrollingMovementMethod +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import org.mozilla.fenix.R +import org.mozilla.fenix.components.Components +import org.mozilla.fenix.databinding.FragmentHomeBinding +import org.mozilla.fenix.databinding.FragmentTorConnectionAssistBinding +import org.mozilla.fenix.databinding.TorBootstrapLoggerBinding +import org.mozilla.fenix.databinding.TorNetworkSettingsBetaConnectionFeaturesBinding +import org.mozilla.fenix.ext.components +import org.mozilla.fenix.ext.requireComponents +import org.mozilla.fenix.tor.view.TorBootstrapLoggerViewHolder + +class TorLogsFragment(): Fragment(), TorLogs { + + private var entries = mutableListOf<String>() + internal var _binding: TorBootstrapLoggerBinding? = null + private val binding get() = _binding!! + + private var _components: Components? = null + private val components get() = _components!! + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View { + _binding = TorBootstrapLoggerBinding.inflate(inflater) + _components = requireComponents + + components.torController.registerTorLogListener(this) + + val currentEntries = components.torController.logEntries + .filter { it.second != null } + .filter { !(it.second!!.startsWith("Circuit") && it.first == "ON") } + // Keep synchronized with format in onTorStatusUpdate + .flatMap { listOf("(${it.first}) '${it.second}'") } + val entriesLen = currentEntries.size + val subListOffset = if (entriesLen > TorBootstrapLoggerViewHolder.MAX_NEW_ENTRIES) TorBootstrapLoggerViewHolder.MAX_NEW_ENTRIES else entriesLen + entries = currentEntries.subList((entriesLen - subListOffset), entriesLen) as MutableList<String> + val initLog = "---------------" + getString(R.string.tor_initializing_log) + "---------------" + entries.add(0, initLog) + + with(binding.torBootstrapLogEntries) { + movementMethod = ScrollingMovementMethod() + text = formatLogEntries(entries) + } + + + return binding.root + } + + // TODO on destroy unregiuster + + private fun formatLogEntries(entries: List<String>) = entries.joinToString("\n") + + override fun onLog(type: String?, message: String?) { + if (message == null || type == null) return + if (type == "ON" && type.startsWith("Circuit")) return + + if (entries.size > TorBootstrapLoggerViewHolder.MAX_LINES) { + entries = entries.drop(1) as MutableList<String> + } + entries.add("($type) '$message'") + + binding.torBootstrapLogEntries.text = formatLogEntries(entries) + } + + override fun onStop() { + super.onStop() + components.torController.unregisterTorLogListener(this) + } + +} ===================================== fenix/app/src/main/res/navigation/nav_graph.xml ===================================== @@ -239,13 +239,6 @@ android:name="scrollToCollection" android:defaultValue="false" app:argType="boolean" /> - <action - android:id="@+id/action_homeFragment_to_torNetworkSettingsFragment" - app:destination="@id/torNetworkSettingsFragment" - app:enterAnim="@anim/slide_in_right" - app:exitAnim="@anim/slide_out_left" - app:popEnterAnim="@anim/slide_in_left" - app:popExitAnim="@anim/slide_out_right" /> </fragment> <fragment @@ -269,12 +262,13 @@ app:popUpTo="@id/torbootstrapFragment" app:popUpToInclusive="true" /> <action - android:id="@+id/action_torbootstrapFragment_to_torNetworkSettingsFragment" - app:destination="@id/torNetworkSettingsFragment" + android:id="@+id/action_torbootstrapFragment_to_SettingsFragment" + app:destination="@id/settingsFragment" app:enterAnim="@anim/slide_in_right" app:exitAnim="@anim/slide_out_left" app:popEnterAnim="@anim/slide_in_left" app:popExitAnim="@anim/slide_out_right" /> + </fragment> <fragment @@ -294,8 +288,8 @@ app:popEnterAnim="@anim/slide_in_left" app:popExitAnim="@anim/slide_out_right" /> <action - android:id="@+id/action_torConnectionAssistFragment_to_TorNetworkSettings" - app:destination="@id/torNetworkSettingsFragment" + android:id="@+id/action_torConnectionAssistFragment_to_TorConnectionSettings" + app:destination="@id/settingsFragment" app:enterAnim="@anim/slide_in_right" app:exitAnim="@anim/slide_out_left" app:popEnterAnim="@anim/slide_in_left" @@ -702,8 +696,22 @@ app:popEnterAnim="@anim/slide_in_left" app:popExitAnim="@anim/slide_out_right" /> <action - android:id="@+id/action_settingsFragment_to_torNetworkSettingsFragment" - app:destination="@id/torNetworkSettingsFragment" + android:id="@+id/action_settingsFragment_to_torBridgeConfigFragment" + app:destination="@id/torBridgeConfigFragment" + app:enterAnim="@anim/slide_in_right" + app:exitAnim="@anim/slide_out_left" + app:popEnterAnim="@anim/slide_in_left" + app:popExitAnim="@anim/slide_out_right" /> + <action + android:id="@+id/action_settingsFragment_to_torLogsFragment" + app:destination="@+id/torLogsFragment" + app:enterAnim="@anim/slide_in_right" + app:exitAnim="@anim/slide_out_left" + app:popEnterAnim="@anim/slide_in_left" + app:popExitAnim="@anim/slide_out_right" /> + <action + android:id="@+id/action_settingsFragment_to_BetaConnectionFeaturesFragment" + app:destination="@+id/torBetaConnectionFeaturesFragment" app:enterAnim="@anim/slide_in_right" app:exitAnim="@anim/slide_out_left" app:popEnterAnim="@anim/slide_in_left" @@ -965,24 +973,6 @@ android:id="@+id/sponsoredStoriesSettings" android:name="org.mozilla.fenix.settings.SponsoredStoriesSettingsFragment" android:label="@string/preferences_debug_settings_custom_sponsored_stories_parameters" /> - <fragment - android:id="@+id/torNetworkSettingsFragment" - android:name="org.mozilla.fenix.settings.TorNetworkSettingsFragment"> - <action - android:id="@+id/action_torNetworkSettingsFragment_to_torBridgeConfigFragment" - app:destination="@id/torBridgeConfigFragment" - app:enterAnim="@anim/slide_in_right" - app:exitAnim="@anim/slide_out_left" - app:popEnterAnim="@anim/slide_in_left" - app:popExitAnim="@anim/slide_out_right" /> - <action - android:id="@+id/action_torNetworkSettingsFragment_to_BetaConnectionFeaturesFragment" - app:destination="@+id/torBetaConnectionFeaturesFragment" - app:enterAnim="@anim/slide_in_right" - app:exitAnim="@anim/slide_out_left" - app:popEnterAnim="@anim/slide_in_left" - app:popExitAnim="@anim/slide_out_right" /> - </fragment> <fragment android:id="@+id/torBridgeConfigFragment" android:name="org.mozilla.fenix.settings.TorBridgeConfigFragment" @@ -993,6 +983,11 @@ 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.TorLogsFragment" + android:label="Tor Logs" + tools:layout="@layout/tor_bootstrap_logger" /> <fragment android:id="@+id/trackingProtectionFragment" ===================================== fenix/app/src/main/res/values/preference_keys.xml ===================================== @@ -14,6 +14,8 @@ <string name="pref_key_accessibility" translatable="false">pref_key_accessibility</string> <string name="pref_key_accessibility_auto_size" translatable="false">pref_key_accessibility_auto_size</string> <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_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> @@ -373,10 +375,10 @@ <string name="pref_key_tor_security_level_safer_option" translatable="false">pref_key_tor_security_level_safer_option</string> <string name="pref_key_tor_security_level_safest_option" translatable="false">pref_key_tor_security_level_safest_option</string> - <string name="pref_key_tor_network_settings" translatable="false">pref_key_tor_network_settings</string> <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_tor_network_settings_bridge_config_explanation" translatable="false">pref_key_tor_network_settings_bridge_config_explanation</string> ===================================== fenix/app/src/main/res/values/torbrowser_strings.xml ===================================== @@ -31,6 +31,7 @@ <string name="tor_explore_privately">Explore. Privately.</string> + <string name="preferences_tor_connection_settings_title">Connection</string> <string name="preferences_tor_network_settings">Tor Network</string> <string name="preferences_tor_network_settings_explanation">Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world.</string> <string name="preferences_tor_network_settings_bridge_config">Config Bridge</string> @@ -57,6 +58,8 @@ <string name="preferences_tor_network_settings_connected">Connected</string> <string name="preferences_tor_network_settings_restarting">Restarting</string> <string name="preferences_tor_network_settings_bridges_enabled">Bridges are enabled: %s</string> + <string name="preferences_tor_logs">Tor Logs</string> + <string name="preferences_tor_logs_description">View and copy your Tor logs</string> <!-- Preference title for security level settings --> <string name="preferences_tor_security_level_settings">Security Settings</string> ===================================== fenix/app/src/main/res/xml/preferences.xml ===================================== @@ -93,6 +93,7 @@ <androidx.preference.PreferenceCategory android:title="@string/preferences_category_privacy_security" + android:key="@string/pref_key_privacy" android:layout="@layout/preference_category_no_icon_style"> <androidx.preference.Preference @@ -117,11 +118,6 @@ android:title="@string/preferences_cookie_banner_reduction" app:isPreferenceVisible="false" /> - <androidx.preference.Preference - android:key="@string/pref_key_tor_network_settings" - app:iconSpaceReserved="false" - android:title="@string/preferences_tor_network_settings" /> - <androidx.preference.Preference android:key="@string/pref_key_tracking_protection_settings" app:iconSpaceReserved="false" @@ -156,6 +152,41 @@ </androidx.preference.PreferenceCategory> + <!-- title="@string/preferences_category_advanced" + key="@string/pref_key_advanced"--> + <PreferenceCategory + android:title="@string/preferences_tor_connection_settings_title" + android:key="@string/pref_key_connection" + android:layout="@layout/preference_category_no_icon_style"> + + <Preference + android:key="@string/pref_key_tor_network_settings_explanation" + app:iconSpaceReserved="false" + android:title="@string/preferences_tor_network_settings_explanation" /> + + <Preference + android:key="@string/pref_key_tor_network_settings_bridge_config" + app:iconSpaceReserved="false" + android:title="@string/preferences_tor_network_settings_bridge_config" + android:summary="@string/preferences_tor_network_settings_bridge_config_description" /> + + <Preference + android:key="@string/pref_key_use_new_bootstrap" + app:iconSpaceReserved="false" + android:title="Enable beta connection features" /> + + <Preference + android:key="@string/pref_key_tor_logs" + app:iconSpaceReserved="false" + android:title="@string/preferences_tor_logs" + android:summary="@string/preferences_tor_logs_description" /> + + <!-- Auto connect --> + + <!-- Tor Logs --> + + </PreferenceCategory> + <PreferenceCategory android:title="@string/preferences_category_advanced" android:key="@string/pref_key_advanced" ===================================== fenix/app/src/main/res/xml/tor_network_settings_preferences.xml deleted ===================================== @@ -1,35 +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.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> - <Preference - android:key="@string/pref_key_tor_network_settings_explanation" - android:title="@string/preferences_tor_network_settings_explanation" /> - <androidx.preference.PreferenceCategory - android:key="@string/pref_key_tor_network_settings_status" - android:title="@string/preferences_tor_network_settings_status" - app:iconSpaceReserved="false" - android:layout="@layout/preference_cat_style" > - <Preference - android:key="@string/pref_key_tor_network_settings_tor_ready" - android:title="@string/preferences_tor_network_settings_tor_ready" /> - <Preference - android:key="@string/pref_key_tor_network_settings_state" - android:title="@string/preferences_tor_network_settings_state" /> - <Preference - android:key="@string/pref_key_tor_network_settings_bridges_enabled" - android:title="@string/preferences_tor_network_settings_bridges_enabled" /> - </androidx.preference.PreferenceCategory> - <Preference - android:icon="@drawable/ic_tor_config_bridge" - android:key="@string/pref_key_tor_network_settings_bridge_config" - android:title="@string/preferences_tor_network_settings_bridge_config" - android:summary="@string/preferences_tor_network_settings_bridge_config_description" - app:allowDividerAbove="true" /> - <Preference - android:key="@string/pref_key_use_new_bootstrap" - android:title="Enable beta connection features" - app:allowDividerAbove="true" /> - -</androidx.preference.PreferenceScreen> View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/dd7… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/dd7… 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.9.0esr-13.5-1] fixup! Bug 40925: Implemented the Security Level component
by Pier Angelo Vendrame (@pierov) 27 Mar '24

27 Mar '24
Pier Angelo Vendrame pushed to branch mullvad-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser Commits: a6c43d7e by Pier Angelo Vendrame at 2024-03-27T14:34:53+01:00 fixup! Bug 40925: Implemented the Security Level component Bug 42481: Modularize SecurityLevel. - - - - - 5 changed files: - browser/components/securitylevel/content/securityLevel.js - toolkit/components/search/SearchEngine.sys.mjs - toolkit/components/securitylevel/SecurityLevel.jsm → toolkit/components/securitylevel/SecurityLevel.sys.mjs - toolkit/components/securitylevel/components.conf - toolkit/components/securitylevel/moz.build Changes: ===================================== browser/components/securitylevel/content/securityLevel.js ===================================== @@ -2,11 +2,9 @@ /* global AppConstants, Services, openPreferences, XPCOMUtils */ -ChromeUtils.defineModuleGetter( - this, - "SecurityLevelPrefs", - "resource://gre/modules/SecurityLevel.jsm" -); +ChromeUtils.defineESModuleGetters(this, { + SecurityLevelPrefs: "resource://gre/modules/SecurityLevel.sys.mjs", +}); /* Security Level Button Code ===================================== toolkit/components/search/SearchEngine.sys.mjs ===================================== @@ -12,14 +12,9 @@ const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { NimbusFeatures: "resource://nimbus/ExperimentAPI.sys.mjs", SearchUtils: "resource://gre/modules/SearchUtils.sys.mjs", + SecurityLevelPrefs: "resource://gre/modules/SecurityLevel.sys.mjs", }); -ChromeUtils.defineModuleGetter( - lazy, - "SecurityLevelPrefs", - "resource://gre/modules/SecurityLevel.jsm" -); - const BinaryInputStream = Components.Constructor( "@mozilla.org/binaryinputstream;1", "nsIBinaryInputStream", ===================================== toolkit/components/securitylevel/SecurityLevel.jsm → toolkit/components/securitylevel/SecurityLevel.sys.mjs ===================================== @@ -1,17 +1,10 @@ -"use strict"; - -var EXPORTED_SYMBOLS = ["SecurityLevel", "SecurityLevelPrefs"]; - -const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"); -const { ConsoleAPI } = ChromeUtils.import("resource://gre/modules/Console.jsm"); +import { ConsoleAPI } from "resource://gre/modules/Console.sys.mjs"; const lazy = {}; -ChromeUtils.defineModuleGetter( - lazy, - "ExtensionParent", - "resource://gre/modules/ExtensionParent.jsm" -); +ChromeUtils.defineESModuleGetters(lazy, { + ExtensionParent: "resource://gre/modules/ExtensionParent.sys.mjs", +}); const logger = new ConsoleAPI({ maxLogLevel: "info", @@ -275,6 +268,7 @@ var initializeNoScriptControl = () => { // bind NoScript settings to the browser.security_level.security_slider // (see noscript-control.js). /* eslint-disable */ +// prettier-ignore const kSecuritySettings = { // Preference name : [0, 1-high 2-m 3-m 4-low] "javascript.options.ion" : [, false, false, false, true ], @@ -439,7 +433,7 @@ function migratePreferences() { } // This class is used to initialize the security level stuff at the startup -class SecurityLevel { +export class SecurityLevel { QueryInterface = ChromeUtils.generateQI(["nsIObserver"]); init() { @@ -460,7 +454,7 @@ class SecurityLevel { Getters and Setters for relevant torbutton prefs */ -const SecurityLevelPrefs = { +export const SecurityLevelPrefs = { SecurityLevels: Object.freeze({ safest: 1, safer: 2, ===================================== toolkit/components/securitylevel/components.conf ===================================== @@ -4,7 +4,7 @@ Classes = [ "contract_ids": [ "@torproject.org/security-level;1", ], - "jsm": "resource://gre/modules/SecurityLevel.jsm", + "esModule": "resource://gre/modules/SecurityLevel.sys.mjs", "constructor": "SecurityLevel", } ] ===================================== toolkit/components/securitylevel/moz.build ===================================== @@ -1,5 +1,5 @@ EXTRA_JS_MODULES += [ - "SecurityLevel.jsm", + "SecurityLevel.sys.mjs", ] XPCOM_MANIFESTS += [ View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/a6c… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/a6c… 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.9.0esr-13.5-1] fixup! Bug 40925: Implemented the Security Level component
by Pier Angelo Vendrame (@pierov) 27 Mar '24

27 Mar '24
Pier Angelo Vendrame pushed to branch base-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: b0ff311a by Pier Angelo Vendrame at 2024-03-27T14:34:08+01:00 fixup! Bug 40925: Implemented the Security Level component Bug 42481: Modularize SecurityLevel. - - - - - 5 changed files: - browser/components/securitylevel/content/securityLevel.js - toolkit/components/search/SearchEngine.sys.mjs - toolkit/components/securitylevel/SecurityLevel.jsm → toolkit/components/securitylevel/SecurityLevel.sys.mjs - toolkit/components/securitylevel/components.conf - toolkit/components/securitylevel/moz.build Changes: ===================================== browser/components/securitylevel/content/securityLevel.js ===================================== @@ -2,11 +2,9 @@ /* global AppConstants, Services, openPreferences, XPCOMUtils */ -ChromeUtils.defineModuleGetter( - this, - "SecurityLevelPrefs", - "resource://gre/modules/SecurityLevel.jsm" -); +ChromeUtils.defineESModuleGetters(this, { + SecurityLevelPrefs: "resource://gre/modules/SecurityLevel.sys.mjs", +}); /* Security Level Button Code ===================================== toolkit/components/search/SearchEngine.sys.mjs ===================================== @@ -12,14 +12,9 @@ const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { NimbusFeatures: "resource://nimbus/ExperimentAPI.sys.mjs", SearchUtils: "resource://gre/modules/SearchUtils.sys.mjs", + SecurityLevelPrefs: "resource://gre/modules/SecurityLevel.sys.mjs", }); -ChromeUtils.defineModuleGetter( - lazy, - "SecurityLevelPrefs", - "resource://gre/modules/SecurityLevel.jsm" -); - const BinaryInputStream = Components.Constructor( "@mozilla.org/binaryinputstream;1", "nsIBinaryInputStream", ===================================== toolkit/components/securitylevel/SecurityLevel.jsm → toolkit/components/securitylevel/SecurityLevel.sys.mjs ===================================== @@ -1,17 +1,10 @@ -"use strict"; - -var EXPORTED_SYMBOLS = ["SecurityLevel", "SecurityLevelPrefs"]; - -const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"); -const { ConsoleAPI } = ChromeUtils.import("resource://gre/modules/Console.jsm"); +import { ConsoleAPI } from "resource://gre/modules/Console.sys.mjs"; const lazy = {}; -ChromeUtils.defineModuleGetter( - lazy, - "ExtensionParent", - "resource://gre/modules/ExtensionParent.jsm" -); +ChromeUtils.defineESModuleGetters(lazy, { + ExtensionParent: "resource://gre/modules/ExtensionParent.sys.mjs", +}); const logger = new ConsoleAPI({ maxLogLevel: "info", @@ -263,6 +256,7 @@ var initializeNoScriptControl = () => { // bind NoScript settings to the browser.security_level.security_slider // (see noscript-control.js). /* eslint-disable */ +// prettier-ignore const kSecuritySettings = { // Preference name : [0, 1-high 2-m 3-m 4-low] "javascript.options.ion" : [, false, false, false, true ], @@ -427,7 +421,7 @@ function migratePreferences() { } // This class is used to initialize the security level stuff at the startup -class SecurityLevel { +export class SecurityLevel { QueryInterface = ChromeUtils.generateQI(["nsIObserver"]); init() { @@ -448,7 +442,7 @@ class SecurityLevel { Getters and Setters for relevant torbutton prefs */ -const SecurityLevelPrefs = { +export const SecurityLevelPrefs = { SecurityLevels: Object.freeze({ safest: 1, safer: 2, ===================================== toolkit/components/securitylevel/components.conf ===================================== @@ -4,7 +4,7 @@ Classes = [ "contract_ids": [ "@torproject.org/security-level;1", ], - "jsm": "resource://gre/modules/SecurityLevel.jsm", + "esModule": "resource://gre/modules/SecurityLevel.sys.mjs", "constructor": "SecurityLevel", } ] ===================================== toolkit/components/securitylevel/moz.build ===================================== @@ -1,5 +1,5 @@ EXTRA_JS_MODULES += [ - "SecurityLevel.jsm", + "SecurityLevel.sys.mjs", ] XPCOM_MANIFESTS += [ View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/b0ff311… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/b0ff311… 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.9.0esr-13.5-1] 2 commits: fixup! Add TorStrings module for localization
by Pier Angelo Vendrame (@pierov) 27 Mar '24

27 Mar '24
Pier Angelo Vendrame pushed to branch tor-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 41d01e49 by Pier Angelo Vendrame at 2024-03-27T10:04:05+01:00 fixup! Add TorStrings module for localization Bug 42481: Modularize SecurityLevel. - - - - - 494af376 by Pier Angelo Vendrame at 2024-03-27T10:07:34+01:00 fixup! Bug 40925: Implemented the Security Level component Bug 42481: Modularize SecurityLevel. - - - - - 6 changed files: - browser/components/securitylevel/content/securityLevel.js - toolkit/components/search/SearchEngine.sys.mjs - toolkit/components/securitylevel/SecurityLevel.jsm → toolkit/components/securitylevel/SecurityLevel.sys.mjs - toolkit/components/securitylevel/components.conf - toolkit/components/securitylevel/moz.build - toolkit/modules/TorStrings.sys.mjs Changes: ===================================== browser/components/securitylevel/content/securityLevel.js ===================================== @@ -2,11 +2,9 @@ /* global AppConstants, Services, openPreferences, XPCOMUtils */ -ChromeUtils.defineModuleGetter( - this, - "SecurityLevelPrefs", - "resource://gre/modules/SecurityLevel.jsm" -); +ChromeUtils.defineESModuleGetters(this, { + SecurityLevelPrefs: "resource://gre/modules/SecurityLevel.sys.mjs", +}); /* Security Level Button Code ===================================== toolkit/components/search/SearchEngine.sys.mjs ===================================== @@ -12,14 +12,9 @@ const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { NimbusFeatures: "resource://nimbus/ExperimentAPI.sys.mjs", SearchUtils: "resource://gre/modules/SearchUtils.sys.mjs", + SecurityLevelPrefs: "resource://gre/modules/SecurityLevel.sys.mjs", }); -ChromeUtils.defineModuleGetter( - lazy, - "SecurityLevelPrefs", - "resource://gre/modules/SecurityLevel.jsm" -); - const BinaryInputStream = Components.Constructor( "@mozilla.org/binaryinputstream;1", "nsIBinaryInputStream", ===================================== toolkit/components/securitylevel/SecurityLevel.jsm → toolkit/components/securitylevel/SecurityLevel.sys.mjs ===================================== @@ -1,17 +1,10 @@ -"use strict"; - -var EXPORTED_SYMBOLS = ["SecurityLevel", "SecurityLevelPrefs"]; - -const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"); -const { ConsoleAPI } = ChromeUtils.import("resource://gre/modules/Console.jsm"); +import { ConsoleAPI } from "resource://gre/modules/Console.sys.mjs"; const lazy = {}; -ChromeUtils.defineModuleGetter( - lazy, - "ExtensionParent", - "resource://gre/modules/ExtensionParent.jsm" -); +ChromeUtils.defineESModuleGetters(lazy, { + ExtensionParent: "resource://gre/modules/ExtensionParent.sys.mjs", +}); const logger = new ConsoleAPI({ maxLogLevel: "info", @@ -263,6 +256,7 @@ var initializeNoScriptControl = () => { // bind NoScript settings to the browser.security_level.security_slider // (see noscript-control.js). /* eslint-disable */ +// prettier-ignore const kSecuritySettings = { // Preference name : [0, 1-high 2-m 3-m 4-low] "javascript.options.ion" : [, false, false, false, true ], @@ -427,7 +421,7 @@ function migratePreferences() { } // This class is used to initialize the security level stuff at the startup -class SecurityLevel { +export class SecurityLevel { QueryInterface = ChromeUtils.generateQI(["nsIObserver"]); init() { @@ -448,7 +442,7 @@ class SecurityLevel { Getters and Setters for relevant torbutton prefs */ -const SecurityLevelPrefs = { +export const SecurityLevelPrefs = { SecurityLevels: Object.freeze({ safest: 1, safer: 2, ===================================== toolkit/components/securitylevel/components.conf ===================================== @@ -4,7 +4,7 @@ Classes = [ "contract_ids": [ "@torproject.org/security-level;1", ], - "jsm": "resource://gre/modules/SecurityLevel.jsm", + "esModule": "resource://gre/modules/SecurityLevel.sys.mjs", "constructor": "SecurityLevel", } ] ===================================== toolkit/components/securitylevel/moz.build ===================================== @@ -1,5 +1,5 @@ EXTRA_JS_MODULES += [ - "SecurityLevel.jsm", + "SecurityLevel.sys.mjs", ] XPCOM_MANIFESTS += [ ===================================== toolkit/modules/TorStrings.sys.mjs ===================================== @@ -3,10 +3,7 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"); -const { AppConstants } = ChromeUtils.import( - "resource://gre/modules/AppConstants.jsm" -); +import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs"; function getLocale() { const locale = Services.locale.appLocaleAsBCP47; View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/9e01b1… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/9e01b1… 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: fixup! Implement Android-native Connection Assist UI
by Dan Ballard (@dan) 26 Mar '24

26 Mar '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: 333d9284 by clairehurst at 2024-03-26T17:06:53-06:00 fixup! Implement Android-native Connection Assist UI - - - - - 86815386 by clairehurst at 2024-03-26T17:06:54-06:00 fixup! Bug 41878: Add standalone Tor Bootstrap - - - - - 99f95c30 by clairehurst at 2024-03-26T17:06:54-06:00 fixup! Add Tor integration and UI - - - - - 12 changed files: - fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.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/java/org/mozilla/fenix/tor/TorController.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerGV.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerTAS.kt - + fenix/app/src/main/res/drawable/connect_broken.xml - + fenix/app/src/main/res/drawable/globe_broken.xml - fenix/app/src/main/res/drawable/tor_bootstrap_background_gradient.xml - fenix/app/src/main/res/layout/fragment_tor_connection_assist.xml - fenix/app/src/main/res/values/colors.xml - fenix/app/src/main/res/values/styles.xml Changes: ===================================== fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt ===================================== @@ -168,6 +168,7 @@ import java.util.Locale import androidx.navigation.fragment.findNavController import mozilla.components.browser.engine.gecko.GeckoEngine import mozilla.components.browser.state.selector.findCustomTab +import org.mozilla.fenix.home.HomeFragment import org.mozilla.geckoview.TorIntegrationAndroid /** @@ -815,6 +816,10 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity, TorIn final override fun onBackPressed() { supportFragmentManager.primaryNavigationFragment?.childFragmentManager?.fragments?.forEach { + if (it is HomeFragment){ + finish() + return + } if (it is UserInteractionHandler && it.onBackPressed()) { return } ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistFragment.kt ===================================== @@ -4,11 +4,19 @@ package org.mozilla.fenix.tor +import android.graphics.Color import android.os.Build import android.os.Bundle +import android.text.SpannableString +import android.text.Spanned +import android.text.TextPaint +import android.text.method.LinkMovementMethod +import android.text.style.ClickableSpan +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.appcompat.content.res.AppCompatResources import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle @@ -22,6 +30,7 @@ import org.mozilla.fenix.ext.hideToolbar class TorConnectionAssistFragment : Fragment() { + private val TAG = "TorConnectionAssistFrag" private var _binding: FragmentTorConnectionAssistBinding? = null private val binding get() = _binding!! @@ -49,13 +58,14 @@ class TorConnectionAssistFragment : Fragment() { lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.torConnectState.collect { - when (it) { - TorConnectState.Initial -> showConfiguring() + viewModel.torConnectState.collect { torConnectState -> + Log.d(TAG, "torConnectState is ${torConnectState.state}") + when (torConnectState) { + TorConnectState.Initial -> showSplash() TorConnectState.Configuring -> showConfiguring() TorConnectState.AutoBootstrapping -> showBootstrapping() TorConnectState.Bootstrapping -> showBootstrapping() - TorConnectState.Error -> TODO() + TorConnectState.Error -> showError() TorConnectState.Bootstrapped -> openHome() TorConnectState.Disabled -> openHome() } @@ -73,59 +83,302 @@ class TorConnectionAssistFragment : Fragment() { } } - viewModel.quickconnectToggle().observe( - viewLifecycleOwner + viewModel.quickstartToggle().observe( + viewLifecycleOwner, ) { - binding.quickstartSwitch.isChecked = it + binding.quickstartSwitch.isChecked = it == true + } + + binding.quickstartSwitch.setOnCheckedChangeListener { _, isChecked -> + viewModel.handleQuickstartChecked(isChecked) } + } + + private fun showSplash() { + binding.torBootstrapProgressBar.visibility = View.GONE + binding.settingsButton.visibility = View.GONE + binding.backButton.visibility = View.GONE + binding.torConnectImage.visibility = View.GONE + binding.titleLargeTextView.visibility = View.GONE + binding.titleDescription.visibility = View.GONE + binding.quickStartDescription.visibility = View.GONE + binding.quickstartSwitch.visibility = View.GONE + binding.torBootstrapButton1.visibility = View.GONE + binding.torBootstrapButton2.visibility = View.GONE + binding.wordmarkLogo.visibility = View.VISIBLE + } + + + private fun showConfiguring() { + binding.wordmarkLogo.visibility = View.GONE + + binding.torBootstrapProgressBar.visibility = View.INVISIBLE + binding.torBootstrapProgressBar.progress = 0 + binding.backButton.visibility = View.INVISIBLE + binding.settingsButton.visibility = View.VISIBLE binding.settingsButton.setOnClickListener { viewModel.cancelTorBootstrap() openSettings() } + binding.torConnectImage.visibility = View.VISIBLE + binding.torConnectImage.setImageResource(R.drawable.connect) + binding.titleLargeTextView.visibility = View.VISIBLE + binding.titleLargeTextView.text = getString(R.string.connection_assist_tor_connect_title) + binding.titleDescription.visibility = View.VISIBLE + binding.titleDescription.text = + getString(R.string.preferences_tor_network_settings_explanation) + binding.quickStartDescription.visibility = View.VISIBLE + binding.quickstartSwitch.visibility = View.VISIBLE + binding.quickstartSwitch.isChecked = viewModel.quickstartToggle().value == true + + binding.unblockTheInternetInCountryDescription.visibility = View.GONE + binding.countryDropDown.visibility = View.GONE - binding.torBootstrapConnectButton.setOnClickListener { + binding.torBootstrapButton1.visibility = View.VISIBLE + binding.torBootstrapButton1.text = getString(R.string.tor_bootstrap_connect) + binding.torBootstrapButton1.setOnClickListener { viewModel.handleConnect(lifecycleScope = lifecycleScope) + showBootstrapping() } - binding.quickstartSwitch.setOnCheckedChangeListener { _, isChecked -> - viewModel.handleQuickstartChecked(isChecked) + binding.torBootstrapButton2.visibility = View.VISIBLE + binding.torBootstrapButton2.text = + getString(R.string.connection_assist_configure_connection_button) + binding.torBootstrapButton2.setOnClickListener { + viewModel.cancelTorBootstrap() + openTorNetworkSettings() } } - private fun showConfiguring() { - binding.torBootstrapConnectButton.visibility = View.VISIBLE - binding.torBootstrapNetworkSettingsButton.text = + private fun showBootstrapping() { + binding.wordmarkLogo.visibility = View.GONE + + binding.torBootstrapProgressBar.visibility = View.VISIBLE + binding.torBootstrapProgressBar.progress = 0 + binding.backButton.visibility = View.INVISIBLE + binding.settingsButton.visibility = View.VISIBLE + binding.settingsButton.setOnClickListener { + viewModel.cancelTorBootstrap() + openSettings() + } + binding.torConnectImage.visibility = View.VISIBLE + binding.torConnectImage.setImageResource(R.drawable.connect) + binding.titleLargeTextView.visibility = View.VISIBLE + binding.titleLargeTextView.text = getString(R.string.connection_assist_connecting_title) + binding.titleDescription.visibility = View.VISIBLE + binding.titleDescription.text = + getString(R.string.preferences_tor_network_settings_explanation) + binding.quickstartSwitch.visibility = View.VISIBLE + binding.quickstartSwitch.isChecked = viewModel.quickstartToggle().value == true + binding.quickstartSwitch.jumpDrawablesToCurrentState() + binding.quickStartDescription.visibility = View.VISIBLE + binding.torBootstrapButton1.visibility = View.INVISIBLE + binding.torBootstrapButton2.visibility = View.VISIBLE + binding.torBootstrapButton2.text = getString(R.string.btn_cancel) + binding.torBootstrapButton2.setOnClickListener { viewModel.cancelTorBootstrap() } + } + + private suspend fun showError() { + viewModel.torError.collect { + Log.d( + TAG, + "TorError: details = ${it?.details ?: "null details"}, message = ${it?.message ?: "null message"}", + ) + when (viewModel.handleError(it)) { + ErrorScreen.CantConnectToInternet -> showCantConnectToInternet() + ErrorScreen.CantConnectToTorDirectly -> showCantConnectToTorDirectly() + ErrorScreen.WeCouldntFindYourLocation -> showWeCouldntFindYourLocation() + ErrorScreen.WereStillHavingTroubleConnecting -> showWereStillHavingTroubleConnecting() + ErrorScreen.WeWerentAbleToConnectAutomatically -> showWeWerentAbleToConnectAutomatically() + null -> { + // no op + Log.d(TAG, "ErrorScreen: null, nothing shown") + } + } + } + } + + private fun showCantConnectToInternet() { + Log.d(TAG, "showCantConnectToInternet()") + binding.torBootstrapProgressBar.visibility = View.VISIBLE + binding.torBootstrapProgressBar.progressTintList = + AppCompatResources.getColorStateList(requireContext(), R.color.warning_yellow) + binding.torBootstrapProgressBar.progress = 100 + + binding.backButton.visibility = View.VISIBLE + binding.backButton.setOnClickListener { + showConfiguring() + } + + binding.torConnectImage.setImageResource(R.drawable.globe_broken) + binding.titleLargeTextView.text = getString(R.string.connection_assist_internet_error_title) + + val learnMore: String = getString(R.string.connection_assist_internet_error_learn_more) + val internetErrorDescription: String = getString( + R.string.connection_assist_internet_error_description, + learnMore, + ) + handleDescriptionWithClickable(internetErrorDescription, learnMore) + + binding.quickStartDescription.visibility = View.GONE + binding.quickstartSwitch.visibility = View.GONE + + binding.torBootstrapButton1.visibility = View.VISIBLE + binding.torBootstrapButton1.text = + getString(R.string.connection_assist_internet_error_try_again) + binding.torBootstrapButton1.setOnClickListener { + showTryingAgain() + viewModel.handleConnect(lifecycleScope = lifecycleScope) + } + + binding.torBootstrapButton2.text = getString(R.string.connection_assist_configure_connection_button) - binding.torBootstrapNetworkSettingsButton.setOnClickListener { + binding.torBootstrapButton2.setOnClickListener { openTorNetworkSettings() } } - private fun showBootstrapping() { - binding.torBootstrapConnectButton.visibility = View.INVISIBLE - binding.torBootstrapNetworkSettingsButton.text = getString(R.string.btn_cancel) - binding.torBootstrapNetworkSettingsButton.setOnClickListener { + private fun showTryingAgain() { + Log.d(TAG, "showTryingAgain()") + binding.torBootstrapProgressBar.progress = 0 + binding.torBootstrapProgressBar.visibility = View.VISIBLE + binding.torBootstrapProgressBar.progressTintList = null + binding.torConnectImage.setImageResource(R.drawable.connect) + binding.titleLargeTextView.text = + getString(R.string.connection_assist_trying_again_waiting_title) + + binding.quickstartSwitch.visibility = View.GONE + binding.quickStartDescription.visibility = View.GONE + binding.torBootstrapButton1.visibility = View.INVISIBLE + binding.torBootstrapButton2.visibility = View.VISIBLE + binding.torBootstrapButton2.text = getString(R.string.btn_cancel) + binding.torBootstrapButton2.setOnClickListener { viewModel.cancelTorBootstrap() + showConfiguring() } } - private fun openSettings(preferenceToScrollTo: String? = null) { - findNavController().navigate( - TorConnectionAssistFragmentDirections - .actionTorConnectionAssistFragmentToSettingsFragment(preferenceToScrollTo), + private fun showCantConnectToTorDirectly() { + Log.d(TAG, "showCantConnectToTorDirectly()") + binding.torBootstrapProgressBar.visibility = View.VISIBLE + binding.torBootstrapProgressBar.progressTintList = + AppCompatResources.getColorStateList(requireContext(), R.color.warning_yellow) + binding.torBootstrapProgressBar.progress = 100 + + binding.backButton.visibility = View.VISIBLE + binding.backButton.setOnClickListener { + showConfiguring() + } + + binding.torConnectImage.setImageResource(R.drawable.globe_broken) + binding.titleLargeTextView.text = + getString(R.string.connection_assist_cant_connect_to_tor_title) + + val learnMore: String = getString(R.string.connection_assist_internet_error_learn_more) + val tryABridge: String = getString( + R.string.connection_assist_try_a_bridge_description, + learnMore, ) + handleDescriptionWithClickable(tryABridge, learnMore) + + binding.quickStartDescription.visibility = View.GONE + binding.quickstartSwitch.visibility = View.GONE + binding.unblockTheInternetInCountryDescription.visibility = View.VISIBLE + binding.countryDropDown.visibility = View.VISIBLE + // TODO implement countryDropDown + + binding.torBootstrapButton1.visibility = View.VISIBLE + binding.torBootstrapButton1.text = getString(R.string.connection_assist_try_a_bridge_button) + binding.torBootstrapButton1.setOnClickListener { + viewModel.tryABridge() + showTryingABridge() + } + binding.torBootstrapButton2.visibility = View.GONE } - private fun openTorNetworkSettings() { - findNavController().navigate( - TorConnectionAssistFragmentDirections - .actionTorConnectionAssistFragmentToTorNetworkSettings(), + private fun showTryingABridge() { + Log.d(TAG, "showTryingABridge()") + // TODO(Not implemented) + binding.torBootstrapButton2.setOnClickListener { + showTryingABridge() + } + } + + private fun showWeCouldntFindYourLocation() { + Log.d(TAG, "showWeCouldntFindYourLocation()") + // TODO(Not implemented) + binding.torBootstrapButton2.setOnClickListener { + showTryingABridge() + } + } + + private fun showWereStillHavingTroubleConnecting() { + Log.d(TAG, "showWereStillHavingTroubleConnecting()") + TODO("Not yet implemented") + } + + private fun showTryingOneMoreTime() { + Log.d(TAG, "showTryingOneMoreTime()") + TODO("Not yet implemented") + } + + private fun showWeWerentAbleToConnectAutomatically() { + Log.d(TAG, "showWeWerentAbleToConnectAutomatically()") + TODO("Not yet implemented") + } + + private fun showUnknownError() { + Log.d(TAG, "showUnknownError()") + TODO("Not yet implemented") + } + + /** + * from https://stackoverflow.com/questions/10696986/how-to-set-the-part-of-the-tex… + */ + private fun handleDescriptionWithClickable(errorDescription: String, learnMore: String) { + val errorDescriptionSpannableString = SpannableString(errorDescription) + val clickableSpan: ClickableSpan = object : ClickableSpan() { + override fun onClick(textView: View) { + showLearnMore() + } + + override fun updateDrawState(drawState: TextPaint) { + super.updateDrawState(drawState) + drawState.isUnderlineText = true + } + } + errorDescriptionSpannableString.setSpan( + clickableSpan, + errorDescription.length - learnMore.length, + errorDescription.length, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE, ) + binding.titleDescription.text = errorDescriptionSpannableString + binding.titleDescription.movementMethod = LinkMovementMethod.getInstance() + binding.titleDescription.highlightColor = Color.TRANSPARENT + } + + private fun showLearnMore() { + //TODO("Not yet implemented") } private fun openHome() { + Log.d(TAG, "openHome()") //This doesn't seem to be ever called findNavController().navigate(TorConnectionAssistFragmentDirections.actionStartupHome()) } + private fun openSettings(preferenceToScrollTo: String? = null) { + findNavController().navigate( + TorConnectionAssistFragmentDirections.actionTorConnectionAssistFragmentToSettingsFragment( + preferenceToScrollTo, + ), + ) + } + + private fun openTorNetworkSettings() { + findNavController().navigate( + TorConnectionAssistFragmentDirections.actionTorConnectionAssistFragmentToTorNetworkSettings(), + ) + } } ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistViewModel.kt ===================================== @@ -26,24 +26,30 @@ class TorConnectionAssistViewModel( private val _torConnectState = MutableStateFlow(TorConnectState.Initial) internal val torConnectState: StateFlow<TorConnectState> = _torConnectState - init { - _torController.registerTorListener(this) - } + private val _torError = MutableStateFlow(_torController.getLastErrorState()) + internal val torError: StateFlow<TorError?> = _torError private val _progress = MutableLiveData(0) fun progress(): LiveData<Int> { return _progress } - private val _quickconnectToggle = MutableLiveData(_torController.quickstart) - fun quickconnectToggle(): LiveData<Boolean> { - return _quickconnectToggle + 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) } fun handleConnect( withDebugLogging: Boolean = false, lifecycleScope: LifecycleCoroutineScope? = null, ) { + Log.d(TAG, "handleConnect initiatingTorBootstrap with lifecycleScope = $lifecycleScope") _torController.initiateTorBootstrap( withDebugLogging = withDebugLogging, lifecycleScope = lifecycleScope, @@ -52,6 +58,7 @@ class TorConnectionAssistViewModel( fun handleQuickstartChecked(checked: Boolean) { _torController.quickstart = checked + _quickStartToggle.value = checked } fun cancelTorBootstrap() { @@ -66,7 +73,6 @@ class TorConnectionAssistViewModel( override fun onTorConnected() { Log.d(TAG, "onTorConnected()") _torController.unregisterTorListener(this) - _torConnectState.value = _torController.lastKnownStatus } override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) { @@ -75,12 +81,32 @@ class TorConnectionAssistViewModel( _progress.value = progress.toInt() } _torConnectState.value = _torController.lastKnownStatus + _torError.value = _torController.getLastErrorState() } override fun onTorStopped() { Log.d(TAG, "onTorStopped()") - _progress.value = 0 - _torConnectState.value = _torController.lastKnownStatus } + internal fun handleError(it: TorError?): ErrorScreen? { + // TODO(Only partly implemented) + if (it?.message == null){ + return null + } + return ErrorScreen.CantConnectToInternet + } + + fun tryABridge() { + // TODO("Try a bridge not enabled") + // connect to bridge based on country + // try connecting + } +} + +internal enum class ErrorScreen { + CantConnectToInternet, + CantConnectToTorDirectly, + WeCouldntFindYourLocation, + WereStillHavingTroubleConnecting, + WeWerentAbleToConnectAutomatically, } ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorController.kt ===================================== @@ -12,6 +12,10 @@ interface TorEvents { fun onTorStatusUpdate(entry: String?, status: String?, progress: Double? = 0.0) fun onTorStopped() } +class TorError( + var message: String, + var details: String +) { } internal enum class TorStatus(val status: String) { OFF("OFF"), @@ -59,6 +63,8 @@ interface TorController: TorEvents { override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) override fun onTorStopped() + fun getLastErrorState() : TorError? + fun registerTorListener(l: TorEvents) fun unregisterTorListener(l: TorEvents) ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerGV.kt ===================================== @@ -53,6 +53,7 @@ class TorControllerGV( private var torListeners = mutableListOf<TorEvents>() internal var lastKnownStatus = TorConnectState.Initial + internal var lastKnownError: TorError? = null private var wasTorBootstrapped = false private var isTorRestarting = false @@ -210,6 +211,7 @@ class TorControllerGV( override fun setTorStopped() { lastKnownStatus = TorConnectState.Configuring + onTorStatusUpdate(null, lastKnownStatus.toString(), 0.0) onTorStopped() } @@ -227,6 +229,10 @@ class TorControllerGV( } } + override fun getLastErrorState() : TorError? { + return lastKnownError + } + // TorEventsBootstrapStateChangeListener -> (lastKnowStatus, TorEvents) // Handle events from GeckoView TorAndroidIntegration and map to TorEvents based events // and state for firefox-android (designed for tor-android-service) @@ -263,7 +269,7 @@ class TorControllerGV( } lastKnownStatus = newState - + onTorStatusUpdate(null, newStateVal, null) } // TorEventsBootstrapStateChangeListener @@ -290,7 +296,7 @@ class TorControllerGV( // TorEventsBootstrapStateChangeListener override fun onBootstrapError(message: String?, details: String?) { - lastKnownStatus = TorConnectState.Error + lastKnownError = TorError(message ?: "", details ?: "") onBootstrapStateChange(TorConnectState.Error.state) } ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerTAS.kt ===================================== @@ -330,4 +330,10 @@ class TorControllerTAS (private val context: Context): TorController { companion object { const val torServiceResponseTimeout = 5000L } + + // Compat with TorControlGV Stubs + + override fun getLastErrorState() : TorError? { + return null; + } } ===================================== fenix/app/src/main/res/drawable/connect_broken.xml ===================================== @@ -0,0 +1,37 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="40dp" + android:height="40dp" + android:viewportWidth="40" + android:viewportHeight="40"> + <group> + <clip-path + android:pathData="M0,0h40v40h-40z"/> + <path + android:pathData="M8.317,5.337C11.521,2.781 15.582,1.253 19.999,1.253C30.352,1.253 38.745,9.647 38.745,20C38.745,24.418 37.218,28.478 34.662,31.681L32.577,29.597C34.611,26.937 35.819,23.611 35.819,20C35.819,11.26 28.739,4.18 19.999,4.18C16.389,4.18 13.063,5.388 10.401,7.421L8.317,5.337Z" + android:fillColor="#FBFBFE"/> + <path + android:pathData="M5.89,7.656C3.002,10.954 1.252,15.273 1.252,20C1.252,28.967 7.545,36.46 15.959,38.307C16.839,38.5 17.732,38.633 18.652,38.693V24.373C16.785,23.8 15.425,22.06 15.425,20C15.425,19.19 15.635,18.43 16.004,17.771L13.887,15.653C13.013,16.88 12.499,18.38 12.499,20C12.499,22.653 13.879,24.987 15.959,26.32V35.293C9.179,33.513 4.179,27.347 4.179,20C4.179,16.08 5.603,12.493 7.963,9.73L5.89,7.656Z" + android:fillColor="#FBFBFE"/> + <path + android:pathData="M16.399,13.419L18.618,15.638C19.054,15.501 19.517,15.427 19.998,15.427C22.525,15.427 24.572,17.473 24.572,20C24.572,20.481 24.498,20.945 24.36,21.38L26.579,23.599C27.165,22.531 27.498,21.304 27.498,20C27.498,15.86 24.138,12.5 19.998,12.5C18.694,12.5 17.468,12.833 16.399,13.419Z" + android:fillColor="#FBFBFE"/> + <path + android:pathData="M24.349,26.112L22.232,23.995C21.954,24.151 21.658,24.278 21.349,24.373V38.693C22.269,38.633 23.162,38.5 24.042,38.307C27.176,37.619 30.015,36.147 32.345,34.109L30.271,32.034C28.492,33.552 26.372,34.681 24.042,35.293V26.32C24.146,26.253 24.249,26.184 24.349,26.112Z" + android:fillColor="#FBFBFE"/> + <path + android:pathData="M30.653,27.67C32.21,25.514 33.127,22.864 33.127,20C33.127,12.753 27.247,6.873 20,6.873C17.138,6.873 14.488,7.791 12.33,9.348L14.437,11.455C16.037,10.412 17.947,9.807 20,9.807C25.634,9.807 30.194,14.367 30.194,20C30.194,22.051 29.587,23.962 28.544,25.562L30.653,27.67Z" + android:fillColor="#FBFBFE"/> + <path + android:pathData="M26.272,28.037L28.357,30.121C27.095,31.163 25.635,31.973 24.041,32.487V29.36C24.844,29.014 25.593,28.568 26.272,28.037Z" + android:fillColor="#FBFBFE"/> + <path + android:pathData="M11.962,13.727L9.878,11.643C8.001,13.914 6.873,16.826 6.873,20C6.873,25.84 10.686,30.787 15.96,32.487V29.36C12.34,27.8 9.806,24.193 9.806,20C9.806,17.633 10.611,15.457 11.962,13.727Z" + android:fillColor="#FBFBFE"/> + <path + android:pathData="M17.922,19.688L20.311,22.077C20.21,22.092 20.105,22.1 19.999,22.1C18.84,22.1 17.899,21.16 17.899,20C17.899,19.894 17.907,19.79 17.922,19.688Z" + android:fillColor="#FBFBFE"/> + <path + android:pathData="M2.89,4.642L35.228,36.98C35.879,37.632 35.879,38.688 35.228,39.339L35.228,39.339C34.576,39.991 33.52,39.991 32.868,39.339L0.53,7.001C-0.121,6.35 -0.121,5.294 0.53,4.642C1.182,3.991 2.238,3.991 2.89,4.642Z" + android:fillColor="#FBFBFE"/> + </group> +</vector> ===================================== fenix/app/src/main/res/drawable/globe_broken.xml ===================================== @@ -0,0 +1,18 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="40dp" + android:height="40dp" + android:viewportWidth="40" + android:viewportHeight="40"> + <path + android:pathData="M4.209,1.999L37.355,35.145L35.145,37.355L1.999,4.209L4.209,1.999Z" + android:fillColor="#FBFBFE" + android:fillType="evenOdd"/> + <path + android:pathData="M7.869,5.703C3.82,9.142 1.25,14.271 1.25,20C1.25,30.03 9.126,38.221 19.031,38.725L19.041,38.733L19.047,38.726C19.363,38.742 19.681,38.75 20,38.75C20.32,38.75 20.638,38.742 20.954,38.726L20.96,38.733L20.97,38.725C26.306,38.453 31.053,35.951 34.297,32.132L32.079,29.913C30.228,32.166 27.759,33.891 24.931,34.831C26.854,32.438 28.243,29.75 29.097,26.931L26.534,24.368C25.642,28.517 23.465,32.438 20,35.474C15.763,31.76 13.451,26.722 13.063,21.563H23.728L20.603,18.438H13.063C13.22,16.35 13.692,14.282 14.479,12.313L12.102,9.936C10.844,12.632 10.12,15.52 9.93,18.438H4.453C4.872,14.209 6.978,10.477 10.087,7.922L7.869,5.703ZM15.069,34.831C11.952,30.951 10.239,26.295 9.93,21.563H4.453C5.07,27.779 9.331,32.924 15.069,34.831Z" + android:fillColor="#FBFBFE" + android:fillType="evenOdd"/> + <path + android:pathData="M13.678,7.093C14.106,6.433 14.569,5.791 15.069,5.169C14.263,5.437 13.486,5.769 12.744,6.159L10.448,3.863C12.985,2.358 15.907,1.434 19.031,1.275L19.041,1.267L19.047,1.274C19.363,1.258 19.681,1.25 20,1.25C20.32,1.25 20.638,1.258 20.954,1.274L20.96,1.267L20.97,1.275C30.875,1.779 38.75,9.97 38.75,20C38.75,23.489 37.798,26.755 36.138,29.553L33.842,27.257C34.752,25.525 35.346,23.601 35.548,21.563H30.071C30.033,22.146 29.974,22.728 29.893,23.308L25.023,18.438H26.938C26.55,13.278 24.238,8.24 20,4.526C18.361,5.963 17.01,7.598 15.947,9.361L13.678,7.093ZM30.071,18.438H35.548C34.931,12.221 30.67,7.076 24.931,5.169C28.049,9.049 29.762,13.705 30.071,18.438Z" + android:fillColor="#FBFBFE" + android:fillType="evenOdd"/> +</vector> ===================================== fenix/app/src/main/res/drawable/tor_bootstrap_background_gradient.xml ===================================== @@ -7,9 +7,9 @@ <shape> <gradient android:angle="225" - android:startColor="#FF7329A4" - android:centerColor="#FF3A3274" - android:endColor="#FF3A3274" + android:startColor="@color/backgroundGradientLight" + android:centerColor="@color/backgroundGradientDark" + android:endColor="@color/backgroundGradientDark" android:type="linear" /> </shape> </item> ===================================== fenix/app/src/main/res/layout/fragment_tor_connection_assist.xml ===================================== @@ -3,29 +3,63 @@ - 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" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/tor_bootstrap_background_gradient"> + android:background="@drawable/tor_bootstrap_background_gradient" + android:paddingBottom="16dp"> <ProgressBar android:id="@+id/tor_bootstrap_progress_bar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="6dp" + android:visibility="invisible" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - <ImageView + <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/settings_button" - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_marginTop="26dp" - android:layout_marginEnd="20dp" - android:contentDescription="@string/settings" + android:layout_width="48dp" + android:layout_height="48dp" + android:layout_marginTop="8dp" + android:layout_marginEnd="8dp" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:srcCompat="@drawable/mozac_ic_settings" /> + app:layout_constraintTop_toTopOf="parent"> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:contentDescription="@string/settings" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@drawable/mozac_ic_settings" /> + </androidx.constraintlayout.widget.ConstraintLayout> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/back_button" + android:layout_width="48dp" + android:layout_height="48dp" + android:layout_marginStart="8dp" + android:layout_marginTop="8dp" + android:visibility="invisible" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:contentDescription="@string/settings" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@drawable/mozac_ic_back" /> + </androidx.constraintlayout.widget.ConstraintLayout> + <ImageView android:id="@+id/tor_connect_image" @@ -45,99 +79,139 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="24dp" - android:layout_marginTop="24dp" android:layout_marginEnd="24dp" android:text="@string/connection_assist_tor_connect_title" android:textColor="#FBFBFE" - android:textFontWeight="400" android:textSize="22sp" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/tor_connect_image" /> + app:layout_constraintTop_toBottomOf="@id/tor_connect_image" + app:layout_constraintVertical_bias="0.03" /> <TextView - android:id="@+id/connect_to_tor_description" + android:id="@+id/title_description" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="24dp" - android:layout_marginTop="16dp" android:layout_marginEnd="24dp" + android:lineSpacingExtra="6dp" android:text="@string/preferences_tor_network_settings_explanation" android:textColor="#FBFBFE" - android:textFontWeight="400" android:textSize="14sp" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/title_large_text_view" /> + app:layout_constraintTop_toBottomOf="@id/title_large_text_view" + app:layout_constraintVertical_bias="0.03" /> + <TextView - android:id="@+id/connect_automatically" - android:layout_width="wrap_content" + android:id="@+id/quick_start_description" + android:layout_width="230dp" android:layout_height="wrap_content" android:layout_marginStart="24dp" - android:layout_marginTop="24dp" android:text="@string/connection_assist_always_connect_automatically_toggle_description" - android:textColor="#80FBFBFE" + android:textColor="#FBFBFE" android:textSize="14sp" - app:layout_constraintBottom_toBottomOf="@+id/quickstart_switch" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="@+id/quickstart_switch" - app:layout_constraintVertical_bias="1.25" /> + app:layout_constraintTop_toBottomOf="@+id/title_description" + app:layout_constraintVertical_bias=".03" /> <androidx.appcompat.widget.SwitchCompat android:id="@+id/quickstart_switch" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="24dp" + android:layout_marginStart="100dp" android:layout_marginEnd="24dp" android:layout_marginBottom="24dp" - android:enabled="false" android:gravity="center" - app:thumbTint="#7D6298" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@id/connect_to_tor_description" + app:layout_constraintHorizontal_bias="0" + app:layout_constraintStart_toEndOf="@+id/quick_start_description" + app:layout_constraintTop_toBottomOf="@id/title_description" + app:layout_constraintVertical_bias=".023" app:layout_goneMarginEnd="6dp" app:layout_goneMarginTop="9dp" /> - <Button - android:id="@+id/tor_bootstrap_connect_button" + <TextView + android:id="@+id/unblock_the_internet_in_country_description" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="24dp" + android:layout_marginTop="24dp" + android:layout_marginEnd="24dp" + android:text="@string/connection_assist_unblock_the_internet_in_country_or_region" + android:textColor="#FBFBFE" + android:visibility="invisible" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/title_description" /> + + <androidx.appcompat.widget.AppCompatSpinner + android:id="@+id/country_drop_down" + style="@style/Widget.AppCompat.Spinner.Underlined" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="24dp" + android:layout_marginTop="8dp" + android:layout_marginEnd="24dp" + android:textColor="#FBFBFE" + android:tooltipText="@string/connection_assist_share_my_location_country_or_region" + android:visibility="invisible" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/unblock_the_internet_in_country_description" /> + + <ImageView + android:id="@+id/wordmarkLogo" + android:layout_width="160dp" + android:layout_height="160dp" + android:src="@mipmap/ic_launcher_round" + + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + android:contentDescription="" /> + + <Button + android:id="@+id/tor_bootstrap_button_1" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="24dp" android:layout_marginEnd="24dp" android:layout_marginBottom="8dp" android:background="@drawable/rounded_corners" android:backgroundTint="@color/connect_button_purple" - android:maxWidth="312dp" + android:minWidth="360dp" android:text="@string/tor_bootstrap_connect" android:textAllCaps="false" android:textColor="#FBFBFE" - android:textFontWeight="500" android:textSize="14sp" android:textStyle="bold" - app:layout_constraintBottom_toTopOf="@id/tor_bootstrap_network_settings_button" + app:layout_constraintBottom_toTopOf="@id/tor_bootstrap_button_2" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/quickstart_switch" app:layout_constraintVertical_bias="1" /> - <Button - android:id="@+id/tor_bootstrap_network_settings_button" - android:layout_width="match_parent" + android:id="@+id/tor_bootstrap_button_2" + android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="24dp" android:layout_marginEnd="24dp" - android:layout_marginBottom="24dp" + android:layout_marginBottom="8dp" android:background="@drawable/rounded_corners" android:backgroundTint="@color/configure_connection_button_white" - android:maxWidth="312dp" + android:minWidth="360dp" android:text="@string/connection_assist_configure_connection_button" android:textAllCaps="false" android:textColor="#15141A" - android:textFontWeight="500" android:textSize="14sp" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" ===================================== fenix/app/src/main/res/values/colors.xml ===================================== @@ -273,6 +273,8 @@ <color name="sync_disconnected_background_private_theme">#5B5846</color> <color name="onboarding_illustration_deselected_private_theme">#99FBFBFE</color> <color name="prompt_login_edit_text_cursor_color_private_theme">@color/photonViolet50</color> + <color name="backgroundGradientDark">#FF3A3274</color> + <color name="backgroundGradientLight">#FF7329A4</color> <!-- Normal theme colors for light mode --> <color name="accent_normal_theme">@color/photonInk20</color> @@ -344,5 +346,6 @@ <!-- Connection Assist --> <color name="connect_button_purple">#9059FF</color> <color name="configure_connection_button_white">#E1E0E7</color> + <color name="warning_yellow">#FFA436</color> </resources> ===================================== fenix/app/src/main/res/values/styles.xml ===================================== @@ -12,7 +12,7 @@ <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item> <item name="android:progressBarStyleHorizontal">@style/progressBarStyleHorizontal</item> <item name="android:statusBarColor">@android:color/transparent</item> - <item name="android:windowBackground">@color/fx_mobile_layer_color_1</item> + <item name="android:windowBackground">@color/backgroundGradientDark</item> <item name="android:colorEdgeEffect">@color/accent_normal_theme</item> <item name="android:colorAccent">@color/fx_mobile_text_color_primary</item> <item name="android:textColorPrimary">@color/state_list_text_color</item> View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/compare/5a… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/compare/5a… 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 Dan Ballard (@dan) 26 Mar '24

26 Mar '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: 5ab6ae0a by clairehurst at 2024-03-25T13:01:48-06:00 fixup! Disable features and functionality - - - - - 1 changed file: - android-components/components/feature/addons/src/main/java/mozilla/components/feature/addons/ui/AddonsManagerAdapter.kt Changes: ===================================== android-components/components/feature/addons/src/main/java/mozilla/components/feature/addons/ui/AddonsManagerAdapter.kt ===================================== @@ -316,7 +316,7 @@ class AddonsManagerAdapter( } // Add recommended section and addons if available - if (recommendedAddons.isNotEmpty()) { + if (false) { // recommendedAddons.isNotEmpty() tor-browser#40502: Do not recommend addons on Tor Browser itemsWithSections.add(Section(R.string.mozac_feature_addons_recommended_section, true)) val filteredRecommendedAddons = recommendedAddons.filter { it.id !in excludedAddonIDs View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/5ab… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/5ab… 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.9.0esr-13.5-1] fixup! Bug 42247: Android helpers for the TorProvider
by Pier Angelo Vendrame (@pierov) 26 Mar '24

26 Mar '24
Pier Angelo Vendrame pushed to branch tor-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 9e01b1a9 by Dan Ballard at 2024-03-26T11:33:26-07:00 fixup! Bug 42247: Android helpers for the TorProvider Bug 41187: Add support for tor logs in android integration - - - - - 4 changed files: - mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorIntegrationAndroid.java - toolkit/components/tor-launcher/TorProvider.sys.mjs - toolkit/components/tor-launcher/TorProviderBuilder.sys.mjs - toolkit/modules/TorAndroidIntegration.sys.mjs Changes: ===================================== mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorIntegrationAndroid.java ===================================== @@ -46,6 +46,7 @@ public class TorIntegrationAndroid implements BundleEventListener { private static final String EVENT_BOOTSTRAP_PROGRESS = "GeckoView:Tor:BootstrapProgress"; private static final String EVENT_BOOTSTRAP_COMPLETE = "GeckoView:Tor:BootstrapComplete"; private static final String EVENT_BOOTSTRAP_ERROR = "GeckoView:Tor:BootstrapError"; + private static final String EVENT_TOR_LOGS = "GeckoView:Tor:Logs"; private static final String EVENT_SETTINGS_READY = "GeckoView:Tor:SettingsReady"; private static final String EVENT_SETTINGS_CHANGED = "GeckoView:Tor:SettingsChanged"; private static final String EVENT_SETTINGS_OPEN = "GeckoView:Tor:OpenSettings"; @@ -118,6 +119,7 @@ public class TorIntegrationAndroid implements BundleEventListener { EVENT_BOOTSTRAP_PROGRESS, EVENT_BOOTSTRAP_COMPLETE, EVENT_BOOTSTRAP_ERROR, + EVENT_TOR_LOGS, EVENT_SETTINGS_OPEN); } @@ -168,6 +170,12 @@ public class TorIntegrationAndroid implements BundleEventListener { for (BootstrapStateChangeListener listener: mBootstrapStateListeners) { listener.onBootstrapError(msg, details); } + } else if (EVENT_TOR_LOGS.equals(event)) { + String msg = message.getString("message"); + String type = message.getString("logType"); + for (TorLogListener listener: mLogListeners) { + listener.onLog(type, msg); + } } else if (EVENT_SETTINGS_OPEN.equals(event)) { for (BootstrapStateChangeListener listener: mBootstrapStateListeners) { listener.onSettingsRequested(); @@ -573,6 +581,10 @@ public class TorIntegrationAndroid implements BundleEventListener { void onSettingsRequested(); } + public interface TorLogListener { + void onLog(String logType, String message); + } + private @NonNull void reloadSettings() { EventDispatcher.getInstance().queryBundle(EVENT_SETTINGS_GET).then( new GeckoResult.OnValueListener<GeckoBundle, Void>() { public GeckoResult<Void> onValue(final GeckoBundle bundle) { @@ -647,4 +659,14 @@ public class TorIntegrationAndroid implements BundleEventListener { } private final HashSet<BootstrapStateChangeListener> mBootstrapStateListeners = new HashSet<>(); + + public void registerLogListener(TorLogListener listener) { + mLogListeners.add(listener); + } + + public void unregisterLogListener(TorLogListener listener) { + mLogListeners.remove(listener); + } + + private final HashSet<TorLogListener> mLogListeners = new HashSet<>(); } ===================================== toolkit/components/tor-launcher/TorProvider.sys.mjs ===================================== @@ -1002,6 +1002,8 @@ export class TorProvider { Services.obs.notifyObservers(null, TorProviderTopics.HasWarnOrErr); } + Services.obs.notifyObservers({ type, msg }, TorProviderTopics.TorLog); + const date = new Date(); const maxEntries = Services.prefs.getIntPref( Preferences.MaxLogEntries, ===================================== toolkit/components/tor-launcher/TorProviderBuilder.sys.mjs ===================================== @@ -12,6 +12,7 @@ export const TorProviderTopics = Object.freeze({ ProcessExited: "TorProcessExited", BootstrapStatus: "TorBootstrapStatus", BootstrapError: "TorBootstrapError", + TorLog: "TorLog", HasWarnOrErr: "TorLogHasWarnOrErr", BridgeChanged: "TorBridgeChanged", CircuitCredentialsMatched: "TorCircuitCredentialsMatched", ===================================== toolkit/modules/TorAndroidIntegration.sys.mjs ===================================== @@ -11,6 +11,7 @@ ChromeUtils.defineESModuleGetters(lazy, { TorConnectTopics: "resource://gre/modules/TorConnect.sys.mjs", TorSettingsTopics: "resource://gre/modules/TorSettings.sys.mjs", TorProviderBuilder: "resource://gre/modules/TorProviderBuilder.sys.mjs", + TorProviderTopics: "resource://gre/modules/TorProviderBuilder.sys.mjs", TorSettings: "resource://gre/modules/TorSettings.sys.mjs", }); @@ -32,6 +33,7 @@ const EmittedEvents = Object.freeze({ bootstrapProgress: "GeckoView:Tor:BootstrapProgress", bootstrapComplete: "GeckoView:Tor:BootstrapComplete", bootstrapError: "GeckoView:Tor:BootstrapError", + torLogs: "GeckoView:Tor:Logs", }); const ListenedEvents = Object.freeze({ @@ -59,6 +61,8 @@ class TorAndroidIntegrationImpl { this.#bootstrapMethodReset(); Services.prefs.addObserver(Prefs.useNewBootstrap, this); + Services.obs.addObserver(this, lazy.TorProviderTopics.TorLog); + for (const topic in lazy.TorConnectTopics) { Services.obs.addObserver(this, lazy.TorConnectTopics[topic]); } @@ -118,6 +122,13 @@ class TorAndroidIntegrationImpl { details: subj.wrappedJSObject.details ?? "", }); break; + case lazy.TorProviderTopics.TorLog: + lazy.EventDispatcher.instance.sendRequest({ + type: EmittedEvents.torLogs, + logType: subj.wrappedJSObject.type ?? "", + message: subj.wrappedJSObject.msg ?? "", + }); + break; case lazy.TorSettingsTopics.Ready: lazy.EventDispatcher.instance.sendRequest({ type: EmittedEvents.settingsReady, View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/9e01b1a… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/9e01b1a… 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.9.0esr-13.5-1] fixup! Bug 40925: Implemented the Security Level component
by richard (@richard) 26 Mar '24

26 Mar '24
richard pushed to branch mullvad-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser Commits: ea97107e by Henry Wilkes at 2024-03-26T17:56:27+00:00 fixup! Bug 40925: Implemented the Security Level component Bug 42214: Drop the securityLevel.properties file. - - - - - 1 changed file: - − browser/locales/en-US/chrome/browser/securityLevel.properties Changes: ===================================== browser/locales/en-US/chrome/browser/securityLevel.properties deleted ===================================== @@ -1,33 +0,0 @@ -# Generic terms -security_level = Security Level -security_level_standard = Standard -security_level_safer = Safer -security_level_safest = Safest -security_level_tooltip_standard = Security Level: Standard -security_level_tooltip_safer = Security Level: Safer -security_level_tooltip_safest = Security Level: Safest -# Shown only for custom level -security_level_custom = Custom -security_level_restore = Restore Defaults -security_level_learn_more = Learn more - -# Panel button that takes the user to the security level settings in -# about:preferences#privacy -security_level_open_settings = Settings… -security_level_change = Change… -security_level_standard_summary = All browser and website features are enabled. -security_level_safer_summary = Disables website features that are often dangerous, causing some sites to lose functionality. -security_level_safest_summary = Only allows website features required for static sites and basic services. These changes affect images, media, and scripts. -security_level_custom_heading = Custom security level configured -security_level_custom_summary = Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels. - -## Security level section in about:preferences#privacy -security_level_overview = Disable certain web features that can be used to attack your security and anonymity. -security_level_list_safer = At the safer setting: -security_level_list_safest = At the safest setting: -# Strings for descriptions -security_level_js_https_only = JavaScript is disabled on non-HTTPS sites. -security_level_js_disabled = JavaScript is disabled by default on all sites. -security_level_limit_typography = Some fonts and math symbols are disabled. -security_level_limit_typography_svg = Some fonts, icons, math symbols, and images are disabled. -security_level_limit_media = Audio and video (HTML5 media), and WebGL are click-to-play. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/ea9… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/ea9… 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.9.0esr-13.5-1] fixup! Bug 40925: Implemented the Security Level component
by richard (@richard) 26 Mar '24

26 Mar '24
richard pushed to branch base-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 601bf763 by Henry Wilkes at 2024-03-26T17:54:31+00:00 fixup! Bug 40925: Implemented the Security Level component Bug 42214: Drop the securityLevel.properties file. - - - - - 1 changed file: - − browser/locales/en-US/chrome/browser/securityLevel.properties Changes: ===================================== browser/locales/en-US/chrome/browser/securityLevel.properties deleted ===================================== @@ -1,33 +0,0 @@ -# Generic terms -security_level = Security Level -security_level_standard = Standard -security_level_safer = Safer -security_level_safest = Safest -security_level_tooltip_standard = Security Level: Standard -security_level_tooltip_safer = Security Level: Safer -security_level_tooltip_safest = Security Level: Safest -# Shown only for custom level -security_level_custom = Custom -security_level_restore = Restore Defaults -security_level_learn_more = Learn more - -# Panel button that takes the user to the security level settings in -# about:preferences#privacy -security_level_open_settings = Settings… -security_level_change = Change… -security_level_standard_summary = All browser and website features are enabled. -security_level_safer_summary = Disables website features that are often dangerous, causing some sites to lose functionality. -security_level_safest_summary = Only allows website features required for static sites and basic services. These changes affect images, media, and scripts. -security_level_custom_heading = Custom security level configured -security_level_custom_summary = Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels. - -## Security level section in about:preferences#privacy -security_level_overview = Disable certain web features that can be used to attack your security and anonymity. -security_level_list_safer = At the safer setting: -security_level_list_safest = At the safest setting: -# Strings for descriptions -security_level_js_https_only = JavaScript is disabled on non-HTTPS sites. -security_level_js_disabled = JavaScript is disabled by default on all sites. -security_level_limit_typography = Some fonts and math symbols are disabled. -security_level_limit_typography_svg = Some fonts, icons, math symbols, and images are disabled. -security_level_limit_media = Audio and video (HTML5 media), and WebGL are click-to-play. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/601bf76… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/601bf76… 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.9.0esr-13.5-1] fixup! Bug 40925: Implemented the Security Level component
by richard (@richard) 26 Mar '24

26 Mar '24
richard pushed to branch tor-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: fec131fd by Henry Wilkes at 2024-03-26T17:50:00+00:00 fixup! Bug 40925: Implemented the Security Level component Bug 42214: Drop the securityLevel.properties file. - - - - - 1 changed file: - − browser/locales/en-US/chrome/browser/securityLevel.properties Changes: ===================================== browser/locales/en-US/chrome/browser/securityLevel.properties deleted ===================================== @@ -1,33 +0,0 @@ -# Generic terms -security_level = Security Level -security_level_standard = Standard -security_level_safer = Safer -security_level_safest = Safest -security_level_tooltip_standard = Security Level: Standard -security_level_tooltip_safer = Security Level: Safer -security_level_tooltip_safest = Security Level: Safest -# Shown only for custom level -security_level_custom = Custom -security_level_restore = Restore Defaults -security_level_learn_more = Learn more - -# Panel button that takes the user to the security level settings in -# about:preferences#privacy -security_level_open_settings = Settings… -security_level_change = Change… -security_level_standard_summary = All browser and website features are enabled. -security_level_safer_summary = Disables website features that are often dangerous, causing some sites to lose functionality. -security_level_safest_summary = Only allows website features required for static sites and basic services. These changes affect images, media, and scripts. -security_level_custom_heading = Custom security level configured -security_level_custom_summary = Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels. - -## Security level section in about:preferences#privacy -security_level_overview = Disable certain web features that can be used to attack your security and anonymity. -security_level_list_safer = At the safer setting: -security_level_list_safest = At the safest setting: -# Strings for descriptions -security_level_js_https_only = JavaScript is disabled on non-HTTPS sites. -security_level_js_disabled = JavaScript is disabled by default on all sites. -security_level_limit_typography = Some fonts and math symbols are disabled. -security_level_limit_typography_svg = Some fonts, icons, math symbols, and images are disabled. -security_level_limit_media = Audio and video (HTML5 media), and WebGL are click-to-play. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/fec131f… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/fec131f… 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.9.0esr-13.5-1] 3 commits: fixup! Bug 2176: Rebrand Firefox to TorBrowser
by richard (@richard) 26 Mar '24

26 Mar '24
richard pushed to branch tor-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 1ce353d9 by Henry Wilkes at 2024-03-26T17:47:47+00:00 fixup! Bug 2176: Rebrand Firefox to TorBrowser Bug 42466: Use the existing #trademark element from mozilla for Tor Browser&#39;s trademark statement. - - - - - 3cad3836 by Henry Wilkes at 2024-03-26T17:47:47+00:00 fixup! Tor Browser strings Bug 42466: Change trademark statement to remove &quot;onion logo&quot;, and move it to brand.ftl. - - - - - 37b97c98 by Henry Wilkes at 2024-03-26T17:47:47+00:00 fixup! Add TorStrings module for localization Bug 42466: Remove &quot;onion logo&quot; from trademark statement and move it to brand.ftl. - - - - - 4 changed files: - browser/base/content/aboutDialog.xhtml - browser/base/content/aboutDialogTor.css - browser/locales/en-US/browser/tor-browser.ftl - toolkit/torbutton/chrome/locale/en-US/branding/brand.ftl Changes: ===================================== browser/base/content/aboutDialog.xhtml ===================================== @@ -20,7 +20,7 @@ data-l10n-id="aboutDialog-title" #endif role="dialog" - aria-describedby="version distribution distributionId projectDesc helpDesc trademark trademarkTor" + aria-describedby="version distribution distributionId projectDesc helpDesc trademark" > #ifdef XP_MACOSX #include macWindow.inc.xhtml @@ -150,7 +150,6 @@ <label is="text-link" class="bottom-link" useoriginprincipal="true" href="about:license" data-l10n-id="about-dialog-browser-license-link"></label> </hbox> <description id="trademark" data-l10n-id="trademarkInfo"></description> - <description id="trademarkTor" data-l10n-id="about-dialog-trademark-statement"></description> </vbox> </html:div> ===================================== browser/base/content/aboutDialogTor.css ===================================== @@ -18,15 +18,10 @@ } #trademark { - display: none; -} - -#trademarkTor { font-size: xx-small; text-align: center; color: #999999; - margin-top: 10px; - margin-bottom: 10px; + margin-block: 10px; } #bottomBox > hbox:not(#newBottom) { ===================================== browser/locales/en-US/browser/tor-browser.ftl ===================================== @@ -323,10 +323,6 @@ about-dialog-grow-tor-network-link = Help the Tor Network Grow! # Link text for the Tor Browser license page (about:license). about-dialog-browser-license-link = Licensing Information -# "Tor" and "The Onion Logo" are trademark names, so should not be translated (not including the quote marks, which can be localized). -# "The Tor Project, Inc." is an organisation name. -about-dialog-trademark-statement = “Tor” and “The Onion Logo” are registered trademarks of The Tor Project, Inc. - ## New tor circuit. # Shown in the File menu. ===================================== toolkit/torbutton/chrome/locale/en-US/branding/brand.ftl ===================================== @@ -9,4 +9,6 @@ # remain unchanged across different versions (Nightly, Beta, etc.). -brand-product-name = Tor Browser -vendor-short-name = Tor Project -trademarkInfo = 'Tor' and the 'Onion Logo' are registered trademarks of the Tor Project, Inc. +# "Tor" is a trademark names, so should not be translated (not including the quote marks, which can be localized). +# "The Tor Project, Inc." is an organisation name. +trademarkInfo = “Tor” and the Tor logo are registered trademarks of The Tor Project, Inc. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/570b6c… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/570b6c… 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 41110: Avoid Fontconfig warning about "ambiguous path"
by richard (@richard) 26 Mar '24

26 Mar '24
richard pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: c7092a88 by Rusty Bird at 2024-03-23T11:54:07+00:00 Bug 41110: Avoid Fontconfig warning about &quot;ambiguous path&quot; - - - - - 1 changed file: - projects/browser/Bundle-Data/linux/Data/fontconfig/fonts.conf Changes: ===================================== projects/browser/Bundle-Data/linux/Data/fontconfig/fonts.conf ===================================== @@ -39,7 +39,7 @@ PERFORMANCE OF THIS SOFTWARE. <!-- Font directory list --> - <dir>fonts</dir> + <dir prefix="cwd">fonts</dir> <!-- Accept deprecated 'mono' alias, replacing it with 'monospace' View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/c… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/c… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-115.9.0esr-13.5-1] Bug 1886852 - Avoid registering unnecessary MessageManager listeners when SHIP is enabled, r=smaug!
by ma1 (@ma1) 26 Mar '24

26 Mar '24
ma1 pushed to branch mullvad-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser Commits: b6e29f24 by Nika Layzell at 2024-03-26T18:25:59+01:00 Bug 1886852 - Avoid registering unnecessary MessageManager listeners when SHIP is enabled, r=smaug! Differential Revision: https://phabricator.services.mozilla.com/D205377 - - - - - 1 changed file: - browser/components/sessionstore/SessionStore.sys.mjs Changes: ===================================== browser/components/sessionstore/SessionStore.sys.mjs ===================================== @@ -1422,6 +1422,13 @@ var SessionStoreInternal = { * and thus enables communication with OOP tabs. */ receiveMessage(aMessage) { + if (Services.appinfo.sessionHistoryInParent) { + throw new Error( + `received unexpected message '${aMessage.name}' with ` + + `sessionHistoryInParent enabled` + ); + } + // If we got here, that means we're dealing with a frame message // manager message, so the target will be a <xul:browser>. var browser = aMessage.target; @@ -1600,14 +1607,14 @@ var SessionStoreInternal = { // internal data about the window. aWindow.__SSi = this._generateWindowID(); - let mm = aWindow.getGroupMessageManager("browsers"); - MESSAGES.forEach(msg => { - let listenWhenClosed = CLOSED_MESSAGES.has(msg); - mm.addMessageListener(msg, this, listenWhenClosed); - }); - - // Load the frame script after registering listeners. if (!Services.appinfo.sessionHistoryInParent) { + let mm = aWindow.getGroupMessageManager("browsers"); + MESSAGES.forEach(msg => { + let listenWhenClosed = CLOSED_MESSAGES.has(msg); + mm.addMessageListener(msg, this, listenWhenClosed); + }); + + // Load the frame script after registering listeners. mm.loadFrameScript( "chrome://browser/content/content-sessionStore.js", true, @@ -2083,8 +2090,10 @@ var SessionStoreInternal = { // Cache the window state until it is completely gone. DyingWindowCache.set(aWindow, winData); - let mm = aWindow.getGroupMessageManager("browsers"); - MESSAGES.forEach(msg => mm.removeMessageListener(msg, this)); + if (!Services.appinfo.sessionHistoryInParent) { + let mm = aWindow.getGroupMessageManager("browsers"); + MESSAGES.forEach(msg => mm.removeMessageListener(msg, this)); + } this._saveableClosedWindowData.delete(winData); delete aWindow.__SSi; View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/b6e… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/b6e… 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.9.0esr-13.5-1] Bug 1886852 - Avoid registering unnecessary MessageManager listeners when SHIP is enabled, r=smaug!
by ma1 (@ma1) 26 Mar '24

26 Mar '24
ma1 pushed to branch base-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 8e8ac7a1 by Nika Layzell at 2024-03-26T18:23:53+01:00 Bug 1886852 - Avoid registering unnecessary MessageManager listeners when SHIP is enabled, r=smaug! Differential Revision: https://phabricator.services.mozilla.com/D205377 - - - - - 1 changed file: - browser/components/sessionstore/SessionStore.sys.mjs Changes: ===================================== browser/components/sessionstore/SessionStore.sys.mjs ===================================== @@ -1422,6 +1422,13 @@ var SessionStoreInternal = { * and thus enables communication with OOP tabs. */ receiveMessage(aMessage) { + if (Services.appinfo.sessionHistoryInParent) { + throw new Error( + `received unexpected message '${aMessage.name}' with ` + + `sessionHistoryInParent enabled` + ); + } + // If we got here, that means we're dealing with a frame message // manager message, so the target will be a <xul:browser>. var browser = aMessage.target; @@ -1600,14 +1607,14 @@ var SessionStoreInternal = { // internal data about the window. aWindow.__SSi = this._generateWindowID(); - let mm = aWindow.getGroupMessageManager("browsers"); - MESSAGES.forEach(msg => { - let listenWhenClosed = CLOSED_MESSAGES.has(msg); - mm.addMessageListener(msg, this, listenWhenClosed); - }); - - // Load the frame script after registering listeners. if (!Services.appinfo.sessionHistoryInParent) { + let mm = aWindow.getGroupMessageManager("browsers"); + MESSAGES.forEach(msg => { + let listenWhenClosed = CLOSED_MESSAGES.has(msg); + mm.addMessageListener(msg, this, listenWhenClosed); + }); + + // Load the frame script after registering listeners. mm.loadFrameScript( "chrome://browser/content/content-sessionStore.js", true, @@ -2083,8 +2090,10 @@ var SessionStoreInternal = { // Cache the window state until it is completely gone. DyingWindowCache.set(aWindow, winData); - let mm = aWindow.getGroupMessageManager("browsers"); - MESSAGES.forEach(msg => mm.removeMessageListener(msg, this)); + if (!Services.appinfo.sessionHistoryInParent) { + let mm = aWindow.getGroupMessageManager("browsers"); + MESSAGES.forEach(msg => mm.removeMessageListener(msg, this)); + } this._saveableClosedWindowData.delete(winData); delete aWindow.__SSi; View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/8e8ac7a… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/8e8ac7a… 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.9.0esr-13.5-1] Bug 42472: Spoof timezone in XSLT.
by Pier Angelo Vendrame (@pierov) 26 Mar '24

26 Mar '24
Pier Angelo Vendrame pushed to branch mullvad-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser Commits: a18ee3be by Pier Angelo Vendrame at 2024-03-26T18:21:50+01:00 Bug 42472: Spoof timezone in XSLT. - - - - - 1 changed file: - dom/xslt/xslt/txEXSLTFunctions.cpp Changes: ===================================== dom/xslt/xslt/txEXSLTFunctions.cpp ===================================== @@ -591,7 +591,14 @@ nsresult txEXSLTFunctionCall::evaluate(txIEvalContext* aContext, // http://exslt.org/date/functions/date-time/ PRExplodedTime prtime; - PR_ExplodeTime(PR_Now(), PR_LocalTimeParameters, &prtime); + PR_ExplodeTime( + PR_Now(), + // We are not allowed to access the Document when evaluating this, so + // fall back to the general function. + nsContentUtils::ShouldResistFingerprinting(RFPTarget::Unknown) + ? PR_GMTParameters + : PR_LocalTimeParameters, + &prtime); int32_t offset = (prtime.tm_params.tp_gmt_offset + prtime.tm_params.tp_dst_offset) / View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/a18… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/a18… 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.9.0esr-13.5-1] Bug 42472: Spoof timezone in XSLT.
by Pier Angelo Vendrame (@pierov) 26 Mar '24

26 Mar '24
Pier Angelo Vendrame pushed to branch base-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: d81946dd by Pier Angelo Vendrame at 2024-03-26T18:21:17+01:00 Bug 42472: Spoof timezone in XSLT. - - - - - 1 changed file: - dom/xslt/xslt/txEXSLTFunctions.cpp Changes: ===================================== dom/xslt/xslt/txEXSLTFunctions.cpp ===================================== @@ -591,7 +591,14 @@ nsresult txEXSLTFunctionCall::evaluate(txIEvalContext* aContext, // http://exslt.org/date/functions/date-time/ PRExplodedTime prtime; - PR_ExplodeTime(PR_Now(), PR_LocalTimeParameters, &prtime); + PR_ExplodeTime( + PR_Now(), + // We are not allowed to access the Document when evaluating this, so + // fall back to the general function. + nsContentUtils::ShouldResistFingerprinting(RFPTarget::Unknown) + ? PR_GMTParameters + : PR_LocalTimeParameters, + &prtime); int32_t offset = (prtime.tm_params.tp_gmt_offset + prtime.tm_params.tp_dst_offset) / View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/d81946d… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/d81946d… 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.9.0esr-13.5-1] Bug 42472: Spoof timezone in XSLT.
by Pier Angelo Vendrame (@pierov) 26 Mar '24

26 Mar '24
Pier Angelo Vendrame pushed to branch tor-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 570b6c56 by Pier Angelo Vendrame at 2024-03-26T18:04:32+01:00 Bug 42472: Spoof timezone in XSLT. - - - - - 1 changed file: - dom/xslt/xslt/txEXSLTFunctions.cpp Changes: ===================================== dom/xslt/xslt/txEXSLTFunctions.cpp ===================================== @@ -591,7 +591,14 @@ nsresult txEXSLTFunctionCall::evaluate(txIEvalContext* aContext, // http://exslt.org/date/functions/date-time/ PRExplodedTime prtime; - PR_ExplodeTime(PR_Now(), PR_LocalTimeParameters, &prtime); + PR_ExplodeTime( + PR_Now(), + // We are not allowed to access the Document when evaluating this, so + // fall back to the general function. + nsContentUtils::ShouldResistFingerprinting(RFPTarget::Unknown) + ? PR_GMTParameters + : PR_LocalTimeParameters, + &prtime); int32_t offset = (prtime.tm_params.tp_gmt_offset + prtime.tm_params.tp_dst_offset) / View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/570b6c5… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/570b6c5… 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.9.0esr-13.5-1] 3 commits: Revert "fixup! Tor Browser localization migration scripts."
by richard (@richard) 25 Mar '24

25 Mar '24
richard pushed to branch mullvad-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser Commits: e32712bc by Richard Pospesel at 2024-03-25T22:19:40+00:00 Revert &quot;fixup! Tor Browser localization migration scripts.&quot; This reverts commit a8282d9ca507994cf21025f22c6ba3e13d5e3973. - - - - - edaaba1d by Henry Wilkes at 2024-03-25T22:25:35+00:00 fixup! Bug 40925: Implemented the Security Level component Bug 42214: Migrate security level strings to Fluent. - - - - - a166803d by Henry Wilkes at 2024-03-25T22:27:49+00:00 fixup! Base Browser strings Bug 42214: Migrate security level strings to Fluent. Also change some strings to be sentence case in English. - - - - - 7 changed files: - browser/components/preferences/preferences.xhtml - browser/components/securitylevel/content/securityLevel.js - browser/components/securitylevel/content/securityLevelPanel.inc.xhtml - browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml - browser/locales/en-US/browser/base-browser.ftl - browser/locales/jar.mn - − tools/torbrowser/l10n/migrations/bug-42211-new-identity.py Changes: ===================================== browser/components/preferences/preferences.xhtml ===================================== @@ -58,6 +58,7 @@ <link rel="localization" href="security/certificates/certManager.ftl"/> <link rel="localization" href="security/certificates/deviceManager.ftl"/> <link rel="localization" href="toolkit/updates/history.ftl"/> + <link rel="localization" href="browser/base-browser.ftl"/> <link rel="localization" href="browser/mullvad-browser/preferences.ftl"/> <link rel="shortcut icon" href="chrome://global/skin/icons/settings.svg"/> ===================================== browser/components/securitylevel/content/securityLevel.js ===================================== @@ -8,65 +8,6 @@ ChromeUtils.defineModuleGetter( "resource://gre/modules/SecurityLevel.jsm" ); -XPCOMUtils.defineLazyGetter(this, "SecurityLevelStrings", () => { - let strings = { - // Generic terms - security_level: "Security Level", - security_level_standard: "Standard", - security_level_safer: "Safer", - security_level_safest: "Safest", - security_level_tooltip_standard: "Security Level: Standard", - security_level_tooltip_safer: "Security Level: Safer", - security_level_tooltip_safest: "Security Level: Safest", - // Shown only for custom level - security_level_custom: "Custom", - security_level_restore: "Restore Defaults", - security_level_learn_more: "Learn more", - // Panel - security_level_open_settings: "Settings…", - security_level_standard_summary: - "All browser and website features are enabled.", - security_level_safer_summary: - "Disables website features that are often dangerous, causing some sites to lose functionality.", - security_level_safest_summary: - "Only allows website features required for static sites and basic services. These changes affect images, media, and scripts.", - security_level_custom_heading: "Custom security level configured", - security_level_custom_summary: - "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.", - // Security level section in about:preferences#privacy - security_level_overview: - "Disable certain web features that can be used to attack your security and anonymity.", - security_level_list_safer: "At the safer setting:", - security_level_list_safest: "At the safest setting:", - // Strings for descriptions - security_level_js_https_only: "JavaScript is disabled on non-HTTPS sites.", - security_level_js_disabled: - "JavaScript is disabled by default on all sites.", - security_level_limit_typography: - "Some fonts and math symbols are disabled.", - security_level_limit_typography_svg: - "Some fonts, icons, math symbols, and images are disabled.", - security_level_limit_media: - "Audio and video (HTML5 media), and WebGL are click-to-play.", - }; - let bundle = null; - try { - bundle = Services.strings.createBundle( - "chrome://browser/locale/securityLevel.properties" - ); - } catch (e) { - console.warn("Could not load the Security Level strings"); - } - if (bundle) { - for (const key of Object.keys(strings)) { - try { - strings[key] = bundle.GetStringFromName(key); - } catch (e) {} - } - } - return strings; -}); - /* Security Level Button Code @@ -100,12 +41,30 @@ var SecurityLevelButton = { if (!level) { return; } - const customStr = SecurityLevelPrefs.securityCustom ? "_custom" : ""; - this._button.setAttribute("level", `${level}${customStr}`); - this._button.setAttribute( - "tooltiptext", - SecurityLevelStrings[`security_level_tooltip_${level}`] - ); + const custom = SecurityLevelPrefs.securityCustom; + this._button.setAttribute("level", custom ? `${level}_custom` : level); + + let l10nIdLevel; + switch (level) { + case "standard": + l10nIdLevel = "security-level-toolbar-button-standard"; + break; + case "safer": + l10nIdLevel = "security-level-toolbar-button-safer"; + break; + case "safest": + l10nIdLevel = "security-level-toolbar-button-safest"; + break; + default: + throw Error(`Unhandled level: ${level}`); + } + if (custom) { + // Don't distinguish between the different levels when in the custom + // state. We just want to emphasise that it is custom rather than any + // specific level. + l10nIdLevel = "security-level-toolbar-button-custom"; + } + document.l10n.setAttributes(this._button, l10nIdLevel); }, /** @@ -159,7 +118,6 @@ var SecurityLevelButton = { window.gNavToolbox.palette.querySelector("#security-level-button"); // Set a label to be be used as the accessible name, and to be shown in the // overflow menu and during customization. - this._button.setAttribute("label", SecurityLevelStrings.security_level); this._button.addEventListener("command", () => this.openPopup()); // set the initial class based off of the current pref this._configUIFromPrefs(); @@ -213,21 +171,12 @@ var SecurityLevelPanel = { settingsButton: document.getElementById("securityLevel-settings"), }; - document.getElementById("securityLevel-header").textContent = - SecurityLevelStrings.security_level; - this._elements.customName.textContent = - SecurityLevelStrings.security_level_custom; const learnMoreEl = document.getElementById("securityLevel-learnMore"); - learnMoreEl.textContent = SecurityLevelStrings.security_level_learn_more; learnMoreEl.addEventListener("click", event => { window.openTrustedLinkIn(learnMoreEl.href, "tab"); this.hide(); event.preventDefault(); }); - this._elements.restoreDefaultsButton.textContent = - SecurityLevelStrings.security_level_restore; - this._elements.settingsButton.textContent = - SecurityLevelStrings.security_level_open_settings; this._elements.restoreDefaultsButton.addEventListener("command", () => { this.restoreDefaults(); @@ -268,11 +217,30 @@ var SecurityLevelPanel = { // Descriptions change based on security level this._elements.background.setAttribute("level", level); - this._elements.levelName.textContent = - SecurityLevelStrings[`security_level_${level}`]; - this._elements.summary.textContent = custom - ? SecurityLevelStrings.security_level_custom_summary - : SecurityLevelStrings[`security_level_${level}_summary`]; + let l10nIdLevel; + let l10nIdSummary; + switch (level) { + case "standard": + l10nIdLevel = "security-level-panel-level-standard"; + l10nIdSummary = "security-level-summary-standard"; + break; + case "safer": + l10nIdLevel = "security-level-panel-level-safer"; + l10nIdSummary = "security-level-summary-safer"; + break; + case "safest": + l10nIdLevel = "security-level-panel-level-safest"; + l10nIdSummary = "security-level-summary-safest"; + break; + default: + throw Error(`Unhandled level: ${level}`); + } + if (custom) { + l10nIdSummary = "security-level-summary-custom"; + } + + document.l10n.setAttributes(this._elements.levelName, l10nIdLevel); + document.l10n.setAttributes(this._elements.summary, l10nIdSummary); }, /** @@ -358,25 +326,13 @@ var SecurityLevelPreferences = { this._customNotification = document.getElementById( "securityLevel-customNotification" ); - this._radiogroup = document.getElementById("securityLevel-radiogroup"); - - document.querySelector("#securityLevel-groupbox h2").textContent = - SecurityLevelStrings.security_level; - document.getElementById("securityLevel-overview").textContent = - SecurityLevelStrings.security_level_overview; document - .getElementById("securityLevel-learnMore") - .setAttribute("value", SecurityLevelStrings.security_level_learn_more); - - document.getElementById("securityLevel-customHeading").textContent = - SecurityLevelStrings.security_level_custom_heading; - document.getElementById("securityLevel-customDescription").textContent = - SecurityLevelStrings.security_level_custom_summary; - const restoreDefaultsButton = document.getElementById( - "securityLevel-restoreDefaults" - ); - restoreDefaultsButton.textContent = - SecurityLevelStrings.security_level_restore; + .getElementById("securityLevel-restoreDefaults") + .addEventListener("command", () => { + SecurityLevelPrefs.securityCustom = false; + }); + + this._radiogroup = document.getElementById("securityLevel-radiogroup"); this._radioOptions = Array.from( this._radiogroup.querySelectorAll(".securityLevel-radio-option"), @@ -384,46 +340,7 @@ var SecurityLevelPreferences = { return { container, radio: container.querySelector("radio") }; } ); - const descListItemsMap = { - safer: [ - SecurityLevelStrings.security_level_js_https_only, - SecurityLevelStrings.security_level_limit_typography, - SecurityLevelStrings.security_level_limit_media, - ], - safest: [ - SecurityLevelStrings.security_level_js_disabled, - SecurityLevelStrings.security_level_limit_typography_svg, - SecurityLevelStrings.security_level_limit_media, - ], - }; - for (const { container, radio } of this._radioOptions) { - const level = radio.value; - radio.setAttribute( - "label", - SecurityLevelStrings[`security_level_${level}`] - ); - container.querySelector(".summary").textContent = - SecurityLevelStrings[`security_level_${level}_summary`]; - const descListItems = descListItemsMap[level]; - if (!descListItems) { - continue; - } - const descrList = container.querySelector( - ".securityLevel-descriptionList" - ); - // TODO: Add the elements in securityLevelPreferences.inc.xhtml again - // when we switch to Fluent - for (const text of descListItems) { - let elem = document.createXULElement("description"); - elem.textContent = text; - elem.className = "indent"; - descrList.append(elem); - } - } - restoreDefaultsButton.addEventListener("command", () => { - SecurityLevelPrefs.securityCustom = false; - }); this._radiogroup.addEventListener("select", () => { SecurityLevelPrefs.securityLevel = this._radiogroup.value; }); ===================================== browser/components/securitylevel/content/securityLevelPanel.inc.xhtml ===================================== @@ -7,20 +7,35 @@ level="top" class="cui-widget-panel panel-no-padding"> <box class="panel-header"> - <html:h1 id="securityLevel-header"></html:h1> + <html:h1 + id="securityLevel-header" + data-l10n-id="security-level-panel-heading" + ></html:h1> </box> <toolbarseparator id="securityLevel-separator"></toolbarseparator> <vbox id="securityLevel-background" class="panel-subview-body"> <html:p id="securityLevel-subheading"> <html:span id="securityLevel-level"></html:span> - <html:span id="securityLevel-custom"></html:span> + <html:span + id="securityLevel-custom" + data-l10n-id="security-level-panel-custom-badge" + ></html:span> </html:p> <html:p id="securityLevel-summary"></html:p> - <html:a id="securityLevel-learnMore" href="https://mullvad.net/en/browser/hard-facts#security-levels"> - </html:a> + <html:a + id="securityLevel-learnMore" + 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"> - <button id="securityLevel-settings"/> - <button id="securityLevel-restoreDefaults"/> + <button + id="securityLevel-settings" + data-l10n-id="security-level-panel-open-settings-button" + /> + <button + id="securityLevel-restoreDefaults" + data-l10n-id="security-level-restore-defaults-button" + /> </hbox> </panel> ===================================== browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml ===================================== @@ -2,36 +2,63 @@ data-category="panePrivacy" data-subcategory="securitylevel" hidden="true"> - <label><html:h2></html:h2></label> + <label> + <html:h2 data-l10n-id="security-level-preferences-heading"></html:h2> + </label> <vbox flex="1"> <description flex="1"> - <html:span id="securityLevel-overview" class="tail-with-learn-more"> - </html:span> - <label id="securityLevel-learnMore" - class="learnMore text-link" - is="text-link" - href="https://mullvad.net/en/browser/hard-facts#security-levels"/> + <html:span + id="securityLevel-overview" + 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" + data-l10n-id="security-level-preferences-learn-more-link" + href="https://mullvad.net/en/browser/hard-facts#security-levels" + /> </description> - <hbox id="securityLevel-customNotification" - class="info-box-container" - flex="1"> + <hbox + id="securityLevel-customNotification" + class="info-box-container" + flex="1" + > <hbox class="info-icon-container"> <image class="info-icon securityLevel-custom-warning-icon"/> </hbox> <vbox flex="1"> - <label id="securityLevel-customHeading"/> - <description id="securityLevel-customDescription" flex="1"/> + <label + id="securityLevel-customHeading" + data-l10n-id="security-level-preferences-custom-heading" + /> + <description + id="securityLevel-customDescription" + data-l10n-id="security-level-summary-custom" + flex="1" + /> </vbox> <hbox align="center"> - <button id="securityLevel-restoreDefaults"/> + <button + id="securityLevel-restoreDefaults" + data-l10n-id="security-level-restore-defaults-button" + /> </hbox> </hbox> <radiogroup id="securityLevel-radiogroup"> <vbox class="securityLevel-radio-option"> - <radio value="standard" - aria-describedby="securityLevelSummary-standard"/> + <radio + value="standard" + data-l10n-id="security-level-preferences-level-standard" + aria-describedby="securityLevelSummary-standard" + /> <vbox id="securityLevelSummary-standard"> - <description class="summary indent" flex="1"/> + <description + class="summary indent" + flex="1" + data-l10n-id="security-level-summary-standard" + /> </vbox> </vbox> <vbox class="securityLevel-radio-option"> @@ -40,19 +67,59 @@ - securityLevel-descriptionList is shown or hidden, its text content - is included or excluded from the accessible description, - respectively. --> - <radio value="safer" - aria-describedby="securityLevelSummary-safer"/> + <radio + value="safer" + data-l10n-id="security-level-preferences-level-safer" + aria-describedby="securityLevelSummary-safer" + /> <vbox id="securityLevelSummary-safer"> - <description class="summary indent" flex="1"/> - <vbox class="securityLevel-descriptionList indent"/> + <description + class="summary indent" + flex="1" + data-l10n-id="security-level-summary-safer" + /> + <vbox class="securityLevel-descriptionList indent"> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-https-only-javascript" + /> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-limit-font-and-symbols" + /> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-limit-media" + /> + </vbox> </vbox> </vbox> <vbox class="securityLevel-radio-option"> - <radio value="safest" - aria-describedby="securityLevelSummary-safest"/> + <radio + value="safest" + data-l10n-id="security-level-preferences-level-safest" + aria-describedby="securityLevelSummary-safest" + /> <vbox id="securityLevelSummary-safest"> - <description class="summary indent" flex="1"/> - <vbox class="securityLevel-descriptionList indent"/> + <description + class="summary indent" + flex="1" + data-l10n-id="security-level-summary-safest" + /> + <vbox class="securityLevel-descriptionList indent"> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-disabled-javascript" + /> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-limit-font-and-symbols-and-images" + /> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-limit-media" + /> + </vbox> </vbox> </vbox> </radiogroup> ===================================== browser/locales/en-US/browser/base-browser.ftl ===================================== @@ -70,6 +70,7 @@ new-identity-dialog-confirm = new-identity-blocked-home-notification = { -brand-short-name } blocked your homepage ({ $url }) from loading because it might recognize your previous session. # Button to continue loading the home page, despite the warning message. new-identity-blocked-home-ignore-button = Load it anyway + ## Preferences - Letterboxing. # The word "Letterboxing" is the proper noun for the Tor Browser feature, and is therefore capitalised. @@ -94,3 +95,74 @@ letterboxing-disabled-description = Letterboxing is currently disabled. # "Letterboxing" should be treated as a feature/product name, and likely not changed in other languages. letterboxing-enable-button = .label = Enable Letterboxing + +## Security level toolbar button. +## Uses sentence case in English (US). +## ".label" is the accessible name, and shown in the overflow menu and when customizing the toolbar. + +security-level-toolbar-button-standard = + .label = Security level + .tooltiptext = Security level: Standard +security-level-toolbar-button-safer = + .label = Security level + .tooltiptext = Security level: Safer +security-level-toolbar-button-safest = + .label = Security level + .tooltiptext = Security level: Safest +# Used when the user is in some custom configuration that does not match a security level. +security-level-toolbar-button-custom = + .label = Security level + .tooltiptext = Security level: Custom + +## Security level popup panel. + +# Uses sentence case in English (US). +security-level-panel-heading = Security level + +security-level-panel-level-standard = Standard +security-level-panel-level-safer = Safer +security-level-panel-level-safest = Safest +security-level-panel-learn-more-link = Learn more +# Button to open security level settings. +security-level-panel-open-settings-button = Settings… + +## Security level settings. + +security-level-preferences-heading = Security Level +security-level-preferences-overview = Disable certain web features that can be used to attack your security and anonymity. +security-level-preferences-learn-more-link = Learn more +security-level-preferences-level-standard = + .label = Standard +security-level-preferences-level-safer = + .label = Safer +security-level-preferences-level-safest = + .label = Safest + +## Security level summaries shown in security panel and settings. + +security-level-summary-standard = All browser and website features are enabled. +security-level-summary-safer = Disables website features that are often dangerous, causing some sites to lose functionality. +security-level-summary-safest = Only allows website features required for static sites and basic services. These changes affect images, media, and scripts. + +## Security level feature bullet points. +## Shown in the settings under the security level when it is selected. + +security-level-preferences-bullet-https-only-javascript = JavaScript is disabled on non-HTTPS sites. +security-level-preferences-bullet-limit-font-and-symbols = Some fonts and math symbols are disabled. +security-level-preferences-bullet-limit-media = Audio and video (HTML5 media), and WebGL are click-to-play. +security-level-preferences-bullet-disabled-javascript = JavaScript is disabled by default on all sites. +security-level-preferences-bullet-limit-font-and-symbols-and-images = Some fonts, icons, math symbols, and images are disabled. + +## Custom security level. +## Some custom preferences configuration has placed the user outside one of the standard three levels. + +# Shown in the security level panel as an orange badge next to the expected level. +security-level-panel-custom-badge = Custom +# Shown in the security level settings in a warning box. +security-level-preferences-custom-heading = Custom security level configured +# Description of custom state and recommended action. +# Shown in the security level panel and settings. +security-level-summary-custom = Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels. +# 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 ===================================== browser/locales/jar.mn ===================================== @@ -32,5 +32,4 @@ locale/browser/safebrowsing/safebrowsing.properties (%chrome/browser/safebrowsing/safebrowsing.properties) locale/browser/feeds/subscribe.properties (%chrome/browser/feeds/subscribe.properties) locale/browser/syncSetup.properties (%chrome/browser/syncSetup.properties) - locale/browser/securityLevel.properties (%chrome/browser/securityLevel.properties) % locale browser-region @AB_CD@ %locale/browser-region/ ===================================== tools/torbrowser/l10n/migrations/bug-42211-new-identity.py deleted ===================================== @@ -1,48 +0,0 @@ -import fluent.syntax.ast as FTL -from fluent.migrate.helpers import TERM_REFERENCE, transforms_from -from fluent.migrate.transforms import REPLACE - - -def migrate(ctx): - legacy_path = "newIdentity.properties" - - ctx.add_transforms( - "base-browser.ftl", - "base-browser.ftl", - transforms_from( - """ -menu-new-identity = - .label = { COPY(path, "new_identity") } - .accesskey = { COPY(path, "new_identity_menu_accesskey") } -appmenuitem-new-identity = - .label = { COPY(path, "new_identity_sentence_case") } -toolbar-new-identity = - .label = { COPY(path, "new_identity_sentence_case") } - .tooltiptext = { toolbar-new-identity.label } - -new-identity-dialog-title = { COPY(path, "new_identity_prompt_title") } -new-identity-dialog-never-ask-checkbox = - .label = { COPY(path, "new_identity_ask_again") } - -new-identity-blocked-home-ignore-button = { COPY(path, "new_identity_home_load_button") } -""", - path=legacy_path, - ) - + [ - # Replace "%S" with "{ -brand-short-name }" in confirm button. - FTL.Message( - id=FTL.Identifier("new-identity-dialog-confirm"), - value=None, - attributes=[ - FTL.Attribute( - id=FTL.Identifier("label"), - value=REPLACE( - legacy_path, - "new_identity_restart", - {"%1$S": TERM_REFERENCE("brand-short-name")}, - ), - ), - ], - ), - ], - ) View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/4d… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/4d… 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.9.0esr-13.5-1] 3 commits: Revert "fixup! Tor Browser localization migration scripts."
by richard (@richard) 25 Mar '24

25 Mar '24
richard pushed to branch base-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: ba14a74d by Richard Pospesel at 2024-03-25T22:15:25+00:00 Revert &quot;fixup! Tor Browser localization migration scripts.&quot; This reverts commit 57b8a1d5daf53afed32a8b02aca2508eecfc9bd7. - - - - - c14810dd by Henry Wilkes at 2024-03-25T22:16:38+00:00 fixup! Bug 40925: Implemented the Security Level component Bug 42214: Migrate security level strings to Fluent. - - - - - 8f87ed96 by Henry Wilkes at 2024-03-25T22:17:23+00:00 fixup! Base Browser strings Bug 42214: Migrate security level strings to Fluent. Also change some strings to be sentence case in English. - - - - - 7 changed files: - browser/components/preferences/preferences.xhtml - browser/components/securitylevel/content/securityLevel.js - browser/components/securitylevel/content/securityLevelPanel.inc.xhtml - browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml - browser/locales/en-US/browser/base-browser.ftl - browser/locales/jar.mn - − tools/torbrowser/l10n/migrations/bug-42211-new-identity.py Changes: ===================================== browser/components/preferences/preferences.xhtml ===================================== @@ -58,6 +58,7 @@ <link rel="localization" href="security/certificates/certManager.ftl"/> <link rel="localization" href="security/certificates/deviceManager.ftl"/> <link rel="localization" href="toolkit/updates/history.ftl"/> + <link rel="localization" href="browser/base-browser.ftl"/> <link rel="shortcut icon" href="chrome://global/skin/icons/settings.svg"/> ===================================== browser/components/securitylevel/content/securityLevel.js ===================================== @@ -8,65 +8,6 @@ ChromeUtils.defineModuleGetter( "resource://gre/modules/SecurityLevel.jsm" ); -XPCOMUtils.defineLazyGetter(this, "SecurityLevelStrings", () => { - let strings = { - // Generic terms - security_level: "Security Level", - security_level_standard: "Standard", - security_level_safer: "Safer", - security_level_safest: "Safest", - security_level_tooltip_standard: "Security Level: Standard", - security_level_tooltip_safer: "Security Level: Safer", - security_level_tooltip_safest: "Security Level: Safest", - // Shown only for custom level - security_level_custom: "Custom", - security_level_restore: "Restore Defaults", - security_level_learn_more: "Learn more", - // Panel - security_level_open_settings: "Settings…", - security_level_standard_summary: - "All browser and website features are enabled.", - security_level_safer_summary: - "Disables website features that are often dangerous, causing some sites to lose functionality.", - security_level_safest_summary: - "Only allows website features required for static sites and basic services. These changes affect images, media, and scripts.", - security_level_custom_heading: "Custom security level configured", - security_level_custom_summary: - "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.", - // Security level section in about:preferences#privacy - security_level_overview: - "Disable certain web features that can be used to attack your security and anonymity.", - security_level_list_safer: "At the safer setting:", - security_level_list_safest: "At the safest setting:", - // Strings for descriptions - security_level_js_https_only: "JavaScript is disabled on non-HTTPS sites.", - security_level_js_disabled: - "JavaScript is disabled by default on all sites.", - security_level_limit_typography: - "Some fonts and math symbols are disabled.", - security_level_limit_typography_svg: - "Some fonts, icons, math symbols, and images are disabled.", - security_level_limit_media: - "Audio and video (HTML5 media), and WebGL are click-to-play.", - }; - let bundle = null; - try { - bundle = Services.strings.createBundle( - "chrome://browser/locale/securityLevel.properties" - ); - } catch (e) { - console.warn("Could not load the Security Level strings"); - } - if (bundle) { - for (const key of Object.keys(strings)) { - try { - strings[key] = bundle.GetStringFromName(key); - } catch (e) {} - } - } - return strings; -}); - /* Security Level Button Code @@ -100,12 +41,30 @@ var SecurityLevelButton = { if (!level) { return; } - const customStr = SecurityLevelPrefs.securityCustom ? "_custom" : ""; - this._button.setAttribute("level", `${level}${customStr}`); - this._button.setAttribute( - "tooltiptext", - SecurityLevelStrings[`security_level_tooltip_${level}`] - ); + const custom = SecurityLevelPrefs.securityCustom; + this._button.setAttribute("level", custom ? `${level}_custom` : level); + + let l10nIdLevel; + switch (level) { + case "standard": + l10nIdLevel = "security-level-toolbar-button-standard"; + break; + case "safer": + l10nIdLevel = "security-level-toolbar-button-safer"; + break; + case "safest": + l10nIdLevel = "security-level-toolbar-button-safest"; + break; + default: + throw Error(`Unhandled level: ${level}`); + } + if (custom) { + // Don't distinguish between the different levels when in the custom + // state. We just want to emphasise that it is custom rather than any + // specific level. + l10nIdLevel = "security-level-toolbar-button-custom"; + } + document.l10n.setAttributes(this._button, l10nIdLevel); }, /** @@ -159,7 +118,6 @@ var SecurityLevelButton = { window.gNavToolbox.palette.querySelector("#security-level-button"); // Set a label to be be used as the accessible name, and to be shown in the // overflow menu and during customization. - this._button.setAttribute("label", SecurityLevelStrings.security_level); this._button.addEventListener("command", () => this.openPopup()); // set the initial class based off of the current pref this._configUIFromPrefs(); @@ -213,21 +171,12 @@ var SecurityLevelPanel = { settingsButton: document.getElementById("securityLevel-settings"), }; - document.getElementById("securityLevel-header").textContent = - SecurityLevelStrings.security_level; - this._elements.customName.textContent = - SecurityLevelStrings.security_level_custom; const learnMoreEl = document.getElementById("securityLevel-learnMore"); - learnMoreEl.textContent = SecurityLevelStrings.security_level_learn_more; learnMoreEl.addEventListener("click", event => { window.openTrustedLinkIn(learnMoreEl.href, "tab"); this.hide(); event.preventDefault(); }); - this._elements.restoreDefaultsButton.textContent = - SecurityLevelStrings.security_level_restore; - this._elements.settingsButton.textContent = - SecurityLevelStrings.security_level_open_settings; this._elements.restoreDefaultsButton.addEventListener("command", () => { this.restoreDefaults(); @@ -268,11 +217,30 @@ var SecurityLevelPanel = { // Descriptions change based on security level this._elements.background.setAttribute("level", level); - this._elements.levelName.textContent = - SecurityLevelStrings[`security_level_${level}`]; - this._elements.summary.textContent = custom - ? SecurityLevelStrings.security_level_custom_summary - : SecurityLevelStrings[`security_level_${level}_summary`]; + let l10nIdLevel; + let l10nIdSummary; + switch (level) { + case "standard": + l10nIdLevel = "security-level-panel-level-standard"; + l10nIdSummary = "security-level-summary-standard"; + break; + case "safer": + l10nIdLevel = "security-level-panel-level-safer"; + l10nIdSummary = "security-level-summary-safer"; + break; + case "safest": + l10nIdLevel = "security-level-panel-level-safest"; + l10nIdSummary = "security-level-summary-safest"; + break; + default: + throw Error(`Unhandled level: ${level}`); + } + if (custom) { + l10nIdSummary = "security-level-summary-custom"; + } + + document.l10n.setAttributes(this._elements.levelName, l10nIdLevel); + document.l10n.setAttributes(this._elements.summary, l10nIdSummary); }, /** @@ -358,25 +326,13 @@ var SecurityLevelPreferences = { this._customNotification = document.getElementById( "securityLevel-customNotification" ); - this._radiogroup = document.getElementById("securityLevel-radiogroup"); - - document.querySelector("#securityLevel-groupbox h2").textContent = - SecurityLevelStrings.security_level; - document.getElementById("securityLevel-overview").textContent = - SecurityLevelStrings.security_level_overview; document - .getElementById("securityLevel-learnMore") - .setAttribute("value", SecurityLevelStrings.security_level_learn_more); - - document.getElementById("securityLevel-customHeading").textContent = - SecurityLevelStrings.security_level_custom_heading; - document.getElementById("securityLevel-customDescription").textContent = - SecurityLevelStrings.security_level_custom_summary; - const restoreDefaultsButton = document.getElementById( - "securityLevel-restoreDefaults" - ); - restoreDefaultsButton.textContent = - SecurityLevelStrings.security_level_restore; + .getElementById("securityLevel-restoreDefaults") + .addEventListener("command", () => { + SecurityLevelPrefs.securityCustom = false; + }); + + this._radiogroup = document.getElementById("securityLevel-radiogroup"); this._radioOptions = Array.from( this._radiogroup.querySelectorAll(".securityLevel-radio-option"), @@ -384,46 +340,7 @@ var SecurityLevelPreferences = { return { container, radio: container.querySelector("radio") }; } ); - const descListItemsMap = { - safer: [ - SecurityLevelStrings.security_level_js_https_only, - SecurityLevelStrings.security_level_limit_typography, - SecurityLevelStrings.security_level_limit_media, - ], - safest: [ - SecurityLevelStrings.security_level_js_disabled, - SecurityLevelStrings.security_level_limit_typography_svg, - SecurityLevelStrings.security_level_limit_media, - ], - }; - for (const { container, radio } of this._radioOptions) { - const level = radio.value; - radio.setAttribute( - "label", - SecurityLevelStrings[`security_level_${level}`] - ); - container.querySelector(".summary").textContent = - SecurityLevelStrings[`security_level_${level}_summary`]; - const descListItems = descListItemsMap[level]; - if (!descListItems) { - continue; - } - const descrList = container.querySelector( - ".securityLevel-descriptionList" - ); - // TODO: Add the elements in securityLevelPreferences.inc.xhtml again - // when we switch to Fluent - for (const text of descListItems) { - let elem = document.createXULElement("description"); - elem.textContent = text; - elem.className = "indent"; - descrList.append(elem); - } - } - restoreDefaultsButton.addEventListener("command", () => { - SecurityLevelPrefs.securityCustom = false; - }); this._radiogroup.addEventListener("select", () => { SecurityLevelPrefs.securityLevel = this._radiogroup.value; }); ===================================== browser/components/securitylevel/content/securityLevelPanel.inc.xhtml ===================================== @@ -7,20 +7,35 @@ level="top" class="cui-widget-panel panel-no-padding"> <box class="panel-header"> - <html:h1 id="securityLevel-header"></html:h1> + <html:h1 + id="securityLevel-header" + data-l10n-id="security-level-panel-heading" + ></html:h1> </box> <toolbarseparator id="securityLevel-separator"></toolbarseparator> <vbox id="securityLevel-background" class="panel-subview-body"> <html:p id="securityLevel-subheading"> <html:span id="securityLevel-level"></html:span> - <html:span id="securityLevel-custom"></html:span> + <html:span + id="securityLevel-custom" + data-l10n-id="security-level-panel-custom-badge" + ></html:span> </html:p> <html:p id="securityLevel-summary"></html:p> - <html:a id="securityLevel-learnMore" href="about:manual#security-settings"> - </html:a> + <html:a + id="securityLevel-learnMore" + data-l10n-id="security-level-panel-learn-more-link" + href="about:manual#security-settings" + ></html:a> </vbox> <hbox class="panel-footer"> - <button id="securityLevel-settings"/> - <button id="securityLevel-restoreDefaults"/> + <button + id="securityLevel-settings" + data-l10n-id="security-level-panel-open-settings-button" + /> + <button + id="securityLevel-restoreDefaults" + data-l10n-id="security-level-restore-defaults-button" + /> </hbox> </panel> ===================================== browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml ===================================== @@ -2,37 +2,64 @@ data-category="panePrivacy" data-subcategory="securitylevel" hidden="true"> - <label><html:h2></html:h2></label> + <label> + <html:h2 data-l10n-id="security-level-preferences-heading"></html:h2> + </label> <vbox flex="1"> <description flex="1"> - <html:span id="securityLevel-overview" class="tail-with-learn-more"> - </html:span> - <label id="securityLevel-learnMore" - class="learnMore text-link" - is="text-link" - href="about:manual#security-settings" - useoriginprincipal="true"/> + <html:span + id="securityLevel-overview" + 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" + data-l10n-id="security-level-preferences-learn-more-link" + href="about:manual#security-settings" + useoriginprincipal="true" + /> </description> - <hbox id="securityLevel-customNotification" - class="info-box-container" - flex="1"> + <hbox + id="securityLevel-customNotification" + class="info-box-container" + flex="1" + > <hbox class="info-icon-container"> <image class="info-icon securityLevel-custom-warning-icon"/> </hbox> <vbox flex="1"> - <label id="securityLevel-customHeading"/> - <description id="securityLevel-customDescription" flex="1"/> + <label + id="securityLevel-customHeading" + data-l10n-id="security-level-preferences-custom-heading" + /> + <description + id="securityLevel-customDescription" + data-l10n-id="security-level-summary-custom" + flex="1" + /> </vbox> <hbox align="center"> - <button id="securityLevel-restoreDefaults"/> + <button + id="securityLevel-restoreDefaults" + data-l10n-id="security-level-restore-defaults-button" + /> </hbox> </hbox> <radiogroup id="securityLevel-radiogroup"> <vbox class="securityLevel-radio-option"> - <radio value="standard" - aria-describedby="securityLevelSummary-standard"/> + <radio + value="standard" + data-l10n-id="security-level-preferences-level-standard" + aria-describedby="securityLevelSummary-standard" + /> <vbox id="securityLevelSummary-standard"> - <description class="summary indent" flex="1"/> + <description + class="summary indent" + flex="1" + data-l10n-id="security-level-summary-standard" + /> </vbox> </vbox> <vbox class="securityLevel-radio-option"> @@ -41,19 +68,59 @@ - securityLevel-descriptionList is shown or hidden, its text content - is included or excluded from the accessible description, - respectively. --> - <radio value="safer" - aria-describedby="securityLevelSummary-safer"/> + <radio + value="safer" + data-l10n-id="security-level-preferences-level-safer" + aria-describedby="securityLevelSummary-safer" + /> <vbox id="securityLevelSummary-safer"> - <description class="summary indent" flex="1"/> - <vbox class="securityLevel-descriptionList indent"/> + <description + class="summary indent" + flex="1" + data-l10n-id="security-level-summary-safer" + /> + <vbox class="securityLevel-descriptionList indent"> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-https-only-javascript" + /> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-limit-font-and-symbols" + /> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-limit-media" + /> + </vbox> </vbox> </vbox> <vbox class="securityLevel-radio-option"> - <radio value="safest" - aria-describedby="securityLevelSummary-safest"/> + <radio + value="safest" + data-l10n-id="security-level-preferences-level-safest" + aria-describedby="securityLevelSummary-safest" + /> <vbox id="securityLevelSummary-safest"> - <description class="summary indent" flex="1"/> - <vbox class="securityLevel-descriptionList indent"/> + <description + class="summary indent" + flex="1" + data-l10n-id="security-level-summary-safest" + /> + <vbox class="securityLevel-descriptionList indent"> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-disabled-javascript" + /> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-limit-font-and-symbols-and-images" + /> + <description + class="indent" + data-l10n-id="security-level-preferences-bullet-limit-media" + /> + </vbox> </vbox> </vbox> </radiogroup> ===================================== browser/locales/en-US/browser/base-browser.ftl ===================================== @@ -70,6 +70,7 @@ new-identity-dialog-confirm = new-identity-blocked-home-notification = { -brand-short-name } blocked your homepage ({ $url }) from loading because it might recognize your previous session. # Button to continue loading the home page, despite the warning message. new-identity-blocked-home-ignore-button = Load it anyway + ## Preferences - Letterboxing. # The word "Letterboxing" is the proper noun for the Tor Browser feature, and is therefore capitalised. @@ -94,3 +95,74 @@ letterboxing-disabled-description = Letterboxing is currently disabled. # "Letterboxing" should be treated as a feature/product name, and likely not changed in other languages. letterboxing-enable-button = .label = Enable Letterboxing + +## Security level toolbar button. +## Uses sentence case in English (US). +## ".label" is the accessible name, and shown in the overflow menu and when customizing the toolbar. + +security-level-toolbar-button-standard = + .label = Security level + .tooltiptext = Security level: Standard +security-level-toolbar-button-safer = + .label = Security level + .tooltiptext = Security level: Safer +security-level-toolbar-button-safest = + .label = Security level + .tooltiptext = Security level: Safest +# Used when the user is in some custom configuration that does not match a security level. +security-level-toolbar-button-custom = + .label = Security level + .tooltiptext = Security level: Custom + +## Security level popup panel. + +# Uses sentence case in English (US). +security-level-panel-heading = Security level + +security-level-panel-level-standard = Standard +security-level-panel-level-safer = Safer +security-level-panel-level-safest = Safest +security-level-panel-learn-more-link = Learn more +# Button to open security level settings. +security-level-panel-open-settings-button = Settings… + +## Security level settings. + +security-level-preferences-heading = Security Level +security-level-preferences-overview = Disable certain web features that can be used to attack your security and anonymity. +security-level-preferences-learn-more-link = Learn more +security-level-preferences-level-standard = + .label = Standard +security-level-preferences-level-safer = + .label = Safer +security-level-preferences-level-safest = + .label = Safest + +## Security level summaries shown in security panel and settings. + +security-level-summary-standard = All browser and website features are enabled. +security-level-summary-safer = Disables website features that are often dangerous, causing some sites to lose functionality. +security-level-summary-safest = Only allows website features required for static sites and basic services. These changes affect images, media, and scripts. + +## Security level feature bullet points. +## Shown in the settings under the security level when it is selected. + +security-level-preferences-bullet-https-only-javascript = JavaScript is disabled on non-HTTPS sites. +security-level-preferences-bullet-limit-font-and-symbols = Some fonts and math symbols are disabled. +security-level-preferences-bullet-limit-media = Audio and video (HTML5 media), and WebGL are click-to-play. +security-level-preferences-bullet-disabled-javascript = JavaScript is disabled by default on all sites. +security-level-preferences-bullet-limit-font-and-symbols-and-images = Some fonts, icons, math symbols, and images are disabled. + +## Custom security level. +## Some custom preferences configuration has placed the user outside one of the standard three levels. + +# Shown in the security level panel as an orange badge next to the expected level. +security-level-panel-custom-badge = Custom +# Shown in the security level settings in a warning box. +security-level-preferences-custom-heading = Custom security level configured +# Description of custom state and recommended action. +# Shown in the security level panel and settings. +security-level-summary-custom = Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels. +# 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 ===================================== browser/locales/jar.mn ===================================== @@ -32,5 +32,4 @@ locale/browser/safebrowsing/safebrowsing.properties (%chrome/browser/safebrowsing/safebrowsing.properties) locale/browser/feeds/subscribe.properties (%chrome/browser/feeds/subscribe.properties) locale/browser/syncSetup.properties (%chrome/browser/syncSetup.properties) - locale/browser/securityLevel.properties (%chrome/browser/securityLevel.properties) % locale browser-region @AB_CD@ %locale/browser-region/ ===================================== tools/torbrowser/l10n/migrations/bug-42211-new-identity.py deleted ===================================== @@ -1,48 +0,0 @@ -import fluent.syntax.ast as FTL -from fluent.migrate.helpers import TERM_REFERENCE, transforms_from -from fluent.migrate.transforms import REPLACE - - -def migrate(ctx): - legacy_path = "newIdentity.properties" - - ctx.add_transforms( - "base-browser.ftl", - "base-browser.ftl", - transforms_from( - """ -menu-new-identity = - .label = { COPY(path, "new_identity") } - .accesskey = { COPY(path, "new_identity_menu_accesskey") } -appmenuitem-new-identity = - .label = { COPY(path, "new_identity_sentence_case") } -toolbar-new-identity = - .label = { COPY(path, "new_identity_sentence_case") } - .tooltiptext = { toolbar-new-identity.label } - -new-identity-dialog-title = { COPY(path, "new_identity_prompt_title") } -new-identity-dialog-never-ask-checkbox = - .label = { COPY(path, "new_identity_ask_again") } - -new-identity-blocked-home-ignore-button = { COPY(path, "new_identity_home_load_button") } -""", - path=legacy_path, - ) - + [ - # Replace "%S" with "{ -brand-short-name }" in confirm button. - FTL.Message( - id=FTL.Identifier("new-identity-dialog-confirm"), - value=None, - attributes=[ - FTL.Attribute( - id=FTL.Identifier("label"), - value=REPLACE( - legacy_path, - "new_identity_restart", - {"%1$S": TERM_REFERENCE("brand-short-name")}, - ), - ), - ], - ), - ], - ) View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/d3f79d… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/d3f79d… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • ...
  • 745
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.