tbb-commits
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 1 participants
- 20126 discussions
[tor-browser] branch tor-browser-102.2.0esr-12.0-2 updated (be437c77825e6 -> 8e4a269dad69b)
by gitolite role 31 Aug '22
by gitolite role 31 Aug '22
31 Aug '22
This is an automated email from the git hooks/post-receive script.
richard pushed a change to branch tor-browser-102.2.0esr-12.0-2
in repository tor-browser.
from be437c77825e6 Bug 1785788 - Gracefully handle null nickname in CERT_GetCertNicknameWithValidity. r=rrelyea, a=RyanVM UPGRADE_NSS_RELEASE
add 0263cdea8399d Bug 1774413: Bundled fonts are not picked up on macOS r=jfkthame
add e0bdba0a4cbc5 Bug 1769030: Add a configure flag to load policies only from the local policies.json file r=mkaply,glandium
add 925d9f55f3330 Revert "Bug 1724777, optimize suppressed MicroTask handling, r=mccr8 a=RyanVM"
add f760b1fa0f315 Bug 40857: Modified the fat .aar creation file
add f7a6b0d27e152 Adding issue template for bugs.
new c5d04e5f55ded Base Browser's .mozconfigs.
new f95df3421fe32 Bug 41108: Remove privileged macOS installation from 102
new b0a7a07050dc8 Bug 24796: Comment out excess permissions from GeckoView
new 6d4b3ee7e2816 Bug 25741: TBA: Disable GeckoNetworkManager
new 28b8c19755790 Bug 28125: Prevent non-Necko network connections
new 316c840c0842a Bug 12974: Disable NTLM and Negotiate HTTP Auth
new a80a5ad6418d3 Bug 40166: Disable security.certerrors.mitm.auto_enable_enterprise_roots
new 615c85ed629ad Bug 16285: Exclude ClearKey system for now
new 8c15563764396 Bug 21431: Clean-up system extensions shipped in Firefox
new dc3397615966a Bug 33852: Clean up about:logins (LockWise) to avoid mentioning sync, etc.
new 5cdb7dc370d57 Bug 40025: Remove Mozilla add-on install permissions
new 343341145fe58 Bug 40002: Remove about:ion
new 31da1320efb27 Bug 26353: Prevent speculative connect that violated FPI.
new a71804e8e3c49 Bug 31740: Remove some unnecessary RemoteSettings instances
new 0cf2f0e4376a1 Bug 30541: Disable WebGL readPixel() for web content
new f6a2a5775c307 Bug 28369: Stop shipping pingsender executable
new a640fafa891e0 Bug 40073: Disable remote Public Suffix List fetching
new 15c32d87096b8 Firefox preference overrides.
new 7e1d261dd5f8a Bug 41043: Hardcode the UI font on Linux
new 6a316abec639a Bug 30605: Honor privacy.spoof_english in Android
new 02e0d7df9156a Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView
new c537feccb6cde Bug 40171: Make WebRequest and GeckoWebExecutor First-Party aware
new 54e546342955d Bug 26345: Hide tracking protection UI
new a3476187a9ec4 Bug 9173: Change the default Firefox profile directory to be relative.
new 19c0c6474b862 Bug 18800: Remove localhost DNS lookup in nsProfileLock.cpp
new 7683ff2fc3ca4 Bug 27604: Fix addon issues when moving the profile directory
new 54751bd206ca5 Bug 13028: Prevent potential proxy bypass cases.
new b62d0733cbc96 Bug 11641: Disable remoting by default.
new 9a6dac5c75f97 Bug 21830: Copying large text from web console leaks to /tmp
new 80d4757bf4395 Bug 23104: Add a default line height compensation
new d9ff33feb7079 Bug 40309: Avoid using regional OS locales
new 03195e7afa980 Bug 40432: Prevent probing installed applications
new bb3ee4b7b2962 Bug 32220: Improve the letterboxing experience
new b7e368120541d Bug 40069: Add helpers for message passing with extensions
new 7ef16c4bd4cbf Bug 40253: Explicitly allow NoScript in Private Browsing mode.
new 231b7a82c36e1 Bug 40925: Implemented the Security Level component
new d627ac1c69d55 Bug 40926: Implemented the New Identity feature
new 659fbc98b77a5 Bug 41089: Add tor-browser build scripts + Makefile to tor-browser
new 8b13edaca1026 Bug 2176: Rebrand Firefox to TorBrowser
new 2fadcd23113e3 Bring back old Firefox onboarding
new 5b6d65d612f2d Bug 26961: New user onboarding.
new f4557323c0818 TB3: Tor Browser's official .mozconfigs.
new 99b8feaf41a85 Bug 40562: Added Tor-related preferences to 000-tor-browser.js
new 80bedacde09ff Bug 13252: Do not store data in the app bundle
new 4c501c79aed3c Bug 40597: Implement TorSettings module
new 93d45273b77ff Bug 10760: Integrate TorButton to TorBrowser core
new c80c0e9bbfca4 Bug 28044: Integrate Tor Launcher into tor-browser
new b30e49f065da4 Orfox: Centralized proxy applied to AbstractCommunicator and BaseResources.
new d1f81e6e1da25 Add TorStrings module for localization
new b924418acef3b Bug 14631: Improve profile access error messages.
new b2f764ca0a745 Bug 40209: Implement Basic Crypto Safety
new ba292b8bf083a Bug 19273: Avoid JavaScript patching of the external app helper dialog.
new 88023efe694bb Bug 40807: Added QRCode.js to toolkit/modules
new a245f12724949 Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection
new 777c84f5211c1 Bug 27476: Implement about:torconnect captive portal within Tor Browser
new 6c6218c523ae1 Bug 12620: TorBrowser regression tests
new 413ad7d4e21fc Bug 4234: Use the Firefox Update Process for Tor Browser.
new be335d570739f Bug 13379: Sign our MAR files.
new d15354caa1ced Bug 16940: After update, load local change notes.
new a9dca6da3fd64 Bug 32658: Create a new MAR signing key
new 2b9ee17b90656 Omnibox: Add DDG, Startpage, Disconnect, Youtube, Twitter; remove Amazon, eBay, bing
new a940145efa12f Bug 23247: Communicating security expectations for .onion
new 422ba974edc99 Bug 30237: Add v3 onion services client authentication prompt
new 46a0c98c2fe5c Bug 21952: Implement Onion-Location
new f1b7712401a32 Bug 40458: Implement .tor.onion aliases
new 8e4a269dad69b Bug 11698: Incorporate Tor Browser Manual pages into Tor Browser
The 66 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.eslintignore | 3 +
.gitignore | 3 +
.gitlab/issue_templates/UXBug.md | 29 +
.gitlab/issue_templates/bug.md | 32 +
.gitmodules | 3 +
browser/actors/AboutTBUpdateChild.jsm | 12 +
browser/actors/AboutTBUpdateParent.jsm | 120 +
browser/actors/CryptoSafetyChild.jsm | 87 +
browser/actors/CryptoSafetyParent.jsm | 142 +
browser/actors/NetErrorChild.jsm | 7 +
browser/actors/NetErrorParent.jsm | 6 +
browser/actors/moz.build | 8 +
browser/app/Makefile.in | 4 +-
browser/app/macbuild/Contents/Info.plist.in | 2 +-
browser/app/macbuild/Contents/MacOS-files.in | 1 -
browser/app/permissions | 16 +-
browser/app/profile/000-tor-browser.js | 96 +
browser/app/profile/001-base-profile.js | 670 ++
browser/app/profile/firefox.js | 32 +-
browser/base/content/aboutDialog-appUpdater.js | 2 +-
browser/base/content/aboutDialog.js | 14 +-
browser/base/content/aboutDialog.xhtml | 40 +-
.../base/content/abouttbupdate/aboutTBUpdate.css | 74 +
.../base/content/abouttbupdate/aboutTBUpdate.js | 27 +
.../base/content/abouttbupdate/aboutTBUpdate.xhtml | 39 +
browser/base/content/appmenu-viewcache.inc.xhtml | 15 +-
browser/base/content/browser-doctype.inc | 8 +
browser/base/content/browser-menubar.inc | 48 +-
browser/base/content/browser-sets.inc | 2 +
browser/base/content/browser-siteIdentity.js | 65 +-
browser/base/content/browser.css | 7 +
browser/base/content/browser.js | 113 +-
browser/base/content/browser.xhtml | 18 +
browser/base/content/certerror/aboutNetError.js | 22 +-
browser/base/content/certerror/aboutNetError.xhtml | 1 +
browser/base/content/main-popupset.inc.xhtml | 3 +
browser/base/content/navigator-toolbox.inc.xhtml | 14 +
browser/base/content/pageinfo/security.js | 49 +-
browser/base/content/popup-notifications.inc | 14 +
browser/base/content/tabbrowser-tab.js | 9 +
browser/base/content/utilityOverlay.js | 20 +
browser/base/jar.mn | 5 +
browser/base/moz.build | 3 +
browser/branding/alpha/VisualElements_150.png | Bin 0 -> 8412 bytes
browser/branding/alpha/VisualElements_70.png | Bin 0 -> 3496 bytes
browser/branding/alpha/background.png | Bin 0 -> 33362 bytes
browser/branding/alpha/bgstub.jpg | Bin 0 -> 12506 bytes
browser/branding/alpha/bgstub_2x.jpg | Bin 0 -> 49771 bytes
browser/branding/{nightly => alpha}/branding.nsi | 0
browser/branding/alpha/configure.sh | 5 +
browser/branding/alpha/content/about-logo.png | Bin 0 -> 21173 bytes
.../{nightly => alpha}/content/about-logo.svg | 0
browser/branding/alpha/content/about-logo(a)2x.png | Bin 0 -> 51309 bytes
browser/branding/alpha/content/about-wordmark.svg | 36 +
browser/branding/alpha/content/about.png | Bin 0 -> 18520 bytes
browser/branding/alpha/content/aboutDialog.css | 49 +
browser/branding/alpha/content/aboutlogins.svg | 59 +
.../content/firefox-wordmark.svg | 0
.../alpha/content/identity-icons-brand.svg | 8 +
browser/branding/alpha/content/jar.mn | 23 +
.../branding/{aurora => alpha}/content/moz.build | 0
browser/branding/alpha/content/tor-styles.css | 13 +
browser/branding/alpha/default128.png | Bin 0 -> 9397 bytes
browser/branding/alpha/default16.png | Bin 0 -> 811 bytes
browser/branding/alpha/default22.png | Bin 0 -> 1240 bytes
browser/branding/alpha/default24.png | Bin 0 -> 1368 bytes
browser/branding/alpha/default256.png | Bin 0 -> 20481 bytes
browser/branding/alpha/default32.png | Bin 0 -> 1956 bytes
browser/branding/alpha/default48.png | Bin 0 -> 3067 bytes
browser/branding/alpha/default512.png | Bin 0 -> 44907 bytes
browser/branding/alpha/default64.png | Bin 0 -> 4318 bytes
browser/branding/alpha/disk.icns | Bin 0 -> 1548786 bytes
browser/branding/alpha/document.icns | Bin 0 -> 564054 bytes
browser/branding/alpha/document.ico | Bin 0 -> 119671 bytes
browser/branding/{nightly => alpha}/dsstore | Bin
.../alpha/firefox.VisualElementsManifest.xml | 12 +
browser/branding/alpha/firefox.icns | Bin 0 -> 291096 bytes
browser/branding/alpha/firefox.ico | Bin 0 -> 119941 bytes
browser/branding/alpha/firefox.svg | 25 +
browser/branding/alpha/firefox64.ico | Bin 0 -> 119941 bytes
browser/branding/alpha/locales/en-US/brand.dtd | 11 +
browser/branding/alpha/locales/en-US/brand.ftl | 26 +
.../branding/alpha/locales/en-US/brand.properties | 14 +
.../branding/{official => alpha}/locales/jar.mn | 0
.../{aurora/content => alpha/locales}/moz.build | 0
browser/branding/{aurora => alpha}/moz.build | 0
browser/branding/{aurora => alpha}/newtab.ico | Bin
browser/branding/{aurora => alpha}/newwindow.ico | Bin
browser/branding/{aurora => alpha}/pbmode.ico | Bin
browser/branding/alpha/pref/firefox-branding.js | 34 +
.../{nightly => alpha}/stubinstaller/bgstub.jpg | Bin
.../stubinstaller/installing_page.css | 0
.../stubinstaller/profile_cleanup_page.css | 0
browser/branding/alpha/wizHeader.bmp | Bin 0 -> 34254 bytes
browser/branding/alpha/wizHeaderRTL.bmp | Bin 0 -> 34254 bytes
browser/branding/alpha/wizWatermark.bmp | Bin 0 -> 206038 bytes
browser/branding/branding-common.mozbuild | 2 +
browser/branding/nightly/VisualElements_150.png | Bin 25470 -> 11666 bytes
browser/branding/nightly/VisualElements_70.png | Bin 9590 -> 4273 bytes
browser/branding/nightly/configure.sh | 8 +-
.../nightly/content/identity-icons-brand.svg | 8 +
browser/branding/nightly/content/jar.mn | 4 +
browser/branding/nightly/content/tor-styles.css | 13 +
browser/branding/nightly/default128.png | Bin 12392 -> 13686 bytes
browser/branding/nightly/default16.png | Bin 756 -> 891 bytes
browser/branding/nightly/default22.png | Bin 1146 -> 1377 bytes
browser/branding/nightly/default24.png | Bin 1281 -> 1509 bytes
browser/branding/nightly/default256.png | Bin 30546 -> 33587 bytes
browser/branding/nightly/default32.png | Bin 1910 -> 2254 bytes
browser/branding/nightly/default48.png | Bin 3606 -> 3789 bytes
browser/branding/nightly/default512.png | Bin 0 -> 87830 bytes
browser/branding/nightly/default64.png | Bin 4826 -> 5426 bytes
browser/branding/nightly/document.icns | Bin 517716 -> 689723 bytes
browser/branding/nightly/document.ico | Bin 47042 -> 124422 bytes
.../nightly/firefox.VisualElementsManifest.xml | 2 +-
browser/branding/nightly/firefox.icns | Bin 1014680 -> 642308 bytes
browser/branding/nightly/firefox.ico | Bin 66730 -> 131711 bytes
browser/branding/nightly/firefox.svg | 29 +
browser/branding/nightly/firefox64.ico | Bin 38630 -> 131711 bytes
browser/branding/nightly/locales/en-US/brand.dtd | 2 +-
browser/branding/nightly/locales/en-US/brand.ftl | 2 +-
.../nightly/locales/en-US/brand.properties | 6 +-
browser/branding/nightly/locales/jar.mn | 7 +-
browser/branding/nightly/locales/moz.build | 2 -
browser/branding/nightly/wizHeader.bmp | Bin 25820 -> 34254 bytes
browser/branding/nightly/wizHeaderRTL.bmp | Bin 25820 -> 34254 bytes
browser/branding/nightly/wizWatermark.bmp | Bin 154544 -> 206038 bytes
browser/branding/official/VisualElements_150.png | Bin 23037 -> 7949 bytes
browser/branding/official/VisualElements_70.png | Bin 8763 -> 3374 bytes
browser/branding/official/configure.sh | 16 +-
.../official/content/identity-icons-brand.svg | 8 +
browser/branding/official/content/jar.mn | 4 +
browser/branding/official/content/tor-styles.css | 13 +
browser/branding/official/default128.png | Bin 13513 -> 9007 bytes
browser/branding/official/default16.png | Bin 722 -> 839 bytes
browser/branding/official/default22.png | Bin 1134 -> 1250 bytes
browser/branding/official/default24.png | Bin 1312 -> 1405 bytes
browser/branding/official/default256.png | Bin 32441 -> 19136 bytes
browser/branding/official/default32.png | Bin 1948 -> 1965 bytes
browser/branding/official/default48.png | Bin 3448 -> 3074 bytes
browser/branding/official/default512.png | Bin 0 -> 40438 bytes
browser/branding/official/default64.png | Bin 5459 -> 4196 bytes
browser/branding/official/disk.icns | Bin 1525764 -> 172073 bytes
browser/branding/official/document.icns | Bin 501145 -> 509227 bytes
browser/branding/official/document.ico | Bin 45478 -> 119916 bytes
.../official/firefox.VisualElementsManifest.xml | 2 +-
browser/branding/official/firefox.icns | Bin 1021785 -> 259709 bytes
browser/branding/official/firefox.ico | Bin 68328 -> 118595 bytes
browser/branding/official/firefox.svg | 31 +
browser/branding/official/firefox64.ico | Bin 38630 -> 118595 bytes
browser/branding/official/locales/en-US/brand.dtd | 2 +-
.../official/locales/en-US/brand.properties | 6 +-
browser/branding/official/wizHeader.bmp | Bin 25820 -> 34254 bytes
browser/branding/official/wizHeaderRTL.bmp | Bin 25820 -> 34254 bytes
browser/branding/official/wizWatermark.bmp | Bin 154544 -> 206038 bytes
browser/branding/tor-styles.inc.css | 87 +
browser/components/BrowserContentHandler.jsm | 90 +-
browser/components/BrowserGlue.jsm | 189 +-
browser/components/about/AboutRedirector.cpp | 81 +-
browser/components/about/components.conf | 8 +-
.../components/aboutlogins/AboutLoginsParent.jsm | 2 +
.../components/aboutlogins/content/aboutLogins.css | 5 +
.../components/aboutlogins/content/aboutLogins.js | 6 +
.../content/components/fxaccounts-button.css | 5 +
.../controlcenter/content/identityPanel.inc.xhtml | 22 +
.../customizableui/content/panelUI.inc.xhtml | 2 +-
browser/components/moz.build | 13 +-
.../components/newidentity/content/newidentity.js | 567 ++
browser/components/newidentity/jar.mn | 13 +
.../locale/en-US/newIdentity.properties | 8 +
browser/components/newidentity/moz.build | 1 +
browser/components/newtab/AboutNewTabService.jsm | 15 +-
.../components/onionservices/OnionAliasStore.jsm | 563 ++
.../onionservices/OnionLocationChild.jsm | 48 +
.../onionservices/OnionLocationParent.jsm | 169 +
.../content/authNotificationIcon.inc.xhtml | 6 +
.../onionservices/content/authPopup.inc.xhtml | 16 +
.../onionservices/content/authPreferences.css | 20 +
.../content/authPreferences.inc.xhtml | 19 +
.../onionservices/content/authPreferences.js | 68 +
.../components/onionservices/content/authPrompt.js | 359 +
.../components/onionservices/content/authUtil.jsm | 46 +
.../onionservices/content/netError/browser.svg | 3 +
.../onionservices/content/netError/network.svg | 3 +
.../content/netError/onionNetError.css | 70 +
.../content/netError/onionNetError.js | 241 +
.../onionservices/content/netError/onionsite.svg | 8 +
.../content/onionlocation-urlbar.inc.xhtml | 10 +
.../onionservices/content/onionlocation.css | 46 +
.../onionservices/content/onionlocation.svg | 3 +
.../content/onionlocationPreferences.inc.xhtml | 11 +
.../content/onionlocationPreferences.js | 34 +
.../onionservices/content/onionservices.css | 69 +
.../onionservices/content/savedKeysDialog.js | 259 +
.../onionservices/content/savedKeysDialog.xhtml | 42 +
browser/components/onionservices/jar.mn | 12 +
browser/components/onionservices/moz.build | 7 +
browser/components/preferences/home.inc.xhtml | 4 +-
browser/components/preferences/main.inc.xhtml | 54 -
browser/components/preferences/main.js | 14 -
browser/components/preferences/preferences.js | 14 +-
browser/components/preferences/preferences.xhtml | 12 +-
browser/components/preferences/privacy.inc.xhtml | 6 +
browser/components/preferences/privacy.js | 44 +
browser/components/rulesets/RulesetsChild.jsm | 11 +
browser/components/rulesets/RulesetsParent.jsm | 79 +
.../components/rulesets/content/aboutRulesets.css | 319 +
.../components/rulesets/content/aboutRulesets.html | 110 +
.../components/rulesets/content/aboutRulesets.js | 531 ++
browser/components/rulesets/content/securedrop.svg | 173 +
browser/components/rulesets/jar.mn | 5 +
browser/components/rulesets/moz.build | 6 +
browser/components/search/SearchSERPTelemetry.jsm | 6 -
.../search/extensions/blockchair-onion/favicon.png | Bin 0 -> 3116 bytes
.../extensions/blockchair-onion/manifest.json | 26 +
.../search/extensions/blockchair/favicon.png | Bin 0 -> 2898 bytes
.../search/extensions/blockchair/manifest.json | 26 +
.../search/extensions/ddg-onion/favicon.ico | Bin 0 -> 973 bytes
.../search/extensions/ddg-onion/manifest.json | 26 +
.../components/search/extensions/ddg/favicon.ico | Bin 5430 -> 0 bytes
.../components/search/extensions/ddg/favicon.png | Bin 0 -> 1150 bytes
.../components/search/extensions/ddg/manifest.json | 38 +-
.../extensions/google/_locales/b-1-d/messages.json | 23 -
.../extensions/google/_locales/b-1-e/messages.json | 23 -
.../extensions/google/_locales/b-d/messages.json | 23 -
.../extensions/google/_locales/b-e/messages.json | 23 -
.../extensions/google/_locales/en/messages.json | 24 -
.../google/_locales/region-by/messages.json | 20 -
.../google/_locales/region-kz/messages.json | 20 -
.../google/_locales/region-ru/messages.json | 20 -
.../google/_locales/region-tr/messages.json | 20 -
.../search/extensions/google/manifest.json | 17 +-
.../search/extensions/startpage/favicon.png | Bin 0 -> 1150 bytes
.../search/extensions/startpage/manifest.json | 26 +
.../extensions/twitter/favicon.ico} | Bin
.../search/extensions/twitter/manifest.json | 26 +
.../extensions/wikipedia/_locales/NN/messages.json | 20 -
.../extensions/wikipedia/_locales/NO/messages.json | 20 -
.../extensions/wikipedia/_locales/af/messages.json | 20 -
.../extensions/wikipedia/_locales/an/messages.json | 20 -
.../extensions/wikipedia/_locales/ar/messages.json | 20 -
.../wikipedia/_locales/ast/messages.json | 20 -
.../extensions/wikipedia/_locales/az/messages.json | 20 -
.../wikipedia/_locales/be-tarask/messages.json | 20 -
.../extensions/wikipedia/_locales/be/messages.json | 20 -
.../extensions/wikipedia/_locales/bg/messages.json | 20 -
.../extensions/wikipedia/_locales/bn/messages.json | 20 -
.../extensions/wikipedia/_locales/br/messages.json | 20 -
.../extensions/wikipedia/_locales/bs/messages.json | 20 -
.../extensions/wikipedia/_locales/ca/messages.json | 20 -
.../extensions/wikipedia/_locales/cy/messages.json | 20 -
.../extensions/wikipedia/_locales/cz/messages.json | 20 -
.../extensions/wikipedia/_locales/da/messages.json | 20 -
.../extensions/wikipedia/_locales/de/messages.json | 20 -
.../wikipedia/_locales/dsb/messages.json | 20 -
.../extensions/wikipedia/_locales/el/messages.json | 20 -
.../extensions/wikipedia/_locales/en/messages.json | 20 -
.../extensions/wikipedia/_locales/eo/messages.json | 20 -
.../extensions/wikipedia/_locales/es/messages.json | 20 -
.../extensions/wikipedia/_locales/et/messages.json | 20 -
.../extensions/wikipedia/_locales/eu/messages.json | 20 -
.../extensions/wikipedia/_locales/fa/messages.json | 20 -
.../extensions/wikipedia/_locales/fi/messages.json | 20 -
.../extensions/wikipedia/_locales/fr/messages.json | 20 -
.../wikipedia/_locales/fy-NL/messages.json | 20 -
.../wikipedia/_locales/ga-IE/messages.json | 20 -
.../extensions/wikipedia/_locales/gd/messages.json | 20 -
.../extensions/wikipedia/_locales/gl/messages.json | 20 -
.../extensions/wikipedia/_locales/gn/messages.json | 20 -
.../extensions/wikipedia/_locales/gu/messages.json | 20 -
.../extensions/wikipedia/_locales/he/messages.json | 20 -
.../extensions/wikipedia/_locales/hi/messages.json | 20 -
.../extensions/wikipedia/_locales/hr/messages.json | 20 -
.../wikipedia/_locales/hsb/messages.json | 20 -
.../extensions/wikipedia/_locales/hu/messages.json | 20 -
.../extensions/wikipedia/_locales/hy/messages.json | 20 -
.../extensions/wikipedia/_locales/ia/messages.json | 20 -
.../extensions/wikipedia/_locales/id/messages.json | 20 -
.../extensions/wikipedia/_locales/is/messages.json | 20 -
.../extensions/wikipedia/_locales/it/messages.json | 20 -
.../extensions/wikipedia/_locales/ja/messages.json | 20 -
.../extensions/wikipedia/_locales/ka/messages.json | 20 -
.../wikipedia/_locales/kab/messages.json | 20 -
.../extensions/wikipedia/_locales/kk/messages.json | 20 -
.../extensions/wikipedia/_locales/km/messages.json | 20 -
.../extensions/wikipedia/_locales/kn/messages.json | 20 -
.../extensions/wikipedia/_locales/kr/messages.json | 20 -
.../wikipedia/_locales/lij/messages.json | 20 -
.../extensions/wikipedia/_locales/lo/messages.json | 20 -
.../extensions/wikipedia/_locales/lt/messages.json | 20 -
.../wikipedia/_locales/ltg/messages.json | 20 -
.../extensions/wikipedia/_locales/lv/messages.json | 20 -
.../extensions/wikipedia/_locales/mk/messages.json | 20 -
.../extensions/wikipedia/_locales/mr/messages.json | 20 -
.../extensions/wikipedia/_locales/ms/messages.json | 20 -
.../extensions/wikipedia/_locales/my/messages.json | 20 -
.../extensions/wikipedia/_locales/ne/messages.json | 20 -
.../extensions/wikipedia/_locales/nl/messages.json | 20 -
.../extensions/wikipedia/_locales/oc/messages.json | 20 -
.../extensions/wikipedia/_locales/pa/messages.json | 20 -
.../extensions/wikipedia/_locales/pl/messages.json | 20 -
.../extensions/wikipedia/_locales/pt/messages.json | 20 -
.../extensions/wikipedia/_locales/rm/messages.json | 20 -
.../extensions/wikipedia/_locales/ro/messages.json | 20 -
.../extensions/wikipedia/_locales/ru/messages.json | 20 -
.../extensions/wikipedia/_locales/si/messages.json | 20 -
.../extensions/wikipedia/_locales/sk/messages.json | 20 -
.../extensions/wikipedia/_locales/sl/messages.json | 20 -
.../extensions/wikipedia/_locales/sq/messages.json | 20 -
.../extensions/wikipedia/_locales/sr/messages.json | 20 -
.../wikipedia/_locales/sv-SE/messages.json | 20 -
.../extensions/wikipedia/_locales/ta/messages.json | 20 -
.../extensions/wikipedia/_locales/te/messages.json | 20 -
.../extensions/wikipedia/_locales/th/messages.json | 20 -
.../extensions/wikipedia/_locales/tl/messages.json | 20 -
.../extensions/wikipedia/_locales/tr/messages.json | 20 -
.../extensions/wikipedia/_locales/uk/messages.json | 20 -
.../extensions/wikipedia/_locales/ur/messages.json | 20 -
.../extensions/wikipedia/_locales/uz/messages.json | 20 -
.../extensions/wikipedia/_locales/vi/messages.json | 20 -
.../extensions/wikipedia/_locales/wo/messages.json | 20 -
.../wikipedia/_locales/zh-CN/messages.json | 20 -
.../wikipedia/_locales/zh-TW/messages.json | 20 -
.../search/extensions/wikipedia/manifest.json | 15 +-
.../components/search/extensions/yahoo/favicon.ico | Bin 0 -> 5430 bytes
.../search/extensions/yahoo/manifest.json | 28 +
.../search/extensions/youtube/favicon.ico | Bin 0 -> 1150 bytes
.../search/extensions/youtube/manifest.json | 26 +
browser/components/securitylevel/SecurityLevel.jsm | 421 +
.../securitylevel/SecurityLevel.manifest | 1 +
browser/components/securitylevel/components.conf | 10 +
.../securitylevel/content/securityLevel.js | 615 ++
.../securitylevel/content/securityLevelButton.css | 18 +
.../content/securityLevelButton.inc.xhtml | 9 +
.../securitylevel/content/securityLevelIcon.svg | 40 +
.../securitylevel/content/securityLevelPanel.css | 71 +
.../content/securityLevelPanel.inc.xhtml | 46 +
.../content/securityLevelPreferences.css | 51 +
.../content/securityLevelPreferences.inc.xhtml | 62 +
browser/components/securitylevel/jar.mn | 11 +
.../locale/en-US/securityLevel.properties | 30 +
browser/components/securitylevel/moz.build | 13 +
browser/components/sessionstore/SessionStore.jsm | 10 +
browser/components/torconnect/TorConnectChild.jsm | 9 +
browser/components/torconnect/TorConnectParent.jsm | 202 +
.../torconnect/content/aboutTorConnect.css | 324 +
.../torconnect/content/aboutTorConnect.js | 843 ++
.../torconnect/content/aboutTorConnect.xhtml | 68 +
.../components/torconnect/content/arrow-right.svg | 4 +
browser/components/torconnect/content/bridge.svg | 5 +
.../torconnect/content/connection-failure.svg | 5 +
.../torconnect/content/connection-location.svg | 5 +
.../torconnect/content/onion-slash-fillable.svg | 5 +
.../components/torconnect/content/onion-slash.svg | 5 +
browser/components/torconnect/content/onion.svg | 4 +
.../torconnect/content/torBootstrapUrlbar.js | 95 +
.../torconnect/content/torconnect-urlbar.css | 37 +
.../torconnect/content/torconnect-urlbar.inc.xhtml | 10 +
browser/components/torconnect/jar.mn | 13 +
browser/components/torconnect/moz.build | 6 +
.../torpreferences/content/bridgeQrDialog.jsm | 51 +
.../torpreferences/content/bridgeQrDialog.xhtml | 25 +
.../content/bridgemoji-annotations.json | 9032 ++++++++++++++++++++
.../torpreferences/content/bridgemoji/1f300.svg | 1 +
.../torpreferences/content/bridgemoji/1f308.svg | 1 +
.../torpreferences/content/bridgemoji/1f30a.svg | 1 +
.../torpreferences/content/bridgemoji/1f30b.svg | 1 +
.../torpreferences/content/bridgemoji/1f319.svg | 1 +
.../torpreferences/content/bridgemoji/1f31f.svg | 1 +
.../torpreferences/content/bridgemoji/1f321.svg | 1 +
.../torpreferences/content/bridgemoji/1f32d.svg | 1 +
.../torpreferences/content/bridgemoji/1f32e.svg | 1 +
.../torpreferences/content/bridgemoji/1f332.svg | 1 +
.../torpreferences/content/bridgemoji/1f333.svg | 1 +
.../torpreferences/content/bridgemoji/1f334.svg | 1 +
.../torpreferences/content/bridgemoji/1f335.svg | 1 +
.../torpreferences/content/bridgemoji/1f336.svg | 1 +
.../torpreferences/content/bridgemoji/1f337.svg | 1 +
.../torpreferences/content/bridgemoji/1f339.svg | 1 +
.../torpreferences/content/bridgemoji/1f33a.svg | 1 +
.../torpreferences/content/bridgemoji/1f33b.svg | 1 +
.../torpreferences/content/bridgemoji/1f33d.svg | 1 +
.../torpreferences/content/bridgemoji/1f33f.svg | 1 +
.../torpreferences/content/bridgemoji/1f341.svg | 1 +
.../torpreferences/content/bridgemoji/1f344.svg | 1 +
.../torpreferences/content/bridgemoji/1f345.svg | 1 +
.../torpreferences/content/bridgemoji/1f346.svg | 1 +
.../torpreferences/content/bridgemoji/1f347.svg | 1 +
.../torpreferences/content/bridgemoji/1f348.svg | 1 +
.../torpreferences/content/bridgemoji/1f349.svg | 1 +
.../torpreferences/content/bridgemoji/1f34a.svg | 1 +
.../torpreferences/content/bridgemoji/1f34b.svg | 1 +
.../torpreferences/content/bridgemoji/1f34c.svg | 1 +
.../torpreferences/content/bridgemoji/1f34d.svg | 1 +
.../torpreferences/content/bridgemoji/1f34f.svg | 1 +
.../torpreferences/content/bridgemoji/1f350.svg | 1 +
.../torpreferences/content/bridgemoji/1f351.svg | 1 +
.../torpreferences/content/bridgemoji/1f352.svg | 1 +
.../torpreferences/content/bridgemoji/1f353.svg | 1 +
.../torpreferences/content/bridgemoji/1f354.svg | 1 +
.../torpreferences/content/bridgemoji/1f355.svg | 1 +
.../torpreferences/content/bridgemoji/1f368.svg | 1 +
.../torpreferences/content/bridgemoji/1f369.svg | 1 +
.../torpreferences/content/bridgemoji/1f36a.svg | 1 +
.../torpreferences/content/bridgemoji/1f36b.svg | 1 +
.../torpreferences/content/bridgemoji/1f36c.svg | 1 +
.../torpreferences/content/bridgemoji/1f36d.svg | 1 +
.../torpreferences/content/bridgemoji/1f37f.svg | 1 +
.../torpreferences/content/bridgemoji/1f380.svg | 1 +
.../torpreferences/content/bridgemoji/1f381.svg | 1 +
.../torpreferences/content/bridgemoji/1f382.svg | 1 +
.../torpreferences/content/bridgemoji/1f383.svg | 1 +
.../torpreferences/content/bridgemoji/1f388.svg | 1 +
.../torpreferences/content/bridgemoji/1f389.svg | 1 +
.../torpreferences/content/bridgemoji/1f38f.svg | 1 +
.../torpreferences/content/bridgemoji/1f392.svg | 1 +
.../torpreferences/content/bridgemoji/1f399.svg | 1 +
.../torpreferences/content/bridgemoji/1f39f.svg | 1 +
.../torpreferences/content/bridgemoji/1f3a0.svg | 1 +
.../torpreferences/content/bridgemoji/1f3a1.svg | 1 +
.../torpreferences/content/bridgemoji/1f3a2.svg | 1 +
.../torpreferences/content/bridgemoji/1f3a8.svg | 1 +
.../torpreferences/content/bridgemoji/1f3ac.svg | 1 +
.../torpreferences/content/bridgemoji/1f3af.svg | 1 +
.../torpreferences/content/bridgemoji/1f3b2.svg | 1 +
.../torpreferences/content/bridgemoji/1f3b6.svg | 1 +
.../torpreferences/content/bridgemoji/1f3b7.svg | 1 +
.../torpreferences/content/bridgemoji/1f3b8.svg | 1 +
.../torpreferences/content/bridgemoji/1f3ba.svg | 1 +
.../torpreferences/content/bridgemoji/1f3bb.svg | 1 +
.../torpreferences/content/bridgemoji/1f3be.svg | 1 +
.../torpreferences/content/bridgemoji/1f3c0.svg | 1 +
.../torpreferences/content/bridgemoji/1f3c6.svg | 1 +
.../torpreferences/content/bridgemoji/1f3c8.svg | 1 +
.../torpreferences/content/bridgemoji/1f3d3.svg | 1 +
.../torpreferences/content/bridgemoji/1f3d4.svg | 1 +
.../torpreferences/content/bridgemoji/1f3d5.svg | 1 +
.../torpreferences/content/bridgemoji/1f3dd.svg | 1 +
.../torpreferences/content/bridgemoji/1f3e1.svg | 1 +
.../torpreferences/content/bridgemoji/1f3ee.svg | 1 +
.../torpreferences/content/bridgemoji/1f3f7.svg | 1 +
.../torpreferences/content/bridgemoji/1f3f8.svg | 1 +
.../torpreferences/content/bridgemoji/1f3f9.svg | 1 +
.../torpreferences/content/bridgemoji/1f40a.svg | 1 +
.../torpreferences/content/bridgemoji/1f40c.svg | 1 +
.../torpreferences/content/bridgemoji/1f40d.svg | 1 +
.../torpreferences/content/bridgemoji/1f417.svg | 1 +
.../torpreferences/content/bridgemoji/1f418.svg | 1 +
.../torpreferences/content/bridgemoji/1f419.svg | 1 +
.../torpreferences/content/bridgemoji/1f41a.svg | 1 +
.../torpreferences/content/bridgemoji/1f41b.svg | 1 +
.../torpreferences/content/bridgemoji/1f41d.svg | 1 +
.../torpreferences/content/bridgemoji/1f41e.svg | 1 +
.../torpreferences/content/bridgemoji/1f41f.svg | 1 +
.../torpreferences/content/bridgemoji/1f420.svg | 1 +
.../torpreferences/content/bridgemoji/1f422.svg | 1 +
.../torpreferences/content/bridgemoji/1f425.svg | 1 +
.../torpreferences/content/bridgemoji/1f426.svg | 1 +
.../torpreferences/content/bridgemoji/1f428.svg | 1 +
.../torpreferences/content/bridgemoji/1f42a.svg | 1 +
.../torpreferences/content/bridgemoji/1f42c.svg | 1 +
.../torpreferences/content/bridgemoji/1f42d.svg | 1 +
.../torpreferences/content/bridgemoji/1f42e.svg | 1 +
.../torpreferences/content/bridgemoji/1f42f.svg | 1 +
.../torpreferences/content/bridgemoji/1f430.svg | 1 +
.../torpreferences/content/bridgemoji/1f431.svg | 1 +
.../torpreferences/content/bridgemoji/1f432.svg | 1 +
.../torpreferences/content/bridgemoji/1f433.svg | 1 +
.../torpreferences/content/bridgemoji/1f434.svg | 1 +
.../torpreferences/content/bridgemoji/1f435.svg | 1 +
.../torpreferences/content/bridgemoji/1f436.svg | 1 +
.../torpreferences/content/bridgemoji/1f437.svg | 1 +
.../torpreferences/content/bridgemoji/1f43a.svg | 1 +
.../torpreferences/content/bridgemoji/1f43b.svg | 1 +
.../torpreferences/content/bridgemoji/1f43f.svg | 1 +
.../torpreferences/content/bridgemoji/1f441.svg | 1 +
.../torpreferences/content/bridgemoji/1f451.svg | 1 +
.../torpreferences/content/bridgemoji/1f455.svg | 1 +
.../torpreferences/content/bridgemoji/1f457.svg | 1 +
.../torpreferences/content/bridgemoji/1f45f.svg | 1 +
.../torpreferences/content/bridgemoji/1f47d.svg | 1 +
.../torpreferences/content/bridgemoji/1f484.svg | 1 +
.../torpreferences/content/bridgemoji/1f488.svg | 1 +
.../torpreferences/content/bridgemoji/1f48d.svg | 1 +
.../torpreferences/content/bridgemoji/1f48e.svg | 1 +
.../torpreferences/content/bridgemoji/1f490.svg | 1 +
.../torpreferences/content/bridgemoji/1f4a1.svg | 1 +
.../torpreferences/content/bridgemoji/1f4a7.svg | 1 +
.../torpreferences/content/bridgemoji/1f4b3.svg | 1 +
.../torpreferences/content/bridgemoji/1f4bf.svg | 1 +
.../torpreferences/content/bridgemoji/1f4cc.svg | 1 +
.../torpreferences/content/bridgemoji/1f4ce.svg | 1 +
.../torpreferences/content/bridgemoji/1f4d5.svg | 1 +
.../torpreferences/content/bridgemoji/1f4e1.svg | 1 +
.../torpreferences/content/bridgemoji/1f4e2.svg | 1 +
.../torpreferences/content/bridgemoji/1f4fb.svg | 1 +
.../torpreferences/content/bridgemoji/1f50b.svg | 1 +
.../torpreferences/content/bridgemoji/1f511.svg | 1 +
.../torpreferences/content/bridgemoji/1f525.svg | 1 +
.../torpreferences/content/bridgemoji/1f526.svg | 1 +
.../torpreferences/content/bridgemoji/1f52c.svg | 1 +
.../torpreferences/content/bridgemoji/1f52d.svg | 1 +
.../torpreferences/content/bridgemoji/1f52e.svg | 1 +
.../torpreferences/content/bridgemoji/1f54a.svg | 1 +
.../torpreferences/content/bridgemoji/1f58c.svg | 1 +
.../torpreferences/content/bridgemoji/1f58d.svg | 1 +
.../torpreferences/content/bridgemoji/1f5ff.svg | 1 +
.../torpreferences/content/bridgemoji/1f680.svg | 1 +
.../torpreferences/content/bridgemoji/1f681.svg | 1 +
.../torpreferences/content/bridgemoji/1f686.svg | 1 +
.../torpreferences/content/bridgemoji/1f68b.svg | 1 +
.../torpreferences/content/bridgemoji/1f68d.svg | 1 +
.../torpreferences/content/bridgemoji/1f695.svg | 1 +
.../torpreferences/content/bridgemoji/1f697.svg | 1 +
.../torpreferences/content/bridgemoji/1f69a.svg | 1 +
.../torpreferences/content/bridgemoji/1f69c.svg | 1 +
.../torpreferences/content/bridgemoji/1f6a0.svg | 1 +
.../torpreferences/content/bridgemoji/1f6a2.svg | 1 +
.../torpreferences/content/bridgemoji/1f6a4.svg | 1 +
.../torpreferences/content/bridgemoji/1f6f0.svg | 1 +
.../torpreferences/content/bridgemoji/1f6f4.svg | 1 +
.../torpreferences/content/bridgemoji/1f6f5.svg | 1 +
.../torpreferences/content/bridgemoji/1f6f6.svg | 1 +
.../torpreferences/content/bridgemoji/1f6f8.svg | 1 +
.../torpreferences/content/bridgemoji/1f6f9.svg | 1 +
.../torpreferences/content/bridgemoji/1f6fa.svg | 1 +
.../torpreferences/content/bridgemoji/1f6fc.svg | 1 +
.../torpreferences/content/bridgemoji/1f916.svg | 1 +
.../torpreferences/content/bridgemoji/1f93f.svg | 1 +
.../torpreferences/content/bridgemoji/1f941.svg | 1 +
.../torpreferences/content/bridgemoji/1f94c.svg | 1 +
.../torpreferences/content/bridgemoji/1f94f.svg | 1 +
.../torpreferences/content/bridgemoji/1f950.svg | 1 +
.../torpreferences/content/bridgemoji/1f951.svg | 1 +
.../torpreferences/content/bridgemoji/1f955.svg | 1 +
.../torpreferences/content/bridgemoji/1f956.svg | 1 +
.../torpreferences/content/bridgemoji/1f95c.svg | 1 +
.../torpreferences/content/bridgemoji/1f95d.svg | 1 +
.../torpreferences/content/bridgemoji/1f95e.svg | 1 +
.../torpreferences/content/bridgemoji/1f965.svg | 1 +
.../torpreferences/content/bridgemoji/1f966.svg | 1 +
.../torpreferences/content/bridgemoji/1f968.svg | 1 +
.../torpreferences/content/bridgemoji/1f96c.svg | 1 +
.../torpreferences/content/bridgemoji/1f96d.svg | 1 +
.../torpreferences/content/bridgemoji/1f96f.svg | 1 +
.../torpreferences/content/bridgemoji/1f980.svg | 1 +
.../torpreferences/content/bridgemoji/1f981.svg | 1 +
.../torpreferences/content/bridgemoji/1f984.svg | 1 +
.../torpreferences/content/bridgemoji/1f986.svg | 1 +
.../torpreferences/content/bridgemoji/1f987.svg | 1 +
.../torpreferences/content/bridgemoji/1f988.svg | 1 +
.../torpreferences/content/bridgemoji/1f989.svg | 1 +
.../torpreferences/content/bridgemoji/1f98a.svg | 1 +
.../torpreferences/content/bridgemoji/1f98b.svg | 1 +
.../torpreferences/content/bridgemoji/1f98c.svg | 1 +
.../torpreferences/content/bridgemoji/1f98e.svg | 1 +
.../torpreferences/content/bridgemoji/1f98f.svg | 1 +
.../torpreferences/content/bridgemoji/1f992.svg | 1 +
.../torpreferences/content/bridgemoji/1f993.svg | 1 +
.../torpreferences/content/bridgemoji/1f994.svg | 1 +
.../torpreferences/content/bridgemoji/1f995.svg | 1 +
.../torpreferences/content/bridgemoji/1f998.svg | 1 +
.../torpreferences/content/bridgemoji/1f999.svg | 1 +
.../torpreferences/content/bridgemoji/1f99a.svg | 1 +
.../torpreferences/content/bridgemoji/1f99c.svg | 1 +
.../torpreferences/content/bridgemoji/1f99d.svg | 1 +
.../torpreferences/content/bridgemoji/1f99e.svg | 1 +
.../torpreferences/content/bridgemoji/1f9a3.svg | 1 +
.../torpreferences/content/bridgemoji/1f9a4.svg | 1 +
.../torpreferences/content/bridgemoji/1f9a5.svg | 1 +
.../torpreferences/content/bridgemoji/1f9a6.svg | 1 +
.../torpreferences/content/bridgemoji/1f9a7.svg | 1 +
.../torpreferences/content/bridgemoji/1f9a9.svg | 1 +
.../torpreferences/content/bridgemoji/1f9ad.svg | 1 +
.../torpreferences/content/bridgemoji/1f9c1.svg | 1 +
.../torpreferences/content/bridgemoji/1f9c3.svg | 1 +
.../torpreferences/content/bridgemoji/1f9c5.svg | 1 +
.../torpreferences/content/bridgemoji/1f9c7.svg | 1 +
.../torpreferences/content/bridgemoji/1f9c9.svg | 1 +
.../torpreferences/content/bridgemoji/1f9d9.svg | 1 +
.../torpreferences/content/bridgemoji/1f9da.svg | 1 +
.../torpreferences/content/bridgemoji/1f9dc.svg | 1 +
.../torpreferences/content/bridgemoji/1f9e0.svg | 1 +
.../torpreferences/content/bridgemoji/1f9e2.svg | 1 +
.../torpreferences/content/bridgemoji/1f9e6.svg | 1 +
.../torpreferences/content/bridgemoji/1f9e9.svg | 1 +
.../torpreferences/content/bridgemoji/1f9ea.svg | 1 +
.../torpreferences/content/bridgemoji/1f9ec.svg | 1 +
.../torpreferences/content/bridgemoji/1f9ed.svg | 1 +
.../torpreferences/content/bridgemoji/1f9ee.svg | 1 +
.../torpreferences/content/bridgemoji/1f9f2.svg | 1 +
.../torpreferences/content/bridgemoji/1f9f5.svg | 1 +
.../torpreferences/content/bridgemoji/1f9f9.svg | 1 +
.../torpreferences/content/bridgemoji/1fa73.svg | 1 +
.../torpreferences/content/bridgemoji/1fa80.svg | 1 +
.../torpreferences/content/bridgemoji/1fa81.svg | 1 +
.../torpreferences/content/bridgemoji/1fa83.svg | 1 +
.../torpreferences/content/bridgemoji/1fa90.svg | 1 +
.../torpreferences/content/bridgemoji/1fa91.svg | 1 +
.../torpreferences/content/bridgemoji/1fa95.svg | 1 +
.../torpreferences/content/bridgemoji/1fa97.svg | 1 +
.../torpreferences/content/bridgemoji/1fab6.svg | 1 +
.../torpreferences/content/bridgemoji/1fad0.svg | 1 +
.../torpreferences/content/bridgemoji/1fad2.svg | 1 +
.../torpreferences/content/bridgemoji/1fad6.svg | 1 +
.../torpreferences/content/bridgemoji/23f0.svg | 1 +
.../torpreferences/content/bridgemoji/2600.svg | 1 +
.../torpreferences/content/bridgemoji/2602.svg | 1 +
.../torpreferences/content/bridgemoji/2604.svg | 1 +
.../torpreferences/content/bridgemoji/260e.svg | 1 +
.../torpreferences/content/bridgemoji/2693.svg | 1 +
.../torpreferences/content/bridgemoji/2696.svg | 1 +
.../torpreferences/content/bridgemoji/26bd.svg | 1 +
.../torpreferences/content/bridgemoji/26f2.svg | 1 +
.../torpreferences/content/bridgemoji/26f5.svg | 1 +
.../torpreferences/content/bridgemoji/2708.svg | 1 +
.../torpreferences/content/bridgemoji/270f.svg | 1 +
.../torpreferences/content/bridgemoji/2728.svg | 1 +
.../torpreferences/content/bridgemoji/2744.svg | 1 +
.../torpreferences/content/builtinBridgeDialog.jsm | 113 +
.../content/builtinBridgeDialog.xhtml | 31 +
.../components/torpreferences/content/check.svg | 3 +
.../content/connectionCategory.inc.xhtml | 9 +
.../torpreferences/content/connectionPane.js | 1158 +++
.../torpreferences/content/connectionPane.xhtml | 194 +
.../content/connectionSettingsDialog.jsm | 397 +
.../content/connectionSettingsDialog.xhtml | 60 +
.../components/torpreferences/content/network.svg | 0
.../torpreferences/content/provideBridgeDialog.jsm | 67 +
.../content/provideBridgeDialog.xhtml | 21 +
.../torpreferences/content/requestBridgeDialog.jsm | 206 +
.../content/requestBridgeDialog.xhtml | 35 +
.../torpreferences/content/torLogDialog.jsm | 84 +
.../torpreferences/content/torLogDialog.xhtml | 23 +
.../torpreferences/content/torPreferences.css | 714 ++
.../torpreferences/content/torPreferencesIcon.svg | 8 +
browser/components/torpreferences/jar.mn | 22 +
browser/components/torpreferences/moz.build | 1 +
browser/components/uitour/UITour-lib.js | 7 +
browser/components/uitour/UITour.jsm | 130 +-
browser/components/uitour/UITourChild.jsm | 33 +-
browser/components/urlbar/UrlbarInput.jsm | 37 +
browser/config/mozconfigs/base-browser | 34 +
browser/config/mozconfigs/tor-browser | 10 +
browser/confvars.sh | 35 +-
browser/extensions/moz.build | 13 +-
.../extensions/onboarding/OnboardingTelemetry.jsm | 610 ++
.../extensions/onboarding/OnboardingTourType.jsm | 56 +
browser/extensions/onboarding/README.md | 87 +
browser/extensions/onboarding/api.js | 275 +
browser/extensions/onboarding/background.js | 8 +
.../extensions/onboarding/content/Onboarding.jsm | 1920 +++++
.../extensions/onboarding/content/img/close.png | Bin 0 -> 798 bytes
.../content/img/figure_tor-circuit-display.png | Bin 0 -> 26334 bytes
.../content/img/figure_tor-expect-differences.png | Bin 0 -> 22290 bytes
.../onboarding/content/img/figure_tor-network.png | Bin 0 -> 11982 bytes
.../content/img/figure_tor-onion-services.png | Bin 0 -> 40968 bytes
.../onboarding/content/img/figure_tor-privacy.png | Bin 0 -> 35527 bytes
.../content/img/figure_tor-security-level.png | Bin 0 -> 11263 bytes
.../onboarding/content/img/figure_tor-security.png | Bin 0 -> 24554 bytes
.../content/img/figure_tor-toolbar-layout.png | Bin 0 -> 13269 bytes
.../onboarding/content/img/figure_tor-welcome.png | Bin 0 -> 48405 bytes
.../onboarding/content/img/icons_no-icon.png | Bin 0 -> 673 bytes
.../onboarding/content/img/icons_tour-complete.png | Bin 0 -> 694 bytes
.../onboarding/content/img/icons_tour-complete.svg | 17 +
.../content/onboarding-tor-circuit-display.js | 324 +
.../onboarding/content/onboarding-tour-agent.js | 107 +
.../extensions/onboarding/content/onboarding.css | 664 ++
.../extensions/onboarding/content/onboarding.js | 46 +
browser/extensions/onboarding/data_events.md | 154 +
browser/extensions/onboarding/jar.mn | 19 +
.../onboarding/locales/en-US/onboarding.properties | 126 +
browser/extensions/onboarding/locales/jar.mn | 8 +
.../onboarding/locales}/moz.build | 0
browser/extensions/onboarding/manifest.json | 26 +
browser/extensions/onboarding/moz.build | 29 +
.../{formautofill => onboarding}/schema.json | 0
.../onboarding/test/browser}/.eslintrc.js | 0
.../extensions/onboarding/test/browser/browser.ini | 18 +
.../browser/browser_onboarding_accessibility.js | 121 +
.../test/browser/browser_onboarding_keyboard.js | 205 +
.../browser/browser_onboarding_notification.js | 79 +
.../browser/browser_onboarding_notification_2.js | 114 +
.../browser/browser_onboarding_notification_3.js | 135 +
.../browser/browser_onboarding_notification_4.js | 114 +
.../browser/browser_onboarding_notification_5.js | 32 +
...arding_notification_click_auto_complete_tour.js | 62 +
.../browser_onboarding_select_default_tour.js | 112 +
.../test/browser/browser_onboarding_skip_tour.js | 65 +
.../test/browser/browser_onboarding_tours.js | 163 +
.../test/browser/browser_onboarding_tourset.js | 102 +
.../test/browser/browser_onboarding_uitour.js | 247 +
browser/extensions/onboarding/test/browser/head.js | 387 +
.../extensions/onboarding/test/unit}/.eslintrc.js | 0
browser/extensions/onboarding/test/unit/head.js | 58 +
.../test/unit/test-onboarding-tour-type.js | 155 +
.../extensions/onboarding/test/unit/xpcshell.ini | 5 +
browser/installer/Makefile.in | 8 +
browser/installer/package-manifest.in | 25 +-
browser/installer/windows/nsis/shared.nsh | 1 -
browser/locales/Makefile.in | 10 +-
.../locales/en-US/chrome/browser/aboutTBUpdate.dtd | 8 +
browser/locales/filter.py | 1 +
browser/locales/jar.mn | 10 +-
browser/locales/l10n.ini | 1 +
browser/locales/l10n.toml | 4 +
browser/modules/BridgeDB.jsm | 61 +
browser/modules/HomePage.jsm | 2 +-
browser/modules/Moat.jsm | 814 ++
browser/modules/TorConnect.jsm | 1081 +++
browser/modules/TorProcessService.jsm | 12 +
browser/modules/TorProtocolService.jsm | 510 ++
browser/modules/TorSettings.jsm | 788 ++
browser/modules/TorStrings.jsm | 978 +++
browser/modules/moz.build | 7 +
browser/moz.build | 1 +
browser/moz.configure | 8 +-
browser/themes/linux/browser.css | 9 -
browser/themes/shared/UITour.css | 56 +-
browser/themes/shared/browser-shared.css | 7 +
browser/themes/shared/controlcenter/panel.css | 4 +-
.../shared/customizableui/panelUI-shared.css | 3 +-
browser/themes/shared/icons/new_circuit.svg | 6 +
browser/themes/shared/icons/new_identity.svg | 9 +
.../shared/identity-block/identity-block.css | 32 +-
.../themes/shared/identity-block/onion-slash.svg | 5 +
.../themes/shared/identity-block/onion-warning.svg | 4 +
browser/themes/shared/identity-block/onion.svg | 4 +
browser/themes/shared/jar.inc.mn | 9 +
browser/themes/shared/notification-icons.css | 2 +
browser/themes/shared/onionPattern.css | 31 +
browser/themes/shared/onionPattern.inc.xhtml | 12 +
browser/themes/shared/onionPattern.svg | 22 +
browser/themes/shared/preferences/privacy.css | 4 +
browser/themes/shared/tabs.css | 6 +
browser/themes/shared/toolbarbutton-icons.css | 8 +
browser/themes/windows/browser.css | 9 -
build/application.ini.in | 2 +-
build/moz.configure/init.configure | 3 +-
config/createprecomplete.py | 18 +-
.../client/aboutdebugging/src/actions/runtimes.js | 5 +
.../images/aboutdebugging-firefox-aurora.svg | 35 +-
.../themes/images/aboutdebugging-firefox-beta.svg | 35 +-
.../themes/images/aboutdebugging-firefox-logo.svg | 11 +-
.../images/aboutdebugging-firefox-nightly.svg | 35 +-
.../images/aboutdebugging-firefox-release.svg | 35 +-
docshell/base/nsAboutRedirector.cpp | 6 +-
docshell/base/nsDocShell.cpp | 81 +-
docshell/build/components.conf | 1 +
dom/base/Document.cpp | 95 +-
dom/base/Document.h | 10 +-
dom/base/nsContentUtils.cpp | 19 +
dom/base/nsContentUtils.h | 5 +
dom/base/nsGlobalWindowOuter.cpp | 5 +-
dom/base/test/mochitest.ini | 2 -
dom/base/test/test_suppressed_microtasks.html | 62 -
dom/canvas/ClientWebGLContext.cpp | 8 +
dom/ipc/BrowserParent.cpp | 21 +
dom/ipc/BrowserParent.h | 3 +
dom/ipc/PBrowser.ipdl | 9 +
dom/ipc/WindowGlobalActor.cpp | 4 +-
dom/ipc/WindowGlobalChild.cpp | 6 +-
dom/security/nsMixedContentBlocker.cpp | 16 +-
dom/webidl/Document.webidl | 8 +
dom/workers/RuntimeService.cpp | 4 +-
dom/workers/WorkerPrivate.cpp | 2 +-
dom/worklet/WorkletThread.cpp | 2 +-
extensions/auth/nsHttpNegotiateAuth.cpp | 4 +
extensions/permissions/PermissionManager.cpp | 6 +-
gfx/thebes/gfxFcPlatformFontList.cpp | 8 +-
gfx/thebes/gfxMacPlatformFontList.h | 12 +
gfx/thebes/gfxMacPlatformFontList.mm | 83 +
gfx/thebes/gfxPlatformFontList.cpp | 4 +-
gfx/thebes/gfxPlatformMac.cpp | 73 +-
gfx/thebes/gfxPlatformMac.h | 2 +
intl/locale/LocaleService.cpp | 6 +
intl/strres/nsStringBundle.cpp | 1 +
js/xpconnect/src/xpc.msg | 10 +
layout/generic/ReflowInput.cpp | 19 +-
layout/generic/test/mochitest.ini | 1 +
layout/generic/test/test_tor_bug23104.html | 50 +
mobile/android/app/000-tor-browser-android.js | 47 +
mobile/android/app/geckoview-prefs.js | 2 +
mobile/android/app/mobile.js | 4 +
mobile/android/app/moz.build | 1 +
.../components/geckoview/GeckoViewStartup.jsm | 5 +
mobile/android/confvars.sh | 8 +
.../exoplayer2/upstream/DefaultHttpDataSource.java | 46 +-
mobile/android/geckoview/api.txt | 6 +
mobile/android/geckoview/build.gradle | 1 +
.../android/geckoview/src/main/AndroidManifest.xml | 14 +
.../gecko/media/GeckoMediaDrmBridgeV21.java | 50 +-
.../java/org/mozilla/gecko/util/ProxySelector.java | 25 +-
.../java/org/mozilla/geckoview/GeckoRuntime.java | 8 +-
.../mozilla/geckoview/GeckoRuntimeSettings.java | 50 +-
.../java/org/mozilla/geckoview/WebRequest.java | 18 +
mobile/android/gradle/with_gecko_binaries.gradle | 6 +-
mobile/android/installer/package-manifest.in | 4 +
.../modules/geckoview/GeckoViewProgress.jsm | 4 +
mobile/android/moz.configure | 21 +-
mobile/android/torbrowser.configure | 30 +
modules/libmar/tool/mar.c | 6 +-
modules/libmar/tool/moz.build | 12 +-
modules/libmar/verify/moz.build | 14 +-
modules/libpref/init/StaticPrefList.yaml | 10 +
moz.configure | 100 +
mozconfig-android-armv7 | 37 +
mozconfig-linux-arm | 18 +
mozconfig-linux-i686 | 9 +
mozconfig-linux-x86_64 | 9 +
mozconfig-linux-x86_64-asan | 22 +
mozconfig-linux-x86_64-dev | 14 +
mozconfig-macos-x86_64 | 5 +
mozconfig-windows-i686 | 11 +
mozconfig-windows-x86_64 | 11 +
netwerk/base/nsSocketTransport2.cpp | 6 +
netwerk/build/components.conf | 11 +
netwerk/build/nsNetCID.h | 10 +
netwerk/dns/IOnionAliasService.idl | 34 +
netwerk/dns/OnionAliasService.cpp | 100 +
netwerk/dns/OnionAliasService.h | 40 +
netwerk/dns/effective_tld_names.dat | 2 +
netwerk/dns/moz.build | 4 +
netwerk/protocol/http/nsHttpNTLMAuth.cpp | 3 +
netwerk/socket/nsSOCKSIOLayer.cpp | 73 +-
.../url-classifier/UrlClassifierFeatureBase.cpp | 2 +-
netwerk/url-classifier/components.conf | 6 -
python/mozbuild/mozbuild/artifacts.py | 2 -
run-tbb-tests | 66 +
security/certverifier/CertVerifier.cpp | 22 +-
security/manager/ssl/RemoteSecuritySettings.jsm | 23 +
security/manager/ssl/SSLServerCertVerification.cpp | 23 +-
security/manager/ssl/SSLServerCertVerification.h | 4 +-
security/manager/ssl/nsNSSIOLayer.cpp | 13 +-
security/manager/ssl/nsSecureBrowserUI.cpp | 12 +
security/moz.build | 2 +-
security/nss/lib/certhigh/ocsp.c | 4 +
.../libpkix/pkix_pl_nss/module/pkix_pl_socket.c | 12 +
security/nss/lib/mozpkix/include/pkix/Result.h | 2 +
security/nss/lib/mozpkix/include/pkix/pkixnss.h | 1 +
security/nss/lib/ssl/Makefile | 2 +-
services/settings/IDBHelpers.jsm | 4 +
services/settings/dumps/blocklists/moz.build | 14 +-
services/settings/dumps/main/moz.build | 8 -
services/settings/dumps/security-state/moz.build | 1 -
taskcluster/ci/source-test/mozlint.yml | 1 +
tbb-tests-ignore.txt | 13 +
tbb-tests/browser.ini | 5 +
tbb-tests/browser_tor_TB4.js | 35 +
tbb-tests/browser_tor_bug2950.js | 74 +
tbb-tests/browser_tor_omnibox.js | 20 +
tbb-tests/mochitest.ini | 3 +
tbb-tests/moz.build | 9 +
tbb-tests/test_tor_bug2874.html | 25 +
toolkit/actors/AboutHttpsOnlyErrorParent.jsm | 5 +
.../components/antitracking/antitracking.manifest | 2 +-
toolkit/components/antitracking/components.conf | 7 -
.../EnterprisePoliciesParent.jsm | 9 +-
toolkit/components/extensions/Extension.jsm | 9 +
toolkit/components/extensions/ExtensionParent.jsm | 47 +
.../components/httpsonlyerror/content/errorpage.js | 19 +-
.../processsingleton/MainProcessSingleton.jsm | 4 +
.../remotebrowserutils/RemoteWebNavigation.jsm | 4 +
.../components/resistfingerprinting/RFPHelper.jsm | 97 +-
toolkit/components/search/SearchService.jsm | 46 +-
toolkit/components/telemetry/app/TelemetrySend.jsm | 28 +-
toolkit/components/telemetry/moz.build | 4 -
toolkit/content/license.html | 65 +
.../mozapps/profile/profileSelection.properties | 5 +
toolkit/modules/AppConstants.jsm | 29 +
toolkit/modules/Bech32Decode.jsm | 103 +
toolkit/modules/PopupNotifications.jsm | 6 +
toolkit/modules/QRCode.jsm | 1241 +++
toolkit/modules/RemotePageAccessManager.jsm | 41 +
toolkit/modules/UpdateUtils.jsm | 31 +-
toolkit/modules/moz.build | 6 +
toolkit/moz.build | 1 +
toolkit/moz.configure | 10 +
toolkit/mozapps/extensions/AddonManager.jsm | 25 +
.../mozapps/extensions/internal/XPIProvider.jsm | 14 +-
toolkit/mozapps/extensions/test/browser/head.js | 1 +
.../extensions/test/xpcshell/head_addons.js | 1 +
toolkit/mozapps/update/UpdateService.jsm | 275 +-
toolkit/mozapps/update/UpdateServiceStub.jsm | 4 +
toolkit/mozapps/update/UpdateTelemetry.jsm | 1 +
toolkit/mozapps/update/common/updatehelper.cpp | 8 +
toolkit/mozapps/update/nsIUpdateService.idl | 11 +
toolkit/mozapps/update/updater/launchchild_osx.mm | 2 +
toolkit/mozapps/update/updater/moz.build | 2 +-
.../updater/nightly_aurora_level3_primary.der | Bin 1225 -> 1245 bytes
.../updater/nightly_aurora_level3_secondary.der | Bin 1225 -> 1245 bytes
toolkit/mozapps/update/updater/release_primary.der | Bin 1225 -> 1229 bytes
.../mozapps/update/updater/release_secondary.der | Bin 1225 -> 1229 bytes
.../mozapps/update/updater/updater-common.build | 24 +-
toolkit/mozapps/update/updater/updater.cpp | 350 +-
toolkit/profile/nsProfileLock.cpp | 11 +
toolkit/profile/nsToolkitProfileService.cpp | 57 +-
toolkit/profile/nsToolkitProfileService.h | 13 +-
toolkit/toolkit.mozbuild | 3 +-
toolkit/torproject/torbutton | 1 +
toolkit/xre/MacLaunchHelper.h | 2 +
toolkit/xre/MacLaunchHelper.mm | 2 +
toolkit/xre/MacRunFromDmgUtils.mm | 4 +-
toolkit/xre/moz.build | 3 +
toolkit/xre/nsAppRunner.cpp | 270 +-
toolkit/xre/nsUpdateDriver.cpp | 180 +-
toolkit/xre/nsXREDirProvider.cpp | 144 +-
toolkit/xre/nsXREDirProvider.h | 14 +
tools/lint/codespell.yml | 1 +
.../lib/environments/browser-window.js | 10 +-
.../lib/environments/frame-script.js | 1 +
tools/torbrowser/Makefile | 44 +
tools/torbrowser/bridges.js | 77 +
tools/torbrowser/build.sh | 7 +
tools/torbrowser/clobber.sh | 6 +
tools/torbrowser/config.sh | 6 +
tools/torbrowser/deploy.sh | 23 +
tools/torbrowser/fetch.sh | 30 +
tools/torbrowser/ide.sh | 7 +
tools/torbrowser/jslint.sh | 7 +
tools/torbrowser/update_bridgemoiji.py | 115 +
tools/update-packaging/common.sh | 64 +-
tools/update-packaging/make_full_update.sh | 25 +
tools/update-packaging/make_incremental_update.sh | 71 +-
.../exthandler/nsExternalHelperAppService.cpp | 222 +-
uriloader/exthandler/nsExternalHelperAppService.h | 3 +
.../exthandler/nsIExternalHelperAppService.idl | 47 +
widget/android/WebExecutorSupport.cpp | 9 +
widget/nsTransferable.cpp | 6 +
xpcom/base/CycleCollectedJSContext.cpp | 51 +-
xpcom/base/CycleCollectedJSContext.h | 29 +-
xpcom/base/ErrorList.py | 22 +
xpcom/ds/StaticAtoms.py | 1 +
xpcom/io/TorFileUtils.cpp | 96 +
xpcom/io/TorFileUtils.h | 32 +
xpcom/io/moz.build | 5 +
xpcom/io/nsAppFileLocationProvider.cpp | 72 +-
937 files changed, 39461 insertions(+), 3285 deletions(-)
create mode 100644 .gitlab/issue_templates/UXBug.md
create mode 100644 .gitlab/issue_templates/bug.md
create mode 100644 .gitmodules
create mode 100644 browser/actors/AboutTBUpdateChild.jsm
create mode 100644 browser/actors/AboutTBUpdateParent.jsm
create mode 100644 browser/actors/CryptoSafetyChild.jsm
create mode 100644 browser/actors/CryptoSafetyParent.jsm
create mode 100644 browser/app/profile/000-tor-browser.js
create mode 100644 browser/app/profile/001-base-profile.js
create mode 100644 browser/base/content/abouttbupdate/aboutTBUpdate.css
create mode 100644 browser/base/content/abouttbupdate/aboutTBUpdate.js
create mode 100644 browser/base/content/abouttbupdate/aboutTBUpdate.xhtml
create mode 100644 browser/base/content/browser-doctype.inc
create mode 100644 browser/branding/alpha/VisualElements_150.png
create mode 100644 browser/branding/alpha/VisualElements_70.png
create mode 100644 browser/branding/alpha/background.png
create mode 100644 browser/branding/alpha/bgstub.jpg
create mode 100644 browser/branding/alpha/bgstub_2x.jpg
copy browser/branding/{nightly => alpha}/branding.nsi (100%)
create mode 100644 browser/branding/alpha/configure.sh
create mode 100644 browser/branding/alpha/content/about-logo.png
copy browser/branding/{nightly => alpha}/content/about-logo.svg (100%)
create mode 100644 browser/branding/alpha/content/about-logo(a)2x.png
create mode 100644 browser/branding/alpha/content/about-wordmark.svg
create mode 100644 browser/branding/alpha/content/about.png
create mode 100644 browser/branding/alpha/content/aboutDialog.css
create mode 100644 browser/branding/alpha/content/aboutlogins.svg
copy browser/branding/{nightly => alpha}/content/firefox-wordmark.svg (100%)
create mode 100644 browser/branding/alpha/content/identity-icons-brand.svg
create mode 100644 browser/branding/alpha/content/jar.mn
copy browser/branding/{aurora => alpha}/content/moz.build (100%)
create mode 100644 browser/branding/alpha/content/tor-styles.css
create mode 100644 browser/branding/alpha/default128.png
create mode 100644 browser/branding/alpha/default16.png
create mode 100644 browser/branding/alpha/default22.png
create mode 100644 browser/branding/alpha/default24.png
create mode 100644 browser/branding/alpha/default256.png
create mode 100644 browser/branding/alpha/default32.png
create mode 100644 browser/branding/alpha/default48.png
create mode 100644 browser/branding/alpha/default512.png
create mode 100644 browser/branding/alpha/default64.png
create mode 100644 browser/branding/alpha/disk.icns
create mode 100644 browser/branding/alpha/document.icns
create mode 100644 browser/branding/alpha/document.ico
copy browser/branding/{nightly => alpha}/dsstore (100%)
create mode 100644 browser/branding/alpha/firefox.VisualElementsManifest.xml
create mode 100644 browser/branding/alpha/firefox.icns
create mode 100644 browser/branding/alpha/firefox.ico
create mode 100644 browser/branding/alpha/firefox.svg
create mode 100644 browser/branding/alpha/firefox64.ico
create mode 100644 browser/branding/alpha/locales/en-US/brand.dtd
create mode 100644 browser/branding/alpha/locales/en-US/brand.ftl
create mode 100644 browser/branding/alpha/locales/en-US/brand.properties
copy browser/branding/{official => alpha}/locales/jar.mn (100%)
copy browser/branding/{aurora/content => alpha/locales}/moz.build (100%)
copy browser/branding/{aurora => alpha}/moz.build (100%)
copy browser/branding/{aurora => alpha}/newtab.ico (100%)
copy browser/branding/{aurora => alpha}/newwindow.ico (100%)
copy browser/branding/{aurora => alpha}/pbmode.ico (100%)
create mode 100644 browser/branding/alpha/pref/firefox-branding.js
copy browser/branding/{nightly => alpha}/stubinstaller/bgstub.jpg (100%)
copy browser/branding/{nightly => alpha}/stubinstaller/installing_page.css (100%)
copy browser/branding/{aurora => alpha}/stubinstaller/profile_cleanup_page.css (100%)
create mode 100644 browser/branding/alpha/wizHeader.bmp
create mode 100644 browser/branding/alpha/wizHeaderRTL.bmp
create mode 100644 browser/branding/alpha/wizWatermark.bmp
create mode 100644 browser/branding/nightly/content/identity-icons-brand.svg
create mode 100644 browser/branding/nightly/content/tor-styles.css
create mode 100644 browser/branding/nightly/default512.png
create mode 100644 browser/branding/nightly/firefox.svg
create mode 100644 browser/branding/official/content/identity-icons-brand.svg
create mode 100644 browser/branding/official/content/tor-styles.css
create mode 100644 browser/branding/official/default512.png
create mode 100644 browser/branding/official/firefox.svg
create mode 100644 browser/branding/tor-styles.inc.css
create mode 100644 browser/components/newidentity/content/newidentity.js
create mode 100644 browser/components/newidentity/jar.mn
create mode 100644 browser/components/newidentity/locale/en-US/newIdentity.properties
create mode 100644 browser/components/newidentity/moz.build
create mode 100644 browser/components/onionservices/OnionAliasStore.jsm
create mode 100644 browser/components/onionservices/OnionLocationChild.jsm
create mode 100644 browser/components/onionservices/OnionLocationParent.jsm
create mode 100644 browser/components/onionservices/content/authNotificationIcon.inc.xhtml
create mode 100644 browser/components/onionservices/content/authPopup.inc.xhtml
create mode 100644 browser/components/onionservices/content/authPreferences.css
create mode 100644 browser/components/onionservices/content/authPreferences.inc.xhtml
create mode 100644 browser/components/onionservices/content/authPreferences.js
create mode 100644 browser/components/onionservices/content/authPrompt.js
create mode 100644 browser/components/onionservices/content/authUtil.jsm
create mode 100644 browser/components/onionservices/content/netError/browser.svg
create mode 100644 browser/components/onionservices/content/netError/network.svg
create mode 100644 browser/components/onionservices/content/netError/onionNetError.css
create mode 100644 browser/components/onionservices/content/netError/onionNetError.js
create mode 100644 browser/components/onionservices/content/netError/onionsite.svg
create mode 100644 browser/components/onionservices/content/onionlocation-urlbar.inc.xhtml
create mode 100644 browser/components/onionservices/content/onionlocation.css
create mode 100644 browser/components/onionservices/content/onionlocation.svg
create mode 100644 browser/components/onionservices/content/onionlocationPreferences.inc.xhtml
create mode 100644 browser/components/onionservices/content/onionlocationPreferences.js
create mode 100644 browser/components/onionservices/content/onionservices.css
create mode 100644 browser/components/onionservices/content/savedKeysDialog.js
create mode 100644 browser/components/onionservices/content/savedKeysDialog.xhtml
create mode 100644 browser/components/onionservices/jar.mn
create mode 100644 browser/components/onionservices/moz.build
create mode 100644 browser/components/rulesets/RulesetsChild.jsm
create mode 100644 browser/components/rulesets/RulesetsParent.jsm
create mode 100644 browser/components/rulesets/content/aboutRulesets.css
create mode 100644 browser/components/rulesets/content/aboutRulesets.html
create mode 100644 browser/components/rulesets/content/aboutRulesets.js
create mode 100644 browser/components/rulesets/content/securedrop.svg
create mode 100644 browser/components/rulesets/jar.mn
create mode 100644 browser/components/rulesets/moz.build
create mode 100644 browser/components/search/extensions/blockchair-onion/favicon.png
create mode 100644 browser/components/search/extensions/blockchair-onion/manifest.json
create mode 100644 browser/components/search/extensions/blockchair/favicon.png
create mode 100644 browser/components/search/extensions/blockchair/manifest.json
create mode 100644 browser/components/search/extensions/ddg-onion/favicon.ico
create mode 100644 browser/components/search/extensions/ddg-onion/manifest.json
delete mode 100644 browser/components/search/extensions/ddg/favicon.ico
create mode 100644 browser/components/search/extensions/ddg/favicon.png
delete mode 100644 browser/components/search/extensions/google/_locales/b-1-d/messages.json
delete mode 100644 browser/components/search/extensions/google/_locales/b-1-e/messages.json
delete mode 100644 browser/components/search/extensions/google/_locales/b-d/messages.json
delete mode 100644 browser/components/search/extensions/google/_locales/b-e/messages.json
delete mode 100644 browser/components/search/extensions/google/_locales/en/messages.json
delete mode 100644 browser/components/search/extensions/google/_locales/region-by/messages.json
delete mode 100644 browser/components/search/extensions/google/_locales/region-kz/messages.json
delete mode 100644 browser/components/search/extensions/google/_locales/region-ru/messages.json
delete mode 100644 browser/components/search/extensions/google/_locales/region-tr/messages.json
create mode 100644 browser/components/search/extensions/startpage/favicon.png
create mode 100644 browser/components/search/extensions/startpage/manifest.json
copy browser/components/{newtab/data/content/tippytop/favicons/twitter-com.ico => search/extensions/twitter/favicon.ico} (100%)
create mode 100644 browser/components/search/extensions/twitter/manifest.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/NN/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/NO/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/af/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/an/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/ar/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/ast/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/az/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/be-tarask/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/be/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/bg/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/bn/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/br/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/bs/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/ca/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/cy/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/cz/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/da/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/de/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/dsb/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/el/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/en/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/eo/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/es/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/et/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/eu/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/fa/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/fi/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/fr/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/fy-NL/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/ga-IE/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/gd/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/gl/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/gn/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/gu/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/he/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/hi/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/hr/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/hsb/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/hu/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/hy/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/ia/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/id/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/is/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/it/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/ja/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/ka/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/kab/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/kk/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/km/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/kn/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/kr/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/lij/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/lo/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/lt/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/ltg/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/lv/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/mk/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/mr/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/ms/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/my/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/ne/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/nl/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/oc/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/pa/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/pl/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/pt/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/rm/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/ro/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/ru/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/si/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/sk/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/sl/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/sq/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/sr/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/sv-SE/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/ta/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/te/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/th/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/tl/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/tr/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/uk/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/ur/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/uz/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/vi/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/wo/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/zh-CN/messages.json
delete mode 100644 browser/components/search/extensions/wikipedia/_locales/zh-TW/messages.json
create mode 100644 browser/components/search/extensions/yahoo/favicon.ico
create mode 100644 browser/components/search/extensions/yahoo/manifest.json
create mode 100644 browser/components/search/extensions/youtube/favicon.ico
create mode 100644 browser/components/search/extensions/youtube/manifest.json
create mode 100644 browser/components/securitylevel/SecurityLevel.jsm
create mode 100644 browser/components/securitylevel/SecurityLevel.manifest
create mode 100644 browser/components/securitylevel/components.conf
create mode 100644 browser/components/securitylevel/content/securityLevel.js
create mode 100644 browser/components/securitylevel/content/securityLevelButton.css
create mode 100644 browser/components/securitylevel/content/securityLevelButton.inc.xhtml
create mode 100644 browser/components/securitylevel/content/securityLevelIcon.svg
create mode 100644 browser/components/securitylevel/content/securityLevelPanel.css
create mode 100644 browser/components/securitylevel/content/securityLevelPanel.inc.xhtml
create mode 100644 browser/components/securitylevel/content/securityLevelPreferences.css
create mode 100644 browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml
create mode 100644 browser/components/securitylevel/jar.mn
create mode 100644 browser/components/securitylevel/locale/en-US/securityLevel.properties
create mode 100644 browser/components/securitylevel/moz.build
create mode 100644 browser/components/torconnect/TorConnectChild.jsm
create mode 100644 browser/components/torconnect/TorConnectParent.jsm
create mode 100644 browser/components/torconnect/content/aboutTorConnect.css
create mode 100644 browser/components/torconnect/content/aboutTorConnect.js
create mode 100644 browser/components/torconnect/content/aboutTorConnect.xhtml
create mode 100644 browser/components/torconnect/content/arrow-right.svg
create mode 100644 browser/components/torconnect/content/bridge.svg
create mode 100644 browser/components/torconnect/content/connection-failure.svg
create mode 100644 browser/components/torconnect/content/connection-location.svg
create mode 100644 browser/components/torconnect/content/onion-slash-fillable.svg
create mode 100644 browser/components/torconnect/content/onion-slash.svg
create mode 100644 browser/components/torconnect/content/onion.svg
create mode 100644 browser/components/torconnect/content/torBootstrapUrlbar.js
create mode 100644 browser/components/torconnect/content/torconnect-urlbar.css
create mode 100644 browser/components/torconnect/content/torconnect-urlbar.inc.xhtml
create mode 100644 browser/components/torconnect/jar.mn
create mode 100644 browser/components/torconnect/moz.build
create mode 100644 browser/components/torpreferences/content/bridgeQrDialog.jsm
create mode 100644 browser/components/torpreferences/content/bridgeQrDialog.xhtml
create mode 100644 browser/components/torpreferences/content/bridgemoji-annotations.json
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f300.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f308.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f30a.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f30b.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f319.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f31f.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f321.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f32d.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f32e.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f332.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f333.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f334.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f335.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f336.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f337.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f339.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f33a.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f33b.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f33d.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f33f.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f341.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f344.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f345.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f346.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f347.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f348.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f349.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f34a.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f34b.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f34c.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f34d.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f34f.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f350.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f351.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f352.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f353.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f354.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f355.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f368.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f369.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f36a.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f36b.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f36c.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f36d.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f37f.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f380.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f381.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f382.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f383.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f388.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f389.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f38f.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f392.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f399.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f39f.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3a0.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3a1.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3a2.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3a8.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3ac.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3af.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3b2.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3b6.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3b7.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3b8.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3ba.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3bb.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3be.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3c0.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3c6.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3c8.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3d3.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3d4.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3d5.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3dd.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3e1.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3ee.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3f7.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3f8.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f3f9.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f40a.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f40c.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f40d.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f417.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f418.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f419.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f41a.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f41b.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f41d.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f41e.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f41f.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f420.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f422.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f425.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f426.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f428.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f42a.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f42c.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f42d.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f42e.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f42f.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f430.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f431.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f432.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f433.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f434.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f435.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f436.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f437.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f43a.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f43b.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f43f.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f441.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f451.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f455.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f457.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f45f.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f47d.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f484.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f488.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f48d.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f48e.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f490.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f4a1.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f4a7.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f4b3.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f4bf.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f4cc.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f4ce.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f4d5.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f4e1.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f4e2.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f4fb.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f50b.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f511.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f525.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f526.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f52c.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f52d.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f52e.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f54a.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f58c.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f58d.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f5ff.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f680.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f681.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f686.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f68b.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f68d.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f695.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f697.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f69a.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f69c.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f6a0.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f6a2.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f6a4.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f6f0.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f6f4.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f6f5.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f6f6.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f6f8.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f6f9.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f6fa.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f6fc.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f916.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f93f.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f941.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f94c.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f94f.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f950.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f951.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f955.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f956.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f95c.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f95d.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f95e.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f965.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f966.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f968.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f96c.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f96d.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f96f.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f980.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f981.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f984.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f986.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f987.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f988.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f989.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f98a.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f98b.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f98c.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f98e.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f98f.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f992.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f993.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f994.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f995.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f998.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f999.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f99a.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f99c.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f99d.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f99e.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9a3.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9a4.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9a5.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9a6.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9a7.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9a9.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9ad.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9c1.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9c3.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9c5.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9c7.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9c9.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9d9.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9da.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9dc.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9e0.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9e2.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9e6.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9e9.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9ea.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9ec.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9ed.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9ee.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9f2.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9f5.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1f9f9.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1fa73.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1fa80.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1fa81.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1fa83.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1fa90.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1fa91.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1fa95.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1fa97.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1fab6.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1fad0.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1fad2.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/1fad6.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/23f0.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/2600.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/2602.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/2604.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/260e.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/2693.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/2696.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/26bd.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/26f2.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/26f5.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/2708.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/270f.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/2728.svg
create mode 100644 browser/components/torpreferences/content/bridgemoji/2744.svg
create mode 100644 browser/components/torpreferences/content/builtinBridgeDialog.jsm
create mode 100644 browser/components/torpreferences/content/builtinBridgeDialog.xhtml
create mode 100644 browser/components/torpreferences/content/check.svg
create mode 100644 browser/components/torpreferences/content/connectionCategory.inc.xhtml
create mode 100644 browser/components/torpreferences/content/connectionPane.js
create mode 100644 browser/components/torpreferences/content/connectionPane.xhtml
create mode 100644 browser/components/torpreferences/content/connectionSettingsDialog.jsm
create mode 100644 browser/components/torpreferences/content/connectionSettingsDialog.xhtml
copy toolkit/themes/shared/icons/defaultFavicon.svg => browser/components/torpreferences/content/network.svg (100%)
create mode 100644 browser/components/torpreferences/content/provideBridgeDialog.jsm
create mode 100644 browser/components/torpreferences/content/provideBridgeDialog.xhtml
create mode 100644 browser/components/torpreferences/content/requestBridgeDialog.jsm
create mode 100644 browser/components/torpreferences/content/requestBridgeDialog.xhtml
create mode 100644 browser/components/torpreferences/content/torLogDialog.jsm
create mode 100644 browser/components/torpreferences/content/torLogDialog.xhtml
create mode 100644 browser/components/torpreferences/content/torPreferences.css
create mode 100644 browser/components/torpreferences/content/torPreferencesIcon.svg
create mode 100644 browser/components/torpreferences/jar.mn
create mode 100644 browser/components/torpreferences/moz.build
create mode 100644 browser/config/mozconfigs/base-browser
create mode 100644 browser/config/mozconfigs/tor-browser
create mode 100644 browser/extensions/onboarding/OnboardingTelemetry.jsm
create mode 100644 browser/extensions/onboarding/OnboardingTourType.jsm
create mode 100644 browser/extensions/onboarding/README.md
create mode 100644 browser/extensions/onboarding/api.js
create mode 100644 browser/extensions/onboarding/background.js
create mode 100644 browser/extensions/onboarding/content/Onboarding.jsm
create mode 100644 browser/extensions/onboarding/content/img/close.png
create mode 100644 browser/extensions/onboarding/content/img/figure_tor-circuit-display.png
create mode 100644 browser/extensions/onboarding/content/img/figure_tor-expect-differences.png
create mode 100644 browser/extensions/onboarding/content/img/figure_tor-network.png
create mode 100644 browser/extensions/onboarding/content/img/figure_tor-onion-services.png
create mode 100644 browser/extensions/onboarding/content/img/figure_tor-privacy.png
create mode 100644 browser/extensions/onboarding/content/img/figure_tor-security-level.png
create mode 100644 browser/extensions/onboarding/content/img/figure_tor-security.png
create mode 100644 browser/extensions/onboarding/content/img/figure_tor-toolbar-layout.png
create mode 100644 browser/extensions/onboarding/content/img/figure_tor-welcome.png
create mode 100644 browser/extensions/onboarding/content/img/icons_no-icon.png
create mode 100644 browser/extensions/onboarding/content/img/icons_tour-complete.png
create mode 100644 browser/extensions/onboarding/content/img/icons_tour-complete.svg
create mode 100644 browser/extensions/onboarding/content/onboarding-tor-circuit-display.js
create mode 100644 browser/extensions/onboarding/content/onboarding-tour-agent.js
create mode 100644 browser/extensions/onboarding/content/onboarding.css
create mode 100644 browser/extensions/onboarding/content/onboarding.js
create mode 100644 browser/extensions/onboarding/data_events.md
create mode 100644 browser/extensions/onboarding/jar.mn
create mode 100644 browser/extensions/onboarding/locales/en-US/onboarding.properties
create mode 100644 browser/extensions/onboarding/locales/jar.mn
copy browser/{branding/aurora/content => extensions/onboarding/locales}/moz.build (100%)
create mode 100644 browser/extensions/onboarding/manifest.json
create mode 100644 browser/extensions/onboarding/moz.build
copy browser/extensions/{formautofill => onboarding}/schema.json (100%)
copy browser/{base/content/test/about => extensions/onboarding/test/browser}/.eslintrc.js (100%)
create mode 100644 browser/extensions/onboarding/test/browser/browser.ini
create mode 100644 browser/extensions/onboarding/test/browser/browser_onboarding_accessibility.js
create mode 100644 browser/extensions/onboarding/test/browser/browser_onboarding_keyboard.js
create mode 100644 browser/extensions/onboarding/test/browser/browser_onboarding_notification.js
create mode 100644 browser/extensions/onboarding/test/browser/browser_onboarding_notification_2.js
create mode 100644 browser/extensions/onboarding/test/browser/browser_onboarding_notification_3.js
create mode 100644 browser/extensions/onboarding/test/browser/browser_onboarding_notification_4.js
create mode 100644 browser/extensions/onboarding/test/browser/browser_onboarding_notification_5.js
create mode 100644 browser/extensions/onboarding/test/browser/browser_onboarding_notification_click_auto_complete_tour.js
create mode 100644 browser/extensions/onboarding/test/browser/browser_onboarding_select_default_tour.js
create mode 100644 browser/extensions/onboarding/test/browser/browser_onboarding_skip_tour.js
create mode 100644 browser/extensions/onboarding/test/browser/browser_onboarding_tours.js
create mode 100644 browser/extensions/onboarding/test/browser/browser_onboarding_tourset.js
create mode 100644 browser/extensions/onboarding/test/browser/browser_onboarding_uitour.js
create mode 100644 browser/extensions/onboarding/test/browser/head.js
copy {ipc/testshell/tests => browser/extensions/onboarding/test/unit}/.eslintrc.js (100%)
create mode 100644 browser/extensions/onboarding/test/unit/head.js
create mode 100644 browser/extensions/onboarding/test/unit/test-onboarding-tour-type.js
create mode 100644 browser/extensions/onboarding/test/unit/xpcshell.ini
create mode 100644 browser/locales/en-US/chrome/browser/aboutTBUpdate.dtd
create mode 100644 browser/modules/BridgeDB.jsm
create mode 100644 browser/modules/Moat.jsm
create mode 100644 browser/modules/TorConnect.jsm
create mode 100644 browser/modules/TorProcessService.jsm
create mode 100644 browser/modules/TorProtocolService.jsm
create mode 100644 browser/modules/TorSettings.jsm
create mode 100644 browser/modules/TorStrings.jsm
create mode 100644 browser/themes/shared/icons/new_circuit.svg
create mode 100644 browser/themes/shared/icons/new_identity.svg
create mode 100644 browser/themes/shared/identity-block/onion-slash.svg
create mode 100644 browser/themes/shared/identity-block/onion-warning.svg
create mode 100644 browser/themes/shared/identity-block/onion.svg
create mode 100644 browser/themes/shared/onionPattern.css
create mode 100644 browser/themes/shared/onionPattern.inc.xhtml
create mode 100644 browser/themes/shared/onionPattern.svg
delete mode 100644 dom/base/test/test_suppressed_microtasks.html
create mode 100644 layout/generic/test/test_tor_bug23104.html
create mode 100644 mobile/android/app/000-tor-browser-android.js
create mode 100644 mobile/android/torbrowser.configure
create mode 100644 mozconfig-android-armv7
create mode 100644 mozconfig-linux-arm
create mode 100644 mozconfig-linux-i686
create mode 100644 mozconfig-linux-x86_64
create mode 100644 mozconfig-linux-x86_64-asan
create mode 100644 mozconfig-linux-x86_64-dev
create mode 100644 mozconfig-macos-x86_64
create mode 100644 mozconfig-windows-i686
create mode 100644 mozconfig-windows-x86_64
create mode 100644 netwerk/dns/IOnionAliasService.idl
create mode 100644 netwerk/dns/OnionAliasService.cpp
create mode 100644 netwerk/dns/OnionAliasService.h
create mode 100755 run-tbb-tests
create mode 100644 tbb-tests-ignore.txt
create mode 100644 tbb-tests/browser.ini
create mode 100644 tbb-tests/browser_tor_TB4.js
create mode 100644 tbb-tests/browser_tor_bug2950.js
create mode 100644 tbb-tests/browser_tor_omnibox.js
create mode 100644 tbb-tests/mochitest.ini
create mode 100644 tbb-tests/moz.build
create mode 100644 tbb-tests/test_tor_bug2874.html
create mode 100644 toolkit/modules/Bech32Decode.jsm
create mode 100644 toolkit/modules/QRCode.jsm
create mode 160000 toolkit/torproject/torbutton
create mode 100644 tools/torbrowser/Makefile
create mode 100644 tools/torbrowser/bridges.js
create mode 100755 tools/torbrowser/build.sh
create mode 100755 tools/torbrowser/clobber.sh
create mode 100755 tools/torbrowser/config.sh
create mode 100755 tools/torbrowser/deploy.sh
create mode 100755 tools/torbrowser/fetch.sh
create mode 100755 tools/torbrowser/ide.sh
create mode 100755 tools/torbrowser/jslint.sh
create mode 100755 tools/torbrowser/update_bridgemoiji.py
create mode 100644 xpcom/io/TorFileUtils.cpp
create mode 100644 xpcom/io/TorFileUtils.h
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
1
66
[tor-browser] branch geckoview-102.2.0esr-12.0-1 created (now be437c77825e6)
by gitolite role 31 Aug '22
by gitolite role 31 Aug '22
31 Aug '22
This is an automated email from the git hooks/post-receive script.
richard pushed a change to branch geckoview-102.2.0esr-12.0-1
in repository tor-browser.
at be437c77825e6 Bug 1785788 - Gracefully handle null nickname in CERT_GetCertNicknameWithValidity. r=rrelyea, a=RyanVM UPGRADE_NSS_RELEASE
No new revisions were added by this update.
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
1
0
[tor-browser] branch tor-browser-102.2.0esr-12.0-2 created (now be437c77825e6)
by gitolite role 31 Aug '22
by gitolite role 31 Aug '22
31 Aug '22
This is an automated email from the git hooks/post-receive script.
richard pushed a change to branch tor-browser-102.2.0esr-12.0-2
in repository tor-browser.
at be437c77825e6 Bug 1785788 - Gracefully handle null nickname in CERT_GetCertNicknameWithValidity. r=rrelyea, a=RyanVM UPGRADE_NSS_RELEASE
No new revisions were added by this update.
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
1
0
31 Aug '22
This is an automated email from the git hooks/post-receive script.
pierov pushed a change to branch main
in repository builders/tor-browser-build.
from cc37607 Bug 40614: Update release templates with feedback from ma1
new 3f2459a Revert "Bug 40603: Revert cbindgen update for desktop"
new 5831fbe Bug 40595: Update config and toolchains for 102
new 0fa09e9 Bug 29318: Use Clang for everything on Windows
new 3ad4275 Bug 40591: Fix Rust 1.60 on Debian Jessie
new 3448858 Bug 29322: Use mingw-w64/clang toolchain to build OpenSSL
new 791d781 Bug 29321: Use mingw-w64/clang toolchain to build tor
new ca0d30c Bug 40409: Upgrade NSIS to 3.08
new c4c7d4e Bug 41152: Do not merge libc++ and libunwind
The 8 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
projects/cbindgen/build | 3 +
projects/cbindgen/config | 20 +--
projects/clang/build | 14 ++-
projects/firefox/build | 19 ++-
projects/firefox/config | 15 ++-
projects/firefox/list_toolchain_updates_checks | 55 ++++----
projects/fxc2/config | 3 -
projects/gcc-source/build | 2 +
projects/gcc-source/config | 7 ++
projects/gcc/build | 2 +-
projects/gcc/config | 6 +-
projects/go/build | 2 +-
projects/libevent/build | 3 +
projects/libevent/config | 3 +
projects/llvm-mingw/build | 8 --
projects/llvm-mingw/config | 5 -
projects/llvm-project/config | 4 +-
projects/macosx-toolchain/build | 1 +
.../compiler-rt-cross-compile.patch | 4 +-
.../macosx-toolchain/compiler-rt-no-codesign.patch | 4 +-
projects/mingw-w64-clang/build | 138 +++++++++------------
projects/mingw-w64-clang/config | 9 +-
projects/mingw-w64-clang/libssp-Makefile | 25 ++++
.../mingw-uiautomationcoreapi.patch | 13 ++
.../mingw-w64-clang/mingw-windows_foundation.patch | 14 +++
projects/mingw-w64/build | 5 +-
projects/mingw-w64/config | 9 +-
projects/nsis/build | 6 +-
projects/nsis/config | 10 +-
projects/openssl/build | 11 +-
projects/rust/build | 41 +++---
projects/rust/config | 57 ++++-----
projects/rust/fix-build-1.53.0.patch | 88 -------------
projects/tor-launcher/config | 2 +-
projects/tor/build | 14 +--
projects/zlib/build | 4 +-
rbm.conf | 8 +-
37 files changed, 308 insertions(+), 326 deletions(-)
create mode 100644 projects/gcc-source/build
create mode 100644 projects/gcc-source/config
delete mode 100644 projects/llvm-mingw/build
delete mode 100644 projects/llvm-mingw/config
create mode 100644 projects/mingw-w64-clang/libssp-Makefile
create mode 100644 projects/mingw-w64-clang/mingw-uiautomationcoreapi.patch
create mode 100644 projects/mingw-w64-clang/mingw-windows_foundation.patch
delete mode 100644 projects/rust/fix-build-1.53.0.patch
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
1
8
[tor-browser] branch tor-browser-102.2.0esr-12.0-1 updated (0b39923ea81c0 -> 661eb5e548db2)
by gitolite role 31 Aug '22
by gitolite role 31 Aug '22
31 Aug '22
This is an automated email from the git hooks/post-receive script.
pierov pushed a change to branch tor-browser-102.2.0esr-12.0-1
in repository tor-browser.
from 0b39923ea81c0 squash! Bug 40562: Added Tor-related preferences to 000-tor-browser.js
new de57e6ff0fccb fixup! Base Browser's .mozconfigs.
new 661eb5e548db2 fixup! TB3: Tor Browser's official .mozconfigs.
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
mozconfig-linux-arm | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
create mode 100644 mozconfig-linux-arm
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
1
2
[Git][tpo/applications/android-components][android-components-102.0.14-12.0-1] Improve search term performance on the toolbar
by Richard Pospesel (@richard) 30 Aug '22
by Richard Pospesel (@richard) 30 Aug '22
30 Aug '22
Richard Pospesel pushed to branch android-components-102.0.14-12.0-1 at The Tor Project / Applications / android-components
Commits:
18a85e4a by sarah541 at 2022-08-30T20:29:32+00:00
Improve search term performance on the toolbar
- - - - -
2 changed files:
- components/browser/toolbar/src/main/java/mozilla/components/browser/toolbar/BrowserToolbar.kt
- components/browser/toolbar/src/test/java/mozilla/components/browser/toolbar/BrowserToolbarTest.kt
Changes:
=====================================
components/browser/toolbar/src/main/java/mozilla/components/browser/toolbar/BrowserToolbar.kt
=====================================
@@ -75,7 +75,8 @@ class BrowserToolbar @JvmOverloads constructor(
defStyleAttr: Int = 0
) : ViewGroup(context, attrs, defStyleAttr), Toolbar {
private var state: State = State.DISPLAY
- private var searchTerms: String = ""
+ @VisibleForTesting
+ internal var searchTerms: String = ""
private var urlCommitListener: ((String) -> Boolean)? = null
/**
@@ -219,11 +220,11 @@ class BrowserToolbar @JvmOverloads constructor(
}
override fun setSearchTerms(searchTerms: String) {
+ this.searchTerms = searchTerms.take(MAX_URI_LENGTH)
+
if (state == State.EDIT) {
- edit.editSuggestion(searchTerms)
+ edit.editSuggestion(this.searchTerms)
}
-
- this.searchTerms = searchTerms
}
override fun displayProgress(progress: Int) {
=====================================
components/browser/toolbar/src/test/java/mozilla/components/browser/toolbar/BrowserToolbarTest.kt
=====================================
@@ -152,6 +152,38 @@ class BrowserToolbarTest {
assertEquals("c".repeat(MAX_URI_LENGTH - 1), capturedValues[2])
}
+ @Test
+ fun `searchTerms is truncated in case it is greater than MAX_URI_LENGTH`() {
+ val toolbar = BrowserToolbar(testContext)
+ toolbar.edit = spy(toolbar.edit)
+ toolbar.editMode()
+
+ toolbar.setSearchTerms("a".repeat(MAX_URI_LENGTH + 1))
+
+ // Value was too long and should've been truncated
+ assertEquals(toolbar.searchTerms.length, MAX_URI_LENGTH)
+ verify(toolbar.edit).editSuggestion("a".repeat(MAX_URI_LENGTH))
+ }
+
+ @Test
+ fun `searchTerms is not truncated in case it is equal or less than MAX_URI_LENGTH`() {
+ val toolbar = BrowserToolbar(testContext)
+ toolbar.edit = spy(toolbar.edit)
+ toolbar.editMode()
+
+ toolbar.setSearchTerms("b".repeat(MAX_URI_LENGTH))
+
+ // Value should be the same as before
+ assertEquals(toolbar.searchTerms.length, MAX_URI_LENGTH)
+ verify(toolbar.edit).editSuggestion("b".repeat(MAX_URI_LENGTH))
+
+ toolbar.setSearchTerms("c".repeat(MAX_URI_LENGTH - 1))
+
+ // Value should be the same as before
+ assertEquals(toolbar.searchTerms.length, MAX_URI_LENGTH - 1)
+ verify(toolbar.edit).editSuggestion("c".repeat(MAX_URI_LENGTH - 1))
+ }
+
@Test
fun `last URL will be forwarded to edit toolbar when switching mode`() {
val toolbar = BrowserToolbar(testContext)
View it on GitLab: https://gitlab.torproject.org/tpo/applications/android-components/-/commit/…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/android-components/-/commit/…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[tor-browser] branch tor-browser-102.2.0esr-12.0-1 updated (3a79382bda2a4 -> 0b39923ea81c0)
by gitolite role 30 Aug '22
by gitolite role 30 Aug '22
30 Aug '22
This is an automated email from the git hooks/post-receive script.
pierov pushed a change to branch tor-browser-102.2.0esr-12.0-1
in repository tor-browser.
from 3a79382bda2a4 fixup! Bug 10760: Integrate TorButton to TorBrowser core
new 294e26eec8fa1 fixup! Firefox preference overrides.
new 0b39923ea81c0 squash! Bug 40562: Added Tor-related preferences to 000-tor-browser.js
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
browser/app/profile/000-tor-browser.js | 4 ++++
browser/app/profile/001-base-profile.js | 2 --
2 files changed, 4 insertions(+), 2 deletions(-)
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
1
2
This is an automated email from the git hooks/post-receive script.
richard pushed a change to annotated tag 0.2.39
in repository tor-launcher.
at 4168b9b (tag)
tagging 9cada61ef1373d9efd11ce797b97b756f1e00cab (commit)
replaces 0.2.38
by Richard Pospesel
on Tue Aug 30 19:04:09 2022 +0000
- Log -----------------------------------------------------------------
Release preparations for 0.2.39
-----BEGIN PGP SIGNATURE-----
iQJLBAABCAA1FiEEvnyRTMkiztnZPSO33kc2A2PzSywFAmMOXzIXHHJpY2hhcmRA
dG9ycHJvamVjdC5vcmcACgkQ3kc2A2PzSywBFw/7Bt/Jc9uT6mv6m96+sQdteKFv
m7X4Q0BunNL+hwEyd7Y84sBag+zJH+T5EiqOYIw4kjVi0QRxjvFVsu6/he48mL98
i0ZOiXab3S4lQyymhZxZ3GK7AWgoG/quQTJU/PZ51/sYOy99ynIp3FjUspcgj9Vj
sxrgPBZ/ev5K8FfkorreL9gnOE8ZxlWTQ7JqjTIKZafSGmui7BWgwySIY+bP6pB0
EvUc8cKB1hTGqwVrVcaZaPjFcRZWBHEnl6e1o/NhZnOPqF2LL4LT2DZG9tijECkc
LEFG3hPPHI9Et7n+cBCtoIlNt5fpcNRB1ZWwH347FbFaCB80fAc3U+iS5gvDxc8y
j+rOh3fBXrXx1Ghx4C2Bemy1WnnnjDP1aJajs8FOks3DZDGuzbtK2U8yXSmNqKKW
tHrjWzFeL6LyqAFbu4U0PeyvWaMdPCQJ/tPp+xiEeL6Fzxqiu1tRavw+5DJZ9yQ2
kDVapK8TmrC5fO1i1l5Di9fPTGxhGN7I0gjy4yF1BRjRR1AF46ZFz3qTbKr+bNxD
F/SCQEPngRi5QwgFNlPCAbWLAJ6MZG1Z0v+AKeNptn1wkc+oxgsRz1gkZCDNEl/v
xXGMVyNsGYP1I2XxFxQ6C4sDxFlJzjzbKTvXyrNWxRN4yeLnRXYus5YjlIMoXsEO
3BSEm8I5ex2+VkSN1mg=
=1lW0
-----END PGP SIGNATURE-----
-----------------------------------------------------------------------
No new revisions were added by this update.
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
1
0
This is an automated email from the git hooks/post-receive script.
richard pushed a change to branch main
in repository tor-launcher.
from dc6f823 Bug 40580: Add support for uk (ukranian) locale
new ca3344a fixup! Bug 40730: Update tor-launcher for Firefox 102.
new 2806a0f Update translations
new 9cada61 Release preparations for 0.2.39
The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
jar.mn.in | 2 ++
src/chrome/locale/bg/torlauncher.properties | 2 +-
src/chrome/locale/cs/network-settings.dtd | 4 ++--
src/chrome/locale/hy-AM/network-settings.dtd | 10 +++++-----
src/chrome/locale/hy-AM/torlauncher.properties | 24 ++++++++++++------------
src/chrome/locale/id/network-settings.dtd | 2 +-
src/chrome/locale/it/torlauncher.properties | 4 ++--
src/chrome/locale/pt-BR/network-settings.dtd | 24 ++++++++++++------------
src/chrome/locale/zh-CN/network-settings.dtd | 14 +++++++-------
src/install.rdf | 2 +-
10 files changed, 45 insertions(+), 43 deletions(-)
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
1
3
This is an automated email from the git hooks/post-receive script.
richard pushed a commit to branch main
in repository torbutton.
The following commit(s) were added to refs/heads/main by this push:
new d52ddb7d Translation updates
d52ddb7d is described below
commit d52ddb7d38790b5c2ccccb540514e2db7b443c26
Author: Richard Pospesel <richard(a)torproject.org>
AuthorDate: Tue Aug 30 18:25:13 2022 +0000
Translation updates
---
chrome/locale/cs/torbutton.dtd | 2 +-
chrome/locale/cs/torbutton.properties | 38 +++++++++++++++---------------
chrome/locale/es-ES/torbutton.properties | 2 +-
chrome/locale/ka/aboutDialog.dtd | 4 ++--
chrome/locale/ka/aboutTBUpdate.dtd | 2 +-
chrome/locale/ka/aboutTor.dtd | 6 ++---
chrome/locale/ka/brand.dtd | 2 +-
chrome/locale/ka/brand.properties | 2 +-
chrome/locale/ka/branding/brand.ftl | 2 +-
chrome/locale/pt-BR/aboutTor.dtd | 7 +++---
chrome/locale/zh-CN/torbutton.properties | 40 ++++++++++++++++----------------
11 files changed, 53 insertions(+), 54 deletions(-)
diff --git a/chrome/locale/cs/torbutton.dtd b/chrome/locale/cs/torbutton.dtd
index 4351bd38..dba0a8fd 100644
--- a/chrome/locale/cs/torbutton.dtd
+++ b/chrome/locale/cs/torbutton.dtd
@@ -41,7 +41,7 @@
<!ENTITY torbutton.prefs.sec_click_to_play_media "Audio, video (HTML5 média) a WebGL se přehrávají po kliknutí.">
<!ENTITY torbutton.prefs.sec_custom_warning "Vlastní">
<!ENTITY torbutton.prefs.sec_overview "Vypnout některé webové funkce, které mohou být zneužity k ohrožení vaší bezpečnosti a anonymity.">
-<!ENTITY torbutton.prefs.sec_standard_tooltip "Úroveň zabezpečení: běžná">
+<!ENTITY torbutton.prefs.sec_standard_tooltip "Úroveň zabezpečení: Standardní">
<!ENTITY torbutton.prefs.sec_safer_tooltip "Úroveň zabezpečení: bezpečnější">
<!ENTITY torbutton.prefs.sec_safest_tooltip "Úroveň zabezpečení: nejbezpečnější">
<!ENTITY torbutton.prefs.sec_custom_summary "Vaše nastavení prohlížeče neodpovídá standardnímu nastavení zabezpečení. Z důvodu ochrany soukromí a zvýšení bezpečnosti vám doporučujeme vybrat si jednu z výchozích bezpečnostních úrovní.">
diff --git a/chrome/locale/cs/torbutton.properties b/chrome/locale/cs/torbutton.properties
index ed35b894..139b8ecf 100644
--- a/chrome/locale/cs/torbutton.properties
+++ b/chrome/locale/cs/torbutton.properties
@@ -156,32 +156,32 @@ cryptoSafetyPrompt.secondaryAction=Odmítnout varování
cryptoSafetyPrompt.secondaryActionAccessKey=B
# about:rulesets strings.
-rulesets.warningTitle=Proceed with Caution
-rulesets.warningDescription=Adding or modifying rulesets can cause attackers to hijack your browser. Proceed only if you know what you are doing.
-rulesets.warningEnable=Warn me when I attempt to access these preferences
-rulesets.warningButton=Accept the Risk and Continue
+rulesets.warningTitle=Pokračujte po uvážení
+rulesets.warningDescription=Přidávání nebo úprava sad pravidel může umožnit útočníkům zneužít váš prohlížeč. Pokračujte pouze pokud více, co děláte.
+rulesets.warningEnable=Varujte mě, když se pokusím o přístup k těmto nastavením.
+rulesets.warningButton=Souhlasit s rizikem a pokračovat
# Ruleset list
-rulesets.rulesets=Rulesets
-rulesets.noRulesets=No rulesets found
-rulesets.noRulesetsDescr=When you save a ruleset in Tor Browser, it will show up here.
+rulesets.rulesets=Sady pravidel
+rulesets.noRulesets=Sady pravidel nenalezeny
+rulesets.noRulesetsDescr=Když máte sadu pravidel v Prohlížeči Tor, zobrazí se zde.
# LOCALIZATION NOTE: %S will be replaced by the update date (automatically formatted by Firefox's l10n component)
-rulesets.lastUpdated=Last updated %S
-rulesets.neverUpdated=Never updated, or last update failed
+rulesets.lastUpdated=Naposledy aktualizováno %S
+rulesets.neverUpdated=Nikdy neaktualizováno a nebo poslední aktualizace selhala
rulesets.enabled=Povoleno
rulesets.disabled=Vypnuto
# Ruleset details/edit ruleset
rulesets.edit=Změnit
rulesets.name=Název
rulesets.jwk=JWK
-rulesets.pathPrefix=Path Prefix
-rulesets.scope=Scope
-rulesets.enable=Enable this ruleset
-rulesets.checkUpdates=Check for Updates
-rulesets.jwkPlaceholder=The key used to sign this ruleset in the JWK (JSON Web Key) format
-rulesets.jwkInvalid=The JWK could not be parsed, or it is not a valid key
-rulesets.pathPrefixPlaceholder=URL prefix that contains the files needed by the ruleset
-rulesets.pathPrefixInvalid=The path prefix is not a valid HTTP(S) URL
-rulesets.scopePlaceholder=Regular expression for the scope of the rules
-rulesets.scopeInvalid=The scope could not be parsed as a regular expression
+rulesets.pathPrefix=Předpona cesty
+rulesets.scope=Rámec
+rulesets.enable=Zapnout tuto sadu pravidel
+rulesets.checkUpdates=Zkontrolovat aktualizace
+rulesets.jwkPlaceholder=Klíč použitý pro podepsání této sady pravidel v JWK (JSON Web Key) formátu
+rulesets.jwkInvalid=JWK nemůže být zpracován a nebo nejde o platný klíč
+rulesets.pathPrefixPlaceholder=URL předpona, která obsahuje soubory, potřebné pro sadu pravidel
+rulesets.pathPrefixInvalid=Předpona cesty není platnou HTTP(S) adresou
+rulesets.scopePlaceholder=Regulární výraz pro rámec pravidel
+rulesets.scopeInvalid=Rámec nemohl být zpracován jako regulární výraz
rulesets.save=Uložit
rulesets.cancel=Zrušit
diff --git a/chrome/locale/es-ES/torbutton.properties b/chrome/locale/es-ES/torbutton.properties
index 8b387517..5180c749 100644
--- a/chrome/locale/es-ES/torbutton.properties
+++ b/chrome/locale/es-ES/torbutton.properties
@@ -162,7 +162,7 @@ rulesets.warningEnable=Avisarme cuando intente acceder a estas preferencias
rulesets.warningButton=Aceptar el riesgo y continuar
# Ruleset list
rulesets.rulesets=Conjunto de reglas
-rulesets.noRulesets=No se han encontrado conjunto de reglas
+rulesets.noRulesets=No se ha encontrado ningún conjunto de reglas
rulesets.noRulesetsDescr=Cuando guardes un conjunto de reglas en el Navegador Tor, aparecerá aquí.
# LOCALIZATION NOTE: %S will be replaced by the update date (automatically formatted by Firefox's l10n component)
rulesets.lastUpdated=Última actualización %S
diff --git a/chrome/locale/ka/aboutDialog.dtd b/chrome/locale/ka/aboutDialog.dtd
index 3320ad18..c8ef0ce3 100644
--- a/chrome/locale/ka/aboutDialog.dtd
+++ b/chrome/locale/ka/aboutDialog.dtd
@@ -13,7 +13,7 @@
<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to https://www.torproject.org/docs/trademark-faq.html.en -->
<!ENTITY bottomLinks.questions "კითხვები გაქვთ?">
<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to https://www.torproject.org/getinvolved/relays -->
-<!ENTITY bottomLinks.grow "დაეხმარეთ Tor ქსელს გაფართოებაში!">
+<!ENTITY bottomLinks.grow "დაეხმარეთ Tor-ქსელს გაფართოებაში!">
<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to about:license -->
<!ENTITY bottomLinks.license "სალიცენზიო მონაცემები">
-<!ENTITY tor.TrademarkStatement "„Tor“ და „Onion Logo“ წარმოადგენს Tor Project Inc-ის კუთვნილ სავაჭრო ნიშნებს.">
+<!ENTITY tor.TrademarkStatement "„Tor“ და „Onion Logo“ წარმოადგენს სავაჭრო ნიშნებს, რომელთა მესაკუთრეცაა Tor Project Inc.">
diff --git a/chrome/locale/ka/aboutTBUpdate.dtd b/chrome/locale/ka/aboutTBUpdate.dtd
index 0b1b779c..a8f2a496 100644
--- a/chrome/locale/ka/aboutTBUpdate.dtd
+++ b/chrome/locale/ka/aboutTBUpdate.dtd
@@ -1,6 +1,6 @@
<!ENTITY aboutTBUpdate.changelogTitle "Tor-ბრაუზერის ცვლილებების ისტორია">
<!ENTITY aboutTBUpdate.updated "Tor-ბრაუზერი განახლებულია.">
-<!ENTITY aboutTBUpdate.linkPrefix "ამ გამოშვების შესახებ უახლესი ინფორმაციის მისაღებად, ">
+<!ENTITY aboutTBUpdate.linkPrefix "ამ გამოშვების შესახებ უახლესი ინფორმაციის მისაღებად">
<!ENTITY aboutTBUpdate.linkLabel "ეწვიეთ ჩვენს ვებსაიტს">
<!ENTITY aboutTBUpdate.linkSuffix ".">
<!ENTITY aboutTBUpdate.version "ვერსია">
diff --git a/chrome/locale/ka/aboutTor.dtd b/chrome/locale/ka/aboutTor.dtd
index 3c444ded..4e9aa276 100644
--- a/chrome/locale/ka/aboutTor.dtd
+++ b/chrome/locale/ka/aboutTor.dtd
@@ -22,12 +22,12 @@
<!ENTITY aboutTor.torbrowser_user_manual.accesskey "ხ">
<!ENTITY aboutTor.torbrowser_user_manual.label "Tor-ბრაუზერის სახელმძღვანელო">
-<!ENTITY aboutTor.tor_mission.label "Tor-პროექტი წარმოადგენს 501(c)(3) არამომგებიან დაწესებულებას, რომელიც ხელს უწყობს ადამიანის უფლებების დაცვისა და თავისუფლების ხარისხის გაუმჯობესებას, უფასო და ღია წყაროს მქონე, ვინაობისა და პირადი მონაცემების გამჟღავნებისგან ასარიდებელი საშუალებების შექმნითა და გავრცელებით, მათზე შეუზღუდავი წვდომისა და გამოყენების უზრუნველყოფით, შემდგომ კი მათთან დაკავშირე
ბით, მეცნიერული გაგებისა და საზოგადოების ცნობიერების დონის ამაღლებით.">
+<!ENTITY aboutTor.tor_mission.label "Tor-პროექტი წარმოადგენს 501(c)(3) არამომგებიან დაწესებულებას, რომელიც ხელს უწყობს ადამიანის უფლებების დაცვისა და თავისუფლების ხარისხის გაუმჯობესებას უფასო და ღია წყაროს მქონე, ვინაობისა და პირადი მონაცემების გამჟღავნებისგან ასარიდებელი საშუალებების შექმნითა და გავრცელებით, მათზე შეუზღუდავი წვდომისა და გამოყენების უზრუნველყოფით, შემდგომ კი მათთან დაკავშირე�
��ით, მეცნიერული გაგებისა და საზოგადოების ცნობიერების დონის ამაღლებით.">
<!ENTITY aboutTor.getInvolved.label "შემოგვიერთდით »">
<!ENTITY aboutTor.newsletter.tagline "მიიღეთ სიახლეები Tor-ისგან პირდაპირ თქვენს საფოსტო ყუთში.">
<!ENTITY aboutTor.newsletter.link_text "გამოიწერეთ Tor-ის სიახლეები.">
-<!ENTITY aboutTor.donationBanner.freeToUse "Tor უფასოა, თქვენნაირი ადამიანების შემოწირულობების წყალობით.">
+<!ENTITY aboutTor.donationBanner.freeToUse "Tor უფასოა თქვენნაირი ადამიანების შემოწირულობების წყალობით.">
<!ENTITY aboutTor.donationBanner.buttonA "გაიღეთ თანხა">
<!ENTITY aboutTor.alpha.ready.label "გამოცადეთ. გულდასმით.">
@@ -37,5 +37,5 @@
<!ENTITY aboutTor.nightly.ready.label "გამოცადეთ. გულდასმით.">
<!ENTITY aboutTor.nightly.ready2.label "თქვენ მზად ხართ მსოფლიოში ყველაზე მეტად დაცული და პირადი ბრაუზერის გამოსაცდელად.">
-<!ENTITY aboutTor.nightly.bannerDescription "Tor-ბრაუზერი Nightly მეტად არამდგრადი ვერსიის Tor-ბრაუზერია, რომელიც გამოსადეგია ახალი შესაძლებლობების წინასწარ მოსასინჯად, წარმადობის შესაფასებლად და მოსაზრებების მოსახსენებლად საბოლოო გამოშვებამდე.">
+<!ENTITY aboutTor.nightly.bannerDescription "Tor-ბრაუზერი Nightly მეტად არამდგრადი ვერსიის Tor-ბრაუზერია და გამოიყენება ახალი შესაძლებლობების წინასწარ მოსასინჯად, წარმადობის შესაფასებლად და მოსაზრებების მოსახსენებლად საბოლოო გამოშვებამდე.">
<!ENTITY aboutTor.nightly.bannerLink "მოგვახსენეთ ხარვეზის შესახებ Tor-ის ფორუმზე">
\ No newline at end of file
diff --git a/chrome/locale/ka/brand.dtd b/chrome/locale/ka/brand.dtd
index dce3bc74..e3fd367d 100644
--- a/chrome/locale/ka/brand.dtd
+++ b/chrome/locale/ka/brand.dtd
@@ -6,7 +6,7 @@
<!ENTITY brandShortName "Tor-ბრაუზერი">
<!ENTITY brandFullName "Tor-ბრაუზერი">
<!ENTITY vendorShortName "Tor-პროექტი">
-<!ENTITY trademarkInfo.part1 "„Tor“ და „Onion Logo“ წარმოადგენს Tor Project Inc-ის კუთვნილ სავაჭრო ნიშნებს.">
+<!ENTITY trademarkInfo.part1 "„Tor“ და „Onion Logo“ წარმოადგენს სავაჭრო ნიშნებს, რომელთა მესაკუთრეცაა Tor Project Inc.">
<!-- LOCALIZATION NOTE (brandProductName):
This brand name can be used in messages where the product name needs to
remain unchanged across different versions (Nightly, Beta, etc.). -->
diff --git a/chrome/locale/ka/brand.properties b/chrome/locale/ka/brand.properties
index 5bd19f43..8848da4b 100644
--- a/chrome/locale/ka/brand.properties
+++ b/chrome/locale/ka/brand.properties
@@ -12,7 +12,7 @@ brandProductName=Tor-ბრაუზერი
vendorShortName=Tor-პროექტი
homePageSingleStartMain=Firefox Start, სწრაფი საწყისი გვერდი ჩაშენებული ძიების ველით
-homePageImport=გადმოიტანეთ თქვენი საწყისი გვერდი %S-იდან
+homePageImport=გადმოიტანეთ თქვენი საწყისი გვერდი – %S
homePageMigrationPageTitle=საწყისი გვერდის არჩევა
homePageMigrationDescription=გთხოვთ აირჩიოთ სასურველი საწყისი გვერდი:
diff --git a/chrome/locale/ka/branding/brand.ftl b/chrome/locale/ka/branding/brand.ftl
index 73298249..df85c165 100644
--- a/chrome/locale/ka/branding/brand.ftl
+++ b/chrome/locale/ka/branding/brand.ftl
@@ -9,4 +9,4 @@
# remain unchanged across different versions (Nightly, Beta, etc.).
-brand-product-name = Tor-ბრაუზერი
-vendor-short-name = Tor-პროექტი
-trademarkInfo = „Tor“ და „Onion Logo“ წარმოადგენს Tor Project Inc-ის კუთვნილ სავაჭრო ნიშნებს.
+trademarkInfo = „Tor“ და „Onion Logo“ წარმოადგენს სავაჭრო ნიშნებს, რომელთა მესაკუთრეცაა Tor Project Inc.
diff --git a/chrome/locale/pt-BR/aboutTor.dtd b/chrome/locale/pt-BR/aboutTor.dtd
index 3efba596..e11775f1 100644
--- a/chrome/locale/pt-BR/aboutTor.dtd
+++ b/chrome/locale/pt-BR/aboutTor.dtd
@@ -23,12 +23,11 @@
<!ENTITY aboutTor.torbrowser_user_manual.label "Manual do Navegador Tor">
<!ENTITY aboutTor.tor_mission.label "O Projeto Tor é uma organização sem fins lucrativos dos EUA 501 (c) (3) que promove direitos humanos e liberdades, criando e implementando tecnologias de privacidade e anonimato, de código aberto e livre, apoiando a sua disponibilidade e uso irrestrito e promovendo o seu entendimento científico e popular">
-<!ENTITY aboutTor.getInvolved.label "Ficar envolvido
-">
+<!ENTITY aboutTor.getInvolved.label "Envolva-se»">
<!ENTITY aboutTor.newsletter.tagline "Receba as últimas notícias do Tor diretamente na sua caixa de e-mail.">
<!ENTITY aboutTor.newsletter.link_text "Inscreva-se para receber Notícias do Tor.">
-<!ENTITY aboutTor.donationBanner.freeToUse "O Tor é gratuito graças às doações de pessoas como você.">
+<!ENTITY aboutTor.donationBanner.freeToUse "O Tor é gratuito para uso graças às doações de pessoas como você.">
<!ENTITY aboutTor.donationBanner.buttonA "Doe Agora">
<!ENTITY aboutTor.alpha.ready.label "Teste. Completamente.">
@@ -38,5 +37,5 @@
<!ENTITY aboutTor.nightly.ready.label "Teste. Completamente.">
<!ENTITY aboutTor.nightly.ready2.label "Você está pronto para testar a experiência de navegação mais privada do mundo.">
-<!ENTITY aboutTor.nightly.bannerDescription "Tor Browser Nightly is an unstable version of Tor Browser you can use to preview new features, test their performance and provide feedback before release.">
+<!ENTITY aboutTor.nightly.bannerDescription "O Tor Browser está em versão instável do Tor Browser que você usa para pré-visualizar novos recursos, testar seu desempenho e prover feedback antes do lançamento.">
<!ENTITY aboutTor.nightly.bannerLink "Relate um bug no Fórum Tor">
\ No newline at end of file
diff --git a/chrome/locale/zh-CN/torbutton.properties b/chrome/locale/zh-CN/torbutton.properties
index d78c9eab..36b94181 100644
--- a/chrome/locale/zh-CN/torbutton.properties
+++ b/chrome/locale/zh-CN/torbutton.properties
@@ -132,7 +132,7 @@ onionServices.v2Deprecated.tryAgain=了解了
onionServices.v2Deprecated.tooltip=该洋葱网站将很快无法访问
# Onion-Location strings.
-onionLocation.alwaysPrioritize=始终优先洋葱服务
+onionLocation.alwaysPrioritize=始终优先选用洋葱服务
onionLocation.alwaysPrioritizeAccessKey=a
onionLocation.notNow=暂不
onionLocation.notNowAccessKey=n
@@ -156,32 +156,32 @@ cryptoSafetyPrompt.secondaryAction=消除警告
cryptoSafetyPrompt.secondaryActionAccessKey=B
# about:rulesets strings.
-rulesets.warningTitle=Proceed with Caution
-rulesets.warningDescription=Adding or modifying rulesets can cause attackers to hijack your browser. Proceed only if you know what you are doing.
-rulesets.warningEnable=Warn me when I attempt to access these preferences
-rulesets.warningButton=Accept the Risk and Continue
+rulesets.warningTitle=请小心操作
+rulesets.warningDescription=加入或修改规则集可能导致浏览器遭受攻击。仅在知道自己在做什么事情的情况下继续。
+rulesets.warningEnable=试图访问这些首选项时警告我
+rulesets.warningButton=接受风险并继续
# Ruleset list
-rulesets.rulesets=Rulesets
-rulesets.noRulesets=No rulesets found
-rulesets.noRulesetsDescr=When you save a ruleset in Tor Browser, it will show up here.
+rulesets.rulesets=规则集
+rulesets.noRulesets=未找到规则集
+rulesets.noRulesetsDescr=规则集在 Tor 浏览器保存时会显示。
# LOCALIZATION NOTE: %S will be replaced by the update date (automatically formatted by Firefox's l10n component)
-rulesets.lastUpdated=Last updated %S
-rulesets.neverUpdated=Never updated, or last update failed
+rulesets.lastUpdated=最近更新 %S
+rulesets.neverUpdated=从未更新,或上次更新失败
rulesets.enabled=启用
rulesets.disabled=禁用
# Ruleset details/edit ruleset
rulesets.edit=编辑
rulesets.name=名称
rulesets.jwk=JWK
-rulesets.pathPrefix=Path Prefix
-rulesets.scope=Scope
-rulesets.enable=Enable this ruleset
-rulesets.checkUpdates=Check for Updates
-rulesets.jwkPlaceholder=The key used to sign this ruleset in the JWK (JSON Web Key) format
-rulesets.jwkInvalid=The JWK could not be parsed, or it is not a valid key
-rulesets.pathPrefixPlaceholder=URL prefix that contains the files needed by the ruleset
-rulesets.pathPrefixInvalid=The path prefix is not a valid HTTP(S) URL
-rulesets.scopePlaceholder=Regular expression for the scope of the rules
-rulesets.scopeInvalid=The scope could not be parsed as a regular expression
+rulesets.pathPrefix=路径前缀
+rulesets.scope=范围
+rulesets.enable=启用此规则集
+rulesets.checkUpdates=检查更新
+rulesets.jwkPlaceholder=该密钥用于在 JWK(JSON Web 密钥)格式签名此规则集
+rulesets.jwkInvalid=JWK 无法解析,或不是一个有效密钥
+rulesets.pathPrefixPlaceholder=含有规则集所需文件的 URL 前缀
+rulesets.pathPrefixInvalid=路径前缀不是一个有效 HTTP(S)的 URL
+rulesets.scopePlaceholder=规则范围的正则表达式
+rulesets.scopeInvalid=范围无法解析为一个正则表达式
rulesets.save=保存
rulesets.cancel=取消
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
1
0
[builders/tor-browser-build] branch main updated: Bug 40614: Update release templates with feedback from ma1
by gitolite role 30 Aug '22
by gitolite role 30 Aug '22
30 Aug '22
This is an automated email from the git hooks/post-receive script.
richard pushed a commit to branch main
in repository builders/tor-browser-build.
The following commit(s) were added to refs/heads/main by this push:
new cc37607 Bug 40614: Update release templates with feedback from ma1
cc37607 is described below
commit cc3760710715c4bdb49b4a10e2112103ebd6e59b
Author: Richard Pospesel <richard(a)torproject.org>
AuthorDate: Tue Aug 30 01:03:59 2022 +0000
Bug 40614: Update release templates with feedback from ma1
---
.gitlab/issue_templates/Release Prep - Alpha.md | 37 +++++++++-----
.gitlab/issue_templates/Release Prep - Stable.md | 61 ++++++++++++++++--------
2 files changed, 65 insertions(+), 33 deletions(-)
diff --git a/.gitlab/issue_templates/Release Prep - Alpha.md b/.gitlab/issue_templates/Release Prep - Alpha.md
index f6352a5..10432e1 100644
--- a/.gitlab/issue_templates/Release Prep - Alpha.md
+++ b/.gitlab/issue_templates/Release Prep - Alpha.md
@@ -59,11 +59,11 @@
### **tba-translation** : https://git.torproject.org/translation.git
- [ ] Fetch latest and identify new `HEAD` of `fenix-torbrowserstringsxml` branch
- - [ ] `origin/fenix-torbrowserstringsxml` : `<INSERT_COMMIT_HASH_HERE>`
+ - [ ] `origin/fenix-torbrowserstringsxml` : `<INSERT COMMIT HASH HERE>`
### **tor-android-service** ***(Optional)***: https://git.torproject.org/tor-android-service.git
- [ ] Fetch latest and identify new `HEAD` of `main` branch
- - [ ] `origin/main` : `<INSERT_COMMIT_HASH_HERE>`
+ - [ ] `origin/main` : `<INSERT COMMIT HASH HERE>`
### ***Security Vulnerabilities Backport*** : https://www.mozilla.org/en-US/security/advisories/
- [ ] Go through any `Security Vulnerabilities fixed in Firefox $(RR_VERSION)` (or similar) and create list of CVEs which affect Android that need to be a backported
@@ -114,8 +114,13 @@
- Message : `Hg tag $(ESR_TAG)`
- [ ] Push new branch and tag to origin
- [ ] Rebase `tor-browser` patches
- - [ ] Perform rangediff to ensure nothing weird happened resolving conflicts
- - `git range-diff $(ESR_TAG_PREV)..$(TOR_BROWSER_BRANCH_PREV) $(ESR_TAG)..$(TOR_BROWSER_BRANCH)`
+ - [ ] Compare patch-sets (ensure nothing *weird* happened during rebase):
+ - [ ] rangediff: `git range-diff $(ESR_TAG_PREV)..$(TOR_BROWSER_BRANCH_PREV) $(ESR_TAG)..$(TOR_BROWSER_BRANCH)`
+ - [ ] diff of diffs:
+ - Do the diff between `current_patchset.diff` and `rebased_patchset.diff` with your preferred `$(DIFF_TOOL)` and look at differences on lines that starts with + or -
+ - [ ] `git diff $(ESR_TAG_PREV)..$(TOR_BROWSER_BRANCH_PREV) > current_patchset.diff`
+ - [ ] `git diff $(ESR_TAG)..$(TOR_BROWSER_BRANCH) > rebased_patchset.diff`
+ - [ ] `$(DIFF_TOOL) current_patchset.dif rebased_patchset.deff`
- [ ] Open MR for the rebase
- [ ] Sign/Tag `base-browser` commit:
- **NOTE** : Currently we are using the `Bug 27511: Add new identity button to toolbar` commit as the dividing line between `base-browser` and `tor-browser`
@@ -139,8 +144,8 @@ Tor Browser Alpha (and Nightly) are on the `main` branch, while Stable lives in
- [ ] Update `rbm.conf`
- [ ] `var/torbrowser_version` : update to next version
- [ ] `var/torbrowser_build` : update to `$(TOR_BROWSER_BUILD_N)`
-- [ ] `var/torbrowser_incremental_from` : update to previous version
- - [ ] **IMPORTANT**: Really *actually* make sure this is the previous Desktop version or else the `make incrementals-*` step will fail
+ - [ ] ***(Desktop Only)*** `var/torbrowser_incremental_from` : update to previous Desktop version
+ - [ ] **IMPORTANT**: Really *actually* make sure this is the previous Desktop version or else the `make incrementals-*` step will fail
- [ ] Update `projects/firefox/config`
- [ ] `git_hash` : update the `$(BUILD_N)` section to match `tor-browser` tag
- [ ] ***(Optional)*** `var/firefox_platform_version` : update to latest `$(ESR_VERSION)` if rebased
@@ -154,13 +159,15 @@ Tor Browser Alpha (and Nightly) are on the `main` branch, while Stable lives in
- [ ] Update `projects/tor-android-service/config`
- [ ] `git_hash` : update with `HEAD` commit of project's `main` branch
- [ ] Update `projects/application-services/config`:
- - [ ] `git_hash` : update the `$(BUILD_N)` section to match alpha `application-services` tag
+ **NOTE** we don't have any of our own patches for this project
+ - [ ] `git_hash` : update to appropriate git commit associated with $(ESR_VERSION)
- [ ] Update `projects/android-components/config`:
- [ ] `git_hash` : update the `$(BUILD_N)` section to match alpha `android-components` tag
- [ ] Update `projects/fenix/config`
- [ ] `git_hash` : update the `$(BUILD_N)` section to match `fenix` tag
- [ ] ***(Optional)*** `var/fenix_version` : update to latest `$(ESR_VERSION)` if rebased
-- [ ] Update allowed_addons.json by running (from `tor-browser-build` root) `./tools/fetch_allowed_addons.py > projects/tor-browser/allowed_addons.json`
+- [ ] Update allowed_addons.json by running (from `tor-browser-build` root):
+ - `./tools/fetch_allowed_addons.py > projects/tor-browser/allowed_addons.json`
- [ ] Check for NoScript updates here : https://addons.mozilla.org/en-US/firefox/addon/noscript
- [ ] ***(Optional)*** If new version available, update `noscript` section of `input_files` in `projects/browser/config`
- [ ] `URL`
@@ -259,15 +266,17 @@ Tor Browser Alpha (and Nightly) are on the `main` branch, while Stable lives in
- **NOTE**: at this point the signed binaries should have been copied to `staticiforme`
- [ ] Update `staticiforme.torproject.org`:
- From `screen` session on `staticiforme.torproject.org`:
+ - [ ] Remove old release data from following places:
+ - **NOTE** : Skip this step if the current release is Android or Desktop *only*
+ - [ ] `/srv/cdn-master.torproject.org/htdocs/aus1/torbrowser`
+ - [ ] `/srv/dist-master.torproject.org/htdocs/torbrowser`
- [ ] Static update components : `static-update-component cdn.torproject.org && static-update-component dist.torproject.org`
- [ ] Enable update responses :
- [ ] alpha: `./deploy_update_responses-alpha.sh`
- [ ] release: `./deploy_update_responses-release.sh`
- [ ] Publish APKs to Google Play:
- [ ] Log into https://play.google.com/apps/publish
- - Select correct app:
- - [ ] Tor Browser
- - [ ] Tor Browser Alpha
+ - [ ] Select `Tor Browser (Alpha)` app
- [ ] Navigate to `Release > Production` and click `Create new release` button
- [ ] Upload the `*.multi.apk` APKs
- [ ] If necessary, update the 'Release Name' (should be automatically populated)
@@ -277,8 +286,12 @@ Tor Browser Alpha (and Nightly) are on the `main` branch, while Stable lives in
- [ ] Save, review, and configure rollout percentage
- [ ] 25% rollout when publishing a scheduled update
- [ ] 100% rollout when publishing a security-driven release
- - [ ] Update rollout percentage to 100% after confirmed no major issues
+ - [ ] Update rollout percentage to 100% after confirmed no major issues
+
+### tor-announce mailing list
+- [ ] Send an email to tor-announce(a)lists.torproject.org, using the same content as the blog post and subject "Tor Browser $version is released".
</details>
/label ~"Release Prep"
+
diff --git a/.gitlab/issue_templates/Release Prep - Stable.md b/.gitlab/issue_templates/Release Prep - Stable.md
index ec9234c..a93f472 100644
--- a/.gitlab/issue_templates/Release Prep - Stable.md
+++ b/.gitlab/issue_templates/Release Prep - Stable.md
@@ -41,15 +41,16 @@
### **torbutton** ***(Optional)***: https://git.torproject.org/torbutton.git
- [ ] ***(Optional)*** Update translations :
- - **NOTE** : mandatory if we have added new string dependencies
- - [ ] `./import-translations.sh`
- - [ ] Commit with message `Translation updates`
- - **NOTE** : only add files which are already being tracked
+ - **NOTE** We only update strings in stable if a backported feature depends on new strings
+ - [ ] `./import-translations.sh`
+ - **NOTE** : if there are no new strings imported then we are done here
+ - [ ] Commit with message `Translation updates`
+ - **NOTE** : only add files which are already being tracked
- [ ] fixup! `tor-browser`'s `Bug 10760 : Integrate TorButton to TorBrowser core` issue to point to updated `torbutton` commit
### **tor-launcher** ***(Optional)***: https://git.torproject.org/tor-launcher.git
- [ ] ***(Optional)*** Update translations:
- - **NOTE** : mandatory if we have added new string dependencies
+ - **NOTE** We only update strings in stable if a backported feature depends on new strings
- [ ] ./localization/import-translations.sh
- [ ] Commit with message `Translation updates`
- [ ] Update `install.rdf` file with new version
@@ -78,7 +79,7 @@
- [ ] `git diff $(ESR_TAG)..$(TOR_BROWSER_BRANCH) > rebased_patchset.diff`
- [ ] `$(DIFF_TOOL) current_patchset.dif rebased_patchset.deff`
- [ ] Open MR for the rebase
-- [ ] ***(Optional)*** Backport any required patches to Stable
+- [ ] ***(Optional)*** Backport any required Alpha patches to Stable
- [ ] cherry-pick patches on top of rebased branch (issues to backport should have `Backport` label and be linked to the associated `Release Prep` issue)
- [ ] Close associated `Backport` issues
- [ ] Open MR for the backport commits
@@ -123,12 +124,22 @@
- [ ] Push tag to `origin`
### **tba-translation** ***(Optional)***: https://git.torproject.org/translation.git
+- **NOTE** We only update strings in stable if a backported feature depends on new strings
- [ ] Fetch latest and identify new `HEAD` of `fenix-torbrowserstringsxml` branch
- - [ ] `origin/fenix-torbrowserstringsxml` :`<INSERT COMMIT HASH HERE>`
+ - [ ] `origin/fenix-torbrowserstringsxml` : `<INSERT COMMIT HASH HERE>`
+### **tor-android-service** ***(Optional)***: https://git.torproject.org/tor-android-service.git
+- [ ] Fetch latest and identify new `HEAD` of `main` branch
+ - [ ] `origin/main` : `<INSERT COMMIT HASH HERE>`
+
+### **application-services** : *TODO: we need to setup a gitlab copy of this repo that we can apply security backports to*
+- [ ] ***(Optional)*** Backport any Android-specific security fixes from Firefox rapid-release
+- [ ] Sign/Tag commit:
+ - Tag : `application-services-$(ESR_VERSION)-$(TOR_BROWSER_MAJOR).$(TOR_BROWSER_MINOR)-1-$(BUILD_N)`
+ - Message: `Tagging $(BUILD_N) for $(ESR_VERSION)-based (alpha|stable)`
+- [ ] Push tag to `origin`
### **android-components** ***(Optional)***: https://gitlab.torproject.org/tpo/applications/android-components.git
- [ ] ***(Optional)*** Rebase to `$(RR_VERSION)`
- - Upstream git repo : https://github.com/mozilla-mobile/android-components.git
- [ ] Identify the `mozilla-mobile` git tag to start from by first updating `fenix` and then checking which `android-components` tag is used in `buildSrc/src/main/java/AndroidComponents.kt`
- Alternatively search for commit message like `Update Android-Components`
- [ ] Create new branch from tag named `android-components-$(RR_VERSION)-$(TOR_BROWSER_MAJOR).$(TOR_BROWSER_MINOR)-1`
@@ -137,19 +148,15 @@
- [ ] Perform rangediff to ensure nothing weird happened resolving conflicts
- [ ] Open MR for the rebase
- [ ] Merge + Push
- - [ ] ***(Optional)*** Backport any required patches to Stable
+- [ ] ***(Optional)*** Backport any required patches to Stable
- [ ] cherry-pick patches on top of rebased branch (issues to backport should have `Backport` label and be linked to the associated `Release Prep` issue)
- [ ] Close associated `Backport` issues
- [ ] Open MR for the backport commits
- [ ] Merge + Push
-- [ ] Sign/Tag commit:
+ [ ] Sign/Tag commit:
- Tag : `android-components-$(RR_VERSION)-$(TOR_BROWSER_MAJOR).$(TOR_BROWSER_MINOR)-1-$(BUILD_N)`
- Message: `Tagging $(BUILD_N) for $(RR_VERSION)-based (alpha|stable)`
-- [ ] Push tag to origin
-
-### **tor-android-service** ***(Optional)***: https://git.torproject.org/tor-android-service.git
-- [ ] Fetch latest and identify new `HEAD` of `main` branch
- - [ ] `origin/main` : `<INSERT COMMIT HASH HERE>`
+ - [ ] Push tag to origin
### **fenix** ***(Optional)***: https://gitlab.torproject.org/tpo/applications/fenix.git
- [ ] ***(Optional)*** Rebase to `$(RR_VERSION)`
@@ -184,9 +191,9 @@ Tor Browser Alpha (and Nightly) are on the `main` branch, while Stable lives in
- [ ] Update `rbm.conf`
- [ ] `var/torbrowser_version` : update to next version
- [ ] `var/torbrowser_build` : update to `$(TOR_BROWSER_BUILD_N)`
- - [ ] `var/torbrowser_incremental_from` : update to previous version
+ - [ ] ***(Desktop Only)*** `var/torbrowser_incremental_from` : update to previous Desktop version
- [ ] **IMPORTANT**: Really *actually* make sure this is the previous Desktop version or else the `make incrementals-*` step will fail
-- [ ] Update `projects/firefox/config`
+- [ ] ***(Desktop Only)*** Update `projects/firefox/config`
- [ ] `git_hash` : update the `$(BUILD_N)` section to match `tor-browser` tag
- [ ] ***(Optional)*** `var/firefox_platform_version` : update to latest `$(ESR_VERSION)` if rebased
- [ ] ***(Android Only)*** Update `projects/geckoview/config`
@@ -196,10 +203,17 @@ Tor Browser Alpha (and Nightly) are on the `main` branch, while Stable lives in
- [ ] `git_hash` : update with `HEAD` commit of project's `fenix-torbrowserstringsxml` branch
- [ ] ***(Android Only, Optional)*** Update `projects/tor-android-service/config`
- [ ] `git_hash` : update with `HEAD` commit of project's `main` branch
+- [ ] ***(Android Only, Optional)*** Update `projects/application-services/config`:
+ **NOTE** we don't have any of our own patches for this project
+ - [ ] `git_hash` : update to appropriate git commit associated with $(RR_VERSION)
+- [ ] ***(Android Only, Optional)*** Update `projects/android-components/config`
+ - [ ] `git_hash` : update the `$(BUILD_N)` section to match `android-components` tag
+ - [ ] ***(Optional)*** `var/android_components_version` : update to latest `$(RR_VERSION)` if rebased
- [ ] ***(Android Only, Optional)*** Update `projects/fenix/config`
- [ ] `git_hash` : update the `$(BUILD_N)` section to match `fenix` tag
- [ ] ***(Optional)*** `var/fenix_version` : update to latest `$(RR_VERSION)` if rebased
-- [ ] ***(Android Only)*** Update allowed_addons.json by running (from `tor-browser-build` root)`./tools/fetch_allowed_addons.py > projects/tor-browser/allowed_addons.json`
+- [ ] ***(Android Only)*** Update allowed_addons.json by running (from `tor-browser-build` root):
+ - `./tools/fetch_allowed_addons.py > projects/tor-browser/allowed_addons.json`
- [ ] Check for NoScript updates here : https://addons.mozilla.org/en-US/firefox/addon/noscript
- [ ] ***(Optional)*** If new version available, update `noscript` section of `input_files` in `projects/tor-browser/config`
- [ ] `URL`
@@ -298,15 +312,17 @@ Tor Browser Alpha (and Nightly) are on the `main` branch, while Stable lives in
- **NOTE**: at this point the signed binaries should have been copied to `staticiforme`
- [ ] Update `staticiforme.torproject.org`:
- From `screen` session on `staticiforme.torproject.org`:
+ - [ ] Remove old release data from following places:
+ - **NOTE** : Skip this step if the current release is Android or Desktop *only*
+ - [ ] `/srv/cdn-master.torproject.org/htdocs/aus1/torbrowser`
+ - [ ] `/srv/dist-master.torproject.org/htdocs/torbrowser`
- [ ] Static update components : `static-update-component cdn.torproject.org && static-update-component dist.torproject.org`
- [ ] Enable update responses :
- [ ] alpha: `./deploy_update_responses-alpha.sh`
- [ ] release: `./deploy_update_responses-release.sh`
- [ ] ***(Android Only)*** : Publish APKs to Google Play:
- [ ] Log into https://play.google.com/apps/publish
- - Select correct app:
- - [ ] Tor Browser
- - [ ] Tor Browser Alpha
+ - [ ] Select `Tor Browser` app
- [ ] Navigate to `Release > Production` and click `Create new release` button
- [ ] Upload the `*.multi.apk` APKs
- [ ] If necessary, update the 'Release Name' (should be automatically populated)
@@ -322,3 +338,6 @@ Tor Browser Alpha (and Nightly) are on the `main` branch, while Stable lives in
- [ ] Send an email to tor-announce(a)lists.torproject.org, using the same content as the blog post and subject "Tor Browser $version is released".
</details>
+
+/label ~"Release Prep"
+
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
1
0
[builders/tor-browser-build] branch main updated: Bug 40574: Improve tools/signing/android-signing
by gitolite role 26 Aug '22
by gitolite role 26 Aug '22
26 Aug '22
This is an automated email from the git hooks/post-receive script.
richard pushed a commit to branch main
in repository builders/tor-browser-build.
The following commit(s) were added to refs/heads/main by this push:
new 751756c Bug 40574: Improve tools/signing/android-signing
751756c is described below
commit 751756c2e7d7239df0636bf5ac8cc22d4781cbc6
Author: Nicolas Vigier <boklm(a)torproject.org>
AuthorDate: Tue Jul 12 16:48:51 2022 +0200
Bug 40574: Improve tools/signing/android-signing
* use projects/android-toolchain/config to download android build-tools
* download unsigned apk files for pkgstage and upload them to pkgstage
when signed
* use set-config.android-signing
---
projects/android-toolchain/config | 21 +++++++-
tools/signing/android-signing | 93 +++++++++++++++++++++++---------
tools/signing/set-config.android-signing | 7 +++
3 files changed, 93 insertions(+), 28 deletions(-)
diff --git a/projects/android-toolchain/config b/projects/android-toolchain/config
index 57c38c1..a2f34ae 100644
--- a/projects/android-toolchain/config
+++ b/projects/android-toolchain/config
@@ -47,11 +47,13 @@ var:
sdk_tools_version: 4333796
commandlinetools_version: 7583922
commandlinetools_version_string: 5.0
+ build_tools_filename: build-tools_r31-linux.zip
+ build_tools_sha256sum: f90c22f5562638a2e00762e1711eebd55e7f0a05232b65200d387307d057bfe8
input_files:
- project: container-image
- - URL: '[% c("var/google_repo") %]/build-tools_r31-linux.zip'
+ - URL: '[% c("var/google_repo") %]/[% c("var/build_tools_filename") %]'
name: build_tools
- sha256sum: f90c22f5562638a2e00762e1711eebd55e7f0a05232b65200d387307d057bfe8
+ sha256sum: '[% c("var/build_tools_sha256sum") %]'
- URL: '[% c("var/google_repo") %]/build-tools_r[% c("var/version_30") %]-linux.zip'
name: build_tools_30
sha256sum: 565af786dc0cc1941002174fb945122eabd080b222cd4c7c3d9a2ae0fabf5dc4
@@ -85,3 +87,18 @@ input_files:
- URL: '[% c("var/google_repo") %]/android-ndk-r[% c("var/android_ndk_version") %][% c("var/android_ndk_revision") %]-linux-x86_64.zip'
name: android_ndk_compiler
sha256sum: dd6dc090b6e2580206c64bcee499bc16509a5d017c6952dcd2bed9072af67cbd
+steps:
+ # The get_build_tools step is used by tools/signing/android-signing
+ get_build_tools:
+ filename: 'android-[% c("var/build_tools_filename") %]'
+ get_build_tools: |
+ #!/bin/bash
+ set -e
+ mv -v [% c("input_files_by_name/build_tools") %] [% dest_dir _ '/' _ c('filename') %]
+ var:
+ container:
+ use_container: 0
+ input_files:
+ - URL: '[% c("var/google_repo") %]/[% c("var/build_tools_filename") %]'
+ name: build_tools
+ sha256sum: '[% c("var/build_tools_sha256sum") %]'
diff --git a/tools/signing/android-signing b/tools/signing/android-signing
index 7c2ee50..16610e7 100755
--- a/tools/signing/android-signing
+++ b/tools/signing/android-signing
@@ -1,23 +1,64 @@
#!/bin/bash
# Sign apk for each target architecture.
-# This script requires two command line arguments.
-# Usage: android-signing <version> <path/to/signing/key>
+# This script does not require command line argument, but it needs
+# some configuration options to be set in set-config.android-signing:
+# - ssh_host_pkgstage is the host which you use for staging packages
+# during signing. The script will download the unsigned .apk files
+# from this host, and upload the signed .apk there
+# - pkgstage_tor_browser_build_dir: this is the path to tor-browser-build
+# on pkgstage
+# - android_signing_key_dir: the local path where the android signing
+# keys are located. That directory should contains files tba_alpha.p12
+# and tba_release.p12 for alpha and release signing keys.
+# The Tor Browser version is taken from set-config.tbb-version
-# In addition, hard-coding the path to an Android SDK build-tools version, as
-# BUILD_TOOLS, is required.
-
-set -x
set -e
+script_dir=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+source "$script_dir/functions"
+source "$script_dir/set-config.android-signing"
-VERSION=$1
-SIGNING_KEY_PATH=$2
+topdir="$script_dir/../.."
+ARCHS="armv7 aarch64 x86 x86_64"
-# TODO set correctly.
-BUILD_TOOLS=/path/to/build-tools/version
-export PATH="${BUILD_TOOLS}:${PATH}"
+android_signing_key_path="$android_signing_key_dir/tba_$tbb_version_type.p12"
+test -f "$android_signing_key_path" || exit_error "$android_signing_key_path is missing"
-ARCHS="armv7 aarch64 x86 x86_64"
+check_installed_packages() {
+ local packages='unzip openjdk-11-jdk-headless openjdk-11-jre-headless'
+ for package in $packages
+ do
+ dpkg -s "$package" | grep -q '^Status: install ok installed$' || \
+ exit_error "package $package is missing"
+ done
+}
+
+setup_build_tools() {
+ local rbm="$topdir/rbm/rbm"
+ local build_tools_zipfile="$topdir/out/android-toolchain/$("$rbm" showconf --step get_build_tools android-toolchain filename)"
+ if ! test -f "$build_tools_zipfile"; then
+ "$rbm" build --step get_build_tools android-toolchain
+ test -f "$build_tools_zipfile" || exit_error "$build_tools_zipfile is missing"
+ fi
+ local build_tools_dir=$(mktemp -d)
+ trap "rm -Rf $build_tools_dir" EXIT
+ unzip -d "$build_tools_dir" "$build_tools_zipfile"
+ test -f "$build_tools_dir"/android-12/apksigner || \
+ exit_error "$build_tools_dir/android-12/apksigner is missing"
+ export PATH="$build_tools_dir/android-12:${PATH}"
+}
+
+download_unsigned_apks() {
+ apks_dir=$(mktemp -d)
+ trap "rm -Rf $apks_dir" EXIT
+ rsync -avH "$ssh_host_pkgstage:$pkgstage_tor_browser_build_dir/$tbb_version_type/signed/$tbb_version/*-qa.apk" "$apks_dir/"
+}
+
+upload_signed_apks() {
+ rsync -avH --exclude="*-qa.apk" --exclude="*-unaligned.apk" \
+ --exclude="*-unsigned.apk" "$apks_dir/" \
+ "$ssh_host_pkgstage:$pkgstage_tor_browser_build_dir/$tbb_version_type/signed/$tbb_version/"
+}
# Sign individual apk
sign_apk() {
@@ -57,7 +98,7 @@ sign_apk() {
# Step 3: Sign
# Use this command if reading key from file
- apksigner sign --verbose -ks ${SIGNING_KEY_PATH} --ks-type pkcs12 --ks-pass env:KSPASS --debuggable-apk-permitted=false --out "${SIGNED_APK}" "${UNSIGNED_APK}"
+ apksigner sign --verbose -ks ${android_signing_key_path} --ks-type pkcs12 --ks-pass env:KSPASS --debuggable-apk-permitted=false --out "${SIGNED_APK}" "${UNSIGNED_APK}"
# Or, use below command if using a hardware token
# apksigner sign --verbose --provider-class sun.security.pkcs11.SunPKCS11 --provider-arg pkcs11_java.cfg --ks NONE --ks-type PKCS11 --debuggable-apk-permitted=false --out "${SIGNED_APK}" "${UNSIGNED_APK}"
@@ -81,18 +122,18 @@ sign_apk() {
# Rename and verify signing certificate
finalize() {
for arch in ${ARCHS}; do
- mv tor-browser-${VERSION}-android-${arch}-multi{-qa,}.apk
+ mv tor-browser-${tbb_version}-android-${arch}-multi{-qa,}.apk
done
for arch in ${ARCHS}; do
- verified=`apksigner verify --print-certs --verbose tor-browser-${VERSION}-android-${arch}-multi.apk`
+ verified=`apksigner verify --print-certs --verbose tor-browser-${tbb_version}-android-${arch}-multi.apk`
scheme_v1=
scheme_v2=
cert_digest=
pubkey_digest=
# Verify the expected signing key was used, Alpha verses Release based on the filename.
- if `echo ${VERSION} | grep -q a`; then
+ if test "$tbb_version_type" = "alpha"; then
scheme_v1="Verified using v1 scheme (JAR signing): true"
scheme_v2="Verified using v2 scheme (APK Signature Scheme v2): true"
cert_digest="Signer #1 certificate SHA-256 digest: 15f760b41acbe4783e667102c9f67119be2af62fab07763f9d57f01e5e1074e1"
@@ -117,15 +158,7 @@ finalize() {
echo Done.
}
-if [ -z "$VERSION" ]; then
- echo Provide version number
- exit
-fi
-
-if [ -z "${SIGNING_KEY_PATH}" ]; then
- echo Provide the path to the signing key: release or alpha
- exit
-fi
+check_installed_packages
if [ -z "$KSPASS" ]; then
echo "Enter keystore passphrase"
@@ -133,9 +166,17 @@ if [ -z "$KSPASS" ]; then
export KSPASS
fi
+setup_build_tools
+
+download_unsigned_apks
+
+cd $apks_dir
+
# Sign all packages
for arch in ${ARCHS}; do
- sign_apk tor-browser-${VERSION}-android-${arch}-multi-qa.apk
+ sign_apk tor-browser-${tbb_version}-android-${arch}-multi-qa.apk
done
finalize
+
+upload_signed_apks
diff --git a/tools/signing/set-config.android-signing b/tools/signing/set-config.android-signing
new file mode 100644
index 0000000..1731efc
--- /dev/null
+++ b/tools/signing/set-config.android-signing
@@ -0,0 +1,7 @@
+# The following line should be uncommented and updated:
+
+#ssh_host_pkgstage=tbbuild
+#pkgstage_tor_browser_build_dir=/home/user/tor-browser-build
+#android_signing_key_dir=/path/to/signing/key/dir
+
+var_is_defined ssh_host_pkgstage android_signing_key_dir
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
1
0
[tor-browser-spec] branch main updated: Bug 40034: Add Android signing to processes/ReleaseProcess
by gitolite role 26 Aug '22
by gitolite role 26 Aug '22
26 Aug '22
This is an automated email from the git hooks/post-receive script.
richard pushed a commit to branch main
in repository tor-browser-spec.
The following commit(s) were added to refs/heads/main by this push:
new ecdd135 Bug 40034: Add Android signing to processes/ReleaseProcess
ecdd135 is described below
commit ecdd135421dd57dd1f253c1ebcbcf1bd223b63f1
Author: Nicolas Vigier <boklm(a)torproject.org>
AuthorDate: Wed Jul 13 14:14:44 2022 +0200
Bug 40034: Add Android signing to processes/ReleaseProcess
---
processes/ReleaseProcess | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/processes/ReleaseProcess b/processes/ReleaseProcess
index 82c7bfa..e97b2f2 100644
--- a/processes/ReleaseProcess
+++ b/processes/ReleaseProcess
@@ -61,6 +61,38 @@
# For stable releases put tails-dev(a)boum.org into Cc.
+#######################
+### Android signing ###
+#######################
+
+#. The Android signing is done separately from the desktop signing. To
+# do the Android signing you'll need to boot from a Tails usb stick,
+# with persistent storage enabled.
+
+#. Install the openjdk-11-jdk-headless package
+ apt install openjdk-11-jdk-headless
+
+#. Make sure you have the android keys, for example in the
+# ~/Persistent/android-keys directory. This directory should include
+# the tba_alpha.p12 and tba_release.p12 files.
+
+#. Clone tor-browser-build, and checkout the tag for the release
+ git tag -v tbb-$TORBROWSER_VERSION-buildN
+ git checkout tbb-$TORBROWSER_VERSION-buildN
+
+#. Update set-config.tbb-version and set-config.android-signing
+ cd tools/signing
+ vim set-config.tbb-version
+ vim set-config.android-signing
+
+#. Run the android-signing script. This script will download the
+# unsigned apks from the `pkgstage` machine (where `do-all-signing`
+# is run), signed them, and upload back the signed apks to the
+# `pkgstage` machine. It should be done before the hash_signed_bundles.sh
+# step.
+ ./android-signing
+
+
##########################
### Signing and upload ###
##########################
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
1
0
[builders/tor-browser-build] annotated tag tbb-11.5.3-build1 created (now 2f70e0c)
by gitolite role 26 Aug '22
by gitolite role 26 Aug '22
26 Aug '22
This is an automated email from the git hooks/post-receive script.
richard pushed a change to annotated tag tbb-11.5.3-build1
in repository builders/tor-browser-build.
at 2f70e0c (tag)
tagging 38afab6c639e8aeee86d3f1c65fb222d3b34b725 (commit)
replaces tbb-11.5.2-build1
by Richard Pospesel
on Fri Aug 26 18:20:03 2022 +0000
- Log -----------------------------------------------------------------
Tagging build1 for 11.5.3
-----BEGIN PGP SIGNATURE-----
iQJLBAABCAA1FiEEvnyRTMkiztnZPSO33kc2A2PzSywFAmMJDtMXHHJpY2hhcmRA
dG9ycHJvamVjdC5vcmcACgkQ3kc2A2PzSyzuyQ/+PwOWS/wbiNXKGZSq886z5QRr
lcsh9atJHDapuLZ0Gihx/5wTxb4Lz2/nX0nrFJyqhTrio6fywnvxxUBQGZejjJ78
Ftez2YvWOo3rq5YrJa+eGy+8zs+HYi9uqmA7Ytw9b2v1+/XFlpoRLlt7A7Z0heQD
F0EKkcI+91OEYSpmiTGcql8DVgpIOkm3SUP4dyVC1i4e6yh3A0+3ou5aVaYDr3wz
HSIBR56Am7blsrt6nsOFQZak8GkEJy4ilMZjvJep6wvh5n2bDHNV6yA3DTy/Jalb
5sCOkkCi+5ghJwd5M6dkLInFixFFAN+TDorMUmsf7SYFuCmMxZJyIsf1v3bRDOAl
4I4oSfgY7ESWnaSVqABOmSqKvcTLlf8AxjzgmthUCagcD8tSYzG/8Q7tTsxzniUh
CuDWTsVm/0AlLGFS/G0LRCqK8IYegzk4XdVHOejPfp6c5Grl3gFogFD9ss+gz3ge
PGrPoQJ3yGWogIxBBcVugVA46EEr8rln3X3jKIqYTkj/19CCcMXUx80IsCl3bDob
wvZacmQqVism/REX7LwHlyn9auaMXHj3C6cbtThynWd/Wkj0M/KRwbEG9ENXhKcQ
3RM1l7Ipbq5sJ7+Bw4Y5qfDwNLKxXJHKJE2lD9+hxidcqFH5Zh3MaNpmGof+IaDd
0KdpCLA+D9LOkTsvaCo=
=Vyyj
-----END PGP SIGNATURE-----
-----------------------------------------------------------------------
No new revisions were added by this update.
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
1
0
[builders/tor-browser-build] branch maint-11.5 updated: Bug 40613: Prepare stable release (Android Only) 11.5.3
by gitolite role 26 Aug '22
by gitolite role 26 Aug '22
26 Aug '22
This is an automated email from the git hooks/post-receive script.
richard pushed a commit to branch maint-11.5
in repository builders/tor-browser-build.
The following commit(s) were added to refs/heads/maint-11.5 by this push:
new 38afab6 Bug 40613: Prepare stable release (Android Only) 11.5.3
38afab6 is described below
commit 38afab6c639e8aeee86d3f1c65fb222d3b34b725
Author: Giorgio Maone <ma1(a)tb-build-05.torproject.org>
AuthorDate: Fri Aug 26 18:05:22 2022 +0000
Bug 40613: Prepare stable release (Android Only) 11.5.3
---
projects/android-components/config | 2 +-
projects/fenix/config | 2 +-
.../tor-browser/Bundle-Data/Docs/ChangeLog.txt | 6 ++
projects/tor-browser/allowed_addons.json | 90 +++++++++++-----------
rbm.conf | 2 +-
5 files changed, 54 insertions(+), 48 deletions(-)
diff --git a/projects/android-components/config b/projects/android-components/config
index 8d4b39a..c27f679 100644
--- a/projects/android-components/config
+++ b/projects/android-components/config
@@ -1,7 +1,7 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.gz'
-git_hash: '[% project %]-[% c("var/android_components_version") %]-[% c("var/torbrowser_branch") %]-1-build3'
+git_hash: '[% project %]-[% c("var/android_components_version") %]-[% c("var/torbrowser_branch") %]-1-build4'
git_url: https://gitlab.torproject.org/tpo/applications/android-components.git
tag_gpg_id: 1
gpg_keyring: torbutton.gpg
diff --git a/projects/fenix/config b/projects/fenix/config
index b478d84..81d73f9 100644
--- a/projects/fenix/config
+++ b/projects/fenix/config
@@ -1,7 +1,7 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
filename: 'fenix-[% c("version") %]-[% c("var/build_id") %].tar.gz'
-git_hash: 'tor-browser-[% c("var/fenix_version") %]-[% c("var/torbrowser_branch") %]-1-build3'
+git_hash: 'tor-browser-[% c("var/fenix_version") %]-[% c("var/torbrowser_branch") %]-1-build4'
git_url: https://gitlab.torproject.org/tpo/applications/fenix.git
tag_gpg_id: 1
gpg_keyring: torbutton.gpg
diff --git a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
index 8d931a9..6f61504 100644
--- a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
+++ b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
@@ -1,3 +1,9 @@
+Tor Browser 11.5.3 - August 29 2022
+ * Android
+ * Bug 40225: Bundled extensions don't get updated with Android Tor Browser
+ updates (they stay stuck at the first installed version) [fenix]
+ * Bug 41156: User-installed addons are broken on Android [tor-browser]
+
Tor Browser 11.5.2 - August 23 2022
* All Platforms
* Update Tor to 0.4.7.10
diff --git a/projects/tor-browser/allowed_addons.json b/projects/tor-browser/allowed_addons.json
index c0dbfe9..da88705 100644
--- a/projects/tor-browser/allowed_addons.json
+++ b/projects/tor-browser/allowed_addons.json
@@ -17,7 +17,7 @@
"picture_url": "https://addons.mozilla.org/user-media/userpics/13/13299/13299734.png?modifi…"
}
],
- "average_daily_users": 789781,
+ "average_daily_users": 803489,
"categories": {
"android": [
"experimental",
@@ -221,9 +221,9 @@
"category": "recommended"
},
"ratings": {
- "average": 4.5529,
- "bayesian_average": 4.551668826152354,
- "count": 4543,
+ "average": 4.5532,
+ "bayesian_average": 4.5519689466017415,
+ "count": 4548,
"text_count": 1459
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/darkreader/reviews/",
@@ -321,7 +321,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": 21321
+ "weekly_downloads": 22583
},
"notes": null
},
@@ -337,7 +337,7 @@
"picture_url": "https://addons.mozilla.org/user-media/userpics/5/5474/5474073.png?modified=…"
}
],
- "average_daily_users": 635170,
+ "average_daily_users": 645830,
"categories": {
"android": [
"security-privacy"
@@ -471,7 +471,7 @@
},
"ratings": {
"average": 4.6653,
- "bayesian_average": 4.6627721269631595,
+ "bayesian_average": 4.66276978562778,
"count": 2277,
"text_count": 454
},
@@ -502,7 +502,7 @@
"type": "extension",
"url": "https://www.eff.org/https-everywhere",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/https-everywhere/versions/",
- "weekly_downloads": 8446
+ "weekly_downloads": 9166
},
"notes": null
},
@@ -518,7 +518,7 @@
"picture_url": "https://addons.mozilla.org/user-media/userpics/6/6937/6937656.png?modified=…"
}
],
- "average_daily_users": 229315,
+ "average_daily_users": 232939,
"categories": {
"android": [
"security-privacy"
@@ -821,7 +821,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": 4473
+ "weekly_downloads": 4894
},
"notes": null
},
@@ -837,7 +837,7 @@
"picture_url": "https://addons.mozilla.org/user-media/userpics/5/5474/5474073.png?modified=…"
}
],
- "average_daily_users": 946189,
+ "average_daily_users": 963456,
"categories": {
"android": [
"security-privacy"
@@ -1359,9 +1359,9 @@
"category": "recommended"
},
"ratings": {
- "average": 4.7941,
- "bayesian_average": 4.791259973290882,
- "count": 2093,
+ "average": 4.794,
+ "bayesian_average": 4.791156046415039,
+ "count": 2092,
"text_count": 417
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/reviews/",
@@ -1386,7 +1386,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": 14835
+ "weekly_downloads": 15463
},
"notes": null
},
@@ -1402,7 +1402,7 @@
"picture_url": null
}
],
- "average_daily_users": 5322932,
+ "average_daily_users": 5440166,
"categories": {
"android": [
"security-privacy"
@@ -1566,7 +1566,7 @@
},
"is_disabled": false,
"is_experimental": false,
- "last_updated": "2022-08-21T17:00:27Z",
+ "last_updated": "2022-08-23T20:45:17Z",
"name": {
"ar": "uBlock Origin",
"bg": "uBlock Origin",
@@ -1712,9 +1712,9 @@
},
"ratings": {
"average": 4.7732,
- "bayesian_average": 4.772778073045159,
- "count": 14024,
- "text_count": 3699
+ "bayesian_average": 4.772778011885451,
+ "count": 14035,
+ "text_count": 3704
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/reviews/",
"requires_payment": false,
@@ -1776,7 +1776,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": 125750
+ "weekly_downloads": 135648
},
"notes": null
},
@@ -1792,7 +1792,7 @@
"picture_url": null
}
],
- "average_daily_users": 122696,
+ "average_daily_users": 123399,
"categories": {
"android": [
"photos-media"
@@ -1890,7 +1890,7 @@
},
"ratings": {
"average": 4.5231,
- "bayesian_average": 4.517875003206405,
+ "bayesian_average": 4.517870186763684,
"count": 1061,
"text_count": 396
},
@@ -1914,7 +1914,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": 344
+ "weekly_downloads": 413
},
"notes": null
},
@@ -1930,7 +1930,7 @@
"picture_url": null
}
],
- "average_daily_users": 87742,
+ "average_daily_users": 88792,
"categories": {
"android": [
"experimental",
@@ -2067,7 +2067,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": 773
+ "weekly_downloads": 736
},
"notes": null
},
@@ -2083,7 +2083,7 @@
"picture_url": "https://addons.mozilla.org/user-media/userpics/12/12929/12929064.png?modifi…"
}
],
- "average_daily_users": 206239,
+ "average_daily_users": 209619,
"categories": {
"android": [
"photos-media",
@@ -2301,9 +2301,9 @@
"category": "recommended"
},
"ratings": {
- "average": 4.6442,
- "bayesian_average": 4.639198744218672,
- "count": 1144,
+ "average": 4.6437,
+ "bayesian_average": 4.638700644765555,
+ "count": 1145,
"text_count": 226
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/search_by_image/reviews/",
@@ -2325,7 +2325,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": 6768
+ "weekly_downloads": 7199
},
"notes": null
},
@@ -2348,7 +2348,7 @@
"picture_url": null
}
],
- "average_daily_users": 83841,
+ "average_daily_users": 84209,
"categories": {
"android": [
"other"
@@ -2653,7 +2653,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": 46
+ "weekly_downloads": 48
},
"notes": null
},
@@ -2669,7 +2669,7 @@
"picture_url": "https://addons.mozilla.org/user-media/userpics/0/0/143.png?modified=1506804…"
}
],
- "average_daily_users": 317416,
+ "average_daily_users": 321860,
"categories": {
"android": [
"performance",
@@ -2858,10 +2858,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.409,
- "bayesian_average": 4.406266139768881,
- "count": 1968,
- "text_count": 774
+ "average": 4.4093,
+ "bayesian_average": 4.406565617967924,
+ "count": 1969,
+ "text_count": 775
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/noscript/reviews/",
"requires_payment": false,
@@ -2905,7 +2905,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": 7226
+ "weekly_downloads": 8033
},
"notes": null
},
@@ -2921,7 +2921,7 @@
"picture_url": null
}
],
- "average_daily_users": 127853,
+ "average_daily_users": 129220,
"categories": {
"android": [
"performance",
@@ -3035,10 +3035,10 @@
"category": "recommended"
},
"ratings": {
- "average": 3.914,
- "bayesian_average": 3.90965159257373,
- "count": 1070,
- "text_count": 381
+ "average": 3.9122,
+ "bayesian_average": 3.907855472558339,
+ "count": 1071,
+ "text_count": 382
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/youtube-high-definition/revi…",
"requires_payment": false,
@@ -3057,7 +3057,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": 1564
+ "weekly_downloads": 1670
},
"notes": null
}
diff --git a/rbm.conf b/rbm.conf
index 0272dfc..6c1b146 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -69,7 +69,7 @@ buildconf:
git_signtag_opt: '-s'
var:
- torbrowser_version: '11.5.2'
+ torbrowser_version: '11.5.3'
torbrowser_build: 'build1'
torbrowser_incremental_from:
- 11.5.1
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
1
0
[builders/tor-browser-build] branch main updated: fixup! Bug 40612: Migrate Release Prep template to Release Prep - Stable
by gitolite role 26 Aug '22
by gitolite role 26 Aug '22
26 Aug '22
This is an automated email from the git hooks/post-receive script.
richard pushed a commit to branch main
in repository builders/tor-browser-build.
The following commit(s) were added to refs/heads/main by this push:
new 506caae fixup! Bug 40612: Migrate Release Prep template to Release Prep - Stable
506caae is described below
commit 506caae0e5e95e763c237010ff47240b7c98fe10
Author: Richard Pospesel <richard(a)torproject.org>
AuthorDate: Fri Aug 26 16:02:22 2022 +0000
fixup! Bug 40612: Migrate Release Prep template to Release Prep - Stable
---
.gitlab/issue_templates/Release Prep - Stable.md | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/.gitlab/issue_templates/Release Prep - Stable.md b/.gitlab/issue_templates/Release Prep - Stable.md
index fd96937..ec9234c 100644
--- a/.gitlab/issue_templates/Release Prep - Stable.md
+++ b/.gitlab/issue_templates/Release Prep - Stable.md
@@ -184,16 +184,14 @@ Tor Browser Alpha (and Nightly) are on the `main` branch, while Stable lives in
- [ ] Update `rbm.conf`
- [ ] `var/torbrowser_version` : update to next version
- [ ] `var/torbrowser_build` : update to `$(TOR_BROWSER_BUILD_N)`
-- [ ] `var/torbrowser_incremental_from` : update to previous version
- - [ ] **IMPORTANT**: Really *actually* make sure this is the previous Desktop version or else the `make incrementals-*` step will fail
+ - [ ] `var/torbrowser_incremental_from` : update to previous version
+ - [ ] **IMPORTANT**: Really *actually* make sure this is the previous Desktop version or else the `make incrementals-*` step will fail
- [ ] Update `projects/firefox/config`
- [ ] `git_hash` : update the `$(BUILD_N)` section to match `tor-browser` tag
- [ ] ***(Optional)*** `var/firefox_platform_version` : update to latest `$(ESR_VERSION)` if rebased
- [ ] ***(Android Only)*** Update `projects/geckoview/config`
- [ ] `git_hash` : update the `$(BUILD_N)` section to match `geckoview` tag
- [ ] ***(Optional)*** `var/geckoview_version` : update to latest `$(RR_VERSION)` if rebased
-- [ ] Update `projects/translation-base-browser/config`
- - [ ] `git_hash` : update with `HEAD` commit of project's `base-browser` branch
- [ ] ***(Android Only, Optional)*** Update `projects/tba-translations/config`:
- [ ] `git_hash` : update with `HEAD` commit of project's `fenix-torbrowserstringsxml` branch
- [ ] ***(Android Only, Optional)*** Update `projects/tor-android-service/config`
@@ -201,9 +199,9 @@ Tor Browser Alpha (and Nightly) are on the `main` branch, while Stable lives in
- [ ] ***(Android Only, Optional)*** Update `projects/fenix/config`
- [ ] `git_hash` : update the `$(BUILD_N)` section to match `fenix` tag
- [ ] ***(Optional)*** `var/fenix_version` : update to latest `$(RR_VERSION)` if rebased
-- [ ] ***(Android Only)*** Update allowed_addons.json by running (from `tor-browser-build` root)`./tools/fetch_allowed_addons.py > projects/tor-browser/allowed_addons.json
+- [ ] ***(Android Only)*** Update allowed_addons.json by running (from `tor-browser-build` root)`./tools/fetch_allowed_addons.py > projects/tor-browser/allowed_addons.json`
- [ ] Check for NoScript updates here : https://addons.mozilla.org/en-US/firefox/addon/noscript
- - [ ] ***(Optional)*** If new version available, update `noscript` section of `input_files` in `projects/browser/config`
+ - [ ] ***(Optional)*** If new version available, update `noscript` section of `input_files` in `projects/tor-browser/config`
- [ ] `URL`
- [ ] `sha256sum`
- [ ] Check for OpenSSL updates here : https://github.com/openssl/openssl/tags
@@ -324,5 +322,3 @@ Tor Browser Alpha (and Nightly) are on the `main` branch, while Stable lives in
- [ ] Send an email to tor-announce(a)lists.torproject.org, using the same content as the blog post and subject "Tor Browser $version is released".
</details>
-
-/label ~"Release Prep"
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
1
0
[Git][tpo/applications/fenix] Pushed new tag tor-browser-99.0.0b3-11.5-1-build4
by Pier Angelo Vendrame (@pierov) 26 Aug '22
by Pier Angelo Vendrame (@pierov) 26 Aug '22
26 Aug '22
Pier Angelo Vendrame pushed new tag tor-browser-99.0.0b3-11.5-1-build4 at The Tor Project / Applications / fenix
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/fenix/-/tree/tor-browser-99.…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/android-components][android-components-102.0.14-12.0-1] fixup! Modify Addon support
by Pier Angelo Vendrame (@pierov) 26 Aug '22
by Pier Angelo Vendrame (@pierov) 26 Aug '22
26 Aug '22
Pier Angelo Vendrame pushed to branch android-components-102.0.14-12.0-1 at The Tor Project / Applications / android-components
Commits:
506721f0 by hackademix at 2022-08-26T10:06:25+02:00
fixup! Modify Addon support
- - - - -
1 changed file:
- components/feature/addons/src/main/java/mozilla/components/feature/addons/AddonManager.kt
Changes:
=====================================
components/feature/addons/src/main/java/mozilla/components/feature/addons/AddonManager.kt
=====================================
@@ -154,6 +154,7 @@ class AddonManager(
onSuccess = { ext ->
val installedAddon = addon.copy(installedState = ext.toInstalledState())
addonUpdater.registerForFutureUpdates(installedAddon.id)
+ setAddonAllowedInPrivateBrowsing(installedAddon, true)
completePendingAddonAction(pendingAction)
onSuccess(installedAddon)
},
View it on GitLab: https://gitlab.torproject.org/tpo/applications/android-components/-/commit/…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/android-components/-/commit/…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/fenix][tor-browser-102.2.1-12.0-1] fixup! Modify Add-on support
by Pier Angelo Vendrame (@pierov) 26 Aug '22
by Pier Angelo Vendrame (@pierov) 26 Aug '22
26 Aug '22
Pier Angelo Vendrame pushed to branch tor-browser-102.2.1-12.0-1 at The Tor Project / Applications / fenix
Commits:
b3677ba2 by hackademix at 2022-08-26T10:03:30+02:00
fixup! Modify Add-on support
- - - - -
4 changed files:
- .gitignore
- app/src/main/java/org/mozilla/fenix/components/TorBrowserFeatures.kt
- app/src/main/java/org/mozilla/fenix/utils/Settings.kt
- app/src/main/res/values/preference_keys.xml
Changes:
=====================================
.gitignore
=====================================
@@ -104,3 +104,7 @@ test_artifacts/
# Web extensions: manifest.json files are generated
manifest.json
+
+# Other files modified at build time
+.experimenter.json
+
=====================================
app/src/main/java/org/mozilla/fenix/components/TorBrowserFeatures.kt
=====================================
@@ -6,15 +6,19 @@
package org.mozilla.fenix.components
+import android.os.StrictMode
import android.content.Context
import mozilla.components.concept.engine.webextension.WebExtension
import mozilla.components.concept.engine.webextension.WebExtensionRuntime
import mozilla.components.support.base.log.logger.Logger
+import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.settings
+import org.mozilla.fenix.tor.TorEvents
import java.io.IOException
object TorBrowserFeatures {
private val logger = Logger("torbrowser-features")
+ private const val NOSCRIPT_ID = "{73a6fe31-595d-460b-a920-fcc0f8843232}"
private fun installNoScript(
context: Context,
@@ -25,11 +29,15 @@ object TorBrowserFeatures {
/**
* Copy the xpi from assets to cacheDir, we do not care if the file is later deleted.
*/
- val addonPath =
- context.cacheDir.resolve("{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi")
+ val xpiName = "$NOSCRIPT_ID.xpi"
+ val addonPath = context.cacheDir.resolve(xpiName)
+ val policy = StrictMode.getThreadPolicy()
try {
- context.assets.open("extensions/{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi")
+ context.assets.open("extensions/$xpiName")
.use { inStream ->
+ // we don't want penaltyDeath() on disk write
+ StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.LAX)
+
addonPath.outputStream().use { outStream ->
inStream.copyTo(outStream)
}
@@ -37,13 +45,15 @@ object TorBrowserFeatures {
} catch (throwable: IOException) {
onError(throwable)
return
+ } finally {
+ StrictMode.setThreadPolicy(policy)
}
/**
* Install with a file:// URI pointing to the temp location where the addon was copied to.
*/
runtime.installWebExtension(
- id = "{73a6fe31-595d-460b-a920-fcc0f8843232}",
+ id = NOSCRIPT_ID,
url = addonPath.toURI().toString(),
onSuccess = { extension ->
runtime.setAllowedInPrivateBrowsing(
@@ -89,8 +99,7 @@ object TorBrowserFeatures {
/**
* Install NoScript as a user WebExtension if we have not already done so.
- * AMO signature is checked, and AMO automatic updates will work. The extension should
- * behave as if the user had installed it manually.
+ * AMO signature is checked, but automatic updates still need to be enabled.
*/
if (!context.settings().noscriptInstalled) {
installNoScript(
@@ -105,5 +114,40 @@ object TorBrowserFeatures {
}
)
}
+
+ /**
+ * If we have not done it yet, enable automatic updates for NoScript and force a
+ * one-time immediate update check, in order to upgrade old profiles and ensure we've got
+ * the latest stable AMO version available on first startup.
+ * We will do it as soon as the Tor is connected, to prevent early addonUpdater activation
+ * causing automatic update checks failures (components.addonUpdater being a lazy prop).
+ * The extension, from then on, should behave as if the user had installed it manually.
+ */
+ if (context.settings().noscriptUpdated == 0) {
+ context.components.torController.registerTorListener(object : TorEvents {
+ override fun onTorConnected() {
+ context.components.torController.unregisterTorListener(this)
+ // Enable automatic updates
+ context.components.addonUpdater.registerForFutureUpdates(NOSCRIPT_ID)
+ // Force an immediate update check
+ context.components.addonUpdater.update(NOSCRIPT_ID)
+ context.settings().noscriptUpdated = 1
+ }
+
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorConnecting() {
+ }
+
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorStopped() {
+ }
+
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorStatusUpdate(entry: String?, status: String?) {
+ }
+ })
+ }
}
+
+
}
=====================================
app/src/main/java/org/mozilla/fenix/utils/Settings.kt
=====================================
@@ -1379,4 +1379,9 @@ class Settings(private val appContext: Context) : PreferencesHolder {
appContext.getPreferenceKey(R.string.pref_key_noscript_installed),
default = false
)
+
+ var noscriptUpdated by intPreference(
+ appContext.getPreferenceKey(R.string.pref_key_noscript_updated),
+ default = 0
+ )
}
=====================================
app/src/main/res/values/preference_keys.xml
=====================================
@@ -297,6 +297,7 @@
<string name="pref_key_show_unified_search" translatable="false">pref_key_show_unified_search</string>
<string name="pref_key_noscript_installed" translatable="false">pref_key_noscript_installed</string>
+ <string name="pref_key_noscript_updated" translatable="false">pref_key_noscript_updated</string>
<!-- Security Level Settings -->
<string name="pref_key_tor_security_level_settings" translatable="false">pref_key_tor_security_level_settings</string>
View it on GitLab: https://gitlab.torproject.org/tpo/applications/fenix/-/commit/b3677ba2ea06a…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/fenix/-/commit/b3677ba2ea06a…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/android-components][android-components-99.0.3-11.5-1] fixup! Modify Addon support
by Richard Pospesel (@richard) 25 Aug '22
by Richard Pospesel (@richard) 25 Aug '22
25 Aug '22
Richard Pospesel pushed to branch android-components-99.0.3-11.5-1 at The Tor Project / Applications / android-components
Commits:
2ff416f6 by hackademix at 2022-08-24T23:30:09+02:00
fixup! Modify Addon support
- - - - -
1 changed file:
- components/feature/addons/src/main/java/mozilla/components/feature/addons/AddonManager.kt
Changes:
=====================================
components/feature/addons/src/main/java/mozilla/components/feature/addons/AddonManager.kt
=====================================
@@ -154,6 +154,7 @@ class AddonManager(
onSuccess = { ext ->
val installedAddon = addon.copy(installedState = ext.toInstalledState())
addonUpdater.registerForFutureUpdates(installedAddon.id)
+ setAddonAllowedInPrivateBrowsing(installedAddon, true)
completePendingAddonAction(pendingAction)
onSuccess(installedAddon)
},
View it on GitLab: https://gitlab.torproject.org/tpo/applications/android-components/-/commit/…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/android-components/-/commit/…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/fenix][tor-browser-99.0.0b3-11.5-1] fixup! Modify Add-on support
by Richard Pospesel (@richard) 25 Aug '22
by Richard Pospesel (@richard) 25 Aug '22
25 Aug '22
Richard Pospesel pushed to branch tor-browser-99.0.0b3-11.5-1 at The Tor Project / Applications / fenix
Commits:
1f564fb6 by hackademix at 2022-08-25T21:38:50+00:00
fixup! Modify Add-on support
- - - - -
4 changed files:
- .gitignore
- app/src/main/java/org/mozilla/fenix/components/TorBrowserFeatures.kt
- app/src/main/java/org/mozilla/fenix/utils/Settings.kt
- app/src/main/res/values/preference_keys.xml
Changes:
=====================================
.gitignore
=====================================
@@ -103,3 +103,7 @@ test_artifacts/
# Web extensions: manifest.json files are generated
manifest.json
+
+# Other files modified at build time
+.experimenter.json
+
=====================================
app/src/main/java/org/mozilla/fenix/components/TorBrowserFeatures.kt
=====================================
@@ -6,15 +6,19 @@
package org.mozilla.fenix.components
+import android.os.StrictMode
import android.content.Context
import mozilla.components.concept.engine.webextension.WebExtension
import mozilla.components.concept.engine.webextension.WebExtensionRuntime
import mozilla.components.support.base.log.logger.Logger
+import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.settings
+import org.mozilla.fenix.tor.TorEvents
import java.io.IOException
object TorBrowserFeatures {
private val logger = Logger("torbrowser-features")
+ private const val NOSCRIPT_ID = "{73a6fe31-595d-460b-a920-fcc0f8843232}"
private fun installNoScript(
context: Context,
@@ -25,11 +29,15 @@ object TorBrowserFeatures {
/**
* Copy the xpi from assets to cacheDir, we do not care if the file is later deleted.
*/
- val addonPath =
- context.cacheDir.resolve("{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi")
+ val xpiName = "$NOSCRIPT_ID.xpi"
+ val addonPath = context.cacheDir.resolve(xpiName)
+ val policy = StrictMode.getThreadPolicy()
try {
- context.assets.open("extensions/{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi")
+ context.assets.open("extensions/$xpiName")
.use { inStream ->
+ // we don't want penaltyDeath() on disk write
+ StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.LAX)
+
addonPath.outputStream().use { outStream ->
inStream.copyTo(outStream)
}
@@ -37,13 +45,15 @@ object TorBrowserFeatures {
} catch (throwable: IOException) {
onError(throwable)
return
+ } finally {
+ StrictMode.setThreadPolicy(policy)
}
/**
* Install with a file:// URI pointing to the temp location where the addon was copied to.
*/
runtime.installWebExtension(
- id = "{73a6fe31-595d-460b-a920-fcc0f8843232}",
+ id = NOSCRIPT_ID,
url = addonPath.toURI().toString(),
onSuccess = { extension ->
runtime.setAllowedInPrivateBrowsing(
@@ -89,8 +99,7 @@ object TorBrowserFeatures {
/**
* Install NoScript as a user WebExtension if we have not already done so.
- * AMO signature is checked, and AMO automatic updates will work. The extension should
- * behave as if the user had installed it manually.
+ * AMO signature is checked, but automatic updates still need to be enabled.
*/
if (!context.settings().noscriptInstalled) {
installNoScript(
@@ -105,5 +114,40 @@ object TorBrowserFeatures {
}
)
}
+
+ /**
+ * If we have not done it yet, enable automatic updates for NoScript and force a
+ * one-time immediate update check, in order to upgrade old profiles and ensure we've got
+ * the latest stable AMO version available on first startup.
+ * We will do it as soon as the Tor is connected, to prevent early addonUpdater activation
+ * causing automatic update checks failures (components.addonUpdater being a lazy prop).
+ * The extension, from then on, should behave as if the user had installed it manually.
+ */
+ if (context.settings().noscriptUpdated == 0) {
+ context.components.torController.registerTorListener(object : TorEvents {
+ override fun onTorConnected() {
+ context.components.torController.unregisterTorListener(this)
+ // Enable automatic updates
+ context.components.addonUpdater.registerForFutureUpdates(NOSCRIPT_ID)
+ // Force an immediate update check
+ context.components.addonUpdater.update(NOSCRIPT_ID)
+ context.settings().noscriptUpdated = 1
+ }
+
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorConnecting() {
+ }
+
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorStopped() {
+ }
+
+ @SuppressWarnings("EmptyFunctionBlock")
+ override fun onTorStatusUpdate(entry: String?, status: String?) {
+ }
+ })
+ }
}
+
+
}
=====================================
app/src/main/java/org/mozilla/fenix/utils/Settings.kt
=====================================
@@ -1370,4 +1370,9 @@ class Settings(private val appContext: Context) : PreferencesHolder {
appContext.getPreferenceKey(R.string.pref_key_noscript_installed),
default = false
)
+
+ var noscriptUpdated by intPreference(
+ appContext.getPreferenceKey(R.string.pref_key_noscript_updated),
+ default = 0
+ )
}
=====================================
app/src/main/res/values/preference_keys.xml
=====================================
@@ -291,6 +291,7 @@
<string name="pref_key_pocket_homescreen_recommendations" translatable="false">pref_key_pocket_homescreen_recommendations</string>
<string name="pref_key_noscript_installed" translatable="false">pref_key_noscript_installed</string>
+ <string name="pref_key_noscript_updated" translatable="false">pref_key_noscript_updated</string>
<!-- Security Level Settings -->
<string name="pref_key_tor_security_level_settings" translatable="false">pref_key_tor_security_level_settings</string>
View it on GitLab: https://gitlab.torproject.org/tpo/applications/fenix/-/commit/1f564fb657f87…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/fenix/-/commit/1f564fb657f87…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[tor-browser] branch tor-browser-102.2.0esr-12.0-1 updated: fixup! Bug 10760: Integrate TorButton to TorBrowser core
by gitolite role 25 Aug '22
by gitolite role 25 Aug '22
25 Aug '22
This is an automated email from the git hooks/post-receive script.
pierov pushed a commit to branch tor-browser-102.2.0esr-12.0-1
in repository tor-browser.
The following commit(s) were added to refs/heads/tor-browser-102.2.0esr-12.0-1 by this push:
new 3a79382bda2a4 fixup! Bug 10760: Integrate TorButton to TorBrowser core
3a79382bda2a4 is described below
commit 3a79382bda2a4fce7e4d1c502089d6dd8fa6dc0c
Author: Pier Angelo Vendrame <pierov(a)torproject.org>
AuthorDate: Thu Aug 25 18:34:34 2022 +0200
fixup! Bug 10760: Integrate TorButton to TorBrowser core
Updated to use the linted TorButton
---
toolkit/torproject/torbutton | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/toolkit/torproject/torbutton b/toolkit/torproject/torbutton
index e2a8255df7634..9f2e434a7f09d 160000
--- a/toolkit/torproject/torbutton
+++ b/toolkit/torproject/torbutton
@@ -1 +1 @@
-Subproject commit e2a8255df763467afbf22cf596d56911e5b6f985
+Subproject commit 9f2e434a7f09d2f53c529e7293bf715c4a6b71e6
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
1
0
This is an automated email from the git hooks/post-receive script.
pierov pushed a commit to branch main
in repository torbutton.
The following commit(s) were added to refs/heads/main by this push:
new 9f2e434a Bug 40012: Linted torbutton
9f2e434a is described below
commit 9f2e434a7f09d2f53c529e7293bf715c4a6b71e6
Author: Pier Angelo Vendrame <pierov(a)torproject.org>
AuthorDate: Wed Aug 24 16:28:30 2022 +0200
Bug 40012: Linted torbutton
---
chrome/content/aboutTor/aboutTor-content.js | 64 +-
chrome/content/preferences-mobile.js | 49 +-
chrome/content/tor-circuit-display.js | 907 +++++++++-------
chrome/content/torbutton.js | 1561 ++++++++++++++-------------
components/domain-isolator.js | 98 +-
components/dragDropFilter.js | 39 +-
components/external-app-blocker.js | 75 +-
components/startup-observer.js | 270 ++---
components/torCheckService.js | 119 +-
components/torbutton-logger.js | 201 ++--
modules/tor-control-port.js | 457 ++++----
modules/utils.js | 238 ++--
12 files changed, 2217 insertions(+), 1861 deletions(-)
diff --git a/chrome/content/aboutTor/aboutTor-content.js b/chrome/content/aboutTor/aboutTor-content.js
index 601b817c..55bf4413 100644
--- a/chrome/content/aboutTor/aboutTor-content.js
+++ b/chrome/content/aboutTor/aboutTor-content.js
@@ -14,9 +14,14 @@
* AboutTor:ChromeData privileged data chrome -> content
*/
+/* globals content, addMessageListener, sendAsyncMessage,
+ removeMessageListener */
+
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
-let { bindPrefAndInit, show_torbrowser_manual } = ChromeUtils.import("resource://torbutton/modules/utils.js", {});
+const { bindPrefAndInit, show_torbrowser_manual } = ChromeUtils.import(
+ "resource://torbutton/modules/utils.js"
+);
var AboutTorListener = {
kAboutTorLoadedMessage: "AboutTor:Loaded",
@@ -26,13 +31,14 @@ var AboutTorListener = {
return content.document.documentURI.toLowerCase() == "about:tor";
},
- init: function(aChromeGlobal) {
+ init(aChromeGlobal) {
aChromeGlobal.addEventListener("AboutTorLoad", this, false, true);
},
- handleEvent: function(aEvent) {
- if (!this.isAboutTor)
+ handleEvent(aEvent) {
+ if (!this.isAboutTor) {
return;
+ }
switch (aEvent.type) {
case "AboutTorLoad":
@@ -44,9 +50,10 @@ var AboutTorListener = {
}
},
- receiveMessage: function(aMessage) {
- if (!this.isAboutTor)
+ receiveMessage(aMessage) {
+ if (!this.isAboutTor) {
return;
+ }
switch (aMessage.name) {
case this.kAboutTorChromeDataMessage:
@@ -55,7 +62,7 @@ var AboutTorListener = {
}
},
- onPageLoad: function() {
+ onPageLoad() {
// Arrange to update localized text and links.
bindPrefAndInit("intl.locale.requested", () => {
const aNewVal = Services.locale.requestedLocale;
@@ -72,48 +79,53 @@ var AboutTorListener = {
sendAsyncMessage(this.kAboutTorLoadedMessage);
},
- onPageHide: function() {
+ onPageHide() {
removeEventListener("resize", this, false);
removeEventListener("pagehide", this, false);
removeMessageListener(this.kAboutTorChromeDataMessage, this);
},
- onChromeDataUpdate: function(aData) {
+ onChromeDataUpdate(aData) {
let body = content.document.body;
// Update status: tor on/off, Tor Browser manual shown.
- if (aData.torOn)
+ if (aData.torOn) {
body.setAttribute("toron", "yes");
- else
+ } else {
body.removeAttribute("toron");
+ }
- if (show_torbrowser_manual())
+ if (show_torbrowser_manual()) {
body.setAttribute("showmanual", "yes");
- else
+ } else {
body.removeAttribute("showmanual");
+ }
- if (aData.updateChannel)
+ if (aData.updateChannel) {
body.setAttribute("updatechannel", aData.updateChannel);
- else
+ } else {
body.removeAttribute("updatechannel");
+ }
if (aData.hasBeenUpdated) {
body.setAttribute("hasbeenupdated", "yes");
- content.document.getElementById("update-infolink").setAttribute("href",
- aData.updateMoreInfoURL);
+ content.document
+ .getElementById("update-infolink")
+ .setAttribute("href", aData.updateMoreInfoURL);
}
- if (aData.mobile)
+ if (aData.mobile) {
body.setAttribute("mobile", "yes");
+ }
// Setting body.initialized="yes" displays the body.
body.setAttribute("initialized", "yes");
},
- onLocaleChange: function(aLocale) {
+ onLocaleChange(aLocale) {
// Set localized "Get Involved" link.
content.document.getElementById("getInvolvedLink").href =
- "https://community.torproject.org/" + aLocale;
+ "https://community.torproject.org/" + aLocale;
// Display the Tor Browser product name and version.
try {
@@ -123,12 +135,14 @@ var AboutTorListener = {
let tbbVersion = Services.prefs.getCharPref("torbrowser.version");
let elem = content.document.getElementById("torbrowser-version");
- while (elem.firstChild)
- elem.removeChild(elem.firstChild);
- elem.appendChild(content.document.createTextNode(productName + ' '
- + tbbVersion));
+ while (elem.firstChild) {
+ elem.firstChild.remove();
+ }
+ elem.appendChild(
+ content.document.createTextNode(productName + " " + tbbVersion)
+ );
} catch (e) {}
- }
+ },
};
AboutTorListener.init(this);
diff --git a/chrome/content/preferences-mobile.js b/chrome/content/preferences-mobile.js
index fa79dce8..92564e90 100644
--- a/chrome/content/preferences-mobile.js
+++ b/chrome/content/preferences-mobile.js
@@ -2,26 +2,30 @@
// Utilities
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
-const { getBoolPref, getIntPref, setBoolPref, setIntPref, getCharPref }
- = Services.prefs;
+const {
+ getBoolPref,
+ getIntPref,
+ setBoolPref,
+ setIntPref,
+ getCharPref,
+} = Services.prefs;
-let { getLocale, show_torbrowser_manual } =
- ChromeUtils.import("resource://torbutton/modules/utils.js", {});
+let { getLocale, show_torbrowser_manual } = ChromeUtils.import(
+ "resource://torbutton/modules/utils.js"
+);
// Description elements have the follow names.
-const descNames =
- [, "desc_standard", "desc_safer", "desc_safest"];
+const descNames = ["", "desc_standard", "desc_safer", "desc_safest"];
// "Learn-more"-elements have the follow names.
-const linkNames =
- [, "link_standard", "link_safer", "link_safest"];
+const linkNames = ["", "link_standard", "link_safer", "link_safest"];
// A single `state` object that reflects the user settings in this UI.
-let state = { slider : 0, custom : false};
+let state = { slider: 0, custom: false };
// Utility functions to convert between the legacy 4-value pref index
// and the 3-valued security slider.
-let sliderPositionToPrefSetting = pos => [, 4, 2, 1][pos];
-let prefSettingToSliderPosition = pref => [, 3, 2, 2, 1][pref];
+let sliderPositionToPrefSetting = pos => [0, 4, 2, 1][pos];
+let prefSettingToSliderPosition = pref => [0, 3, 2, 2, 1][pref];
// Set the desired slider value and update UI.
function torbutton_set_slider(sliderValue) {
@@ -31,9 +35,9 @@ function torbutton_set_slider(sliderValue) {
let descs = descNames.map(name => document.getElementById(name));
descs.forEach((desc, i) => {
if (state.slider !== i) {
- desc.style.display = 'none';
+ desc.style.display = "none";
} else {
- desc.style.display = 'block';
+ desc.style.display = "block";
}
});
torbutton_save_security_settings();
@@ -42,15 +46,20 @@ function torbutton_set_slider(sliderValue) {
// Read prefs 'extensions.torbutton.security_slider' and
// 'extensions.torbutton.security_custom', and initialize the UI.
function torbutton_init_security_ui() {
- torbutton_set_slider(prefSettingToSliderPosition(
- getIntPref("extensions.torbutton.security_slider")));
+ torbutton_set_slider(
+ prefSettingToSliderPosition(
+ getIntPref("extensions.torbutton.security_slider")
+ )
+ );
torbutton_set_learn_more_links();
}
// Write the two prefs from the current settings.
function torbutton_save_security_settings() {
- setIntPref("extensions.torbutton.security_slider",
- sliderPositionToPrefSetting(state.slider));
+ setIntPref(
+ "extensions.torbutton.security_slider",
+ sliderPositionToPrefSetting(state.slider)
+ );
setBoolPref("extensions.torbutton.security_custom", state.custom);
}
@@ -59,15 +68,15 @@ function torbutton_save_security_settings() {
// let's show the "Learn more"-link, otherwise hide it.
function torbutton_set_learn_more_links() {
let show_manual = show_torbrowser_manual();
- let locale = ""
+ let locale = "";
if (show_manual) {
locale = getLocale();
}
let links = linkNames.map(name => document.getElementById(name));
links.forEach(link => {
if (show_manual && locale != "") {
- link.href= "https:/tb-manual.torproject.org/" + locale +
- "/security-slider.html";
+ link.href =
+ "https:/tb-manual.torproject.org/" + locale + "/security-slider.html";
link.hidden = false;
} else {
link.hidden = true;
diff --git a/chrome/content/tor-circuit-display.js b/chrome/content/tor-circuit-display.js
index 14e3da5b..e4b5ceea 100644
--- a/chrome/content/tor-circuit-display.js
+++ b/chrome/content/tor-circuit-display.js
@@ -21,28 +21,38 @@
// a previous call to configureControlPortModule(), and binds to a named
// bool pref whose value determines whether the circuit display is enabled
// or disabled.
-let createTorCircuitDisplay = (function () {
-
-"use strict";
-
-// Mozilla utilities
-const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
-
-// Import the controller code.
-let { wait_for_controller } = ChromeUtils.import("resource://torbutton/modules/tor-control-port.js", {});
-
-// Utility functions
-let { bindPrefAndInit, observe, getLocale, getDomainForBrowser, torbutton_get_property_string } = ChromeUtils.import("resource://torbutton/modules/utils.js", {});
-
-// Make the TorButton logger available.
-let logger = Cc["@torproject.org/torbutton-logger;1"]
- .getService(Ci.nsISupports).wrappedJSObject;
-
-// ## Circuit/stream credentials and node monitoring
-
-// A mutable map that stores the current nodes for each
-// SOCKS username/password pair.
-let credentialsToNodeDataMap = new Map(),
+let createTorCircuitDisplay = (function() {
+ "use strict";
+
+ // Mozilla utilities
+ const { Services } = ChromeUtils.import(
+ "resource://gre/modules/Services.jsm"
+ );
+
+ // Import the controller code.
+ const { wait_for_controller } = ChromeUtils.import(
+ "resource://torbutton/modules/tor-control-port.js"
+ );
+
+ // Utility functions
+ let {
+ bindPrefAndInit,
+ observe,
+ getLocale,
+ getDomainForBrowser,
+ torbutton_get_property_string,
+ } = ChromeUtils.import("resource://torbutton/modules/utils.js");
+
+ // Make the TorButton logger available.
+ let logger = Cc["@torproject.org/torbutton-logger;1"].getService(
+ Ci.nsISupports
+ ).wrappedJSObject;
+
+ // ## Circuit/stream credentials and node monitoring
+
+ // A mutable map that stores the current nodes for each
+ // SOCKS username/password pair.
+ let credentialsToNodeDataMap = new Map(),
// A mutable map that reports `true` for IDs of "mature" circuits
// (those that have conveyed a stream).
knownCircuitIDs = new Map(),
@@ -50,424 +60,477 @@ let credentialsToNodeDataMap = new Map(),
// latest channels for each browser + domain.
browserToCredentialsMap = new Map();
-// __trimQuotes(s)__.
-// Removes quotation marks around a quoted string.
-let trimQuotes = s => s ? s.match(/^"(.*)"$/)[1] : undefined;
-
-// __getBridge(id)__.
-// Gets the bridge parameters for a given node ID. If the node
-// is not currently used as a bridge, returns null.
-let getBridge = async function (controller, id) {
- let bridges = await controller.getConf("bridge");
- if (bridges) {
- for (let bridge of bridges) {
- if (bridge.ID && bridge.ID.toUpperCase() === id.toUpperCase()) {
- return bridge;
+ // __trimQuotes(s)__.
+ // Removes quotation marks around a quoted string.
+ let trimQuotes = s => (s ? s.match(/^"(.*)"$/)[1] : undefined);
+
+ // __getBridge(id)__.
+ // Gets the bridge parameters for a given node ID. If the node
+ // is not currently used as a bridge, returns null.
+ let getBridge = async function(controller, id) {
+ let bridges = await controller.getConf("bridge");
+ if (bridges) {
+ for (let bridge of bridges) {
+ if (bridge.ID && bridge.ID.toUpperCase() === id.toUpperCase()) {
+ return bridge;
+ }
}
}
- }
- return null;
-};
-
-// nodeDataForID(controller, id)__.
-// Returns the type, IP addresses and country code of a node with given ID.
-// Example: `nodeDataForID(controller, "20BC91DC525C3DC9974B29FBEAB51230DE024C44")`
-// => `{ type: "default", ipAddrs: ["12.23.34.45", "2001:db8::"], countryCode: "fr" }`
-let nodeDataForID = async function (controller, id) {
- let result = {ipAddrs: []};
- const bridge = await getBridge(controller, id); // type, ip, countryCode;
- const addrRe = /^\[?([^\]]+)\]?:\d+$/
- if (bridge) {
- result.type = "bridge";
- result.bridgeType = bridge.type;
- // Attempt to get an IP address from bridge address string.
- try {
- const ip = bridge.address.match(addrRe)[1];
- if (!ip.startsWith("0.")) {
- result.ipAddrs = [ip];
- }
- } catch (e) {
- }
- } else {
- // either dealing with a relay, or a bridge whose fingerprint is not saved in torrc
- try {
- const statusMap = await controller.getInfo("ns/id/" + id);
- result.type = "default";
- if (!statusMap.IP.startsWith("0.")) {
- result.ipAddrs.push(statusMap.IP);
- }
+ return null;
+ };
+
+ // nodeDataForID(controller, id)__.
+ // Returns the type, IP addresses and country code of a node with given ID.
+ // Example: `nodeDataForID(controller, "20BC91DC525C3DC9974B29FBEAB51230DE024C44")`
+ // => `{ type: "default", ipAddrs: ["12.23.34.45", "2001:db8::"], countryCode: "fr" }`
+ let nodeDataForID = async function(controller, id) {
+ let result = { ipAddrs: [] };
+ const bridge = await getBridge(controller, id); // type, ip, countryCode;
+ const addrRe = /^\[?([^\]]+)\]?:\d+$/;
+ if (bridge) {
+ result.type = "bridge";
+ result.bridgeType = bridge.type;
+ // Attempt to get an IP address from bridge address string.
+ try {
+ const ip = bridge.address.match(addrRe)[1];
+ if (!ip.startsWith("0.")) {
+ result.ipAddrs = [ip];
+ }
+ } catch (e) {}
+ } else {
+ // either dealing with a relay, or a bridge whose fingerprint is not saved in torrc
try {
- result.ipAddrs.push(statusMap.IPv6.match(addrRe)[1]);
+ const statusMap = await controller.getInfo("ns/id/" + id);
+ result.type = "default";
+ if (!statusMap.IP.startsWith("0.")) {
+ result.ipAddrs.push(statusMap.IP);
+ }
+ try {
+ result.ipAddrs.push(statusMap.IPv6.match(addrRe)[1]);
+ } catch (e) {}
} catch (e) {
+ // getInfo will throw if the given id is not a relay
+ // this probably means we are dealing with a user-provided bridge with no fingerprint
+ result.type = "bridge";
+ // we don't know the ip/ipv6 or type, so leave blank
+ result.ipAddrs = [];
+ result.bridgeType = "";
}
- } catch (e) {
- // getInfo will throw if the given id is not a relay
- // this probably means we are dealing with a user-provided bridge with no fingerprint
- result.type = "bridge";
- // we don't know the ip/ipv6 or type, so leave blank
- result.ipAddrs = [];
- result.bridgeType = "";
}
- }
- if (result.ipAddrs.length > 0) {
- // Get the country code for the node's IP address.
- try {
- const countryCode = await controller.getInfo("ip-to-country/" + result.ipAddrs[0]);
- result.countryCode = countryCode === "??" ? null : countryCode;
- } catch (e) { }
- }
- return result;
-};
-
-// __nodeDataForCircuit(controller, circuitEvent)__.
-// Gets the information for a circuit.
-let nodeDataForCircuit = async function (controller, circuitEvent) {
- let rawIDs = circuitEvent.circuit.map(circ => circ[0]),
+ if (result.ipAddrs.length) {
+ // Get the country code for the node's IP address.
+ try {
+ const countryCode = await controller.getInfo(
+ "ip-to-country/" + result.ipAddrs[0]
+ );
+ result.countryCode = countryCode === "??" ? null : countryCode;
+ } catch (e) {}
+ }
+ return result;
+ };
+
+ // __nodeDataForCircuit(controller, circuitEvent)__.
+ // Gets the information for a circuit.
+ let nodeDataForCircuit = async function(controller, circuitEvent) {
+ let rawIDs = circuitEvent.circuit.map(circ => circ[0]),
// Remove the leading '$' if present.
- ids = rawIDs.map(id => id[0] === "$" ? id.substring(1) : id);
- // Get the node data for all IDs in circuit.
- return Promise.all(ids.map(id => nodeDataForID(controller, id)));
-};
-
-// __getCircuitStatusByID(aController, circuitID)__
-// Returns the circuit status for the circuit with the given ID.
-let getCircuitStatusByID = async function (aController, circuitID) {
- let circuitStatuses = await aController.getInfo("circuit-status");
- if (circuitStatuses) {
- for (let circuitStatus of circuitStatuses) {
- if (circuitStatus.id === circuitID) {
- return circuitStatus;
+ ids = rawIDs.map(id => (id[0] === "$" ? id.substring(1) : id));
+ // Get the node data for all IDs in circuit.
+ return Promise.all(ids.map(id => nodeDataForID(controller, id)));
+ };
+
+ // __getCircuitStatusByID(aController, circuitID)__
+ // Returns the circuit status for the circuit with the given ID.
+ let getCircuitStatusByID = async function(aController, circuitID) {
+ let circuitStatuses = await aController.getInfo("circuit-status");
+ if (circuitStatuses) {
+ for (let circuitStatus of circuitStatuses) {
+ if (circuitStatus.id === circuitID) {
+ return circuitStatus;
+ }
}
}
- }
- return null;
-};
-
-// __collectIsolationData(aController, updateUI)__.
-// Watches for STREAM SENTCONNECT events. When a SENTCONNECT event occurs, then
-// we assume isolation settings (SOCKS username+password) are now fixed for the
-// corresponding circuit. Whenever the first stream on a new circuit is seen,
-// looks up u+p and records the node data in the credentialsToNodeDataMap.
-// We need to update the circuit display immediately after any new node data
-// is received. So the `updateUI` callback will be called at that point.
-// See https://trac.torproject.org/projects/tor/ticket/15493
-let collectIsolationData = function (aController, updateUI) {
- return aController.watchEvent(
- "STREAM",
- streamEvent => streamEvent.StreamStatus === "SENTCONNECT",
- async (streamEvent) => {
- if (!knownCircuitIDs.get(streamEvent.CircuitID)) {
- logger.eclog(3, "streamEvent.CircuitID: " + streamEvent.CircuitID);
- knownCircuitIDs.set(streamEvent.CircuitID, true);
- let circuitStatus = await getCircuitStatusByID(aController, streamEvent.CircuitID),
- credentials = circuitStatus ?
- (trimQuotes(circuitStatus.SOCKS_USERNAME) + "|" +
- trimQuotes(circuitStatus.SOCKS_PASSWORD)) :
- null;
- if (credentials) {
- let nodeData = await nodeDataForCircuit(aController, circuitStatus);
- credentialsToNodeDataMap.set(credentials, nodeData);
- updateUI();
+ return null;
+ };
+
+ // __collectIsolationData(aController, updateUI)__.
+ // Watches for STREAM SENTCONNECT events. When a SENTCONNECT event occurs, then
+ // we assume isolation settings (SOCKS username+password) are now fixed for the
+ // corresponding circuit. Whenever the first stream on a new circuit is seen,
+ // looks up u+p and records the node data in the credentialsToNodeDataMap.
+ // We need to update the circuit display immediately after any new node data
+ // is received. So the `updateUI` callback will be called at that point.
+ // See https://trac.torproject.org/projects/tor/ticket/15493
+ let collectIsolationData = function(aController, updateUI) {
+ return aController.watchEvent(
+ "STREAM",
+ streamEvent => streamEvent.StreamStatus === "SENTCONNECT",
+ async streamEvent => {
+ if (!knownCircuitIDs.get(streamEvent.CircuitID)) {
+ logger.eclog(3, "streamEvent.CircuitID: " + streamEvent.CircuitID);
+ knownCircuitIDs.set(streamEvent.CircuitID, true);
+ let circuitStatus = await getCircuitStatusByID(
+ aController,
+ streamEvent.CircuitID
+ ),
+ credentials = circuitStatus
+ ? trimQuotes(circuitStatus.SOCKS_USERNAME) +
+ "|" +
+ trimQuotes(circuitStatus.SOCKS_PASSWORD)
+ : null;
+ if (credentials) {
+ let nodeData = await nodeDataForCircuit(aController, circuitStatus);
+ credentialsToNodeDataMap.set(credentials, nodeData);
+ updateUI();
+ }
}
}
- });
-};
-
-// __browserForChannel(channel)__.
-// Returns the browser that loaded a given channel.
-let browserForChannel = function (channel) {
- if (!channel) return null;
- let chan = channel.QueryInterface(Ci.nsIChannel);
- let callbacks = chan.notificationCallbacks;
- if (!callbacks) return null;
- let loadContext;
- try {
- loadContext = callbacks.getInterface(Ci.nsILoadContext);
- } catch (e) {
- // Ignore
- return null;
- }
- if (!loadContext) return null;
- return loadContext.topFrameElement;
-};
-
-// __collectBrowserCredentials()__.
-// Starts observing http channels. Each channel's proxyInfo
-// username and password is recorded for the channel's browser.
-let collectBrowserCredentials = function () {
- return observe("http-on-modify-request", chan => {
+ );
+ };
+
+ // __browserForChannel(channel)__.
+ // Returns the browser that loaded a given channel.
+ let browserForChannel = function(channel) {
+ if (!channel) {
+ return null;
+ }
+ let chan = channel.QueryInterface(Ci.nsIChannel);
+ let callbacks = chan.notificationCallbacks;
+ if (!callbacks) {
+ return null;
+ }
+ let loadContext;
try {
- let proxyInfo = chan.QueryInterface(Ci.nsIProxiedChannel).proxyInfo;
- let browser = browserForChannel(chan);
- if (browser && proxyInfo) {
- if (!browserToCredentialsMap.has(browser)) {
- browserToCredentialsMap.set(browser, new Map());
+ loadContext = callbacks.getInterface(Ci.nsILoadContext);
+ } catch (e) {
+ // Ignore
+ return null;
+ }
+ if (!loadContext) {
+ return null;
+ }
+ return loadContext.topFrameElement;
+ };
+
+ // __collectBrowserCredentials()__.
+ // Starts observing http channels. Each channel's proxyInfo
+ // username and password is recorded for the channel's browser.
+ let collectBrowserCredentials = function() {
+ return observe("http-on-modify-request", chan => {
+ try {
+ let proxyInfo = chan.QueryInterface(Ci.nsIProxiedChannel).proxyInfo;
+ let browser = browserForChannel(chan);
+ if (browser && proxyInfo) {
+ if (!browserToCredentialsMap.has(browser)) {
+ browserToCredentialsMap.set(browser, new Map());
+ }
+ let domainMap = browserToCredentialsMap.get(browser);
+ domainMap.set(proxyInfo.username, [
+ proxyInfo.username,
+ proxyInfo.password,
+ ]);
}
- let domainMap = browserToCredentialsMap.get(browser);
- domainMap.set(proxyInfo.username, [proxyInfo.username,
- proxyInfo.password]);
+ } catch (e) {
+ logger.eclog(
+ 3,
+ `Error collecting browser credentials: ${e.message}, ${chan.URI.spec}`
+ );
}
+ });
+ };
+
+ // ## User interface
+
+ // __uiString__.
+ // Read the localized strings for this UI.
+ let uiString = function(shortName) {
+ return torbutton_get_property_string(
+ "torbutton.circuit_display." + shortName
+ );
+ };
+
+ // __localizedCountryNameFromCode(countryCode)__.
+ // Convert a country code to a localized country name.
+ // Example: `'de'` -> `'Deutschland'` in German locale.
+ let localizedCountryNameFromCode = function(countryCode) {
+ if (!countryCode) {
+ return uiString("unknown_country");
+ }
+ try {
+ return Services.intl.getRegionDisplayNames(undefined, [countryCode])[0];
} catch (e) {
- logger.eclog(3, `Error collecting browser credentials: ${e.message}, ${chan.URI.spec}`);
+ return countryCode.toUpperCase();
}
- });
-};
-
-// ## User interface
-
-// __uiString__.
-// Read the localized strings for this UI.
-let uiString = function (shortName) {
- return torbutton_get_property_string("torbutton.circuit_display." + shortName);
-};
-
-// __localizedCountryNameFromCode(countryCode)__.
-// Convert a country code to a localized country name.
-// Example: `'de'` -> `'Deutschland'` in German locale.
-let localizedCountryNameFromCode = function (countryCode) {
- if (!countryCode) return uiString("unknown_country");
- try {
- return Services.intl.getRegionDisplayNames(undefined, [countryCode])[0];
- } catch (e) {
- return countryCode.toUpperCase();
- }
-};
-
-// __showCircuitDisplay(show)__.
-// If show === true, makes the circuit display visible.
-let showCircuitDisplay = function (show) {
- document.getElementById("circuit-display-container").style.display = show ?
- 'block' : 'none';
-};
-
-// __xmlTree(ns, data)__.
-// Takes an xml namespace, ns, and a
-// data structure representing xml elements like
-// [tag, { attr-key: attr-value }, ...xml-children]
-// and returns nested xml element objects.
-let xmlTree = function xmlTree (ns, data) {
- let [type, attrs, ...children] = data;
- let element = type.startsWith("html:")
- ? document.createXULElement(type)
- : document.createElementNS(ns, type);
- for (let [key, val] of Object.entries(attrs)) {
- element.setAttribute(key, val);
- }
- for (let child of children) {
- if (child !== null && child !== undefined) {
- element.append(typeof child === "string" ? child : xmlTree(ns, child));
+ };
+
+ // __showCircuitDisplay(show)__.
+ // If show === true, makes the circuit display visible.
+ let showCircuitDisplay = function(show) {
+ document.getElementById("circuit-display-container").style.display = show
+ ? "block"
+ : "none";
+ };
+
+ // __xmlTree(ns, data)__.
+ // Takes an xml namespace, ns, and a
+ // data structure representing xml elements like
+ // [tag, { attr-key: attr-value }, ...xml-children]
+ // and returns nested xml element objects.
+ let xmlTree = function xmlTree(ns, data) {
+ let [type, attrs, ...children] = data;
+ let element = type.startsWith("html:")
+ ? document.createXULElement(type)
+ : document.createElementNS(ns, type);
+ for (let [key, val] of Object.entries(attrs)) {
+ element.setAttribute(key, val);
}
- }
- return element;
-};
-
-// __htmlTree(data)__.
-// Takes a data structure representing html elements like
-// [tag, { attr-key: attr-value }, ...html-children]
-// and returns nested html element objects.
-let htmlTree = data => xmlTree("http://www.w3.org/1999/xhtml", data);
-
-// __appendHtml(parent, data)__.
-// Takes a data structure representing html elements like
-// [tag, { attr-key: attr-value }, ...html-children]
-// and appends nested html element objects to the parent element.
-let appendHtml = (parent, data) => parent.appendChild(htmlTree(data));
-
-// __circuitCircuitData()__.
-// Obtains the circuit used by the given browser.
-let currentCircuitData = function (browser) {
- if (browser) {
- let firstPartyDomain = getDomainForBrowser(browser);
- let domain = firstPartyDomain || "--unknown--";
- let domainMap = browserToCredentialsMap.get(browser);
- let credentials = domainMap && domainMap.get(domain);
- if (credentials) {
- let [SOCKS_username, SOCKS_password] = credentials;
- let nodeData = credentialsToNodeDataMap.get(`${SOCKS_username}|${SOCKS_password}`);
- let domain = SOCKS_username;
- if (browser.documentURI.host.endsWith(".tor.onion")) {
- const service = Cc["@torproject.org/onion-alias-service;1"].getService(
- Ci.IOnionAliasService
- );
- domain = service.getOnionAlias(browser.documentURI.host);
+ for (let child of children) {
+ if (child !== null && child !== undefined) {
+ element.append(typeof child === "string" ? child : xmlTree(ns, child));
}
- return { domain, nodeData };
}
- }
- return { domain: null, nodeData: null };
-};
-
-// __updateCircuitDisplay()__.
-// Updates the Tor circuit display, showing the current domain
-// and the relay nodes for that domain.
-let updateCircuitDisplay = function () {
- let { domain, nodeData } = currentCircuitData(gBrowser.selectedBrowser);
- if (domain && nodeData) {
- // Update the displayed information for the relay nodes.
- let nodeHtmlList = document.getElementById("circuit-display-nodes");
- let li = (...data) => appendHtml(nodeHtmlList, ["li", {}, ...data]);
- nodeHtmlList.innerHTML = "";
- li(uiString("this_browser"));
- for (let i = 0; i < nodeData.length; ++i) {
- let relayText;
- if (nodeData[i].type === "bridge") {
- relayText = uiString("tor_bridge");
- let bridgeType = nodeData[i].bridgeType;
- if (bridgeType === "meek_lite") {
- relayText += ": meek";
- }
- else if (bridgeType !== "vanilla" && bridgeType !== "") {
- relayText += ": " + bridgeType;
+ return element;
+ };
+
+ // __htmlTree(data)__.
+ // Takes a data structure representing html elements like
+ // [tag, { attr-key: attr-value }, ...html-children]
+ // and returns nested html element objects.
+ let htmlTree = data => xmlTree("http://www.w3.org/1999/xhtml", data);
+
+ // __appendHtml(parent, data)__.
+ // Takes a data structure representing html elements like
+ // [tag, { attr-key: attr-value }, ...html-children]
+ // and appends nested html element objects to the parent element.
+ let appendHtml = (parent, data) => parent.appendChild(htmlTree(data));
+
+ // __circuitCircuitData()__.
+ // Obtains the circuit used by the given browser.
+ let currentCircuitData = function(browser) {
+ if (browser) {
+ let firstPartyDomain = getDomainForBrowser(browser);
+ let domain = firstPartyDomain || "--unknown--";
+ let domainMap = browserToCredentialsMap.get(browser);
+ let credentials = domainMap && domainMap.get(domain);
+ if (credentials) {
+ let [SOCKS_username, SOCKS_password] = credentials;
+ let nodeData = credentialsToNodeDataMap.get(
+ `${SOCKS_username}|${SOCKS_password}`
+ );
+ let domain = SOCKS_username;
+ if (browser.documentURI.host.endsWith(".tor.onion")) {
+ const service = Cc[
+ "@torproject.org/onion-alias-service;1"
+ ].getService(Ci.IOnionAliasService);
+ domain = service.getOnionAlias(browser.documentURI.host);
}
- } else if (nodeData[i].type == "default") {
- relayText = localizedCountryNameFromCode(nodeData[i].countryCode);
+ return { domain, nodeData };
}
- const ipAddrs = nodeData[i].ipAddrs.join(", ");
- li(relayText, " ", ["span", { class: "circuit-ip-address" }, ipAddrs], " ",
- (i === 0 && nodeData[0].type !== "bridge") ?
- ["span", { class: "circuit-guard-info" }, uiString("guard")] : null);
}
+ return { domain: null, nodeData: null };
+ };
- let domainParts = [];
- if (domain.endsWith(".onion")) {
- for (let i = 0; i < 3; ++i) {
- li(uiString("relay"));
+ // __updateCircuitDisplay()__.
+ // Updates the Tor circuit display, showing the current domain
+ // and the relay nodes for that domain.
+ let updateCircuitDisplay = function() {
+ let { domain, nodeData } = currentCircuitData(gBrowser.selectedBrowser);
+ if (domain && nodeData) {
+ // Update the displayed information for the relay nodes.
+ let nodeHtmlList = document.getElementById("circuit-display-nodes");
+ let li = (...data) => appendHtml(nodeHtmlList, ["li", {}, ...data]);
+ nodeHtmlList.innerHTML = "";
+ li(uiString("this_browser"));
+ for (let i = 0; i < nodeData.length; ++i) {
+ let relayText;
+ if (nodeData[i].type === "bridge") {
+ relayText = uiString("tor_bridge");
+ let bridgeType = nodeData[i].bridgeType;
+ if (bridgeType === "meek_lite") {
+ relayText += ": meek";
+ } else if (bridgeType !== "vanilla" && bridgeType !== "") {
+ relayText += ": " + bridgeType;
+ }
+ } else if (nodeData[i].type == "default") {
+ relayText = localizedCountryNameFromCode(nodeData[i].countryCode);
+ }
+ const ipAddrs = nodeData[i].ipAddrs.join(", ");
+ li(
+ relayText,
+ " ",
+ ["span", { class: "circuit-ip-address" }, ipAddrs],
+ " ",
+ i === 0 && nodeData[0].type !== "bridge"
+ ? ["span", { class: "circuit-guard-info" }, uiString("guard")]
+ : null
+ );
}
- if (domain.length > 22) {
- domainParts.push(domain.slice(0, 7), "…", domain.slice(-12));
+
+ let domainParts = [];
+ if (domain.endsWith(".onion")) {
+ for (let i = 0; i < 3; ++i) {
+ li(uiString("relay"));
+ }
+ if (domain.length > 22) {
+ domainParts.push(domain.slice(0, 7), "…", domain.slice(-12));
+ } else {
+ domainParts.push(domain);
+ }
} else {
domainParts.push(domain);
}
- } else {
- domainParts.push(domain);
- }
- // We use a XUL html:span element so that the tooltiptext is displayed.
- li([
- "html:span",
- {
- class: "circuit-onion",
- onclick: `
+ // We use a XUL html:span element so that the tooltiptext is displayed.
+ li([
+ "html:span",
+ {
+ class: "circuit-onion",
+ onclick: `
this.classList.add("circuit-onion-copied");
Cc[
"@mozilla.org/widget/clipboardhelper;1"
].getService(Ci.nsIClipboardHelper).copyString(this.getAttribute("data-onion"))
`,
- "data-onion": domain,
- "data-text-clicktocopy": torbutton_get_property_string("torbutton.circuit_display.click_to_copy"),
- "data-text-copied": torbutton_get_property_string("torbutton.circuit_display.copied"),
- tooltiptext: domain,
- },
- ...domainParts,
- ]);
-
- // Hide the note about guards if we are using a bridge.
- document.getElementById("circuit-guard-note-container").style.display =
- (nodeData[0].type === "bridge") ? "none" : "block";
- } else {
- // Only show the Tor circuit if we have credentials and node data.
- logger.eclog(4, "no SOCKS credentials found for current document.");
- }
- showCircuitDisplay(domain && nodeData);
-};
-
-// __syncDisplayWithSelectedTab(syncOn)__.
-// Whenever the user starts to open the popup menu, make sure the display
-// is the correct one for this tab. It's also possible that a new site
-// can be loaded while the popup menu is open.
-// Update the display if this happens.
-let syncDisplayWithSelectedTab = (function() {
- let listener = { onLocationChange : function (aBrowser) {
- if (aBrowser === gBrowser.selectedBrowser) {
- updateCircuitDisplay();
- }
- } };
- return function (syncOn) {
- let popupMenu = document.getElementById("identity-popup");
- if (syncOn) {
- // Update the circuit display just before the popup menu is shown.
- popupMenu.addEventListener("popupshowing", updateCircuitDisplay);
- // If the currently selected tab has been sent to a new location,
- // update the circuit to reflect that.
- gBrowser.addTabsProgressListener(listener);
+ "data-onion": domain,
+ "data-text-clicktocopy": torbutton_get_property_string(
+ "torbutton.circuit_display.click_to_copy"
+ ),
+ "data-text-copied": torbutton_get_property_string(
+ "torbutton.circuit_display.copied"
+ ),
+ tooltiptext: domain,
+ },
+ ...domainParts,
+ ]);
+
+ // Hide the note about guards if we are using a bridge.
+ document.getElementById("circuit-guard-note-container").style.display =
+ nodeData[0].type === "bridge" ? "none" : "block";
} else {
- // Stop syncing.
- gBrowser.removeTabsProgressListener(listener);
- popupMenu.removeEventListener("popupshowing", updateCircuitDisplay);
- // Hide the display.
- showCircuitDisplay(false);
+ // Only show the Tor circuit if we have credentials and node data.
+ logger.eclog(4, "no SOCKS credentials found for current document.");
}
+ showCircuitDisplay(domain && nodeData);
};
-})();
-// __setupGuardNote()__.
-// Call once to show the Guard note as intended.
-let setupGuardNote = function () {
- let guardNote = document.getElementById("circuit-guard-note-container");
- let guardNoteString = uiString("guard_note");
- let learnMoreString = uiString("learn_more");
- let [noteBefore, name, noteAfter] = guardNoteString.split(/[\[\]]/);
- let localeCode = getLocale();
- appendHtml(guardNote,
- ["div", {},
- noteBefore, ["span", {class: "circuit-guard-name"}, name],
- noteAfter, " ",
- ["span", {onclick: `gBrowser.selectedTab = gBrowser.addWebTab('https://support.torproject.org/${localeCode}/tbb/tbb-2/');`,
- class: "circuit-link"},
- learnMoreString]]);
-};
-
-// __ensureCorrectPopupDimensions()__.
-// Make sure the identity popup always displays with the correct height.
-let ensureCorrectPopupDimensions = function () {
- let setDimensions = () => {
- setTimeout(() => {
- let view = document.querySelector("#identity-popup-multiView .panel-viewcontainer");
- let stack = document.querySelector("#identity-popup-multiView .panel-viewstack");
+ // __syncDisplayWithSelectedTab(syncOn)__.
+ // Whenever the user starts to open the popup menu, make sure the display
+ // is the correct one for this tab. It's also possible that a new site
+ // can be loaded while the popup menu is open.
+ // Update the display if this happens.
+ let syncDisplayWithSelectedTab = (function() {
+ let listener = {
+ onLocationChange(aBrowser) {
+ if (aBrowser === gBrowser.selectedBrowser) {
+ updateCircuitDisplay();
+ }
+ },
+ };
+ return function(syncOn) {
+ let popupMenu = document.getElementById("identity-popup");
+ if (syncOn) {
+ // Update the circuit display just before the popup menu is shown.
+ popupMenu.addEventListener("popupshowing", updateCircuitDisplay);
+ // If the currently selected tab has been sent to a new location,
+ // update the circuit to reflect that.
+ gBrowser.addTabsProgressListener(listener);
+ } else {
+ // Stop syncing.
+ gBrowser.removeTabsProgressListener(listener);
+ popupMenu.removeEventListener("popupshowing", updateCircuitDisplay);
+ // Hide the display.
+ showCircuitDisplay(false);
+ }
+ };
+ })();
+
+ // __setupGuardNote()__.
+ // Call once to show the Guard note as intended.
+ let setupGuardNote = function() {
+ let guardNote = document.getElementById("circuit-guard-note-container");
+ let guardNoteString = uiString("guard_note");
+ let learnMoreString = uiString("learn_more");
+ let [noteBefore, name, noteAfter] = guardNoteString.split(/[\[\]]/);
+ let localeCode = getLocale();
+ appendHtml(guardNote, [
+ "div",
+ {},
+ noteBefore,
+ ["span", { class: "circuit-guard-name" }, name],
+ noteAfter,
+ " ",
+ [
+ "span",
+ {
+ onclick: `gBrowser.selectedTab = gBrowser.addWebTab('https://support.torproject.org/${localeCode}/tbb/tbb-2/');`,
+ class: "circuit-link",
+ },
+ learnMoreString,
+ ],
+ ]);
+ };
+
+ // __ensureCorrectPopupDimensions()__.
+ // Make sure the identity popup always displays with the correct height.
+ let ensureCorrectPopupDimensions = function() {
+ let setDimensions = () => {
+ setTimeout(() => {
+ let view = document.querySelector(
+ "#identity-popup-multiView .panel-viewcontainer"
+ );
+ let stack = document.querySelector(
+ "#identity-popup-multiView .panel-viewstack"
+ );
+ let view2 = document.getElementById("identity-popup-mainView");
+ if (view && stack && view2) {
+ let newWidth = Math.max(
+ ...[...view2.children].map(el => el.clientWidth)
+ );
+ let newHeight = stack.clientHeight;
+ stack.setAttribute("width", newWidth);
+ view2.style.minWidth = view2.style.maxWidth = newWidth + "px";
+ view.setAttribute("width", newWidth);
+ view.setAttribute("height", newHeight);
+ }
+ }, 0);
+ };
+ let removeDimensions = () => {
+ let view = document.querySelector(
+ "#identity-popup-multiView .panel-viewcontainer"
+ );
+ let stack = document.querySelector(
+ "#identity-popup-multiView .panel-viewstack"
+ );
let view2 = document.getElementById("identity-popup-mainView");
if (view && stack && view2) {
- let newWidth = Math.max(...[...view2.children].map(el => el.clientWidth));
- let newHeight = stack.clientHeight;
- stack.setAttribute("width", newWidth);
- view2.style.minWidth = view2.style.maxWidth = newWidth + "px";
- view.setAttribute("width", newWidth);
- view.setAttribute("height", newHeight);
+ view.removeAttribute("width");
+ view.removeAttribute("height");
+ stack.removeAttribute("width");
+ view2.style.minWidth = view2.style.maxWidth = "";
}
- }, 0);
+ };
+ let popupMenu = document.getElementById("identity-popup");
+ popupMenu.addEventListener("popupshowing", setDimensions);
+ popupMenu.addEventListener("popuphiding", removeDimensions);
+ return () => {
+ popupMenu.removeEventListener("popupshowing", setDimensions);
+ popupMenu.removeEventListener("popuphiding", removeDimensions);
+ };
};
- let removeDimensions = () => {
- let view = document.querySelector("#identity-popup-multiView .panel-viewcontainer");
- let stack = document.querySelector("#identity-popup-multiView .panel-viewstack");
- let view2 = document.getElementById("identity-popup-mainView");
- if (view && stack && view2) {
- view.removeAttribute("width");
- view.removeAttribute("height");
- stack.removeAttribute("width");
- view2.style.minWidth = view2.style.maxWidth = "";
+
+ // ## Main function
+
+ // __setupDisplay(enablePrefName)__.
+ // Once called, the Tor circuit display will be started whenever
+ // the "enablePref" is set to true, and stopped when it is set to false.
+ // A reference to this function (called createTorCircuitDisplay) is exported as a global.
+ let setupDisplay = function(enablePrefName) {
+ // From 79 on the identity popup is initialized lazily
+ if (gIdentityHandler._initializePopup) {
+ gIdentityHandler._initializePopup();
}
- };
- let popupMenu = document.getElementById("identity-popup");
- popupMenu.addEventListener("popupshowing", setDimensions);
- popupMenu.addEventListener("popuphiding", removeDimensions);
- return () => {
- popupMenu.removeEventListener("popupshowing", setDimensions);
- popupMenu.removeEventListener("popuphiding", removeDimensions);
- };
-};
-
-// ## Main function
-
-// __setupDisplay(enablePrefName)__.
-// Once called, the Tor circuit display will be started whenever
-// the "enablePref" is set to true, and stopped when it is set to false.
-// A reference to this function (called createTorCircuitDisplay) is exported as a global.
-let setupDisplay = function (enablePrefName) {
- // From 79 on the identity popup is initialized lazily
- if (gIdentityHandler._initializePopup) {
- gIdentityHandler._initializePopup();
- }
- setupGuardNote();
- let myController = null,
+ setupGuardNote();
+ let myController = null,
stopCollectingIsolationData = null,
stopCollectingBrowserCredentials = null,
stopEnsuringCorrectPopupDimensions = null,
@@ -486,35 +549,47 @@ let setupDisplay = function (enablePrefName) {
myController = null;
}
},
- start = async function () {
+ start = async function() {
if (!myController) {
try {
myController = await wait_for_controller();
syncDisplayWithSelectedTab(true);
- stopCollectingIsolationData = collectIsolationData(myController, updateCircuitDisplay);
+ stopCollectingIsolationData = collectIsolationData(
+ myController,
+ updateCircuitDisplay
+ );
stopCollectingBrowserCredentials = collectBrowserCredentials();
stopEnsuringCorrectPopupDimensions = ensureCorrectPopupDimensions();
} catch (err) {
logger.eclog(5, err);
- logger.eclog(5, "Disabling tor display circuit because of an error.");
+ logger.eclog(
+ 5,
+ "Disabling tor display circuit because of an error."
+ );
myController.close();
stop();
}
- }
- };
- try {
- let unbindPref = bindPrefAndInit(enablePrefName, on => { if (on) start(); else stop(); });
- // When this chrome window is unloaded, we need to unbind the pref.
- window.addEventListener("unload", function () {
- unbindPref();
- stop();
- });
- } catch (e) {
- logger.eclog(5, "Error: " + e.message + "\n" + e.stack);
- }
-};
+ }
+ };
+ try {
+ let unbindPref = bindPrefAndInit(enablePrefName, on => {
+ if (on) {
+ start();
+ } else {
+ stop();
+ }
+ });
+ // When this chrome window is unloaded, we need to unbind the pref.
+ window.addEventListener("unload", function() {
+ unbindPref();
+ stop();
+ });
+ } catch (e) {
+ logger.eclog(5, "Error: " + e.message + "\n" + e.stack);
+ }
+ };
-return setupDisplay;
+ return setupDisplay;
-// Finish createTorCircuitDisplay()
+ // Finish createTorCircuitDisplay()
})();
diff --git a/chrome/content/torbutton.js b/chrome/content/torbutton.js
index fde5e1fa..ec2680f2 100644
--- a/chrome/content/torbutton.js
+++ b/chrome/content/torbutton.js
@@ -3,121 +3,105 @@ var torbutton_init;
var torbutton_new_circuit;
(() => {
-// Bug 1506 P1-P5: This is the main Torbutton overlay file. Much needs to be
-// preserved here, but in an ideal world, most of this code should perhaps be
-// moved into an XPCOM service, and much can also be tossed. See also
-// individual 1506 comments for details.
+ // Bug 1506 P1-P5: This is the main Torbutton overlay file. Much needs to be
+ // preserved here, but in an ideal world, most of this code should perhaps be
+ // moved into an XPCOM service, and much can also be tossed. See also
+ // individual 1506 comments for details.
-// TODO: check for leaks: http://www.mozilla.org/scriptable/avoiding-leaks.html
-// TODO: Double-check there are no strange exploits to defeat:
-// http://kb.mozillazine.org/Links_to_local_pages_don%27t_work
+ // TODO: check for leaks: http://www.mozilla.org/scriptable/avoiding-leaks.html
+ // TODO: Double-check there are no strange exploits to defeat:
+ // http://kb.mozillazine.org/Links_to_local_pages_don%27t_work
-/* global gBrowser, CustomizableUI,
+ /* global gBrowser, CustomizableUI,
createTorCircuitDisplay, gFindBarInitialized,
gFindBar, OpenBrowserWindow, PrivateBrowsingUtils,
Services, AppConstants
*/
-let {
- show_torbrowser_manual,
- unescapeTorString,
- bindPrefAndInit,
- getDomainForBrowser,
- torbutton_safelog,
- torbutton_log,
- torbutton_get_property_string,
-} = ChromeUtils.import("resource://torbutton/modules/utils.js", {});
-let { configureControlPortModule, wait_for_controller } = Cu.import("resource://torbutton/modules/tor-control-port.js", {});
-
-const k_tb_tor_check_failed_topic = "Torbutton:TorCheckFailed";
-
-var m_tb_prefs = Services.prefs;
-
-// status
-var m_tb_wasinited = false;
-var m_tb_is_main_window = false;
-
-var m_tb_control_ipc_file = null; // Set if using IPC (UNIX domain socket).
-var m_tb_control_port = null; // Set if using TCP.
-var m_tb_control_host = null; // Set if using TCP.
-var m_tb_control_pass = null;
-var m_tb_control_desc = null; // For logging.
-
-var m_tb_domWindowUtils = window.windowUtils;
-
-async function clearData(flags) {
- return new Promise((resolve, reject) => {
- Services.clearData.deleteData(flags, {
- onDataDeleted(code) {
- if (code === Cr.NS_OK) {
- resolve();
- } else {
- reject(new Error(`Error deleting data with flags ${flags}: ${code}`));
- }
- },
- });
- });
-}
-
-// Bug 1506 P2: This object keeps Firefox prefs in sync with Torbutton prefs.
-// It probably could stand some simplification (See #3100). It also belongs
-// in a component, not the XUL overlay.
-var torbutton_unique_pref_observer =
-{
- register: function()
- {
- this.forced_ua = false;
- m_tb_prefs.addObserver("extensions.torbutton", this, false);
- m_tb_prefs.addObserver("browser.privatebrowsing.autostart", this, false);
- m_tb_prefs.addObserver("javascript", this, false);
- m_tb_prefs.addObserver("privacy.resistFingerprinting", this, false);
- m_tb_prefs.addObserver("privacy.resistFingerprinting.letterboxing", this, false);
+ let {
+ show_torbrowser_manual,
+ unescapeTorString,
+ bindPrefAndInit,
+ getDomainForBrowser,
+ torbutton_log,
+ torbutton_get_property_string,
+ } = ChromeUtils.import("resource://torbutton/modules/utils.js");
+ let { configureControlPortModule, wait_for_controller } = ChromeUtils.import(
+ "resource://torbutton/modules/tor-control-port.js"
+ );
+
+ const k_tb_tor_check_failed_topic = "Torbutton:TorCheckFailed";
+
+ var m_tb_prefs = Services.prefs;
+
+ // status
+ var m_tb_wasinited = false;
+ var m_tb_is_main_window = false;
+
+ var m_tb_control_ipc_file = null; // Set if using IPC (UNIX domain socket).
+ var m_tb_control_port = null; // Set if using TCP.
+ var m_tb_control_host = null; // Set if using TCP.
+ var m_tb_control_pass = null;
+
+ // Bug 1506 P2: This object keeps Firefox prefs in sync with Torbutton prefs.
+ // It probably could stand some simplification (See #3100). It also belongs
+ // in a component, not the XUL overlay.
+ var torbutton_unique_pref_observer = {
+ register() {
+ this.forced_ua = false;
+ m_tb_prefs.addObserver("extensions.torbutton", this);
+ m_tb_prefs.addObserver("browser.privatebrowsing.autostart", this);
+ m_tb_prefs.addObserver("javascript", this);
+ m_tb_prefs.addObserver("privacy.resistFingerprinting", this);
+ m_tb_prefs.addObserver("privacy.resistFingerprinting.letterboxing", this);
},
- unregister: function()
- {
- m_tb_prefs.removeObserver("extensions.torbutton", this);
- m_tb_prefs.removeObserver("browser.privatebrowsing.autostart", this);
- m_tb_prefs.removeObserver("javascript", this);
- m_tb_prefs.removeObserver("privacy.resistFingerprinting", this);
- m_tb_prefs.removeObserver("privacy.resistFingerprinting.letterboxing", this);
+ unregister() {
+ m_tb_prefs.removeObserver("extensions.torbutton", this);
+ m_tb_prefs.removeObserver("browser.privatebrowsing.autostart", this);
+ m_tb_prefs.removeObserver("javascript", this);
+ m_tb_prefs.removeObserver("privacy.resistFingerprinting", this);
+ m_tb_prefs.removeObserver(
+ "privacy.resistFingerprinting.letterboxing",
+ this
+ );
},
// topic: what event occurred
// subject: what nsIPrefBranch we're observing
// data: which pref has been changed (relative to subject)
- observe: function(subject, topic, data)
- {
- if (topic !== "nsPref:changed") return;
- switch (data) {
- case "browser.privatebrowsing.autostart":
- torbutton_update_disk_prefs();
- break;
- case "extensions.torbutton.use_nontor_proxy":
- torbutton_use_nontor_proxy();
- break;
- case "privacy.resistFingerprinting":
- case "privacy.resistFingerprinting.letterboxing":
- torbutton_update_fingerprinting_prefs();
- break;
- }
- }
-}
+ observe(subject, topic, data) {
+ if (topic !== "nsPref:changed") {
+ return;
+ }
+ switch (data) {
+ case "browser.privatebrowsing.autostart":
+ torbutton_update_disk_prefs();
+ break;
+ case "extensions.torbutton.use_nontor_proxy":
+ torbutton_use_nontor_proxy();
+ break;
+ case "privacy.resistFingerprinting":
+ case "privacy.resistFingerprinting.letterboxing":
+ torbutton_update_fingerprinting_prefs();
+ break;
+ }
+ },
+ };
-var torbutton_tor_check_observer = {
+ var torbutton_tor_check_observer = {
register() {
- this._obsSvc = Services.obs;
- this._obsSvc.addObserver(this, k_tb_tor_check_failed_topic);
+ this._obsSvc = Services.obs;
+ this._obsSvc.addObserver(this, k_tb_tor_check_failed_topic);
},
- unregister: function()
- {
- if (this._obsSvc)
- this._obsSvc.removeObserver(this, k_tb_tor_check_failed_topic);
+ unregister() {
+ if (this._obsSvc) {
+ this._obsSvc.removeObserver(this, k_tb_tor_check_failed_topic);
+ }
},
- observe: function(subject, topic, data)
- {
+ observe(subject, topic, data) {
if (topic === k_tb_tor_check_failed_topic) {
// Update all open about:tor pages.
torbutton_abouttor_message_handler.updateAllOpenPages();
@@ -129,9 +113,9 @@ var torbutton_tor_check_observer = {
if (win == window) {
let foundTab = false;
let tabBrowser = top.gBrowser;
- for (let i = 0; !foundTab && (i < tabBrowser.browsers.length); ++i) {
+ for (let i = 0; !foundTab && i < tabBrowser.browsers.length; ++i) {
let b = tabBrowser.getBrowserAtIndex(i);
- foundTab = (b.currentURI.spec.toLowerCase() == "about:tor");
+ foundTab = b.currentURI.spec.toLowerCase() == "about:tor";
}
if (!foundTab) {
@@ -140,82 +124,102 @@ var torbutton_tor_check_observer = {
}
}
},
-};
+ };
-var torbutton_new_identity_observers = {
- register() {
- Services.obs.addObserver(this, "new-identity-requested");
- },
+ var torbutton_new_identity_observers = {
+ register() {
+ Services.obs.addObserver(this, "new-identity-requested");
+ },
- observe(aSubject, aTopic, aData) {
- if (aTopic !== "new-identity-requested") {
- return;
- }
+ observe(aSubject, aTopic, aData) {
+ if (aTopic !== "new-identity-requested") {
+ return;
+ }
- // Clear the domain isolation state.
- torbutton_log(3, "Clearing domain isolator");
- const domainIsolator = Cc["@torproject.org/domain-isolator;1"].getService(
- Ci.nsISupports
- ).wrappedJSObject;
- domainIsolator.clearIsolation();
-
- torbutton_log(3, "New Identity: Sending NEWNYM");
- // We only support TBB for newnym.
- if (!m_tb_control_pass || (!m_tb_control_ipc_file && !m_tb_control_port)) {
- var warning = torbutton_get_property_string("torbutton.popup.no_newnym");
- torbutton_log(5, "Torbutton cannot safely newnym. It does not have access to the Tor Control Port.");
- window.alert(warning);
- } else {
- var warning = torbutton_get_property_string("torbutton.popup.no_newnym");
- torbutton_send_ctrl_cmd("SIGNAL NEWNYM").then(res => {
- if (!res) {
- torbutton_log(5, "Torbutton was unable to request a new circuit from Tor");
- window.alert(warning);
- }
- }).catch(e => {
- torbutton_log(5, "Torbutton was unable to request a new circuit from Tor " + e);
+ // Clear the domain isolation state.
+ torbutton_log(3, "Clearing domain isolator");
+ const domainIsolator = Cc["@torproject.org/domain-isolator;1"].getService(
+ Ci.nsISupports
+ ).wrappedJSObject;
+ domainIsolator.clearIsolation();
+
+ torbutton_log(3, "New Identity: Sending NEWNYM");
+ // We only support TBB for newnym.
+ if (
+ !m_tb_control_pass ||
+ (!m_tb_control_ipc_file && !m_tb_control_port)
+ ) {
+ const warning = torbutton_get_property_string(
+ "torbutton.popup.no_newnym"
+ );
+ torbutton_log(
+ 5,
+ "Torbutton cannot safely newnym. It does not have access to the Tor Control Port."
+ );
window.alert(warning);
- });
- }
- },
-}
+ } else {
+ const warning = torbutton_get_property_string(
+ "torbutton.popup.no_newnym"
+ );
+ torbutton_send_ctrl_cmd("SIGNAL NEWNYM")
+ .then(res => {
+ if (!res) {
+ torbutton_log(
+ 5,
+ "Torbutton was unable to request a new circuit from Tor"
+ );
+ window.alert(warning);
+ }
+ })
+ .catch(e => {
+ torbutton_log(
+ 5,
+ "Torbutton was unable to request a new circuit from Tor " + e
+ );
+ window.alert(warning);
+ });
+ }
+ },
+ };
-function torbutton_is_mobile() {
+ function torbutton_is_mobile() {
return Services.appinfo.OS === "Android";
-}
+ }
-// Bug 1506 P2-P4: This code sets some version variables that are irrelevant.
-// It does read out some important environment variables, though. It is
-// called once per browser window.. This might belong in a component.
-torbutton_init = function() {
- torbutton_log(3, 'called init()');
+ // Bug 1506 P2-P4: This code sets some version variables that are irrelevant.
+ // It does read out some important environment variables, though. It is
+ // called once per browser window.. This might belong in a component.
+ torbutton_init = function() {
+ torbutton_log(3, "called init()");
if (m_tb_wasinited) {
- return;
+ return;
}
m_tb_wasinited = true;
let tlps;
try {
- tlps = Cc["@torproject.org/torlauncher-protocol-service;1"]
- .getService(Ci.nsISupports).wrappedJSObject;
- } catch(e) {}
+ tlps = Cc["@torproject.org/torlauncher-protocol-service;1"].getService(
+ Ci.nsISupports
+ ).wrappedJSObject;
+ } catch (e) {}
// Bug 1506 P4: These vars are very important for New Identity
- var environ = Cc["@mozilla.org/process/environment;1"]
- .getService(Ci.nsIEnvironment);
+ var environ = Cc["@mozilla.org/process/environment;1"].getService(
+ Ci.nsIEnvironment
+ );
if (environ.exists("TOR_CONTROL_PASSWD")) {
- m_tb_control_pass = environ.get("TOR_CONTROL_PASSWD");
+ m_tb_control_pass = environ.get("TOR_CONTROL_PASSWD");
} else if (environ.exists("TOR_CONTROL_COOKIE_AUTH_FILE")) {
- var cookie_path = environ.get("TOR_CONTROL_COOKIE_AUTH_FILE");
- try {
- if ("" != cookie_path) {
- m_tb_control_pass = torbutton_read_authentication_cookie(cookie_path);
- }
- } catch(e) {
- torbutton_log(4, 'unable to read authentication cookie');
+ var cookie_path = environ.get("TOR_CONTROL_COOKIE_AUTH_FILE");
+ try {
+ if ("" != cookie_path) {
+ m_tb_control_pass = torbutton_read_authentication_cookie(cookie_path);
}
+ } catch (e) {
+ torbutton_log(4, "unable to read authentication cookie");
+ }
} else {
try {
// Try to get password from Tor Launcher.
@@ -227,47 +231,47 @@ torbutton_init = function() {
// since Tor Launcher knows how to handle its own preferences and how to
// resolve relative paths.
try {
- m_tb_control_ipc_file = tlps.TorGetControlIPCFile();
- } catch(e) {}
-
- if (m_tb_control_ipc_file) {
- m_tb_control_desc = m_tb_control_ipc_file.path;
- } else {
- if (environ.exists("TOR_CONTROL_PORT")) {
- m_tb_control_port = environ.get("TOR_CONTROL_PORT");
- } else {
- try {
- const kTLControlPortPref = "extensions.torlauncher.control_port";
- m_tb_control_port = m_tb_prefs.getIntPref(kTLControlPortPref);
- } catch(e) {
- // Since we want to disable some features when Tor Launcher is
- // not installed (e.g., New Identity), we do not set a default
- // port value here.
- }
- }
+ m_tb_control_ipc_file = tlps.TorGetControlIPCFile();
+ } catch (e) {}
- if (m_tb_control_port) {
- m_tb_control_desc = "" + m_tb_control_port;
+ if (!m_tb_control_ipc_file) {
+ if (environ.exists("TOR_CONTROL_PORT")) {
+ m_tb_control_port = environ.get("TOR_CONTROL_PORT");
+ } else {
+ try {
+ const kTLControlPortPref = "extensions.torlauncher.control_port";
+ m_tb_control_port = m_tb_prefs.getIntPref(kTLControlPortPref);
+ } catch (e) {
+ // Since we want to disable some features when Tor Launcher is
+ // not installed (e.g., New Identity), we do not set a default
+ // port value here.
}
+ }
- if (environ.exists("TOR_CONTROL_HOST")) {
- m_tb_control_host = environ.get("TOR_CONTROL_HOST");
- } else {
- try {
- const kTLControlHostPref = "extensions.torlauncher.control_host";
- m_tb_control_host = m_tb_prefs.getCharPref(kTLControlHostPref);
- } catch(e) {
- m_tb_control_host = "127.0.0.1";
- }
+ if (environ.exists("TOR_CONTROL_HOST")) {
+ m_tb_control_host = environ.get("TOR_CONTROL_HOST");
+ } else {
+ try {
+ const kTLControlHostPref = "extensions.torlauncher.control_host";
+ m_tb_control_host = m_tb_prefs.getCharPref(kTLControlHostPref);
+ } catch (e) {
+ m_tb_control_host = "127.0.0.1";
}
+ }
}
- configureControlPortModule(m_tb_control_ipc_file, m_tb_control_host,
- m_tb_control_port, m_tb_control_pass);
+ configureControlPortModule(
+ m_tb_control_ipc_file,
+ m_tb_control_host,
+ m_tb_control_port,
+ m_tb_control_pass
+ );
// Add about:tor IPC message listener.
- window.messageManager.addMessageListener("AboutTor:Loaded",
- torbutton_abouttor_message_handler);
+ window.messageManager.addMessageListener(
+ "AboutTor:Loaded",
+ torbutton_abouttor_message_handler
+ );
setupPreferencesForMobile();
@@ -275,361 +279,387 @@ torbutton_init = function() {
torbutton_tor_check_observer.register();
try {
- createTorCircuitDisplay("extensions.torbutton.display_circuit");
- } catch(e) {
- torbutton_log(4, "Error creating the tor circuit display " + e);
+ createTorCircuitDisplay("extensions.torbutton.display_circuit");
+ } catch (e) {
+ torbutton_log(4, "Error creating the tor circuit display " + e);
}
try {
- torbutton_init_user_manual_links();
- } catch(e) {
- torbutton_log(4, "Error loading the user manual " + e);
+ torbutton_init_user_manual_links();
+ } catch (e) {
+ torbutton_log(4, "Error loading the user manual " + e);
}
// Arrange for our about:tor content script to be loaded in each frame.
window.messageManager.loadFrameScript(
- "chrome://torbutton/content/aboutTor/aboutTor-content.js", true);
+ "chrome://torbutton/content/aboutTor/aboutTor-content.js",
+ true
+ );
torbutton_new_identity_observers.register();
- torbutton_log(3, 'init completed');
-}
-
-var torbutton_abouttor_message_handler = {
- // Receive IPC messages from the about:tor content script.
- receiveMessage: async function(aMessage) {
- switch(aMessage.name) {
- case "AboutTor:Loaded":
- aMessage.target.messageManager.sendAsyncMessage("AboutTor:ChromeData",
- await this.getChromeData(true));
- break;
- }
- },
-
- // Send privileged data to all of the about:tor content scripts.
- updateAllOpenPages: async function() {
- window.messageManager.broadcastAsyncMessage("AboutTor:ChromeData",
- await this.getChromeData(false));
- },
-
- // The chrome data contains all of the data needed by the about:tor
- // content process that is only available here (in the chrome process).
- // It is sent to the content process when an about:tor window is opened
- // and in response to events such as the browser noticing that Tor is
- // not working.
- getChromeData: async function(aIsRespondingToPageLoad) {
- let dataObj = {
- mobile: torbutton_is_mobile(),
- updateChannel: AppConstants.MOZ_UPDATE_CHANNEL,
- torOn: await torbutton_tor_check_ok()
- };
-
- if (aIsRespondingToPageLoad) {
- const kShouldNotifyPref = "torbrowser.post_update.shouldNotify";
- if (m_tb_prefs.getBoolPref(kShouldNotifyPref, false)) {
- m_tb_prefs.clearUserPref(kShouldNotifyPref);
- dataObj.hasBeenUpdated = true;
- dataObj.updateMoreInfoURL = this.getUpdateMoreInfoURL();
+ torbutton_log(3, "init completed");
+ };
+
+ var torbutton_abouttor_message_handler = {
+ // Receive IPC messages from the about:tor content script.
+ async receiveMessage(aMessage) {
+ switch (aMessage.name) {
+ case "AboutTor:Loaded":
+ aMessage.target.messageManager.sendAsyncMessage(
+ "AboutTor:ChromeData",
+ await this.getChromeData(true)
+ );
+ break;
}
- }
+ },
- return dataObj;
- },
+ // Send privileged data to all of the about:tor content scripts.
+ async updateAllOpenPages() {
+ window.messageManager.broadcastAsyncMessage(
+ "AboutTor:ChromeData",
+ await this.getChromeData(false)
+ );
+ },
- getUpdateMoreInfoURL: function() {
- try {
- return Services.prefs.getCharPref("torbrowser.post_update.url");
- } catch (e) {}
+ // The chrome data contains all of the data needed by the about:tor
+ // content process that is only available here (in the chrome process).
+ // It is sent to the content process when an about:tor window is opened
+ // and in response to events such as the browser noticing that Tor is
+ // not working.
+ async getChromeData(aIsRespondingToPageLoad) {
+ let dataObj = {
+ mobile: torbutton_is_mobile(),
+ updateChannel: AppConstants.MOZ_UPDATE_CHANNEL,
+ torOn: await torbutton_tor_check_ok(),
+ };
+
+ if (aIsRespondingToPageLoad) {
+ const kShouldNotifyPref = "torbrowser.post_update.shouldNotify";
+ if (m_tb_prefs.getBoolPref(kShouldNotifyPref, false)) {
+ m_tb_prefs.clearUserPref(kShouldNotifyPref);
+ dataObj.hasBeenUpdated = true;
+ dataObj.updateMoreInfoURL = this.getUpdateMoreInfoURL();
+ }
+ }
+
+ return dataObj;
+ },
- // Use the default URL as a fallback.
- return Services.urlFormatter.formatURLPref("startup.homepage_override_url");
+ getUpdateMoreInfoURL() {
+ try {
+ return Services.prefs.getCharPref("torbrowser.post_update.url");
+ } catch (e) {}
+
+ // Use the default URL as a fallback.
+ return Services.urlFormatter.formatURLPref(
+ "startup.homepage_override_url"
+ );
+ },
+ };
+
+ // Bug 1506 P4: Control port interaction. Needed for New Identity.
+ function torbutton_read_authentication_cookie(path) {
+ var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
+ file.initWithPath(path);
+ var fileStream = Cc[
+ "@mozilla.org/network/file-input-stream;1"
+ ].createInstance(Ci.nsIFileInputStream);
+ fileStream.init(file, 1, 0, false);
+ var binaryStream = Cc["@mozilla.org/binaryinputstream;1"].createInstance(
+ Ci.nsIBinaryInputStream
+ );
+ binaryStream.setInputStream(fileStream);
+ var array = binaryStream.readByteArray(fileStream.available());
+ binaryStream.close();
+ fileStream.close();
+ return torbutton_array_to_hexdigits(array);
}
-};
-
-// Bug 1506 P4: Control port interaction. Needed for New Identity.
-function torbutton_socket_readline(input) {
- var str = "";
- var bytes;
- while((bytes = input.readBytes(1)) != "\n") {
- if (bytes != '\r')
- str += bytes;
+
+ // Bug 1506 P4: Control port interaction. Needed for New Identity.
+ function torbutton_array_to_hexdigits(array) {
+ return array
+ .map(function(c) {
+ return String("0" + c.toString(16)).slice(-2);
+ })
+ .join("");
}
- return str;
-}
-
-// Bug 1506 P4: Control port interaction. Needed for New Identity.
-function torbutton_read_authentication_cookie(path) {
- var file = Cc["@mozilla.org/file/local;1"]
- .createInstance(Ci.nsIFile);
- file.initWithPath(path);
- var fileStream = Cc["@mozilla.org/network/file-input-stream;1"]
- .createInstance(Ci.nsIFileInputStream);
- fileStream.init(file, 1, 0, false);
- var binaryStream = Cc["@mozilla.org/binaryinputstream;1"]
- .createInstance(Ci.nsIBinaryInputStream);
- binaryStream.setInputStream(fileStream);
- var array = binaryStream.readByteArray(fileStream.available());
- binaryStream.close();
- fileStream.close();
- return torbutton_array_to_hexdigits(array);
-}
-
-// Bug 1506 P4: Control port interaction. Needed for New Identity.
-function torbutton_array_to_hexdigits(array) {
- return array.map(function(c) {
- return String("0" + c.toString(16)).slice(-2)
- }).join('');
-};
-
-// Bug 1506 P4: Control port interaction. Needed for New Identity.
-//
-// Asynchronously executes a command on the control port.
-// returns the response as a string, or null on error
-async function torbutton_send_ctrl_cmd(command) {
- const getErrorMessage = e => (e && (e.torMessage || e.message)) || "";
- let response = null;
- try {
- const avoidCache = true;
- let torController = await wait_for_controller(avoidCache);
-
- let bytes = await torController.sendCommand(command);
- if (!bytes.startsWith("250")) {
- throw `Unexpected command response on control port '${bytes}'`;
- }
- response = bytes.slice(4);
- torController.close();
- } catch(err) {
- let msg = getErrorMessage(err);
- torbutton_log(4, `Error: ${msg}`);
+ // Bug 1506 P4: Control port interaction. Needed for New Identity.
+ //
+ // Asynchronously executes a command on the control port.
+ // returns the response as a string, or null on error
+ async function torbutton_send_ctrl_cmd(command) {
+ const getErrorMessage = e => (e && (e.torMessage || e.message)) || "";
+ let response = null;
+ try {
+ const avoidCache = true;
+ let torController = await wait_for_controller(avoidCache);
+
+ let bytes = await torController.sendCommand(command);
+ if (!bytes.startsWith("250")) {
+ throw new Error(
+ `Unexpected command response on control port '${bytes}'`
+ );
+ }
+ response = bytes.slice(4);
+
+ torController.close();
+ } catch (err) {
+ let msg = getErrorMessage(err);
+ torbutton_log(4, `Error: ${msg}`);
+ }
+ return response;
}
- return response;
-}
-// Bug 1506 P4: Needed for New IP Address
-torbutton_new_circuit = function() {
- let firstPartyDomain = getDomainForBrowser(gBrowser.selectedBrowser);
+ // Bug 1506 P4: Needed for New IP Address
+ torbutton_new_circuit = function() {
+ let firstPartyDomain = getDomainForBrowser(gBrowser.selectedBrowser);
- let domainIsolator = Cc["@torproject.org/domain-isolator;1"]
- .getService(Ci.nsISupports).wrappedJSObject;
+ let domainIsolator = Cc["@torproject.org/domain-isolator;1"].getService(
+ Ci.nsISupports
+ ).wrappedJSObject;
- domainIsolator.newCircuitForDomain(firstPartyDomain);
+ domainIsolator.newCircuitForDomain(firstPartyDomain);
- gBrowser.reloadWithFlags(Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE);
-}
+ gBrowser.reloadWithFlags(Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE);
+ };
-/* Called when we switch the use_nontor_proxy pref in either direction.
- *
- * Enables/disables domain isolation and then does new identity
- */
-function torbutton_use_nontor_proxy()
-{
- let domainIsolator = Cc["@torproject.org/domain-isolator;1"]
- .getService(Ci.nsISupports).wrappedJSObject;
-
- if (m_tb_prefs.getBoolPref("extensions.torbutton.use_nontor_proxy")) {
- // Disable domain isolation
- domainIsolator.disableIsolation();
- } else {
- domainIsolator.enableIsolation();
+ /* Called when we switch the use_nontor_proxy pref in either direction.
+ *
+ * Enables/disables domain isolation and then does new identity
+ */
+ function torbutton_use_nontor_proxy() {
+ let domainIsolator = Cc["@torproject.org/domain-isolator;1"].getService(
+ Ci.nsISupports
+ ).wrappedJSObject;
+
+ if (m_tb_prefs.getBoolPref("extensions.torbutton.use_nontor_proxy")) {
+ // Disable domain isolation
+ domainIsolator.disableIsolation();
+ } else {
+ domainIsolator.enableIsolation();
+ }
}
-}
-
-async function torbutton_do_tor_check()
-{
- let checkSvc = Cc["@torproject.org/torbutton-torCheckService;1"]
- .getService(Ci.nsISupports).wrappedJSObject;
- if (m_tb_prefs.getBoolPref("extensions.torbutton.use_nontor_proxy") ||
- !m_tb_prefs.getBoolPref("extensions.torbutton.test_enabled"))
- return; // Only do the check once.
-
- // If we have a tor control port and transparent torification is off,
- // perform a check via the control port.
- const kEnvSkipControlPortTest = "TOR_SKIP_CONTROLPORTTEST";
- const kEnvUseTransparentProxy = "TOR_TRANSPROXY";
- var env = Cc["@mozilla.org/process/environment;1"]
- .getService(Ci.nsIEnvironment);
- if ((m_tb_control_ipc_file || m_tb_control_port) &&
+
+ async function torbutton_do_tor_check() {
+ let checkSvc = Cc["@torproject.org/torbutton-torCheckService;1"].getService(
+ Ci.nsISupports
+ ).wrappedJSObject;
+ if (
+ m_tb_prefs.getBoolPref("extensions.torbutton.use_nontor_proxy") ||
+ !m_tb_prefs.getBoolPref("extensions.torbutton.test_enabled")
+ ) {
+ return;
+ } // Only do the check once.
+
+ // If we have a tor control port and transparent torification is off,
+ // perform a check via the control port.
+ const kEnvSkipControlPortTest = "TOR_SKIP_CONTROLPORTTEST";
+ const kEnvUseTransparentProxy = "TOR_TRANSPROXY";
+ var env = Cc["@mozilla.org/process/environment;1"].getService(
+ Ci.nsIEnvironment
+ );
+ if (
+ (m_tb_control_ipc_file || m_tb_control_port) &&
!env.exists(kEnvUseTransparentProxy) &&
!env.exists(kEnvSkipControlPortTest) &&
- m_tb_prefs.getBoolPref("extensions.torbutton.local_tor_check")) {
- if (await torbutton_local_tor_check())
- checkSvc.statusOfTorCheck = checkSvc.kCheckSuccessful;
- else {
- // The check failed. Update toolbar icon and tooltip.
- checkSvc.statusOfTorCheck = checkSvc.kCheckFailed;
+ m_tb_prefs.getBoolPref("extensions.torbutton.local_tor_check")
+ ) {
+ if (await torbutton_local_tor_check()) {
+ checkSvc.statusOfTorCheck = checkSvc.kCheckSuccessful;
+ } else {
+ // The check failed. Update toolbar icon and tooltip.
+ checkSvc.statusOfTorCheck = checkSvc.kCheckFailed;
+ }
+ } else {
+ // A local check is not possible, so perform a remote check.
+ torbutton_initiate_remote_tor_check();
}
}
- else {
- // A local check is not possible, so perform a remote check.
- torbutton_initiate_remote_tor_check();
- }
-}
-
-async function torbutton_local_tor_check()
-{
- let didLogError = false;
-
- let proxyType = m_tb_prefs.getIntPref("network.proxy.type");
- if (0 == proxyType)
- return false;
-
- // Ask tor for its SOCKS listener address and port and compare to the
- // browser preferences.
- const kCmdArg = "net/listeners/socks";
- let resp = await torbutton_send_ctrl_cmd("GETINFO " + kCmdArg);
- if (!resp)
- return false;
-
- function logUnexpectedResponse()
- {
- if (!didLogError) {
- didLogError = true;
- torbutton_log(5, "Local Tor check: unexpected GETINFO response: " + resp);
+
+ async function torbutton_local_tor_check() {
+ let didLogError = false;
+
+ let proxyType = m_tb_prefs.getIntPref("network.proxy.type");
+ if (0 == proxyType) {
+ return false;
}
- }
- function removeBrackets(aStr)
- {
- // Remove enclosing square brackets if present.
- if (aStr.startsWith('[') && aStr.endsWith(']'))
- return aStr.substr(1, aStr.length - 2);
+ // Ask tor for its SOCKS listener address and port and compare to the
+ // browser preferences.
+ const kCmdArg = "net/listeners/socks";
+ let resp = await torbutton_send_ctrl_cmd("GETINFO " + kCmdArg);
+ if (!resp) {
+ return false;
+ }
- return aStr;
- }
+ function logUnexpectedResponse() {
+ if (!didLogError) {
+ didLogError = true;
+ torbutton_log(
+ 5,
+ "Local Tor check: unexpected GETINFO response: " + resp
+ );
+ }
+ }
- // Sample response: net/listeners/socks="127.0.0.1:9149" "127.0.0.1:9150"
- // First, check for and remove the command argument prefix.
- if (0 != resp.indexOf(kCmdArg + '=')) {
- logUnexpectedResponse();
- return false;
- }
- resp = resp.substr(kCmdArg.length + 1);
-
- // Retrieve configured proxy settings and check each listener against them.
- // When the SOCKS prefs are set to use IPC (e.g., a Unix domain socket), a
- // file URL should be present in network.proxy.socks.
- // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1211567
- let socksAddr = m_tb_prefs.getCharPref("network.proxy.socks");
- let socksPort = m_tb_prefs.getIntPref("network.proxy.socks_port");
- let socksIPCPath;
- if (socksAddr && socksAddr.startsWith("file:")) {
- // Convert the file URL to a file path.
- try {
- let ioService = Services.io;
- let fph = ioService.getProtocolHandler("file")
- .QueryInterface(Ci.nsIFileProtocolHandler);
- socksIPCPath = fph.getFileFromURLSpec(socksAddr).path;
- } catch (e) {
- torbutton_log(5, "Local Tor check: IPC file error: " + e);
+ function removeBrackets(aStr) {
+ // Remove enclosing square brackets if present.
+ if (aStr.startsWith("[") && aStr.endsWith("]")) {
+ return aStr.substr(1, aStr.length - 2);
+ }
+
+ return aStr;
+ }
+
+ // Sample response: net/listeners/socks="127.0.0.1:9149" "127.0.0.1:9150"
+ // First, check for and remove the command argument prefix.
+ if (0 != resp.indexOf(kCmdArg + "=")) {
+ logUnexpectedResponse();
return false;
}
- } else {
- socksAddr = removeBrackets(socksAddr);
- }
+ resp = resp.substr(kCmdArg.length + 1);
+
+ // Retrieve configured proxy settings and check each listener against them.
+ // When the SOCKS prefs are set to use IPC (e.g., a Unix domain socket), a
+ // file URL should be present in network.proxy.socks.
+ // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1211567
+ let socksAddr = m_tb_prefs.getCharPref("network.proxy.socks");
+ let socksPort = m_tb_prefs.getIntPref("network.proxy.socks_port");
+ let socksIPCPath;
+ if (socksAddr && socksAddr.startsWith("file:")) {
+ // Convert the file URL to a file path.
+ try {
+ let ioService = Services.io;
+ let fph = ioService
+ .getProtocolHandler("file")
+ .QueryInterface(Ci.nsIFileProtocolHandler);
+ socksIPCPath = fph.getFileFromURLSpec(socksAddr).path;
+ } catch (e) {
+ torbutton_log(5, "Local Tor check: IPC file error: " + e);
+ return false;
+ }
+ } else {
+ socksAddr = removeBrackets(socksAddr);
+ }
+
+ // Split into quoted strings. This code is adapted from utils.splitAtSpaces()
+ // within tor-control-port.js; someday this code should use the entire
+ // tor-control-port.js framework.
+ let addrArray = [];
+ resp.replace(/((\S*?"(.*?)")+\S*|\S+)/g, function(a, captured) {
+ addrArray.push(captured);
+ });
- // Split into quoted strings. This code is adapted from utils.splitAtSpaces()
- // within tor-control-port.js; someday this code should use the entire
- // tor-control-port.js framework.
- let addrArray = [];
- resp.replace(/((\S*?"(.*?)")+\S*|\S+)/g, function (a, captured) {
- addrArray.push(captured);
- });
-
- let foundSocksListener = false;
- for (let i = 0; !foundSocksListener && (i < addrArray.length); ++i) {
- let addr;
- try { addr = unescapeTorString(addrArray[i]); } catch (e) {}
- if (!addr)
- continue;
-
- // Remove double quotes if present.
- let len = addr.length;
- if ((len > 2) && ('"' == addr.charAt(0)) && ('"' == addr.charAt(len - 1)))
- addr = addr.substring(1, len - 1);
-
- if (addr.startsWith("unix:")) {
- if (!socksIPCPath)
+ let foundSocksListener = false;
+ for (let i = 0; !foundSocksListener && i < addrArray.length; ++i) {
+ let addr;
+ try {
+ addr = unescapeTorString(addrArray[i]);
+ } catch (e) {}
+ if (!addr) {
continue;
+ }
- // Check against the configured UNIX domain socket proxy.
- let path = addr.substring(5);
- torbutton_log(2, "Tor socks listener (Unix domain socket): " + path);
- foundSocksListener = (socksIPCPath === path);
- } else if (!socksIPCPath) {
- // Check against the configured TCP proxy. We expect addr:port where addr
- // may be an IPv6 address; that is, it may contain colon characters.
- // Also, we remove enclosing square brackets before comparing addresses
- // because tor requires them but Firefox does not.
- let idx = addr.lastIndexOf(':');
- if (idx < 0) {
- logUnexpectedResponse();
- } else {
- let torSocksAddr = removeBrackets(addr.substring(0, idx));
- let torSocksPort = parseInt(addr.substring(idx + 1), 10);
- if ((torSocksAddr.length < 1) || isNaN(torSocksPort)) {
+ // Remove double quotes if present.
+ let len = addr.length;
+ if (len > 2 && '"' == addr.charAt(0) && '"' == addr.charAt(len - 1)) {
+ addr = addr.substring(1, len - 1);
+ }
+
+ if (addr.startsWith("unix:")) {
+ if (!socksIPCPath) {
+ continue;
+ }
+
+ // Check against the configured UNIX domain socket proxy.
+ let path = addr.substring(5);
+ torbutton_log(2, "Tor socks listener (Unix domain socket): " + path);
+ foundSocksListener = socksIPCPath === path;
+ } else if (!socksIPCPath) {
+ // Check against the configured TCP proxy. We expect addr:port where addr
+ // may be an IPv6 address; that is, it may contain colon characters.
+ // Also, we remove enclosing square brackets before comparing addresses
+ // because tor requires them but Firefox does not.
+ let idx = addr.lastIndexOf(":");
+ if (idx < 0) {
logUnexpectedResponse();
} else {
- torbutton_log(2, "Tor socks listener: " + torSocksAddr + ':'
- + torSocksPort);
- foundSocksListener = ((socksAddr === torSocksAddr) &&
- (socksPort === torSocksPort));
+ let torSocksAddr = removeBrackets(addr.substring(0, idx));
+ let torSocksPort = parseInt(addr.substring(idx + 1), 10);
+ if (torSocksAddr.length < 1 || isNaN(torSocksPort)) {
+ logUnexpectedResponse();
+ } else {
+ torbutton_log(
+ 2,
+ "Tor socks listener: " + torSocksAddr + ":" + torSocksPort
+ );
+ foundSocksListener =
+ socksAddr === torSocksAddr && socksPort === torSocksPort;
+ }
}
}
}
- }
-
- return foundSocksListener;
-} // torbutton_local_tor_check
+ return foundSocksListener;
+ } // torbutton_local_tor_check
-function torbutton_initiate_remote_tor_check() {
- let obsSvc = Services.obs;
- try {
- let checkSvc = Cc["@torproject.org/torbutton-torCheckService;1"]
- .getService(Ci.nsISupports).wrappedJSObject;
+ function torbutton_initiate_remote_tor_check() {
+ let obsSvc = Services.obs;
+ try {
+ let checkSvc = Cc[
+ "@torproject.org/torbutton-torCheckService;1"
+ ].getService(Ci.nsISupports).wrappedJSObject;
let req = checkSvc.createCheckRequest(true); // async
- req.onreadystatechange = function (aEvent) {
- if (req.readyState === 4) {
- let ret = checkSvc.parseCheckResponse(req);
-
- // If we received an error response from check.torproject.org,
- // set the status of the tor check to failure (we don't want
- // to indicate failure if we didn't receive a response).
- if (ret == 2 || ret == 3 || ret == 5 || ret == 6
- || ret == 7 || ret == 8) {
- checkSvc.statusOfTorCheck = checkSvc.kCheckFailed;
- obsSvc.notifyObservers(null, k_tb_tor_check_failed_topic, null);
- } else if (ret == 4) {
- checkSvc.statusOfTorCheck = checkSvc.kCheckSuccessful;
- } // Otherwise, redo the check later
-
- torbutton_log(3, "Tor remote check done. Result: " + ret);
- }
+ req.onreadystatechange = function(aEvent) {
+ if (req.readyState === 4) {
+ let ret = checkSvc.parseCheckResponse(req);
+
+ // If we received an error response from check.torproject.org,
+ // set the status of the tor check to failure (we don't want
+ // to indicate failure if we didn't receive a response).
+ if (
+ ret == 2 ||
+ ret == 3 ||
+ ret == 5 ||
+ ret == 6 ||
+ ret == 7 ||
+ ret == 8
+ ) {
+ checkSvc.statusOfTorCheck = checkSvc.kCheckFailed;
+ obsSvc.notifyObservers(null, k_tb_tor_check_failed_topic);
+ } else if (ret == 4) {
+ checkSvc.statusOfTorCheck = checkSvc.kCheckSuccessful;
+ } // Otherwise, redo the check later
+
+ torbutton_log(3, "Tor remote check done. Result: " + ret);
+ }
};
torbutton_log(3, "Sending async Tor remote check");
req.send(null);
- } catch(e) {
- if (e.result == 0x80004005) // NS_ERROR_FAILURE
- torbutton_log(5, "Tor check failed! Is tor running?");
- else
- torbutton_log(5, "Tor check failed! Tor internal error: "+e);
-
- checkSvc.statusOfTorCheck = checkSvc.kCheckFailed;
- obsSvc.notifyObservers(null, k_tb_tor_check_failed_topic, null);
- }
-} // torbutton_initiate_remote_tor_check()
+ } catch (e) {
+ if (e.result == 0x80004005) {
+ // NS_ERROR_FAILURE
+ torbutton_log(5, "Tor check failed! Is tor running?");
+ } else {
+ torbutton_log(5, "Tor check failed! Tor internal error: " + e);
+ }
-async function torbutton_tor_check_ok()
-{
- await torbutton_do_tor_check();
- let checkSvc = Cc["@torproject.org/torbutton-torCheckService;1"]
- .getService(Ci.nsISupports).wrappedJSObject;
- return (checkSvc.kCheckFailed != checkSvc.statusOfTorCheck);
-}
+ obsSvc.notifyObservers(null, k_tb_tor_check_failed_topic);
+ }
+ } // torbutton_initiate_remote_tor_check()
-function torbutton_update_disk_prefs() {
+ async function torbutton_tor_check_ok() {
+ await torbutton_do_tor_check();
+ let checkSvc = Cc["@torproject.org/torbutton-torCheckService;1"].getService(
+ Ci.nsISupports
+ ).wrappedJSObject;
+ return checkSvc.kCheckFailed != checkSvc.statusOfTorCheck;
+ }
+
+ function torbutton_update_disk_prefs() {
var mode = m_tb_prefs.getBoolPref("browser.privatebrowsing.autostart");
m_tb_prefs.setBoolPref("browser.cache.disk.enable", !mode);
@@ -647,184 +677,205 @@ function torbutton_update_disk_prefs() {
// Force prefs to be synced to disk
Services.prefs.savePrefFile(null);
-}
+ }
-function torbutton_update_fingerprinting_prefs() {
+ function torbutton_update_fingerprinting_prefs() {
var mode = m_tb_prefs.getBoolPref("privacy.resistFingerprinting");
- var letterboxing = m_tb_prefs.getBoolPref("privacy.resistFingerprinting.letterboxing", false);
- m_tb_prefs.setBoolPref("extensions.torbutton.resize_new_windows", mode && !letterboxing);
+ var letterboxing = m_tb_prefs.getBoolPref(
+ "privacy.resistFingerprinting.letterboxing",
+ false
+ );
+ m_tb_prefs.setBoolPref(
+ "extensions.torbutton.resize_new_windows",
+ mode && !letterboxing
+ );
// Force prefs to be synced to disk
Services.prefs.savePrefFile(null);
-}
-
-// Bug 1506 P1: This function just cleans up prefs that got set badly in previous releases
-function torbutton_fixup_old_prefs()
-{
- if(m_tb_prefs.getIntPref('extensions.torbutton.pref_fixup_version') < 1) {
- // TBB 5.0a3 had bad Firefox code that silently flipped this pref on us
- if (m_tb_prefs.prefHasUserValue("browser.newtabpage.enhanced")) {
- m_tb_prefs.clearUserPref("browser.newtabpage.enhanced");
- // TBB 5.0a3 users had all the necessary data cached in
- // directoryLinks.json. This meant that resetting the pref above
- // alone was not sufficient as the tiles features uses the cache
- // even if the pref indicates that feature should be disabled.
- // We flip the preference below as this forces a refetching which
- // effectively results in an empty JSON file due to our spoofed
- // URLs.
- let matchOS = m_tb_prefs.getBoolPref("intl.locale.matchOS");
- m_tb_prefs.setBoolPref("intl.locale.matchOS", !matchOS);
- m_tb_prefs.setBoolPref("intl.locale.matchOS", matchOS);
- }
+ }
- // For some reason, the Share This Page button also survived the
- // TBB 5.0a4 update's attempt to remove it.
- if (m_tb_prefs.prefHasUserValue("browser.uiCustomization.state")) {
- m_tb_prefs.clearUserPref("browser.uiCustomization.state");
- }
+ // Bug 1506 P1: This function just cleans up prefs that got set badly in previous releases
+ function torbutton_fixup_old_prefs() {
+ if (m_tb_prefs.getIntPref("extensions.torbutton.pref_fixup_version") < 1) {
+ // TBB 5.0a3 had bad Firefox code that silently flipped this pref on us
+ if (m_tb_prefs.prefHasUserValue("browser.newtabpage.enhanced")) {
+ m_tb_prefs.clearUserPref("browser.newtabpage.enhanced");
+ // TBB 5.0a3 users had all the necessary data cached in
+ // directoryLinks.json. This meant that resetting the pref above
+ // alone was not sufficient as the tiles features uses the cache
+ // even if the pref indicates that feature should be disabled.
+ // We flip the preference below as this forces a refetching which
+ // effectively results in an empty JSON file due to our spoofed
+ // URLs.
+ let matchOS = m_tb_prefs.getBoolPref("intl.locale.matchOS");
+ m_tb_prefs.setBoolPref("intl.locale.matchOS", !matchOS);
+ m_tb_prefs.setBoolPref("intl.locale.matchOS", matchOS);
+ }
- m_tb_prefs.setIntPref('extensions.torbutton.pref_fixup_version', 1);
+ // For some reason, the Share This Page button also survived the
+ // TBB 5.0a4 update's attempt to remove it.
+ if (m_tb_prefs.prefHasUserValue("browser.uiCustomization.state")) {
+ m_tb_prefs.clearUserPref("browser.uiCustomization.state");
+ }
+
+ m_tb_prefs.setIntPref("extensions.torbutton.pref_fixup_version", 1);
}
-}
+ }
-// ---------------------- Event handlers -----------------
+ // ---------------------- Event handlers -----------------
-// Bug 1506 P1-P3: Most of these observers aren't very important.
-// See their comments for details
-function torbutton_do_main_window_startup()
-{
+ // Bug 1506 P1-P3: Most of these observers aren't very important.
+ // See their comments for details
+ function torbutton_do_main_window_startup() {
torbutton_log(3, "Torbutton main window startup");
m_tb_is_main_window = true;
torbutton_unique_pref_observer.register();
-}
+ }
-// Bug 1506 P4: Most of this function is now useless, save
-// for the very important SOCKS environment vars at the end.
-// Those could probably be rolled into a function with the
-// control port vars, though. See 1506 comments inside.
-function torbutton_do_startup()
-{
- if(m_tb_prefs.getBoolPref("extensions.torbutton.startup")) {
- // Bug 1506: Should probably be moved to an XPCOM component
- torbutton_do_main_window_startup();
+ // Bug 1506 P4: Most of this function is now useless, save
+ // for the very important SOCKS environment vars at the end.
+ // Those could probably be rolled into a function with the
+ // control port vars, though. See 1506 comments inside.
+ function torbutton_do_startup() {
+ if (m_tb_prefs.getBoolPref("extensions.torbutton.startup")) {
+ // Bug 1506: Should probably be moved to an XPCOM component
+ torbutton_do_main_window_startup();
- // For charsets
- torbutton_update_fingerprinting_prefs();
+ // For charsets
+ torbutton_update_fingerprinting_prefs();
- // Bug 30565: sync browser.privatebrowsing.autostart with security.nocertdb
- torbutton_update_disk_prefs();
+ // Bug 30565: sync browser.privatebrowsing.autostart with security.nocertdb
+ torbutton_update_disk_prefs();
- // For general pref fixups to handle pref damage in older versions
- torbutton_fixup_old_prefs();
+ // For general pref fixups to handle pref damage in older versions
+ torbutton_fixup_old_prefs();
- m_tb_prefs.setBoolPref("extensions.torbutton.startup", false);
+ m_tb_prefs.setBoolPref("extensions.torbutton.startup", false);
}
-}
-
-// Bug 1506 P3: Used to decide if we should resize the window.
-//
-// Returns true if the window wind is neither maximized, full screen,
-// ratpoisioned/evilwmed, nor minimized.
-function torbutton_is_windowed(wind) {
- torbutton_log(3, "Window: (" + wind.outerWidth + "," + wind.outerHeight + ") ?= ("
- + wind.screen.availWidth + "," + wind.screen.availHeight + ")");
- if (wind.windowState == Ci.nsIDOMChromeWindow.STATE_MINIMIZED
- || wind.windowState == Ci.nsIDOMChromeWindow.STATE_MAXIMIZED) {
- torbutton_log(2, "Window is minimized/maximized");
- return false;
+ }
+
+ // Bug 1506 P3: Used to decide if we should resize the window.
+ //
+ // Returns true if the window wind is neither maximized, full screen,
+ // ratpoisioned/evilwmed, nor minimized.
+ function torbutton_is_windowed(wind) {
+ torbutton_log(
+ 3,
+ "Window: (" +
+ wind.outerWidth +
+ "," +
+ wind.outerHeight +
+ ") ?= (" +
+ wind.screen.availWidth +
+ "," +
+ wind.screen.availHeight +
+ ")"
+ );
+ if (
+ wind.windowState == Ci.nsIDOMChromeWindow.STATE_MINIMIZED ||
+ wind.windowState == Ci.nsIDOMChromeWindow.STATE_MAXIMIZED
+ ) {
+ torbutton_log(2, "Window is minimized/maximized");
+ return false;
}
if ("fullScreen" in wind && wind.fullScreen) {
- torbutton_log(2, "Window is fullScreen");
- return false;
+ torbutton_log(2, "Window is fullScreen");
+ return false;
}
- if(wind.outerHeight == wind.screen.availHeight
- && wind.outerWidth == wind.screen.availWidth) {
- torbutton_log(3, "Window is ratpoisoned/evilwm'ed");
- return false;
+ if (
+ wind.outerHeight == wind.screen.availHeight &&
+ wind.outerWidth == wind.screen.availWidth
+ ) {
+ torbutton_log(3, "Window is ratpoisoned/evilwm'ed");
+ return false;
}
torbutton_log(2, "Window is normal");
return true;
-}
+ }
-function showSecurityPreferencesPanel(chromeWindow) {
- const tabBrowser = chromeWindow.BrowserApp;
- let settingsTab = null;
+ function showSecurityPreferencesPanel(chromeWindow) {
+ const tabBrowser = chromeWindow.BrowserApp;
+ let settingsTab = null;
- const SECURITY_PREFERENCES_URI = 'chrome://torbutton/content/preferences.xhtml';
+ const SECURITY_PREFERENCES_URI =
+ "chrome://torbutton/content/preferences.xhtml";
- tabBrowser.tabs.some(function (tab) {
+ tabBrowser.tabs.some(function(tab) {
// If the security prefs tab is opened, send the user to it
if (tab.browser.currentURI.spec === SECURITY_PREFERENCES_URI) {
- settingsTab = tab;
- return true;
+ settingsTab = tab;
+ return true;
}
return false;
- });
+ });
- if (settingsTab === null) {
+ if (settingsTab === null) {
// Open up the settings panel in a new tab.
tabBrowser.addTab(SECURITY_PREFERENCES_URI, {
- "selected": true,
- "parentId": tabBrowser.selectedTab.id,
- triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
+ selected: true,
+ parentId: tabBrowser.selectedTab.id,
+ triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
});
- } else {
+ } else {
// Activate an existing settings panel tab.
tabBrowser.selectTab(settingsTab);
+ }
}
-}
-function setupPreferencesForMobile() {
- if (!torbutton_is_mobile()) {
- return;
- }
+ function setupPreferencesForMobile() {
+ if (!torbutton_is_mobile()) {
+ return;
+ }
- torbutton_log(4, "Setting up settings preferences for Android.");
+ torbutton_log(4, "Setting up settings preferences for Android.");
- const chromeWindow = Services.wm.getMostRecentWindow('navigator:browser');
+ const chromeWindow = Services.wm.getMostRecentWindow("navigator:browser");
- // Add the extension's chrome menu item to the main browser menu.
- chromeWindow.NativeWindow.menu.add({
- 'name': torbutton_get_property_string("torbutton.security_settings.menu.title"),
- 'callback': showSecurityPreferencesPanel.bind(this, chromeWindow)
- });
-}
+ // Add the extension's chrome menu item to the main browser menu.
+ chromeWindow.NativeWindow.menu.add({
+ name: torbutton_get_property_string(
+ "torbutton.security_settings.menu.title"
+ ),
+ callback: showSecurityPreferencesPanel.bind(this, chromeWindow),
+ });
+ }
-// Bug 1506 P3: This is needed pretty much only for the window resizing.
-// See comments for individual functions for details
-function torbutton_new_window(event)
-{
+ // Bug 1506 P3: This is needed pretty much only for the window resizing.
+ // See comments for individual functions for details
+ function torbutton_new_window(event) {
torbutton_log(3, "New window");
var browser = window.gBrowser;
- if(!browser) {
+ if (!browser) {
torbutton_log(5, "No browser for new window.");
return;
}
if (!m_tb_wasinited) {
- torbutton_init();
+ torbutton_init();
}
torbutton_do_startup();
- let progress = Cc["@mozilla.org/docloaderservice;1"]
- .getService(Ci.nsIWebProgress);
+ let progress = Cc["@mozilla.org/docloaderservice;1"].getService(
+ Ci.nsIWebProgress
+ );
if (torbutton_is_windowed(window)) {
- progress.addProgressListener(torbutton_resizelistener,
- Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT);
+ progress.addProgressListener(
+ torbutton_resizelistener,
+ Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT
+ );
}
-}
+ }
-// Bug 1506 P2: This is only needed because we have observers
-// in XUL that should be in an XPCOM component
-function torbutton_close_window(event) {
+ // Bug 1506 P2: This is only needed because we have observers
+ // in XUL that should be in an XPCOM component
+ function torbutton_close_window(event) {
torbutton_tor_check_observer.unregister();
- window.removeEventListener("sizemodechange", m_tb_resize_handler,
- false);
+ window.removeEventListener("sizemodechange", m_tb_resize_handler);
// TODO: This is a real ghetto hack.. When the original window
// closes, we need to find another window to handle observing
@@ -832,151 +883,179 @@ function torbutton_close_window(event) {
// majority of torbutton functionality into a XPCOM component..
// But that is a major overhaul..
if (m_tb_is_main_window) {
- torbutton_log(3, "Original window closed. Searching for another");
- var wm = Services.wm;
- var enumerator = wm.getEnumerator("navigator:browser");
- while(enumerator.hasMoreElements()) {
- var win = enumerator.getNext();
- // For some reason, when New Identity is called from a pref
- // observer (ex: torbutton_use_nontor_proxy) on an ASAN build,
- // we sometimes don't have this symbol set in the new window yet.
- // However, the new window will run this init later in that case,
- // as it does in the OSX case.
- if(win != window && "torbutton_do_main_window_startup" in win) {
- torbutton_log(3, "Found another window");
- win.torbutton_do_main_window_startup();
- m_tb_is_main_window = false;
- break;
- }
+ torbutton_log(3, "Original window closed. Searching for another");
+ var wm = Services.wm;
+ var enumerator = wm.getEnumerator("navigator:browser");
+ while (enumerator.hasMoreElements()) {
+ var win = enumerator.getNext();
+ // For some reason, when New Identity is called from a pref
+ // observer (ex: torbutton_use_nontor_proxy) on an ASAN build,
+ // we sometimes don't have this symbol set in the new window yet.
+ // However, the new window will run this init later in that case,
+ // as it does in the OSX case.
+ if (win != window && "torbutton_do_main_window_startup" in win) {
+ torbutton_log(3, "Found another window");
+ win.torbutton_do_main_window_startup();
+ m_tb_is_main_window = false;
+ break;
}
+ }
- torbutton_unique_pref_observer.unregister();
+ torbutton_unique_pref_observer.unregister();
- if(m_tb_is_main_window) { // main window not reset above
- // This happens on Mac OS because they allow firefox
- // to still persist without a navigator window
- torbutton_log(3, "Last window closed. None remain.");
- m_tb_prefs.setBoolPref("extensions.torbutton.startup", true);
- m_tb_is_main_window = false;
- }
+ if (m_tb_is_main_window) {
+ // main window not reset above
+ // This happens on Mac OS because they allow firefox
+ // to still persist without a navigator window
+ torbutton_log(3, "Last window closed. None remain.");
+ m_tb_prefs.setBoolPref("extensions.torbutton.startup", true);
+ m_tb_is_main_window = false;
+ }
}
-}
-
-window.addEventListener('load',torbutton_new_window,false);
-window.addEventListener('unload', torbutton_close_window, false);
-
-var m_tb_resize_handler = null;
-var m_tb_resize_date = null;
-
-// Bug 1506 P1/P3: Setting a fixed window size is important, but
-// probably not for android.
-var torbutton_resizelistener =
-{
- QueryInterface: ChromeUtils.generateQI(["nsIWebProgressListener", "nsISupportsWeakReference"]),
-
- onLocationChange: function(aProgress, aRequest, aURI) {},
- onStateChange: function(aProgress, aRequest, aFlag, aStatus) {
- if (aFlag & Ci.nsIWebProgressListener.STATE_STOP) {
- m_tb_resize_handler = async function() {
- // Wait for end of execution queue to ensure we have correct windowState.
- await new Promise(resolve => setTimeout(resolve, 0));
- if (window.windowState === window.STATE_MAXIMIZED ||
- window.windowState === window.STATE_FULLSCREEN) {
- if (m_tb_prefs.getBoolPref("extensions.torbutton.resize_new_windows") &&
- m_tb_prefs.getIntPref("extensions.torbutton.maximize_warnings_remaining") > 0) {
-
- // Do not add another notification if one is already showing.
- const kNotificationName = "torbutton-maximize-notification";
- let box = gBrowser.getNotificationBox();
- if (box.getNotificationWithValue(kNotificationName))
- return;
-
- // Rate-limit showing our notification if needed.
- if (m_tb_resize_date === null) {
- m_tb_resize_date = Date.now();
- } else {
- // We wait at least another second before we show a new
- // notification. Should be enough to rule out OSes that call our
- // handler rapidly due to internal workings.
- if (Date.now() - m_tb_resize_date < 1000) {
+ }
+
+ window.addEventListener("load", torbutton_new_window);
+ window.addEventListener("unload", torbutton_close_window);
+
+ var m_tb_resize_handler = null;
+ var m_tb_resize_date = null;
+
+ // Bug 1506 P1/P3: Setting a fixed window size is important, but
+ // probably not for android.
+ var torbutton_resizelistener = {
+ QueryInterface: ChromeUtils.generateQI([
+ "nsIWebProgressListener",
+ "nsISupportsWeakReference",
+ ]),
+
+ onLocationChange(aProgress, aRequest, aURI) {},
+ onStateChange(aProgress, aRequest, aFlag, aStatus) {
+ if (aFlag & Ci.nsIWebProgressListener.STATE_STOP) {
+ m_tb_resize_handler = async function() {
+ // Wait for end of execution queue to ensure we have correct windowState.
+ await new Promise(resolve => setTimeout(resolve, 0));
+ if (
+ window.windowState === window.STATE_MAXIMIZED ||
+ window.windowState === window.STATE_FULLSCREEN
+ ) {
+ if (
+ m_tb_prefs.getBoolPref(
+ "extensions.torbutton.resize_new_windows"
+ ) &&
+ m_tb_prefs.getIntPref(
+ "extensions.torbutton.maximize_warnings_remaining"
+ ) > 0
+ ) {
+ // Do not add another notification if one is already showing.
+ const kNotificationName = "torbutton-maximize-notification";
+ let box = gBrowser.getNotificationBox();
+ if (box.getNotificationWithValue(kNotificationName)) {
return;
}
- // Resizing but we need to reset |m_tb_resize_date| now.
- m_tb_resize_date = Date.now();
- }
- // No need to get "OK" translated again.
- let sbSvc = Services.strings;
- let bundle = sbSvc.
- createBundle("chrome://global/locale/commonDialogs.properties");
- let button_label = bundle.GetStringFromName("OK");
-
- let buttons = [{
- label: button_label,
- accessKey: 'O',
- popup: null,
- callback:
- function() {
- m_tb_prefs.setIntPref("extensions.torbutton.maximize_warnings_remaining",
- m_tb_prefs.getIntPref("extensions.torbutton.maximize_warnings_remaining") - 1);
+ // Rate-limit showing our notification if needed.
+ if (m_tb_resize_date === null) {
+ m_tb_resize_date = Date.now();
+ } else {
+ // We wait at least another second before we show a new
+ // notification. Should be enough to rule out OSes that call our
+ // handler rapidly due to internal workings.
+ if (Date.now() - m_tb_resize_date < 1000) {
+ return;
}
- }];
-
- let priority = box.PRIORITY_WARNING_LOW;
- let message =
- torbutton_get_property_string("torbutton.maximize_warning");
+ // Resizing but we need to reset |m_tb_resize_date| now.
+ m_tb_resize_date = Date.now();
+ }
- box.appendNotification(message, kNotificationName, null,
- priority, buttons);
- return;
+ // No need to get "OK" translated again.
+ let sbSvc = Services.strings;
+ let bundle = sbSvc.createBundle(
+ "chrome://global/locale/commonDialogs.properties"
+ );
+ let button_label = bundle.GetStringFromName("OK");
+
+ let buttons = [
+ {
+ label: button_label,
+ accessKey: "O",
+ popup: null,
+ callback() {
+ m_tb_prefs.setIntPref(
+ "extensions.torbutton.maximize_warnings_remaining",
+ m_tb_prefs.getIntPref(
+ "extensions.torbutton.maximize_warnings_remaining"
+ ) - 1
+ );
+ },
+ },
+ ];
+
+ let priority = box.PRIORITY_WARNING_LOW;
+ let message = torbutton_get_property_string(
+ "torbutton.maximize_warning"
+ );
+
+ box.appendNotification(
+ message,
+ kNotificationName,
+ null,
+ priority,
+ buttons
+ );
+ }
}
- }
- }; // m_tb_resize_handler
-
- // We need to handle OSes that auto-maximize windows depending on user
- // settings and/or screen resolution in the start-up phase and users that
- // try to shoot themselves in the foot by maximizing the window manually.
- // We add a listener which is triggerred as soon as the window gets
- // maximized (windowState = 1). We are resizing during start-up but not
- // later as the user should see only a warning there as a stopgap before
- // #14229 lands.
- // Alas, the Firefox window code is handling the event not itself:
- // "// Note the current implementation of SetSizeMode just stores
- // // the new state; it doesn't actually resize. So here we store
- // // the state and pass the event on to the OS."
- // (See: https://mxr.mozilla.org/mozilla-esr31/source/xpfe/appshell/src/
- // nsWebShellWindow.cpp#348)
- // This means we have to cope with race conditions and resizing in the
- // sizemodechange listener is likely to fail. Thus, we add a specific
- // resize listener that is doing the work for us. It seems (at least on
- // Ubuntu) to be the case that maximizing (and then again normalizing) of
- // the window triggers more than one resize event the first being not the
- // one we need. Thus we can't remove the listener after the first resize
- // event got fired. Thus, we have the rather klunky setTimeout() call.
- window.addEventListener("sizemodechange", m_tb_resize_handler, false);
-
- let progress = Cc["@mozilla.org/docloaderservice;1"]
- .getService(Ci.nsIWebProgress);
- progress.removeProgressListener(this);
- }
- }, // onStateChange
-
- onProgressChange: function(aProgress, aRequest, curSelfProgress,
- maxSelfProgress, curTotalProgress,
- maxTotalProgress) {},
- onStatusChange: function(aProgress, aRequest, stat, message) {},
- onSecurityChange: function() {}
-};
-
-// Makes sure the item in the Help Menu and the link in about:tor
-// for the Tor Browser User Manual are only visible when
-// show_torbrowser_manual() returns true.
-function torbutton_init_user_manual_links() {
- let menuitem = document.getElementById("torBrowserUserManual");
- bindPrefAndInit("intl.locale.requested", val => {
- menuitem.hidden = !show_torbrowser_manual();
- torbutton_abouttor_message_handler.updateAllOpenPages();
- });
-}
+ }; // m_tb_resize_handler
+
+ // We need to handle OSes that auto-maximize windows depending on user
+ // settings and/or screen resolution in the start-up phase and users that
+ // try to shoot themselves in the foot by maximizing the window manually.
+ // We add a listener which is triggerred as soon as the window gets
+ // maximized (windowState = 1). We are resizing during start-up but not
+ // later as the user should see only a warning there as a stopgap before
+ // #14229 lands.
+ // Alas, the Firefox window code is handling the event not itself:
+ // "// Note the current implementation of SetSizeMode just stores
+ // // the new state; it doesn't actually resize. So here we store
+ // // the state and pass the event on to the OS."
+ // (See: https://mxr.mozilla.org/mozilla-esr31/source/xpfe/appshell/src/
+ // nsWebShellWindow.cpp#348)
+ // This means we have to cope with race conditions and resizing in the
+ // sizemodechange listener is likely to fail. Thus, we add a specific
+ // resize listener that is doing the work for us. It seems (at least on
+ // Ubuntu) to be the case that maximizing (and then again normalizing) of
+ // the window triggers more than one resize event the first being not the
+ // one we need. Thus we can't remove the listener after the first resize
+ // event got fired. Thus, we have the rather klunky setTimeout() call.
+ window.addEventListener("sizemodechange", m_tb_resize_handler);
+
+ let progress = Cc["@mozilla.org/docloaderservice;1"].getService(
+ Ci.nsIWebProgress
+ );
+ progress.removeProgressListener(this);
+ }
+ }, // onStateChange
+
+ onProgressChange(
+ aProgress,
+ aRequest,
+ curSelfProgress,
+ maxSelfProgress,
+ curTotalProgress,
+ maxTotalProgress
+ ) {},
+ onStatusChange(aProgress, aRequest, stat, message) {},
+ onSecurityChange() {},
+ };
+
+ // Makes sure the item in the Help Menu and the link in about:tor
+ // for the Tor Browser User Manual are only visible when
+ // show_torbrowser_manual() returns true.
+ function torbutton_init_user_manual_links() {
+ let menuitem = document.getElementById("torBrowserUserManual");
+ bindPrefAndInit("intl.locale.requested", val => {
+ menuitem.hidden = !show_torbrowser_manual();
+ torbutton_abouttor_message_handler.updateAllOpenPages();
+ });
+ }
})();
//vim:set ts=4
diff --git a/components/domain-isolator.js b/components/domain-isolator.js
index 06fe1e2e..1c77b577 100644
--- a/components/domain-isolator.js
+++ b/components/domain-isolator.js
@@ -9,15 +9,17 @@
// ### Abbreviations
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
-const { XPCOMUtils } = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+const { XPCOMUtils } = ChromeUtils.import(
+ "resource://gre/modules/XPCOMUtils.jsm"
+);
XPCOMUtils.defineLazyModuleGetters(this, {
ComponentUtils: "resource://gre/modules/ComponentUtils.jsm",
});
// Make the logger available.
-let logger = Cc["@torproject.org/torbutton-logger;1"]
- .getService(Ci.nsISupports).wrappedJSObject;
+let logger = Cc["@torproject.org/torbutton-logger;1"].getService(Ci.nsISupports)
+ .wrappedJSObject;
// Import crypto object (FF 37+).
Cu.importGlobalProperties(["crypto"]);
@@ -29,8 +31,9 @@ let mozilla = {};
// __mozilla.protocolProxyService__.
// Mozilla's protocol proxy service, useful for managing proxy connections made
// by the browser.
-mozilla.protocolProxyService = Cc["@mozilla.org/network/protocol-proxy-service;1"]
- .getService(Ci.nsIProtocolProxyService);
+mozilla.protocolProxyService = Cc[
+ "@mozilla.org/network/protocol-proxy-service;1"
+].getService(Ci.nsIProtocolProxyService);
// __mozilla.registerProxyChannelFilter(filterFunction, positionIndex)__.
// Registers a proxy channel filter with the Mozilla Protocol Proxy Service,
@@ -38,13 +41,16 @@ mozilla.protocolProxyService = Cc["@mozilla.org/network/protocol-proxy-service;1
// The filterFunction should expect two arguments, (aChannel, aProxy),
// where aProxy is the proxy or list of proxies that would be used by default
// for the given channel, and should return a new Proxy or list of Proxies.
-mozilla.registerProxyChannelFilter = function (filterFunction, positionIndex) {
+mozilla.registerProxyChannelFilter = function(filterFunction, positionIndex) {
let proxyFilter = {
- applyFilter : function (aChannel, aProxy, aCallback) {
+ applyFilter(aChannel, aProxy, aCallback) {
aCallback.onProxyFilterResult(filterFunction(aChannel, aProxy));
- }
+ },
};
- mozilla.protocolProxyService.registerChannelFilter(proxyFilter, positionIndex);
+ mozilla.protocolProxyService.registerChannelFilter(
+ proxyFilter,
+ positionIndex
+ );
};
// ## tor functionality.
@@ -66,24 +72,25 @@ tor.unknownDirtySince = Date.now();
// Takes a proxyInfo object (originalProxy) and returns a new proxyInfo
// object with the same properties, except the username is set to the
// the domain, and the password is a nonce.
-tor.socksProxyCredentials = function (originalProxy, domain) {
+tor.socksProxyCredentials = function(originalProxy, domain) {
// Check if we already have a nonce. If not, create
// one for this domain.
if (!tor.noncesForDomains.hasOwnProperty(domain)) {
tor.noncesForDomains[domain] = tor.nonce();
}
let proxy = originalProxy.QueryInterface(Ci.nsIProxyInfo);
- return mozilla.protocolProxyService
- .newProxyInfoWithAuth("socks",
- proxy.host,
- proxy.port,
- domain, // username
- tor.noncesForDomains[domain], // password
- "", // aProxyAuthorizationHeader
- "", // aConnectionIsolationKey
- proxy.flags,
- proxy.failoverTimeout,
- proxy.failoverProxy);
+ return mozilla.protocolProxyService.newProxyInfoWithAuth(
+ "socks",
+ proxy.host,
+ proxy.port,
+ domain, // username
+ tor.noncesForDomains[domain], // password
+ "", // aProxyAuthorizationHeader
+ "", // aConnectionIsolationKey
+ proxy.flags,
+ proxy.failoverTimeout,
+ proxy.failoverProxy
+ );
};
tor.nonce = function() {
@@ -98,7 +105,7 @@ tor.nonce = function() {
let tagStr = "";
for (let i = 0; i < tag.length; i++) {
tagStr += (tag[i] >>> 4).toString(16);
- tagStr += (tag[i] & 0x0F).toString(16);
+ tagStr += (tag[i] & 0x0f).toString(16);
}
return tagStr;
@@ -110,13 +117,16 @@ tor.newCircuitForDomain = function(domain) {
domain = "--unknown--";
}
tor.noncesForDomains[domain] = tor.nonce();
- logger.eclog(3, "New domain isolation for " + domain + ": " + tor.noncesForDomains[domain]);
+ logger.eclog(
+ 3,
+ "New domain isolation for " + domain + ": " + tor.noncesForDomains[domain]
+ );
};
// __tor.clearIsolation()_.
// Clear the isolation state cache, forcing new circuits to be used for all
// subsequent requests.
-tor.clearIsolation = function () {
+tor.clearIsolation = function() {
// Per-domain nonces are stored in a map, so simply re-initialize the map.
tor.noncesForDomains = {};
@@ -130,28 +140,38 @@ tor.clearIsolation = function () {
// to the SOCKS server (the tor client process) with a username (the first party domain)
// and a nonce password. Tor provides a separate circuit for each username+password
// combination.
-tor.isolateCircuitsByDomain = function () {
- mozilla.registerProxyChannelFilter(function (aChannel, aProxy) {
+tor.isolateCircuitsByDomain = function() {
+ mozilla.registerProxyChannelFilter(function(aChannel, aProxy) {
if (!tor.isolationEnabled) {
return aProxy;
}
try {
let channel = aChannel.QueryInterface(Ci.nsIChannel),
- firstPartyDomain = channel.loadInfo.originAttributes.firstPartyDomain;
+ firstPartyDomain = channel.loadInfo.originAttributes.firstPartyDomain;
if (firstPartyDomain === "") {
firstPartyDomain = "--unknown--";
- if (Date.now() - tor.unknownDirtySince > 1000*10*60) {
- logger.eclog(3, "tor catchall circuit has been dirty for over 10 minutes. Rotating.");
+ if (Date.now() - tor.unknownDirtySince > 1000 * 10 * 60) {
+ logger.eclog(
+ 3,
+ "tor catchall circuit has been dirty for over 10 minutes. Rotating."
+ );
tor.newCircuitForDomain("--unknown--");
tor.unknownDirtySince = Date.now();
}
}
- let replacementProxy = tor.socksProxyCredentials(aProxy, firstPartyDomain);
- logger.eclog(3, `tor SOCKS: ${channel.URI.spec} via
- ${replacementProxy.username}:${replacementProxy.password}`);
+ let replacementProxy = tor.socksProxyCredentials(
+ aProxy,
+ firstPartyDomain
+ );
+ logger.eclog(
+ 3,
+ `tor SOCKS: ${channel.URI.spec} via
+ ${replacementProxy.username}:${replacementProxy.password}`
+ );
return replacementProxy;
} catch (e) {
logger.eclog(4, `tor domain isolator error: ${e.message}`);
+ return null;
}
}, 0);
};
@@ -164,7 +184,7 @@ const kMODULE_CID = Components.ID("e33fd6d4-270f-475f-a96f-ff3140279f68");
// DomainIsolator object.
function DomainIsolator() {
- this.wrappedJSObject = this;
+ this.wrappedJSObject = this;
}
// Firefox component requirements
@@ -173,7 +193,7 @@ DomainIsolator.prototype = {
classDescription: kMODULE_NAME,
classID: kMODULE_CID,
contractID: kMODULE_CONTRACTID,
- observe: function (subject, topic, data) {
+ observe(subject, topic, data) {
if (topic === "profile-after-change") {
logger.eclog(3, "domain isolator: set up isolating circuits by domain");
@@ -183,23 +203,23 @@ DomainIsolator.prototype = {
tor.isolateCircuitsByDomain();
}
},
- newCircuitForDomain: function (domain) {
+ newCircuitForDomain(domain) {
tor.newCircuitForDomain(domain);
},
- enableIsolation: function() {
+ enableIsolation() {
tor.isolationEnabled = true;
},
- disableIsolation: function() {
+ disableIsolation() {
tor.isolationEnabled = false;
},
- clearIsolation: function() {
+ clearIsolation() {
tor.clearIsolation();
},
- wrappedJSObject: null
+ wrappedJSObject: null,
};
// Assign factory to global object.
diff --git a/components/dragDropFilter.js b/components/dragDropFilter.js
index 361424d1..4b76bd10 100644
--- a/components/dragDropFilter.js
+++ b/components/dragDropFilter.js
@@ -5,8 +5,9 @@
* access to URLs (a potential proxy bypass vector).
*************************************************************************/
-
-const { XPCOMUtils } = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+const { XPCOMUtils } = ChromeUtils.import(
+ "resource://gre/modules/XPCOMUtils.jsm"
+);
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
XPCOMUtils.defineLazyModuleGetters(this, {
@@ -21,8 +22,9 @@ const kMODULE_CID = Components.ID("f605ec27-d867-44b5-ad97-2a29276642c3");
const kInterfaces = [Ci.nsIObserver, Ci.nsIClassInfo];
function DragDropFilter() {
- this.logger = Cc["@torproject.org/torbutton-logger;1"]
- .getService(Ci.nsISupports).wrappedJSObject;
+ this.logger = Cc["@torproject.org/torbutton-logger;1"].getService(
+ Ci.nsISupports
+ ).wrappedJSObject;
this.logger.log(3, "Component Load 0: New DragDropFilter.");
try {
@@ -32,8 +34,7 @@ function DragDropFilter() {
}
}
-DragDropFilter.prototype =
-{
+DragDropFilter.prototype = {
QueryInterface: ChromeUtils.generateQI([Ci.nsIObserver]),
// make this an nsIClassInfo object
@@ -43,23 +44,25 @@ DragDropFilter.prototype =
classID: kMODULE_CID,
// method of nsIClassInfo
- getInterfaces: function(count) {
+ getInterfaces(count) {
count.value = kInterfaces.length;
return kInterfaces;
},
// method of nsIClassInfo
- getHelperForLanguage: function(count) { return null; },
+ getHelperForLanguage(count) {
+ return null;
+ },
// method of nsIObserver
- observe: function(subject, topic, data) {
- if (topic == "on-datatransfer-available") {
+ observe(subject, topic, data) {
+ if (topic === "on-datatransfer-available") {
this.logger.log(3, "The DataTransfer is available");
- return this.filterDataTransferURLs(subject);
+ this.filterDataTransferURLs(subject);
}
},
- filterDataTransferURLs: function(aDataTransfer) {
+ filterDataTransferURLs(aDataTransfer) {
var types = null;
var type = "";
var count = aDataTransfer.mozItemCount;
@@ -71,16 +74,18 @@ DragDropFilter.prototype =
for (var j = 0; j < len; ++j) {
type = types[j];
this.logger.log(3, "Type is: " + type);
- if (type == "text/x-moz-url" ||
- type == "text/x-moz-url-data" ||
- type == "text/uri-list" ||
- type == "application/x-moz-file-promise-url") {
+ if (
+ type == "text/x-moz-url" ||
+ type == "text/x-moz-url-data" ||
+ type == "text/uri-list" ||
+ type == "application/x-moz-file-promise-url"
+ ) {
aDataTransfer.clearData(type);
this.logger.log(3, "Removing " + type);
}
}
}
- }
+ },
};
// Assign factory to global object.
diff --git a/components/external-app-blocker.js b/components/external-app-blocker.js
index 2fa80d9d..6a53fc01 100644
--- a/components/external-app-blocker.js
+++ b/components/external-app-blocker.js
@@ -12,15 +12,21 @@
* handle an URL (e.g., when the user clicks on a mailto: URL).
*************************************************************************/
-const { XPCOMUtils } = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+const { XPCOMUtils } = ChromeUtils.import(
+ "resource://gre/modules/XPCOMUtils.jsm"
+);
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
-const { PromptUtils } = ChromeUtils.import("resource://gre/modules/SharedPromptUtils.jsm");
+const { PromptUtils } = ChromeUtils.import(
+ "resource://gre/modules/SharedPromptUtils.jsm"
+);
XPCOMUtils.defineLazyModuleGetters(this, {
ComponentUtils: "resource://gre/modules/ComponentUtils.jsm",
});
-let { torbutton_get_property_string } = ChromeUtils.import("resource://torbutton/modules/utils.js", {});
+let { torbutton_get_property_string } = ChromeUtils.import(
+ "resource://torbutton/modules/utils.js"
+);
// Module specific constants
const kMODULE_NAME = "Torbutton External App Handler";
@@ -30,16 +36,19 @@ const kMODULE_CID = Components.ID("3da0269f-fc29-4e9e-a678-c3b1cafcf13f");
const kInterfaces = [Ci.nsIObserver, Ci.nsIClassInfo];
function ExternalAppBlocker() {
- this.logger = Cc["@torproject.org/torbutton-logger;1"]
- .getService(Ci.nsISupports).wrappedJSObject;
+ this.logger = Cc["@torproject.org/torbutton-logger;1"].getService(
+ Ci.nsISupports
+ ).wrappedJSObject;
this.logger.log(3, "Component Load 0: New ExternalAppBlocker.");
}
-ExternalAppBlocker.prototype =
-{
+ExternalAppBlocker.prototype = {
_helperAppLauncher: undefined,
- QueryInterface: ChromeUtils.generateQI([Ci.nsIObserver, Ci.nsIHelperAppWarningDialog]),
+ QueryInterface: ChromeUtils.generateQI([
+ Ci.nsIObserver,
+ Ci.nsIHelperAppWarningDialog,
+ ]),
// make this an nsIClassInfo object
flags: Ci.nsIClassInfo.DOM_OBJECT,
@@ -48,17 +57,18 @@ ExternalAppBlocker.prototype =
classID: kMODULE_CID,
// method of nsIClassInfo
- getInterfaces: function(count) {
+ getInterfaces(count) {
count.value = kInterfaces.length;
return kInterfaces;
},
// method of nsIClassInfo
- getHelperForLanguage: function(count) { return null; },
+ getHelperForLanguage(count) {
+ return null;
+ },
// method of nsIHelperAppWarningDialog
- maybeShow: function(aLauncher, aWindowContext)
- {
+ maybeShow(aLauncher, aWindowContext) {
// Hold a reference to the object that called this component. This is
// important not just because we need to later invoke the
// continueRequest() or cancelRequest() callback on aLauncher, but also
@@ -80,7 +90,7 @@ ExternalAppBlocker.prototype =
* on chrome://global/content/commonDialog.xhtml as well as some of the code
* in resource://gre/modules/SharedPromptUtils.jsm.
*/
- _showPrompt: function(aWindowContext) {
+ _showPrompt(aWindowContext) {
let parentWin;
try {
parentWin = aWindowContext.getInterface(Ci.nsIDOMWindow);
@@ -91,20 +101,22 @@ ExternalAppBlocker.prototype =
let title = torbutton_get_property_string("torbutton.popup.external.title");
let app = torbutton_get_property_string("torbutton.popup.external.app");
let note = torbutton_get_property_string("torbutton.popup.external.note");
- let suggest = torbutton_get_property_string("torbutton.popup.external.suggest");
+ let suggest = torbutton_get_property_string(
+ "torbutton.popup.external.suggest"
+ );
let launch = torbutton_get_property_string("torbutton.popup.launch");
let cancel = torbutton_get_property_string("torbutton.popup.cancel");
let dontask = torbutton_get_property_string("torbutton.popup.dontask");
let args = {
- promptType: "confirmEx",
- title: title,
- text: app+note+suggest+" ",
- checkLabel: dontask,
- checked: false,
- ok: false,
- button0Label: launch,
- button1Label: cancel,
+ promptType: "confirmEx",
+ title,
+ text: app + note + suggest + " ",
+ checkLabel: dontask,
+ checked: false,
+ ok: false,
+ button0Label: launch,
+ button1Label: cancel,
defaultButtonNum: 1, // Cancel
buttonNumClicked: 1, // Cancel
enableDelay: true,
@@ -112,8 +124,13 @@ ExternalAppBlocker.prototype =
let propBag = PromptUtils.objectToPropBag(args);
let uri = "chrome://global/content/commonDialog.xhtml";
- let promptWin = Services.ww.openWindow(parentWin, uri, "_blank",
- "centerscreen,chrome,titlebar", propBag);
+ let promptWin = Services.ww.openWindow(
+ parentWin,
+ uri,
+ "_blank",
+ "centerscreen,chrome,titlebar",
+ propBag
+ );
promptWin.addEventListener("load", aEvent => {
promptWin.addEventListener("unload", aEvent => {
PromptUtils.propBagToObject(propBag, args);
@@ -122,16 +139,18 @@ ExternalAppBlocker.prototype =
// Save the checkbox value and tell the browser's external helper app
// module about the user's choice.
if (args.checked) {
- Services.prefs.setBoolPref("extensions.torbutton.launch_warning",
- false);
+ Services.prefs.setBoolPref(
+ "extensions.torbutton.launch_warning",
+ false
+ );
}
this._helperAppLauncher.continueRequest();
} else {
this._helperAppLauncher.cancelRequest(Cr.NS_BINDING_ABORTED);
}
- }, false);
- }, false);
+ });
+ });
},
};
diff --git a/components/startup-observer.js b/components/startup-observer.js
index 164c9219..77df172a 100644
--- a/components/startup-observer.js
+++ b/components/startup-observer.js
@@ -13,7 +13,9 @@
*************************************************************************/
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
-const { XPCOMUtils } = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+const { XPCOMUtils } = ChromeUtils.import(
+ "resource://gre/modules/XPCOMUtils.jsm"
+);
XPCOMUtils.defineLazyModuleGetters(this, {
ComponentUtils: "resource://gre/modules/ComponentUtils.jsm",
@@ -47,155 +49,163 @@ function cleanupCookies() {
}
function StartupObserver() {
- this.logger = Cc["@torproject.org/torbutton-logger;1"]
- .getService(Ci.nsISupports).wrappedJSObject;
- this._prefs = Services.prefs;
- this.logger.log(3, "Startup Observer created");
-
- var env = Cc["@mozilla.org/process/environment;1"]
- .getService(Ci.nsIEnvironment);
- var prefName = "browser.startup.homepage";
- if (env.exists("TOR_DEFAULT_HOMEPAGE")) {
- // if the user has set this value in a previous installation, don't override it
- if (!this._prefs.prefHasUserValue(prefName)) {
- this._prefs.setCharPref(prefName, env.get("TOR_DEFAULT_HOMEPAGE"));
- }
- }
-
- try {
- var test = this._prefs.getCharPref("torbrowser.version");
- this.is_tbb = true;
- this.logger.log(3, "This is a Tor Browser's XPCOM");
- } catch(e) {
- this.logger.log(3, "This is not a Tor Browser's XPCOM");
- }
-
- try {
- // XXX: We're in a race with HTTPS-Everywhere to update our proxy settings
- // before the initial SSL-Observatory test... If we lose the race, Firefox
- // caches the old proxy settings for check.tp.o somehwere, and it never loads :(
- this.setProxySettings();
- } catch(e) {
- this.logger.log(4, "Early proxy change failed. Will try again at profile load. Error: "+e);
+ this.logger = Cc["@torproject.org/torbutton-logger;1"].getService(
+ Ci.nsISupports
+ ).wrappedJSObject;
+ this._prefs = Services.prefs;
+ this.logger.log(3, "Startup Observer created");
+
+ var env = Cc["@mozilla.org/process/environment;1"].getService(
+ Ci.nsIEnvironment
+ );
+ var prefName = "browser.startup.homepage";
+ if (env.exists("TOR_DEFAULT_HOMEPAGE")) {
+ // if the user has set this value in a previous installation, don't override it
+ if (!this._prefs.prefHasUserValue(prefName)) {
+ this._prefs.setCharPref(prefName, env.get("TOR_DEFAULT_HOMEPAGE"));
}
+ }
- cleanupCookies();
-
- // Using all possible locales so that we do not have to change this list every time we support
- // a new one.
- const allLocales = [
- "en-US", "ach", "af", "an", "ar", "ast", "az", "be", "bg", "bn", "br", "bs", "ca", "cak",
- "crh", "cs", "cy", "da", "de", "dsb", "el", "en-CA", "en-GB", "eo", "es-AR", "es-CL",
- "es-ES", "es-MX", "et", "eu", "fa", "ff", "fi", "fr", "fy-NL", "ga-IE", "gd", "gl", "gn",
- "gu-IN", "he", "hi-IN", "hr", "hsb", "hu", "hy-AM", "ia", "id", "is", "it", "ja",
- "ja-JP-mac", "ka", "kab", "kk", "km", "kn", "ko", "lij", "lo", "lt", "ltg", "lv", "mk", "mr",
- "ms", "my", "nb-NO", "ne-NP", "nl", "nn-NO", "oc", "pa-IN", "pl", "pt-BR", "pt-PT", "rm",
- "ro", "ru", "si", "sk", "sl", "son", "sq", "sr", "sv-SE", "ta", "te", "th", "tl", "tr",
- "trs", "uk", "ur", "uz", "vi", "wo", "xh", "zh-CN", "zh-TW"
- ];
- let torSource = new FileSource(
- "torbutton",
- allLocales,
- "resource://torbutton/locale/{locale}/",
- true, // skip this FileSource locales when computing Services.locale.availableLocales
+ this.is_tbb = true;
+
+ try {
+ // XXX: We're in a race with HTTPS-Everywhere to update our proxy settings
+ // before the initial SSL-Observatory test... If we lose the race, Firefox
+ // caches the old proxy settings for check.tp.o somehwere, and it never loads :(
+ this.setProxySettings();
+ } catch (e) {
+ this.logger.log(
+ 4,
+ "Early proxy change failed. Will try again at profile load. Error: " + e
);
- if (L10nRegistry.registerSources) {
- L10nRegistry.registerSources([torSource]);
- } else {
- L10nRegistry.registerSource(torSource);
- }
+ }
+
+ cleanupCookies();
+
+ // Using all possible locales so that we do not have to change this list every time we support
+ // a new one.
+ /* eslint-disable */
+ const allLocales = [
+ "en-US", "ach", "af", "an", "ar", "ast", "az", "be", "bg", "bn", "br", "bs", "ca", "cak",
+ "crh", "cs", "cy", "da", "de", "dsb", "el", "en-CA", "en-GB", "eo", "es-AR", "es-CL",
+ "es-ES", "es-MX", "et", "eu", "fa", "ff", "fi", "fr", "fy-NL", "ga-IE", "gd", "gl", "gn",
+ "gu-IN", "he", "hi-IN", "hr", "hsb", "hu", "hy-AM", "ia", "id", "is", "it", "ja",
+ "ja-JP-mac", "ka", "kab", "kk", "km", "kn", "ko", "lij", "lo", "lt", "ltg", "lv", "mk", "mr",
+ "ms", "my", "nb-NO", "ne-NP", "nl", "nn-NO", "oc", "pa-IN", "pl", "pt-BR", "pt-PT", "rm",
+ "ro", "ru", "si", "sk", "sl", "son", "sq", "sr", "sv-SE", "ta", "te", "th", "tl", "tr",
+ "trs", "uk", "ur", "uz", "vi", "wo", "xh", "zh-CN", "zh-TW"
+ ];
+ /* eslint-enable */
+ let torSource = new FileSource(
+ "torbutton",
+ allLocales,
+ "resource://torbutton/locale/{locale}/",
+ true // skip this FileSource locales when computing Services.locale.availableLocales
+ );
+ if (L10nRegistry.registerSources) {
+ L10nRegistry.registerSources([torSource]);
+ } else {
+ L10nRegistry.registerSource(torSource);
+ }
}
StartupObserver.prototype = {
- // Bug 6803: We need to get the env vars early due to
- // some weird proxy caching code that showed up in FF15.
- // Otherwise, homepage domain loads fail forever.
- setProxySettings: function() {
- if (!this.is_tbb)
- return;
-
- // Bug 1506: Still want to get these env vars
- let environ = Cc["@mozilla.org/process/environment;1"]
- .getService(Ci.nsIEnvironment);
- if (environ.exists("TOR_TRANSPROXY")) {
- this.logger.log(3, "Resetting Tor settings to transproxy");
- this._prefs.setBoolPref("network.proxy.socks_remote_dns", false);
- this._prefs.setIntPref("network.proxy.type", 0);
- this._prefs.setIntPref("network.proxy.socks_port", 0);
- this._prefs.setCharPref("network.proxy.socks", "");
- } else {
- // Try to retrieve SOCKS proxy settings from Tor Launcher.
- let socksPortInfo;
- try {
- let tlps = Cc["@torproject.org/torlauncher-protocol-service;1"]
- .getService(Ci.nsISupports).wrappedJSObject;
- socksPortInfo = tlps.TorGetSOCKSPortInfo();
- } catch(e) {
- this.logger.log(3, "tor launcher failed " + e);
- }
+ // Bug 6803: We need to get the env vars early due to
+ // some weird proxy caching code that showed up in FF15.
+ // Otherwise, homepage domain loads fail forever.
+ setProxySettings() {
+ if (!this.is_tbb) {
+ return;
+ }
- // If Tor Launcher is not available, check environment variables.
- if (!socksPortInfo) {
- socksPortInfo = { ipcFile: undefined, host: undefined, port: 0 };
+ // Bug 1506: Still want to get these env vars
+ let environ = Cc["@mozilla.org/process/environment;1"].getService(
+ Ci.nsIEnvironment
+ );
+ if (environ.exists("TOR_TRANSPROXY")) {
+ this.logger.log(3, "Resetting Tor settings to transproxy");
+ this._prefs.setBoolPref("network.proxy.socks_remote_dns", false);
+ this._prefs.setIntPref("network.proxy.type", 0);
+ this._prefs.setIntPref("network.proxy.socks_port", 0);
+ this._prefs.setCharPref("network.proxy.socks", "");
+ } else {
+ // Try to retrieve SOCKS proxy settings from Tor Launcher.
+ let socksPortInfo;
+ try {
+ let tlps = Cc[
+ "@torproject.org/torlauncher-protocol-service;1"
+ ].getService(Ci.nsISupports).wrappedJSObject;
+ socksPortInfo = tlps.TorGetSOCKSPortInfo();
+ } catch (e) {
+ this.logger.log(3, "tor launcher failed " + e);
+ }
- let isWindows = Services.appinfo.OS === "WINNT";
- if (!isWindows && environ.exists("TOR_SOCKS_IPC_PATH")) {
- socksPortInfo.ipcFile = new FileUtils.File(
- environ.get("TOR_SOCKS_IPC_PATH"));
- }
- else
- {
- if (environ.exists("TOR_SOCKS_HOST"))
- socksPortInfo.host = environ.get("TOR_SOCKS_HOST");
- if (environ.exists("TOR_SOCKS_PORT"))
- socksPortInfo.port = parseInt(environ.get("TOR_SOCKS_PORT"));
- }
- }
+ // If Tor Launcher is not available, check environment variables.
+ if (!socksPortInfo) {
+ socksPortInfo = { ipcFile: undefined, host: undefined, port: 0 };
- // Adjust network.proxy prefs.
- if (socksPortInfo.ipcFile) {
- let fph = Services.io.getProtocolHandler("file")
- .QueryInterface(Ci.nsIFileProtocolHandler);
- let fileURI = fph.newFileURI(socksPortInfo.ipcFile);
- this.logger.log(3, "Reset socks to "+fileURI.spec);
- this._prefs.setCharPref("network.proxy.socks", fileURI.spec);
- this._prefs.setIntPref("network.proxy.socks_port", 0);
+ let isWindows = Services.appinfo.OS === "WINNT";
+ if (!isWindows && environ.exists("TOR_SOCKS_IPC_PATH")) {
+ socksPortInfo.ipcFile = new FileUtils.File(
+ environ.get("TOR_SOCKS_IPC_PATH")
+ );
} else {
- if (socksPortInfo.host) {
- this._prefs.setCharPref("network.proxy.socks", socksPortInfo.host);
- this.logger.log(3, "Reset socks host to "+socksPortInfo.host);
+ if (environ.exists("TOR_SOCKS_HOST")) {
+ socksPortInfo.host = environ.get("TOR_SOCKS_HOST");
}
- if (socksPortInfo.port) {
- this._prefs.setIntPref("network.proxy.socks_port",
- socksPortInfo.port);
- this.logger.log(3, "Reset socks port to "+socksPortInfo.port);
+ if (environ.exists("TOR_SOCKS_PORT")) {
+ socksPortInfo.port = parseInt(environ.get("TOR_SOCKS_PORT"));
}
}
+ }
- if (socksPortInfo.ipcFile || socksPortInfo.host || socksPortInfo.port) {
- this._prefs.setBoolPref("network.proxy.socks_remote_dns", true);
- this._prefs.setIntPref("network.proxy.type", 1);
+ // Adjust network.proxy prefs.
+ if (socksPortInfo.ipcFile) {
+ let fph = Services.io
+ .getProtocolHandler("file")
+ .QueryInterface(Ci.nsIFileProtocolHandler);
+ let fileURI = fph.newFileURI(socksPortInfo.ipcFile);
+ this.logger.log(3, "Reset socks to " + fileURI.spec);
+ this._prefs.setCharPref("network.proxy.socks", fileURI.spec);
+ this._prefs.setIntPref("network.proxy.socks_port", 0);
+ } else {
+ if (socksPortInfo.host) {
+ this._prefs.setCharPref("network.proxy.socks", socksPortInfo.host);
+ this.logger.log(3, "Reset socks host to " + socksPortInfo.host);
+ }
+ if (socksPortInfo.port) {
+ this._prefs.setIntPref(
+ "network.proxy.socks_port",
+ socksPortInfo.port
+ );
+ this.logger.log(3, "Reset socks port to " + socksPortInfo.port);
}
}
- // Force prefs to be synced to disk
- Services.prefs.savePrefFile(null);
+ if (socksPortInfo.ipcFile || socksPortInfo.host || socksPortInfo.port) {
+ this._prefs.setBoolPref("network.proxy.socks_remote_dns", true);
+ this._prefs.setIntPref("network.proxy.type", 1);
+ }
+ }
+
+ // Force prefs to be synced to disk
+ Services.prefs.savePrefFile(null);
- this.logger.log(3, "Synced network settings to environment.");
- },
+ this.logger.log(3, "Synced network settings to environment.");
+ },
- observe: function(subject, topic, data) {
- if(topic == "profile-after-change") {
- // Bug 1506 P1: We listen to these prefs as signals for startup,
- // but only for hackish reasons.
- this._prefs.setBoolPref("extensions.torbutton.startup", true);
+ observe(subject, topic, data) {
+ if (topic == "profile-after-change") {
+ // Bug 1506 P1: We listen to these prefs as signals for startup,
+ // but only for hackish reasons.
+ this._prefs.setBoolPref("extensions.torbutton.startup", true);
- this.setProxySettings();
- }
+ this.setProxySettings();
+ }
- // In all cases, force prefs to be synced to disk
- Services.prefs.savePrefFile(null);
- },
+ // In all cases, force prefs to be synced to disk
+ Services.prefs.savePrefFile(null);
+ },
QueryInterface: ChromeUtils.generateQI([Ci.nsIClassInfo]),
@@ -205,7 +215,7 @@ StartupObserver.prototype = {
contractID: kMODULE_CONTRACTID,
// Hack to get us registered early to observe recovery
- _xpcom_categories: [{category:"profile-after-change"}],
+ _xpcom_categories: [{ category: "profile-after-change" }],
};
// Assign factory to global object.
diff --git a/components/torCheckService.js b/components/torCheckService.js
index 07b1aa99..41d716ff 100644
--- a/components/torCheckService.js
+++ b/components/torCheckService.js
@@ -3,12 +3,14 @@
* See LICENSE for licensing information.
*
* vim: set sw=2 sts=2 ts=8 et syntax=javascript:
- *
+ *
* Tor check service
*************************************************************************/
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
-const { XPCOMUtils } = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+const { XPCOMUtils } = ChromeUtils.import(
+ "resource://gre/modules/XPCOMUtils.jsm"
+);
XPCOMUtils.defineLazyModuleGetters(this, {
ComponentUtils: "resource://gre/modules/ComponentUtils.jsm",
@@ -20,16 +22,16 @@ const kMODULE_CONTRACTID = "@torproject.org/torbutton-torCheckService;1";
const kMODULE_CID = Components.ID("5d57312b-5d8c-4169-b4af-e80d6a28a72e");
function TBTorCheckService() {
- this._logger = Cc["@torproject.org/torbutton-logger;1"]
- .getService(Ci.nsISupports).wrappedJSObject;
+ this._logger = Cc["@torproject.org/torbutton-logger;1"].getService(
+ Ci.nsISupports
+ ).wrappedJSObject;
this._logger.log(3, "Torbutton Tor Check Service initialized");
this._statusOfTorCheck = this.kCheckNotInitiated;
this.wrappedJSObject = this;
}
-TBTorCheckService.prototype =
-{
+TBTorCheckService.prototype = {
QueryInterface: ChromeUtils.generateQI([Ci.nsIClassInfo]),
kCheckNotInitiated: 0, // Possible values for statusOfTorCheck.
@@ -49,87 +51,84 @@ TBTorCheckService.prototype =
contractID: kMODULE_CONTRACTID,
// method of nsIClassInfo
- getInterfaces: function(count) {
+ getInterfaces(count) {
var interfaceList = [Ci.nsIClassInfo];
count.value = interfaceList.length;
return interfaceList;
},
// method of nsIClassInfo
- getHelperForLanguage: function(count) { return null; },
+ getHelperForLanguage(count) {
+ return null;
+ },
// Public methods.
- get statusOfTorCheck()
- {
+ get statusOfTorCheck() {
return this._statusOfTorCheck;
},
- set statusOfTorCheck(aStatus)
- {
+ set statusOfTorCheck(aStatus) {
this._statusOfTorCheck = aStatus;
},
- createCheckRequest: function(aAsync)
- {
- Cu.importGlobalProperties(["XMLHttpRequest"]);
+ createCheckRequest(aAsync) {
let req = new XMLHttpRequest();
let url = Services.prefs.getCharPref("extensions.torbutton.test_url");
req.open("GET", url, aAsync);
req.channel.loadFlags |= Ci.nsIRequest.LOAD_BYPASS_CACHE;
req.overrideMimeType("text/xml");
- req.timeout = 120000; // Wait at most two minutes for a response.
+ req.timeout = 120000; // Wait at most two minutes for a response.
return req;
},
- parseCheckResponse: function(aReq)
- {
+ parseCheckResponse(aReq) {
let ret = 0;
- if(aReq.status == 200) {
- if(!aReq.responseXML) {
- this._logger.log(5, "Check failed! Not text/xml!");
- ret = 1;
- } else {
- let result = aReq.responseXML.getElementById('TorCheckResult');
-
- if(result===null) {
- this._logger.log(5, "Test failed! No TorCheckResult element");
- ret = 2;
- } else if(typeof(result.target) == 'undefined'
- || result.target === null) {
- this._logger.log(5, "Test failed! No target");
- ret = 3;
- } else if(result.target === "success") {
- this._logger.log(3, "Test Successful");
- ret = 4;
- } else if(result.target === "failure") {
- this._logger.log(5, "Tor test failed!");
- ret = 5;
- } else if(result.target === "unknown") {
- this._logger.log(5, "Tor test failed. TorDNSEL Failure?");
- ret = 6;
- } else {
- this._logger.log(5, "Tor test failed. Strange target.");
- ret = 7;
- }
- }
+ if (aReq.status == 200) {
+ if (!aReq.responseXML) {
+ this._logger.log(5, "Check failed! Not text/xml!");
+ ret = 1;
} else {
- if (0 == aReq.status) {
- try {
- var req = aReq.channel.QueryInterface(Ci.nsIRequest);
- if (req.status == Cr.NS_ERROR_PROXY_CONNECTION_REFUSED)
- {
- this._logger.log(5, "Tor test failed. Proxy connection refused");
- ret = 8;
- }
- } catch (e) {}
+ let result = aReq.responseXML.getElementById("TorCheckResult");
+
+ if (result === null) {
+ this._logger.log(5, "Test failed! No TorCheckResult element");
+ ret = 2;
+ } else if (
+ typeof result.target == "undefined" ||
+ result.target === null
+ ) {
+ this._logger.log(5, "Test failed! No target");
+ ret = 3;
+ } else if (result.target === "success") {
+ this._logger.log(3, "Test Successful");
+ ret = 4;
+ } else if (result.target === "failure") {
+ this._logger.log(5, "Tor test failed!");
+ ret = 5;
+ } else if (result.target === "unknown") {
+ this._logger.log(5, "Tor test failed. TorDNSEL Failure?");
+ ret = 6;
+ } else {
+ this._logger.log(5, "Tor test failed. Strange target.");
+ ret = 7;
}
+ }
+ } else {
+ if (0 == aReq.status) {
+ try {
+ var req = aReq.channel.QueryInterface(Ci.nsIRequest);
+ if (req.status == Cr.NS_ERROR_PROXY_CONNECTION_REFUSED) {
+ this._logger.log(5, "Tor test failed. Proxy connection refused");
+ ret = 8;
+ }
+ } catch (e) {}
+ }
- if (ret == 0)
- {
- this._logger.log(5, "Tor test failed. HTTP Error: "+aReq.status);
- ret = -aReq.status;
- }
+ if (ret == 0) {
+ this._logger.log(5, "Tor test failed. HTTP Error: " + aReq.status);
+ ret = -aReq.status;
}
+ }
return ret;
},
diff --git a/components/torbutton-logger.js b/components/torbutton-logger.js
index d80d13c4..2fdcd7e6 100644
--- a/components/torbutton-logger.js
+++ b/components/torbutton-logger.js
@@ -14,31 +14,34 @@ const kMODULE_CONTRACTID = "@torproject.org/torbutton-logger;1";
const kMODULE_CID = Components.ID("f36d72c9-9718-4134-b550-e109638331d7");
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
-const { XPCOMUtils } = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+const { XPCOMUtils } = ChromeUtils.import(
+ "resource://gre/modules/XPCOMUtils.jsm"
+);
XPCOMUtils.defineLazyModuleGetters(this, {
ComponentUtils: "resource://gre/modules/ComponentUtils.jsm",
});
function TorbuttonLogger() {
- // Register observer
- Services.prefs.addObserver("extensions.torbutton", this);
-
- this.loglevel = Services.prefs.getIntPref("extensions.torbutton.loglevel");
- this.logmethod = Services.prefs.getIntPref("extensions.torbutton.logmethod");
-
- try {
- var logMngr = Cc["@mozmonkey.com/debuglogger/manager;1"]
- .getService(Ci.nsIDebugLoggerManager);
- this._debuglog = logMngr.registerLogger("torbutton");
- } catch (exErr) {
- this._debuglog = false;
- }
- this._console = Services.console;
+ // Register observer
+ Services.prefs.addObserver("extensions.torbutton", this);
+
+ this.loglevel = Services.prefs.getIntPref("extensions.torbutton.loglevel");
+ this.logmethod = Services.prefs.getIntPref("extensions.torbutton.logmethod");
+
+ try {
+ var logMngr = Cc["@mozmonkey.com/debuglogger/manager;1"].getService(
+ Ci.nsIDebugLoggerManager
+ );
+ this._debuglog = logMngr.registerLogger("torbutton");
+ } catch (exErr) {
+ this._debuglog = false;
+ }
+ this._console = Services.console;
- // This JSObject is exported directly to chrome
- this.wrappedJSObject = this;
- this.log(3, "Torbutton debug output ready");
+ // This JSObject is exported directly to chrome
+ this.wrappedJSObject = this;
+ this.log(3, "Torbutton debug output ready");
}
/**
@@ -49,18 +52,16 @@ function TorbuttonLogger() {
const nsIClassInfo = Ci.nsIClassInfo;
-const logString = { 1:"VERB", 2:"DBUG", 3: "INFO", 4:"NOTE", 5:"WARN" };
+const logString = { 1: "VERB", 2: "DBUG", 3: "INFO", 4: "NOTE", 5: "WARN" };
-function padInt(i)
-{
- return (i < 10) ? '0' + i : i;
+function padInt(i) {
+ return i < 10 ? "0" + i : i;
}
-TorbuttonLogger.prototype =
-{
+TorbuttonLogger.prototype = {
QueryInterface: ChromeUtils.generateQI([Ci.nsIClassInfo]),
- wrappedJSObject: null, // Initialized by constructor
+ wrappedJSObject: null, // Initialized by constructor
// make this an nsIClassInfo object
flags: nsIClassInfo.DOM_OBJECT,
@@ -71,62 +72,78 @@ TorbuttonLogger.prototype =
contractID: kMODULE_CONTRACTID,
// method of nsIClassInfo
- getInterfaces: function(count) {
+ getInterfaces(count) {
var interfaceList = [nsIClassInfo];
count.value = interfaceList.length;
return interfaceList;
},
// method of nsIClassInfo
- getHelperForLanguage: function(count) { return null; },
+ getHelperForLanguage(count) {
+ return null;
+ },
- formatLog: function(str, level) {
- var d = new Date();
- var now = padInt(d.getUTCMonth()+1)+"-"+padInt(d.getUTCDate())+" "+padInt(d.getUTCHours())+":"+padInt(d.getUTCMinutes())+":"+padInt(d.getUTCSeconds());
- return "["+now+"] Torbutton "+logString[level]+": "+str;
+ formatLog(str, level) {
+ var d = new Date();
+ var now =
+ padInt(d.getUTCMonth() + 1) +
+ "-" +
+ padInt(d.getUTCDate()) +
+ " " +
+ padInt(d.getUTCHours()) +
+ ":" +
+ padInt(d.getUTCMinutes()) +
+ ":" +
+ padInt(d.getUTCSeconds());
+ return "[" + now + "] Torbutton " + logString[level] + ": " + str;
},
// error console log
- eclog: function(level, str) {
- switch(this.logmethod) {
- case 0: // stderr
- if(this.loglevel <= level)
- dump(this.formatLog(str, level)+"\n");
- break;
- default: // errorconsole
- if(this.loglevel <= level)
- this._console.logStringMessage(this.formatLog(str,level));
- break;
- }
+ eclog(level, str) {
+ switch (this.logmethod) {
+ case 0: // stderr
+ if (this.loglevel <= level) {
+ dump(this.formatLog(str, level) + "\n");
+ }
+ break;
+ default:
+ // errorconsole
+ if (this.loglevel <= level) {
+ this._console.logStringMessage(this.formatLog(str, level));
+ }
+ break;
+ }
},
- safe_log: function(level, str, scrub) {
- if (this.loglevel < 4) {
- this.eclog(level, str+scrub);
- } else {
- this.eclog(level, str+" [scrubbed]");
- }
+ safe_log(level, str, scrub) {
+ if (this.loglevel < 4) {
+ this.eclog(level, str + scrub);
+ } else {
+ this.eclog(level, str + " [scrubbed]");
+ }
},
- log: function(level, str) {
- switch(this.logmethod) {
- case 2: // debuglogger
- if(this._debuglog) {
- this._debuglog.log((6-level), this.formatLog(str,level));
- break;
- }
- // fallthrough
- case 0: // stderr
- if(this.loglevel <= level)
- dump(this.formatLog(str,level)+"\n");
- break;
- default:
- dump("Bad log method: "+this.logmethod);
- case 1: // errorconsole
- if(this.loglevel <= level)
- this._console.logStringMessage(this.formatLog(str,level));
- break;
- }
+ log(level, str) {
+ switch (this.logmethod) {
+ case 2: // debuglogger
+ if (this._debuglog) {
+ this._debuglog.log(6 - level, this.formatLog(str, level));
+ break;
+ }
+ // fallthrough
+ case 0: // stderr
+ if (this.loglevel <= level) {
+ dump(this.formatLog(str, level) + "\n");
+ }
+ break;
+ case 1: // errorconsole
+ if (this.loglevel <= level) {
+ this._console.logStringMessage(this.formatLog(str, level));
+ }
+ break;
+ default:
+ dump("Bad log method: " + this.logmethod);
+ }
},
// Pref observer interface implementation
@@ -134,29 +151,33 @@ TorbuttonLogger.prototype =
// topic: what event occurred
// subject: what nsIPrefBranch we're observing
// data: which pref has been changed (relative to subject)
- observe: function(subject, topic, data)
- {
- if (topic != "nsPref:changed") return;
- switch (data) {
- case "extensions.torbutton.logmethod":
- this.logmethod = Services.prefs.getIntPref("extensions.torbutton.logmethod");
- if (this.logmethod === 0) {
- Services.prefs.setBoolPref("browser.dom.window.dump.enabled",
- true);
- } else if (Services.prefs.
- getIntPref("extensions.torlauncher.logmethod", 3) !== 0) {
- // If Tor Launcher is not available or its log method is not 0
- // then let's reset the dump pref.
- Services.prefs.setBoolPref("browser.dom.window.dump.enabled",
- false);
- }
- break;
- case "extensions.torbutton.loglevel":
- this.loglevel = Services.prefs.getIntPref("extensions.torbutton.loglevel");
- break;
- }
- }
-}
+ observe(subject, topic, data) {
+ if (topic != "nsPref:changed") {
+ return;
+ }
+ switch (data) {
+ case "extensions.torbutton.logmethod":
+ this.logmethod = Services.prefs.getIntPref(
+ "extensions.torbutton.logmethod"
+ );
+ if (this.logmethod === 0) {
+ Services.prefs.setBoolPref("browser.dom.window.dump.enabled", true);
+ } else if (
+ Services.prefs.getIntPref("extensions.torlauncher.logmethod", 3) !== 0
+ ) {
+ // If Tor Launcher is not available or its log method is not 0
+ // then let's reset the dump pref.
+ Services.prefs.setBoolPref("browser.dom.window.dump.enabled", false);
+ }
+ break;
+ case "extensions.torbutton.loglevel":
+ this.loglevel = Services.prefs.getIntPref(
+ "extensions.torbutton.loglevel"
+ );
+ break;
+ }
+ },
+};
// Assign factory to global object.
const NSGetFactory = XPCOMUtils.generateNSGetFactory
diff --git a/modules/tor-control-port.js b/modules/tor-control-port.js
index 51ac8ac0..dc59c8da 100644
--- a/modules/tor-control-port.js
+++ b/modules/tor-control-port.js
@@ -20,27 +20,24 @@
/* jshint esnext: true */
/* jshint -W097 */
-/* global Components, console, Services */
+/* global console */
"use strict";
-// ### Mozilla Abbreviations
-let { Constructor: CC } = Components;
-
// ### Import Mozilla Services
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
const { TorProtocolService, TorProcessStatus } = ChromeUtils.import(
- "resource:///modules/TorProtocolService.jsm"
+ "resource:///modules/TorProtocolService.jsm"
);
// tor-launcher observer topics
const TorTopics = Object.freeze({
- ProcessIsReady: "TorProcessIsReady",
+ ProcessIsReady: "TorProcessIsReady",
});
// __log__.
// Logging function
-let logger = Cc["@torproject.org/torbutton-logger;1"]
- .getService(Ci.nsISupports).wrappedJSObject;
+let logger = Cc["@torproject.org/torbutton-logger;1"].getService(Ci.nsISupports)
+ .wrappedJSObject;
let log = x => logger.eclog(3, x.trimRight().replace(/\r\n/g, "\n"));
// ### announce this file
@@ -48,19 +45,26 @@ log("Loading tor-control-port.js\n");
class AsyncSocket {
constructor(ipcFile, host, port) {
- let sts = Cc["@mozilla.org/network/socket-transport-service;1"].getService(Ci.nsISocketTransportService);
+ let sts = Cc["@mozilla.org/network/socket-transport-service;1"].getService(
+ Ci.nsISocketTransportService
+ );
const OPEN_UNBUFFERED = Ci.nsITransport.OPEN_UNBUFFERED;
- let socketTransport = ipcFile ?
- sts.createUnixDomainTransport(ipcFile) :
- sts.createTransport([], host, port, null, null);
-
+ let socketTransport = ipcFile
+ ? sts.createUnixDomainTransport(ipcFile)
+ : sts.createTransport([], host, port, null, null);
- this.outputStream = socketTransport.openOutputStream(OPEN_UNBUFFERED, 1, 1).QueryInterface(Ci.nsIAsyncOutputStream);
+ this.outputStream = socketTransport
+ .openOutputStream(OPEN_UNBUFFERED, 1, 1)
+ .QueryInterface(Ci.nsIAsyncOutputStream);
this.outputQueue = [];
- this.inputStream = socketTransport.openInputStream(OPEN_UNBUFFERED, 1, 1).QueryInterface(Ci.nsIAsyncInputStream);
- this.scriptableInputStream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);
+ this.inputStream = socketTransport
+ .openInputStream(OPEN_UNBUFFERED, 1, 1)
+ .QueryInterface(Ci.nsIAsyncInputStream);
+ this.scriptableInputStream = Cc[
+ "@mozilla.org/scriptableinputstream;1"
+ ].createInstance(Ci.nsIScriptableInputStream);
this.scriptableInputStream.init(this.inputStream);
this.inputQueue = [];
}
@@ -68,13 +72,15 @@ class AsyncSocket {
// asynchronously write string to underlying socket and return number of bytes written
async write(str) {
return new Promise((resolve, reject) => {
-
// asyncWait next write request
const tryAsyncWait = () => {
- if (this.outputQueue.length > 0) {
+ if (this.outputQueue.length) {
this.outputStream.asyncWait(
this.outputQueue.at(0), // next request
- 0, 0, Services.tm.currentThread);
+ 0,
+ 0,
+ Services.tm.currentThread
+ );
}
};
@@ -98,7 +104,7 @@ class AsyncSocket {
// reject promise on error
reject(err);
}
- }
+ },
});
// length 1 imples that there is no in-flight asyncWait, so we may immediately
@@ -112,20 +118,24 @@ class AsyncSocket {
// asynchronously read string from underlying socket and return it
async read() {
return new Promise((resolve, reject) => {
-
const tryAsyncWait = () => {
- if (this.inputQueue.length > 0) {
+ if (this.inputQueue.length) {
this.inputStream.asyncWait(
- this.inputQueue.at(0), // next input request
- 0, 0, Services.tm.currentThread);
+ this.inputQueue.at(0), // next input request
+ 0,
+ 0,
+ Services.tm.currentThread
+ );
}
};
this.inputQueue.push({
- onInputStreamReady: (stream) => {
+ onInputStreamReady: stream => {
try {
// read our string from input stream
- let str = this.scriptableInputStream.read(this.scriptableInputStream.available());
+ let str = this.scriptableInputStream.read(
+ this.scriptableInputStream.available()
+ );
// remove this callback object from queue now that we have read
this.inputQueue.shift();
@@ -138,7 +148,7 @@ class AsyncSocket {
} catch (err) {
reject(err);
}
- }
+ },
});
// length 1 imples that there is no in-flight asyncWait, so we may immediately
@@ -153,7 +163,7 @@ class AsyncSocket {
this.outputStream.close();
this.inputStream.close();
}
-};
+}
class ControlSocket {
constructor(asyncSocket) {
@@ -165,9 +175,15 @@ class ControlSocket {
this.mainDispatcher = io.callbackDispatcher();
this.notificationDispatcher = io.callbackDispatcher();
// mainDispatcher pushes only async notifications (650) to notificationDispatcher
- this.mainDispatcher.addCallback(/^650/, this._handleNotification.bind(this));
+ this.mainDispatcher.addCallback(
+ /^650/,
+ this._handleNotification.bind(this)
+ );
// callback for handling responses and errors
- this.mainDispatcher.addCallback(/^[245]\d\d/, this._handleCommandReply.bind(this) );
+ this.mainDispatcher.addCallback(
+ /^[245]\d\d/,
+ this._handleCommandReply.bind(this)
+ );
this.commandQueue = [];
@@ -178,7 +194,7 @@ class ControlSocket {
// immediately returns next line in queue (pendingLines) if present
async _readLine() {
// keep reading from socket until we have a full line to return
- while(this.pendingLines.length == 0) {
+ while (!this.pendingLines.length) {
// read data from our socket and spit on newline tokens
this.pendingData += await this.socket.read();
let lines = this.pendingData.split("\r\n");
@@ -189,7 +205,6 @@ class ControlSocket {
// copy remaining full lines to our pendingLines list
this.pendingLines = this.pendingLines.concat(lines);
-
}
return this.pendingLines.shift();
}
@@ -216,23 +231,24 @@ class ControlSocket {
// and waiting for a terminating "." on its own line.
// (See control-spec section 3.9 and https://trac.torproject.org/16990#comment:28
// Ensure this is the first line of a new message
+ // eslint-disable-next-line no-lonely-if
if (message.length === 1 && line.match(/^\d\d\d\+.+?=$/)) {
handlingMultlineValue = true;
}
// look for end of message (note the space character at end of the regex)
- else if(line.match(/^\d\d\d /)) {
+ else if (line.match(/^\d\d\d /)) {
if (message.length == 1) {
endOfMessageFound = true;
} else {
- let firstReplyCode = message[0].substring(0,3);
- let lastReplyCode = line.substring(0,3);
+ let firstReplyCode = message[0].substring(0, 3);
+ let lastReplyCode = line.substring(0, 3);
if (firstReplyCode == lastReplyCode) {
endOfMessageFound = true;
}
}
}
}
- } while(!endOfMessageFound);
+ } while (!endOfMessageFound);
// join our lines back together to form one message
return message.join("\r\n");
@@ -240,14 +256,14 @@ class ControlSocket {
async _startMessagePump() {
try {
- while(true) {
+ while (true) {
let message = await this._readMessage();
log("controlPort >> " + message);
this.mainDispatcher.pushMessage(message);
}
} catch (err) {
this._isOpen = false;
- for(const cmd of this.commandQueue) {
+ for (const cmd of this.commandQueue) {
cmd.reject(err);
}
this.commandQueue = [];
@@ -269,9 +285,9 @@ class ControlSocket {
// in _startMessagePump (on stream error)
return new Promise((resolve, reject) => {
let command = {
- commandString: commandString,
- resolve: resolve,
- reject: reject,
+ commandString,
+ resolve,
+ reject,
};
this.commandQueue.push(command);
@@ -288,7 +304,7 @@ class ControlSocket {
} else if (message.match(/^[45]/)) {
let myErr = new Error(cmd.commandString + " -> " + message);
// Add Tor-specific information to the Error object.
- let idx = message.indexOf(' ');
+ let idx = message.indexOf(" ");
if (idx > 0) {
myErr.torStatusCode = message.substring(0, idx);
myErr.torMessage = message.substring(idx);
@@ -297,11 +313,15 @@ class ControlSocket {
}
cmd.reject(myErr);
} else {
- cmd.reject(new Error(`ControlSocket::_handleCommandReply received unexpected message:\n----\n${message}\n----`));
+ cmd.reject(
+ new Error(
+ `ControlSocket::_handleCommandReply received unexpected message:\n----\n${message}\n----`
+ )
+ );
}
// send next command if one is available
- if (this.commandQueue.length > 0) {
+ if (this.commandQueue.length) {
this._writeNextCommand();
}
}
@@ -322,7 +342,7 @@ class ControlSocket {
isOpen() {
return this._isOpen;
}
-};
+}
// ## io
// I/O utilities namespace
@@ -336,28 +356,33 @@ let io = {};
// Pass pushMessage to another function that needs a callback with a single string
// argument. Whenever dispatcher.pushMessage receives a string, the dispatcher will
// check for any regex matches and pass the string on to the corresponding callback(s).
-io.callbackDispatcher = function () {
+io.callbackDispatcher = function() {
let callbackPairs = [],
- removeCallback = function (aCallback) {
- callbackPairs = callbackPairs.filter(function ([regex, callback]) {
- return callback !== aCallback;
- });
- },
- addCallback = function (regex, callback) {
- if (callback) {
- callbackPairs.push([regex, callback]);
- }
- return function () { removeCallback(callback); };
- },
- pushMessage = function (message) {
- for (let [regex, callback] of callbackPairs) {
- if (message.match(regex)) {
- callback(message);
- }
- }
+ removeCallback = function(aCallback) {
+ callbackPairs = callbackPairs.filter(function([regex, callback]) {
+ return callback !== aCallback;
+ });
+ },
+ addCallback = function(regex, callback) {
+ if (callback) {
+ callbackPairs.push([regex, callback]);
+ }
+ return function() {
+ removeCallback(callback);
};
- return { pushMessage : pushMessage, removeCallback : removeCallback,
- addCallback : addCallback };
+ },
+ pushMessage = function(message) {
+ for (let [regex, callback] of callbackPairs) {
+ if (message.match(regex)) {
+ callback(message);
+ }
+ }
+ };
+ return {
+ pushMessage,
+ removeCallback,
+ addCallback,
+ };
};
// __io.controlSocket(ipcFile, host, port, password)__.
@@ -374,7 +399,7 @@ io.callbackDispatcher = function () {
// socket.removeNotificationCallback(callback);
// // Close the socket permanently
// socket.close();
-io.controlSocket = async function (ipcFile, host, port, password) {
+io.controlSocket = async function(ipcFile, host, port, password) {
let socket = new AsyncSocket(ipcFile, host, port);
let controlSocket = new ControlSocket(socket);
@@ -392,21 +417,23 @@ let utils = {};
// __utils.identity(x)__.
// Returns its argument unchanged.
-utils.identity = function (x) { return x; };
+utils.identity = function(x) {
+ return x;
+};
// __utils.isString(x)__.
// Returns true iff x is a string.
-utils.isString = function (x) {
- return typeof(x) === 'string' || x instanceof String;
+utils.isString = function(x) {
+ return typeof x === "string" || x instanceof String;
};
// __utils.capture(string, regex)__.
// Takes a string and returns an array of capture items, where regex must have a single
// capturing group and use the suffix /.../g to specify a global search.
-utils.capture = function (string, regex) {
+utils.capture = function(string, regex) {
let matches = [];
// Special trick to use string.replace for capturing multiple matches.
- string.replace(regex, function (a, captured) {
+ string.replace(regex, function(a, captured) {
matches.push(captured);
});
return matches;
@@ -415,15 +442,17 @@ utils.capture = function (string, regex) {
// __utils.extractor(regex)__.
// Returns a function that takes a string and returns an array of regex matches. The
// regex must use the suffix /.../g to specify a global search.
-utils.extractor = function (regex) {
- return function (text) {
+utils.extractor = function(regex) {
+ return function(text) {
return utils.capture(text, regex);
};
};
// __utils.splitLines(string)__.
// Splits a string into an array of strings, each corresponding to a line.
-utils.splitLines = function (string) { return string.split(/\r?\n/); };
+utils.splitLines = function(string) {
+ return string.split(/\r?\n/);
+};
// __utils.splitAtSpaces(string)__.
// Splits a string into chunks between spaces. Does not split at spaces
@@ -433,11 +462,14 @@ utils.splitAtSpaces = utils.extractor(/((\S*?"(.*?)")+\S*|\S+)/g);
// __utils.splitAtFirst(string, regex)__.
// Splits a string at the first instance of regex match. If no match is
// found, returns the whole string.
-utils.splitAtFirst = function (string, regex) {
+utils.splitAtFirst = function(string, regex) {
let match = string.match(regex);
- return match ? [ string.substring(0, match.index),
- string.substring(match.index + match[0].length) ]
- : string;
+ return match
+ ? [
+ string.substring(0, match.index),
+ string.substring(match.index + match[0].length),
+ ]
+ : string;
};
// __utils.splitAtEquals(string)__.
@@ -448,7 +480,7 @@ utils.splitAtEquals = utils.extractor(/(([^=]*?"(.*?)")+[^=]*|[^=]+)/g);
// __utils.mergeObjects(arrayOfObjects)__.
// Takes an array of objects like [{"a":"b"},{"c":"d"}] and merges to a single object.
// Pure function.
-utils.mergeObjects = function (arrayOfObjects) {
+utils.mergeObjects = function(arrayOfObjects) {
let result = {};
for (let obj of arrayOfObjects) {
for (let key in obj) {
@@ -468,10 +500,10 @@ utils.mergeObjects = function (arrayOfObjects) {
// ["streamID", "event", "circuitID", "IP"])
// // --> {"streamID" : "40", "event" : "FAILED", "circuitID" : "0",
// // "address" : "95.78.59.36:80", "REASON" : "CANT_ATTACH"}"
-utils.listMapData = function (parameterString, listNames) {
+utils.listMapData = function(parameterString, listNames) {
// Split out the space-delimited parameters.
let parameters = utils.splitAtSpaces(parameterString),
- dataMap = {};
+ dataMap = {};
// Assign listNames to the first n = listNames.length parameters.
for (let i = 0; i < listNames.length; ++i) {
dataMap[listNames[i]] = parameters[i];
@@ -506,13 +538,15 @@ let info = {};
// or single-line (with a `250-` or `250 ` prefix):
//
// 250-version=0.2.6.0-alpha-dev (git-b408125288ad6943)
-info.keyValueStringsFromMessage = utils.extractor(/^(250\+[\s\S]+?^\.|250[- ].+?)$/gmi);
+info.keyValueStringsFromMessage = utils.extractor(
+ /^(250\+[\s\S]+?^\.|250[- ].+?)$/gim
+);
// __info.applyPerLine(transformFunction)__.
// Returns a function that splits text into lines,
// and applies transformFunction to each line.
-info.applyPerLine = function (transformFunction) {
- return function (text) {
+info.applyPerLine = function(transformFunction) {
+ return function(text) {
return utils.splitLines(text.trim()).map(transformFunction);
};
};
@@ -521,23 +555,31 @@ info.applyPerLine = function (transformFunction) {
// Parses a router status entry as, described in
// https://gitweb.torproject.org/torspec.git/tree/dir-spec.txt
// (search for "router status entry")
-info.routerStatusParser = function (valueString) {
+info.routerStatusParser = function(valueString) {
let lines = utils.splitLines(valueString),
- objects = [];
+ objects = [];
for (let line of lines) {
// Drop first character and grab data following it.
let myData = line.substring(2),
- // Accumulate more maps with data, depending on the first character in the line.
- dataFun = {
- "r" : data => utils.listMapData(data, ["nickname", "identity", "digest",
- "publicationDate", "publicationTime",
- "IP", "ORPort", "DirPort"]),
- "a" : data => ({ "IPv6" : data }),
- "s" : data => ({ "statusFlags" : utils.splitAtSpaces(data) }),
- "v" : data => ({ "version" : data }),
- "w" : data => utils.listMapData(data, []),
- "p" : data => ({ "portList" : data.split(",") }),
- }[line.charAt(0)];
+ // Accumulate more maps with data, depending on the first character in the line.
+ dataFun = {
+ r: data =>
+ utils.listMapData(data, [
+ "nickname",
+ "identity",
+ "digest",
+ "publicationDate",
+ "publicationTime",
+ "IP",
+ "ORPort",
+ "DirPort",
+ ]),
+ a: data => ({ IPv6: data }),
+ s: data => ({ statusFlags: utils.splitAtSpaces(data) }),
+ v: data => ({ version: data }),
+ w: data => utils.listMapData(data, []),
+ p: data => ({ portList: data.split(",") }),
+ }[line.charAt(0)];
if (dataFun !== undefined) {
objects.push(dataFun(myData));
}
@@ -547,12 +589,12 @@ info.routerStatusParser = function (valueString) {
// __info.circuitStatusParser(line)__.
// Parse the output of a circuit status line.
-info.circuitStatusParser = function (line) {
- let data = utils.listMapData(line, ["id","status","circuit"]),
- circuit = data.circuit;
+info.circuitStatusParser = function(line) {
+ let data = utils.listMapData(line, ["id", "status", "circuit"]),
+ circuit = data.circuit;
// Parse out the individual circuit IDs and names.
if (circuit) {
- data.circuit = circuit.split(",").map(function (x) {
+ data.circuit = circuit.split(",").map(function(x) {
return x.split(/~|=/);
});
}
@@ -561,12 +603,15 @@ info.circuitStatusParser = function (line) {
// __info.streamStatusParser(line)__.
// Parse the output of a stream status line.
-info.streamStatusParser = function (text) {
- return utils.listMapData(text, ["StreamID", "StreamStatus",
- "CircuitID", "Target"]);
+info.streamStatusParser = function(text) {
+ return utils.listMapData(text, [
+ "StreamID",
+ "StreamStatus",
+ "CircuitID",
+ "Target",
+ ]);
};
-
// TODO: fix this parsing logic to handle bridgeLine correctly
// fingerprint/id is an optional parameter
// __info.bridgeParser(bridgeLine)__.
@@ -574,16 +619,26 @@ info.streamStatusParser = function (text) {
// a map containing the bridge's type, address, and ID.
info.bridgeParser = function(bridgeLine) {
let result = {},
- tokens = bridgeLine.split(/\s+/);
+ tokens = bridgeLine.split(/\s+/);
// First check if we have a "vanilla" bridge:
if (tokens[0].match(/^\d+\.\d+\.\d+\.\d+/)) {
result.type = "vanilla";
[result.address, result.ID] = tokens;
- // Several bridge types have a similar format:
+ // Several bridge types have a similar format:
} else {
result.type = tokens[0];
- if (["flashproxy", "fte", "meek", "meek_lite", "obfs3", "obfs4", "scramblesuit",
- "snowflake"].indexOf(result.type) >= 0) {
+ if (
+ [
+ "flashproxy",
+ "fte",
+ "meek",
+ "meek_lite",
+ "obfs3",
+ "obfs4",
+ "scramblesuit",
+ "snowflake",
+ ].includes(result.type)
+ ) {
[result.address, result.ID] = tokens.slice(1);
}
}
@@ -594,10 +649,10 @@ info.bridgeParser = function(bridgeLine) {
// A map of GETINFO and GETCONF keys to parsing function, which convert
// result strings to JavaScript data.
info.parsers = {
- "ns/id/" : info.routerStatusParser,
- "ip-to-country/" : utils.identity,
- "circuit-status" : info.applyPerLine(info.circuitStatusParser),
- "bridge" : info.bridgeParser,
+ "ns/id/": info.routerStatusParser,
+ "ip-to-country/": utils.identity,
+ "circuit-status": info.applyPerLine(info.circuitStatusParser),
+ bridge: info.bridgeParser,
// Currently unused parsers:
// "ns/name/" : info.routerStatusParser,
// "stream-status" : info.applyPerLine(info.streamStatusParser),
@@ -609,26 +664,31 @@ info.parsers = {
// Takes a key and determines the parser function that should be used to
// convert its corresponding valueString to JavaScript data.
info.getParser = function(key) {
- return info.parsers[key] ||
- info.parsers[key.substring(0, key.lastIndexOf("/") + 1)];
+ return (
+ info.parsers[key] ||
+ info.parsers[key.substring(0, key.lastIndexOf("/") + 1)]
+ );
};
// __info.stringToValue(string)__.
// Converts a key-value string as from GETINFO or GETCONF to a value.
-info.stringToValue = function (string) {
+info.stringToValue = function(string) {
// key should look something like `250+circuit-status=` or `250-circuit-status=...`
// or `250 circuit-status=...`
let matchForKey = string.match(/^250[ +-](.+?)=/),
- key = matchForKey ? matchForKey[1] : null;
- if (key === null) return null;
+ key = matchForKey ? matchForKey[1] : null;
+ if (key === null) {
+ return null;
+ }
// matchResult finds a single-line result for `250-` or `250 `,
// or a multi-line one for `250+`.
- let matchResult = string.match(/^250[ -].+?=(.*)$/) ||
- string.match(/^250\+.+?=([\s\S]*?)^\.$/m),
- // Retrieve the captured group (the text of the value in the key-value pair)
- valueString = matchResult ? matchResult[1] : null,
- // Get the parser function for the key found.
- parse = info.getParser(key.toLowerCase());
+ let matchResult =
+ string.match(/^250[ -].+?=(.*)$/) ||
+ string.match(/^250\+.+?=([\s\S]*?)^\.$/m),
+ // Retrieve the captured group (the text of the value in the key-value pair)
+ valueString = matchResult ? matchResult[1] : null,
+ // Get the parser function for the key found.
+ parse = info.getParser(key.toLowerCase());
if (parse === undefined) {
throw new Error("No parser found for '" + key + "'");
}
@@ -638,15 +698,16 @@ info.stringToValue = function (string) {
// __info.getMultipleResponseValues(message)__.
// Process multiple responses to a GETINFO or GETCONF request.
-info.getMultipleResponseValues = function (message) {
- return info.keyValueStringsFromMessage(message)
- .map(info.stringToValue)
- .filter(utils.identity);
+info.getMultipleResponseValues = function(message) {
+ return info
+ .keyValueStringsFromMessage(message)
+ .map(info.stringToValue)
+ .filter(utils.identity);
};
// __info.getInfo(controlSocket, key)__.
// Sends GETINFO for a single key. Returns a promise with the result.
-info.getInfo = function (aControlSocket, key) {
+info.getInfo = function(aControlSocket, key) {
if (!utils.isString(key)) {
return utils.rejectPromise("key argument should be a string");
}
@@ -657,7 +718,7 @@ info.getInfo = function (aControlSocket, key) {
// __info.getConf(aControlSocket, key)__.
// Sends GETCONF for a single key. Returns a promise with the result.
-info.getConf = function (aControlSocket, key) {
+info.getConf = function(aControlSocket, key) {
// GETCONF with a single argument returns results with
// one or more lines that look like `250[- ]key=value`.
// Any GETCONF lines that contain a single keyword only are currently dropped.
@@ -665,21 +726,23 @@ info.getConf = function (aControlSocket, key) {
if (!utils.isString(key)) {
return utils.rejectPromise("key argument should be a string");
}
- return aControlSocket.sendCommand("getconf " + key)
- .then(info.getMultipleResponseValues);
+ return aControlSocket
+ .sendCommand("getconf " + key)
+ .then(info.getMultipleResponseValues);
};
// ## onionAuth
// A namespace for functions related to tor's ONION_CLIENT_AUTH_* commands.
let onionAuth = {};
-onionAuth.keyInfoStringsFromMessage = utils.extractor(/^250-CLIENT\s+(.+)$/gmi);
+onionAuth.keyInfoStringsFromMessage = utils.extractor(/^250-CLIENT\s+(.+)$/gim);
onionAuth.keyInfoObjectsFromMessage = function(message) {
let keyInfoStrings = onionAuth.keyInfoStringsFromMessage(message);
- return keyInfoStrings.map(infoStr => utils.listMapData(infoStr,
- ["hsAddress", "typeAndKey"]));
-}
+ return keyInfoStrings.map(infoStr =>
+ utils.listMapData(infoStr, ["hsAddress", "typeAndKey"])
+ );
+};
// __onionAuth.viewKeys()__.
// Sends a ONION_CLIENT_AUTH_VIEW command to retrieve the list of private keys.
@@ -688,16 +751,22 @@ onionAuth.keyInfoObjectsFromMessage = function(message) {
// hsAddress
// typeAndKey
// Flags (e.g., "Permanent")
-onionAuth.viewKeys = function (aControlSocket) {
+onionAuth.viewKeys = function(aControlSocket) {
let cmd = "onion_client_auth_view";
- return aControlSocket.sendCommand(cmd).then(onionAuth.keyInfoObjectsFromMessage);
+ return aControlSocket
+ .sendCommand(cmd)
+ .then(onionAuth.keyInfoObjectsFromMessage);
};
// __onionAuth.add(controlSocket, hsAddress, b64PrivateKey, isPermanent)__.
// Sends a ONION_CLIENT_AUTH_ADD command to add a private key to the
// Tor configuration.
-onionAuth.add = function (aControlSocket, hsAddress, b64PrivateKey,
- isPermanent) {
+onionAuth.add = function(
+ aControlSocket,
+ hsAddress,
+ b64PrivateKey,
+ isPermanent
+) {
if (!utils.isString(hsAddress)) {
return utils.rejectPromise("hsAddress argument should be a string");
}
@@ -708,15 +777,16 @@ onionAuth.add = function (aControlSocket, hsAddress, b64PrivateKey,
const keyType = "x25519";
let cmd = `onion_client_auth_add ${hsAddress} ${keyType}:${b64PrivateKey}`;
- if (isPermanent)
+ if (isPermanent) {
cmd += " Flags=Permanent";
+ }
return aControlSocket.sendCommand(cmd);
};
// __onionAuth.remove(controlSocket, hsAddress)__.
// Sends a ONION_CLIENT_AUTH_REMOVE command to remove a private key from the
// Tor configuration.
-onionAuth.remove = function (aControlSocket, hsAddress) {
+onionAuth.remove = function(aControlSocket, hsAddress) {
if (!utils.isString(hsAddress)) {
return utils.rejectPromise("hsAddress argument should be a string");
}
@@ -725,7 +795,6 @@ onionAuth.remove = function (aControlSocket, hsAddress) {
return aControlSocket.sendCommand(cmd);
};
-
// ## event
// Handlers for events
@@ -735,7 +804,7 @@ let event = {};
// A map of EVENT keys to parsing functions, which convert result strings to JavaScript
// data.
event.parsers = {
- "stream" : info.streamStatusParser,
+ stream: info.streamStatusParser,
// Currently unused:
// "circ" : info.circuitStatusParser,
};
@@ -743,9 +812,11 @@ event.parsers = {
// __event.messageToData(type, message)__.
// Extract the data from an event. Note, at present
// we only extract streams that look like `"650" SP...`
-event.messageToData = function (type, message) {
+event.messageToData = function(type, message) {
let dataText = message.match(/^650 \S+?\s(.*)/m)[1];
- return (dataText && type.toLowerCase() in event.parsers) ? event.parsers[type.toLowerCase()](dataText) : null;
+ return dataText && type.toLowerCase() in event.parsers
+ ? event.parsers[type.toLowerCase()](dataText)
+ : null;
};
// __event.watchEvent(controlSocket, type, filter, onData)__.
@@ -753,17 +824,20 @@ event.messageToData = function (type, message) {
// data is passed to the onData callback. Returns a zero arg function that
// stops watching the event. Note: we only observe `"650" SP...` events
// currently (no `650+...` or `650-...` events).
-event.watchEvent = function (controlSocket, type, filter, onData, raw=false) {
- return controlSocket.addNotificationCallback(new RegExp("^650 " + type),
- function (message) {
+event.watchEvent = function(controlSocket, type, filter, onData, raw = false) {
+ return controlSocket.addNotificationCallback(
+ new RegExp("^650 " + type),
+ function(message) {
let data = event.messageToData(type, message);
if (filter === null || filter(data)) {
if (raw || !data) {
- return onData(message);
+ onData(message);
+ return;
}
onData(data);
}
- });
+ }
+ );
};
// ## tor
@@ -778,22 +852,23 @@ tor.controllerCache = new Map();
// __tor.controller(ipcFile, host, port, password)__.
// Creates a tor controller at the given ipcFile or host and port, with the
// given password.
-tor.controller = async function (ipcFile, host, port, password) {
+tor.controller = async function(ipcFile, host, port, password) {
let socket = await io.controlSocket(ipcFile, host, port, password);
- return { getInfo : key => info.getInfo(socket, key),
- getConf : key => info.getConf(socket, key),
- onionAuthViewKeys : () => onionAuth.viewKeys(socket),
- onionAuthAdd : (hsAddress, b64PrivateKey, isPermanent) =>
- onionAuth.add(socket, hsAddress, b64PrivateKey,
- isPermanent),
- onionAuthRemove : (hsAddress) =>
- onionAuth.remove(socket, hsAddress),
- watchEvent : (type, filter, onData, raw=false) =>
- event.watchEvent(socket, type, filter, onData, raw),
- isOpen : () => socket.isOpen(),
- close : () => { socket.close(); },
- sendCommand: cmd => socket.sendCommand(cmd),
- };
+ return {
+ getInfo: key => info.getInfo(socket, key),
+ getConf: key => info.getConf(socket, key),
+ onionAuthViewKeys: () => onionAuth.viewKeys(socket),
+ onionAuthAdd: (hsAddress, b64PrivateKey, isPermanent) =>
+ onionAuth.add(socket, hsAddress, b64PrivateKey, isPermanent),
+ onionAuthRemove: hsAddress => onionAuth.remove(socket, hsAddress),
+ watchEvent: (type, filter, onData, raw = false) =>
+ event.watchEvent(socket, type, filter, onData, raw),
+ isOpen: () => socket.isOpen(),
+ close: () => {
+ socket.close();
+ },
+ sendCommand: cmd => socket.sendCommand(cmd),
+ };
};
// ## Export
@@ -804,7 +879,7 @@ let controlPortInfo = {};
// Sets Tor control port connection parameters to be used in future calls to
// the controller() function. Example:
// configureControlPortModule(undefined, "127.0.0.1", 9151, "MyPassw0rd");
-var configureControlPortModule = function (ipcFile, host, port, password) {
+var configureControlPortModule = function(ipcFile, host, port, password) {
controlPortInfo.ipcFile = ipcFile;
controlPortInfo.host = host;
controlPortInfo.port = port || 9151;
@@ -827,28 +902,28 @@ var configureControlPortModule = function (ipcFile, host, port, password) {
// let replyPromise = c.getInfo("ip-to-country/16.16.16.16");
// // Close the controller permanently
// c.close();
-var controller = async function (avoidCache) {
-
- if (!controlPortInfo.ipcFile && !controlPortInfo.host)
+var controller = async function(avoidCache) {
+ if (!controlPortInfo.ipcFile && !controlPortInfo.host) {
throw new Error("Please call configureControlPortModule first");
+ }
- const dest = (controlPortInfo.ipcFile)
- ? `unix:${controlPortInfo.ipcFile.path}`
- : `${controlPortInfo.host}:${controlPortInfo.port}`;
+ const dest = controlPortInfo.ipcFile
+ ? `unix:${controlPortInfo.ipcFile.path}`
+ : `${controlPortInfo.host}:${controlPortInfo.port}`;
// constructor shorthand
- const newTorController =
- async () => {
- return await tor.controller(
- controlPortInfo.ipcFile,
- controlPortInfo.host,
- controlPortInfo.port,
- controlPortInfo.password);
- };
+ const newTorController = async () => {
+ return tor.controller(
+ controlPortInfo.ipcFile,
+ controlPortInfo.host,
+ controlPortInfo.port,
+ controlPortInfo.password
+ );
+ };
// avoid cache so always return a new controller
if (avoidCache) {
- return await newTorController();
+ return newTorController();
}
// first check our cache and see if we already have one
@@ -872,17 +947,19 @@ var controller = async function (avoidCache) {
// Same as controller() function, but explicitly waits until there is a tor daemon
// to connect to (either launched by tor-launcher, or if we have an existing system
// tor daemon)
-var wait_for_controller = async function(avoidCache) {
+var wait_for_controller = function(avoidCache) {
// if tor process is running (either ours or system) immediately return controller
- if (!TorProtocolService.ownsTorDaemon ||
- TorProtocolService.torProcessStatus == TorProcessStatus.Running) {
- return await controller(avoidCache);
+ if (
+ !TorProtocolService.ownsTorDaemon ||
+ TorProtocolService.torProcessStatus == TorProcessStatus.Running
+ ) {
+ return controller(avoidCache);
}
// otherwise we must wait for tor to finish launching before resolving
return new Promise((resolve, reject) => {
let observer = {
- observe : async (subject, topic, data) => {
+ observe: async (subject, topic, data) => {
if (topic === TorTopics.ProcessIsReady) {
try {
resolve(await controller(avoidCache));
@@ -898,4 +975,8 @@ var wait_for_controller = async function(avoidCache) {
};
// Export functions for external use.
-var EXPORTED_SYMBOLS = ["configureControlPortModule", "controller", "wait_for_controller"];
+var EXPORTED_SYMBOLS = [
+ "configureControlPortModule",
+ "controller",
+ "wait_for_controller",
+];
diff --git a/modules/utils.js b/modules/utils.js
index b726342b..7ccd2da1 100644
--- a/modules/utils.js
+++ b/modules/utils.js
@@ -11,12 +11,16 @@ let prefs = Services.prefs;
// __getPrefValue(prefName)__
// Returns the current value of a preference, regardless of its type.
-var getPrefValue = function (prefName) {
- switch(prefs.getPrefType(prefName)) {
- case prefs.PREF_BOOL: return prefs.getBoolPref(prefName);
- case prefs.PREF_INT: return prefs.getIntPref(prefName);
- case prefs.PREF_STRING: return prefs.getCharPref(prefName);
- default: return null;
+var getPrefValue = function(prefName) {
+ switch (prefs.getPrefType(prefName)) {
+ case prefs.PREF_BOOL:
+ return prefs.getBoolPref(prefName);
+ case prefs.PREF_INT:
+ return prefs.getIntPref(prefName);
+ case prefs.PREF_STRING:
+ return prefs.getCharPref(prefName);
+ default:
+ return null;
}
};
@@ -24,18 +28,24 @@ var getPrefValue = function (prefName) {
// Applies prefHandler whenever the value of the pref changes.
// If init is true, applies prefHandler to the current value.
// Returns a zero-arg function that unbinds the pref.
-var bindPref = function (prefName, prefHandler, init = false) {
- let update = () => { prefHandler(getPrefValue(prefName)); },
- observer = { observe : function (subject, topic, data) {
- if (data === prefName) {
- update();
- }
- } };
- prefs.addObserver(prefName, observer, false);
+var bindPref = function(prefName, prefHandler, init = false) {
+ let update = () => {
+ prefHandler(getPrefValue(prefName));
+ },
+ observer = {
+ observe(subject, topic, data) {
+ if (data === prefName) {
+ update();
+ }
+ },
+ };
+ prefs.addObserver(prefName, observer);
if (init) {
update();
}
- return () => { prefs.removeObserver(prefName, observer); };
+ return () => {
+ prefs.removeObserver(prefName, observer);
+ };
};
// __bindPrefAndInit(prefName, prefHandler)__
@@ -43,7 +53,7 @@ var bindPref = function (prefName, prefHandler, init = false) {
// Re-applies prefHandler whenever the value of the pref changes.
// Returns a zero-arg function that unbinds the pref.
var bindPrefAndInit = (prefName, prefHandler) =>
- bindPref(prefName, prefHandler, true);
+ bindPref(prefName, prefHandler, true);
// ## Observers
@@ -51,15 +61,15 @@ var bindPrefAndInit = (prefName, prefHandler) =>
// Observe the given topic. When notification of that topic
// occurs, calls callback(subject, data). Returns a zero-arg
// function that stops observing.
-var observe = function (topic, callback) {
+var observe = function(topic, callback) {
let observer = {
- observe: function (aSubject, aTopic, aData) {
+ observe(aSubject, aTopic, aData) {
if (topic === aTopic) {
callback(aSubject, aData);
}
},
};
- Services.obs.addObserver(observer, topic, false);
+ Services.obs.addObserver(observer, topic);
return () => Services.obs.removeObserver(observer, topic);
};
@@ -67,12 +77,13 @@ var observe = function (topic, callback) {
// __env__.
// Provides access to process environment variables.
-let env = Cc["@mozilla.org/process/environment;1"]
- .getService(Ci.nsIEnvironment);
+let env = Cc["@mozilla.org/process/environment;1"].getService(
+ Ci.nsIEnvironment
+);
// __getEnv(name)__.
// Reads the environment variable of the given name.
-var getEnv = function (name) {
+var getEnv = function(name) {
return env.exists(name) ? env.get(name) : undefined;
};
@@ -91,17 +102,15 @@ let dialogsByName = {};
// __showDialog(parent, url, name, features, arg1, arg2, ...)__.
// Like window.openDialog, but if the window is already
// open, just focuses it instead of opening a new one.
-var showDialog = function (parent, url, name, features) {
+var showDialog = function(parent, url, name, features) {
let existingDialog = dialogsByName[name];
if (existingDialog && !existingDialog.closed) {
existingDialog.focus();
return existingDialog;
- } else {
- let newDialog = parent.openDialog.apply(parent,
- Array.slice(arguments, 1));
- dialogsByName[name] = newDialog;
- return newDialog;
}
+ let newDialog = parent.openDialog.apply(parent, Array.slice(arguments, 1));
+ dialogsByName[name] = newDialog;
+ return newDialog;
};
// ## Tor control protocol utility functions
@@ -112,71 +121,69 @@ let _torControl = {
// Returns the unescaped string. Throws upon failure.
// Within Tor Launcher, the file components/tl-protocol.js also contains a
// copy of _strUnescape().
- _strUnescape: function(aStr)
- {
- if (!aStr)
+ _strUnescape(aStr) {
+ if (!aStr) {
return aStr;
+ }
var len = aStr.length;
- if ((len < 2) || ('"' != aStr.charAt(0)) || ('"' != aStr.charAt(len - 1)))
+ if (len < 2 || '"' != aStr.charAt(0) || '"' != aStr.charAt(len - 1)) {
return aStr;
+ }
const kHexRE = /[0-9A-Fa-f]{2}/;
const kOctalRE = /[0-7]{3}/;
var rv = "";
var i = 1;
var lastCharIndex = len - 2;
- while (i <= lastCharIndex)
- {
+ while (i <= lastCharIndex) {
var c = aStr.charAt(i);
- if ('\\' == c)
- {
- if (++i > lastCharIndex)
+ if ("\\" == c) {
+ if (++i > lastCharIndex) {
throw new Error("missing character after \\");
+ }
c = aStr.charAt(i);
- if ('n' == c)
- rv += '\n';
- else if ('r' == c)
- rv += '\r';
- else if ('t' == c)
- rv += '\t';
- else if ('x' == c)
- {
- if ((i + 2) > lastCharIndex)
+ if ("n" == c) {
+ rv += "\n";
+ } else if ("r" == c) {
+ rv += "\r";
+ } else if ("t" == c) {
+ rv += "\t";
+ } else if ("x" == c) {
+ if (i + 2 > lastCharIndex) {
throw new Error("not enough hex characters");
+ }
let s = aStr.substr(i + 1, 2);
- if (!kHexRE.test(s))
+ if (!kHexRE.test(s)) {
throw new Error("invalid hex characters");
+ }
let val = parseInt(s, 16);
rv += String.fromCharCode(val);
i += 3;
- }
- else if (this._isDigit(c))
- {
+ } else if (this._isDigit(c)) {
let s = aStr.substr(i, 3);
- if ((i + 2) > lastCharIndex)
+ if (i + 2 > lastCharIndex) {
throw new Error("not enough octal characters");
+ }
- if (!kOctalRE.test(s))
+ if (!kOctalRE.test(s)) {
throw new Error("invalid octal characters");
+ }
let val = parseInt(s, 8);
rv += String.fromCharCode(val);
i += 3;
- }
- else // "\\" and others
- {
+ } // "\\" and others
+ else {
rv += c;
++i;
}
- }
- else if ('"' == c)
- throw new Error("unescaped \" within string");
- else
- {
+ } else if ('"' == c) {
+ throw new Error('unescaped " within string');
+ } else {
rv += c;
++i;
}
@@ -188,8 +195,7 @@ let _torControl = {
// Within Tor Launcher, the file components/tl-protocol.js also contains a
// copy of _isDigit().
- _isDigit: function(aChar)
- {
+ _isDigit(aChar) {
const kRE = /^\d$/;
return aChar && kRE.test(aChar);
},
@@ -206,30 +212,35 @@ var unescapeTorString = function(str) {
var show_torbrowser_manual = () => {
let availableLocales = ["de", "en", "es", "fr", "nl", "pt", "tr", "vi", "zh"];
let shortLocale = getLocale().substring(0, 2);
- return availableLocales.indexOf(shortLocale) >= 0;
-}
+ return availableLocales.includes(shortLocale);
+};
-var getFPDFromHost = (hostname) => {
+var getFPDFromHost = hostname => {
try {
return Services.eTLD.getBaseDomainFromHost(hostname);
} catch (e) {
- if (e.result == Cr.NS_ERROR_HOST_IS_IP_ADDRESS ||
- e.result == Cr.NS_ERROR_INSUFFICIENT_DOMAIN_LEVELS) {
+ if (
+ e.result == Cr.NS_ERROR_HOST_IS_IP_ADDRESS ||
+ e.result == Cr.NS_ERROR_INSUFFICIENT_DOMAIN_LEVELS
+ ) {
return hostname;
}
}
return null;
-}
+};
// Assuming this is called with gBrowser.selectedBrowser
-var getDomainForBrowser = (browser) => {
+var getDomainForBrowser = browser => {
let fpd = browser.contentPrincipal.originAttributes.firstPartyDomain;
// Bug 31562: For neterror or certerror, get the original URL from
// browser.currentURI and use it to calculate the firstPartyDomain.
let knownErrors = ["about:neterror", "about:certerror"];
let documentURI = browser.documentURI;
- if (documentURI && documentURI.schemeIs('about') &&
- knownErrors.some(x => documentURI.spec.startsWith(x))) {
+ if (
+ documentURI &&
+ documentURI.schemeIs("about") &&
+ knownErrors.some(x => documentURI.spec.startsWith(x))
+ ) {
let knownSchemes = ["http", "https", "ftp"];
let currentURI = browser.currentURI;
if (currentURI && knownSchemes.some(x => currentURI.schemeIs(x))) {
@@ -239,58 +250,71 @@ var getDomainForBrowser = (browser) => {
return fpd;
};
-var m_tb_torlog = Cc["@torproject.org/torbutton-logger;1"]
-.getService(Ci.nsISupports).wrappedJSObject;
+var m_tb_torlog = Cc["@torproject.org/torbutton-logger;1"].getService(
+ Ci.nsISupports
+).wrappedJSObject;
var m_tb_string_bundle = torbutton_get_stringbundle();
function torbutton_safelog(nLevel, sMsg, scrub) {
- m_tb_torlog.safe_log(nLevel, sMsg, scrub);
- return true;
+ m_tb_torlog.safe_log(nLevel, sMsg, scrub);
+ return true;
}
function torbutton_log(nLevel, sMsg) {
- m_tb_torlog.log(nLevel, sMsg);
+ m_tb_torlog.log(nLevel, sMsg);
- // So we can use it in boolean expressions to determine where the
- // short-circuit is..
- return true;
+ // So we can use it in boolean expressions to determine where the
+ // short-circuit is..
+ return true;
}
// load localization strings
-function torbutton_get_stringbundle()
-{
- var o_stringbundle = false;
-
- try {
- var oBundle = Services.strings;
- o_stringbundle = oBundle.createBundle("chrome://torbutton/locale/torbutton.properties");
- } catch(err) {
- o_stringbundle = false;
- }
- if (!o_stringbundle) {
- torbutton_log(5, 'ERROR (init): failed to find torbutton-bundle');
- }
+function torbutton_get_stringbundle() {
+ var o_stringbundle = false;
- return o_stringbundle;
-}
+ try {
+ var oBundle = Services.strings;
+ o_stringbundle = oBundle.createBundle(
+ "chrome://torbutton/locale/torbutton.properties"
+ );
+ } catch (err) {
+ o_stringbundle = false;
+ }
+ if (!o_stringbundle) {
+ torbutton_log(5, "ERROR (init): failed to find torbutton-bundle");
+ }
-function torbutton_get_property_string(propertyname)
-{
- try {
- if (!m_tb_string_bundle) {
- m_tb_string_bundle = torbutton_get_stringbundle();
- }
+ return o_stringbundle;
+}
- return m_tb_string_bundle.GetStringFromName(propertyname);
- } catch(e) {
- torbutton_log(4, "Unlocalized string "+propertyname);
+function torbutton_get_property_string(propertyname) {
+ try {
+ if (!m_tb_string_bundle) {
+ m_tb_string_bundle = torbutton_get_stringbundle();
}
- return propertyname;
+ return m_tb_string_bundle.GetStringFromName(propertyname);
+ } catch (e) {
+ torbutton_log(4, "Unlocalized string " + propertyname);
+ }
+
+ return propertyname;
}
// Export utility functions for external use.
-let EXPORTED_SYMBOLS = ["bindPref", "bindPrefAndInit", "getEnv", "getLocale", "getDomainForBrowser",
- "getPrefValue", "observe", "showDialog", "show_torbrowser_manual", "unescapeTorString",
- "torbutton_safelog", "torbutton_log", "torbutton_get_property_string"];
+let EXPORTED_SYMBOLS = [
+ "bindPref",
+ "bindPrefAndInit",
+ "getEnv",
+ "getLocale",
+ "getDomainForBrowser",
+ "getPrefValue",
+ "observe",
+ "showDialog",
+ "show_torbrowser_manual",
+ "unescapeTorString",
+ "torbutton_safelog",
+ "torbutton_log",
+ "torbutton_get_property_string",
+];
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
1
0
[Git][tpo/applications/fenix] Deleted branch 40225-bundled-extensions-don-t-get-updated-with-android-tor-browser-updates-they-stay-stuck-at-the
by ma1 (@ma1) 24 Aug '22
by ma1 (@ma1) 24 Aug '22
24 Aug '22
ma1 deleted branch 40225-bundled-extensions-don-t-get-updated-with-android-tor-browser-updates-they-stay-stuck-at-the at The Tor Project / Applications / fenix
--
You're receiving this email because of your account on gitlab.torproject.org.
1
0
ma1 deleted branch bug_40225 at The Tor Project / Applications / fenix
--
You're receiving this email because of your account on gitlab.torproject.org.
1
0